@remnic/core 9.52.2 → 9.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +22 -22
  3. package/dist/access-authorization-probe.d.ts +11 -11
  4. package/dist/access-authorization-probe.js +23 -23
  5. package/dist/access-boundary.d.ts +11 -11
  6. package/dist/access-boundary.js +22 -22
  7. package/dist/access-cli.js +55 -55
  8. package/dist/access-coding-context-resolution.d.ts +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +11 -11
  10. package/dist/access-extraction-force-flush.js +22 -22
  11. package/dist/access-health-types.d.ts +1 -1
  12. package/dist/access-http-lcm-compaction.d.ts +11 -11
  13. package/dist/access-http-lifecycle-flush.d.ts +11 -11
  14. package/dist/access-http-offline-stream.d.ts +11 -11
  15. package/dist/access-http-query.js +22 -22
  16. package/dist/access-http.d.ts +11 -11
  17. package/dist/access-http.js +29 -29
  18. package/dist/access-identity-continuity-surface.d.ts +9 -9
  19. package/dist/access-identity-continuity-surface.js +22 -22
  20. package/dist/access-lcm-surface.d.ts +11 -11
  21. package/dist/access-lcm-surface.js +22 -22
  22. package/dist/access-mcp.d.ts +11 -11
  23. package/dist/access-mcp.js +27 -27
  24. package/dist/access-memory-search-fanout.d.ts +2 -2
  25. package/dist/{access-namespace-preflight-Ds6CGlCP.d.ts → access-namespace-preflight-C7n4tgWC.d.ts} +1 -1
  26. package/dist/access-namespace-preflight.d.ts +3 -3
  27. package/dist/access-namespace-preflight.js +22 -22
  28. package/dist/access-observe-write-surface.d.ts +11 -11
  29. package/dist/access-observe-write-surface.js +22 -22
  30. package/dist/access-offline-manifest.d.ts +9 -9
  31. package/dist/access-offline-manifest.js +8 -4
  32. package/dist/access-operations-batch.js +24 -24
  33. package/dist/access-operations.d.ts +14 -14
  34. package/dist/access-operations.js +26 -26
  35. package/dist/access-recall-concurrency.d.ts +11 -11
  36. package/dist/access-recall-concurrency.js +22 -22
  37. package/dist/access-recall-response.d.ts +11 -11
  38. package/dist/access-recall-response.js +22 -22
  39. package/dist/access-recall-surface.d.ts +11 -11
  40. package/dist/access-recall-surface.js +22 -22
  41. package/dist/access-schema.d.ts +88 -88
  42. package/dist/{access-service-Cbk3bNbD.d.ts → access-service-CXvbxLK-.d.ts} +7 -7
  43. package/dist/access-service-helpers.d.ts +11 -11
  44. package/dist/access-service.d.ts +11 -11
  45. package/dist/access-service.js +22 -22
  46. package/dist/access-surface-catalog.d.ts +11 -11
  47. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  48. package/dist/action-confidence.d.ts +1 -1
  49. package/dist/active-memory-bridge.d.ts +1 -1
  50. package/dist/active-recall.d.ts +1 -1
  51. package/dist/active-recall.js +5 -5
  52. package/dist/ambient-provenance.d.ts +1 -1
  53. package/dist/artifact-search.d.ts +1 -1
  54. package/dist/{auto-sync-QFQGOEO2.js → auto-sync-TDHLZPVP.js} +7 -7
  55. package/dist/behavior-learner.d.ts +1 -1
  56. package/dist/behavior-signals.d.ts +1 -1
  57. package/dist/bootstrap.d.ts +9 -9
  58. package/dist/briefing.d.ts +2 -2
  59. package/dist/briefing.js +12 -12
  60. package/dist/buffer-surprise-report.d.ts +1 -1
  61. package/dist/buffer-turn-helpers.d.ts +1 -1
  62. package/dist/buffer.d.ts +2 -2
  63. package/dist/bulk-import/index.d.ts +3 -3
  64. package/dist/calibration.d.ts +1 -1
  65. package/dist/capabilities.d.ts +1 -1
  66. package/dist/{catalog-D3B4RDy1.d.ts → catalog-BOOxl-I2.d.ts} +1 -1
  67. package/dist/causal-behavior.d.ts +1 -1
  68. package/dist/causal-consolidation.d.ts +1 -1
  69. package/dist/causal-consolidation.js +13 -13
  70. package/dist/causal-trajectory-graph.d.ts +1 -1
  71. package/dist/{chunk-MLXZD4WM.js → chunk-2GFK22OZ.js} +2 -2
  72. package/dist/{chunk-RANKJI5T.js → chunk-3JLPGJ43.js} +2 -2
  73. package/dist/{chunk-O5FFBO2M.js → chunk-47P3RYZP.js} +70 -8
  74. package/dist/{chunk-O5FFBO2M.js.map → chunk-47P3RYZP.js.map} +1 -1
  75. package/dist/{chunk-X7XEDOSL.js → chunk-4IIFL7GC.js} +8 -8
  76. package/dist/chunk-5FVVY2EB.js +27 -0
  77. package/dist/chunk-5FVVY2EB.js.map +1 -0
  78. package/dist/{chunk-GXSOUIA4.js → chunk-5WQMORU5.js} +4 -4
  79. package/dist/{chunk-J272WKX2.js → chunk-6HPHEFXT.js} +2 -2
  80. package/dist/{chunk-B6LZ4IBH.js → chunk-6LAPLZOS.js} +2 -2
  81. package/dist/{chunk-WD5B5AIE.js → chunk-6R4G7N4S.js} +118 -173
  82. package/dist/chunk-6R4G7N4S.js.map +1 -0
  83. package/dist/{chunk-VXCNQYTC.js → chunk-APPFNGX6.js} +2 -2
  84. package/dist/{chunk-GXFSQ6SD.js → chunk-C4ZNGVK3.js} +2 -2
  85. package/dist/{chunk-JSEJH2YQ.js → chunk-CGVHPCP2.js} +2 -2
  86. package/dist/{chunk-BQIFZ2MP.js → chunk-CX5SW2EW.js} +41 -24
  87. package/dist/chunk-CX5SW2EW.js.map +1 -0
  88. package/dist/{chunk-RMHMUUBW.js → chunk-CYF6WVE7.js} +105 -49
  89. package/dist/{chunk-RMHMUUBW.js.map → chunk-CYF6WVE7.js.map} +1 -1
  90. package/dist/{chunk-TEMSWHQD.js → chunk-DZD576ZU.js} +5 -5
  91. package/dist/{chunk-AMTEYNYK.js → chunk-EVWWT3KE.js} +4 -4
  92. package/dist/{chunk-P2KBDJJ6.js → chunk-G2LUMAUF.js} +4 -3
  93. package/dist/{chunk-P2KBDJJ6.js.map → chunk-G2LUMAUF.js.map} +1 -1
  94. package/dist/{chunk-AXIDQG5A.js → chunk-G4T7L557.js} +5 -5
  95. package/dist/{chunk-7M6NYQWB.js → chunk-G7Z6EENO.js} +4 -4
  96. package/dist/{chunk-IARXXZU4.js → chunk-HOIRB77A.js} +99 -20
  97. package/dist/chunk-HOIRB77A.js.map +1 -0
  98. package/dist/{chunk-NDAH7BJ5.js → chunk-HVP33QVW.js} +103 -6
  99. package/dist/chunk-HVP33QVW.js.map +1 -0
  100. package/dist/{chunk-YXKVLYXU.js → chunk-HWRD23DW.js} +2 -2
  101. package/dist/{chunk-SOEN6KCF.js → chunk-IBKR2TFR.js} +2 -2
  102. package/dist/{chunk-R3DJVOSM.js → chunk-JDSVLVCG.js} +8 -1
  103. package/dist/chunk-JDSVLVCG.js.map +1 -0
  104. package/dist/{chunk-F4EU6VUC.js → chunk-JDZPNCMA.js} +2 -2
  105. package/dist/{chunk-D5YOZ66N.js → chunk-JV5YUBIZ.js} +20 -20
  106. package/dist/{chunk-DLG5V6ND.js → chunk-K4QS7LXU.js} +4 -7
  107. package/dist/chunk-K4QS7LXU.js.map +1 -0
  108. package/dist/{chunk-BAKXNQ3C.js → chunk-KRTY3ENI.js} +2 -2
  109. package/dist/{chunk-NK5RGJ65.js → chunk-L4DLLKPN.js} +2 -2
  110. package/dist/{chunk-VFSAWRMZ.js → chunk-LJS7KUPV.js} +2 -2
  111. package/dist/{chunk-JJRVPWFY.js → chunk-MLPTFODV.js} +166 -37
  112. package/dist/chunk-MLPTFODV.js.map +1 -0
  113. package/dist/{chunk-NOEMGE56.js → chunk-NH5IR2WM.js} +2 -2
  114. package/dist/{chunk-5V6IXHPI.js → chunk-NSVDUN76.js} +2 -2
  115. package/dist/{chunk-W7Y5JDVB.js → chunk-PDDTI7IC.js} +4 -4
  116. package/dist/{chunk-QINJITDS.js → chunk-PX2LSHYM.js} +2 -2
  117. package/dist/{chunk-HDIUYMSB.js → chunk-QWGE2PUH.js} +6 -6
  118. package/dist/{chunk-X57M2Q4I.js → chunk-RDJRFDJY.js} +3 -3
  119. package/dist/{chunk-RYLEDKQ2.js → chunk-RUMNY5DT.js} +3 -3
  120. package/dist/{chunk-BKIFTXHR.js → chunk-RZ4XGKOJ.js} +2 -2
  121. package/dist/{chunk-66SE3BNH.js → chunk-SUPEYLH2.js} +2 -2
  122. package/dist/{chunk-BF6SXNQJ.js → chunk-T2JHZWH6.js} +20 -20
  123. package/dist/{chunk-VHFXP27N.js → chunk-THPPCISA.js} +60 -23
  124. package/dist/chunk-THPPCISA.js.map +1 -0
  125. package/dist/{chunk-QPOHMO6M.js → chunk-UES4BHA2.js} +2 -2
  126. package/dist/{chunk-XAPMEU3K.js → chunk-UU7TRFNE.js} +2 -2
  127. package/dist/{chunk-QBSFOKY6.js → chunk-VOELBUS4.js} +4 -4
  128. package/dist/{chunk-2LY6GIIE.js → chunk-WDBX6VER.js} +2 -2
  129. package/dist/{chunk-BMEYMKWX.js → chunk-WM65LU67.js} +2 -2
  130. package/dist/{chunk-WLRD2TXF.js → chunk-WOPA3SGI.js} +4 -4
  131. package/dist/{chunk-5UZ6UCOZ.js → chunk-XUAMCLY4.js} +3 -3
  132. package/dist/{chunk-7HXZJAID.js → chunk-YGLY6QFV.js} +3 -3
  133. package/dist/{chunk-2OIQDTDC.js → chunk-ZPJ4QSGP.js} +2 -2
  134. package/dist/{chunk-3OY7KXHM.js → chunk-ZYLC7NFO.js} +3 -3
  135. package/dist/{cli-DMAFI0qt.d.ts → cli-DVUFIa5E.d.ts} +5 -5
  136. package/dist/cli.d.ts +13 -13
  137. package/dist/cli.js +42 -42
  138. package/dist/coding/pre-action-gate.d.ts +1 -1
  139. package/dist/compounding/engine.d.ts +2 -2
  140. package/dist/compounding/engine.js +13 -13
  141. package/dist/compounding/preference-consolidator.d.ts +1 -1
  142. package/dist/compression-optimizer.d.ts +1 -1
  143. package/dist/config.d.ts +1 -1
  144. package/dist/config.js +5 -5
  145. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  146. package/dist/connectors/codex-materialize-runner.js +12 -12
  147. package/dist/connectors/codex-materialize.d.ts +1 -1
  148. package/dist/connectors/index.d.ts +1 -1
  149. package/dist/connectors/index.js +12 -12
  150. package/dist/consolidation-provenance-check.d.ts +2 -2
  151. package/dist/consolidation-undo.d.ts +2 -2
  152. package/dist/content-hash.d.ts +12 -2
  153. package/dist/content-hash.js +9 -3
  154. package/dist/contradiction/index.d.ts +2 -2
  155. package/dist/contradiction/index.js +3 -3
  156. package/dist/converge-config.d.ts +1 -1
  157. package/dist/convergence-refresh.d.ts +2 -2
  158. package/dist/convergence-refresh.js +14 -14
  159. package/dist/conversation-index/backend.d.ts +1 -1
  160. package/dist/conversation-index/chunker.d.ts +1 -1
  161. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  162. package/dist/conversation-index/indexer.d.ts +1 -1
  163. package/dist/conversation-index/search.d.ts +1 -1
  164. package/dist/corpus-watermark.d.ts +1 -1
  165. package/dist/corpus-watermark.js +14 -14
  166. package/dist/day-summary.d.ts +1 -1
  167. package/dist/delinearize.d.ts +1 -1
  168. package/dist/dependency-propagation-config.d.ts +1 -1
  169. package/dist/{dependency-propagation-delivery-D63r24pH.d.ts → dependency-propagation-delivery-XzF76C9n.d.ts} +1 -1
  170. package/dist/direct-answer-wiring.d.ts +1 -1
  171. package/dist/direct-answer.d.ts +1 -1
  172. package/dist/embedding-fallback.d.ts +1 -1
  173. package/dist/enrichment/index.d.ts +1 -1
  174. package/dist/entity-retrieval.d.ts +2 -2
  175. package/dist/entity-retrieval.js +12 -12
  176. package/dist/entity-schema.d.ts +1 -1
  177. package/dist/explicit-capture.d.ts +9 -9
  178. package/dist/explicit-capture.js +8 -8
  179. package/dist/external-wiki-access.d.ts +11 -11
  180. package/dist/external-wiki-access.js +23 -23
  181. package/dist/external-wiki-collection-registration.d.ts +1 -1
  182. package/dist/external-wiki-collection.d.ts +1 -1
  183. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  184. package/dist/extraction-error-classification.d.ts +1 -1
  185. package/dist/extraction-faithfulness.d.ts +1 -1
  186. package/dist/extraction-judge-telemetry.d.ts +1 -1
  187. package/dist/extraction-judge-training.d.ts +1 -1
  188. package/dist/extraction-judge.d.ts +1 -1
  189. package/dist/extraction-liveness.d.ts +1 -1
  190. package/dist/extraction-normalization.d.ts +1 -1
  191. package/dist/extraction-normalization.js +2 -2
  192. package/dist/extraction-prompt.d.ts +1 -1
  193. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  194. package/dist/extraction-source-grounding.d.ts +1 -1
  195. package/dist/extraction-source-grounding.js +3 -3
  196. package/dist/extraction.d.ts +1 -1
  197. package/dist/extraction.js +16 -16
  198. package/dist/fallback-llm.d.ts +1 -1
  199. package/dist/{forget-HDS4N6CG.js → forget-EHGGJZLX.js} +3 -2
  200. package/dist/{forget-HDS4N6CG.js.map → forget-EHGGJZLX.js.map} +1 -1
  201. package/dist/graph-dashboard-diff.d.ts +1 -1
  202. package/dist/graph-dashboard-key.d.ts +1 -1
  203. package/dist/graph-dashboard-parser.d.ts +1 -1
  204. package/dist/graph-edge-reinforcement.d.ts +1 -1
  205. package/dist/graph-path-reconstruction.d.ts +1 -1
  206. package/dist/graph-path-scoring.d.ts +1 -1
  207. package/dist/graph-snapshot.d.ts +1 -1
  208. package/dist/graph.d.ts +1 -1
  209. package/dist/harmonic-construction.js +2 -2
  210. package/dist/harmonic-retrieval.js +4 -4
  211. package/dist/importance.d.ts +1 -1
  212. package/dist/importers/index.d.ts +1 -1
  213. package/dist/in-flight-reads.d.ts +1 -1
  214. package/dist/index.d.ts +777 -705
  215. package/dist/index.js +77 -67
  216. package/dist/intent.d.ts +1 -1
  217. package/dist/lcm/engine.d.ts +1 -1
  218. package/dist/lcm/index.d.ts +1 -1
  219. package/dist/lcm/tools.d.ts +1 -1
  220. package/dist/lifecycle.d.ts +1 -1
  221. package/dist/live-connectors-runner.d.ts +1 -1
  222. package/dist/local-llm.d.ts +1 -1
  223. package/dist/local-model-endpoint.d.ts +1 -1
  224. package/dist/maintenance/memory-governance.d.ts +1 -1
  225. package/dist/maintenance/memory-governance.js +12 -12
  226. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  227. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +12 -12
  228. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  229. package/dist/maintenance/rebuild-memory-projection.js +13 -13
  230. package/dist/{maintenance-kBII2qUI.d.ts → maintenance-BJzNIKBE.d.ts} +3 -3
  231. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  232. package/dist/memory-action-policy.d.ts +1 -1
  233. package/dist/memory-cache.d.ts +1 -1
  234. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  235. package/dist/memory-projection-store.d.ts +1 -1
  236. package/dist/memory-provenance.d.ts +1 -1
  237. package/dist/memory-snapshot.d.ts +1 -1
  238. package/dist/memory-worth-outcomes.d.ts +2 -2
  239. package/dist/models-json.d.ts +1 -1
  240. package/dist/namespaces/migrate.d.ts +3 -3
  241. package/dist/namespaces/migrate.js +13 -13
  242. package/dist/namespaces/principal.d.ts +1 -1
  243. package/dist/namespaces/search.d.ts +1 -1
  244. package/dist/namespaces/storage.d.ts +3 -3
  245. package/dist/namespaces/storage.js +12 -12
  246. package/dist/native-knowledge.d.ts +1 -1
  247. package/dist/offline-sync-impression-drain.d.ts +1 -1
  248. package/dist/operator-doctor-corpus.d.ts +1 -1
  249. package/dist/operator-doctor-corpus.js +15 -15
  250. package/dist/operator-doctor-replica.d.ts +1 -1
  251. package/dist/operator-toolkit.d.ts +3 -3
  252. package/dist/operator-toolkit.js +21 -21
  253. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  254. package/dist/orchestration/maintenance.d.ts +4 -4
  255. package/dist/orchestration/maintenance.js +17 -17
  256. package/dist/{orchestrator-DHy5LtTy.d.ts → orchestrator-BiXgBJBQ.d.ts} +8 -8
  257. package/dist/orchestrator.d.ts +9 -9
  258. package/dist/orchestrator.js +55 -55
  259. package/dist/patterns-cli.d.ts +1 -1
  260. package/dist/{pipeline-D21Rs6gW.d.ts → pipeline-sz_dcuLg.d.ts} +1 -1
  261. package/dist/policy-runtime.d.ts +1 -1
  262. package/dist/proactive-contention.d.ts +1 -1
  263. package/dist/provenance.d.ts +1 -1
  264. package/dist/provenance.js +2 -2
  265. package/dist/{qmd-Dhle1P4X.d.ts → qmd-eAWObK4M.d.ts} +1 -1
  266. package/dist/qmd-preflight.d.ts +2 -2
  267. package/dist/qmd-recall-cache.d.ts +1 -1
  268. package/dist/qmd.d.ts +2 -2
  269. package/dist/recall-concurrency-config.d.ts +1 -1
  270. package/dist/recall-disclosure-escalation.d.ts +1 -1
  271. package/dist/recall-explain-renderer.d.ts +1 -1
  272. package/dist/recall-memory-map.d.ts +1 -1
  273. package/dist/recall-planner-llm.d.ts +1 -1
  274. package/dist/recall-state.d.ts +1 -1
  275. package/dist/recall-tag-filter.d.ts +1 -1
  276. package/dist/recall-timings.d.ts +1 -1
  277. package/dist/recall-xray-cli.d.ts +1 -1
  278. package/dist/recall-xray-renderer.d.ts +1 -1
  279. package/dist/recall-xray.d.ts +1 -1
  280. package/dist/reconcile/cursor.d.ts +1 -1
  281. package/dist/reconcile/manifest.d.ts +4 -2
  282. package/dist/reconcile/manifest.js +7 -3
  283. package/dist/reconcile/plan.d.ts +1 -1
  284. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  285. package/dist/replay/normalizers/claude.d.ts +1 -1
  286. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  287. package/dist/replay/normalizers/shared.d.ts +1 -1
  288. package/dist/replay/runner.d.ts +1 -1
  289. package/dist/replay/types.d.ts +1 -1
  290. package/dist/replica-divergence.d.ts +1 -1
  291. package/dist/replica-peers-config.d.ts +1 -1
  292. package/dist/{resolution-MDPNOEG6.js → resolution-MMOD5WC4.js} +4 -4
  293. package/dist/resolve-auth-token.d.ts +1 -1
  294. package/dist/resume-bundles.js +6 -6
  295. package/dist/retrieval-agents.d.ts +2 -2
  296. package/dist/retrieval-tiers.d.ts +1 -1
  297. package/dist/routing/engine.d.ts +1 -1
  298. package/dist/routing/store.d.ts +1 -1
  299. package/dist/salvage-envelope.d.ts +1 -1
  300. package/dist/salvage-envelope.js +3 -3
  301. package/dist/schemas.d.ts +138 -138
  302. package/dist/{scope-profiles-NzGPDXLn.d.ts → scope-profiles-BBQsXuyj.d.ts} +1 -1
  303. package/dist/search/embed-helper.d.ts +1 -1
  304. package/dist/search/factory.d.ts +1 -1
  305. package/dist/search/index.d.ts +1 -1
  306. package/dist/search/lancedb-backend.d.ts +1 -1
  307. package/dist/search/meilisearch-backend.d.ts +1 -1
  308. package/dist/search/noop-backend.d.ts +1 -1
  309. package/dist/search/orama-backend.d.ts +1 -1
  310. package/dist/search/port.d.ts +1 -1
  311. package/dist/search/remote-backend.d.ts +1 -1
  312. package/dist/{semantic-consolidation-DLDKvyy5.d.ts → semantic-consolidation-HD8RkzVA.d.ts} +1 -1
  313. package/dist/semantic-consolidation.d.ts +2 -2
  314. package/dist/semantic-consolidation.js +13 -13
  315. package/dist/semantic-rule-promotion.js +12 -12
  316. package/dist/semantic-rule-verifier.d.ts +1 -1
  317. package/dist/semantic-rule-verifier.js +12 -12
  318. package/dist/{service-PT2_z7xm.d.ts → service-DIrtHHEg.d.ts} +2 -2
  319. package/dist/session-observer-bands.d.ts +1 -1
  320. package/dist/session-observer-state.d.ts +1 -1
  321. package/dist/shared-context/manager.d.ts +9 -9
  322. package/dist/signal.d.ts +1 -1
  323. package/dist/source-agent-qualifier.d.ts +1 -1
  324. package/dist/source-agent-qualifier.js +14 -14
  325. package/dist/{storage-BmVudhk4.d.ts → storage-DqCzXi56.d.ts} +37 -33
  326. package/dist/storage.d.ts +2 -2
  327. package/dist/storage.js +14 -14
  328. package/dist/structured-attributes.d.ts +3 -1
  329. package/dist/structured-attributes.js +3 -1
  330. package/dist/summarizer.d.ts +1 -1
  331. package/dist/summary-snapshot.d.ts +1 -1
  332. package/dist/temporal-supersession.d.ts +2 -2
  333. package/dist/temporal-timeline-recall.d.ts +1 -1
  334. package/dist/temporal-validity.d.ts +1 -1
  335. package/dist/threading.d.ts +1 -1
  336. package/dist/tier-migration.d.ts +2 -2
  337. package/dist/tier-routing.d.ts +1 -1
  338. package/dist/topics.d.ts +1 -1
  339. package/dist/transcript.d.ts +1 -1
  340. package/dist/transfer/types.d.ts +66 -66
  341. package/dist/trust-score-stage.d.ts +1 -1
  342. package/dist/trust-score.d.ts +1 -1
  343. package/dist/{types-CkiDUorT.d.ts → types-d_j4vC6N.d.ts} +26 -1
  344. package/dist/types.d.ts +1 -1
  345. package/dist/utility-runtime.d.ts +1 -1
  346. package/dist/verified-recall.js +12 -12
  347. package/dist/write-envelope.d.ts +1 -1
  348. package/dist/write-envelope.js +2 -2
  349. package/package.json +2 -2
  350. package/src/access-offline-manifest.ts +1 -0
  351. package/src/access-service-offline-file-content.test.ts +1 -0
  352. package/src/content-hash.ts +34 -1
  353. package/src/dedup/index.test.ts +56 -38
  354. package/src/dedup/index.ts +85 -38
  355. package/src/lifecycle/tombstones.test.ts +763 -16
  356. package/src/lifecycle/tombstones.ts +217 -50
  357. package/src/reconcile/manifest.test.ts +158 -1
  358. package/src/reconcile/manifest.ts +76 -22
  359. package/src/storage/content-hash-index.ts +56 -40
  360. package/src/storage/entity-ref-repair.ts +3 -3
  361. package/src/storage/memory-read-store.ts +9 -0
  362. package/src/storage/tombstone-blocked-capture-index.ts +4 -9
  363. package/src/storage-contract/content-hash.test.ts +13 -0
  364. package/src/storage-fact-hash-index-defer.test.ts +1 -1
  365. package/src/storage.ts +107 -93
  366. package/src/structured-attributes.ts +11 -0
  367. package/src/wearables/cleanup.test.ts +71 -0
  368. package/src/wearables/cleanup.ts +163 -16
  369. package/src/wearables/config.test.ts +62 -0
  370. package/src/wearables/config.ts +99 -5
  371. package/src/wearables/index.ts +10 -0
  372. package/src/wearables/pipeline.test.ts +36 -0
  373. package/src/wearables/pipeline.ts +18 -3
  374. package/src/wearables/redaction.test.ts +156 -0
  375. package/src/wearables/redaction.ts +102 -10
  376. package/src/wearables/text-language.ts +146 -0
  377. package/src/wearables/types.ts +26 -0
  378. package/dist/chunk-BQIFZ2MP.js.map +0 -1
  379. package/dist/chunk-DLG5V6ND.js.map +0 -1
  380. package/dist/chunk-IARXXZU4.js.map +0 -1
  381. package/dist/chunk-JJRVPWFY.js.map +0 -1
  382. package/dist/chunk-NDAH7BJ5.js.map +0 -1
  383. package/dist/chunk-R3DJVOSM.js.map +0 -1
  384. package/dist/chunk-VHFXP27N.js.map +0 -1
  385. package/dist/chunk-W5H6ZRPT.js +0 -14
  386. package/dist/chunk-W5H6ZRPT.js.map +0 -1
  387. package/dist/chunk-WD5B5AIE.js.map +0 -1
  388. /package/dist/{auto-sync-QFQGOEO2.js.map → auto-sync-TDHLZPVP.js.map} +0 -0
  389. /package/dist/{chunk-MLXZD4WM.js.map → chunk-2GFK22OZ.js.map} +0 -0
  390. /package/dist/{chunk-RANKJI5T.js.map → chunk-3JLPGJ43.js.map} +0 -0
  391. /package/dist/{chunk-X7XEDOSL.js.map → chunk-4IIFL7GC.js.map} +0 -0
  392. /package/dist/{chunk-GXSOUIA4.js.map → chunk-5WQMORU5.js.map} +0 -0
  393. /package/dist/{chunk-J272WKX2.js.map → chunk-6HPHEFXT.js.map} +0 -0
  394. /package/dist/{chunk-B6LZ4IBH.js.map → chunk-6LAPLZOS.js.map} +0 -0
  395. /package/dist/{chunk-VXCNQYTC.js.map → chunk-APPFNGX6.js.map} +0 -0
  396. /package/dist/{chunk-GXFSQ6SD.js.map → chunk-C4ZNGVK3.js.map} +0 -0
  397. /package/dist/{chunk-JSEJH2YQ.js.map → chunk-CGVHPCP2.js.map} +0 -0
  398. /package/dist/{chunk-TEMSWHQD.js.map → chunk-DZD576ZU.js.map} +0 -0
  399. /package/dist/{chunk-AMTEYNYK.js.map → chunk-EVWWT3KE.js.map} +0 -0
  400. /package/dist/{chunk-AXIDQG5A.js.map → chunk-G4T7L557.js.map} +0 -0
  401. /package/dist/{chunk-7M6NYQWB.js.map → chunk-G7Z6EENO.js.map} +0 -0
  402. /package/dist/{chunk-YXKVLYXU.js.map → chunk-HWRD23DW.js.map} +0 -0
  403. /package/dist/{chunk-SOEN6KCF.js.map → chunk-IBKR2TFR.js.map} +0 -0
  404. /package/dist/{chunk-F4EU6VUC.js.map → chunk-JDZPNCMA.js.map} +0 -0
  405. /package/dist/{chunk-D5YOZ66N.js.map → chunk-JV5YUBIZ.js.map} +0 -0
  406. /package/dist/{chunk-BAKXNQ3C.js.map → chunk-KRTY3ENI.js.map} +0 -0
  407. /package/dist/{chunk-NK5RGJ65.js.map → chunk-L4DLLKPN.js.map} +0 -0
  408. /package/dist/{chunk-VFSAWRMZ.js.map → chunk-LJS7KUPV.js.map} +0 -0
  409. /package/dist/{chunk-NOEMGE56.js.map → chunk-NH5IR2WM.js.map} +0 -0
  410. /package/dist/{chunk-5V6IXHPI.js.map → chunk-NSVDUN76.js.map} +0 -0
  411. /package/dist/{chunk-W7Y5JDVB.js.map → chunk-PDDTI7IC.js.map} +0 -0
  412. /package/dist/{chunk-QINJITDS.js.map → chunk-PX2LSHYM.js.map} +0 -0
  413. /package/dist/{chunk-HDIUYMSB.js.map → chunk-QWGE2PUH.js.map} +0 -0
  414. /package/dist/{chunk-X57M2Q4I.js.map → chunk-RDJRFDJY.js.map} +0 -0
  415. /package/dist/{chunk-RYLEDKQ2.js.map → chunk-RUMNY5DT.js.map} +0 -0
  416. /package/dist/{chunk-BKIFTXHR.js.map → chunk-RZ4XGKOJ.js.map} +0 -0
  417. /package/dist/{chunk-66SE3BNH.js.map → chunk-SUPEYLH2.js.map} +0 -0
  418. /package/dist/{chunk-BF6SXNQJ.js.map → chunk-T2JHZWH6.js.map} +0 -0
  419. /package/dist/{chunk-QPOHMO6M.js.map → chunk-UES4BHA2.js.map} +0 -0
  420. /package/dist/{chunk-XAPMEU3K.js.map → chunk-UU7TRFNE.js.map} +0 -0
  421. /package/dist/{chunk-QBSFOKY6.js.map → chunk-VOELBUS4.js.map} +0 -0
  422. /package/dist/{chunk-2LY6GIIE.js.map → chunk-WDBX6VER.js.map} +0 -0
  423. /package/dist/{chunk-BMEYMKWX.js.map → chunk-WM65LU67.js.map} +0 -0
  424. /package/dist/{chunk-WLRD2TXF.js.map → chunk-WOPA3SGI.js.map} +0 -0
  425. /package/dist/{chunk-5UZ6UCOZ.js.map → chunk-XUAMCLY4.js.map} +0 -0
  426. /package/dist/{chunk-7HXZJAID.js.map → chunk-YGLY6QFV.js.map} +0 -0
  427. /package/dist/{chunk-2OIQDTDC.js.map → chunk-ZPJ4QSGP.js.map} +0 -0
  428. /package/dist/{chunk-3OY7KXHM.js.map → chunk-ZYLC7NFO.js.map} +0 -0
  429. /package/dist/{resolution-MDPNOEG6.js.map → resolution-MMOD5WC4.js.map} +0 -0
