@remnic/core 9.60.1 → 9.61.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 (427) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +25 -25
  3. package/dist/access-authorization-probe.d.ts +11 -11
  4. package/dist/access-authorization-probe.js +26 -26
  5. package/dist/access-boundary.d.ts +11 -11
  6. package/dist/access-boundary.js +25 -25
  7. package/dist/access-cli.js +75 -74
  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 +25 -25
  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 +11 -11
  15. package/dist/access-http-offline-stream.d.ts +11 -11
  16. package/dist/access-http-query.js +25 -25
  17. package/dist/access-http.d.ts +12 -12
  18. package/dist/access-http.js +38 -38
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +25 -25
  21. package/dist/access-lcm-surface.d.ts +11 -11
  22. package/dist/access-lcm-surface.js +25 -25
  23. package/dist/access-mcp.d.ts +11 -11
  24. package/dist/access-mcp.js +32 -32
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-TBXz-8s_.d.ts → access-namespace-preflight-EMvicnrb.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +25 -25
  29. package/dist/access-observe-write-surface.d.ts +11 -11
  30. package/dist/access-observe-write-surface.js +25 -25
  31. package/dist/access-offline-manifest.d.ts +9 -9
  32. package/dist/access-operations-batch.js +27 -27
  33. package/dist/access-operations.d.ts +14 -14
  34. package/dist/access-operations.js +31 -31
  35. package/dist/access-recall-concurrency.d.ts +11 -11
  36. package/dist/access-recall-concurrency.js +25 -25
  37. package/dist/access-recall-response.d.ts +11 -11
  38. package/dist/access-recall-response.js +25 -25
  39. package/dist/access-recall-surface.d.ts +11 -11
  40. package/dist/access-recall-surface.js +25 -25
  41. package/dist/access-schema.d.ts +88 -88
  42. package/dist/access-schema.js +3 -3
  43. package/dist/{access-service-BogiG4Dy.d.ts → access-service-BeDYQQ62.d.ts} +71 -71
  44. package/dist/access-service-helpers.d.ts +11 -11
  45. package/dist/access-service.d.ts +11 -11
  46. package/dist/access-service.js +25 -25
  47. package/dist/access-surface-catalog.d.ts +11 -11
  48. package/dist/access-surface-catalog.js +27 -27
  49. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  50. package/dist/action-confidence.d.ts +1 -1
  51. package/dist/active-memory-bridge.d.ts +1 -1
  52. package/dist/active-recall.d.ts +1 -1
  53. package/dist/adapters/index.js +4 -4
  54. package/dist/adapters/registry.js +2 -2
  55. package/dist/ambient-provenance.d.ts +1 -1
  56. package/dist/artifact-search.d.ts +1 -1
  57. package/dist/behavior-learner.d.ts +1 -1
  58. package/dist/behavior-signals.d.ts +1 -1
  59. package/dist/bootstrap.d.ts +9 -9
  60. package/dist/briefing-window.d.ts +2 -2
  61. package/dist/briefing.d.ts +2 -2
  62. package/dist/briefing.js +11 -11
  63. package/dist/buffer-surprise-report.d.ts +1 -1
  64. package/dist/buffer-turn-helpers.d.ts +1 -1
  65. package/dist/buffer.d.ts +2 -2
  66. package/dist/buffer.js +4 -4
  67. package/dist/bulk-import/index.d.ts +3 -3
  68. package/dist/calibration.d.ts +1 -1
  69. package/dist/capabilities.d.ts +1 -1
  70. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  71. package/dist/{catalog-z1UerMbh.d.ts → catalog-B2SxZ6LU.d.ts} +1 -1
  72. package/dist/causal-behavior.d.ts +1 -1
  73. package/dist/causal-consolidation.d.ts +1 -1
  74. package/dist/causal-consolidation.js +12 -12
  75. package/dist/causal-trajectory-graph.d.ts +1 -1
  76. package/dist/{chunk-7DHFB5SG.js → chunk-2GRLJMKJ.js} +3 -3
  77. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  78. package/dist/{chunk-VUJN44CT.js → chunk-2RIDW23Y.js} +7 -7
  79. package/dist/{chunk-VOKK4WCG.js → chunk-3GPBFDXH.js} +2 -2
  80. package/dist/{chunk-KXYMU4IN.js → chunk-4JGSG7QN.js} +3 -3
  81. package/dist/{chunk-A7266TRJ.js → chunk-4XAVQLBR.js} +2 -2
  82. package/dist/{chunk-LLZKOSGM.js → chunk-5WVUO6QT.js} +1 -1
  83. package/dist/{chunk-LLZKOSGM.js.map → chunk-5WVUO6QT.js.map} +1 -1
  84. package/dist/{chunk-UBSM6TZP.js → chunk-76YNCJ5H.js} +2 -2
  85. package/dist/{chunk-JNWISMYG.js → chunk-7N7DB4L5.js} +5 -5
  86. package/dist/{chunk-6C7Q6NG3.js → chunk-AWRJBAIH.js} +16 -16
  87. package/dist/{chunk-GKHMV2KK.js → chunk-C3R732UY.js} +51 -32
  88. package/dist/chunk-C3R732UY.js.map +1 -0
  89. package/dist/{chunk-DE6YCZEE.js → chunk-CIA6ZUBA.js} +2 -2
  90. package/dist/{chunk-PEDYKCJI.js → chunk-CK3NQUSQ.js} +2 -2
  91. package/dist/{chunk-OU7RWWW6.js → chunk-CM4SZZBN.js} +2 -2
  92. package/dist/{chunk-ODAE36PG.js → chunk-D5HDJWNN.js} +2 -2
  93. package/dist/{chunk-4CLE2LXB.js → chunk-EGW4O32Z.js} +75 -38
  94. package/dist/chunk-EGW4O32Z.js.map +1 -0
  95. package/dist/{chunk-KF75ANST.js → chunk-EHMMRZOZ.js} +2 -2
  96. package/dist/{chunk-7G34CBKS.js → chunk-EIQFIJDM.js} +2 -2
  97. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  98. package/dist/{chunk-G3JFFUKR.js → chunk-FW73HN33.js} +2 -2
  99. package/dist/{chunk-MMZK2DWN.js → chunk-G3YBWFUC.js} +1 -1
  100. package/dist/chunk-GKUA4MGB.js +40 -0
  101. package/dist/chunk-GKUA4MGB.js.map +1 -0
  102. package/dist/{chunk-I4BLRM7X.js → chunk-GN7HO2LA.js} +10 -10
  103. package/dist/{chunk-ZOGOOSB3.js → chunk-H32ANIFP.js} +2 -2
  104. package/dist/{chunk-AH2NX6S7.js → chunk-HEEEMJ26.js} +3 -3
  105. package/dist/{chunk-J65AKOD6.js → chunk-HQBVQICL.js} +2 -2
  106. package/dist/{chunk-VJXSAJFW.js → chunk-I67HKRBF.js} +2 -2
  107. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  108. package/dist/{chunk-R7IV3EUJ.js → chunk-JKW663ZN.js} +2 -2
  109. package/dist/{chunk-YBCZTBN2.js → chunk-KAB7TZN3.js} +2 -2
  110. package/dist/{chunk-4UUF2EX3.js → chunk-KPML4Q3M.js} +2 -2
  111. package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
  112. package/dist/{chunk-YKZFX2HQ.js → chunk-L33N3BCA.js} +2 -2
  113. package/dist/{chunk-PYHOAXTI.js → chunk-LRGSLV7M.js} +4 -4
  114. package/dist/{chunk-FI5EAP4N.js → chunk-MJ4UGUR6.js} +2 -2
  115. package/dist/{chunk-KBIIE57I.js → chunk-MU3TPZOV.js} +2 -2
  116. package/dist/{chunk-77DAFTUU.js → chunk-MYZ4NA43.js} +2 -2
  117. package/dist/{chunk-T2VJ2EO5.js → chunk-N4EPIKSY.js} +6 -6
  118. package/dist/{chunk-EZXGJJXM.js → chunk-N4OYPGZS.js} +2 -2
  119. package/dist/{chunk-L3JVAM5Q.js → chunk-PA5OPZX2.js} +2 -2
  120. package/dist/{chunk-RVO6TCTU.js → chunk-QCECHYZL.js} +6 -6
  121. package/dist/{chunk-2HGV44MM.js → chunk-QRKYABS6.js} +2 -2
  122. package/dist/{chunk-P6GOYLHN.js → chunk-QWPAQLYV.js} +2 -2
  123. package/dist/{chunk-BTHDQOF4.js → chunk-QYN5PXDZ.js} +5 -5
  124. package/dist/{chunk-MG7GI4TT.js → chunk-S3B3UIQ3.js} +2 -2
  125. package/dist/{chunk-6W2ISYUV.js → chunk-TE4MKFT2.js} +4 -4
  126. package/dist/{chunk-QUJC22CT.js → chunk-URN7XWGC.js} +2 -2
  127. package/dist/{chunk-G5OB4XZX.js → chunk-VANZKHTN.js} +4 -4
  128. package/dist/{chunk-BPM6UHUL.js → chunk-VWDTV6SH.js} +2 -2
  129. package/dist/{chunk-P5OYNV7B.js → chunk-W3Y6FYRK.js} +2 -2
  130. package/dist/{chunk-VIM6QH4D.js → chunk-W4Q54HM3.js} +2 -2
  131. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  132. package/dist/{chunk-FUWS2MNJ.js → chunk-XBR5BAKW.js} +4 -4
  133. package/dist/{chunk-XU4OLEYW.js → chunk-XD4VGLDL.js} +45 -45
  134. package/dist/{chunk-OV36CROW.js → chunk-XDK6ZFLL.js} +3 -3
  135. package/dist/{chunk-JHMAYABJ.js → chunk-XL3TATMJ.js} +4 -4
  136. package/dist/{chunk-OLX2HJFW.js → chunk-YLHM5BQQ.js} +4 -4
  137. package/dist/{chunk-2VHCLHZ5.js → chunk-YUIBXMZY.js} +147 -40
  138. package/dist/chunk-YUIBXMZY.js.map +1 -0
  139. package/dist/{cli-CTgFjmDs.d.ts → cli-DB_uakTc.d.ts} +5 -5
  140. package/dist/cli.d.ts +13 -13
  141. package/dist/cli.js +58 -58
  142. package/dist/coding/pre-action-gate.d.ts +1 -1
  143. package/dist/compounding/engine.d.ts +2 -2
  144. package/dist/compounding/engine.js +11 -11
  145. package/dist/compounding/preference-consolidator.d.ts +1 -1
  146. package/dist/compression-optimizer.d.ts +1 -1
  147. package/dist/config.d.ts +1 -1
  148. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  149. package/dist/connectors/codex-materialize-runner.js +11 -11
  150. package/dist/connectors/codex-materialize.d.ts +1 -1
  151. package/dist/connectors/index.d.ts +1 -1
  152. package/dist/connectors/index.js +11 -11
  153. package/dist/consolidation-provenance-check.d.ts +2 -2
  154. package/dist/consolidation-undo.d.ts +2 -2
  155. package/dist/contradiction/index.d.ts +2 -2
  156. package/dist/contradiction/index.js +4 -4
  157. package/dist/converge-config.d.ts +1 -1
  158. package/dist/convergence-refresh.d.ts +2 -2
  159. package/dist/convergence-refresh.js +13 -13
  160. package/dist/conversation-index/backend.d.ts +1 -1
  161. package/dist/conversation-index/chunker.d.ts +1 -1
  162. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  163. package/dist/conversation-index/indexer.d.ts +1 -1
  164. package/dist/conversation-index/search.d.ts +1 -1
  165. package/dist/corpus-watermark.d.ts +1 -1
  166. package/dist/corpus-watermark.js +13 -13
  167. package/dist/dashboard-runtime.js +2 -2
  168. package/dist/day-summary.d.ts +1 -1
  169. package/dist/delinearize.d.ts +1 -1
  170. package/dist/dependency-propagation-config.d.ts +1 -1
  171. package/dist/{dependency-propagation-delivery-DdwSc1qh.d.ts → dependency-propagation-delivery-DcOVpK3y.d.ts} +1 -1
  172. package/dist/direct-answer-wiring.d.ts +1 -1
  173. package/dist/direct-answer.d.ts +1 -1
  174. package/dist/embedding-fallback.d.ts +1 -1
  175. package/dist/enrichment/index.d.ts +1 -1
  176. package/dist/entity-origin-fields.d.ts +28 -0
  177. package/dist/entity-origin-fields.js +10 -0
  178. package/dist/entity-origin-fields.js.map +1 -0
  179. package/dist/entity-retrieval.d.ts +2 -2
  180. package/dist/entity-retrieval.js +12 -11
  181. package/dist/entity-schema.d.ts +1 -1
  182. package/dist/explicit-capture.d.ts +9 -9
  183. package/dist/external-wiki-access.d.ts +11 -11
  184. package/dist/external-wiki-access.js +26 -26
  185. package/dist/external-wiki-collection-registration.d.ts +1 -1
  186. package/dist/external-wiki-collection.d.ts +1 -1
  187. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  188. package/dist/extraction-error-classification.d.ts +1 -1
  189. package/dist/extraction-faithfulness.d.ts +1 -1
  190. package/dist/extraction-judge-telemetry.d.ts +1 -1
  191. package/dist/extraction-judge-training.d.ts +1 -1
  192. package/dist/extraction-judge.d.ts +1 -1
  193. package/dist/extraction-liveness.d.ts +1 -1
  194. package/dist/extraction-normalization.d.ts +1 -1
  195. package/dist/extraction-prompt.d.ts +1 -1
  196. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  197. package/dist/extraction-source-grounding.d.ts +1 -1
  198. package/dist/extraction.d.ts +1 -1
  199. package/dist/extraction.js +15 -15
  200. package/dist/fallback-llm.d.ts +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-retrieval.js +1 -1
  210. package/dist/importance.d.ts +1 -1
  211. package/dist/importers/index.d.ts +1 -1
  212. package/dist/in-flight-reads.d.ts +1 -1
  213. package/dist/index.d.ts +697 -697
  214. package/dist/index.js +85 -84
  215. package/dist/intent.d.ts +1 -1
  216. package/dist/lcm/engine.d.ts +1 -1
  217. package/dist/lcm/index.d.ts +1 -1
  218. package/dist/lcm/index.js +3 -3
  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 +11 -11
  226. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  227. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -11
  228. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  229. package/dist/maintenance/rebuild-memory-projection.js +12 -12
  230. package/dist/{maintenance-DvkiF7fm.d.ts → maintenance-5c1olVtB.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 +12 -12
  242. package/dist/namespaces/principal.d.ts +1 -1
  243. package/dist/namespaces/search.d.ts +1 -1
  244. package/dist/namespaces/search.js +8 -8
  245. package/dist/namespaces/storage.d.ts +3 -3
  246. package/dist/namespaces/storage.js +11 -11
  247. package/dist/native-knowledge.d.ts +1 -1
  248. package/dist/offline-sync-impression-drain.d.ts +1 -1
  249. package/dist/operator-doctor-corpus.d.ts +1 -1
  250. package/dist/operator-doctor-corpus.js +14 -14
  251. package/dist/operator-doctor-replica.d.ts +1 -1
  252. package/dist/operator-toolkit.d.ts +3 -3
  253. package/dist/operator-toolkit.js +18 -18
  254. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  255. package/dist/orchestration/maintenance.d.ts +4 -4
  256. package/dist/orchestration/maintenance.js +16 -16
  257. package/dist/{orchestrator-CXPIzs3D.d.ts → orchestrator-HPuY6I4i.d.ts} +8 -8
  258. package/dist/orchestrator.d.ts +9 -9
  259. package/dist/orchestrator.js +75 -74
  260. package/dist/patterns-cli.d.ts +1 -1
  261. package/dist/{pipeline-BuYWU9rt.d.ts → pipeline-CvVe1Q2_.d.ts} +1 -1
  262. package/dist/policy-runtime.d.ts +1 -1
  263. package/dist/proactive-contention.d.ts +1 -1
  264. package/dist/provenance.d.ts +1 -1
  265. package/dist/{public-http-CEwDOGO7.d.ts → public-http-D0JKFkyf.d.ts} +1 -1
  266. package/dist/{qmd-DYnrPw-m.d.ts → qmd-Bd0Tp76_.d.ts} +1 -1
  267. package/dist/qmd-preflight.d.ts +2 -2
  268. package/dist/qmd-recall-cache.d.ts +1 -1
  269. package/dist/qmd.d.ts +2 -2
  270. package/dist/qmd.js +4 -4
  271. package/dist/recall-concurrency-config.d.ts +1 -1
  272. package/dist/recall-disclosure-escalation.d.ts +1 -1
  273. package/dist/recall-explain-renderer.d.ts +1 -1
  274. package/dist/recall-explain-renderer.js +3 -3
  275. package/dist/recall-memory-map.d.ts +1 -1
  276. package/dist/recall-planner-llm.d.ts +1 -1
  277. package/dist/recall-state.d.ts +1 -1
  278. package/dist/recall-tag-filter.d.ts +1 -1
  279. package/dist/recall-timings.d.ts +1 -1
  280. package/dist/recall-xray-cli.d.ts +1 -1
  281. package/dist/recall-xray-cli.js +4 -4
  282. package/dist/recall-xray-renderer.d.ts +1 -1
  283. package/dist/recall-xray-renderer.js +3 -3
  284. package/dist/recall-xray.d.ts +1 -1
  285. package/dist/recall-xray.js +2 -2
  286. package/dist/reconcile/cursor.d.ts +1 -1
  287. package/dist/reconcile/manifest.d.ts +1 -1
  288. package/dist/reconcile/plan.d.ts +1 -1
  289. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  290. package/dist/replay/normalizers/claude.d.ts +1 -1
  291. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  292. package/dist/replay/normalizers/shared.d.ts +1 -1
  293. package/dist/replay/runner.d.ts +1 -1
  294. package/dist/replay/types.d.ts +1 -1
  295. package/dist/replica-divergence.d.ts +1 -1
  296. package/dist/replica-peers-config.d.ts +1 -1
  297. package/dist/resolve-auth-token.d.ts +1 -1
  298. package/dist/retrieval-agents.d.ts +2 -2
  299. package/dist/retrieval-tiers.d.ts +1 -1
  300. package/dist/routing/engine.d.ts +1 -1
  301. package/dist/routing/store.d.ts +1 -1
  302. package/dist/salvage-envelope.d.ts +1 -1
  303. package/dist/schemas.d.ts +138 -138
  304. package/dist/{scope-profiles-C1QG4Cmv.d.ts → scope-profiles-ClLtm9gK.d.ts} +1 -1
  305. package/dist/search/embed-helper.d.ts +1 -1
  306. package/dist/search/factory.d.ts +1 -1
  307. package/dist/search/factory.js +7 -7
  308. package/dist/search/index.d.ts +1 -1
  309. package/dist/search/index.js +7 -7
  310. package/dist/search/lancedb-backend.d.ts +1 -1
  311. package/dist/search/lancedb-backend.js +2 -2
  312. package/dist/search/meilisearch-backend.d.ts +1 -1
  313. package/dist/search/meilisearch-backend.js +2 -2
  314. package/dist/search/noop-backend.d.ts +1 -1
  315. package/dist/search/orama-backend.d.ts +1 -1
  316. package/dist/search/orama-backend.js +2 -2
  317. package/dist/search/port.d.ts +1 -1
  318. package/dist/search/remote-backend.d.ts +1 -1
  319. package/dist/{semantic-consolidation-DMeX8XS0.d.ts → semantic-consolidation-B1EkeEDj.d.ts} +1 -1
  320. package/dist/semantic-consolidation.d.ts +2 -2
  321. package/dist/semantic-consolidation.js +12 -12
  322. package/dist/semantic-rule-promotion.js +11 -11
  323. package/dist/semantic-rule-verifier.d.ts +1 -1
  324. package/dist/semantic-rule-verifier.js +11 -11
  325. package/dist/{service-CT3ENiTO.d.ts → service-Cf3ANQj9.d.ts} +2 -2
  326. package/dist/session-observer-bands.d.ts +1 -1
  327. package/dist/session-observer-state.d.ts +1 -1
  328. package/dist/shared-context/manager.d.ts +9 -9
  329. package/dist/signal.d.ts +1 -1
  330. package/dist/source-agent-qualifier.d.ts +1 -1
  331. package/dist/source-agent-qualifier.js +13 -13
  332. package/dist/{storage-B0L76y7N.d.ts → storage-DS2O_6Qt.d.ts} +4 -2
  333. package/dist/storage.d.ts +2 -2
  334. package/dist/storage.js +12 -10
  335. package/dist/summarizer.d.ts +1 -1
  336. package/dist/summary-snapshot.d.ts +1 -1
  337. package/dist/support-passport/index.d.ts +14 -14
  338. package/dist/support-passport/index.js +28 -28
  339. package/dist/temporal-supersession.d.ts +2 -2
  340. package/dist/temporal-timeline-recall.d.ts +1 -1
  341. package/dist/temporal-validity.d.ts +1 -1
  342. package/dist/threading.d.ts +1 -1
  343. package/dist/tier-migration.d.ts +2 -2
  344. package/dist/tier-routing.d.ts +1 -1
  345. package/dist/topics.d.ts +1 -1
  346. package/dist/transcript.d.ts +1 -1
  347. package/dist/transfer/backup.js +2 -2
  348. package/dist/transfer/capsule-export.js +2 -2
  349. package/dist/transfer/capsule-import.js +2 -2
  350. package/dist/transfer/import-sqlite.js +2 -2
  351. package/dist/transfer/types.d.ts +66 -66
  352. package/dist/trust-score-stage.d.ts +1 -1
  353. package/dist/trust-score.d.ts +1 -1
  354. package/dist/{types-D7pB0QwO.d.ts → types-BOANGhCJ.d.ts} +3 -1
  355. package/dist/types.d.ts +1 -1
  356. package/dist/types.js +1 -1
  357. package/dist/utility-runtime.d.ts +1 -1
  358. package/dist/verified-recall.js +11 -11
  359. package/dist/write-envelope.d.ts +1 -1
  360. package/package.json +2 -2
  361. package/src/entity-origin-fields.ts +56 -0
  362. package/src/entity-retrieval.ts +84 -84
  363. package/src/orchestration/extraction-injection-gate.ts +17 -5
  364. package/src/orchestration/extraction-persist.ts +1 -1
  365. package/src/recall-authority-fence.test.ts +40 -0
  366. package/src/security/audit-memory.test.ts +24 -1
  367. package/src/storage/entity-store.ts +52 -17
  368. package/src/storage/entity-timeline.ts +96 -16
  369. package/src/storage.ts +18 -18
  370. package/src/types.ts +2 -2
  371. package/dist/chunk-2VHCLHZ5.js.map +0 -1
  372. package/dist/chunk-4CLE2LXB.js.map +0 -1
  373. package/dist/chunk-GKHMV2KK.js.map +0 -1
  374. /package/dist/{capsule-crypto-GWVG7LGC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  375. /package/dist/{chunk-7DHFB5SG.js.map → chunk-2GRLJMKJ.js.map} +0 -0
  376. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  377. /package/dist/{chunk-VUJN44CT.js.map → chunk-2RIDW23Y.js.map} +0 -0
  378. /package/dist/{chunk-VOKK4WCG.js.map → chunk-3GPBFDXH.js.map} +0 -0
  379. /package/dist/{chunk-KXYMU4IN.js.map → chunk-4JGSG7QN.js.map} +0 -0
  380. /package/dist/{chunk-A7266TRJ.js.map → chunk-4XAVQLBR.js.map} +0 -0
  381. /package/dist/{chunk-UBSM6TZP.js.map → chunk-76YNCJ5H.js.map} +0 -0
  382. /package/dist/{chunk-JNWISMYG.js.map → chunk-7N7DB4L5.js.map} +0 -0
  383. /package/dist/{chunk-6C7Q6NG3.js.map → chunk-AWRJBAIH.js.map} +0 -0
  384. /package/dist/{chunk-DE6YCZEE.js.map → chunk-CIA6ZUBA.js.map} +0 -0
  385. /package/dist/{chunk-PEDYKCJI.js.map → chunk-CK3NQUSQ.js.map} +0 -0
  386. /package/dist/{chunk-OU7RWWW6.js.map → chunk-CM4SZZBN.js.map} +0 -0
  387. /package/dist/{chunk-ODAE36PG.js.map → chunk-D5HDJWNN.js.map} +0 -0
  388. /package/dist/{chunk-KF75ANST.js.map → chunk-EHMMRZOZ.js.map} +0 -0
  389. /package/dist/{chunk-7G34CBKS.js.map → chunk-EIQFIJDM.js.map} +0 -0
  390. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  391. /package/dist/{chunk-G3JFFUKR.js.map → chunk-FW73HN33.js.map} +0 -0
  392. /package/dist/{chunk-MMZK2DWN.js.map → chunk-G3YBWFUC.js.map} +0 -0
  393. /package/dist/{chunk-I4BLRM7X.js.map → chunk-GN7HO2LA.js.map} +0 -0
  394. /package/dist/{chunk-ZOGOOSB3.js.map → chunk-H32ANIFP.js.map} +0 -0
  395. /package/dist/{chunk-AH2NX6S7.js.map → chunk-HEEEMJ26.js.map} +0 -0
  396. /package/dist/{chunk-J65AKOD6.js.map → chunk-HQBVQICL.js.map} +0 -0
  397. /package/dist/{chunk-VJXSAJFW.js.map → chunk-I67HKRBF.js.map} +0 -0
  398. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  399. /package/dist/{chunk-R7IV3EUJ.js.map → chunk-JKW663ZN.js.map} +0 -0
  400. /package/dist/{chunk-YBCZTBN2.js.map → chunk-KAB7TZN3.js.map} +0 -0
  401. /package/dist/{chunk-4UUF2EX3.js.map → chunk-KPML4Q3M.js.map} +0 -0
  402. /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
  403. /package/dist/{chunk-YKZFX2HQ.js.map → chunk-L33N3BCA.js.map} +0 -0
  404. /package/dist/{chunk-PYHOAXTI.js.map → chunk-LRGSLV7M.js.map} +0 -0
  405. /package/dist/{chunk-FI5EAP4N.js.map → chunk-MJ4UGUR6.js.map} +0 -0
  406. /package/dist/{chunk-KBIIE57I.js.map → chunk-MU3TPZOV.js.map} +0 -0
  407. /package/dist/{chunk-77DAFTUU.js.map → chunk-MYZ4NA43.js.map} +0 -0
  408. /package/dist/{chunk-T2VJ2EO5.js.map → chunk-N4EPIKSY.js.map} +0 -0
  409. /package/dist/{chunk-EZXGJJXM.js.map → chunk-N4OYPGZS.js.map} +0 -0
  410. /package/dist/{chunk-L3JVAM5Q.js.map → chunk-PA5OPZX2.js.map} +0 -0
  411. /package/dist/{chunk-RVO6TCTU.js.map → chunk-QCECHYZL.js.map} +0 -0
  412. /package/dist/{chunk-2HGV44MM.js.map → chunk-QRKYABS6.js.map} +0 -0
  413. /package/dist/{chunk-P6GOYLHN.js.map → chunk-QWPAQLYV.js.map} +0 -0
  414. /package/dist/{chunk-BTHDQOF4.js.map → chunk-QYN5PXDZ.js.map} +0 -0
  415. /package/dist/{chunk-MG7GI4TT.js.map → chunk-S3B3UIQ3.js.map} +0 -0
  416. /package/dist/{chunk-6W2ISYUV.js.map → chunk-TE4MKFT2.js.map} +0 -0
  417. /package/dist/{chunk-QUJC22CT.js.map → chunk-URN7XWGC.js.map} +0 -0
  418. /package/dist/{chunk-G5OB4XZX.js.map → chunk-VANZKHTN.js.map} +0 -0
  419. /package/dist/{chunk-BPM6UHUL.js.map → chunk-VWDTV6SH.js.map} +0 -0
  420. /package/dist/{chunk-P5OYNV7B.js.map → chunk-W3Y6FYRK.js.map} +0 -0
  421. /package/dist/{chunk-VIM6QH4D.js.map → chunk-W4Q54HM3.js.map} +0 -0
  422. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  423. /package/dist/{chunk-FUWS2MNJ.js.map → chunk-XBR5BAKW.js.map} +0 -0
  424. /package/dist/{chunk-XU4OLEYW.js.map → chunk-XD4VGLDL.js.map} +0 -0
  425. /package/dist/{chunk-OV36CROW.js.map → chunk-XDK6ZFLL.js.map} +0 -0
  426. /package/dist/{chunk-JHMAYABJ.js.map → chunk-XL3TATMJ.js.map} +0 -0
  427. /package/dist/{chunk-OLX2HJFW.js.map → chunk-YLHM5BQQ.js.map} +0 -0
@@ -40,11 +40,12 @@ import {
40
40
  countEntityStructuredFacts,
41
41
  fingerprintEntityStructuredFacts,
42
42
  normalizeEntityName as normalizeEntityNameShared,
43
- normalizeStructuredSectionFacts,
43
+ normalizeStructuredSectionFactsWithOrigins,
44
44
  parseEntityFile,
45
45
  serializeEntityFile,
46
46
  StorageManager,
47
47
  } from "../storage.js";
48
+ import { parseOriginClass } from "../security/origin-authority.js";
48
49
 
49
50
  export interface EntityStoreDeps {
50
51
  /** Live class object of the host instance — shared static caches (see storage.ts storageManagerClass). */
@@ -204,6 +205,7 @@ export class EntityStore {
204
205
  source?: string;
205
206
  sessionKey?: string;
206
207
  principal?: string;
208
+ origin?: string;
207
209
  structuredSections?: EntityStructuredSection[];
208
210
  } = {},
209
211
  ): Promise<string> {
@@ -223,6 +225,7 @@ export class EntityStore {
223
225
  source?: string;
224
226
  sessionKey?: string;
225
227
  principal?: string;
228
+ origin?: string;
226
229
  structuredSections?: EntityStructuredSection[];
227
230
  } = {},
228
231
  ): Promise<string> {
@@ -283,26 +286,35 @@ export class EntityStore {
283
286
  const source = options.source?.trim() || undefined;
284
287
  const sessionKey = options.sessionKey?.trim() || undefined;
285
288
  const principal = options.principal?.trim() || undefined;
289
+ const origin = options.origin?.trim() ? parseOriginClass(options.origin) : undefined;
286
290
  const structuredSectionMap = new Map(
287
291
  (entity.structuredSections ?? []).map((section) => [section.key, {
288
292
  ...section,
289
293
  facts: [...section.facts],
294
+ ...(section.factOrigins ? { factOrigins: [...section.factOrigins] } : {}),
290
295
  }]),
291
296
  );
292
297
  for (const section of options.structuredSections ?? []) {
293
298
  const normalizedSection = normalizeEntityStructuredSection(type, section, this.deps.entitySchemas);
294
- const normalizedFacts = normalizeStructuredSectionFacts(section.facts);
295
- if (normalizedFacts.length === 0) continue;
299
+ const normalized = normalizeStructuredSectionFactsWithOrigins(section.facts, section.factOrigins, origin);
300
+ if (normalized.facts.length === 0) continue;
296
301
  const existingSection = structuredSectionMap.get(normalizedSection.key);
297
302
  if (!existingSection) {
298
303
  structuredSectionMap.set(normalizedSection.key, {
299
304
  key: normalizedSection.key,
300
305
  title: normalizedSection.title,
301
- facts: normalizedFacts,
306
+ ...normalized,
302
307
  });
303
308
  continue;
304
309
  }
305
- existingSection.facts = normalizeStructuredSectionFacts([...existingSection.facts, ...normalizedFacts]);
310
+ const existingOrigins = existingSection.facts.map((_, index) => existingSection.factOrigins?.[index]);
311
+ const incomingOrigins = normalized.facts.map((_, index) => normalized.factOrigins?.[index]);
312
+ const merged = normalizeStructuredSectionFactsWithOrigins(
313
+ [...existingSection.facts, ...normalized.facts],
314
+ [...existingOrigins, ...incomingOrigins],
315
+ );
316
+ existingSection.facts = merged.facts;
317
+ existingSection.factOrigins = merged.factOrigins;
306
318
  if (!existingSection.title.trim() && normalizedSection.title.trim()) {
307
319
  existingSection.title = normalizedSection.title;
308
320
  }
@@ -314,6 +326,7 @@ export class EntityStore {
314
326
  ...(source ? { source } : {}),
315
327
  ...(sessionKey ? { sessionKey } : {}),
316
328
  ...(principal ? { principal } : {}),
329
+ ...(origin ? { origin } : {}),
317
330
  };
318
331
  const alreadyPresent = entity.timeline.some((entry) =>
319
332
  entry.timestamp === nextEntry.timestamp
@@ -321,6 +334,7 @@ export class EntityStore {
321
334
  && entry.source === nextEntry.source
322
335
  && entry.sessionKey === nextEntry.sessionKey
323
336
  && entry.principal === nextEntry.principal
337
+ && entry.origin === nextEntry.origin
324
338
  );
325
339
  if (alreadyPresent) continue;
326
340
  entity.timeline.push(nextEntry);
@@ -762,26 +776,44 @@ export class EntityStore {
762
776
  (mergedEntity.structuredSections ?? []).map((section) => [section.key, {
763
777
  ...section,
764
778
  facts: [...section.facts],
779
+ factOrigins: section.factOrigins ? [...section.factOrigins] : undefined,
765
780
  }]),
766
781
  );
767
782
  for (const section of parsed.structuredSections ?? []) {
768
783
  const existingSection = mergedStructuredSectionMap.get(section.key);
769
784
  if (!existingSection) {
785
+ const facts: string[] = [];
786
+ const factOrigins: Array<string | undefined> = [];
787
+ for (const [index, fact] of section.facts.entries()) {
788
+ const trimmed = fact.trim();
789
+ if (!trimmed || facts.includes(trimmed)) continue;
790
+ facts.push(trimmed);
791
+ factOrigins.push(section.factOrigins?.[index]);
792
+ }
770
793
  mergedStructuredSectionMap.set(section.key, {
771
794
  key: section.key,
772
795
  title: section.title,
773
- facts: [...new Set(section.facts.map((fact) => fact.trim()).filter((fact) => fact.length > 0))],
796
+ facts,
797
+ factOrigins: section.factOrigins ? factOrigins : undefined,
774
798
  });
775
799
  continue;
776
800
  }
777
801
 
778
- const mergedFacts = new Set(existingSection.facts.map((fact) => fact.trim()));
779
- for (const fact of section.facts) {
802
+ if (section.factOrigins && !existingSection.factOrigins) {
803
+ existingSection.factOrigins = existingSection.facts.map(() => undefined);
804
+ }
805
+ for (const [index, fact] of section.facts.entries()) {
780
806
  const trimmed = fact.trim();
781
807
  if (!trimmed) continue;
782
- mergedFacts.add(trimmed);
808
+ const existingIndex = existingSection.facts.indexOf(trimmed);
809
+ const origin = section.factOrigins?.[index];
810
+ if (existingIndex === -1) {
811
+ existingSection.facts.push(trimmed);
812
+ existingSection.factOrigins?.push(origin);
813
+ } else if (existingSection.factOrigins?.[existingIndex] !== origin) {
814
+ existingSection.factOrigins?.splice(existingIndex, 1, undefined);
815
+ }
783
816
  }
784
- existingSection.facts = Array.from(mergedFacts);
785
817
  if (!existingSection.title.trim() && section.title.trim()) {
786
818
  existingSection.title = section.title;
787
819
  }
@@ -802,9 +834,8 @@ export class EntityStore {
802
834
  }
803
835
  }
804
836
 
805
- // Deduplicate timeline entries and derive facts from the timeline.
806
- const timelineKeys = new Set<string>();
807
- mergedEntity.timeline = mergedEntity.timeline.filter((entry) => {
837
+ const timelineByKey = new Map<string, (typeof mergedEntity.timeline)[number]>();
838
+ for (const entry of mergedEntity.timeline) {
808
839
  const key = JSON.stringify([
809
840
  entry.timestamp,
810
841
  entry.source ?? "",
@@ -812,10 +843,14 @@ export class EntityStore {
812
843
  entry.principal ?? "",
813
844
  entry.text,
814
845
  ]);
815
- if (timelineKeys.has(key)) return false;
816
- timelineKeys.add(key);
817
- return true;
818
- });
846
+ const existing = timelineByKey.get(key);
847
+ if (!existing) {
848
+ timelineByKey.set(key, entry);
849
+ } else if (existing.origin !== entry.origin) {
850
+ existing.origin = undefined;
851
+ }
852
+ }
853
+ mergedEntity.timeline = [...timelineByKey.values()];
819
854
  // Deduplicate relationships by target+label
820
855
  const relKeys = new Set<string>();
821
856
  mergedEntity.relationships = mergedEntity.relationships.filter((r) => {
@@ -6,6 +6,7 @@
6
6
  import { createHash } from "node:crypto";
7
7
  import { matchEntitySchemaSection, normalizeEntityStructuredSection } from "../entity-schema.js";
8
8
  import type { EntityFile, EntityStructuredSection, EntityTimelineEntry, PluginConfig } from "../types.js";
9
+ export const ENTITY_TIMELINE_METADATA_MARKER = "remnic-meta-v1";
9
10
 
10
11
  export function parseEntityTimelineBullet(bullet: string, fallbackTimestamp: string): EntityTimelineEntry | null {
11
12
  const trimmed = bullet.trim();
@@ -17,10 +18,11 @@ export function parseEntityTimelineBullet(bullet: string, fallbackTimestamp: str
17
18
  text: "",
18
19
  };
19
20
  const consumedMetadataSegments: string[] = [];
21
+ let metadataMarkerSeen = false;
20
22
  let literalSingleSourceSegment: string | undefined;
21
23
 
22
24
  if (!trimmed.startsWith("[")) {
23
- entry.text = trimmed;
25
+ entry.text = unescapeEntityTimelineText(trimmed);
24
26
  return entry.text ? entry : null;
25
27
  }
26
28
 
@@ -42,6 +44,13 @@ export function parseEntityTimelineBullet(bullet: string, fallbackTimestamp: str
42
44
  if (end === -1) break;
43
45
  const rawSegment = rest.slice(0, end + 1);
44
46
  const token = rest.slice(1, end).trim();
47
+ const nextRest = rest.slice(end + 1).trimStart();
48
+ if (token === ENTITY_TIMELINE_METADATA_MARKER) {
49
+ metadataMarkerSeen = true;
50
+ consumedMetadataSegments.push(rawSegment);
51
+ rest = nextRest;
52
+ continue;
53
+ }
45
54
  const equalsIdx = token.indexOf("=");
46
55
  if (equalsIdx === -1) {
47
56
  if (rest === trimmed) {
@@ -53,7 +62,10 @@ export function parseEntityTimelineBullet(bullet: string, fallbackTimestamp: str
53
62
  const key = token.slice(0, equalsIdx).trim().toLowerCase();
54
63
  const value = unescapeEntityTimelineMetadataValue(token.slice(equalsIdx + 1).trim());
55
64
  if (!value) break;
56
- const nextRest = rest.slice(end + 1).trimStart();
65
+ if (key === "remnic-origin" && !metadataMarkerSeen) {
66
+ entry.text = rest.trim();
67
+ return entry.text ? entry : null;
68
+ }
57
69
  switch (key) {
58
70
  case "source_meta":
59
71
  entry.source = value;
@@ -78,6 +90,9 @@ export function parseEntityTimelineBullet(bullet: string, fallbackTimestamp: str
78
90
  case "principal":
79
91
  entry.principal = value;
80
92
  break;
93
+ case "remnic-origin":
94
+ entry.origin = value;
95
+ break;
81
96
  default:
82
97
  entry.text = rest.trim();
83
98
  return entry.text ? entry : null;
@@ -93,8 +108,7 @@ export function parseEntityTimelineBullet(bullet: string, fallbackTimestamp: str
93
108
  text: `${literalSingleSourceSegment} ${rest}`.trim(),
94
109
  };
95
110
  }
96
-
97
- entry.text = rest.trim();
111
+ entry.text = unescapeEntityTimelineText(rest.trim());
98
112
  if (!entry.text) return null;
99
113
  return entry;
100
114
  }
@@ -241,6 +255,13 @@ export function unescapeEntityTimelineMetadataValue(value: string): string {
241
255
  }
242
256
  return result;
243
257
  }
258
+ export function escapeEntityTimelineText(value: string): string {
259
+ return /^\\*\[(?:remnic-origin=|remnic-meta-v1\])/i.test(value) ? `\\${value}` : value;
260
+ }
261
+
262
+ export function unescapeEntityTimelineText(value: string): string {
263
+ return /^\\+\[(?:remnic-origin=|remnic-meta-v1\])/i.test(value) ? value.slice(1) : value;
264
+ }
244
265
 
245
266
  export function serializeEntityTimelineEntry(entry: EntityTimelineEntry): string {
246
267
  const tokens: string[] = [];
@@ -257,8 +278,12 @@ export function serializeEntityTimelineEntry(entry: EntityTimelineEntry): string
257
278
  if (entry.principal) {
258
279
  tokens.push(`[principal=${escapeEntityTimelineMetadataValue(entry.principal)}]`);
259
280
  }
281
+ if (entry.origin) {
282
+ tokens.push(`[${ENTITY_TIMELINE_METADATA_MARKER}]`);
283
+ tokens.push(`[remnic-origin=${escapeEntityTimelineMetadataValue(entry.origin)}]`);
284
+ }
260
285
  const serializedMetadata = tokens.length > 0 ? `${tokens.join(" ")} ` : "";
261
- return `- ${serializedMetadata}${entry.text}`.trimEnd();
286
+ return `- ${serializedMetadata}${escapeEntityTimelineText(entry.text)}`.trimEnd();
262
287
  }
263
288
 
264
289
  export function dedupeEntityTimelineFacts(timeline: EntityTimelineEntry[]): string[] {
@@ -269,6 +294,32 @@ export function normalizeEntitySectionFact(value: string): string {
269
294
  return value.replace(/\s+/g, " ").trim();
270
295
  }
271
296
 
297
+ export function normalizeStructuredSectionFactsWithOrigins(
298
+ facts: string[],
299
+ factOrigins?: Array<string | undefined>,
300
+ defaultOrigin?: string,
301
+ ): Pick<EntityStructuredSection, "facts" | "factOrigins"> {
302
+ const normalizedFacts: string[] = [];
303
+ const origins: Array<string | undefined> = [];
304
+ const seen = new Map<string, number>();
305
+ for (const [index, fact] of facts.entries()) {
306
+ const normalized = normalizeEntitySectionFact(fact);
307
+ if (!normalized) continue;
308
+ const existingIndex = seen.get(normalized) ?? -1;
309
+ const origin = factOrigins?.[index] ?? defaultOrigin;
310
+ if (existingIndex >= 0) {
311
+ if (origins[existingIndex] !== origin) origins[existingIndex] = undefined;
312
+ continue;
313
+ }
314
+ seen.set(normalized, normalizedFacts.length);
315
+ normalizedFacts.push(normalized);
316
+ origins.push(origin);
317
+ }
318
+ return {
319
+ facts: normalizedFacts,
320
+ ...(origins.some((origin) => origin !== undefined) ? { factOrigins: origins } : {}),
321
+ };
322
+ }
272
323
  export function normalizeStructuredSectionFacts(facts: string[]): string[] {
273
324
  return [...new Set(facts.map((fact) => normalizeEntitySectionFact(fact)).filter((fact) => fact.length > 0))];
274
325
  }
@@ -304,14 +355,22 @@ export function compileEntityFacts(
304
355
  return facts;
305
356
  }
306
357
 
307
- function parseEntityStructuredSectionFacts(lines: string[]): string[] {
358
+ function parseEntityStructuredSectionFacts(
359
+ lines: string[],
360
+ ): Pick<EntityStructuredSection, "facts" | "factOrigins"> {
308
361
  const facts: string[] = [];
362
+ const factOrigins: Array<string | undefined> = [];
309
363
  let currentBlock: string[] = [];
364
+ let currentOrigin: string | undefined;
310
365
 
311
366
  const flushCurrentBlock = (): void => {
312
367
  const normalized = normalizeEntitySectionFact(currentBlock.join(" "));
313
- if (normalized.length > 0) facts.push(normalized);
368
+ if (normalized.length > 0) {
369
+ facts.push(normalized);
370
+ factOrigins.push(currentOrigin);
371
+ }
314
372
  currentBlock = [];
373
+ currentOrigin = undefined;
315
374
  };
316
375
 
317
376
  for (const rawLine of lines) {
@@ -322,16 +381,29 @@ function parseEntityStructuredSectionFacts(lines: string[]): string[] {
322
381
  }
323
382
  if (line.startsWith("- ")) {
324
383
  flushCurrentBlock();
325
- currentBlock = [line.slice(2).trim()];
384
+ const bullet = line.slice(2).trim();
385
+ const metadataPrefix = `[${ENTITY_TIMELINE_METADATA_MARKER}] `;
386
+ const hasMarker = bullet.startsWith(metadataPrefix);
387
+ const originStart = metadataPrefix.length;
388
+ const originPrefix = hasMarker && bullet.startsWith("[remnic-origin=", originStart);
389
+ const originEndOffset = originPrefix
390
+ ? findEntityTimelineTokenEnd(bullet.slice(originStart))
391
+ : -1;
392
+ const originEnd = originEndOffset >= 0 ? originEndOffset + originStart : -1;
393
+ const token = originEnd >= 0 ? bullet.slice(originStart + 15, originEnd) : "";
394
+ currentBlock = [originEnd >= 0
395
+ ? unescapeEntityTimelineText(bullet.slice(originEnd + 1).trimStart())
396
+ : unescapeEntityTimelineText(hasMarker ? bullet.slice(metadataPrefix.length) : bullet)];
397
+ currentOrigin = originEnd >= 0
398
+ ? unescapeEntityTimelineMetadataValue(token)
399
+ : undefined;
326
400
  continue;
327
401
  }
328
402
  currentBlock.push(line);
329
403
  }
330
-
331
404
  flushCurrentBlock();
332
- return [...new Set(facts)];
405
+ return normalizeStructuredSectionFactsWithOrigins(facts, factOrigins);
333
406
  }
334
-
335
407
  function looksLikeStructuredSectionFactList(lines: string[]): boolean {
336
408
  const firstNonBlank = lines.find((line) => line.trim().length > 0)?.trim() ?? "";
337
409
  return firstNonBlank.startsWith("- ");
@@ -355,27 +427,35 @@ export function partitionEntityStructuredSections(
355
427
  remainingExtraSections.push(section);
356
428
  continue;
357
429
  }
358
- const facts = parseEntityStructuredSectionFacts(section.lines);
359
- if (!matchedSection && facts.length === 0) {
430
+ const parsedFacts = parseEntityStructuredSectionFacts(section.lines);
431
+ if (!matchedSection && parsedFacts.facts.length === 0) {
360
432
  remainingExtraSections.push(section);
361
433
  continue;
362
434
  }
363
435
  const normalizedSection = matchedSection
364
436
  ? { key: matchedSection.key, title: matchedSection.title }
365
437
  : normalizeEntityStructuredSection(entityType, { key: section.title, title: section.title }, entitySchemas);
366
- if (facts.length === 0) {
438
+ if (parsedFacts.facts.length === 0) {
367
439
  remainingExtraSections.push(section);
368
440
  continue;
369
441
  }
370
442
  const existing = structuredSectionIndex.get(normalizedSection.key);
371
443
  if (existing) {
372
- existing.facts = normalizeStructuredSectionFacts([...existing.facts, ...facts]);
444
+ const existingOrigins = existing.facts.map((_, index) => existing.factOrigins?.[index]);
445
+ const incomingOrigins = parsedFacts.facts.map((_, index) => parsedFacts.factOrigins?.[index]);
446
+ const merged = normalizeStructuredSectionFactsWithOrigins(
447
+ [...existing.facts, ...parsedFacts.facts],
448
+ [...existingOrigins, ...incomingOrigins],
449
+ );
450
+ existing.facts = merged.facts;
451
+ existing.factOrigins = merged.factOrigins;
373
452
  continue;
374
453
  }
375
454
  const structuredSection: EntityStructuredSection = {
376
455
  key: normalizedSection.key,
377
456
  title: normalizedSection.title,
378
- facts: normalizeStructuredSectionFacts(facts),
457
+ facts: parsedFacts.facts,
458
+ ...(parsedFacts.factOrigins ? { factOrigins: parsedFacts.factOrigins } : {}),
379
459
  };
380
460
  structuredSections.push(structuredSection);
381
461
  structuredSectionIndex.set(normalizedSection.key, structuredSection);
package/src/storage.ts CHANGED
@@ -185,11 +185,15 @@ import {
185
185
  collectStructuredSectionFacts,
186
186
  compareEntityTimestamps,
187
187
  compileEntityFacts,
188
+ ENTITY_TIMELINE_METADATA_MARKER,
189
+ escapeEntityTimelineMetadataValue,
190
+ escapeEntityTimelineText,
188
191
  isEntitySynthesisStale,
189
192
  isEntitySynthesisTimelinePromotionBullet,
190
193
  latestEntityTimelineTimestamp,
191
194
  normalizeEntitySectionFact,
192
195
  normalizeStructuredSectionFacts,
196
+ normalizeStructuredSectionFactsWithOrigins,
193
197
  parseEntityTimelineBullet,
194
198
  partitionEntityStructuredSections,
195
199
  serializeEntityTimelineEntry,
@@ -220,6 +224,7 @@ export {
220
224
  fingerprintEntityStructuredFacts,
221
225
  isEntitySynthesisStale,
222
226
  normalizeStructuredSectionFacts,
227
+ normalizeStructuredSectionFactsWithOrigins,
223
228
  } from "./storage/entity-timeline.js";
224
229
  import {
225
230
  type ProjectedMemoryBrowseOptions,
@@ -244,7 +249,6 @@ import {
244
249
  } from "./write-envelope.js";
245
250
  // stripCitation import removed: legacy rebuild fallback was replaced by a
246
251
  // skip-with-warning strategy (Finding 1 — Uhol). See ensureFactHashIndexAuthoritative.
247
-
248
252
  type SharedVersionKind = "memory-status" | "artifact-write" | "cold-write" | "memory-corpus" | "entity-mutation";
249
253
 
250
254
  type OfflineSyncDigestCacheEntry = {
@@ -255,15 +259,12 @@ type OfflineSyncDigestCacheEntry = {
255
259
  sha256: string;
256
260
  bytes: number;
257
261
  };
258
-
259
-
260
262
  export interface ReextractJobRequest {
261
263
  memoryId: string;
262
264
  model: string;
263
265
  requestedAt: string;
264
266
  source: "cli-migrate";
265
267
  }
266
-
267
268
  export interface MemoryLifecycleEventWriteOptions {
268
269
  at?: Date;
269
270
  actor?: string;
@@ -272,7 +273,6 @@ export interface MemoryLifecycleEventWriteOptions {
272
273
  relatedMemoryIds?: string[];
273
274
  correlationId?: string;
274
275
  }
275
-
276
276
  /**
277
277
  * Validate a Memory Worth counter (`mw_success` / `mw_fail`) before we persist
278
278
  * it. Rejects non-finite, non-integer, and negative values rather than silently
@@ -1420,10 +1420,12 @@ export function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginCo
1420
1420
  const structuredSections = sortStructuredSectionsBySchema(
1421
1421
  entity.type,
1422
1422
  (entity.structuredSections ?? [])
1423
- .map((section) => ({
1424
- ...section,
1425
- facts: normalizeStructuredSectionFacts(section.facts),
1426
- }))
1423
+ .map((section) => {
1424
+ const normalized = normalizeStructuredSectionFactsWithOrigins(section.facts, section.factOrigins);
1425
+ const result = { ...section, ...normalized };
1426
+ if (normalized.factOrigins === undefined) delete result.factOrigins;
1427
+ return result;
1428
+ })
1427
1429
  .filter((section) => section.facts.length > 0),
1428
1430
  entitySchemas
1429
1431
  );
@@ -1443,7 +1445,6 @@ export function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginCo
1443
1445
  const synthesisStructuredFactCount = entity.synthesisStructuredFactCount;
1444
1446
  const synthesisStructuredFactDigest = entity.synthesisStructuredFactDigest?.trim() || "";
1445
1447
  const synthesisVersion = entity.synthesisVersion ?? (synthesis ? 1 : 0);
1446
-
1447
1448
  const lines: string[] = [
1448
1449
  "---",
1449
1450
  `created: ${created}`,
@@ -1464,14 +1465,12 @@ export function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginCo
1464
1465
  `**Updated:** ${updated}`,
1465
1466
  "",
1466
1467
  ];
1467
-
1468
1468
  if ((entity.preSectionLines ?? []).length > 0) {
1469
1469
  lines.push(...(entity.preSectionLines ?? []));
1470
1470
  if (entity.preSectionLines?.[entity.preSectionLines.length - 1] !== "") {
1471
1471
  lines.push("");
1472
1472
  }
1473
1473
  }
1474
-
1475
1474
  lines.push("## Synthesis", "");
1476
1475
  if (synthesis) {
1477
1476
  lines.push(synthesis);
@@ -1485,7 +1484,6 @@ export function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginCo
1485
1484
  }
1486
1485
  lines.push("");
1487
1486
  }
1488
-
1489
1487
  if (legacyFacts.length > 0) {
1490
1488
  lines.push("## Facts", "");
1491
1489
  for (const fact of legacyFacts) {
@@ -1493,15 +1491,17 @@ export function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginCo
1493
1491
  }
1494
1492
  lines.push("");
1495
1493
  }
1496
-
1497
1494
  for (const section of structuredSections) {
1498
1495
  lines.push(`## ${section.title}`, "");
1499
- for (const fact of section.facts) {
1500
- lines.push(`- ${fact}`);
1496
+ for (const [index, fact] of section.facts.entries()) {
1497
+ const origin = section.factOrigins?.[index];
1498
+ const prefix = origin
1499
+ ? `[${ENTITY_TIMELINE_METADATA_MARKER}] [remnic-origin=${escapeEntityTimelineMetadataValue(origin)}] `
1500
+ : "";
1501
+ lines.push(`- ${prefix}${escapeEntityTimelineText(fact)}`);
1501
1502
  }
1502
1503
  lines.push("");
1503
1504
  }
1504
-
1505
1505
  // Connected to (optional)
1506
1506
  if (entity.relationships.length > 0) {
1507
1507
  lines.push("## Connected to", "");
@@ -1510,7 +1510,6 @@ export function serializeEntityFile(entity: EntityFile, entitySchemas?: PluginCo
1510
1510
  }
1511
1511
  lines.push("");
1512
1512
  }
1513
-
1514
1513
  // Activity (optional)
1515
1514
  if (entity.activity.length > 0) {
1516
1515
  lines.push("## Activity", "");
@@ -4239,6 +4238,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4239
4238
  source?: string;
4240
4239
  sessionKey?: string;
4241
4240
  principal?: string;
4241
+ origin?: string;
4242
4242
  structuredSections?: EntityStructuredSection[];
4243
4243
  } = {}
4244
4244
  ): Promise<string> {
package/src/types.ts CHANGED
@@ -3374,19 +3374,19 @@ export interface EntityActivityEntry {
3374
3374
  date: string;
3375
3375
  note: string;
3376
3376
  }
3377
-
3378
3377
  export interface EntityTimelineEntry {
3379
3378
  timestamp: string;
3380
3379
  text: string;
3381
3380
  source?: string;
3382
3381
  sessionKey?: string;
3383
3382
  principal?: string;
3383
+ origin?: string;
3384
3384
  }
3385
-
3386
3385
  export interface EntityStructuredSection {
3387
3386
  key: string;
3388
3387
  title: string;
3389
3388
  facts: string[];
3389
+ factOrigins?: Array<string | undefined>;
3390
3390
  }
3391
3391
 
3392
3392
  export interface EntitySchemaSectionDefinition {