@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
@@ -12,6 +12,8 @@
12
12
  */
13
13
  import type { MemoryFile, MemoryStatus, PluginConfig } from "../types.js";
14
14
  import type { StorageManager } from "../storage.js";
15
+ import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
16
+ import { readProcedureMaintenanceMarker } from "./library-maintenance.js";
15
17
 
16
18
  export interface ProcedureStatusCounts {
17
19
  total: number;
@@ -50,6 +52,10 @@ export interface ProcedureStatsReport {
50
52
  counts: ProcedureStatusCounts;
51
53
  recent: ProcedureStatsRecent;
52
54
  config: ProcedureStatsConfigSnapshot;
55
+ /** ISO timestamp of the last library-maintenance run marker, or null (issue #2370). */
56
+ lastMaintenanceAt: string | null;
57
+ /** Active procedures currently carrying a `needsRepair` flag (issue #2370). */
58
+ needsRepairFlags: number;
53
59
  }
54
60
 
55
61
  function snapshotConfig(config: PluginConfig): ProcedureStatsConfigSnapshot {
@@ -102,6 +108,7 @@ export async function computeProcedureStats(options: {
102
108
  let lastWriteMs: number | null = null;
103
109
  let writesLast7Days = 0;
104
110
  let minerSourced = 0;
111
+ let needsRepairFlags = 0;
105
112
 
106
113
  const known: MemoryStatus[] = [
107
114
  "active",
@@ -159,8 +166,15 @@ export async function computeProcedureStats(options: {
159
166
  if (m.frontmatter.source === "procedure-miner") {
160
167
  minerSourced += 1;
161
168
  }
169
+ if (
170
+ m.frontmatter.structuredAttributes?.needsRepair !== undefined &&
171
+ isActiveMemoryStatus(m.frontmatter.status)
172
+ ) {
173
+ needsRepairFlags += 1;
174
+ }
162
175
  }
163
176
 
177
+ const maintenanceMarker = await readProcedureMaintenanceMarker(storage.dir);
164
178
  return {
165
179
  schemaVersion: 1,
166
180
  generatedAt: new Date(nowMs).toISOString(),
@@ -171,6 +185,8 @@ export async function computeProcedureStats(options: {
171
185
  minerSourced,
172
186
  },
173
187
  config: snapshotConfig(config),
188
+ lastMaintenanceAt: maintenanceMarker?.lastRunAt ?? null,
189
+ needsRepairFlags,
174
190
  };
175
191
  }
176
192
 
@@ -210,5 +226,9 @@ export function formatProcedureStatsText(report: ProcedureStatsReport): string {
210
226
  lines.push(` lastWriteAt: ${recent.lastWriteAt ?? "(none)"}`);
211
227
  lines.push(` writesLast7Days: ${recent.writesLast7Days}`);
212
228
  lines.push(` minerSourced: ${recent.minerSourced}`);
229
+ lines.push("");
230
+ lines.push(` maintenance:`);
231
+ lines.push(` lastMaintenanceAt: ${report.lastMaintenanceAt ?? "(never)"}`);
232
+ lines.push(` needsRepairFlags: ${report.needsRepairFlags}`);
213
233
  return lines.join("\n") + "\n";
214
234
  }
package/src/schemas.ts CHANGED
@@ -103,6 +103,13 @@ export const ExtractedFactSchema = z.object({
103
103
  .describe(
104
104
  'Scope classification: "global" for cross-project knowledge (framework bugs, library behavior, API patterns, user preferences, general coding patterns); "project" for project-specific knowledge (file paths, env configs, deployment details, project workarounds) and for tool, command, or CLI-flag instructions tied to one agent, since the same tool name can mean different things across agents. When keeping such an agent-tied instruction, begin the fact with a leading "In <agent>," clause naming that agent. Defaults to "project" when a coding context is active.',
105
105
  ),
106
+ subject: z
107
+ .enum(["user", "agent"])
108
+ .optional()
109
+ .nullable()
110
+ .describe(
111
+ 'Memory subject: "user" when the fact models the person (preferences, relationships, biography, moments, commitments about their life); "agent" when it is reusable operating knowledge (procedures, principles, tool-usage lessons, debugging strategies, environment facts with no personal content). Emit only for fact/decision-like facts; the category defaults cover preference, relationship, moment, commitment, procedure, principle, and skill.',
112
+ ),
106
113
  quote: z
107
114
  .string()
108
115
  .optional()
@@ -27,7 +27,8 @@ export interface SearchDegradation {
27
27
  | "daemon_loading"
28
28
  | "subprocess_error"
29
29
  | "deadline_exceeded"
30
- | "remote_error";
30
+ | "remote_error"
31
+ | "vector_tier_unavailable";
31
32
  detail?: string;
32
33
  }
33
34
 
@@ -8,6 +8,8 @@
8
8
  * through push/pull and promotion workflows.
9
9
  */
10
10
 
11
+ import { evaluateSubjectGuard } from "../memory-subject.js";
12
+ import type { SubjectGuardMode } from "../types.js";
11
13
  import { spawnSync } from "node:child_process";
12
14
  import crypto from "node:crypto";
13
15
  import fs from "node:fs";
@@ -99,6 +101,8 @@ export interface SpacePromoteResult {
99
101
  memoriesPromoted: number;
100
102
  conflicts: ConflictEntry[];
101
103
  durationMs: number;
104
+ /** Subject-guard warnings (issue #2372): user-subject memories promoted to a shared team space under "warn". */
105
+ subjectWarnings?: string[];
102
106
  }
103
107
 
104
108
  export interface ConflictEntry {
@@ -748,7 +752,10 @@ export function shareSpace(spaceId: string, members: string[], baseDir?: string)
748
752
  export async function promoteSpace(
749
753
  sourceSpaceId: string,
750
754
  targetSpaceId: string,
751
- options?: { memoryIds?: string[]; force?: boolean; forceOverwrite?: boolean; baseDir?: string }
755
+ options?: {
756
+ memoryIds?: string[]; force?: boolean; forceOverwrite?: boolean; baseDir?: string;
757
+ subjectGuard?: SubjectGuardMode; allowUserSubject?: boolean;
758
+ }
752
759
  ): Promise<SpacePromoteResult> {
753
760
  const startTime = Date.now();
754
761
  const manifest = loadManifest(options?.baseDir);
@@ -766,6 +773,33 @@ export async function promoteSpace(
766
773
  }
767
774
  }
768
775
 
776
+ // Subject guard (issue #2372): the SAME gate as the scope-profile promotion
777
+ // path — a user-subject (or unstamped, fail-closed) memory promoted into a
778
+ // TEAM space warns/rejects with the override named; recorded in the audit trail.
779
+ const subjectWarnings: string[] = [];
780
+ const warnedMemoryIds: string[] = [];
781
+ if (target.kind === "team") {
782
+ const sourceFiles = fs.existsSync(source.memoryDir) ? walkMd(fs.realpathSync(source.memoryDir)) : [];
783
+ for (const file of sourceFiles) {
784
+ const fm = parseSimpleFrontmatter(fs.readFileSync(file, "utf8"));
785
+ if (!fm?.id) continue;
786
+ if (options?.memoryIds?.length && !options.memoryIds.includes(fm.id)) continue;
787
+ const decision = evaluateSubjectGuard({
788
+ subject: fm.subject === "user" || fm.subject === "agent" ? fm.subject : undefined,
789
+ sharedTarget: true,
790
+ mode: options?.subjectGuard ?? "warn",
791
+ allowUserSubject: options?.allowUserSubject,
792
+ });
793
+ if (decision.action === "reject") {
794
+ throw new Error(`space promote blocked by subject guard: memory ${fm.id} — ${decision.reason}`);
795
+ }
796
+ if (decision.action === "warn") {
797
+ subjectWarnings.push(`memory ${fm.id}: ${decision.reason}`);
798
+ warnedMemoryIds.push(fm.id);
799
+ }
800
+ }
801
+ }
802
+
769
803
  const result = await copyMemories(source.memoryDir, target.memoryDir, {
770
804
  filterIds: options?.memoryIds,
771
805
  force: options?.forceOverwrite !== undefined ? options.forceOverwrite : (options?.force ?? false),
@@ -776,7 +810,8 @@ export async function promoteSpace(
776
810
  action: "space.promote",
777
811
  sourceSpaceId,
778
812
  targetSpaceId,
779
- details: `Promoted ${result.merged} memories from "${source.name}" to "${target.name}"`,
813
+ details: `Promoted ${result.merged} memories from "${source.name}" to "${target.name}"${subjectWarnings.length > 0 ? `; subject-guard warned ${subjectWarnings.length} user-subject memories (${warnedMemoryIds.join(", ")})` : ""}${options?.allowUserSubject === true ? "; user-subject override: --allow-user-subject" : ""}`,
814
+ ...(warnedMemoryIds.length > 0 ? { memoryIds: warnedMemoryIds } : {}),
780
815
  },
781
816
  options?.baseDir
782
817
  );
@@ -787,6 +822,7 @@ export async function promoteSpace(
787
822
  memoriesPromoted: result.merged,
788
823
  conflicts: result.conflicts,
789
824
  durationMs: Date.now() - startTime,
825
+ ...(subjectWarnings.length > 0 ? { subjectWarnings } : {}),
790
826
  };
791
827
  }
792
828
 
package/src/storage.ts CHANGED
@@ -166,6 +166,7 @@ import type {
166
166
  VerificationState,
167
167
  PolicyClass,
168
168
  MemoryStatus,
169
+ MemorySubject,
169
170
  MemoryActionEvent,
170
171
  MemoryLifecycleEvent,
171
172
  MemoryLifecycleEventType,
@@ -244,6 +245,7 @@ import { normalizeProjectionPreview, normalizeProjectionTags } from "./memory-pr
244
245
  import { isSupportPassportPrivateMemory } from "./support-passport/card-projection.js";
245
246
  import { parseFlexibleIsoTimestamp } from "./utils/iso-timestamp.js";
246
247
  import { parseOriginClass } from "./security/origin-authority.js";
248
+ import { detectLanguageHint } from "./cross-lingual-recall.js";
247
249
  import {
248
250
  composeMemoryEnvelope,
249
251
  isSealedMemoryEnvelope,
@@ -322,8 +324,10 @@ function serializeFrontmatter(fm: MemoryFrontmatter): string {
322
324
  `tags: [${fm.tags.map((t) => `"${t}"`).join(", ")}]`,
323
325
  ];
324
326
  // OKF v0.1 interop (issue #1946): inert presentation metadata; `category` stays canonical.
327
+ if (fm.language) lines.push(`language: ${fm.language}`);
325
328
  if (fm.type !== undefined) lines.push(`type: ${fm.type}`);
326
329
  if (fm.origin) lines.push(`origin: ${/^[A-Za-z0-9:_.*-]+$/.test(fm.origin) ? fm.origin : JSON.stringify(fm.origin)}`);
330
+ if (fm.subject) lines.push(`subject: ${fm.subject}`);
327
331
  if (fm.entityRef) lines.push(`entityRef: ${fm.entityRef}`);
328
332
  if (fm.sourceConnector) {
329
333
  // YAML-injection guard (review thread QMPsP): emit unquoted for
@@ -859,8 +863,9 @@ export function parseFrontmatter(raw: string): { frontmatter: MemoryFrontmatter;
859
863
  frontmatter: {
860
864
  id: fm.id ?? "",
861
865
  category: (fm.category ?? "fact") as MemoryCategory,
862
- type: parseFrontmatterStringValue(fm.type),
863
866
  created: fm.created ?? new Date().toISOString(),
867
+ language: fm.language || undefined,
868
+ type: parseFrontmatterStringValue(fm.type),
864
869
  updated: fm.updated ?? new Date().toISOString(),
865
870
  source: fm.source ?? "unknown",
866
871
  confidence: conf,
@@ -868,6 +873,7 @@ export function parseFrontmatter(raw: string): { frontmatter: MemoryFrontmatter;
868
873
  tags,
869
874
  entityRef: fm.entityRef || undefined,
870
875
  origin: fm.origin !== undefined ? parseOriginClass(decodeYamlScalar(fm.origin)) : undefined,
876
+ subject: fm.subject === "user" || fm.subject === "agent" ? fm.subject : undefined,
871
877
  sourceConnector: fm.sourceConnector ? decodeYamlScalar(fm.sourceConnector) || undefined : undefined,
872
878
  toolScoped: fm.toolScoped === "true" ? true : undefined,
873
879
  supersedes: fm.supersedes || undefined,
@@ -1736,6 +1742,7 @@ export interface WriteMemoryOptions {
1736
1742
  origin?: string;
1737
1743
  sourceConnector?: string;
1738
1744
  toolScoped?: true;
1745
+ subject?: MemorySubject;
1739
1746
  }
1740
1747
 
1741
1748
  /**
@@ -1744,7 +1751,7 @@ export interface WriteMemoryOptions {
1744
1751
  */
1745
1752
  export type SealedWriteExtras = Omit<
1746
1753
  WriteMemoryOptions,
1747
- "confidence" | "tags" | "entityRef" | "source" | "expiresAt" | "validAt" | "structuredAttributes" | "sourceConnector" | "origin"
1754
+ "confidence" | "tags" | "entityRef" | "source" | "expiresAt" | "validAt" | "structuredAttributes" | "sourceConnector" | "origin" | "subject"
1748
1755
  >;
1749
1756
 
1750
1757
  export class StorageManager extends TombstoneBlockedCaptureIndexHost {
@@ -3729,6 +3736,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
3729
3736
  category,
3730
3737
  created: now.toISOString(),
3731
3738
  updated: now.toISOString(),
3739
+ language: detectLanguageHint(content),
3732
3740
  source: options.source ?? "extraction",
3733
3741
  confidence: conf,
3734
3742
  confidenceTier: tier,
@@ -3787,7 +3795,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
3787
3795
  fm.sourceConnector = options.sourceConnector;
3788
3796
  }
3789
3797
  if (options.origin !== undefined) fm.origin = parseOriginClass(options.origin);
3790
-
3798
+ if (options.subject !== undefined) fm.subject = options.subject;
3791
3799
  // Assemble the persisted body (attribute-suffix enrichment + combined
3792
3800
  // sanitize) via the SHARED helper — the sealed-envelope composer uses the
3793
3801
  // same one, so the two write paths cannot diverge (issue #1989 PR2).
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Config parsing for the memory-subject runtime knobs (issue #2372).
3
+ *
4
+ * Extracted from config.ts (its structural-ratchet ceiling forbids growth);
5
+ * `parseConfig` spreads `parseSubjectRuntimeConfig(cfg)` into the plugin
6
+ * config literal.
7
+ *
8
+ * Validation posture (Review Prevention Checklist §1/§24/§39): invalid
9
+ * values are REJECTED loudly, never silently reinterpreted — but an omitted
10
+ * key takes the documented default. The deliberate asymmetry from the issue
11
+ * stands: classification defaults OFF while the guard defaults "warn", so
12
+ * enabling classification later immediately yields promotion warnings
13
+ * without a second flag flip, and with classification off, unstamped
14
+ * memories still only warn (never silently promote) at shared targets.
15
+ */
16
+
17
+ import { coerceBool, coerceNumber } from "./connectors/coerce.js";
18
+ import {
19
+ isSubjectGuardMode,
20
+ PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,
21
+ } from "./memory-subject.js";
22
+ import type { SubjectGuardMode } from "./types.js";
23
+
24
+ export interface SubjectRuntimeConfig {
25
+ subjectClassification: { enabled: boolean };
26
+ subjectGuard: SubjectGuardMode;
27
+ promotionCandidates: { minAccessCount: number };
28
+ }
29
+
30
+ /**
31
+ * Reject a non-object block loudly (rule 51 / §1): a shorthand like
32
+ * `subjectClassification: false` must never normalize silently to `{}`.
33
+ * Returns void so callers read the block through a DIRECT `cfg.<key>`
34
+ * member access — the config-contract parser walker derives nested key
35
+ * paths from those accesses, and a helper return value hides them.
36
+ */
37
+ function assertObjectBlock(value: unknown, key: string, shape: string): void {
38
+ if (value === undefined) return;
39
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
40
+ throw new Error(
41
+ `${key} must be an object (got ${JSON.stringify(value)}). Use ${shape} (issue #2372).`,
42
+ );
43
+ }
44
+ }
45
+
46
+ export function parseSubjectRuntimeConfig(cfg: Record<string, unknown>): SubjectRuntimeConfig {
47
+ assertObjectBlock(cfg.subjectClassification, "subjectClassification", "subjectClassification: { enabled: true }");
48
+ const classification = (cfg.subjectClassification ?? {}) as Record<string, unknown>;
49
+ const rawEnabled = classification.enabled;
50
+ const enabledCoerced = coerceBool(rawEnabled);
51
+ if (rawEnabled !== undefined && enabledCoerced === undefined) {
52
+ throw new Error(
53
+ `subjectClassification.enabled must be a boolean or one of "true"/"false"/"1"/"0"/` +
54
+ `"yes"/"no"/"on"/"off" (got ${JSON.stringify(rawEnabled)}) — rejected, not defaulted (issue #2372).`,
55
+ );
56
+ }
57
+ const rawGuard = cfg.subjectGuard;
58
+ if (rawGuard !== undefined && !isSubjectGuardMode(rawGuard)) {
59
+ throw new Error(
60
+ `subjectGuard must be one of: off, warn, enforce (got ${JSON.stringify(rawGuard)}) — ` +
61
+ `rejected, not defaulted (issue #2372; checklist §1/§39).`,
62
+ );
63
+ }
64
+ assertObjectBlock(cfg.promotionCandidates, "promotionCandidates", "promotionCandidates: { minAccessCount: 3 }");
65
+ const candidates = (cfg.promotionCandidates ?? {}) as Record<string, unknown>;
66
+ const minAccessRaw = coerceNumber(candidates.minAccessCount);
67
+ if (candidates.minAccessCount !== undefined && (minAccessRaw === undefined || !Number.isFinite(minAccessRaw) || minAccessRaw < 0)) {
68
+ throw new Error(
69
+ `promotionCandidates.minAccessCount must be a non-negative number (got ${JSON.stringify(candidates.minAccessCount)}) — rejected, not defaulted (issue #2372).`,
70
+ );
71
+ }
72
+ return {
73
+ subjectClassification: { enabled: rawEnabled === undefined ? false : enabledCoerced === true },
74
+ subjectGuard: isSubjectGuardMode(rawGuard) ? rawGuard : "warn",
75
+ promotionCandidates: {
76
+ minAccessCount:
77
+ minAccessRaw !== undefined ? Math.floor(minAccessRaw) : PROMOTION_CANDIDATES_DEFAULT_MIN_ACCESS,
78
+ },
79
+ };
80
+ }
package/src/types.ts CHANGED
@@ -11,8 +11,11 @@ import type { ContradictionLocalizationConfig, ContradictionScanConfig } from ".
11
11
  import type { GraphPathScoringConfig } from "./graph-path-scoring-config.js";
12
12
  export type { ContradictionLocalizationConfig, ContradictionScanConfig } from "./contradiction-config.js";
13
13
  export type { GraphPathScoringConfig } from "./graph-path-scoring-config.js";
14
+ import type { ProceduralMaintenanceConfig } from "./procedural/maintenance-config.js";
14
15
 
15
16
  import type { AmbientCaptureProvenance, BufferTurnOwner, SecurityConfig, OriginMetadata } from "./security/types.js";
17
+ export type MemorySubject = "user" | "agent";
18
+ export type SubjectGuardMode = "off" | "warn" | "enforce";
16
19
  export type ReasoningEffort = "none" | "low" | "medium" | "high";
17
20
  export type TriggerMode = "smart" | "every_n" | "time_based";
18
21
  export type ConvergeConflictPolicy = "newest-wins" | "manual";
@@ -383,7 +386,6 @@ export interface DreamsPhasesConfig {
383
386
  deepSleep: DreamsDeepSleepConfig;
384
387
  }
385
388
 
386
- /** Procedural memory (issue #519): mining + recall gates. All sub-features default off. */
387
389
  export interface ProceduralConfig {
388
390
  enabled: boolean;
389
391
  /** Minimum cluster size before emitting a candidate; `0` disables mining (`minOccurrences_zero`). */
@@ -396,8 +398,8 @@ export interface ProceduralConfig {
396
398
  lookbackDays: number;
397
399
  /** When true, installer may register the nightly procedural mining cron (default off). */
398
400
  proceduralMiningCronAutoRegister: boolean;
399
- /** Max procedure memories to inject on task-initiation recall (1–10). */
400
401
  recallMaxProcedures: number;
402
+ maintenance: ProceduralMaintenanceConfig;
401
403
  }
402
404
 
403
405
  /**
@@ -1041,14 +1043,11 @@ export interface PluginConfig extends BoundedJsonlStateConfig, SecurityConfig {
1041
1043
  recallMaxConcurrentPerPrincipal: number;
1042
1044
  /** Coalesce identical concurrent recalls per principal; each caller gets its own clone. Default true. */
1043
1045
  recallSingleFlightEnabled: boolean;
1044
- // Memory Worth recall filter (issue #560 PR 4)
1045
1046
  /**
1046
- * When true, recall multiplies candidate scores by the Memory Worth
1047
- * factor computed from `mw_success` / `mw_fail` counters on each
1048
- * memory's frontmatter (see `computeMemoryWorth`). Memories with a
1049
- * history of failed sessions sink; neutral / uninstrumented memories
1050
- * are untouched (multiplier 1.0). Default false — flip to true in PR 5
1051
- * once the benchmark shows precision tie-or-win.
1047
+ * When true, recall multiplies candidate scores by the Memory Worth factor
1048
+ * from `mw_success` / `mw_fail` (see `computeMemoryWorth`): failed memories
1049
+ * sink; neutral ones untouched (multiplier 1.0). Default false until the
1050
+ * benchmark shows precision tie-or-win.
1052
1051
  */
1053
1052
  recallMemoryWorthFilterEnabled: boolean;
1054
1053
  /**
@@ -1265,6 +1264,10 @@ export interface PluginConfig extends BoundedJsonlStateConfig, SecurityConfig {
1265
1264
  codexCompat: CodexCompatConfig;
1266
1265
  /** When true (default), LLM classifies facts as `"project"` or `"global"` scope for promotion across projects. */
1267
1266
  extractionScopeClassificationEnabled: boolean;
1267
+ subjectClassification: { enabled: boolean };
1268
+ subjectGuard: SubjectGuardMode;
1269
+ /** Min accessCount reuse signal for promotion candidates (issue #2372). Default 3. */
1270
+ promotionCandidates: { minAccessCount: number };
1268
1271
  // Extraction judge (issue #376)
1269
1272
  /** Enable the LLM-as-judge fact-worthiness gate on extracted facts. Default false (opt-in). */
1270
1273
  extractionJudgeEnabled: boolean;
@@ -2804,9 +2807,13 @@ export interface MemoryFrontmatter extends SourceConnectorProvenance, OriginMeta
2804
2807
  /** True when write-time classification ties this memory to its source connector's tools or commands. */
2805
2808
  toolScoped?: true;
2806
2809
  id: string;
2810
+ /** Whom this memory models (issue #2372). The promotion guard treats absent as "user" (fail closed). */
2811
+ subject?: MemorySubject;
2807
2812
  category: MemoryCategory;
2808
2813
  /** OKF v0.1 interop metadata (issue #1946). Inert: presentation only, never overrides `category`. */
2809
2814
  type?: string;
2815
+ /** Dominant-script hint (ISO 15924, e.g. `latn`/`jpan`) for cross-lingual recall (#2197). Absent on legacy files. */
2816
+ language?: string;
2810
2817
  created: string;
2811
2818
  updated: string;
2812
2819
  source: string;
@@ -2822,12 +2829,8 @@ export interface MemoryFrontmatter extends SourceConnectorProvenance, OriginMeta
2822
2829
  /** Memory status: active (default), pending_review, rejected, quarantined, superseded, archived, or forgotten */
2823
2830
  status?: MemoryStatus;
2824
2831
  /**
2825
- * Tombstone block marker (issue #1579). When a new fact matches an active
2826
- * tombstone at the storage chokepoint, it is persisted with
2827
- * `status: "pending_review"` and this field set to the tombstone id — making
2828
- * the block VISIBLE (rule 34: never a silent drop) rather than silently
2829
- * discarding the extraction. Approving the memory through the review queue
2830
- * emits a revocation that re-allows the content.
2832
+ * Tombstone block marker (issue #1579): persisted `pending_review` with this
2833
+ * set to the tombstone id a VISIBLE block (rule 34); approval revokes it.
2831
2834
  */
2832
2835
  blockedBy?: string;
2833
2836
  /** Which tombstone tier matched (`exact`/`normalized`/`keyed`/`semantic`). */
@@ -3232,29 +3235,25 @@ export interface ExtractedFact {
3232
3235
  */
3233
3236
  provenance?: "verified" | "unverified" | "none";
3234
3237
  /**
3235
- * Transient LLM-provided supporting quote (issue #1575 PR 2). Consumed by
3236
- * the post-parse validator to build `sources`, then stripped before the
3237
- * fact reaches persistence. NEVER included in content-hash dedup (rule 23 /
3238
- * checklist §13). Absent on facts that have already passed the validator.
3238
+ * Transient LLM quote (issue #1575 PR 2): consumed by the post-parse
3239
+ * validator to build `sources`, stripped before persistence, never in
3240
+ * content-hash dedup (rule 23 / checklist §13).
3239
3241
  */
3240
3242
  quote?: string;
3241
3243
  /**
3242
- * Transient requireSpans signal (issue #1575 PR 2). Set by the provenance
3243
- * validator (`ProvenanceBuildResult.requireSpansPending`) when
3244
- * `provenance.requireSpans` is enabled and the quote could not be located
3245
- * in any source turn. Read by the persist path to route the fact to
3246
- * `pending_review` instead of `active`. Stripped before persistence —
3247
- * it never reaches frontmatter (chatgpt-codex-connector thread 4xB).
3244
+ * Transient requireSpans signal (#1575 PR 2): quote unlocatable while
3245
+ * `provenance.requireSpans` is on. Persist path routes the fact to
3246
+ * `pending_review`. Stripped before persistence never reaches frontmatter.
3248
3247
  */
3249
3248
  requireSpansPending?: boolean;
3250
3249
  promptedByQuestion?: string;
3251
3250
  /**
3252
- * Whether this fact is project-scoped or globally applicable.
3253
- * When `extractionScopeClassificationEnabled` is true, the extraction LLM
3254
- * classifies each fact. Default is `"project"` when a coding context is
3255
- * active, `"global"` when no coding context is present.
3251
+ * Project- vs global-scoped; emitted when `extractionScopeClassificationEnabled`.
3252
+ * Defaults to "project" with a coding context active, else "global".
3256
3253
  */
3257
3254
  scope?: MemoryScope;
3255
+ /** Extractor-assigned subject, present only when subjectClassification.enabled (issue #2372). */
3256
+ subject?: MemorySubject;
3258
3257
  /** Structured key-value attributes extracted from the content (e.g., product attributes, dates, quantities). */
3259
3258
  structuredAttributes?: Record<string, string>;
3260
3259
  /** When category is `procedure`, ordered steps with intents (persisted under procedures/). */
@@ -9,6 +9,7 @@ import {
9
9
  WRITE_FINGERPRINT_FIELDS,
10
10
  buildWriteIdempotencyPayload,
11
11
  composeMemoryEnvelope,
12
+ sealedWriteToLegacyArgs,
12
13
  isSealedMemoryEnvelope,
13
14
  type FingerprintScope,
14
15
  type MemoryWriteInput,
@@ -198,6 +199,7 @@ test("registry and exempt list disjointly cover every MemoryWriteInput field", (
198
199
  sourceConnector: "bee",
199
200
  sourceReason: "r",
200
201
  origin: "user",
202
+ subject: "user",
201
203
  };
202
204
  for (const key of Object.keys(populated)) {
203
205
  assert.ok(classified.has(key), `field ${key} is not classified`);
@@ -682,3 +684,15 @@ test("structural fallback rejects prototype-inherited accessors (round 13)", ()
682
684
  "prototype-inherited getter lookalike must be rejected",
683
685
  );
684
686
  });
687
+
688
+ test("sealedWriteToLegacyArgs always copies sourceConnector from the envelope", () => {
689
+ const envelope = composeMemoryEnvelope(
690
+ minimalInput({ sourceConnector: "chatgpt" }),
691
+ CTX,
692
+ );
693
+ const mapped = sealedWriteToLegacyArgs(envelope, { sourceConnector: "smuggled" });
694
+ assert.equal(mapped.options.sourceConnector, "chatgpt");
695
+ const empty = composeMemoryEnvelope(minimalInput(), CTX);
696
+ const cleared = sealedWriteToLegacyArgs(empty, { sourceConnector: "smuggled" });
697
+ assert.equal(cleared.options.sourceConnector, undefined);
698
+ });
@@ -24,7 +24,8 @@
24
24
  * the write call sites onto this module (see #1989 for the slicing).
25
25
  */
26
26
 
27
- import type { MemoryCategory } from "./types.js";
27
+ import { isMemorySubject } from "./memory-subject.js";
28
+ import type { MemoryCategory, MemorySubject } from "./types.js";
28
29
  import { normalizeTags } from "./recall-tag-filter.js";
29
30
  import { parseFlexibleIsoTimestamp } from "./utils/iso-timestamp.js";
30
31
  import { assemblePersistedBody } from "./structured-attributes.js";
@@ -61,6 +62,8 @@ export interface MemoryWriteInput {
61
62
  sourceConnector?: string;
62
63
  /** Origin class stamped at creation time (issue #1955). */
63
64
  origin?: string;
65
+ /** Whom the memory models (issue #2372): "user" or "agent". */
66
+ subject?: MemorySubject;
64
67
  /** Human-readable provenance note. */
65
68
  sourceReason?: string;
66
69
  }
@@ -184,6 +187,7 @@ export interface SealedMemoryEnvelope {
184
187
  readonly validAt: string | undefined;
185
188
  readonly sourceConnector: string | undefined;
186
189
  readonly origin: string | undefined;
190
+ readonly subject: MemorySubject | undefined;
187
191
  readonly sourceReason: string | undefined;
188
192
  readonly source: string;
189
193
  /** ISO timestamp the envelope was composed (from ctx.now). */
@@ -430,6 +434,18 @@ export function composeMemoryEnvelope(
430
434
  }
431
435
  }
432
436
 
437
+ let subject: MemorySubject | undefined;
438
+ if (input.subject !== undefined) {
439
+ if (!isMemorySubject(input.subject)) {
440
+ hygiene.flag(
441
+ "subject",
442
+ `must be "user" or "agent" (got ${JSON.stringify(input.subject)}) — dropped`,
443
+ );
444
+ } else {
445
+ subject = input.subject;
446
+ }
447
+ }
448
+
433
449
  // validAt stays FATAL in salvage too: legacy writeMemory throws on an
434
450
  // invalid validAt (normalizeMemoryWriteTimestamp), so salvage-dropping it
435
451
  // would CHANGE behavior rather than preserve it.
@@ -465,11 +481,12 @@ export function composeMemoryEnvelope(
465
481
  structuredAttributes: attributes?.canonical,
466
482
  rawStructuredAttributes: attributes?.raw,
467
483
  entityRef: normalizeOptionalString("entityRef", input.entityRef, hygiene),
484
+ origin: normalizeOptionalString("origin", input.origin, hygiene),
485
+ subject,
468
486
  confidence,
469
487
  ttl: normalizeOptionalString("ttl", input.ttl, hygiene),
470
488
  validAt,
471
489
  sourceConnector: normalizeOptionalString("sourceConnector", input.sourceConnector, hygiene),
472
- origin: normalizeOptionalString("origin", input.origin, hygiene),
473
490
  sourceReason: normalizeOptionalString("sourceReason", input.sourceReason, hygiene),
474
491
  source: ctx.source.trim(),
475
492
  composedAt: now.toISOString(),
@@ -656,8 +673,9 @@ export function sealedWriteToLegacyArgs(
656
673
  // extras — a conditional spread let extras.sourceConnector smuggle
657
674
  // unvalidated connector provenance past the sealed envelope when the
658
675
  // envelope had none.
659
- sourceConnector: envelope.sourceConnector,
660
676
  origin: envelope.origin,
677
+ sourceConnector: envelope.sourceConnector,
678
+ subject: envelope.subject,
661
679
  },
662
680
  };
663
681
  }
@@ -695,6 +713,9 @@ export const FINGERPRINT_EXEMPT_FIELDS = [
695
713
  // Free-text provenance note; carries no identity.
696
714
  // Origin is provenance metadata, not write identity (#1955).
697
715
  "origin",
716
+ // Subject is derived classification metadata (#2372): two writes identical
717
+ // except subject are the same memory for dedup purposes.
718
+ "subject",
698
719
  "sourceReason",
699
720
  ] as const satisfies readonly (keyof MemoryWriteInput)[];
700
721
 
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const MemoryActionTypeSchema = z.enum([\n \"store_episode\",\n \"store_note\",\n \"update_note\",\n \"create_artifact\",\n \"summarize_node\",\n \"discard\",\n \"link_graph\",\n]);\n\nexport const MemoryActionEligibilityContextSchema = z\n .object({\n confidence: z.number().min(0).max(1),\n lifecycleState: z.enum([\"active\", \"validated\", \"candidate\", \"stale\", \"archived\"]),\n importance: z.number().min(0).max(1),\n source: z.enum([\"extraction\", \"consolidation\", \"replay\", \"manual\", \"unknown\"]),\n })\n .strict();\n\nexport function parseMemoryActionType(value: unknown): z.infer<typeof MemoryActionTypeSchema> {\n const parsed = MemoryActionTypeSchema.safeParse(value);\n return parsed.success ? parsed.data : \"discard\";\n}\n\nexport function parseMemoryActionEligibilityContext(\n value: unknown,\n): z.infer<typeof MemoryActionEligibilityContextSchema> {\n const parsed = MemoryActionEligibilityContextSchema.safeParse(value);\n if (parsed.success) return parsed.data;\n return {\n confidence: 0,\n lifecycleState: \"candidate\",\n importance: 0,\n source: \"unknown\",\n };\n}\n\nexport const ProcedureStepExtractSchema = z.object({\n order: z.number(),\n intent: z.string(),\n toolCall: z\n .object({\n kind: z.string(),\n signature: z.string(),\n })\n .optional()\n .nullable(),\n expectedOutcome: z.string().optional().nullable(),\n optional: z.boolean().optional().nullable(),\n});\n\nexport const ExtractedFactSchema = z.object({\n category: z.enum([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n \"reasoning_trace\",\n ]),\n content: z\n .string()\n .describe(\"The memory content — a clear, standalone statement\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How confident are you this is correct (0-1)\"),\n tags: z.array(z.string()).describe(\"Relevant tags for categorization\"),\n entityRef: z\n .string()\n .optional()\n .nullable()\n .describe(\"If about an entity, its normalized name (e.g. person-jane-doe)\"),\n cueAnchors: z\n .array(\n z.object({\n type: z.enum([\"entity\", \"file\", \"tool\", \"outcome\", \"constraint\", \"date\"]),\n value: z.string(),\n }),\n )\n .optional()\n .nullable()\n .describe(\"Up to three short retrieval cues for this fact.\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this fact.\"),\n scope: z\n .enum([\"project\", \"global\"])\n .optional()\n .nullable()\n .describe(\n 'Scope classification: \"global\" for cross-project knowledge (framework bugs, library behavior, API patterns, user preferences, general coding patterns); \"project\" for project-specific knowledge (file paths, env configs, deployment details, project workarounds) and for tool, command, or CLI-flag instructions tied to one agent, since the same tool name can mean different things across agents. When keeping such an agent-tied instruction, begin the fact with a leading \"In <agent>,\" clause naming that agent. Defaults to \"project\" when a coding context is active.',\n ),\n quote: z\n .string()\n .optional()\n .nullable()\n .describe(\n \"The EXACT verbatim words from the conversation that support this fact. Copy a contiguous span from a single speaker turn (not a paraphrase). Cap at ~300 characters. This is the grounding evidence for downstream faithfulness verification (issue #1575).\",\n ),\n structuredAttributes: z\n .record(z.string(), z.string())\n .optional()\n .nullable()\n .describe(\"Structured key-value attributes when the fact contains measurable or categorical data (e.g., {\\\"price\\\": \\\"29.99\\\", \\\"color\\\": \\\"blue\\\", \\\"date\\\": \\\"2024-03-15\\\"}).\"),\n procedureSteps: z\n .array(ProcedureStepExtractSchema)\n .optional()\n .nullable()\n .describe(\n 'For category \"procedure\" only: ordered steps (intent per step). At least two steps; include explicit trigger phrasing in content (e.g. \"When you deploy…\").',\n ),\n reasoningTrace: z\n .object({\n steps: z\n .array(\n z.object({\n order: z.number(),\n description: z.string(),\n }),\n )\n // Prompts and normalizer require >=2 ordered steps; enforce it at\n // the schema layer so gateway-path parsing rejects malformed traces\n // rather than persisting them (local/direct-client normalization\n // already enforces this, keeping the two paths symmetric).\n .min(2)\n .describe(\"Ordered reasoning steps the user walked through (require >=2).\"),\n // Accept snake_case aliases so a loose gateway model using\n // `final_answer` / `observed_outcome` does not fail schema parsing\n // and drop the entire extraction result. Local/direct-client\n // normalization already tolerates these keys; the gateway path must\n // too. Zod's `union` keeps the parse successful either way.\n finalAnswer: z\n .string()\n .optional()\n .nullable()\n .describe(\"The conclusion, decision, or answer the chain arrived at.\"),\n final_answer: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for finalAnswer (snake_case). Gateway-tolerance shim.\"),\n observedOutcome: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional note about how the answer actually played out.\"),\n observed_outcome: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for observedOutcome (snake_case). Gateway-tolerance shim.\"),\n })\n // Either finalAnswer OR final_answer must be present — enforce here so\n // the rest of the pipeline can assume a usable string downstream.\n .refine(\n (v) =>\n (typeof v.finalAnswer === \"string\" && v.finalAnswer.trim().length > 0) ||\n (typeof v.final_answer === \"string\" && v.final_answer.trim().length > 0),\n { message: \"reasoningTrace requires finalAnswer (or final_answer)\" },\n )\n .optional()\n .nullable()\n .describe(\n 'For category \"reasoning_trace\" only: a stored solution chain with ordered steps, a final answer, and an optional observed outcome. Require at least two steps.',\n ),\n eventTime: z\n .string()\n .optional()\n .nullable()\n .describe(\n 'Optional event-time expression for bi-temporal validity (#1578). An ISO date (\"2025-03-01\") or a relative expression verbatim (\"last March\", \"yesterday\", \"since 2024\", \"until 2025-06-01\"). Resolved against the source turn timestamp at write time — NOT wall-clock. Omit when the fact has no explicit temporal anchor.',\n ),\n event_time: z\n .string()\n .optional()\n .nullable()\n .describe(\"Alias for eventTime (snake_case). Gateway-tolerance shim (#1578).\"),\n}).superRefine((value, ctx) => {\n if (value.category === \"procedure\" && (!Array.isArray(value.procedureSteps) || value.procedureSteps.length < 2)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"procedureSteps\"],\n message: \"procedure facts require at least two procedureSteps\",\n });\n }\n\n if (value.category === \"reasoning_trace\" && value.reasoningTrace == null) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"reasoningTrace\"],\n message: \"reasoning_trace facts require reasoningTrace\",\n });\n }\n});\n\nexport const EntityMentionSchema = z.object({\n name: z\n .string()\n .describe(\"Normalized entity name (e.g. jane-doe, acme-corp, my-project)\"),\n type: z.enum([\"person\", \"project\", \"tool\", \"company\", \"place\", \"other\"]),\n facts: z\n .array(z.string())\n .describe(\"New facts learned about this entity in this conversation\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this entity.\"),\n structuredSections: z\n .array(z.object({\n key: z.string(),\n title: z.string(),\n facts: z.array(z.string()),\n }))\n .optional()\n .nullable()\n .describe(\"Optional named sections for entity-specific facts. Use when facts clearly belong under a durable heading such as Beliefs or Building / Working On.\"),\n});\n\nexport const ExtractedQuestionSchema = z.object({\n question: z.string().describe(\"A genuine question the AI is curious about based on this conversation\"),\n context: z.string().describe(\"Why this question matters or what prompted it\"),\n priority: z.number().min(0).max(1).describe(\"How important/urgent this question is (0-1)\"),\n});\n\nexport const ProactiveQuestionsResultSchema = z.object({\n questions: z\n .array(ExtractedQuestionSchema)\n .describe(\"Additional follow-up questions discovered in a proactive second-pass extraction.\"),\n});\n\nexport const ExtractedRelationshipSchema = z.object({\n source: z.string().describe(\"Source entity name (normalized, e.g. person-jane-doe)\"),\n target: z.string().describe(\"Target entity name (normalized, e.g. company-acme-corp)\"),\n label: z.string().describe(\"Relationship label (e.g. 'works at', 'created', 'manages')\"),\n promptedByQuestion: z\n .string()\n .optional()\n .nullable()\n .describe(\"Optional proactive follow-up question that surfaced this relationship.\"),\n});\n\nexport const ProactiveExtractionResultSchema = z.object({\n facts: z\n .array(ExtractedFactSchema)\n .describe(\n \"Additional high-confidence memories recovered only after answering proactive follow-up questions from the same buffered conversation.\",\n ),\n profileUpdates: z\n .array(z.string())\n .describe(\n \"Additional profile updates directly supported by the buffered conversation. Omit anything speculative.\",\n ),\n entities: z\n .array(EntityMentionSchema)\n .describe(\n \"Additional entities or entity facts surfaced by the proactive follow-up pass.\",\n ),\n relationships: z\n .array(ExtractedRelationshipSchema)\n .optional()\n .nullable()\n .describe(\n \"Additional relationships surfaced by the proactive follow-up pass.\",\n ),\n});\n\n/**\n * Salvage array for model-produced extraction output (issue #2455).\n *\n * Mixed valid+invalid items parse to the valid subset so one malformed\n * element no longer discards the whole extraction. A non-empty array with\n * zero valid items still fails, so bounded retry stays effective and wholly\n * malformed output is never silently accepted as empty. Empty arrays stay\n * valid. Consolidation schemas intentionally stay strict — do not use this\n * for them.\n */\nfunction salvageArray<T extends z.ZodTypeAny>(itemSchema: T) {\n return z\n .array(z.unknown())\n .transform((items, ctx) => {\n const valid: z.infer<T>[] = [];\n for (const raw of items) {\n const parsed = itemSchema.safeParse(raw);\n if (parsed.success) {\n valid.push(parsed.data);\n }\n }\n if (items.length > 0 && valid.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"array contains no items matching the schema\",\n });\n return z.NEVER;\n }\n return valid;\n });\n}\n\nexport const ExtractionResultSchema = z.object({\n facts: salvageArray(ExtractedFactSchema).describe(\n \"Extracted memories from the conversation. Include facts, preferences, corrections, and decisions. Only extract genuinely new, durable information — skip transient task state.\",\n ),\n profileUpdates: salvageArray(z.string()).describe(\n \"Updates to the user's behavioral profile. Each string is a standalone statement about the user's preferences, habits, or personality. Only include genuinely new insights.\",\n ),\n entities: salvageArray(EntityMentionSchema).describe(\n \"Entities mentioned in the conversation with new facts about them.\",\n ),\n questions: salvageArray(ExtractedQuestionSchema).describe(\n \"Zero to three source-grounded questions useful in future sessions. Return an empty array when the conversation supports none.\",\n ),\n identityReflection: z\n .string()\n .optional()\n .nullable()\n .describe(\n \"A brief reflection on what you learned about yourself as an agent in this interaction — patterns in your behavior, growth, things you did well or could improve.\",\n ),\n episodeTitle: z\n .string()\n .optional()\n .nullable()\n .describe(\"A six-to-eight word title for this conversation segment.\"),\n relationships: salvageArray(ExtractedRelationshipSchema)\n .optional()\n .nullable()\n .describe(\n \"Relationships between entities discovered in this conversation. Max 5 per extraction. Format: {source, target, label}.\",\n ),\n});\n\nexport const ConsolidationItemSchema = z.object({\n existingId: z\n .string()\n .describe(\"The ID of the existing memory being evaluated\"),\n action: z.enum([\"ADD\", \"MERGE\", \"UPDATE\", \"INVALIDATE\", \"SKIP\"]),\n mergeWith: z\n .string()\n .optional()\n .nullable()\n .describe(\"If MERGE, the ID of the memory to merge with\"),\n updatedContent: z\n .string()\n .optional()\n .nullable()\n .describe(\"If UPDATE or MERGE, the new content\"),\n reason: z.string().describe(\"Brief reason for this decision\"),\n});\n\nexport const ConsolidationResultSchema = z.object({\n items: z\n .array(ConsolidationItemSchema)\n .describe(\n \"Decisions for each existing memory: ADD (keep as-is), MERGE (combine with another), UPDATE (revise content), INVALIDATE (mark as outdated/wrong), SKIP (no action needed)\",\n ),\n profileUpdates: z\n .array(z.string())\n .describe(\"New profile statements to add or update\"),\n entityUpdates: z\n .array(EntityMentionSchema)\n .describe(\"Entity updates from consolidation analysis\"),\n});\n\nexport function buildProfileConsolidationResultSchema(targetLines: number) {\n return z.object({\n consolidatedProfile: z\n .string()\n .describe(\n `The full consolidated profile as markdown. Preserve all ## section headers. Merge duplicate or near-duplicate bullets into single clear statements. Remove stale or superseded information. Keep the most important and durable observations. Target roughly ${targetLines} lines.`,\n ),\n removedCount: z\n .number()\n .describe(\"Number of bullets removed or merged during consolidation\"),\n summary: z\n .string()\n .describe(\"Brief summary of what was consolidated\"),\n });\n}\n\nexport const ProfileConsolidationResultSchema = buildProfileConsolidationResultSchema(50);\n\nexport const IdentityConsolidationResultSchema = z.object({\n learnedPatterns: z\n .array(z.string())\n .describe(\n \"Consolidated behavioral patterns and lessons learned, each a concise standalone statement\",\n ),\n summary: z\n .string()\n .describe(\n \"A brief paragraph summarizing the agent's core identity insights\",\n ),\n});\n\nexport type IdentityConsolidationResultParsed = z.infer<\n typeof IdentityConsolidationResultSchema\n>;\n\n// Contradiction Verification (Phase 2B)\nexport const ContradictionVerificationSchema = z.object({\n isContradiction: z\n .boolean()\n .describe(\"Whether the two memories truly contradict each other\"),\n confidence: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How confident are you in this assessment (0-1)\"),\n reasoning: z\n .string()\n .describe(\"Explanation of why these are or are not contradictory\"),\n whichIsNewer: z\n .enum([\"first\", \"second\", \"unclear\"])\n .describe(\"Which memory represents the more recent/current state\"),\n});\n\nexport type ContradictionVerificationResult = z.infer<\n typeof ContradictionVerificationSchema\n>;\n\n// Memory Linking (Phase 3A)\nexport const MemoryLinkSchema = z.object({\n targetId: z\n .string()\n .describe(\"The ID of the memory this links to\"),\n linkType: z\n .enum([\"follows\", \"references\", \"contradicts\", \"supports\", \"related\"])\n .describe(\"The type of relationship\"),\n strength: z\n .number()\n .min(0)\n .max(1)\n .describe(\"How strong is this relationship (0-1)\"),\n reason: z\n .string()\n .optional()\n .nullable()\n .describe(\"Why this link exists\"),\n});\n\nexport const SuggestedLinksSchema = z.object({\n links: z\n .array(MemoryLinkSchema)\n .describe(\"Suggested links between memories based on semantic analysis\"),\n});\n\nexport type MemoryLink = z.infer<typeof MemoryLinkSchema>;\nexport type SuggestedLinks = z.infer<typeof SuggestedLinksSchema>;\n\n// Memory Summarization (Phase 4A)\nexport const MemorySummarySchema = z.object({\n summaryText: z\n .string()\n .describe(\"A concise summary of the batch of memories\"),\n keyFacts: z\n .array(z.string())\n .describe(\"The most important facts extracted from these memories\"),\n keyEntities: z\n .array(z.string())\n .describe(\"Key entities mentioned across these memories\"),\n});\n\nexport type MemorySummaryResult = z.infer<typeof MemorySummarySchema>;\n\nexport const DaySummaryResultSchema = z.object({\n summary: z.string().min(1).describe(\"A concise end-of-day summary paragraph.\"),\n bullets: z.array(z.string()).default([]).describe(\"The most important moments from the day.\"),\n next_actions: z.array(z.string()).default([]).describe(\"Concrete next actions for tomorrow.\"),\n risks_or_open_loops: z.array(z.string()).default([]).describe(\"Open loops, blockers, or fragile assumptions still needing attention.\"),\n});\n\n// v8.15 behavior-loop auto-tuning state contracts\nexport const BehaviorLoopAdjustmentSchema = z.object({\n parameter: z.string().min(1),\n previousValue: z.number(),\n nextValue: z.number(),\n delta: z.number(),\n evidenceCount: z.number().int().min(0),\n confidence: z.number().min(0).max(1),\n reason: z.string(),\n appliedAt: z.string(),\n});\n\nexport const BehaviorLoopPolicyStateSchema = z.object({\n version: z.number().int().min(0),\n windowDays: z.number().int().min(0),\n minSignalCount: z.number().int().min(0),\n maxDeltaPerCycle: z.number().min(0).max(1),\n protectedParams: z.array(z.string()),\n adjustments: z.array(BehaviorLoopAdjustmentSchema),\n updatedAt: z.string(),\n});\n\nexport type BehaviorLoopAdjustmentParsed = z.infer<typeof BehaviorLoopAdjustmentSchema>;\nexport type BehaviorLoopPolicyStateParsed = z.infer<typeof BehaviorLoopPolicyStateSchema>;\n\nexport type MemoryActionTypeParsed = z.infer<typeof MemoryActionTypeSchema>;\nexport type MemoryActionEligibilityContextParsed = z.infer<typeof MemoryActionEligibilityContextSchema>;\nexport type ExtractedFactParsed = z.infer<typeof ExtractedFactSchema>;\nexport type EntityMentionParsed = z.infer<typeof EntityMentionSchema>;\nexport type ExtractedQuestionParsed = z.infer<typeof ExtractedQuestionSchema>;\nexport type ProactiveQuestionsResultParsed = z.infer<typeof ProactiveQuestionsResultSchema>;\nexport type ExtractionResultParsed = z.infer<typeof ExtractionResultSchema>;\nexport type ConsolidationItemParsed = z.infer<typeof ConsolidationItemSchema>;\nexport type ConsolidationResultParsed = z.infer<\n typeof ConsolidationResultSchema\n>;\n"],"mappings":"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","names":[]}