@@ -814,6 +814,19 @@ interface WearableCorrectionRule {
814
814
  */
815
815
  sources?: string[];
816
816
  }
817
+ /**
818
+ * Off-the-record marker configuration (issue #2196). Matching is
819
+ * case-insensitive and phrase-level. Built-in phrases stay active
820
+ * unless `useBuiltIns` is false.
821
+ */
822
+ interface OffTheRecordMarkerSettings {
823
+ /** Extra phrases that begin an off-the-record span. */
824
+ start: string[];
825
+ /** Extra phrases that end an off-the-record span. */
826
+ end: string[];
827
+ /** Include the built-in phrase lists. Default true. */
828
+ useBuiltIns: boolean;
829
+ }
817
830
  /** Top-level wearables configuration (parsed). */
818
831
  interface WearablesConfig {
819
832
  /** Master gate for the whole subsystem. Default false. */
@@ -832,6 +845,18 @@ interface WearablesConfig {
832
845
  * "back on the record" (or conversation end). Default false.
833
846
  */
834
847
  offTheRecordEnabled: boolean;
848
+ /**
849
+ * Off-the-record marker phrases (issue #2196). Built-in phrases cover
850
+ * a documented set of languages; `start`/`end` add more, and
851
+ * `useBuiltIns: false` uses only the configured phrases.
852
+ */
853
+ offTheRecordMarkers: OffTheRecordMarkerSettings;
854
+ /**
855
+ * Extra filler tokens removed when a source enables
856
+ * `cleanup.stripFillers`. Built-in tokens are selected per script; a
857
+ * language outside that set is configured here.
858
+ */
859
+ fillerTokens: string[];
835
860
  /**
836
861
  * Write one compact daily-digest memory per synced source/day.
837
862
  * Default false.
@@ -4706,4 +4731,4 @@ interface HourlySummary {
4706
4731
  generatedAt: string;
4707
4732
  }
4708
4733
 
4709
- export { type ConvergeConflictPolicy as $, type AgentPersonaModelConfig as A, type BriefingSections as B, type CodingContext as C, type DreamsPhase as D, type EntityFile as E, type FaithfulnessFrontmatter as F, type GatewayConfig as G, type HourlySummary as H, type IdentityInjectionMode as I, type MemoryLifecycleEvent as J, type ProvenanceSource as K, type LiveConnectorsConfig as L, type MemoryFile as M, type TrustWeights as N, type ConversationThread as O, type PluginConfig as P, type QmdSearchResult as Q, type RecallPlanMode as R, type SessionObserverBandConfig as S, type TranscriptEntry as T, type LifecycleState as U, type VerificationState as V, type PolicyClass as W, type ReplicaPeersConfig as X, type ReplicaPeerConfig as Y, type ExtractionFailureClass as Z, type ImportanceLevel as _, type DreamsRunResult as a, type WearableNativeMemory as a$, type ActiveRecallChatType as a0, type ActiveRecallQueryMode as a1, type ActiveRecallPromptStyle as a2, type ActiveRecallThinking as a3, type ActiveRecallModelFallbackPolicy as a4, type ExtractionResult as a5, type BehaviorSignalEvent as a6, type BufferSurpriseEvent as a7, type ImportTurn as a8, type BulkImportOptions as a9, summarizeExtractionLiveness as aA, type RetrievalTier as aB, type SignalScanResult as aC, type TopicScore as aD, type ConsolidationResult as aE, type DaySummaryResult as aF, type QmdSearchExplain as aG, type ActivitySnapshot as aH, type ActivityConfig as aI, type ActivitySourceConfig as aJ, type ActivitySourceClient as aK, type FusedWearableConversation as aL, type FusedDayMeta as aM, type FusedDayFile as aN, type MeetingRecord as aO, type MeetingDetectionSource as aP, type FusedMeeting as aQ, type EntityTimelineEntry as aR, type MemoryLink as aS, type BufferState as aT, type FileHygieneConfig as aU, type EntityRelationship as aV, type EntityActivityEntry as aW, type AccessTrackingEntry as aX, type MemorySummary as aY, type WearableConversation as aZ, type WearableSourceSettings as a_, type BulkImportSource as aa, type BulkImportResult as ab, type CompressionGuidelineOptimizerEventCounts as ac, type CompressionGuidelineOptimizerActionSummary as ad, type CompressionGuidelineOptimizerRuleUpdate as ae, type MemoryActionType as af, type MemoryActionEvent as ag, type CompressionGuidelineOptimizerState as ah, type ConvergeConfig as ai, type EntityMention as aj, type DependencyPropagationConfig as ak, type EntitySchemaDefinition as al, type EntitySchemaSectionDefinition as am, type EntityStructuredSection as an, type ExtractedFact as ao, type ProvenanceConfig as ap, type ImportanceScore as aq, type MemoryIntent as ar, type MemoryActionEligibilityContext as as, type MemoryActionPolicyResult as at, type MemoryLifecycleEventType as au, type MemoryLifecycleStateSummary as av, type ModelProviderConfig as aw, type NativeKnowledgeConfig as ax, type ExtractionBufferSource as ay, type MetaState as az, type RecallTierExplain as b, isRecallDisclosure as b$, type WearableMemoryMode as b0, type WearableSourceConnector as b1, type WearablesConfig as b2, type WearableSyncSummary as b3, type WearableSourceStatus as b4, type WearableDayTranscript as b5, type WearableCorrectionRule as b6, type MeetingBuildInput as b7, type MeetingsConfig as b8, type MeetingsDetectionInput as b9, type BriefingConfig as bA, type BriefingOpenCommitment as bB, type BriefingWindow as bC, type BulkImportError as bD, type BulkImportSourceAdapter as bE, type CodexCompatConfig as bF, DEFAULT_RECALL_DISCLOSURE as bG, type DisagreementKind as bH, type FusedContribution as bI, type FusedConversationProvenance as bJ, type FusedSegmentProvenance as bK, type FusionSegmentInput as bL, type ImportSourceRole as bM, type ImportTurnValidationIssue as bN, type MeetingScreenContextEvent as bO, type MeetingSummaryMode as bP, type MemoryActionEligibilitySource as bQ, type MemoryObservation as bR, type MemoryScope as bS, RECALL_DISCLOSURE_LEVELS as bT, type SegmentPickReason as bU, type WearableAuthCheck as bV, type WearableFetchOptions as bW, type WearableFetchPage as bX, type WearableNativeMemoryPage as bY, type WearableTranscriptSegment as bZ, isImportRole as b_, type FusionConversationInput as ba, type MeetingActivitySnapshot as bb, type DetectedMeeting as bc, type DreamsStatusResult as bd, type RecallSectionConfig as be, type BootstrapOptions as bf, type BootstrapResult as bg, type ConsolidationObservation as bh, type CodingModeConfig as bi, type FusedSpeaker as bj, type FusedSegment as bk, type FusedDisagreement as bl, type FusionOptions as bm, type FusionDayResult as bn, type CodingKnowledgeConfig as bo, type WearableCleanupSettings as bp, type WearableFusionConfig as bq, type WearableDayTranscriptMeta as br, type ActivityDayMeta as bs, type ActivityDayDigest as bt, type ActivitySourceCheck as bu, type ActivitySnapshotPage as bv, type MeetingsDetectionConfig as bw, type MeetingAudioWindow as bx, type MeetingAppSpan as by, type ActivityExtractionMode as bz, type BriefingFollowup as c, type GmailLiveConnectorConfig as c$, parseIsoTimestamp as c0, validateImportTurn as c1, type ExtractionLivenessConfig as c2, ExtractionLivenessWarnThrottle as c3, type ExtractionRootStats as c4, type ExtractionWatermarkOrStorage as c5, type ExtractionWatermarkRead as c6, coerceExtractionWatermark as c7, computeExtractionLivenessStatus as c8, evaluateExtractionLiveness as c9, type ChatConfig as cA, type CodexCliReasoningEffort as cB, type CodexCompactionFlushMode as cC, type CodexConnectorConfig as cD, type CodingGraphLspConfig as cE, type CompressionGuidelineActivationState as cF, type CompressionGuidelineOptimizerSourceWindow as cG, type ConfidenceTier as cH, type ConsolidationAction as cI, type ConsolidationItem as cJ, type CronConversationRecallMode as cK, type CronRecallMode as cL, type DreamingConfig as cM, type DreamingNarrativePromptStyle as cN, type DreamsDeepSleepConfig as cO, type DreamsLightSleepConfig as cP, type DreamsPhaseStatus as cQ, type DreamsPhasesConfig as cR, type DreamsRemConfig as cS, type EngramTraceEvent as cT, type ExtractedProcedureStep as cU, type ExtractedQuestion as cV, type ExtractedReasoningTrace as cW, type ExtractedReasoningTraceStep as cX, type ExtractedRelationship as cY, type ExtractionPassSource as cZ, type GitHubLiveConnectorConfig as c_, formatAgeMs as ca, gatherExtractionLivenessStatus as cb, parseExtractionLivenessConfig as cc, renderExtractionLivenessStats as cd, resolveExtractionLivenessConfig as ce, parseReplicaPeersConfig as cf, resolveReplicaPeersConfig as cg, type AmbientCaptureProvenance as ch, type BufferTurnOwner as ci, ProbeTimeoutError as cj, bufferTurnArrayIsSuffixOfSnapshot as ck, bufferTurnArraysEqual as cl, bufferTurnsEqual as cm, copyBufferTurn as cn, describeError as co, liveTurnsFromExtractionSnapshot as cp, matchingQueuedExtractionPrefixLength as cq, probeWithTimeout as cr, type AgentAccessHttpConfig as cs, type AgentDefaultsConfig as ct, type AgentPersona as cu, type BehaviorLoopAdjustment as cv, type BehaviorSignalDirection as cw, type BehaviorSignalType as cx, type BriefingCalendarSourceError as cy, type BufferEntryState as cz, type BriefingFocus as d, type GoogleDriveLiveConnectorConfig as d0, type HeartbeatConfig as d1, type HeartbeatDetectionMode as d2, type LlmTraceCallback as d3, type LlmTraceEvent as d4, type MemoryActionOutcome as d5, type MemoryActionPolicyDecision as d6, type MemoryActionStatus as d7, type MemoryLinkType as d8, type MemoryOsPresetName as d9, type TriggerMode as dA, confidenceTier as dB, type ModelApi as da, type ModelDefinitionConfig as db, type ModelProviderAuthMode as dc, type NamespacePolicy as dd, type NativeKnowledgeFolderRuleConfig as de, type NativeKnowledgeObsidianVaultConfig as df, type NativeKnowledgeOpenClawWorkspaceConfig as dg, type NotionLiveConnectorConfig as dh, type PrincipalFromSessionKeyMode as di, type PrincipalRule as dj, type ProceduralConfig as dk, type QuestionEntry as dl, type ReasoningEffort as dm, type RecallPipelineConfig as dn, type RecallTraceEvent as dp, type RelevanceFeedback as dq, SPECULATIVE_TTL_DAYS as dr, type ScopeProfileAutoPromoteConfig as ds, type ScopeProfileTeamProjectConfig as dt, type ScopeTeamConfig as du, type ScoredEntity as dv, type SemanticChunkingConfigShape as dw, type SignalLevel as dx, type SlotBehaviorConfig as dy, type SlotMismatchMode as dz, type CalendarSource as e, type CalendarEvent as f, type BriefingActiveThread as g, type BriefingResult as h, type BriefingRecentEntity as i, type BufferTurn as j, type ExtractionBufferSnapshot as k, type MemoryFrontmatter as l, type Checkpoint as m, type RecallDisclosure as n, type SourceConnectorProvenance as o, type ScopeProfileConfig as p, type ScopeProfileLayerId as q, type ScopeProfilePromotionTarget as r, type BehaviorLoopPolicyState as s, type SecretRef as t, type AgentAccessAuthToken as u, type ExtractionLivenessStatus as v, type MemoryCategory as w, type CaptureMode as x, type MemoryStatus as y, type MemoryProjectionCurrentState as z };
4734
+ export { type ConvergeConflictPolicy as $, type AgentPersonaModelConfig as A, type BriefingSections as B, type CodingContext as C, type DreamsPhase as D, type EntityFile as E, type FaithfulnessFrontmatter as F, type GatewayConfig as G, type HourlySummary as H, type IdentityInjectionMode as I, type MemoryLifecycleEvent as J, type ProvenanceSource as K, type LiveConnectorsConfig as L, type MemoryFile as M, type TrustWeights as N, type ConversationThread as O, type PluginConfig as P, type QmdSearchResult as Q, type RecallPlanMode as R, type SessionObserverBandConfig as S, type TranscriptEntry as T, type LifecycleState as U, type VerificationState as V, type PolicyClass as W, type ReplicaPeersConfig as X, type ReplicaPeerConfig as Y, type ExtractionFailureClass as Z, type ImportanceLevel as _, type DreamsRunResult as a, type WearableNativeMemory as a$, type ActiveRecallChatType as a0, type ActiveRecallQueryMode as a1, type ActiveRecallPromptStyle as a2, type ActiveRecallThinking as a3, type ActiveRecallModelFallbackPolicy as a4, type ExtractionResult as a5, type BehaviorSignalEvent as a6, type BufferSurpriseEvent as a7, type ImportTurn as a8, type BulkImportOptions as a9, summarizeExtractionLiveness as aA, type RetrievalTier as aB, type SignalScanResult as aC, type TopicScore as aD, type ConsolidationResult as aE, type DaySummaryResult as aF, type QmdSearchExplain as aG, type ActivitySnapshot as aH, type ActivityConfig as aI, type ActivitySourceConfig as aJ, type ActivitySourceClient as aK, type FusedWearableConversation as aL, type FusedDayMeta as aM, type FusedDayFile as aN, type MeetingRecord as aO, type MeetingDetectionSource as aP, type FusedMeeting as aQ, type EntityTimelineEntry as aR, type MemoryLink as aS, type BufferState as aT, type FileHygieneConfig as aU, type EntityRelationship as aV, type EntityActivityEntry as aW, type AccessTrackingEntry as aX, type MemorySummary as aY, type WearableConversation as aZ, type WearableSourceSettings as a_, type BulkImportSource as aa, type BulkImportResult as ab, type CompressionGuidelineOptimizerEventCounts as ac, type CompressionGuidelineOptimizerActionSummary as ad, type CompressionGuidelineOptimizerRuleUpdate as ae, type MemoryActionType as af, type MemoryActionEvent as ag, type CompressionGuidelineOptimizerState as ah, type ConvergeConfig as ai, type EntityMention as aj, type DependencyPropagationConfig as ak, type EntitySchemaDefinition as al, type EntitySchemaSectionDefinition as am, type EntityStructuredSection as an, type ExtractedFact as ao, type ProvenanceConfig as ap, type ImportanceScore as aq, type MemoryIntent as ar, type MemoryActionEligibilityContext as as, type MemoryActionPolicyResult as at, type MemoryLifecycleEventType as au, type MemoryLifecycleStateSummary as av, type ModelProviderConfig as aw, type NativeKnowledgeConfig as ax, type ExtractionBufferSource as ay, type MetaState as az, type RecallTierExplain as b, isImportRole as b$, type WearableMemoryMode as b0, type WearableSourceConnector as b1, type WearablesConfig as b2, type WearableSyncSummary as b3, type WearableSourceStatus as b4, type WearableDayTranscript as b5, type WearableCorrectionRule as b6, type MeetingBuildInput as b7, type MeetingsConfig as b8, type MeetingsDetectionInput as b9, type ActivityExtractionMode as bA, type BriefingConfig as bB, type BriefingOpenCommitment as bC, type BriefingWindow as bD, type BulkImportError as bE, type BulkImportSourceAdapter as bF, type CodexCompatConfig as bG, DEFAULT_RECALL_DISCLOSURE as bH, type DisagreementKind as bI, type FusedContribution as bJ, type FusedConversationProvenance as bK, type FusedSegmentProvenance as bL, type FusionSegmentInput as bM, type ImportSourceRole as bN, type ImportTurnValidationIssue as bO, type MeetingScreenContextEvent as bP, type MeetingSummaryMode as bQ, type MemoryActionEligibilitySource as bR, type MemoryObservation as bS, type MemoryScope as bT, RECALL_DISCLOSURE_LEVELS as bU, type SegmentPickReason as bV, type WearableAuthCheck as bW, type WearableFetchOptions as bX, type WearableFetchPage as bY, type WearableNativeMemoryPage as bZ, type WearableTranscriptSegment as b_, type FusionConversationInput as ba, type MeetingActivitySnapshot as bb, type DetectedMeeting as bc, type DreamsStatusResult as bd, type RecallSectionConfig as be, type BootstrapOptions as bf, type BootstrapResult as bg, type ConsolidationObservation as bh, type CodingModeConfig as bi, type FusedSpeaker as bj, type FusedSegment as bk, type FusedDisagreement as bl, type FusionOptions as bm, type FusionDayResult as bn, type CodingKnowledgeConfig as bo, type WearableCleanupSettings as bp, type WearableFusionConfig as bq, type OffTheRecordMarkerSettings as br, type WearableDayTranscriptMeta as bs, type ActivityDayMeta as bt, type ActivityDayDigest as bu, type ActivitySourceCheck as bv, type ActivitySnapshotPage as bw, type MeetingsDetectionConfig as bx, type MeetingAudioWindow as by, type MeetingAppSpan as bz, type BriefingFollowup as c, type GitHubLiveConnectorConfig as c$, isRecallDisclosure as c0, parseIsoTimestamp as c1, validateImportTurn as c2, type ExtractionLivenessConfig as c3, ExtractionLivenessWarnThrottle as c4, type ExtractionRootStats as c5, type ExtractionWatermarkOrStorage as c6, type ExtractionWatermarkRead as c7, coerceExtractionWatermark as c8, computeExtractionLivenessStatus as c9, type BufferEntryState as cA, type ChatConfig as cB, type CodexCliReasoningEffort as cC, type CodexCompactionFlushMode as cD, type CodexConnectorConfig as cE, type CodingGraphLspConfig as cF, type CompressionGuidelineActivationState as cG, type CompressionGuidelineOptimizerSourceWindow as cH, type ConfidenceTier as cI, type ConsolidationAction as cJ, type ConsolidationItem as cK, type CronConversationRecallMode as cL, type CronRecallMode as cM, type DreamingConfig as cN, type DreamingNarrativePromptStyle as cO, type DreamsDeepSleepConfig as cP, type DreamsLightSleepConfig as cQ, type DreamsPhaseStatus as cR, type DreamsPhasesConfig as cS, type DreamsRemConfig as cT, type EngramTraceEvent as cU, type ExtractedProcedureStep as cV, type ExtractedQuestion as cW, type ExtractedReasoningTrace as cX, type ExtractedReasoningTraceStep as cY, type ExtractedRelationship as cZ, type ExtractionPassSource as c_, evaluateExtractionLiveness as ca, formatAgeMs as cb, gatherExtractionLivenessStatus as cc, parseExtractionLivenessConfig as cd, renderExtractionLivenessStats as ce, resolveExtractionLivenessConfig as cf, parseReplicaPeersConfig as cg, resolveReplicaPeersConfig as ch, type AmbientCaptureProvenance as ci, type BufferTurnOwner as cj, ProbeTimeoutError as ck, bufferTurnArrayIsSuffixOfSnapshot as cl, bufferTurnArraysEqual as cm, bufferTurnsEqual as cn, copyBufferTurn as co, describeError as cp, liveTurnsFromExtractionSnapshot as cq, matchingQueuedExtractionPrefixLength as cr, probeWithTimeout as cs, type AgentAccessHttpConfig as ct, type AgentDefaultsConfig as cu, type AgentPersona as cv, type BehaviorLoopAdjustment as cw, type BehaviorSignalDirection as cx, type BehaviorSignalType as cy, type BriefingCalendarSourceError as cz, type BriefingFocus as d, type GmailLiveConnectorConfig as d0, type GoogleDriveLiveConnectorConfig as d1, type HeartbeatConfig as d2, type HeartbeatDetectionMode as d3, type LlmTraceCallback as d4, type LlmTraceEvent as d5, type MemoryActionOutcome as d6, type MemoryActionPolicyDecision as d7, type MemoryActionStatus as d8, type MemoryLinkType as d9, type SlotMismatchMode as dA, type TriggerMode as dB, confidenceTier as dC, type MemoryOsPresetName as da, type ModelApi as db, type ModelDefinitionConfig as dc, type ModelProviderAuthMode as dd, type NamespacePolicy as de, type NativeKnowledgeFolderRuleConfig as df, type NativeKnowledgeObsidianVaultConfig as dg, type NativeKnowledgeOpenClawWorkspaceConfig as dh, type NotionLiveConnectorConfig as di, type PrincipalFromSessionKeyMode as dj, type PrincipalRule as dk, type ProceduralConfig as dl, type QuestionEntry as dm, type ReasoningEffort as dn, type RecallPipelineConfig as dp, type RecallTraceEvent as dq, type RelevanceFeedback as dr, SPECULATIVE_TTL_DAYS as ds, type ScopeProfileAutoPromoteConfig as dt, type ScopeProfileTeamProjectConfig as du, type ScopeTeamConfig as dv, type ScoredEntity as dw, type SemanticChunkingConfigShape as dx, type SignalLevel as dy, type SlotBehaviorConfig as dz, type CalendarSource as e, type CalendarEvent as f, type BriefingActiveThread as g, type BriefingResult as h, type BriefingRecentEntity as i, type BufferTurn as j, type ExtractionBufferSnapshot as k, type MemoryFrontmatter as l, type Checkpoint as m, type RecallDisclosure as n, type SourceConnectorProvenance as o, type ScopeProfileConfig as p, type ScopeProfileLayerId as q, type ScopeProfilePromotionTarget as r, type BehaviorLoopPolicyState as s, type SecretRef as t, type AgentAccessAuthToken as u, type ExtractionLivenessStatus as v, type MemoryCategory as w, type CaptureMode as x, type MemoryStatus as y, type MemoryProjectionCurrentState as z };
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { aX as AccessTrackingEntry, a0 as ActiveRecallChatType, a4 as ActiveRecallModelFallbackPolicy, a2 as ActiveRecallPromptStyle, a1 as ActiveRecallQueryMode, a3 as ActiveRecallThinking, u as AgentAccessAuthToken, cs as AgentAccessHttpConfig, ct as AgentDefaultsConfig, cu as AgentPersona, A as AgentPersonaModelConfig, cv as BehaviorLoopAdjustment, s as BehaviorLoopPolicyState, cw as BehaviorSignalDirection, a6 as BehaviorSignalEvent, cx as BehaviorSignalType, bf as BootstrapOptions, bg as BootstrapResult, g as BriefingActiveThread, cy as BriefingCalendarSourceError, bA as BriefingConfig, d as BriefingFocus, c as BriefingFollowup, bB as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bC as BriefingWindow, cz as BufferEntryState, aT as BufferState, a7 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, e as CalendarSource, x as CaptureMode, cA as ChatConfig, m as Checkpoint, cB as CodexCliReasoningEffort, cC as CodexCompactionFlushMode, bF as CodexCompatConfig, cD as CodexConnectorConfig, C as CodingContext, cE as CodingGraphLspConfig, bo as CodingKnowledgeConfig, bi as CodingModeConfig, cF as CompressionGuidelineActivationState, ad as CompressionGuidelineOptimizerActionSummary, ac as CompressionGuidelineOptimizerEventCounts, ae as CompressionGuidelineOptimizerRuleUpdate, cG as CompressionGuidelineOptimizerSourceWindow, ah as CompressionGuidelineOptimizerState, cH as ConfidenceTier, cI as ConsolidationAction, cJ as ConsolidationItem, bh as ConsolidationObservation, aE as ConsolidationResult, ai as ConvergeConfig, $ as ConvergeConflictPolicy, O as ConversationThread, cK as CronConversationRecallMode, cL as CronRecallMode, bG as DEFAULT_RECALL_DISCLOSURE, aF as DaySummaryResult, ak as DependencyPropagationConfig, cM as DreamingConfig, cN as DreamingNarrativePromptStyle, cO as DreamsDeepSleepConfig, cP as DreamsLightSleepConfig, D as DreamsPhase, cQ as DreamsPhaseStatus, cR as DreamsPhasesConfig, cS as DreamsRemConfig, a as DreamsRunResult, bd as DreamsStatusResult, cT as EngramTraceEvent, aW as EntityActivityEntry, E as EntityFile, aj as EntityMention, aV as EntityRelationship, al as EntitySchemaDefinition, am as EntitySchemaSectionDefinition, an as EntityStructuredSection, aR as EntityTimelineEntry, ao as ExtractedFact, cU as ExtractedProcedureStep, cV as ExtractedQuestion, cW as ExtractedReasoningTrace, cX as ExtractedReasoningTraceStep, cY as ExtractedRelationship, Z as ExtractionFailureClass, cZ as ExtractionPassSource, a5 as ExtractionResult, F as FaithfulnessFrontmatter, aU as FileHygieneConfig, G as GatewayConfig, c_ as GitHubLiveConnectorConfig, c$ as GmailLiveConnectorConfig, d0 as GoogleDriveLiveConnectorConfig, d1 as HeartbeatConfig, d2 as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, _ as ImportanceLevel, aq as ImportanceScore, U as LifecycleState, L as LiveConnectorsConfig, d3 as LlmTraceCallback, d4 as LlmTraceEvent, as as MemoryActionEligibilityContext, bQ as MemoryActionEligibilitySource, ag as MemoryActionEvent, d5 as MemoryActionOutcome, d6 as MemoryActionPolicyDecision, at as MemoryActionPolicyResult, d7 as MemoryActionStatus, af as MemoryActionType, w as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, ar as MemoryIntent, J as MemoryLifecycleEvent, au as MemoryLifecycleEventType, av as MemoryLifecycleStateSummary, aS as MemoryLink, d8 as MemoryLinkType, bR as MemoryObservation, d9 as MemoryOsPresetName, z as MemoryProjectionCurrentState, bS as MemoryScope, y as MemoryStatus, aY as MemorySummary, az as MetaState, da as ModelApi, db as ModelDefinitionConfig, dc as ModelProviderAuthMode, aw as ModelProviderConfig, dd as NamespacePolicy, ax as NativeKnowledgeConfig, de as NativeKnowledgeFolderRuleConfig, df as NativeKnowledgeObsidianVaultConfig, dg as NativeKnowledgeOpenClawWorkspaceConfig, dh as NotionLiveConnectorConfig, P as PluginConfig, W as PolicyClass, di as PrincipalFromSessionKeyMode, dj as PrincipalRule, dk as ProceduralConfig, ap as ProvenanceConfig, K as ProvenanceSource, aG as QmdSearchExplain, Q as QmdSearchResult, dl as QuestionEntry, bT as RECALL_DISCLOSURE_LEVELS, dm as ReasoningEffort, n as RecallDisclosure, dn as RecallPipelineConfig, R as RecallPlanMode, be as RecallSectionConfig, b as RecallTierExplain, dp as RecallTraceEvent, dq as RelevanceFeedback, aB as RetrievalTier, dr as SPECULATIVE_TTL_DAYS, ds as ScopeProfileAutoPromoteConfig, p as ScopeProfileConfig, q as ScopeProfileLayerId, r as ScopeProfilePromotionTarget, dt as ScopeProfileTeamProjectConfig, du as ScopeTeamConfig, dv as ScoredEntity, t as SecretRef, dw as SemanticChunkingConfigShape, S as SessionObserverBandConfig, dx as SignalLevel, aC as SignalScanResult, dy as SlotBehaviorConfig, dz as SlotMismatchMode, o as SourceConnectorProvenance, aD as TopicScore, T as TranscriptEntry, dA as TriggerMode, N as TrustWeights, V as VerificationState, dB as confidenceTier, b$ as isRecallDisclosure } from './types-CkiDUorT.js';
1
+ export { aX as AccessTrackingEntry, a0 as ActiveRecallChatType, a4 as ActiveRecallModelFallbackPolicy, a2 as ActiveRecallPromptStyle, a1 as ActiveRecallQueryMode, a3 as ActiveRecallThinking, u as AgentAccessAuthToken, ct as AgentAccessHttpConfig, cu as AgentDefaultsConfig, cv as AgentPersona, A as AgentPersonaModelConfig, cw as BehaviorLoopAdjustment, s as BehaviorLoopPolicyState, cx as BehaviorSignalDirection, a6 as BehaviorSignalEvent, cy as BehaviorSignalType, bf as BootstrapOptions, bg as BootstrapResult, g as BriefingActiveThread, cz as BriefingCalendarSourceError, bB as BriefingConfig, d as BriefingFocus, c as BriefingFollowup, bC as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bD as BriefingWindow, cA as BufferEntryState, aT as BufferState, a7 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, e as CalendarSource, x as CaptureMode, cB as ChatConfig, m as Checkpoint, cC as CodexCliReasoningEffort, cD as CodexCompactionFlushMode, bG as CodexCompatConfig, cE as CodexConnectorConfig, C as CodingContext, cF as CodingGraphLspConfig, bo as CodingKnowledgeConfig, bi as CodingModeConfig, cG as CompressionGuidelineActivationState, ad as CompressionGuidelineOptimizerActionSummary, ac as CompressionGuidelineOptimizerEventCounts, ae as CompressionGuidelineOptimizerRuleUpdate, cH as CompressionGuidelineOptimizerSourceWindow, ah as CompressionGuidelineOptimizerState, cI as ConfidenceTier, cJ as ConsolidationAction, cK as ConsolidationItem, bh as ConsolidationObservation, aE as ConsolidationResult, ai as ConvergeConfig, $ as ConvergeConflictPolicy, O as ConversationThread, cL as CronConversationRecallMode, cM as CronRecallMode, bH as DEFAULT_RECALL_DISCLOSURE, aF as DaySummaryResult, ak as DependencyPropagationConfig, cN as DreamingConfig, cO as DreamingNarrativePromptStyle, cP as DreamsDeepSleepConfig, cQ as DreamsLightSleepConfig, D as DreamsPhase, cR as DreamsPhaseStatus, cS as DreamsPhasesConfig, cT as DreamsRemConfig, a as DreamsRunResult, bd as DreamsStatusResult, cU as EngramTraceEvent, aW as EntityActivityEntry, E as EntityFile, aj as EntityMention, aV as EntityRelationship, al as EntitySchemaDefinition, am as EntitySchemaSectionDefinition, an as EntityStructuredSection, aR as EntityTimelineEntry, ao as ExtractedFact, cV as ExtractedProcedureStep, cW as ExtractedQuestion, cX as ExtractedReasoningTrace, cY as ExtractedReasoningTraceStep, cZ as ExtractedRelationship, Z as ExtractionFailureClass, c_ as ExtractionPassSource, a5 as ExtractionResult, F as FaithfulnessFrontmatter, aU as FileHygieneConfig, G as GatewayConfig, c$ as GitHubLiveConnectorConfig, d0 as GmailLiveConnectorConfig, d1 as GoogleDriveLiveConnectorConfig, d2 as HeartbeatConfig, d3 as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, _ as ImportanceLevel, aq as ImportanceScore, U as LifecycleState, L as LiveConnectorsConfig, d4 as LlmTraceCallback, d5 as LlmTraceEvent, as as MemoryActionEligibilityContext, bR as MemoryActionEligibilitySource, ag as MemoryActionEvent, d6 as MemoryActionOutcome, d7 as MemoryActionPolicyDecision, at as MemoryActionPolicyResult, d8 as MemoryActionStatus, af as MemoryActionType, w as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, ar as MemoryIntent, J as MemoryLifecycleEvent, au as MemoryLifecycleEventType, av as MemoryLifecycleStateSummary, aS as MemoryLink, d9 as MemoryLinkType, bS as MemoryObservation, da as MemoryOsPresetName, z as MemoryProjectionCurrentState, bT as MemoryScope, y as MemoryStatus, aY as MemorySummary, az as MetaState, db as ModelApi, dc as ModelDefinitionConfig, dd as ModelProviderAuthMode, aw as ModelProviderConfig, de as NamespacePolicy, ax as NativeKnowledgeConfig, df as NativeKnowledgeFolderRuleConfig, dg as NativeKnowledgeObsidianVaultConfig, dh as NativeKnowledgeOpenClawWorkspaceConfig, di as NotionLiveConnectorConfig, P as PluginConfig, W as PolicyClass, dj as PrincipalFromSessionKeyMode, dk as PrincipalRule, dl as ProceduralConfig, ap as ProvenanceConfig, K as ProvenanceSource, aG as QmdSearchExplain, Q as QmdSearchResult, dm as QuestionEntry, bU as RECALL_DISCLOSURE_LEVELS, dn as ReasoningEffort, n as RecallDisclosure, dp as RecallPipelineConfig, R as RecallPlanMode, be as RecallSectionConfig, b as RecallTierExplain, dq as RecallTraceEvent, dr as RelevanceFeedback, aB as RetrievalTier, ds as SPECULATIVE_TTL_DAYS, dt as ScopeProfileAutoPromoteConfig, p as ScopeProfileConfig, q as ScopeProfileLayerId, r as ScopeProfilePromotionTarget, du as ScopeProfileTeamProjectConfig, dv as ScopeTeamConfig, dw as ScoredEntity, t as SecretRef, dx as SemanticChunkingConfigShape, S as SessionObserverBandConfig, dy as SignalLevel, aC as SignalScanResult, dz as SlotBehaviorConfig, dA as SlotMismatchMode, o as SourceConnectorProvenance, aD as TopicScore, T as TranscriptEntry, dB as TriggerMode, N as TrustWeights, V as VerificationState, dC as confidenceTier, c0 as isRecallDisclosure } from './types-d_j4vC6N.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './external-wiki-config.js';
@@ -1,5 +1,5 @@
1
1
  import { TierRoutingPolicy } from './tier-routing.js';
2
- import './types-CkiDUorT.js';
2
+ import './types-d_j4vC6N.js';
3
3
  import './message-parts/index.js';
4
4
  import './bounded-jsonl-state.js';
5
5
  import './operator-doctor-types.js';
@@ -1,14 +1,13 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-J272WKX2.js";
4
+ } from "./chunk-6HPHEFXT.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-WD5B5AIE.js";
6
+ import "./chunk-6R4G7N4S.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
- import "./chunk-JJRVPWFY.js";
8
+ import "./chunk-MLPTFODV.js";
9
9
  import "./chunk-SXIMQLGV.js";
10
10
  import "./chunk-S2V7RUCL.js";
11
- import "./chunk-J6A3CX5N.js";
12
11
  import "./chunk-UU3G6GUP.js";
13
12
  import "./chunk-SCU65EZI.js";
14
13
  import "./chunk-WRJVB3C2.js";
@@ -17,10 +16,9 @@ import "./chunk-DM2T26WE.js";
17
16
  import "./chunk-LDXUBPMO.js";
18
17
  import "./chunk-JYIJNNN3.js";
19
18
  import "./chunk-AAD2ZS6P.js";
20
- import "./chunk-DLG5V6ND.js";
21
- import "./chunk-5V6IXHPI.js";
19
+ import "./chunk-K4QS7LXU.js";
20
+ import "./chunk-NSVDUN76.js";
22
21
  import "./chunk-BT7NVCML.js";
23
- import "./chunk-R3DJVOSM.js";
24
22
  import "./chunk-YXZG5TVN.js";
25
23
  import "./chunk-5GINB5LC.js";
26
24
  import "./chunk-G7D6GZ5J.js";
@@ -38,12 +36,10 @@ import "./chunk-RGMVMVMF.js";
38
36
  import "./chunk-N7RWREIQ.js";
39
37
  import "./chunk-XMMESCPD.js";
40
38
  import "./chunk-42JKGUFJ.js";
41
- import "./chunk-QBSFOKY6.js";
42
- import "./chunk-5GKPFL3S.js";
39
+ import "./chunk-VOELBUS4.js";
43
40
  import "./chunk-ZIKENA2C.js";
44
41
  import "./chunk-PQVCH2AE.js";
45
42
  import "./chunk-6MKAMLQL.js";
46
- import "./chunk-JAKIDQB2.js";
47
43
  import "./chunk-W5BIQOAJ.js";
48
44
  import "./chunk-Z7L72ZHL.js";
49
45
  import "./chunk-4O4TKIXQ.js";
@@ -51,16 +47,20 @@ import "./chunk-ZBJMUXZH.js";
51
47
  import "./chunk-BJMBJZ2Y.js";
52
48
  import "./chunk-UKJAGEXH.js";
53
49
  import "./chunk-FP2373TW.js";
50
+ import "./chunk-J6A3CX5N.js";
54
51
  import "./chunk-7FGL6CGA.js";
55
52
  import "./chunk-EGGE52UU.js";
56
53
  import "./chunk-ZA53AZND.js";
57
54
  import "./chunk-GCASGYIO.js";
58
55
  import "./chunk-7RJUVTVF.js";
59
- import "./chunk-BQIFZ2MP.js";
56
+ import "./chunk-CX5SW2EW.js";
60
57
  import "./chunk-3CSX3ETE.js";
61
58
  import "./chunk-RL6NEVXT.js";
59
+ import "./chunk-JDSVLVCG.js";
62
60
  import "./chunk-FFAZ2XFU.js";
63
- import "./chunk-W5H6ZRPT.js";
61
+ import "./chunk-5FVVY2EB.js";
62
+ import "./chunk-5GKPFL3S.js";
63
+ import "./chunk-JAKIDQB2.js";
64
64
  import "./chunk-P7FMDTKL.js";
65
65
  import "./chunk-2XRE6FLM.js";
66
66
  import "./chunk-EYIEWJNI.js";
@@ -1,4 +1,4 @@
1
- import { w as MemoryCategory } from './types-CkiDUorT.js';
1
+ import { w as MemoryCategory } from './types-d_j4vC6N.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './operator-doctor-types.js';
@@ -11,9 +11,9 @@ import {
11
11
  isMemoryCategory,
12
12
  isSealedMemoryEnvelope,
13
13
  sealedWriteToLegacyArgs
14
- } from "./chunk-5V6IXHPI.js";
14
+ } from "./chunk-NSVDUN76.js";
15
15
  import "./chunk-BT7NVCML.js";
16
- import "./chunk-R3DJVOSM.js";
16
+ import "./chunk-JDSVLVCG.js";
17
17
  import "./chunk-5GKPFL3S.js";
18
18
  import "./chunk-JAKIDQB2.js";
19
19
  import "./chunk-P7FMDTKL.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.52.2",
3
+ "version": "9.54.0",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3126,7 +3126,7 @@
3126
3126
  "core"
3127
3127
  ],
3128
3128
  "peerDependencies": {
3129
- "@remnic/coding-graph": "^9.52.2"
3129
+ "@remnic/coding-graph": "^9.54.0"
3130
3130
  },
3131
3131
  "peerDependenciesMeta": {
3132
3132
  "@remnic/coding-graph": {
@@ -47,6 +47,7 @@ export async function createOfflineSyncManifestStream(
47
47
  file,
48
48
  async ({ path }) => storage.readOfflineSyncFile(nodePath.join(storage.dir, path)),
49
49
  parseMemory,
50
+ orchestrator.config.inlineSourceAttributionFormat,
50
51
  );
51
52
  }
52
53
  })(),
@@ -194,6 +194,7 @@ test("offline manifest streams body-free active, archived, old, bad, and encrypt
194
194
  id: "active-memory",
195
195
  category: "fact",
196
196
  contentHash: activeContentHash,
197
+ normalizerVersion: 4,
197
198
  status: "active",
198
199
  });
199
200
  assert.notEqual(rowsByPath.get("facts/active.md")?.sha256, activeContentHash);
@@ -9,8 +9,18 @@
9
9
 
10
10
  import { createHash } from "node:crypto";
11
11
 
12
- /** Normalize content: lowercase, strip non-alphanumerics, collapse whitespace. */
12
+ /** Normalize content: preserve Unicode letters, marks, and numbers. */
13
13
  export function normalizeContent(content: string): string {
14
+ return content
15
+ .normalize("NFC")
16
+ .toLowerCase()
17
+ .replace(/[^\p{L}\p{M}\p{N}\s]/gu, " ")
18
+ .replace(/\s+/g, " ")
19
+ .trim();
20
+ }
21
+
22
+ /** Normalize content with the pre-Unicode ASCII-only normalizer. */
23
+ export function normalizeLegacyContent(content: string): string {
14
24
  return content
15
25
  .toLowerCase()
16
26
  .replace(/[^a-z0-9\s]/g, " ")
@@ -18,6 +28,29 @@ export function normalizeContent(content: string): string {
18
28
  .trim();
19
29
  }
20
30
 
31
+ /** Compute the SHA-256 hash used by pre-Unicode content indexes. */
32
+ export function computeLegacyContentHash(content: string): string {
33
+ return createHash("sha256").update(normalizeLegacyContent(content)).digest("hex");
34
+ }
35
+
36
+ /**
37
+ * Return true only when a persisted legacy hash can be proved to identify the
38
+ * same body under the current normalizer. Empty or changed legacy forms are
39
+ * ambiguous and must not be promoted to a current identity.
40
+ */
41
+ export function isUnambiguousLegacyContentHash(
42
+ content: string,
43
+ contentHash: string,
44
+ currentNormalizedText: string = normalizeContent(content),
45
+ ): boolean {
46
+ const legacyNormalizedText = normalizeLegacyContent(content);
47
+ return (
48
+ legacyNormalizedText.length > 0 &&
49
+ legacyNormalizedText === currentNormalizedText &&
50
+ createHash("sha256").update(legacyNormalizedText).digest("hex") === contentHash
51
+ );
52
+ }
53
+
21
54
  /** Normalize content and compute SHA-256 hash. */
22
55
  export function computeContentHash(content: string): string {
23
56
  return createHash("sha256").update(normalizeContent(content)).digest("hex");
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdtemp, mkdir, rm, symlink, writeFile } from "node:fs/promises";
2
+ import { mkdir, mkdtemp, rm, symlink, writeFile } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import path from "node:path";
5
5
  import test from "node:test";
@@ -14,25 +14,13 @@ test("findContradictions detects can versus cannot statements", async () => {
14
14
  await mkdir(factsDir);
15
15
  await writeFile(
16
16
  path.join(factsDir, "can.md"),
17
- [
18
- "---",
19
- "id: mem-can",
20
- "category: fact",
21
- "---",
22
- "The user can access production.",
23
- ].join("\n"),
24
- "utf8",
17
+ ["---", "id: mem-can", "category: fact", "---", "The user can access production."].join("\n"),
18
+ "utf8"
25
19
  );
26
20
  await writeFile(
27
21
  path.join(factsDir, "cannot.md"),
28
- [
29
- "---",
30
- "id: mem-cannot",
31
- "category: fact",
32
- "---",
33
- "The user cannot access production.",
34
- ].join("\n"),
35
- "utf8",
22
+ ["---", "id: mem-cannot", "category: fact", "---", "The user cannot access production."].join("\n"),
23
+ "utf8"
36
24
  );
37
25
 
38
26
  const result = findContradictions({ memoryDir, categories: ["facts"] });
@@ -58,14 +46,8 @@ test("dedup public numeric options are normalized before scanning", async () =>
58
46
  ] as const) {
59
47
  await writeFile(
60
48
  path.join(factsDir, fileName),
61
- [
62
- "---",
63
- `id: ${id}`,
64
- "category: fact",
65
- "---",
66
- content,
67
- ].join("\n"),
68
- "utf8",
49
+ ["---", `id: ${id}`, "category: fact", "---", content].join("\n"),
50
+ "utf8"
69
51
  );
70
52
  }
71
53
 
@@ -95,6 +77,51 @@ test("dedup public numeric options are normalized before scanning", async () =>
95
77
  }
96
78
  });
97
79
 
80
+ test("dedup keeps duplicate and distinct pairs across Unicode scripts", async () => {
81
+ const memoryDir = await mkdtemp(path.join(tmpdir(), "remnic-dedup-unicode-"));
82
+
83
+ try {
84
+ const factsDir = path.join(memoryDir, "facts");
85
+ await mkdir(factsDir);
86
+ const entries = [
87
+ ["english-a.md", "mem-english-a", "The user prefers tea."],
88
+ ["english-b.md", "mem-english-b", "The user prefers tea"],
89
+ ["english-c.md", "mem-english-c", "The user prefers coffee."],
90
+ ["japanese-a.md", "mem-japanese-a", "利用者は紅茶を好む。"],
91
+ ["japanese-b.md", "mem-japanese-b", "利用者は紅茶を好む。"],
92
+ ["japanese-c.md", "mem-japanese-c", "利用者は珈琲を好む。"],
93
+ ["korean-a.md", "mem-korean-a", "사용자는홍차를좋아한다"],
94
+ ["korean-b.md", "mem-korean-b", "사용자는홍차를좋아한다"],
95
+ ["korean-c.md", "mem-korean-c", "사용자는커피를좋아한다"],
96
+ ["korean-punctuation.md", "mem-korean-punctuation", "홍차・커피"],
97
+ ["korean-hyphen.md", "mem-korean-hyphen", "홍차-커피"],
98
+ ["korean-joined.md", "mem-korean-joined", "홍차커피"],
99
+ ["japanese-boundary-a.md", "mem-japanese-boundary-a", "甲・乙丙"],
100
+ ["japanese-boundary-b.md", "mem-japanese-boundary-b", "甲乙・丙"],
101
+ ] as const;
102
+
103
+ for (const [fileName, id, content] of entries) {
104
+ await writeFile(
105
+ path.join(factsDir, fileName),
106
+ ["---", `id: ${id}`, "category: fact", "---", content].join("\n"),
107
+ "utf8"
108
+ );
109
+ }
110
+
111
+ const result = findDuplicates({ memoryDir, categories: ["facts"] });
112
+
113
+ assert.equal(result.scanned, entries.length);
114
+ assert.equal(result.duplicates.length, 3);
115
+ assert.deepEqual(result.duplicates.map(({ left, right }) => [left.id, right.id]).sort(), [
116
+ ["mem-english-a", "mem-english-b"],
117
+ ["mem-japanese-a", "mem-japanese-b"],
118
+ ["mem-korean-a", "mem-korean-b"],
119
+ ]);
120
+ } finally {
121
+ await rm(memoryDir, { recursive: true, force: true });
122
+ }
123
+ });
124
+
98
125
  test("dedup scans reject symlinked category directories outside memoryDir", async (t) => {
99
126
  if (process.platform === "win32") {
100
127
  t.skip("directory symlink setup is platform-specific");
@@ -107,24 +134,15 @@ test("dedup scans reject symlinked category directories outside memoryDir", asyn
107
134
  try {
108
135
  await writeFile(
109
136
  path.join(outsideDir, "outside.md"),
110
- [
111
- "---",
112
- "id: outside",
113
- "category: fact",
114
- "---",
115
- "Outside memory should not be scanned.",
116
- ].join("\n"),
117
- "utf8",
137
+ ["---", "id: outside", "category: fact", "---", "Outside memory should not be scanned."].join("\n"),
138
+ "utf8"
118
139
  );
119
140
  await symlink(outsideDir, path.join(memoryDir, "facts"), "dir");
120
141
 
121
- assert.throws(
122
- () => findDuplicates({ memoryDir, categories: ["facts"] }),
123
- /symlinked memory category directory/,
124
- );
142
+ assert.throws(() => findDuplicates({ memoryDir, categories: ["facts"] }), /symlinked memory category directory/);
125
143
  assert.throws(
126
144
  () => findContradictions({ memoryDir, categories: ["facts"] }),
127
- /symlinked memory category directory/,
145
+ /symlinked memory category directory/
128
146
  );
129
147
  } finally {
130
148
  await rm(memoryDir, { recursive: true, force: true });
@@ -5,9 +5,10 @@
5
5
  * against existing memories. Can be used standalone or via curation.
6
6
  */
7
7
 
8
+ import crypto from "node:crypto";
8
9
  import fs from "node:fs";
9
10
  import path from "node:path";
10
- import crypto from "node:crypto";
11
+ import { normalizeRecallTokenSet } from "../recall-tokenization.js";
11
12
  import { ALL_CATEGORY_DIRS } from "../utils/category-dir.js";
12
13
 
13
14
  // ── Types ────────────────────────────────────────────────────────────────────
@@ -89,20 +90,11 @@ const DEFAULT_DEDUP_THRESHOLD = 0.85;
89
90
  const DEFAULT_MAX_LOAD = 10000;
90
91
 
91
92
  function normalizeThreshold(value: number | undefined, defaultValue: number): number {
92
- return typeof value === "number" &&
93
- Number.isFinite(value) &&
94
- value >= 0 &&
95
- value <= 1
96
- ? value
97
- : defaultValue;
93
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1 ? value : defaultValue;
98
94
  }
99
95
 
100
96
  function normalizeMaxLoad(value: number | undefined, defaultValue: number): number {
101
- return typeof value === "number" &&
102
- Number.isInteger(value) &&
103
- value >= 0
104
- ? value
105
- : defaultValue;
97
+ return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : defaultValue;
106
98
  }
107
99
 
108
100
  export function findDuplicates(options: DedupOptions): DedupResult {
@@ -163,26 +155,25 @@ export function findContradictions(options: ContradictionOptions): Contradiction
163
155
  // ── Similarity computation ───────────────────────────────────────────────────
164
156
 
165
157
  function computeSimilarity(a: string, b: string): number {
166
- // Normalize
167
158
  const normA = normalize(a);
168
159
  const normB = normalize(b);
160
+ const punctuationBoundariesA = embeddedPunctuationSignature(a);
161
+ const punctuationBoundariesB = embeddedPunctuationSignature(b);
162
+
163
+ // Compare punctuation and positions before normalization's exact/hash paths.
164
+ if (punctuationBoundariesA !== punctuationBoundariesB) return 0;
169
165
 
170
- // Exact match
171
166
  if (normA === normB) return 1;
172
167
 
173
- // Hash-based exact match
174
168
  if (hashContent(normA) === hashContent(normB)) return 0.99;
175
-
176
- // Substring containment
177
169
  if (normA.length > 50 && normB.length > 50) {
178
170
  if (normA.includes(normB.slice(0, 40)) || normB.includes(normA.slice(0, 40))) {
179
171
  return 0.9;
180
172
  }
181
173
  }
182
174
 
183
- // Word overlap (Jaccard)
184
- const wordsA = new Set(normA.split(/\s+/));
185
- const wordsB = new Set(normB.split(/\s+/));
175
+ const wordsA = tokenizeForSimilarity(normA);
176
+ const wordsB = tokenizeForSimilarity(normB);
186
177
  const intersection = new Set([...wordsA].filter((w) => wordsB.has(w)));
187
178
  const union = new Set([...wordsA, ...wordsB]);
188
179
 
@@ -190,25 +181,89 @@ function computeSimilarity(a: string, b: string): number {
190
181
  return intersection.size / union.size;
191
182
  }
192
183
 
184
+ function embeddedPunctuationSignature(text: string): string {
185
+ const chars = [...text.normalize("NFC")];
186
+ const significant = /[\p{L}\p{M}\p{N}]/u;
187
+ const ignored = /[\s']/u;
188
+ const boundaries: string[] = [];
189
+ let position = 0;
190
+ for (let index = 0; index < chars.length;) {
191
+ const char = chars[index];
192
+ if (char === undefined) break;
193
+ if (significant.test(char)) {
194
+ position++;
195
+ index++;
196
+ continue;
197
+ }
198
+ if (ignored.test(char)) {
199
+ index++;
200
+ continue;
201
+ }
202
+ const start = index;
203
+ while (index < chars.length) {
204
+ const next = chars[index];
205
+ if (next === undefined || significant.test(next) || ignored.test(next)) break;
206
+ index++;
207
+ }
208
+ const before = chars[start - 1];
209
+ const after = chars[index];
210
+ if (before && after && significant.test(before) && significant.test(after)) {
211
+ boundaries.push(`${position}:${chars.slice(start, index).join("")}`);
212
+ }
213
+ }
214
+ return boundaries.join("\u0000");
215
+ }
216
+
193
217
  function normalize(text: string): string {
194
218
  return text
219
+ .normalize("NFC")
195
220
  .toLowerCase()
196
- .replace(/[^\w\s']/g, "")
221
+ .replace(/[^\p{ASCII}\p{L}\p{M}\p{N}\s']/gu, " ")
222
+ .replace(/[^\p{L}\p{M}\p{N}\s']/gu, "")
197
223
  .replace(/\s+/g, " ")
198
224
  .trim();
199
225
  }
200
226
 
227
+ function tokenizeForSimilarity(text: string): Set<string> {
228
+ if (/\p{Script=Hangul}/u.test(text)) {
229
+ const tokens = normalizeRecallTokenSet(text);
230
+ for (const segment of text.match(/\p{Script=Hangul}+/gu) ?? []) {
231
+ const chars = [...segment];
232
+ for (const size of [1, 2, 3, 4]) {
233
+ for (let index = 0; index <= chars.length - size; index += 1) {
234
+ tokens.add(chars.slice(index, index + size).join(""));
235
+ }
236
+ }
237
+ }
238
+ return tokens;
239
+ }
240
+ if (/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(text)) {
241
+ return normalizeRecallTokenSet(text);
242
+ }
243
+ return text.length === 0 ? new Set() : new Set(text.split(/\s+/));
244
+ }
245
+
201
246
  // ── Contradiction detection ──────────────────────────────────────────────────
202
247
 
203
248
  const NEGATION_WORDS = new Set([
204
- "not", "don't", "doesn't", "isn't", "aren't", "won't", "can't", "cannot",
205
- "never", "no", "none", "neither", "nor", "nothing", "nowhere",
249
+ "not",
250
+ "don't",
251
+ "doesn't",
252
+ "isn't",
253
+ "aren't",
254
+ "won't",
255
+ "can't",
256
+ "cannot",
257
+ "never",
258
+ "no",
259
+ "none",
260
+ "neither",
261
+ "nor",
262
+ "nothing",
263
+ "nowhere",
206
264
  ]);
207
265
 
208
- function detectContradiction(
209
- a: MemoryEntry,
210
- b: MemoryEntry,
211
- ): ContradictionPair | null {
266
+ function detectContradiction(a: MemoryEntry, b: MemoryEntry): ContradictionPair | null {
212
267
  const normA = normalize(a.content);
213
268
  const normB = normalize(b.content);
214
269
 
@@ -271,11 +326,7 @@ function stripNegation(text: string): string {
271
326
 
272
327
  // ── Memory loading ───────────────────────────────────────────────────────────
273
328
 
274
- function loadMemories(
275
- memoryDir: string,
276
- categories?: string[],
277
- maxLoad = 10000,
278
- ): MemoryEntry[] {
329
+ function loadMemories(memoryDir: string, categories?: string[], maxLoad = 10000): MemoryEntry[] {
279
330
  const result: MemoryEntry[] = [];
280
331
  const allCategories = categories ?? ALL_CATEGORY_DIRS;
281
332
  if (!fs.existsSync(memoryDir)) return result;
@@ -322,11 +373,7 @@ function hashContent(content: string): string {
322
373
  return crypto.createHash("sha256").update(content).digest("hex").slice(0, 16);
323
374
  }
324
375
 
325
- function readFileSafe(
326
- filePath: string,
327
- memoryRootReal: string,
328
- categoryRootReal: string,
329
- ): string | null {
376
+ function readFileSafe(filePath: string, memoryRootReal: string, categoryRootReal: string): string | null {
330
377
  try {
331
378
  const fileStat = fs.lstatSync(filePath);
332
379
  if (fileStat.isSymbolicLink()) {
@@ -373,7 +420,7 @@ function walkMdFiles(
373
420
  dir: string,
374
421
  memoryRootReal: string,
375
422
  categoryRootReal: string,
376
- callback: (filePath: string) => void,
423
+ callback: (filePath: string) => void
377
424
  ): void {
378
425
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
379
426
  const fullPath = path.join(dir, entry.name);