@remnic/core 9.65.0 → 9.65.2

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 (589) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +45 -43
  3. package/dist/access-authorization-probe.d.ts +12 -13
  4. package/dist/access-authorization-probe.js +46 -44
  5. package/dist/access-boundary.d.ts +12 -156
  6. package/dist/access-boundary.js +45 -43
  7. package/dist/access-cli.js +120 -116
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +11 -11
  11. package/dist/access-extraction-force-flush.js +45 -43
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +11 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +12 -13
  15. package/dist/access-http-offline-stream.d.ts +11 -11
  16. package/dist/access-http-query.d.ts +2 -2
  17. package/dist/access-http-query.js +47 -45
  18. package/dist/access-http.d.ts +12 -12
  19. package/dist/access-http.js +65 -63
  20. package/dist/access-identity-continuity-surface.d.ts +9 -9
  21. package/dist/access-identity-continuity-surface.js +45 -43
  22. package/dist/access-lcm-surface.d.ts +11 -11
  23. package/dist/access-lcm-surface.js +45 -43
  24. package/dist/access-mcp-admin-tools.js +1 -1
  25. package/dist/access-mcp-output-schemas.js +1 -1
  26. package/dist/access-mcp.d.ts +11 -11
  27. package/dist/access-mcp.js +58 -54
  28. package/dist/access-memory-search-fanout.d.ts +2 -2
  29. package/dist/{access-namespace-preflight-AqlR0w02.d.ts → access-namespace-preflight-Dhvcl-T0.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +3 -3
  31. package/dist/access-namespace-preflight.js +45 -43
  32. package/dist/access-observe-write-surface.d.ts +11 -11
  33. package/dist/access-observe-write-surface.js +45 -43
  34. package/dist/access-offline-manifest.d.ts +9 -9
  35. package/dist/access-offline-manifest.js +5 -5
  36. package/dist/access-operations-batch.js +49 -47
  37. package/dist/access-operations.d.ts +18 -19
  38. package/dist/access-operations.js +52 -50
  39. package/dist/access-recall-concurrency.d.ts +11 -11
  40. package/dist/access-recall-concurrency.js +45 -43
  41. package/dist/access-recall-response.d.ts +11 -11
  42. package/dist/access-recall-response.js +45 -43
  43. package/dist/access-recall-surface.d.ts +11 -11
  44. package/dist/access-recall-surface.js +45 -43
  45. package/dist/access-schema.d.ts +118 -118
  46. package/dist/access-schema.js +3 -3
  47. package/dist/{access-service-BHmtl9BA.d.ts → access-service-Bke1alZO.d.ts} +484 -80
  48. package/dist/access-service-helpers.d.ts +11 -11
  49. package/dist/access-service.d.ts +11 -11
  50. package/dist/access-service.js +45 -43
  51. package/dist/access-surface-catalog.d.ts +12 -13
  52. package/dist/access-surface-catalog.js +49 -45
  53. package/dist/access-surface-catalog.js.map +1 -1
  54. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  55. package/dist/action-confidence.d.ts +1 -1
  56. package/dist/active-memory-bridge.d.ts +1 -1
  57. package/dist/active-recall.d.ts +1 -1
  58. package/dist/active-recall.js +6 -1
  59. package/dist/active-recall.js.map +1 -1
  60. package/dist/adapters/index.js +4 -4
  61. package/dist/adapters/registry.js +2 -2
  62. package/dist/ambient-provenance.d.ts +1 -1
  63. package/dist/artifact-search.d.ts +1 -1
  64. package/dist/{auto-sync-5L7EUZ27.js → auto-sync-H64ZCNIR.js} +13 -5
  65. package/dist/{auto-sync-5L7EUZ27.js.map → auto-sync-H64ZCNIR.js.map} +1 -1
  66. package/dist/behavior-learner.d.ts +1 -1
  67. package/dist/behavior-signals.d.ts +1 -1
  68. package/dist/bootstrap.d.ts +9 -9
  69. package/dist/briefing-window.d.ts +2 -2
  70. package/dist/briefing.d.ts +2 -2
  71. package/dist/briefing.js +19 -17
  72. package/dist/buffer-surprise-report.d.ts +1 -1
  73. package/dist/buffer-turn-helpers.d.ts +1 -1
  74. package/dist/buffer.d.ts +2 -2
  75. package/dist/buffer.js +4 -4
  76. package/dist/bulk-import/index.d.ts +3 -3
  77. package/dist/calibration.d.ts +1 -1
  78. package/dist/calibration.js +1 -1
  79. package/dist/capabilities.d.ts +1 -1
  80. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  81. package/dist/{catalog-gBoyN-IW.d.ts → catalog-DV6qnbr7.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +1 -1
  83. package/dist/causal-behavior.js +2 -2
  84. package/dist/causal-chain.js +2 -2
  85. package/dist/causal-consolidation.d.ts +1 -1
  86. package/dist/causal-consolidation.js +22 -20
  87. package/dist/causal-consolidation.js.map +1 -1
  88. package/dist/causal-retrieval.js +2 -2
  89. package/dist/causal-trajectory-graph.d.ts +1 -1
  90. package/dist/causal-trajectory-graph.js +2 -2
  91. package/dist/causal-trajectory.js +1 -1
  92. package/dist/{chunk-A6LBDIFS.js → chunk-2E36UXVW.js} +2 -2
  93. package/dist/{chunk-RRJUMSFX.js → chunk-2XDWWPTN.js} +3 -3
  94. package/dist/{chunk-QCNB4BRE.js → chunk-2YI72KM3.js} +3 -3
  95. package/dist/{chunk-3YTTAGPB.js → chunk-3DVBKTSO.js} +2 -2
  96. package/dist/{chunk-IFK3PVM7.js → chunk-3I7ASZN3.js} +2 -2
  97. package/dist/chunk-3WU7XOFN.js +102 -0
  98. package/dist/chunk-3WU7XOFN.js.map +1 -0
  99. package/dist/{chunk-EIR5VLIH.js → chunk-4K7IW3F7.js} +2 -2
  100. package/dist/chunk-4K7IW3F7.js.map +1 -0
  101. package/dist/{chunk-HBKFYXBA.js → chunk-4KYOLI6M.js} +15 -15
  102. package/dist/chunk-573TEZCD.js +88 -0
  103. package/dist/chunk-573TEZCD.js.map +1 -0
  104. package/dist/{chunk-RNKNL5GQ.js → chunk-5NM4OH4P.js} +3 -3
  105. package/dist/{chunk-CESQ4CMC.js → chunk-5YQ63T4B.js} +2 -2
  106. package/dist/{chunk-PMVPCZJZ.js → chunk-6433HV72.js} +2 -2
  107. package/dist/{chunk-4NZHHGVL.js → chunk-7BDZTALN.js} +4 -1
  108. package/dist/chunk-7BDZTALN.js.map +1 -0
  109. package/dist/{chunk-NS5ETDYD.js → chunk-7BEPVIH3.js} +3 -3
  110. package/dist/{chunk-JG22O53B.js → chunk-7CBKAQIG.js} +2 -1
  111. package/dist/chunk-7CBKAQIG.js.map +1 -0
  112. package/dist/{chunk-SHQFYZTD.js → chunk-7YQ4IYS2.js} +2 -2
  113. package/dist/chunk-AAXJNINV.js +55 -0
  114. package/dist/chunk-AAXJNINV.js.map +1 -0
  115. package/dist/{chunk-YMOPYG3K.js → chunk-BIJAWZYW.js} +6 -6
  116. package/dist/{chunk-YQ3CBLL4.js → chunk-BWLRUMOG.js} +78 -8
  117. package/dist/chunk-BWLRUMOG.js.map +1 -0
  118. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  119. package/dist/{chunk-VYEPACWY.js → chunk-C24UZSFW.js} +2 -2
  120. package/dist/{chunk-ZPN7W3OP.js → chunk-CDUUDBWJ.js} +3 -3
  121. package/dist/{chunk-K7JMKLKV.js → chunk-CT56C22C.js} +4 -4
  122. package/dist/{chunk-KWIGDKM2.js → chunk-D2YNNDML.js} +2 -2
  123. package/dist/{chunk-ZFBZ4QTS.js → chunk-DJZWNKFO.js} +10 -10
  124. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  125. package/dist/{chunk-VNIETTMR.js → chunk-DZUJ46DO.js} +2 -2
  126. package/dist/{chunk-T6QMNVMO.js → chunk-EILZG5VC.js} +2 -2
  127. package/dist/{chunk-652S5A5D.js → chunk-EUYWQ7TS.js} +2 -2
  128. package/dist/{chunk-YIZRTHHF.js → chunk-GDFVPUJ5.js} +2 -2
  129. package/dist/{chunk-ML3U4KPR.js → chunk-GIC6BASP.js} +2 -2
  130. package/dist/{chunk-7PWWGYGO.js → chunk-GNCCUR6K.js} +2 -2
  131. package/dist/{chunk-Y5UT73VZ.js → chunk-IID2CMUU.js} +2 -2
  132. package/dist/{chunk-MB6GLPRY.js → chunk-IVKIODHO.js} +4 -4
  133. package/dist/{chunk-ZAI5R6DW.js → chunk-J275IYMG.js} +26 -17
  134. package/dist/chunk-J275IYMG.js.map +1 -0
  135. package/dist/{chunk-UYCIS6V5.js → chunk-JCWY73FK.js} +2 -2
  136. package/dist/{chunk-URS5GSM7.js → chunk-JXN77SGO.js} +1 -1
  137. package/dist/chunk-JXN77SGO.js.map +1 -0
  138. package/dist/{chunk-WHA6ISFX.js → chunk-JYYBA7TF.js} +2 -2
  139. package/dist/{chunk-T42L3S6A.js → chunk-LBWQ65SX.js} +4 -4
  140. package/dist/{chunk-MSTNSVXI.js → chunk-LDBFXD4F.js} +2 -1
  141. package/dist/chunk-LDBFXD4F.js.map +1 -0
  142. package/dist/{chunk-JXMXTV6C.js → chunk-LGO6A7GJ.js} +56 -56
  143. package/dist/{chunk-XBRGJJK7.js → chunk-LUNJ3WFO.js} +10 -8
  144. package/dist/chunk-LUNJ3WFO.js.map +1 -0
  145. package/dist/{chunk-H6B6GPVH.js → chunk-LZH5FR2W.js} +2 -2
  146. package/dist/{chunk-5HERQ5FX.js → chunk-M4AHBM72.js} +10 -10
  147. package/dist/{chunk-GOGHZVY3.js → chunk-MN4KB2A4.js} +3 -3
  148. package/dist/{chunk-OQIRBGUU.js → chunk-N37X5RU7.js} +2 -2
  149. package/dist/{chunk-E6EQTCOQ.js → chunk-NKKD4ZAU.js} +2 -2
  150. package/dist/{chunk-VANZKHTN.js → chunk-NNBZS3DY.js} +2 -2
  151. package/dist/{chunk-IWUN4RZL.js → chunk-NTWN6HB2.js} +5 -5
  152. package/dist/{chunk-2PSX5BJU.js → chunk-NZPFCP5A.js} +2 -2
  153. package/dist/{chunk-U56TGYVS.js → chunk-OCZIYAE5.js} +4 -4
  154. package/dist/{chunk-I2HTKOOP.js → chunk-ODZG724P.js} +2 -2
  155. package/dist/{chunk-LTBKKSCX.js → chunk-OLBZ2WGG.js} +2 -2
  156. package/dist/{chunk-GQ5OJVTM.js → chunk-OTHZWLUD.js} +2 -2
  157. package/dist/{chunk-PD66CVSD.js → chunk-OUKBMQ2O.js} +2 -2
  158. package/dist/{chunk-4E6IJCLC.js → chunk-PE255F4T.js} +2 -2
  159. package/dist/{chunk-GPFZFCRN.js → chunk-PP7R754B.js} +1 -1
  160. package/dist/{chunk-PHX3ET3C.js → chunk-QOS5LBZN.js} +2 -2
  161. package/dist/{chunk-G72IPMR7.js → chunk-R4OCGPSH.js} +2 -2
  162. package/dist/{chunk-VUP47UJI.js → chunk-R7JAM2XF.js} +3 -3
  163. package/dist/{chunk-LCU5R6TQ.js → chunk-RAIUTAZZ.js} +22 -3
  164. package/dist/chunk-RAIUTAZZ.js.map +1 -0
  165. package/dist/chunk-RIAM7DND.js +167 -0
  166. package/dist/chunk-RIAM7DND.js.map +1 -0
  167. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  168. package/dist/{chunk-P4CQCL27.js → chunk-S2DPMJXH.js} +2 -2
  169. package/dist/{chunk-YHSNAGN3.js → chunk-SB7D4BT7.js} +548 -126
  170. package/dist/chunk-SB7D4BT7.js.map +1 -0
  171. package/dist/{chunk-VRYEXPRX.js → chunk-SBDCZ2AX.js} +1 -1
  172. package/dist/chunk-SBDCZ2AX.js.map +1 -0
  173. package/dist/{chunk-OXL5QKTV.js → chunk-SIHSCCUQ.js} +1 -1
  174. package/dist/{chunk-KLPVXLQJ.js → chunk-SPUJNJJC.js} +2 -2
  175. package/dist/{chunk-CCP6LXQJ.js → chunk-SQI57UCJ.js} +2 -2
  176. package/dist/{chunk-UIYYS2YI.js → chunk-SVSRPG6M.js} +2 -2
  177. package/dist/{chunk-56BSXSHC.js → chunk-TBOJ76ER.js} +14 -1
  178. package/dist/{chunk-56BSXSHC.js.map → chunk-TBOJ76ER.js.map} +1 -1
  179. package/dist/{chunk-RQYV6M2T.js → chunk-TF77C7SV.js} +14 -7
  180. package/dist/chunk-TF77C7SV.js.map +1 -0
  181. package/dist/{chunk-RNORDDD6.js → chunk-THG4GYIE.js} +2 -2
  182. package/dist/{chunk-CUIAHZPZ.js → chunk-TR7DGXGI.js} +2 -2
  183. package/dist/{chunk-GEULB2VI.js → chunk-TZNQUNKL.js} +7 -1
  184. package/dist/chunk-TZNQUNKL.js.map +1 -0
  185. package/dist/{chunk-PDKBKBC2.js → chunk-UIN2BWDD.js} +2 -2
  186. package/dist/{chunk-4GD7YV4Y.js → chunk-UXO5IMBK.js} +3 -3
  187. package/dist/{chunk-UPIKAT5A.js → chunk-V3MXUL3D.js} +173 -77
  188. package/dist/chunk-V3MXUL3D.js.map +1 -0
  189. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  190. package/dist/{chunk-MUJ4QFUQ.js → chunk-W4BMEGQA.js} +4 -4
  191. package/dist/{chunk-5HK3CJAR.js → chunk-W675UJCZ.js} +2 -2
  192. package/dist/{chunk-MDVBCPOS.js → chunk-XCTXS7VY.js} +2 -2
  193. package/dist/{chunk-NTERJOFA.js → chunk-XRYZRW54.js} +2 -2
  194. package/dist/{chunk-LA2MSK23.js → chunk-Y7DK7HHJ.js} +2 -2
  195. package/dist/{chunk-34BMUGRA.js → chunk-YB42WZCY.js} +2 -2
  196. package/dist/{chunk-LWVG6U7L.js → chunk-YHCBJULX.js} +2 -2
  197. package/dist/{chunk-HDD4RRIX.js → chunk-YLDXWCZP.js} +21 -6
  198. package/dist/chunk-YLDXWCZP.js.map +1 -0
  199. package/dist/{chunk-VYISFWVX.js → chunk-YQNNHLCG.js} +2 -2
  200. package/dist/{chunk-FFPBTNLC.js → chunk-Z7PBQPJ4.js} +2 -2
  201. package/dist/{chunk-MXJU4GCA.js → chunk-ZO6AXLEH.js} +2 -2
  202. package/dist/{chunk-JNSLW2O4.js → chunk-ZQHI2BZB.js} +2 -2
  203. package/dist/{chunk-A4VJKT2H.js → chunk-ZWXJBFZU.js} +11 -11
  204. package/dist/chunk-ZWXJBFZU.js.map +1 -0
  205. package/dist/{cli-BpwTNHTm.d.ts → cli-cShQ13XG.d.ts} +5 -5
  206. package/dist/cli.d.ts +13 -13
  207. package/dist/cli.js +89 -86
  208. package/dist/coding/pre-action-gate.d.ts +1 -1
  209. package/dist/coding/pre-action-gate.js +2 -2
  210. package/dist/compounding/engine.d.ts +2 -2
  211. package/dist/compounding/engine.js +20 -18
  212. package/dist/compounding/preference-consolidator.d.ts +1 -1
  213. package/dist/compression-optimizer.d.ts +1 -1
  214. package/dist/config.d.ts +1 -1
  215. package/dist/config.js +6 -1
  216. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  217. package/dist/connectors/codex-materialize-runner.js +19 -17
  218. package/dist/connectors/codex-materialize.d.ts +1 -1
  219. package/dist/connectors/index.d.ts +1 -1
  220. package/dist/connectors/index.js +19 -17
  221. package/dist/consolidation-provenance-check.d.ts +2 -2
  222. package/dist/consolidation-undo.d.ts +2 -2
  223. package/dist/contradiction/index.d.ts +2 -2
  224. package/dist/contradiction/index.js +10 -2
  225. package/dist/converge-config.d.ts +1 -1
  226. package/dist/convergence-refresh.d.ts +2 -2
  227. package/dist/convergence-refresh.js +21 -19
  228. package/dist/conversation-index/backend.d.ts +1 -1
  229. package/dist/conversation-index/chunker.d.ts +1 -1
  230. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  231. package/dist/conversation-index/indexer.d.ts +1 -1
  232. package/dist/conversation-index/search.d.ts +1 -1
  233. package/dist/corpus-watermark.d.ts +1 -1
  234. package/dist/corpus-watermark.js +21 -19
  235. package/dist/cross-lingual-recall.d.ts +70 -0
  236. package/dist/cross-lingual-recall.js +14 -0
  237. package/dist/day-summary.d.ts +1 -1
  238. package/dist/delinearize.d.ts +1 -1
  239. package/dist/dependency-propagation-config.d.ts +1 -1
  240. package/dist/{dependency-propagation-delivery-QYJ1-c2M.d.ts → dependency-propagation-delivery-CsGg-VwS.d.ts} +1 -1
  241. package/dist/direct-answer-wiring.d.ts +1 -1
  242. package/dist/direct-answer.d.ts +1 -1
  243. package/dist/embedding-fallback.d.ts +1 -1
  244. package/dist/enrichment/index.d.ts +1 -1
  245. package/dist/entity-origin-fields.d.ts +1 -1
  246. package/dist/entity-retrieval.d.ts +2 -2
  247. package/dist/entity-retrieval.js +19 -17
  248. package/dist/entity-schema.d.ts +1 -1
  249. package/dist/episodic-context.d.ts +1 -1
  250. package/dist/explicit-capture.d.ts +9 -9
  251. package/dist/explicit-capture.js +7 -6
  252. package/dist/external-wiki-access.d.ts +12 -13
  253. package/dist/external-wiki-access.js +46 -44
  254. package/dist/external-wiki-collection-registration.d.ts +1 -1
  255. package/dist/external-wiki-collection.d.ts +1 -1
  256. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  257. package/dist/extraction-error-classification.d.ts +1 -1
  258. package/dist/extraction-faithfulness.d.ts +1 -1
  259. package/dist/extraction-judge-telemetry.d.ts +1 -1
  260. package/dist/extraction-judge-training.d.ts +1 -1
  261. package/dist/extraction-judge.d.ts +1 -1
  262. package/dist/extraction-judge.js +2 -2
  263. package/dist/extraction-liveness.d.ts +1 -1
  264. package/dist/extraction-normalization.d.ts +1 -1
  265. package/dist/extraction-normalization.js +2 -2
  266. package/dist/extraction-prompt.d.ts +2 -2
  267. package/dist/extraction-prompt.js +1 -1
  268. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  269. package/dist/extraction-source-grounding.d.ts +1 -1
  270. package/dist/extraction.d.ts +1 -1
  271. package/dist/extraction.js +27 -25
  272. package/dist/fallback-llm.d.ts +1 -1
  273. package/dist/graph-dashboard-diff.d.ts +1 -1
  274. package/dist/graph-dashboard-key.d.ts +1 -1
  275. package/dist/graph-dashboard-parser.d.ts +1 -1
  276. package/dist/{graph-edge-decay-A4SDFMMS.js → graph-edge-decay-FXGELBFA.js} +4 -4
  277. package/dist/graph-edge-reinforcement.d.ts +1 -1
  278. package/dist/graph-path-reconstruction.d.ts +1 -1
  279. package/dist/graph-path-scoring.d.ts +1 -1
  280. package/dist/graph-snapshot.d.ts +1 -1
  281. package/dist/graph-snapshot.js +3 -3
  282. package/dist/graph.d.ts +1 -1
  283. package/dist/graph.js +3 -3
  284. package/dist/harmonic-retrieval.js +1 -1
  285. package/dist/importance.d.ts +1 -1
  286. package/dist/importers/index.d.ts +1 -1
  287. package/dist/in-flight-reads.d.ts +1 -1
  288. package/dist/index.d.ts +718 -701
  289. package/dist/index.js +188 -139
  290. package/dist/intent.d.ts +1 -1
  291. package/dist/lcm/engine.d.ts +1 -1
  292. package/dist/lcm/engine.js +4 -4
  293. package/dist/lcm/index.d.ts +1 -1
  294. package/dist/lcm/index.js +10 -10
  295. package/dist/lcm/tools.d.ts +1 -1
  296. package/dist/lifecycle.d.ts +1 -1
  297. package/dist/live-connectors-runner.d.ts +1 -1
  298. package/dist/local-llm.d.ts +1 -1
  299. package/dist/local-llm.js +2 -2
  300. package/dist/local-model-endpoint.d.ts +1 -1
  301. package/dist/maintenance/memory-governance.d.ts +1 -1
  302. package/dist/maintenance/memory-governance.js +19 -17
  303. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  304. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +19 -17
  305. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  306. package/dist/maintenance/rebuild-memory-projection.js +20 -18
  307. package/dist/{maintenance-BjEr3WKG.d.ts → maintenance-jhMpeGne.d.ts} +3 -3
  308. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  309. package/dist/mcp-read-only-tools.js +1 -1
  310. package/dist/memory-action-policy.d.ts +1 -1
  311. package/dist/memory-cache.d.ts +1 -1
  312. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  313. package/dist/memory-projection-store.d.ts +1 -1
  314. package/dist/memory-provenance.d.ts +1 -1
  315. package/dist/memory-snapshot.d.ts +1 -1
  316. package/dist/memory-subject-cli.d.ts +177 -0
  317. package/dist/memory-subject-cli.js +16 -0
  318. package/dist/memory-subject-cli.js.map +1 -0
  319. package/dist/memory-subject.d.ts +128 -0
  320. package/dist/memory-subject.js +44 -0
  321. package/dist/memory-subject.js.map +1 -0
  322. package/dist/memory-worth-outcomes.d.ts +5 -4
  323. package/dist/memory-worth-outcomes.js +1 -1
  324. package/dist/models-json.d.ts +1 -1
  325. package/dist/namespaces/migrate.d.ts +3 -3
  326. package/dist/namespaces/migrate.js +20 -18
  327. package/dist/namespaces/principal.d.ts +1 -1
  328. package/dist/namespaces/search.d.ts +1 -1
  329. package/dist/namespaces/search.js +9 -9
  330. package/dist/namespaces/storage.d.ts +3 -3
  331. package/dist/namespaces/storage.js +19 -17
  332. package/dist/native-knowledge.d.ts +1 -1
  333. package/dist/offline-sync-impression-drain.d.ts +1 -1
  334. package/dist/operator-doctor-corpus.d.ts +1 -1
  335. package/dist/operator-doctor-corpus.js +22 -20
  336. package/dist/operator-doctor-replica.d.ts +1 -1
  337. package/dist/operator-toolkit.d.ts +3 -3
  338. package/dist/operator-toolkit.js +31 -28
  339. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  340. package/dist/orchestration/maintenance.d.ts +4 -4
  341. package/dist/orchestration/maintenance.js +25 -23
  342. package/dist/{orchestrator-CC4USYcD.d.ts → orchestrator-DyGUC7re.d.ts} +8 -8
  343. package/dist/orchestrator.d.ts +9 -9
  344. package/dist/orchestrator.js +120 -116
  345. package/dist/patterns-cli.d.ts +1 -1
  346. package/dist/{pipeline-DWgAgvJN.d.ts → pipeline-C25Oxtp1.d.ts} +1 -1
  347. package/dist/policy-runtime.d.ts +1 -1
  348. package/dist/proactive-contention.d.ts +1 -1
  349. package/dist/provenance.d.ts +1 -1
  350. package/dist/{public-http-CkQC8VpD.d.ts → public-http-CMe7NQzj.d.ts} +1 -1
  351. package/dist/{qmd-BJGhj4ta.d.ts → qmd-DkDVCbgF.d.ts} +1 -1
  352. package/dist/qmd-preflight.d.ts +2 -2
  353. package/dist/qmd-recall-cache.d.ts +1 -1
  354. package/dist/qmd.d.ts +2 -2
  355. package/dist/qmd.js +2 -2
  356. package/dist/recall-concurrency-config.d.ts +1 -1
  357. package/dist/recall-disclosure-escalation.d.ts +1 -1
  358. package/dist/recall-explain-renderer.d.ts +1 -1
  359. package/dist/recall-explain-renderer.js +3 -3
  360. package/dist/recall-memory-map.d.ts +1 -1
  361. package/dist/recall-planner-llm.d.ts +1 -1
  362. package/dist/recall-state.d.ts +1 -1
  363. package/dist/recall-tag-filter.d.ts +1 -1
  364. package/dist/recall-timings.d.ts +1 -1
  365. package/dist/recall-xray-cli.d.ts +1 -1
  366. package/dist/recall-xray-cli.js +4 -4
  367. package/dist/recall-xray-renderer.d.ts +1 -1
  368. package/dist/recall-xray-renderer.js +3 -3
  369. package/dist/recall-xray.d.ts +1 -1
  370. package/dist/recall-xray.js +2 -2
  371. package/dist/reconcile/cursor.d.ts +1 -1
  372. package/dist/reconcile/manifest.d.ts +1 -1
  373. package/dist/reconcile/manifest.js +3 -3
  374. package/dist/reconcile/plan.d.ts +1 -1
  375. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  376. package/dist/replay/normalizers/claude.d.ts +1 -1
  377. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  378. package/dist/replay/normalizers/shared.d.ts +1 -1
  379. package/dist/replay/runner.d.ts +1 -1
  380. package/dist/replay/types.d.ts +1 -1
  381. package/dist/replica-divergence.d.ts +1 -1
  382. package/dist/replica-peers-config.d.ts +1 -1
  383. package/dist/{resolution-DKMBPXHI.js → resolution-MFY72STR.js} +11 -3
  384. package/dist/resolution-MFY72STR.js.map +1 -0
  385. package/dist/resolve-auth-token.d.ts +1 -1
  386. package/dist/resume-bundles.js +7 -2
  387. package/dist/retrieval-agents.d.ts +2 -2
  388. package/dist/retrieval-tiers.d.ts +1 -1
  389. package/dist/routing/engine.d.ts +1 -1
  390. package/dist/routing/store.d.ts +1 -1
  391. package/dist/salvage-envelope.d.ts +1 -1
  392. package/dist/salvage-envelope.js +10 -2
  393. package/dist/schemas.d.ts +122 -108
  394. package/dist/schemas.js +1 -1
  395. package/dist/{scope-profiles-C4PdBYKc.d.ts → scope-profiles-B9xMoFO-.d.ts} +1 -1
  396. package/dist/search/embed-helper.d.ts +1 -1
  397. package/dist/search/factory.d.ts +1 -1
  398. package/dist/search/factory.js +8 -8
  399. package/dist/search/index.d.ts +1 -1
  400. package/dist/search/index.js +14 -14
  401. package/dist/search/lancedb-backend.d.ts +1 -1
  402. package/dist/search/lancedb-backend.js +2 -2
  403. package/dist/search/meilisearch-backend.d.ts +1 -1
  404. package/dist/search/meilisearch-backend.js +2 -2
  405. package/dist/search/noop-backend.d.ts +1 -1
  406. package/dist/search/orama-backend.d.ts +1 -1
  407. package/dist/search/orama-backend.js +2 -2
  408. package/dist/search/port.d.ts +2 -2
  409. package/dist/search/port.js +1 -1
  410. package/dist/search/remote-backend.d.ts +1 -1
  411. package/dist/search/remote-backend.js +2 -2
  412. package/dist/{semantic-consolidation-5-HOmIhL.d.ts → semantic-consolidation-C4uykW84.d.ts} +1 -1
  413. package/dist/semantic-consolidation.d.ts +2 -2
  414. package/dist/semantic-consolidation.js +20 -18
  415. package/dist/semantic-rule-promotion.js +19 -17
  416. package/dist/semantic-rule-verifier.d.ts +1 -1
  417. package/dist/semantic-rule-verifier.js +19 -17
  418. package/dist/{service-8pDy6w8u.d.ts → service-DCZDZNcV.d.ts} +2 -2
  419. package/dist/session-observer-bands.d.ts +1 -1
  420. package/dist/session-observer-state.d.ts +1 -1
  421. package/dist/shared-context/manager.d.ts +11 -11
  422. package/dist/signal.d.ts +1 -1
  423. package/dist/source-agent-qualifier.d.ts +1 -1
  424. package/dist/source-agent-qualifier.js +21 -19
  425. package/dist/{storage-VpDzURiA.d.ts → storage-CcKmEjL8.d.ts} +3 -2
  426. package/dist/storage.d.ts +2 -2
  427. package/dist/storage.js +21 -19
  428. package/dist/subject-config.d.ts +38 -0
  429. package/dist/subject-config.js +20 -0
  430. package/dist/subject-config.js.map +1 -0
  431. package/dist/summarizer.d.ts +1 -1
  432. package/dist/summarizer.js +3 -3
  433. package/dist/summary-snapshot.d.ts +1 -1
  434. package/dist/support-passport/index.d.ts +14 -14
  435. package/dist/support-passport/index.js +48 -46
  436. package/dist/temporal-supersession.d.ts +2 -2
  437. package/dist/temporal-timeline-recall.d.ts +1 -1
  438. package/dist/temporal-validity.d.ts +1 -1
  439. package/dist/threading.d.ts +1 -1
  440. package/dist/tier-migration.d.ts +2 -2
  441. package/dist/tier-routing.d.ts +1 -1
  442. package/dist/topics.d.ts +1 -1
  443. package/dist/transcript.d.ts +1 -1
  444. package/dist/transfer/backup.js +2 -2
  445. package/dist/transfer/capsule-export.js +2 -2
  446. package/dist/transfer/capsule-import.js +2 -2
  447. package/dist/transfer/types.d.ts +66 -66
  448. package/dist/trust-score-stage.d.ts +1 -1
  449. package/dist/trust-score.d.ts +1 -1
  450. package/dist/{types-D9gKdB79.d.ts → types-Pi0lfaEt.d.ts} +40 -29
  451. package/dist/types.d.ts +1 -1
  452. package/dist/types.js +1 -1
  453. package/dist/utility-runtime.d.ts +1 -1
  454. package/dist/verified-recall.js +19 -17
  455. package/dist/who-knows-cli.d.ts +11 -11
  456. package/dist/who-knows-cli.js +20 -18
  457. package/dist/who-knows.d.ts +11 -11
  458. package/dist/who-knows.js +19 -17
  459. package/dist/write-envelope.d.ts +5 -2
  460. package/dist/write-envelope.js +10 -1
  461. package/package.json +2 -2
  462. package/scripts/build-with-heap.mjs +1 -1
  463. package/src/access-boundary.ts +2 -0
  464. package/src/access-mcp-admin-tools.ts +14 -0
  465. package/src/access-mcp-output-schemas.ts +6 -0
  466. package/src/access-mcp.ts +6 -6
  467. package/src/access-operations-batch.ts +8 -0
  468. package/src/access-service.ts +85 -0
  469. package/src/access-surface-catalog.ts +2 -0
  470. package/src/config.ts +10 -17
  471. package/src/cross-lingual-recall.test.ts +47 -0
  472. package/src/cross-lingual-recall.ts +186 -0
  473. package/src/extraction-prompt.ts +1 -0
  474. package/src/extraction.ts +4 -1
  475. package/src/index.ts +5 -6
  476. package/src/mcp-read-only-tools.ts +1 -0
  477. package/src/memory-subject-cli.ts +135 -0
  478. package/src/memory-subject.test.ts +48 -0
  479. package/src/memory-subject.ts +314 -0
  480. package/src/memory-worth-outcomes.test.ts +6 -2
  481. package/src/memory-worth-outcomes.ts +11 -7
  482. package/src/operator-toolkit.ts +1 -1
  483. package/src/orchestration/extraction-persist.ts +48 -48
  484. package/src/orchestration/recall-internal-deps.ts +2 -0
  485. package/src/orchestration/recall-internal.ts +41 -38
  486. package/src/orchestration/recall-search-pipeline.ts +16 -0
  487. package/src/procedural/library-maintenance.test.ts +582 -0
  488. package/src/procedural/library-maintenance.ts +546 -0
  489. package/src/procedural/maintenance-config.ts +78 -0
  490. package/src/procedural/procedure-recall.ts +29 -1
  491. package/src/procedural/procedure-stats.ts +20 -0
  492. package/src/schemas.ts +7 -0
  493. package/src/search/port.ts +2 -1
  494. package/src/spaces/index.ts +38 -2
  495. package/src/storage.ts +11 -3
  496. package/src/subject-config.ts +80 -0
  497. package/src/types.ts +28 -29
  498. package/src/write-envelope.test.ts +14 -0
  499. package/src/write-envelope.ts +24 -3
  500. package/dist/chunk-4NZHHGVL.js.map +0 -1
  501. package/dist/chunk-A4VJKT2H.js.map +0 -1
  502. package/dist/chunk-EIR5VLIH.js.map +0 -1
  503. package/dist/chunk-GEULB2VI.js.map +0 -1
  504. package/dist/chunk-HDD4RRIX.js.map +0 -1
  505. package/dist/chunk-JG22O53B.js.map +0 -1
  506. package/dist/chunk-LCU5R6TQ.js.map +0 -1
  507. package/dist/chunk-MSTNSVXI.js.map +0 -1
  508. package/dist/chunk-RQYV6M2T.js.map +0 -1
  509. package/dist/chunk-UPIKAT5A.js.map +0 -1
  510. package/dist/chunk-URS5GSM7.js.map +0 -1
  511. package/dist/chunk-VRYEXPRX.js.map +0 -1
  512. package/dist/chunk-XBRGJJK7.js.map +0 -1
  513. package/dist/chunk-YHSNAGN3.js.map +0 -1
  514. package/dist/chunk-YQ3CBLL4.js.map +0 -1
  515. package/dist/chunk-ZAI5R6DW.js.map +0 -1
  516. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  517. /package/dist/{chunk-A6LBDIFS.js.map → chunk-2E36UXVW.js.map} +0 -0
  518. /package/dist/{chunk-RRJUMSFX.js.map → chunk-2XDWWPTN.js.map} +0 -0
  519. /package/dist/{chunk-QCNB4BRE.js.map → chunk-2YI72KM3.js.map} +0 -0
  520. /package/dist/{chunk-3YTTAGPB.js.map → chunk-3DVBKTSO.js.map} +0 -0
  521. /package/dist/{chunk-IFK3PVM7.js.map → chunk-3I7ASZN3.js.map} +0 -0
  522. /package/dist/{chunk-HBKFYXBA.js.map → chunk-4KYOLI6M.js.map} +0 -0
  523. /package/dist/{chunk-RNKNL5GQ.js.map → chunk-5NM4OH4P.js.map} +0 -0
  524. /package/dist/{chunk-CESQ4CMC.js.map → chunk-5YQ63T4B.js.map} +0 -0
  525. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-6433HV72.js.map} +0 -0
  526. /package/dist/{chunk-NS5ETDYD.js.map → chunk-7BEPVIH3.js.map} +0 -0
  527. /package/dist/{chunk-SHQFYZTD.js.map → chunk-7YQ4IYS2.js.map} +0 -0
  528. /package/dist/{chunk-YMOPYG3K.js.map → chunk-BIJAWZYW.js.map} +0 -0
  529. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  530. /package/dist/{chunk-VYEPACWY.js.map → chunk-C24UZSFW.js.map} +0 -0
  531. /package/dist/{chunk-ZPN7W3OP.js.map → chunk-CDUUDBWJ.js.map} +0 -0
  532. /package/dist/{chunk-K7JMKLKV.js.map → chunk-CT56C22C.js.map} +0 -0
  533. /package/dist/{chunk-KWIGDKM2.js.map → chunk-D2YNNDML.js.map} +0 -0
  534. /package/dist/{chunk-ZFBZ4QTS.js.map → chunk-DJZWNKFO.js.map} +0 -0
  535. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  536. /package/dist/{chunk-VNIETTMR.js.map → chunk-DZUJ46DO.js.map} +0 -0
  537. /package/dist/{chunk-T6QMNVMO.js.map → chunk-EILZG5VC.js.map} +0 -0
  538. /package/dist/{chunk-652S5A5D.js.map → chunk-EUYWQ7TS.js.map} +0 -0
  539. /package/dist/{chunk-YIZRTHHF.js.map → chunk-GDFVPUJ5.js.map} +0 -0
  540. /package/dist/{chunk-ML3U4KPR.js.map → chunk-GIC6BASP.js.map} +0 -0
  541. /package/dist/{chunk-7PWWGYGO.js.map → chunk-GNCCUR6K.js.map} +0 -0
  542. /package/dist/{chunk-Y5UT73VZ.js.map → chunk-IID2CMUU.js.map} +0 -0
  543. /package/dist/{chunk-MB6GLPRY.js.map → chunk-IVKIODHO.js.map} +0 -0
  544. /package/dist/{chunk-UYCIS6V5.js.map → chunk-JCWY73FK.js.map} +0 -0
  545. /package/dist/{chunk-WHA6ISFX.js.map → chunk-JYYBA7TF.js.map} +0 -0
  546. /package/dist/{chunk-T42L3S6A.js.map → chunk-LBWQ65SX.js.map} +0 -0
  547. /package/dist/{chunk-JXMXTV6C.js.map → chunk-LGO6A7GJ.js.map} +0 -0
  548. /package/dist/{chunk-H6B6GPVH.js.map → chunk-LZH5FR2W.js.map} +0 -0
  549. /package/dist/{chunk-5HERQ5FX.js.map → chunk-M4AHBM72.js.map} +0 -0
  550. /package/dist/{chunk-GOGHZVY3.js.map → chunk-MN4KB2A4.js.map} +0 -0
  551. /package/dist/{chunk-OQIRBGUU.js.map → chunk-N37X5RU7.js.map} +0 -0
  552. /package/dist/{chunk-E6EQTCOQ.js.map → chunk-NKKD4ZAU.js.map} +0 -0
  553. /package/dist/{chunk-VANZKHTN.js.map → chunk-NNBZS3DY.js.map} +0 -0
  554. /package/dist/{chunk-IWUN4RZL.js.map → chunk-NTWN6HB2.js.map} +0 -0
  555. /package/dist/{chunk-2PSX5BJU.js.map → chunk-NZPFCP5A.js.map} +0 -0
  556. /package/dist/{chunk-U56TGYVS.js.map → chunk-OCZIYAE5.js.map} +0 -0
  557. /package/dist/{chunk-I2HTKOOP.js.map → chunk-ODZG724P.js.map} +0 -0
  558. /package/dist/{chunk-LTBKKSCX.js.map → chunk-OLBZ2WGG.js.map} +0 -0
  559. /package/dist/{chunk-GQ5OJVTM.js.map → chunk-OTHZWLUD.js.map} +0 -0
  560. /package/dist/{chunk-PD66CVSD.js.map → chunk-OUKBMQ2O.js.map} +0 -0
  561. /package/dist/{chunk-4E6IJCLC.js.map → chunk-PE255F4T.js.map} +0 -0
  562. /package/dist/{chunk-GPFZFCRN.js.map → chunk-PP7R754B.js.map} +0 -0
  563. /package/dist/{chunk-PHX3ET3C.js.map → chunk-QOS5LBZN.js.map} +0 -0
  564. /package/dist/{chunk-G72IPMR7.js.map → chunk-R4OCGPSH.js.map} +0 -0
  565. /package/dist/{chunk-VUP47UJI.js.map → chunk-R7JAM2XF.js.map} +0 -0
  566. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  567. /package/dist/{chunk-P4CQCL27.js.map → chunk-S2DPMJXH.js.map} +0 -0
  568. /package/dist/{chunk-OXL5QKTV.js.map → chunk-SIHSCCUQ.js.map} +0 -0
  569. /package/dist/{chunk-KLPVXLQJ.js.map → chunk-SPUJNJJC.js.map} +0 -0
  570. /package/dist/{chunk-CCP6LXQJ.js.map → chunk-SQI57UCJ.js.map} +0 -0
  571. /package/dist/{chunk-UIYYS2YI.js.map → chunk-SVSRPG6M.js.map} +0 -0
  572. /package/dist/{chunk-RNORDDD6.js.map → chunk-THG4GYIE.js.map} +0 -0
  573. /package/dist/{chunk-CUIAHZPZ.js.map → chunk-TR7DGXGI.js.map} +0 -0
  574. /package/dist/{chunk-PDKBKBC2.js.map → chunk-UIN2BWDD.js.map} +0 -0
  575. /package/dist/{chunk-4GD7YV4Y.js.map → chunk-UXO5IMBK.js.map} +0 -0
  576. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  577. /package/dist/{chunk-MUJ4QFUQ.js.map → chunk-W4BMEGQA.js.map} +0 -0
  578. /package/dist/{chunk-5HK3CJAR.js.map → chunk-W675UJCZ.js.map} +0 -0
  579. /package/dist/{chunk-MDVBCPOS.js.map → chunk-XCTXS7VY.js.map} +0 -0
  580. /package/dist/{chunk-NTERJOFA.js.map → chunk-XRYZRW54.js.map} +0 -0
  581. /package/dist/{chunk-LA2MSK23.js.map → chunk-Y7DK7HHJ.js.map} +0 -0
  582. /package/dist/{chunk-34BMUGRA.js.map → chunk-YB42WZCY.js.map} +0 -0
  583. /package/dist/{chunk-LWVG6U7L.js.map → chunk-YHCBJULX.js.map} +0 -0
  584. /package/dist/{chunk-VYISFWVX.js.map → chunk-YQNNHLCG.js.map} +0 -0
  585. /package/dist/{chunk-FFPBTNLC.js.map → chunk-Z7PBQPJ4.js.map} +0 -0
  586. /package/dist/{chunk-MXJU4GCA.js.map → chunk-ZO6AXLEH.js.map} +0 -0
  587. /package/dist/{chunk-JNSLW2O4.js.map → chunk-ZQHI2BZB.js.map} +0 -0
  588. /package/dist/{graph-edge-decay-A4SDFMMS.js.map → cross-lingual-recall.js.map} +0 -0
  589. /package/dist/{resolution-DKMBPXHI.js.map → graph-edge-decay-FXGELBFA.js.map} +0 -0
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Cross-lingual recall planner (issue #2197).
3
+ *
4
+ * Lexical tiers (BM25/FTS) match on shared surface tokens, so a query whose
5
+ * dominant script differs from the corpus's cannot retrieve lexically — an
6
+ * English query never token-overlaps a Japanese fact. When the planner
7
+ * detects that mismatch it leans on the vector tier (the embedding-fallback
8
+ * supplement in the recall search pipeline), and when NO vector tier exists
9
+ * it emits a {@link SearchDegradation} so "no results" stays distinguishable
10
+ * from "cross-script query, vectors unavailable" (rule 34).
11
+ *
12
+ * The write-time half is a dominant-script hint stamped into frontmatter
13
+ * `language` by `StorageManager.writeMemory` (ISO 15924 script codes);
14
+ * legacy files without the field simply do not vote for the corpus script.
15
+ */
16
+
17
+ import type { MemoryFile } from "./types.js";
18
+ import type { SearchDegradation } from "./search/port.js";
19
+
20
+ type CorpusLanguageStorage = {
21
+ dir: string;
22
+ readAllMemories: () => Promise<MemoryFile[]>;
23
+ getCorpusScanVersion: () => string;
24
+ };
25
+
26
+ /** Script classes the cheap detector can distinguish. ISO 15924 codes. */
27
+ export type LanguageHint =
28
+ | "latn"
29
+ | "jpan"
30
+ | "kore"
31
+ | "hani"
32
+ | "cyrl"
33
+ | "grek"
34
+ | "arab"
35
+ | "hebr"
36
+ | "thai"
37
+ | "deva";
38
+
39
+ /** Inclusive codepoint ranges per script class. `kana` folds into `jpan` at detection. */
40
+ const SCRIPT_RANGES: ReadonlyArray<readonly [LanguageHint | "kana", number, number]> = [
41
+ ["latn", 0x41, 0x5a],
42
+ ["latn", 0x61, 0x7a],
43
+ ["latn", 0xc0, 0x24f],
44
+ ["grek", 0x370, 0x3ff],
45
+ ["cyrl", 0x400, 0x4ff],
46
+ ["cyrl", 0x500, 0x52f],
47
+ ["hebr", 0x590, 0x5ff],
48
+ ["arab", 0x600, 0x6ff],
49
+ ["arab", 0x750, 0x77f],
50
+ ["deva", 0x900, 0x97f],
51
+ ["thai", 0xe00, 0xe7f],
52
+ ["kore", 0x1100, 0x11ff],
53
+ ["latn", 0x1e00, 0x1eff],
54
+ ["kana", 0x3040, 0x309f],
55
+ ["kana", 0x30a0, 0x30ff],
56
+ ["kana", 0x31f0, 0x31ff],
57
+ ["hani", 0x3400, 0x4dbf],
58
+ ["hani", 0x4e00, 0x9fff],
59
+ ["kore", 0xac00, 0xd7a3],
60
+ ["kana", 0xff66, 0xff9d],
61
+ ];
62
+
63
+ /**
64
+ * Dominant-script hint for a text. Codepoint-range counting (no regex):
65
+ * kana anywhere maps to `jpan` — kana is unique to Japanese and disambiguates
66
+ * it from `hani` (Chinese, or kanji-only Japanese). Returns `undefined` when
67
+ * the text contains no lettered script class.
68
+ */
69
+ export function detectLanguageHint(text: string): LanguageHint | undefined {
70
+ const counts = new Map<LanguageHint | "kana", number>();
71
+ for (let i = 0; i < text.length; i += 1) {
72
+ const code = text.charCodeAt(i);
73
+ for (const [script, low, high] of SCRIPT_RANGES) {
74
+ if (code < low) break;
75
+ if (code <= high) {
76
+ counts.set(script, (counts.get(script) ?? 0) + 1);
77
+ break;
78
+ }
79
+ }
80
+ }
81
+ // SCRIPT_RANGES is sorted by start codepoint, so `break` on the first
82
+ // range starting past the codepoint is exact — one range test per char.
83
+ if (counts.has("kana")) return "jpan";
84
+ let best: LanguageHint | undefined;
85
+ let bestCount = 0;
86
+ for (const [script, count] of counts) {
87
+ if (script === "kana") continue;
88
+ if (count > bestCount) {
89
+ best = script;
90
+ bestCount = count;
91
+ }
92
+ }
93
+ return best;
94
+ }
95
+
96
+ /** Dominant hint over a corpus sample; `undefined` entries (legacy files) never vote. */
97
+ export function corpusDominantLanguage(
98
+ hints: Iterable<string | undefined>,
99
+ ): LanguageHint | undefined {
100
+ const counts = new Map<string, number>();
101
+ for (const hint of hints) {
102
+ if (hint === undefined || hint === "") continue;
103
+ counts.set(hint, (counts.get(hint) ?? 0) + 1);
104
+ }
105
+ let best: string | undefined;
106
+ let bestCount = 0;
107
+ for (const [hint, count] of counts) {
108
+ if (count > bestCount) {
109
+ best = hint;
110
+ bestCount = count;
111
+ }
112
+ }
113
+ return best as LanguageHint | undefined;
114
+ }
115
+
116
+ /** Planner decision for one recall query. */
117
+ export interface CrossScriptPlan {
118
+ queryLanguage: LanguageHint | undefined;
119
+ corpusLanguage: LanguageHint | undefined;
120
+ /** True when both hints resolved and differ — lexical tiers cannot serve this query. */
121
+ crossScript: boolean;
122
+ /** Emitted when `crossScript` is true and no vector tier can compensate. */
123
+ degradation?: SearchDegradation;
124
+ }
125
+
126
+ /**
127
+ * Pure planner core: compare query/corpus hints and, on a mismatch without a
128
+ * vector tier, build the visible degradation signal.
129
+ */
130
+ export function planCrossScript(input: {
131
+ queryLanguage: LanguageHint | undefined;
132
+ corpusLanguage: LanguageHint | undefined;
133
+ vectorTierAvailable: boolean;
134
+ }): CrossScriptPlan {
135
+ const crossScript =
136
+ input.queryLanguage !== undefined &&
137
+ input.corpusLanguage !== undefined &&
138
+ input.queryLanguage !== input.corpusLanguage;
139
+ return {
140
+ queryLanguage: input.queryLanguage,
141
+ corpusLanguage: input.corpusLanguage,
142
+ crossScript,
143
+ degradation:
144
+ crossScript && !input.vectorTierAvailable
145
+ ? {
146
+ backend: "qmd",
147
+ code: "vector_tier_unavailable",
148
+ detail:
149
+ `cross-script query (${input.queryLanguage}) over a ${input.corpusLanguage} corpus: ` +
150
+ "lexical recall cannot match across scripts — enable a multilingual embedding model " +
151
+ "(embedding fallback) so the vector tier can serve it",
152
+ }
153
+ : undefined,
154
+ };
155
+ }
156
+
157
+ /** Corpus sample cap: dominant script stabilizes well below the full corpus. */
158
+ const CORPUS_SAMPLE_CAP = 500;
159
+
160
+ /** Memoized dominant corpus language per storage dir, keyed by corpus scan version. */
161
+ const corpusLanguageCache = new Map<string, { version: string; language: LanguageHint | undefined }>();
162
+
163
+ /**
164
+ * Dominant corpus language for a storage manager, sampled from the newest
165
+ * frontmatter `language` hints (capped, memoized on the corpus scan version so
166
+ * recurring recalls pay one pass per corpus generation, not per query).
167
+ * Read failures degrade to `undefined` — never break recall.
168
+ */
169
+ export async function dominantCorpusLanguage(
170
+ storage: CorpusLanguageStorage,
171
+ ): Promise<LanguageHint | undefined> {
172
+ try {
173
+ const version = storage.getCorpusScanVersion();
174
+ const cached = corpusLanguageCache.get(storage.dir);
175
+ if (cached?.version === version) return cached.language;
176
+ const memories = await storage.readAllMemories();
177
+ const language = corpusDominantLanguage(
178
+ memories.slice(0, CORPUS_SAMPLE_CAP).map((memory: MemoryFile) => memory.frontmatter.language),
179
+ );
180
+ if (corpusLanguageCache.size > 8) corpusLanguageCache.clear();
181
+ corpusLanguageCache.set(storage.dir, { version, language });
182
+ return language;
183
+ } catch {
184
+ return undefined;
185
+ }
186
+ }
@@ -22,6 +22,7 @@ export const EXTRACTION_RESPONSE_SHAPE = `{
22
22
  "promptedByQuestion": "<optional source-grounded question>",
23
23
  "quote": "<optional exact contiguous source span>",
24
24
  "scope": "<optional project-or-global>",
25
+ "subject": "<optional user-or-agent>",
25
26
  "structuredAttributes": {"<key>": "<value>"},
26
27
  "procedureSteps": [{"order": 1, "intent": "<step>"}, {"order": 2, "intent": "<step>"}],
27
28
  "reasoningTrace": {
package/src/extraction.ts CHANGED
@@ -312,6 +312,8 @@ export class ExtractionEngine {
312
312
  promptedByQuestion: extractionText(f.promptedByQuestion),
313
313
  scope:
314
314
  f.scope === "global" || f.scope === "project" ? f.scope : undefined,
315
+ subject:
316
+ f.subject === "user" || f.subject === "agent" ? f.subject : undefined,
315
317
  structuredAttributes: extractionAttributes(f.structuredAttributes),
316
318
  procedureSteps,
317
319
  reasoningTrace,
@@ -1425,7 +1427,8 @@ Rules:
1425
1427
  - ${OUTPUT_LANGUAGE_POLICY}
1426
1428
  ${CUE_ANCHOR_PROMPT_INSTRUCTION}\n- Include at most five durable relationships.${this.config.provenance?.enabled ? `
1427
1429
  - Each fact must include a quote copied verbatim from one contiguous conversation span.` : ""}${lifecycleCaps.extractionScopeClassification ? `
1428
- - Set each fact scope to "global" for cross-project knowledge or "project" for codebase-specific knowledge. Tool, command, or CLI-flag instructions tied to one agent are "project" (the same tool name can mean different things across agents); when keeping one, begin the fact with a leading "In <agent>," clause naming that agent.` : ""}${ambientCapture ? AMBIENT_CAPTURE_PROMPT_SECTION_COMPACT : ""}
1430
+ - Set each fact scope to "global" for cross-project knowledge or "project" for codebase-specific knowledge. Tool, command, or CLI-flag instructions tied to one agent are "project" (the same tool name can mean different things across agents); when keeping one, begin the fact with a leading "In <agent>," clause naming that agent.` : ""}${this.config.subjectClassification?.enabled === true ? `
1431
+ - Set each fact subject to "user" when it models the person (preferences, relationships, biography, moments, commitments about their life) or "agent" when it is reusable operating knowledge (procedures, principles, tool-usage lessons, debugging strategies, environment facts with no personal content).` : ""}${ambientCapture ? AMBIENT_CAPTURE_PROMPT_SECTION_COMPACT : ""}
1429
1432
  ${eventTimePromptInstruction(this.config)}
1430
1433
  Return only valid JSON matching this shape. Placeholder text describes field shape only and is never source evidence:
1431
1434
  ${EXTRACTION_RESPONSE_SHAPE}
package/src/index.ts CHANGED
@@ -229,7 +229,7 @@ export type {
229
229
  ProcedureStatsConfigSnapshot,
230
230
  ProcedureStatsRecent,
231
231
  } from "./procedural/procedure-stats.js";
232
-
232
+ export { runProcedureLibraryMaintenance, type ProcedureLibraryMaintenanceReport, type ProcedureMaintenanceAction, type ProcedureMaintenanceActionKind, type ProcedureMaintenanceReasonCode, type ProcedureMaintenanceEvidence, type ProcedureMaintenanceMarker } from "./procedural/library-maintenance.js";
233
233
  // ---------------------------------------------------------------------------
234
234
  // Direct-answer retrieval tier (issue #518)
235
235
  // ---------------------------------------------------------------------------
@@ -493,14 +493,13 @@ export {
493
493
  type RecallXrayFormat,
494
494
  } from "./recall-xray-renderer.js";
495
495
  export type {
496
- RecallXraySnapshot,
497
- RecallXrayResult,
498
- RecallXrayScoreDecomposition,
499
- RecallXrayServedBy,
500
- RecallFilterTrace,
496
+ RecallXraySnapshot, RecallXrayResult, RecallXrayScoreDecomposition, RecallXrayServedBy, RecallFilterTrace,
501
497
  } from "./recall-xray.js";
502
498
  export * from "./who-knows.js";
503
499
  export * from "./who-knows-cli.js";
500
+ export * from "./memory-subject.js";
501
+ export * from "./memory-subject-cli.js";
502
+ export * from "./subject-config.js";
504
503
 
505
504
  // ChatGPT Apps-compatible memory inspector demo.
506
505
  export {
@@ -17,6 +17,7 @@ export const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {
17
17
  recall_tier_explain: true,
18
18
  recall_xray: true,
19
19
  who_knows: true,
20
+ promotion_candidates: true,
20
21
  briefing: true,
21
22
  wearables_status: true,
22
23
  transcript_day: true,
@@ -0,0 +1,135 @@
1
+ /**
2
+ * CLI surface for memory-subject operations (issue #2372).
3
+ *
4
+ * `remnic promotion-candidates` — read-only surfacing of agent-subject,
5
+ * reuse-signaled promotion candidates. `remnic subjects backfill` — the
6
+ * deterministic shadow/apply stamp for unstamped memories. Runners take an
7
+ * io seam (service/storage callbacks + stdout) so tests drive them without
8
+ * booting an orchestrator; the remnic-cli entry supplies the real ones.
9
+ */
10
+
11
+ import type {
12
+ PromotionCandidatesResult,
13
+ SubjectBackfillReport,
14
+ } from "./memory-subject.js";
15
+
16
+ export interface PromotionCandidatesCliOptions {
17
+ namespace?: string;
18
+ targetNamespace?: string;
19
+ limit: number;
20
+ json: boolean;
21
+ }
22
+
23
+ export function parsePromotionCandidatesCliOptions(args: {
24
+ namespace?: string;
25
+ targetNamespace?: string;
26
+ limit?: string;
27
+ json?: boolean;
28
+ }): PromotionCandidatesCliOptions {
29
+ let limit = 20;
30
+ if (args.limit !== undefined) {
31
+ const parsed = Number(args.limit);
32
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {
33
+ throw new Error(
34
+ `promotion-candidates: --limit expects an integer in [1, 100] (got ${JSON.stringify(args.limit)})`,
35
+ );
36
+ }
37
+ limit = parsed;
38
+ }
39
+ return {
40
+ ...(args.namespace !== undefined && args.namespace !== "" ? { namespace: args.namespace } : {}),
41
+ ...(args.targetNamespace !== undefined && args.targetNamespace !== ""
42
+ ? { targetNamespace: args.targetNamespace }
43
+ : {}),
44
+ limit,
45
+ json: args.json === true,
46
+ };
47
+ }
48
+
49
+ export function renderPromotionCandidates(result: PromotionCandidatesResult, json: boolean): string {
50
+ if (json) return JSON.stringify(result, null, 2);
51
+ const lines = [
52
+ `Namespace: ${result.namespace} Target layer: ${result.targetNamespace} (minAccessCount ${result.minAccessCount})`,
53
+ ];
54
+ if (result.candidates.length === 0) {
55
+ lines.push("No promotion candidates.");
56
+ return lines.join("\n");
57
+ }
58
+ for (const c of result.candidates) {
59
+ lines.push(
60
+ `- ${c.id} [${c.category}] signal=${c.reuseSignal} access=${c.accessCount} reinforced=${c.reinforcementCount} mw=${c.mwSuccess}/${c.mwFail}`,
61
+ );
62
+ lines.push(` ${c.content.replace(/\s+/g, " ").slice(0, 100)}`);
63
+ }
64
+ lines.push("Promote explicitly with the existing promotion commands; nothing is auto-promoted.");
65
+ return lines.join("\n");
66
+ }
67
+
68
+ export async function runPromotionCandidatesCommand(
69
+ rest: string[],
70
+ io: {
71
+ promotionCandidates: (request: {
72
+ namespace?: string;
73
+ targetNamespace?: string;
74
+ limit?: number;
75
+ }) => Promise<PromotionCandidatesResult>;
76
+ stdout: (line: string) => void;
77
+ },
78
+ ): Promise<void> {
79
+ const flag = (name: string): string | undefined => {
80
+ const hit = rest.find((a) => a.startsWith(`--${name}=`));
81
+ return hit === undefined ? undefined : hit.slice(name.length + 3);
82
+ };
83
+ const options = parsePromotionCandidatesCliOptions({
84
+ namespace: flag("namespace"),
85
+ targetNamespace: flag("target-namespace"),
86
+ limit: flag("limit"),
87
+ json: rest.includes("--json"),
88
+ });
89
+ const result = await io.promotionCandidates({
90
+ ...(options.namespace !== undefined ? { namespace: options.namespace } : {}),
91
+ ...(options.targetNamespace !== undefined ? { targetNamespace: options.targetNamespace } : {}),
92
+ limit: options.limit,
93
+ });
94
+ io.stdout(renderPromotionCandidates(result, options.json));
95
+ }
96
+
97
+ export interface SubjectsBackfillCliOptions {
98
+ mode: "shadow" | "apply";
99
+ namespace?: string;
100
+ }
101
+
102
+ export function parseSubjectsBackfillCliOptions(args: {
103
+ apply?: boolean;
104
+ namespace?: string;
105
+ }): SubjectsBackfillCliOptions {
106
+ return {
107
+ mode: args.apply === true ? "apply" : "shadow",
108
+ ...(args.namespace !== undefined && args.namespace !== "" ? { namespace: args.namespace } : {}),
109
+ };
110
+ }
111
+
112
+ export async function runSubjectsBackfillCommand(
113
+ rest: string[],
114
+ io: {
115
+ backfill: (options: { mode: "shadow" | "apply"; namespace?: string }) => Promise<SubjectBackfillReport>;
116
+ stdout: (line: string) => void;
117
+ },
118
+ ): Promise<void> {
119
+ const namespaceFlag = rest.find((a) => a.startsWith("--namespace="))?.slice("--namespace=".length);
120
+ const options = parseSubjectsBackfillCliOptions({
121
+ apply: rest.includes("--apply"),
122
+ namespace: namespaceFlag,
123
+ });
124
+ const report = await io.backfill(options);
125
+ const lines = [
126
+ `Mode: ${report.mode} Scanned: ${report.scanned} Already stamped: ${report.alreadyStamped} To stamp: ${report.stamped}`,
127
+ ];
128
+ for (const stamp of report.stamps) {
129
+ lines.push(`- ${stamp.id} [${stamp.category}] → subject: ${stamp.subject}`);
130
+ }
131
+ if (report.mode === "shadow") {
132
+ lines.push("Shadow run — nothing written. Re-run with --apply to stamp.");
133
+ }
134
+ io.stdout(lines.join("\n"));
135
+ }
@@ -0,0 +1,48 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import {
5
+ evaluateSubjectGuard,
6
+ resolveWriteSubject,
7
+ SUBJECT_GUARD_OVERRIDE_FLAG,
8
+ } from "./memory-subject.js";
9
+ import { parseSubjectRuntimeConfig } from "./subject-config.js";
10
+
11
+ test("category defaults: procedure is agent, preference is user, unknown is user", () => {
12
+ assert.equal(resolveWriteSubject("procedure", undefined), "agent");
13
+ assert.equal(resolveWriteSubject("preference", undefined), "user");
14
+ assert.equal(resolveWriteSubject("fact", undefined), "user");
15
+ assert.equal(resolveWriteSubject("procedure", "user"), "user");
16
+ });
17
+
18
+ test("shared-layer guard: missing subject fails closed as user", () => {
19
+ const warn = evaluateSubjectGuard({
20
+ subject: undefined,
21
+ sharedTarget: true,
22
+ mode: "warn",
23
+ });
24
+ assert.equal(warn.action, "warn");
25
+ assert.equal(warn.effectiveSubject, "user");
26
+ assert.ok(warn.reason.includes(SUBJECT_GUARD_OVERRIDE_FLAG));
27
+
28
+ const reject = evaluateSubjectGuard({
29
+ subject: "user",
30
+ sharedTarget: true,
31
+ mode: "enforce",
32
+ });
33
+ assert.equal(reject.action, "reject");
34
+
35
+ const allowed = evaluateSubjectGuard({
36
+ subject: "agent",
37
+ sharedTarget: true,
38
+ mode: "enforce",
39
+ });
40
+ assert.equal(allowed.action, "allow");
41
+ });
42
+
43
+ test("subjectClassification omitted is off; invalid values throw", () => {
44
+ assert.equal(parseSubjectRuntimeConfig({}).subjectClassification.enabled, false);
45
+ assert.equal(parseSubjectRuntimeConfig({}).subjectGuard, "warn");
46
+ assert.throws(() => parseSubjectRuntimeConfig({ subjectGuard: "loud" }));
47
+ assert.throws(() => parseSubjectRuntimeConfig({ subjectClassification: false }));
48
+ });