@remnic/core 9.3.612 → 9.3.614

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 (374) hide show
  1. package/dist/access-cli.js +58 -57
  2. package/dist/access-cli.js.map +1 -1
  3. package/dist/access-http.d.ts +4 -2
  4. package/dist/access-http.js +22 -22
  5. package/dist/access-mcp.d.ts +9 -2
  6. package/dist/access-mcp.js +19 -19
  7. package/dist/access-schema.d.ts +12 -12
  8. package/dist/access-schema.js +3 -3
  9. package/dist/{access-service-D2J9dh_9.d.ts → access-service-DGG_2xPK.d.ts} +1 -1
  10. package/dist/access-service.d.ts +2 -2
  11. package/dist/access-service.js +16 -16
  12. package/dist/active-recall.js +20 -3
  13. package/dist/active-recall.js.map +1 -1
  14. package/dist/adapters/index.js +4 -4
  15. package/dist/adapters/registry.js +2 -2
  16. package/dist/behavior-learner.js +2 -3
  17. package/dist/behavior-learner.js.map +1 -1
  18. package/dist/bootstrap.d.ts +1 -1
  19. package/dist/briefing.js +3 -3
  20. package/dist/buffer.d.ts +1 -1
  21. package/dist/buffer.js +1 -1
  22. package/dist/calibration.d.ts +5 -2
  23. package/dist/calibration.js +7 -5
  24. package/dist/calibration.js.map +1 -1
  25. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  26. package/dist/causal-consolidation.d.ts +8 -2
  27. package/dist/causal-consolidation.js +13 -11
  28. package/dist/causal-consolidation.js.map +1 -1
  29. package/dist/{chunk-3BP57I6J.js → chunk-2F6NP3NT.js} +2 -1
  30. package/dist/{chunk-3BP57I6J.js.map → chunk-2F6NP3NT.js.map} +1 -1
  31. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  32. package/dist/{chunk-HSVJGWYS.js → chunk-2ROPI5OE.js} +2 -2
  33. package/dist/{chunk-C4SQJZAF.js → chunk-2SGJY2UY.js} +6 -3
  34. package/dist/chunk-2SGJY2UY.js.map +1 -0
  35. package/dist/{chunk-ZDTVJXIP.js → chunk-3MAONBX3.js} +13 -5
  36. package/dist/chunk-3MAONBX3.js.map +1 -0
  37. package/dist/{chunk-G3Z3QEF5.js → chunk-3PY7VHV7.js} +2 -2
  38. package/dist/chunk-3PY7VHV7.js.map +1 -0
  39. package/dist/{chunk-CF3ZF2YU.js → chunk-3QSU4NFF.js} +3 -3
  40. package/dist/{chunk-AJA46VX5.js → chunk-3T74IZB3.js} +11 -2
  41. package/dist/chunk-3T74IZB3.js.map +1 -0
  42. package/dist/{chunk-KVEVLBKC.js → chunk-4HFJQCJZ.js} +13 -8
  43. package/dist/chunk-4HFJQCJZ.js.map +1 -0
  44. package/dist/{chunk-KGK2QKWL.js → chunk-4R4KTDIE.js} +1 -1
  45. package/dist/chunk-4R4KTDIE.js.map +1 -0
  46. package/dist/{chunk-OI27U2HT.js → chunk-5BTCT236.js} +2 -2
  47. package/dist/{chunk-CO7ZO4TU.js → chunk-5VDJMYTF.js} +2 -2
  48. package/dist/{chunk-BFBF3XEF.js → chunk-6BDVBBBY.js} +33 -25
  49. package/dist/{chunk-BFBF3XEF.js.map → chunk-6BDVBBBY.js.map} +1 -1
  50. package/dist/{chunk-EAZGEEG2.js → chunk-6L46YAEZ.js} +45 -9
  51. package/dist/chunk-6L46YAEZ.js.map +1 -0
  52. package/dist/{chunk-YFS5OEKO.js → chunk-7MLB4NCL.js} +2 -2
  53. package/dist/{chunk-IOTENEVL.js → chunk-7YQFWOF7.js} +57 -50
  54. package/dist/chunk-7YQFWOF7.js.map +1 -0
  55. package/dist/{chunk-2QANQKSQ.js → chunk-ADNZVFXG.js} +15 -15
  56. package/dist/{chunk-LZ3VEOU5.js → chunk-AL4RAJL5.js} +22 -5
  57. package/dist/chunk-AL4RAJL5.js.map +1 -0
  58. package/dist/{chunk-557IAFPD.js → chunk-APRRL26Q.js} +2 -2
  59. package/dist/{chunk-QDDHYAKV.js → chunk-AZDOWD2L.js} +2 -2
  60. package/dist/{chunk-TH67Q46T.js → chunk-B6FDZPCF.js} +17 -9
  61. package/dist/chunk-B6FDZPCF.js.map +1 -0
  62. package/dist/{chunk-MLT75J5S.js → chunk-B6SU7YSE.js} +3 -3
  63. package/dist/{chunk-FXKPZ3H6.js → chunk-BPSGLMQ4.js} +2 -2
  64. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  65. package/dist/{chunk-NOMEVTUD.js → chunk-C6C7XVKG.js} +5 -4
  66. package/dist/chunk-C6C7XVKG.js.map +1 -0
  67. package/dist/{chunk-XKIQZXUB.js → chunk-CI7RKSRE.js} +7 -1
  68. package/dist/chunk-CI7RKSRE.js.map +1 -0
  69. package/dist/{chunk-IK34DVAC.js → chunk-CIOMS6DI.js} +2 -2
  70. package/dist/{chunk-2I5JGH3M.js → chunk-CYEPCZN5.js} +2 -2
  71. package/dist/{chunk-2I5JGH3M.js.map → chunk-CYEPCZN5.js.map} +1 -1
  72. package/dist/{chunk-JHMFYY7L.js → chunk-DCGT4FPP.js} +13 -5
  73. package/dist/chunk-DCGT4FPP.js.map +1 -0
  74. package/dist/{chunk-7DZRO2DC.js → chunk-DEPRLVLK.js} +2 -2
  75. package/dist/{chunk-CSKLPDN6.js → chunk-DEVUWMME.js} +52 -19
  76. package/dist/chunk-DEVUWMME.js.map +1 -0
  77. package/dist/{chunk-DHGSZ3UD.js → chunk-DGNQRNLL.js} +2 -2
  78. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  79. package/dist/chunk-FAV25DUZ.js +12 -0
  80. package/dist/chunk-FAV25DUZ.js.map +1 -0
  81. package/dist/{chunk-ETUPBUHB.js → chunk-GDASG7NC.js} +2 -2
  82. package/dist/{chunk-L227SKTB.js → chunk-GDB4J2H3.js} +17 -1
  83. package/dist/chunk-GDB4J2H3.js.map +1 -0
  84. package/dist/{chunk-IP73YCZP.js → chunk-GLPBYIXN.js} +4 -2
  85. package/dist/chunk-GLPBYIXN.js.map +1 -0
  86. package/dist/{chunk-4HP7HIE3.js → chunk-HP5FMB6L.js} +2 -2
  87. package/dist/{chunk-EVZFIAPG.js → chunk-IBTZEBUD.js} +23 -10
  88. package/dist/chunk-IBTZEBUD.js.map +1 -0
  89. package/dist/{chunk-DOX2CG6Y.js → chunk-IEUU7O4F.js} +2 -2
  90. package/dist/{chunk-JNANKJLN.js → chunk-JOASJWQR.js} +2 -2
  91. package/dist/chunk-JOASJWQR.js.map +1 -0
  92. package/dist/{chunk-WSGF57U2.js → chunk-JQDZQ4TB.js} +2 -2
  93. package/dist/{chunk-HINSGUA7.js → chunk-KBL3JJR6.js} +9 -13
  94. package/dist/chunk-KBL3JJR6.js.map +1 -0
  95. package/dist/{chunk-W7L6HXUC.js → chunk-LXOM6IQU.js} +2 -2
  96. package/dist/{chunk-G6R5UD3Q.js → chunk-MGN7VHWQ.js} +42 -1
  97. package/dist/{chunk-G6R5UD3Q.js.map → chunk-MGN7VHWQ.js.map} +1 -1
  98. package/dist/{chunk-DLJ4IR6M.js → chunk-MHQC2WU2.js} +2 -2
  99. package/dist/chunk-MHQC2WU2.js.map +1 -0
  100. package/dist/{chunk-6JGNHWCI.js → chunk-OBIRVF36.js} +3 -3
  101. package/dist/{chunk-CHCA44C3.js → chunk-ODPLEWB6.js} +3 -3
  102. package/dist/chunk-ODPLEWB6.js.map +1 -0
  103. package/dist/{chunk-HENLZHIT.js → chunk-OIF36KGD.js} +7 -4
  104. package/dist/chunk-OIF36KGD.js.map +1 -0
  105. package/dist/{chunk-GUPISBV2.js → chunk-PP2JH3GP.js} +2 -2
  106. package/dist/{chunk-OXJBNGBK.js → chunk-PSUB67YB.js} +2 -2
  107. package/dist/{chunk-UWY7GIVS.js → chunk-PYIFUBRK.js} +45 -13
  108. package/dist/chunk-PYIFUBRK.js.map +1 -0
  109. package/dist/{chunk-KIB7SDIJ.js → chunk-Q6YIJGXJ.js} +2 -2
  110. package/dist/{chunk-PPPZY2EU.js → chunk-QEMCQFDW.js} +2 -2
  111. package/dist/{chunk-ZT3EGNLR.js → chunk-QPD426WT.js} +2 -2
  112. package/dist/{chunk-RLV3PQGH.js → chunk-QVO4YOB7.js} +6 -6
  113. package/dist/{chunk-GMAG2HS4.js → chunk-RG3LBSGH.js} +46 -9
  114. package/dist/chunk-RG3LBSGH.js.map +1 -0
  115. package/dist/{chunk-XSWKORGM.js → chunk-S53OYO3F.js} +3 -1
  116. package/dist/chunk-S53OYO3F.js.map +1 -0
  117. package/dist/{chunk-YCN4BVDK.js → chunk-SCPFRKIT.js} +4 -2
  118. package/dist/chunk-SCPFRKIT.js.map +1 -0
  119. package/dist/{chunk-HJNQQICM.js → chunk-T5XWMMU2.js} +107 -50
  120. package/dist/chunk-T5XWMMU2.js.map +1 -0
  121. package/dist/{chunk-NZPF2SYV.js → chunk-T7N6KQGS.js} +138 -5
  122. package/dist/chunk-T7N6KQGS.js.map +1 -0
  123. package/dist/{chunk-VJXSUAO7.js → chunk-TNOWU6RP.js} +13 -10
  124. package/dist/chunk-TNOWU6RP.js.map +1 -0
  125. package/dist/{chunk-PCI747N2.js → chunk-TZVQQTG4.js} +48 -19
  126. package/dist/chunk-TZVQQTG4.js.map +1 -0
  127. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  128. package/dist/{chunk-IK7DCC5H.js → chunk-VMGLYN42.js} +2 -2
  129. package/dist/{chunk-5RPTH6AU.js → chunk-VPGUMLBA.js} +8 -7
  130. package/dist/chunk-VPGUMLBA.js.map +1 -0
  131. package/dist/{chunk-KM2A35EO.js → chunk-WB3LYXC5.js} +11 -7
  132. package/dist/chunk-WB3LYXC5.js.map +1 -0
  133. package/dist/{chunk-NSKYFGDL.js → chunk-X4QQB7O6.js} +2 -2
  134. package/dist/{chunk-HPWVAEET.js → chunk-X6IRLNOO.js} +3 -7
  135. package/dist/chunk-X6IRLNOO.js.map +1 -0
  136. package/dist/{chunk-46GJIW5M.js → chunk-XAZOWLW4.js} +5 -5
  137. package/dist/{chunk-46GJIW5M.js.map → chunk-XAZOWLW4.js.map} +1 -1
  138. package/dist/{chunk-XPSVGJYA.js → chunk-YRMKDTKF.js} +12 -9
  139. package/dist/chunk-YRMKDTKF.js.map +1 -0
  140. package/dist/{chunk-6ZZP4EJF.js → chunk-ZJR7VG5L.js} +3 -3
  141. package/dist/{chunk-6ZZP4EJF.js.map → chunk-ZJR7VG5L.js.map} +1 -1
  142. package/dist/{cli-OrfKXNU4.d.ts → cli-DWeu7eTY.d.ts} +6 -2
  143. package/dist/cli.d.ts +3 -3
  144. package/dist/cli.js +60 -59
  145. package/dist/compounding/engine.js +3 -3
  146. package/dist/compounding/preference-consolidator.js +39 -11
  147. package/dist/compounding/preference-consolidator.js.map +1 -1
  148. package/dist/config.js +1 -1
  149. package/dist/connectors/codex-materialize-runner.js +3 -3
  150. package/dist/connectors/index.js +3 -3
  151. package/dist/consolidation-provenance-check.js +1 -1
  152. package/dist/contradiction/index.js +4 -4
  153. package/dist/conversation-index/backend.js +2 -2
  154. package/dist/conversation-index/indexer.js +1 -1
  155. package/dist/cross-namespace-budget.js +1 -1
  156. package/dist/enrichment/index.js +1 -1
  157. package/dist/entity-retrieval.js +3 -3
  158. package/dist/evals.js +1 -1
  159. package/dist/explicit-capture.d.ts +1 -1
  160. package/dist/extraction-judge.js +8 -1
  161. package/dist/extraction.js +2 -2
  162. package/dist/fallback-llm.d.ts +23 -6
  163. package/dist/fallback-llm.js +5 -3
  164. package/dist/{first-start-migration-GYJWIH36.js → first-start-migration-FF7YFGRP.js} +6 -6
  165. package/dist/index.d.ts +3 -3
  166. package/dist/index.js +94 -93
  167. package/dist/index.js.map +1 -1
  168. package/dist/lcm/archive.js +2 -2
  169. package/dist/lcm/engine.js +5 -5
  170. package/dist/lcm/index.js +7 -7
  171. package/dist/lcm/summarizer.js +3 -3
  172. package/dist/maintenance/memory-governance-cron.d.ts +6 -4
  173. package/dist/maintenance/memory-governance-cron.js +1 -1
  174. package/dist/maintenance/memory-governance.js +3 -3
  175. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  176. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  177. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  178. package/dist/mcp-memory-inspector-app.js +1 -1
  179. package/dist/migrate/from-engram.js +1 -1
  180. package/dist/namespaces/migrate.js +16 -15
  181. package/dist/namespaces/search.js +12 -11
  182. package/dist/namespaces/storage.js +3 -3
  183. package/dist/network/webdav.d.ts +2 -0
  184. package/dist/network/webdav.js +1 -1
  185. package/dist/objective-state-writers.js +2 -2
  186. package/dist/operator-toolkit.d.ts +3 -1
  187. package/dist/operator-toolkit.js +21 -20
  188. package/dist/{orchestrator-DTRQG75J.d.ts → orchestrator-CqWOjfgl.d.ts} +46 -3
  189. package/dist/orchestrator.d.ts +1 -1
  190. package/dist/orchestrator.js +47 -44
  191. package/dist/patterns-cli.js +1 -1
  192. package/dist/qmd-recall-cache.d.ts +2 -0
  193. package/dist/qmd-recall-cache.js +1 -1
  194. package/dist/qmd.d.ts +37 -2
  195. package/dist/qmd.js +4 -1
  196. package/dist/recall-explain-renderer.js +3 -3
  197. package/dist/recall-planner-llm.d.ts +57 -0
  198. package/dist/recall-planner-llm.js +167 -0
  199. package/dist/recall-planner-llm.js.map +1 -0
  200. package/dist/recall-xray-cli.js +4 -4
  201. package/dist/recall-xray-renderer.js +3 -3
  202. package/dist/recall-xray.js +2 -2
  203. package/dist/resume-bundles.js +2 -2
  204. package/dist/retrieval-agents.js +2 -2
  205. package/dist/routing/store.js +1 -1
  206. package/dist/search/factory.js +11 -10
  207. package/dist/search/index.js +11 -10
  208. package/dist/search/lancedb-backend.d.ts +1 -1
  209. package/dist/search/lancedb-backend.js +3 -2
  210. package/dist/search/meilisearch-backend.d.ts +1 -1
  211. package/dist/search/meilisearch-backend.js +3 -2
  212. package/dist/search/noop-backend.d.ts +1 -1
  213. package/dist/search/noop-backend.js +1 -1
  214. package/dist/search/orama-backend.d.ts +1 -1
  215. package/dist/search/orama-backend.js +3 -2
  216. package/dist/search/port.d.ts +6 -1
  217. package/dist/search/port.js +7 -0
  218. package/dist/search/remote-backend.d.ts +1 -1
  219. package/dist/search/remote-backend.js +1 -1
  220. package/dist/semantic-consolidation.js +4 -4
  221. package/dist/semantic-rule-promotion.js +3 -3
  222. package/dist/semantic-rule-verifier.js +3 -3
  223. package/dist/session-observer-state.js +1 -1
  224. package/dist/storage.js +2 -2
  225. package/dist/summarizer.js +2 -2
  226. package/dist/temporal-index.js +1 -1
  227. package/dist/{tier-stats-SKML2OSF.js → tier-stats-3LYQ3VV5.js} +3 -3
  228. package/dist/transfer/backup.js +2 -2
  229. package/dist/transfer/capsule-export.js +2 -2
  230. package/dist/transfer/capsule-import.js +2 -2
  231. package/dist/transfer/export-sqlite.js +1 -1
  232. package/dist/types.d.ts +32 -0
  233. package/dist/types.js +1 -1
  234. package/dist/utility-learner.js +1 -1
  235. package/dist/utility-runtime.js +2 -2
  236. package/dist/verified-recall.js +3 -3
  237. package/dist/work/board.js +2 -2
  238. package/dist/work/storage.d.ts +2 -0
  239. package/dist/work/storage.js +1 -1
  240. package/package.json +1 -1
  241. package/src/access-http.ts +3 -0
  242. package/src/access-mcp.test.ts +51 -0
  243. package/src/access-mcp.ts +26 -5
  244. package/src/active-recall.test.ts +40 -0
  245. package/src/active-recall.ts +19 -2
  246. package/src/behavior-learner.ts +5 -3
  247. package/src/buffer-session.test.ts +58 -0
  248. package/src/buffer-surprise-trigger.test.ts +4 -18
  249. package/src/buffer.ts +39 -11
  250. package/src/calibration.ts +10 -4
  251. package/src/causal-consolidation.test.ts +47 -2
  252. package/src/causal-consolidation.ts +13 -9
  253. package/src/cli.ts +19 -4
  254. package/src/compounding/engine.ts +2 -0
  255. package/src/compounding/preference-consolidator.test.ts +292 -0
  256. package/src/compounding/preference-consolidator.ts +55 -19
  257. package/src/config.test.ts +213 -0
  258. package/src/config.ts +175 -4
  259. package/src/connectors/codex-materialize-runner.ts +7 -4
  260. package/src/consolidation-provenance-check.ts +24 -5
  261. package/src/conversation-index/indexer.test.ts +22 -0
  262. package/src/conversation-index/indexer.ts +7 -3
  263. package/src/cross-namespace-budget.test.ts +44 -21
  264. package/src/cross-namespace-budget.ts +2 -2
  265. package/src/enrichment/pipeline.ts +11 -16
  266. package/src/evals.ts +1 -1
  267. package/src/extraction-judge-chain.test.ts +55 -0
  268. package/src/extraction-judge.ts +7 -9
  269. package/src/extraction.ts +16 -5
  270. package/src/fallback-llm.test.ts +600 -1
  271. package/src/fallback-llm.ts +91 -22
  272. package/src/maintenance/memory-governance-cron.ts +39 -29
  273. package/src/mcp-memory-inspector-app.ts +54 -12
  274. package/src/message-parts/index.ts +6 -0
  275. package/src/message-parts/message-parts.test.ts +30 -0
  276. package/src/migrate/from-engram.ts +19 -5
  277. package/src/namespaces/search.test.ts +15 -2
  278. package/src/namespaces/search.ts +1 -1
  279. package/src/network/webdav.ts +61 -21
  280. package/src/operator-toolkit.ts +6 -2
  281. package/src/orchestrator.ts +173 -20
  282. package/src/qmd-client.test.ts +85 -0
  283. package/src/qmd-recall-cache.test.ts +16 -0
  284. package/src/qmd-recall-cache.ts +7 -0
  285. package/src/qmd.test.ts +54 -0
  286. package/src/qmd.ts +119 -19
  287. package/src/recall-planner-llm.test.ts +224 -0
  288. package/src/recall-planner-llm.ts +289 -0
  289. package/src/routing/store.ts +4 -8
  290. package/src/search/factory.ts +3 -0
  291. package/src/search/lancedb-backend.ts +15 -3
  292. package/src/search/meilisearch-backend.ts +70 -7
  293. package/src/search/noop-backend.ts +5 -1
  294. package/src/search/orama-backend.ts +15 -3
  295. package/src/search/port.ts +15 -0
  296. package/src/search/remote-backend.ts +5 -1
  297. package/src/session-observer-state.ts +1 -1
  298. package/src/summarizer.ts +3 -3
  299. package/src/temporal-index.test.ts +18 -0
  300. package/src/temporal-index.ts +45 -0
  301. package/src/training-export/cli-date-validation.test.ts +36 -0
  302. package/src/training-export/date-parse.ts +21 -2
  303. package/src/transfer/export-sqlite.ts +3 -0
  304. package/src/types.ts +35 -0
  305. package/src/utility-learner.ts +1 -0
  306. package/src/work/storage.ts +23 -0
  307. package/dist/chunk-5RPTH6AU.js.map +0 -1
  308. package/dist/chunk-AJA46VX5.js.map +0 -1
  309. package/dist/chunk-C4SQJZAF.js.map +0 -1
  310. package/dist/chunk-CHCA44C3.js.map +0 -1
  311. package/dist/chunk-CSKLPDN6.js.map +0 -1
  312. package/dist/chunk-DLJ4IR6M.js.map +0 -1
  313. package/dist/chunk-EAZGEEG2.js.map +0 -1
  314. package/dist/chunk-EVZFIAPG.js.map +0 -1
  315. package/dist/chunk-G3Z3QEF5.js.map +0 -1
  316. package/dist/chunk-GMAG2HS4.js.map +0 -1
  317. package/dist/chunk-HENLZHIT.js.map +0 -1
  318. package/dist/chunk-HINSGUA7.js.map +0 -1
  319. package/dist/chunk-HJNQQICM.js.map +0 -1
  320. package/dist/chunk-HPWVAEET.js.map +0 -1
  321. package/dist/chunk-IOTENEVL.js.map +0 -1
  322. package/dist/chunk-IP73YCZP.js.map +0 -1
  323. package/dist/chunk-JHMFYY7L.js.map +0 -1
  324. package/dist/chunk-JNANKJLN.js.map +0 -1
  325. package/dist/chunk-KGK2QKWL.js.map +0 -1
  326. package/dist/chunk-KM2A35EO.js.map +0 -1
  327. package/dist/chunk-KVEVLBKC.js.map +0 -1
  328. package/dist/chunk-L227SKTB.js.map +0 -1
  329. package/dist/chunk-LZ3VEOU5.js.map +0 -1
  330. package/dist/chunk-NOMEVTUD.js.map +0 -1
  331. package/dist/chunk-NZPF2SYV.js.map +0 -1
  332. package/dist/chunk-PCI747N2.js.map +0 -1
  333. package/dist/chunk-TH67Q46T.js.map +0 -1
  334. package/dist/chunk-UWY7GIVS.js.map +0 -1
  335. package/dist/chunk-VJXSUAO7.js.map +0 -1
  336. package/dist/chunk-XKIQZXUB.js.map +0 -1
  337. package/dist/chunk-XPSVGJYA.js.map +0 -1
  338. package/dist/chunk-XSWKORGM.js.map +0 -1
  339. package/dist/chunk-YCN4BVDK.js.map +0 -1
  340. package/dist/chunk-ZDTVJXIP.js.map +0 -1
  341. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  342. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  343. /package/dist/{chunk-HSVJGWYS.js.map → chunk-2ROPI5OE.js.map} +0 -0
  344. /package/dist/{chunk-CF3ZF2YU.js.map → chunk-3QSU4NFF.js.map} +0 -0
  345. /package/dist/{chunk-OI27U2HT.js.map → chunk-5BTCT236.js.map} +0 -0
  346. /package/dist/{chunk-CO7ZO4TU.js.map → chunk-5VDJMYTF.js.map} +0 -0
  347. /package/dist/{chunk-YFS5OEKO.js.map → chunk-7MLB4NCL.js.map} +0 -0
  348. /package/dist/{chunk-2QANQKSQ.js.map → chunk-ADNZVFXG.js.map} +0 -0
  349. /package/dist/{chunk-557IAFPD.js.map → chunk-APRRL26Q.js.map} +0 -0
  350. /package/dist/{chunk-QDDHYAKV.js.map → chunk-AZDOWD2L.js.map} +0 -0
  351. /package/dist/{chunk-MLT75J5S.js.map → chunk-B6SU7YSE.js.map} +0 -0
  352. /package/dist/{chunk-FXKPZ3H6.js.map → chunk-BPSGLMQ4.js.map} +0 -0
  353. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  354. /package/dist/{chunk-IK34DVAC.js.map → chunk-CIOMS6DI.js.map} +0 -0
  355. /package/dist/{chunk-7DZRO2DC.js.map → chunk-DEPRLVLK.js.map} +0 -0
  356. /package/dist/{chunk-DHGSZ3UD.js.map → chunk-DGNQRNLL.js.map} +0 -0
  357. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  358. /package/dist/{chunk-ETUPBUHB.js.map → chunk-GDASG7NC.js.map} +0 -0
  359. /package/dist/{chunk-4HP7HIE3.js.map → chunk-HP5FMB6L.js.map} +0 -0
  360. /package/dist/{chunk-DOX2CG6Y.js.map → chunk-IEUU7O4F.js.map} +0 -0
  361. /package/dist/{chunk-WSGF57U2.js.map → chunk-JQDZQ4TB.js.map} +0 -0
  362. /package/dist/{chunk-W7L6HXUC.js.map → chunk-LXOM6IQU.js.map} +0 -0
  363. /package/dist/{chunk-6JGNHWCI.js.map → chunk-OBIRVF36.js.map} +0 -0
  364. /package/dist/{chunk-GUPISBV2.js.map → chunk-PP2JH3GP.js.map} +0 -0
  365. /package/dist/{chunk-OXJBNGBK.js.map → chunk-PSUB67YB.js.map} +0 -0
  366. /package/dist/{chunk-KIB7SDIJ.js.map → chunk-Q6YIJGXJ.js.map} +0 -0
  367. /package/dist/{chunk-PPPZY2EU.js.map → chunk-QEMCQFDW.js.map} +0 -0
  368. /package/dist/{chunk-ZT3EGNLR.js.map → chunk-QPD426WT.js.map} +0 -0
  369. /package/dist/{chunk-RLV3PQGH.js.map → chunk-QVO4YOB7.js.map} +0 -0
  370. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  371. /package/dist/{chunk-IK7DCC5H.js.map → chunk-VMGLYN42.js.map} +0 -0
  372. /package/dist/{chunk-NSKYFGDL.js.map → chunk-X4QQB7O6.js.map} +0 -0
  373. /package/dist/{first-start-migration-GYJWIH36.js.map → first-start-migration-FF7YFGRP.js.map} +0 -0
  374. /package/dist/{tier-stats-SKML2OSF.js.map → tier-stats-3LYQ3VV5.js.map} +0 -0
@@ -40,18 +40,47 @@ test("enabled budget warns past soft and denies past hard", () => {
40
40
  const limiter = new CrossNamespaceBudget({
41
41
  enabled: true,
42
42
  softLimit: 2,
43
- hardLimit: 3,
43
+ hardLimit: 4,
44
44
  windowMs: 10_000,
45
45
  });
46
46
  assert.equal(limiter.record("p1", 1).reason, "allowed-under-soft");
47
47
  assert.equal(limiter.record("p1", 2).reason, "allowed-under-soft");
48
48
  assert.equal(limiter.record("p1", 3).reason, "warn-over-soft");
49
- // 4th call crosses hardLimit (count would be 4 > 3) => deny.
49
+ // 4th call reaches hardLimit and is denied.
50
50
  const deny = limiter.record("p1", 4);
51
51
  assert.equal(deny.allowed, false);
52
52
  assert.equal(deny.reason, "deny-over-hard");
53
53
  });
54
54
 
55
+ test("enabled budget denies the threshold-crossing hard-limit request", () => {
56
+ const limiter = new CrossNamespaceBudget({
57
+ enabled: true,
58
+ softLimit: 0,
59
+ hardLimit: 2,
60
+ windowMs: 10_000,
61
+ });
62
+
63
+ const first = limiter.record("p1", 1);
64
+ assert.equal(first.allowed, true);
65
+ assert.equal(first.reason, "warn-over-soft");
66
+ assert.equal(first.count, 1);
67
+
68
+ const beforeSecond = limiter.peek({
69
+ principal: "p1",
70
+ principalNamespace: "alice",
71
+ queryNamespace: "bob",
72
+ now: 2,
73
+ });
74
+ assert.equal(beforeSecond.allowed, false);
75
+ assert.equal(beforeSecond.reason, "deny-over-hard");
76
+ assert.equal(beforeSecond.count, 1);
77
+
78
+ const second = limiter.record("p1", 2);
79
+ assert.equal(second.allowed, false);
80
+ assert.equal(second.reason, "deny-over-hard");
81
+ assert.equal(second.count, 1);
82
+ });
83
+
55
84
  test("sliding window drops old timestamps", () => {
56
85
  const limiter = new CrossNamespaceBudget({
57
86
  enabled: true,
@@ -61,10 +90,9 @@ test("sliding window drops old timestamps", () => {
61
90
  });
62
91
  // Fill to hard.
63
92
  limiter.record("p1", 0);
64
- limiter.record("p1", 50);
65
- assert.equal(limiter.record("p1", 80).reason, "deny-over-hard");
93
+ assert.equal(limiter.record("p1", 50).reason, "deny-over-hard");
66
94
 
67
- // Walk past the window so the first two slide out.
95
+ // Walk past the window so the first allowed timestamp slides out.
68
96
  const d = limiter.record("p1", 201);
69
97
  assert.equal(d.allowed, true);
70
98
  assert.equal(d.reason, "allowed-under-soft");
@@ -75,7 +103,7 @@ test("per-principal isolation: one principal's denial does not affect another",
75
103
  const limiter = new CrossNamespaceBudget({
76
104
  enabled: true,
77
105
  softLimit: 1,
78
- hardLimit: 1,
106
+ hardLimit: 2,
79
107
  windowMs: 10_000,
80
108
  });
81
109
  limiter.record("alice", 10);
@@ -107,7 +135,7 @@ test("check() engages on cross-namespace", () => {
107
135
  const limiter = new CrossNamespaceBudget({
108
136
  enabled: true,
109
137
  softLimit: 1,
110
- hardLimit: 1,
138
+ hardLimit: 2,
111
139
  windowMs: 10_000,
112
140
  });
113
141
  const d1 = limiter.check({
@@ -131,7 +159,7 @@ test("denied calls do not push bucket forward", () => {
131
159
  const limiter = new CrossNamespaceBudget({
132
160
  enabled: true,
133
161
  softLimit: 1,
134
- hardLimit: 1,
162
+ hardLimit: 2,
135
163
  windowMs: 100,
136
164
  });
137
165
  limiter.record("p1", 0);
@@ -150,7 +178,7 @@ test("missing principal is bucketed under __anonymous__ rather than failing open
150
178
  const limiter = new CrossNamespaceBudget({
151
179
  enabled: true,
152
180
  softLimit: 0,
153
- hardLimit: 1,
181
+ hardLimit: 2,
154
182
  windowMs: 10_000,
155
183
  });
156
184
  // An empty-string principal shares the anonymous bucket.
@@ -168,8 +196,7 @@ test("reset clears all state", () => {
168
196
  windowMs: 10_000,
169
197
  });
170
198
  limiter.record("p1", 1);
171
- limiter.record("p1", 2);
172
- assert.equal(limiter.record("p1", 3).reason, "deny-over-hard");
199
+ assert.equal(limiter.record("p1", 2).reason, "deny-over-hard");
173
200
  limiter.reset();
174
201
  const after = limiter.record("p1", 4);
175
202
  assert.equal(after.allowed, true);
@@ -231,7 +258,7 @@ test("record() normalizes non-finite clocks before mutating limiter state", () =
231
258
  const limiter = new CrossNamespaceBudget({
232
259
  enabled: true,
233
260
  softLimit: 1,
234
- hardLimit: 1,
261
+ hardLimit: 2,
235
262
  windowMs: 100,
236
263
  });
237
264
 
@@ -254,7 +281,7 @@ test("peek() with a non-finite clock is read-only and does not poison state", ()
254
281
  const limiter = new CrossNamespaceBudget({
255
282
  enabled: true,
256
283
  softLimit: 0,
257
- hardLimit: 1,
284
+ hardLimit: 2,
258
285
  windowMs: 100,
259
286
  });
260
287
 
@@ -293,14 +320,10 @@ test("bucket is evicted after a denial rolls the only timestamp back", () => {
293
320
  hardLimit: 1,
294
321
  windowMs: 100,
295
322
  });
296
- limiter.record("p1", 0);
297
- // Denial at t=150 after the earlier timestamp has slid out. The
298
- // timestamp just added gets rolled back; bucket becomes empty; must
299
- // be evicted.
300
- limiter.record("p1", 150);
301
- // (wait — the above is allowed because the earlier timestamp slid out.)
302
- // Force a deny path differently:
303
- assert.equal(limiter.bucketCount(), 1);
323
+ const denied = limiter.record("p1", 0);
324
+ assert.equal(denied.allowed, false);
325
+ assert.equal(denied.reason, "deny-over-hard");
326
+ assert.equal(limiter.bucketCount(), 0);
304
327
  });
305
328
 
306
329
  test("check() does NOT fail-open when both namespaces are empty or undefined", () => {
@@ -207,7 +207,7 @@ export class CrossNamespaceBudget {
207
207
  this.buckets.set(principal, bucket);
208
208
  const count = bucket.timestamps.length;
209
209
 
210
- if (count > hardLimit) {
210
+ if (count >= hardLimit) {
211
211
  // Denied: roll back the timestamp we just added so a repeated denied
212
212
  // call does not push the bucket further into the future. This keeps
213
213
  // the limiter stateless with respect to denied attempts.
@@ -290,7 +290,7 @@ export class CrossNamespaceBudget {
290
290
  if (ts >= cutoff) liveCount++;
291
291
  }
292
292
  const projected = liveCount + 1; // +1 for the current call
293
- if (projected > hardLimit) {
293
+ if (projected >= hardLimit) {
294
294
  return { allowed: false, reason: "deny-over-hard", count: liveCount, limit };
295
295
  }
296
296
  if (projected > softLimit) {
@@ -32,12 +32,12 @@ interface RateLimitBucket {
32
32
 
33
33
  const rateBuckets = new Map<string, RateLimitBucket>();
34
34
 
35
- function isRateLimited(
35
+ function reserveRateLimitSlot(
36
36
  provider: EnrichmentProvider,
37
37
  config: EnrichmentPipelineConfig,
38
38
  ): boolean {
39
39
  const providerCfg = config.providers.find((p) => p.id === provider.id);
40
- if (!providerCfg?.rateLimit) return false;
40
+ if (!providerCfg?.rateLimit) return true;
41
41
 
42
42
  const now = Date.now();
43
43
  let bucket = rateBuckets.get(provider.id);
@@ -62,17 +62,13 @@ function isRateLimited(
62
62
  }
63
63
 
64
64
  const { maxPerMinute, maxPerDay } = providerCfg.rateLimit;
65
- return bucket.minuteCount >= maxPerMinute || bucket.dayCount >= maxPerDay;
66
- }
67
-
68
- function recordCall(
69
- providerId: string,
70
- ): void {
71
- const bucket = rateBuckets.get(providerId);
72
- if (bucket) {
73
- bucket.minuteCount += 1;
74
- bucket.dayCount += 1;
65
+ if (bucket.minuteCount >= maxPerMinute || bucket.dayCount >= maxPerDay) {
66
+ return false;
75
67
  }
68
+
69
+ bucket.minuteCount += 1;
70
+ bucket.dayCount += 1;
71
+ return true;
76
72
  }
77
73
 
78
74
  // ---------------------------------------------------------------------------
@@ -129,8 +125,9 @@ export async function runEnrichmentPipeline(
129
125
  continue;
130
126
  }
131
127
 
132
- // Check rate limit
133
- if (isRateLimited(provider, config)) {
128
+ // Reserve quota before the awaited provider call so concurrent pipelines
129
+ // cannot all pass the same pre-await rate-limit check.
130
+ if (!reserveRateLimitSlot(provider, config)) {
134
131
  log.debug?.(
135
132
  `enrichment: skipping provider ${provider.id} for ${entity.name} — rate limited`,
136
133
  );
@@ -154,7 +151,6 @@ export async function runEnrichmentPipeline(
154
151
  try {
155
152
  candidates = await provider.enrich(entity);
156
153
  } catch (err) {
157
- recordCall(provider.id);
158
154
  log.error?.(
159
155
  `enrichment: provider ${provider.id} failed for ${entity.name}: ${err instanceof Error ? err.message : String(err)}`,
160
156
  );
@@ -169,7 +165,6 @@ export async function runEnrichmentPipeline(
169
165
  });
170
166
  continue;
171
167
  }
172
- recordCall(provider.id);
173
168
 
174
169
  // Tag each candidate with provider id
175
170
  for (const candidate of candidates) {
package/src/evals.ts CHANGED
@@ -359,7 +359,7 @@ export function validateEvalBenchmarkManifest(
359
359
 
360
360
  return {
361
361
  schemaVersion: 1,
362
- benchmarkId: assertString(raw.benchmarkId, "benchmarkId"),
362
+ benchmarkId: assertSafeBenchmarkId(assertString(raw.benchmarkId, "benchmarkId")),
363
363
  benchmarkType,
364
364
  title: assertString(raw.title, "title"),
365
365
  description:
@@ -0,0 +1,55 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseConfig } from "./config.js";
5
+ import { judgeFactDurability } from "./extraction-judge.js";
6
+ import type { FallbackLlmClient } from "./fallback-llm.js";
7
+
8
+ // Regression for cursor review on #1425: the extraction judge must route gateway
9
+ // fallback calls through the SAME precedence as ExtractionEngine.withGatewayAgent
10
+ // — taskModelChain wins over gatewayAgentId — so judge-gated extractions use the
11
+ // configured task chain instead of silently using the persona/default chain.
12
+
13
+ function captureLlm(captured: Array<Record<string, unknown>>): FallbackLlmClient {
14
+ return {
15
+ isAvailable: () => true,
16
+ chatCompletion: async (_messages: unknown, options: Record<string, unknown>) => {
17
+ captured.push(options);
18
+ // A parseable batch verdict so the judge doesn't error after the call.
19
+ return { content: JSON.stringify([{ index: 0, durable: true, reason: "ok" }]) };
20
+ },
21
+ } as unknown as FallbackLlmClient;
22
+ }
23
+
24
+ // "preference" is not auto-approved (only "correction"/"principle" are), so a
25
+ // non-critical preference candidate reaches the LLM path.
26
+ const candidate = { text: "user prefers dark mode", category: "preference", confidence: 0.5 };
27
+
28
+ test("judge forwards taskModelChain to the fallback LLM in gateway mode", async () => {
29
+ const config = parseConfig({
30
+ modelSource: "gateway",
31
+ gatewayAgentId: "persona-agent",
32
+ taskModelChain: { primary: "zai/glm-4.7-flash", fallbacks: ["fireworks/x/glm-5p1"] },
33
+ });
34
+ const captured: Array<Record<string, unknown>> = [];
35
+
36
+ await judgeFactDurability([candidate], config, null, captureLlm(captured), new Map(), new Map());
37
+
38
+ assert.equal(captured.length, 1, "judge should call the fallback LLM once");
39
+ assert.deepEqual(captured[0]?.modelChain, {
40
+ primary: "zai/glm-4.7-flash",
41
+ fallbacks: ["fireworks/x/glm-5p1"],
42
+ });
43
+ assert.equal(captured[0]?.agentId, undefined, "taskModelChain takes precedence over gatewayAgentId");
44
+ });
45
+
46
+ test("judge falls back to gatewayAgentId when no taskModelChain is set", async () => {
47
+ const config = parseConfig({ modelSource: "gateway", gatewayAgentId: "persona-agent" });
48
+ const captured: Array<Record<string, unknown>> = [];
49
+
50
+ await judgeFactDurability([candidate], config, null, captureLlm(captured), new Map(), new Map());
51
+
52
+ assert.equal(captured.length, 1);
53
+ assert.equal(captured[0]?.agentId, "persona-agent");
54
+ assert.equal(captured[0]?.modelChain, undefined);
55
+ });
@@ -17,7 +17,7 @@ import { createHash } from "node:crypto";
17
17
  import { log } from "./logger.js";
18
18
  import type { PluginConfig, ImportanceLevel } from "./types.js";
19
19
  import type { LocalLlmClient } from "./local-llm.js";
20
- import type { FallbackLlmClient } from "./fallback-llm.js";
20
+ import { type FallbackLlmClient, gatewayTaskChainOptions } from "./fallback-llm.js";
21
21
  import { extractJsonCandidates } from "./json-extract.js";
22
22
  import { normalizeProcedureSteps } from "./procedural/procedure-types.js";
23
23
 
@@ -656,13 +656,11 @@ async function callJudgeLlm(
656
656
  // routing preference.
657
657
  const skipLocal = config.modelSource === "gateway";
658
658
 
659
- // Resolve the gateway agent ID so the fallback LLM routes through the
660
- // correct agent persona's model chain identical to the pattern used
661
- // by ExtractionEngine.withGatewayAgent().
662
- const agentId =
663
- config.modelSource === "gateway"
664
- ? (config.gatewayAgentId || undefined)
665
- : undefined;
659
+ // Route judge-gated extractions through the SAME shared resolution as every
660
+ // other background task (taskModelChain > gatewayAgentId in gateway mode), so
661
+ // the judge never silently falls back to the persona/default chain when a
662
+ // task chain is configured (gotcha #22, #39). Issue #1365 / PR #1425.
663
+ const gatewayChain = gatewayTaskChainOptions(config);
666
664
 
667
665
  // Try local LLM first (unless modelSource says gateway)
668
666
  if (localLlm && !skipLocal) {
@@ -695,7 +693,7 @@ async function callJudgeLlm(
695
693
  maxTokens: 2048,
696
694
  timeoutMs: 1500,
697
695
  ...(modelOverride ? { model: modelOverride } : {}),
698
- ...(agentId ? { agentId } : {}),
696
+ ...gatewayChain,
699
697
  },
700
698
  );
701
699
  if (result?.content) {
package/src/extraction.ts CHANGED
@@ -2,7 +2,7 @@ import OpenAI from "openai";
2
2
  import { log } from "./logger.js";
3
3
  import { delinearize } from "./delinearize.js";
4
4
  import { LocalLlmClient } from "./local-llm.js";
5
- import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig } from "./fallback-llm.js";
5
+ import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig, gatewayTaskChainOptions } from "./fallback-llm.js";
6
6
  import {
7
7
  ExtractionResultSchema,
8
8
  ConsolidationResultSchema,
@@ -123,7 +123,16 @@ export class ExtractionEngine {
123
123
  if (config.modelSource === "gateway") {
124
124
  log.debug(
125
125
  `extraction engine: gateway model source active; extraction uses the gateway chain as its primary path` +
126
- (config.gatewayAgentId ? ` (agent: ${config.gatewayAgentId})` : " (defaults)"),
126
+ (config.taskModelChain ? " (taskModelChain)" :
127
+ config.gatewayAgentId ? ` (agent: ${config.gatewayAgentId})` : " (defaults)"),
128
+ );
129
+ } else if (config.taskModelChain) {
130
+ // taskModelChain resolves through gateway providers, so it only applies
131
+ // under modelSource: "gateway". Warn rather than silently ignore it so a
132
+ // misconfigured plugin-mode setup is visible. Issue #1365 / PR #1370.
133
+ log.warn(
134
+ `taskModelChain is set but modelSource is "${config.modelSource}"; the chain is ignored. ` +
135
+ `Set modelSource: "gateway" to use it for extraction/consolidation/summarization.`,
127
136
  );
128
137
  }
129
138
  }
@@ -157,8 +166,9 @@ export class ExtractionEngine {
157
166
  */
158
167
  private withGatewayAgent(options: import("./fallback-llm.js").FallbackLlmOptions): import("./fallback-llm.js").FallbackLlmOptions {
159
168
  if (!this.useGatewayModelSource) return options;
160
- const agentId = this.config.gatewayAgentId || undefined;
161
- return agentId ? { ...options, agentId } : options;
169
+ // Shared resolution (taskModelChain > gatewayAgentId) so every background
170
+ // task routes identically (gotcha #22). Issue #1365.
171
+ return { ...options, ...gatewayTaskChainOptions(this.config) };
162
172
  }
163
173
 
164
174
  private emit(event: LlmTraceEvent): void {
@@ -1098,7 +1108,8 @@ export class ExtractionEngine {
1098
1108
  if (this.useGatewayModelSource) {
1099
1109
  log.debug(
1100
1110
  `extraction: using gateway model chain as primary path` +
1101
- (this.config.gatewayAgentId ? ` (agent: ${this.config.gatewayAgentId})` : " (defaults)"),
1111
+ (this.config.taskModelChain ? " (taskModelChain)" :
1112
+ this.config.gatewayAgentId ? ` (agent: ${this.config.gatewayAgentId})` : " (defaults)"),
1102
1113
  );
1103
1114
  } else {
1104
1115
  log.info("extraction: falling back to gateway default AI");