@remnic/core 9.62.0 → 9.62.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +28 -28
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +11 -11
  5. package/dist/access-authorization-probe.js +29 -29
  6. package/dist/access-boundary.d.ts +11 -11
  7. package/dist/access-boundary.js +28 -28
  8. package/dist/access-cli.js +93 -91
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.d.ts +11 -11
  12. package/dist/access-extraction-force-flush.js +28 -28
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-lcm-compaction.d.ts +11 -11
  15. package/dist/access-http-lifecycle-flush.d.ts +11 -11
  16. package/dist/access-http-offline-stream.d.ts +11 -11
  17. package/dist/access-http-query.js +28 -28
  18. package/dist/access-http.d.ts +12 -12
  19. package/dist/access-http.js +38 -38
  20. package/dist/access-identity-continuity-surface.d.ts +9 -9
  21. package/dist/access-identity-continuity-surface.js +28 -28
  22. package/dist/access-lcm-surface.d.ts +11 -11
  23. package/dist/access-lcm-surface.js +28 -28
  24. package/dist/access-mcp.d.ts +11 -11
  25. package/dist/access-mcp.js +33 -33
  26. package/dist/access-memory-search-fanout.d.ts +2 -2
  27. package/dist/{access-namespace-preflight-EMvicnrb.d.ts → access-namespace-preflight-yO4LMGFH.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +28 -28
  30. package/dist/access-observe-write-surface.d.ts +11 -11
  31. package/dist/access-observe-write-surface.js +28 -28
  32. package/dist/access-offline-manifest.d.ts +9 -9
  33. package/dist/access-offline-manifest.js +2 -2
  34. package/dist/access-operations-batch.js +29 -29
  35. package/dist/access-operations.d.ts +11 -11
  36. package/dist/access-operations.js +32 -32
  37. package/dist/access-recall-concurrency.d.ts +11 -11
  38. package/dist/access-recall-concurrency.js +28 -28
  39. package/dist/access-recall-response.d.ts +11 -11
  40. package/dist/access-recall-response.js +28 -28
  41. package/dist/access-recall-surface.d.ts +11 -11
  42. package/dist/access-recall-surface.js +28 -28
  43. package/dist/{access-service-BeDYQQ62.d.ts → access-service-M4LgO141.d.ts} +7 -7
  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 +28 -28
  47. package/dist/access-surface-catalog.d.ts +11 -11
  48. package/dist/access-surface-catalog.js +30 -30
  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-memory-bridge.js +2 -2
  53. package/dist/active-recall.d.ts +1 -1
  54. package/dist/active-recall.js +3 -3
  55. package/dist/ambient-provenance.d.ts +1 -1
  56. package/dist/artifact-search.d.ts +1 -1
  57. package/dist/{auto-sync-FMWQQB3J.js → auto-sync-Z52VWMNC.js} +3 -3
  58. package/dist/behavior-learner.d.ts +1 -1
  59. package/dist/behavior-learner.js +2 -2
  60. package/dist/behavior-signals.d.ts +1 -1
  61. package/dist/bootstrap.d.ts +9 -9
  62. package/dist/briefing-window.d.ts +2 -2
  63. package/dist/briefing.d.ts +2 -2
  64. package/dist/briefing.js +13 -12
  65. package/dist/buffer-surprise-report.d.ts +1 -1
  66. package/dist/buffer-turn-helpers.d.ts +1 -1
  67. package/dist/buffer.d.ts +2 -2
  68. package/dist/bulk-import/index.d.ts +3 -3
  69. package/dist/calibration.d.ts +1 -1
  70. package/dist/capabilities.d.ts +1 -1
  71. package/dist/{catalog-B2SxZ6LU.d.ts → catalog-CyYTf_ok.d.ts} +1 -1
  72. package/dist/causal-behavior.d.ts +1 -1
  73. package/dist/causal-behavior.js +3 -3
  74. package/dist/causal-chain.js +3 -3
  75. package/dist/causal-consolidation.d.ts +1 -1
  76. package/dist/causal-consolidation.js +16 -16
  77. package/dist/causal-retrieval.js +3 -3
  78. package/dist/causal-trajectory-graph.d.ts +1 -1
  79. package/dist/causal-trajectory.js +2 -2
  80. package/dist/{chunk-B2QHVLJO.js → chunk-256FBCVX.js} +22 -10
  81. package/dist/chunk-256FBCVX.js.map +1 -0
  82. package/dist/{chunk-QP2IZTUR.js → chunk-2TYIAKU5.js} +2 -2
  83. package/dist/{chunk-HQBVQICL.js → chunk-347ZR6D4.js} +2 -2
  84. package/dist/{chunk-76YNCJ5H.js → chunk-3F3CVVDS.js} +2 -2
  85. package/dist/{chunk-TE4MKFT2.js → chunk-3MA7JVXN.js} +4 -4
  86. package/dist/{chunk-KHQ57QLJ.js → chunk-46WM6JX2.js} +7 -3
  87. package/dist/chunk-46WM6JX2.js.map +1 -0
  88. package/dist/chunk-47DU4SGJ.js +92 -0
  89. package/dist/chunk-47DU4SGJ.js.map +1 -0
  90. package/dist/{chunk-AWRJBAIH.js → chunk-4FFROSFG.js} +37 -14
  91. package/dist/{chunk-AWRJBAIH.js.map → chunk-4FFROSFG.js.map} +1 -1
  92. package/dist/{chunk-N4OYPGZS.js → chunk-4HO3542O.js} +2 -2
  93. package/dist/{chunk-HEEEMJ26.js → chunk-4IZ2IT7D.js} +3 -3
  94. package/dist/{chunk-4XAVQLBR.js → chunk-4Y2RHVCV.js} +2 -2
  95. package/dist/{chunk-33JBK2XP.js → chunk-5F6HMNMZ.js} +2 -2
  96. package/dist/{chunk-5WQMORU5.js → chunk-5PFGMO33.js} +2 -2
  97. package/dist/{chunk-6HEM6HTQ.js → chunk-6GGTATZF.js} +2 -2
  98. package/dist/{chunk-W3Y6FYRK.js → chunk-7BJYTX6Q.js} +2 -2
  99. package/dist/{chunk-2GRLJMKJ.js → chunk-7DRSWPUV.js} +3 -3
  100. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  101. package/dist/{chunk-HXXGZ4KV.js → chunk-ALNZEWGN.js} +2 -2
  102. package/dist/{chunk-5WVUO6QT.js → chunk-AR253JBM.js} +1 -1
  103. package/dist/chunk-AR253JBM.js.map +1 -0
  104. package/dist/{chunk-S3B3UIQ3.js → chunk-AYIHDC5S.js} +2 -2
  105. package/dist/{chunk-2RIDW23Y.js → chunk-BBHFAVMP.js} +8 -8
  106. package/dist/{chunk-MJ4UGUR6.js → chunk-BHO6RHE5.js} +3 -3
  107. package/dist/{chunk-URN7XWGC.js → chunk-BP6WMYLP.js} +3 -3
  108. package/dist/{chunk-YUIBXMZY.js → chunk-CALURYWR.js} +284 -249
  109. package/dist/chunk-CALURYWR.js.map +1 -0
  110. package/dist/{chunk-D5HDJWNN.js → chunk-CH627RRV.js} +4 -4
  111. package/dist/{chunk-C3R732UY.js → chunk-CLJ5QS6J.js} +257 -60
  112. package/dist/chunk-CLJ5QS6J.js.map +1 -0
  113. package/dist/{chunk-YLHM5BQQ.js → chunk-DCUMFQYM.js} +171 -8
  114. package/dist/chunk-DCUMFQYM.js.map +1 -0
  115. package/dist/{chunk-ZBJMUXZH.js → chunk-DJ7HMNSL.js} +15 -8
  116. package/dist/chunk-DJ7HMNSL.js.map +1 -0
  117. package/dist/{chunk-XDK6ZFLL.js → chunk-DROAPP6N.js} +3 -3
  118. package/dist/{chunk-MU3TPZOV.js → chunk-DTLF2SLZ.js} +2 -2
  119. package/dist/{chunk-I67HKRBF.js → chunk-EFWHCTYJ.js} +2 -2
  120. package/dist/{chunk-XD4VGLDL.js → chunk-FF6E6HOT.js} +56 -52
  121. package/dist/chunk-FF6E6HOT.js.map +1 -0
  122. package/dist/{chunk-NP7FLVZW.js → chunk-G2FCSILA.js} +2 -2
  123. package/dist/{chunk-3GPBFDXH.js → chunk-H23GIXJC.js} +2 -2
  124. package/dist/{chunk-WT6UL3UA.js → chunk-H7PRHUBD.js} +2 -2
  125. package/dist/{chunk-4JGSG7QN.js → chunk-HSBQJRV2.js} +2 -2
  126. package/dist/{chunk-L33N3BCA.js → chunk-HVKMJAEF.js} +2 -2
  127. package/dist/{chunk-CSOYVTRX.js → chunk-IIPJKCZB.js} +3 -3
  128. package/dist/{chunk-E57E5SCS.js → chunk-IRLH4NM2.js} +3 -3
  129. package/dist/{chunk-H32ANIFP.js → chunk-IZRNVNPV.js} +2 -2
  130. package/dist/{chunk-XBR5BAKW.js → chunk-JCJGYNIS.js} +3 -3
  131. package/dist/{chunk-EIQFIJDM.js → chunk-JDI7G6EA.js} +2 -2
  132. package/dist/{chunk-QWPAQLYV.js → chunk-JFLKSD5V.js} +2 -2
  133. package/dist/{chunk-KQS72GCR.js → chunk-LJOIZPJH.js} +2 -2
  134. package/dist/{chunk-N4EPIKSY.js → chunk-LLGDVG52.js} +3 -3
  135. package/dist/{chunk-7N7DB4L5.js → chunk-LTJTP5YQ.js} +10 -9
  136. package/dist/chunk-LTJTP5YQ.js.map +1 -0
  137. package/dist/{chunk-VOELBUS4.js → chunk-NXH34IPL.js} +2 -2
  138. package/dist/{chunk-XL3TATMJ.js → chunk-OQIRBGUU.js} +21 -12
  139. package/dist/chunk-OQIRBGUU.js.map +1 -0
  140. package/dist/chunk-PJKTFXE2.js +119 -0
  141. package/dist/chunk-PJKTFXE2.js.map +1 -0
  142. package/dist/{chunk-JGW2EUCQ.js → chunk-PMRUMGK6.js} +2 -2
  143. package/dist/{chunk-KAB7TZN3.js → chunk-PSNN25DW.js} +2 -2
  144. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  145. package/dist/{chunk-PA5OPZX2.js → chunk-QCI73Z7C.js} +2 -2
  146. package/dist/{chunk-EHMMRZOZ.js → chunk-QICOU4RY.js} +2 -2
  147. package/dist/{chunk-FW73HN33.js → chunk-RFH7U5LT.js} +2 -2
  148. package/dist/{chunk-4SGDYYWV.js → chunk-RPKJHYVE.js} +2 -2
  149. package/dist/{chunk-DSA47WBN.js → chunk-RYST72N5.js} +13 -2
  150. package/dist/chunk-RYST72N5.js.map +1 -0
  151. package/dist/{chunk-L4DLLKPN.js → chunk-SZ4HFZKB.js} +2 -2
  152. package/dist/chunk-T3GIETKV.js +152 -0
  153. package/dist/chunk-T3GIETKV.js.map +1 -0
  154. package/dist/{chunk-MYZ4NA43.js → chunk-TGSMU3F2.js} +3 -3
  155. package/dist/{chunk-CM4SZZBN.js → chunk-TIRJV2LW.js} +2 -2
  156. package/dist/{chunk-EGW4O32Z.js → chunk-UDTME32W.js} +7 -4
  157. package/dist/chunk-UDTME32W.js.map +1 -0
  158. package/dist/{chunk-CIA6ZUBA.js → chunk-WMOJIOIG.js} +2 -2
  159. package/dist/{chunk-W4Q54HM3.js → chunk-WR2YKUIW.js} +2 -2
  160. package/dist/{chunk-VWDTV6SH.js → chunk-X6E7TT3A.js} +2 -2
  161. package/dist/{chunk-D4OCJSLV.js → chunk-YDPAE2RD.js} +2 -2
  162. package/dist/{chunk-G3YBWFUC.js → chunk-YIIC5IDU.js} +35 -18
  163. package/dist/chunk-YIIC5IDU.js.map +1 -0
  164. package/dist/{chunk-QRKYABS6.js → chunk-YSR3DXGC.js} +2 -2
  165. package/dist/{chunk-LBJBNWS2.js → chunk-YTHQHH5U.js} +2 -2
  166. package/dist/{chunk-GN7HO2LA.js → chunk-ZPGHA7EO.js} +12 -12
  167. package/dist/{chunk-VUDALPI5.js → chunk-ZQKXRKMR.js} +19 -5
  168. package/dist/chunk-ZQKXRKMR.js.map +1 -0
  169. package/dist/{chunk-FQSDU634.js → chunk-ZS4JADYY.js} +3 -3
  170. package/dist/{cli-DB_uakTc.d.ts → cli-Bw9z-KqX.d.ts} +5 -5
  171. package/dist/cli.d.ts +13 -13
  172. package/dist/cli.js +62 -62
  173. package/dist/coding/pre-action-gate.d.ts +1 -1
  174. package/dist/coding/pre-action-gate.js +3 -3
  175. package/dist/compounding/engine.d.ts +2 -2
  176. package/dist/compounding/engine.js +13 -12
  177. package/dist/compounding/preference-consolidator.d.ts +1 -1
  178. package/dist/compression-optimizer.d.ts +1 -1
  179. package/dist/config.d.ts +1 -1
  180. package/dist/config.js +3 -3
  181. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  182. package/dist/connectors/codex-materialize-runner.js +13 -12
  183. package/dist/connectors/codex-materialize.d.ts +1 -1
  184. package/dist/connectors/index.d.ts +1 -1
  185. package/dist/connectors/index.js +13 -12
  186. package/dist/consolidation-provenance-check.d.ts +2 -2
  187. package/dist/consolidation-undo.d.ts +2 -2
  188. package/dist/contradiction/index.d.ts +2 -2
  189. package/dist/converge-config.d.ts +1 -1
  190. package/dist/convergence-refresh.d.ts +2 -2
  191. package/dist/convergence-refresh.js +15 -14
  192. package/dist/conversation-index/backend.d.ts +1 -1
  193. package/dist/conversation-index/chunker.d.ts +1 -1
  194. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  195. package/dist/conversation-index/indexer.d.ts +1 -1
  196. package/dist/conversation-index/search.d.ts +1 -1
  197. package/dist/corpus-watermark.d.ts +1 -1
  198. package/dist/corpus-watermark.js +15 -14
  199. package/dist/day-summary.d.ts +1 -1
  200. package/dist/delinearize.d.ts +1 -1
  201. package/dist/dependency-propagation-config.d.ts +1 -1
  202. package/dist/{dependency-propagation-delivery-DcOVpK3y.d.ts → dependency-propagation-delivery-BxhvAppj.d.ts} +1 -1
  203. package/dist/direct-answer-wiring.d.ts +1 -1
  204. package/dist/direct-answer-wiring.js +3 -3
  205. package/dist/direct-answer.d.ts +1 -1
  206. package/dist/direct-answer.js +2 -2
  207. package/dist/embedding-fallback.d.ts +1 -1
  208. package/dist/enrichment/index.d.ts +1 -1
  209. package/dist/entity-origin-fields.d.ts +1 -1
  210. package/dist/entity-retrieval.d.ts +2 -2
  211. package/dist/entity-retrieval.js +13 -12
  212. package/dist/entity-schema.d.ts +1 -1
  213. package/dist/episodic-context.d.ts +92 -0
  214. package/dist/episodic-context.js +16 -0
  215. package/dist/episodic-context.js.map +1 -0
  216. package/dist/explicit-capture.d.ts +9 -9
  217. package/dist/external-wiki-access.d.ts +11 -11
  218. package/dist/external-wiki-access.js +29 -29
  219. package/dist/external-wiki-collection-registration.d.ts +1 -1
  220. package/dist/external-wiki-collection.d.ts +1 -1
  221. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  222. package/dist/extraction-error-classification.d.ts +1 -1
  223. package/dist/extraction-faithfulness.d.ts +1 -1
  224. package/dist/extraction-judge-telemetry.d.ts +1 -1
  225. package/dist/extraction-judge-training.d.ts +1 -1
  226. package/dist/extraction-judge.d.ts +1 -1
  227. package/dist/extraction-liveness.d.ts +1 -1
  228. package/dist/extraction-normalization.d.ts +1 -1
  229. package/dist/extraction-normalization.js +2 -2
  230. package/dist/extraction-prompt.d.ts +1 -1
  231. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  232. package/dist/extraction-source-grounding.d.ts +1 -1
  233. package/dist/extraction-source-grounding.js +3 -3
  234. package/dist/extraction.d.ts +1 -1
  235. package/dist/extraction.js +18 -18
  236. package/dist/fallback-llm.d.ts +1 -1
  237. package/dist/{forget-5TWK7CZT.js → forget-SZ2BXDGF.js} +2 -2
  238. package/dist/graph-dashboard-diff.d.ts +1 -1
  239. package/dist/graph-dashboard-key.d.ts +1 -1
  240. package/dist/graph-dashboard-parser.d.ts +1 -1
  241. package/dist/graph-edge-reinforcement.d.ts +1 -1
  242. package/dist/graph-path-reconstruction.d.ts +1 -1
  243. package/dist/graph-path-scoring.d.ts +1 -1
  244. package/dist/graph-snapshot.d.ts +1 -1
  245. package/dist/graph.d.ts +1 -1
  246. package/dist/harmonic-construction.js +2 -2
  247. package/dist/harmonic-retrieval.js +2 -2
  248. package/dist/importance.d.ts +1 -1
  249. package/dist/importers/index.d.ts +1 -1
  250. package/dist/in-flight-reads.d.ts +1 -1
  251. package/dist/index.d.ts +22 -21
  252. package/dist/index.js +118 -103
  253. package/dist/intent.d.ts +1 -1
  254. package/dist/lcm/engine.d.ts +8 -2
  255. package/dist/lcm/engine.js +4 -4
  256. package/dist/lcm/index.d.ts +1 -1
  257. package/dist/lcm/index.js +9 -9
  258. package/dist/lcm/tools.d.ts +1 -1
  259. package/dist/lifecycle.d.ts +1 -1
  260. package/dist/live-connectors-runner.d.ts +1 -1
  261. package/dist/local-llm.d.ts +1 -1
  262. package/dist/local-model-endpoint.d.ts +1 -1
  263. package/dist/maintenance/memory-governance.d.ts +1 -1
  264. package/dist/maintenance/memory-governance.js +13 -12
  265. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  266. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +13 -12
  267. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  268. package/dist/maintenance/rebuild-memory-projection.js +14 -13
  269. package/dist/{maintenance-5c1olVtB.d.ts → maintenance-uJb74j64.d.ts} +3 -3
  270. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  271. package/dist/memory-action-policy.d.ts +1 -1
  272. package/dist/memory-cache.d.ts +1 -1
  273. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  274. package/dist/memory-projection-store.d.ts +1 -1
  275. package/dist/memory-provenance.d.ts +1 -1
  276. package/dist/memory-snapshot.d.ts +1 -1
  277. package/dist/memory-worth-outcomes.d.ts +2 -2
  278. package/dist/models-json.d.ts +1 -1
  279. package/dist/namespaces/migrate.d.ts +3 -3
  280. package/dist/namespaces/migrate.js +14 -13
  281. package/dist/namespaces/principal.d.ts +1 -1
  282. package/dist/namespaces/search.d.ts +1 -1
  283. package/dist/namespaces/search.js +6 -5
  284. package/dist/namespaces/storage.d.ts +3 -3
  285. package/dist/namespaces/storage.js +13 -12
  286. package/dist/native-knowledge.d.ts +1 -1
  287. package/dist/offline-sync-impression-drain.d.ts +1 -1
  288. package/dist/operator-doctor-corpus.d.ts +1 -1
  289. package/dist/operator-doctor-corpus.js +16 -15
  290. package/dist/operator-doctor-replica.d.ts +1 -1
  291. package/dist/operator-toolkit.d.ts +3 -3
  292. package/dist/operator-toolkit.js +21 -20
  293. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  294. package/dist/orchestration/maintenance.d.ts +4 -4
  295. package/dist/orchestration/maintenance.js +18 -17
  296. package/dist/{orchestrator-HPuY6I4i.d.ts → orchestrator-CFi-5JSR.d.ts} +23 -8
  297. package/dist/orchestrator.d.ts +9 -9
  298. package/dist/orchestrator.js +93 -91
  299. package/dist/patterns-cli.d.ts +1 -1
  300. package/dist/{pipeline-CvVe1Q2_.d.ts → pipeline-BdF3ferY.d.ts} +1 -1
  301. package/dist/policy-runtime.d.ts +1 -1
  302. package/dist/policy-runtime.js +3 -3
  303. package/dist/proactive-contention.d.ts +1 -1
  304. package/dist/provenance.d.ts +1 -1
  305. package/dist/provenance.js +2 -2
  306. package/dist/{public-http-D0JKFkyf.d.ts → public-http-DK-QwaBu.d.ts} +1 -1
  307. package/dist/{qmd-Bd0Tp76_.d.ts → qmd-D_62bYNl.d.ts} +1 -1
  308. package/dist/qmd-preflight.d.ts +2 -2
  309. package/dist/qmd-recall-cache.d.ts +1 -1
  310. package/dist/qmd.d.ts +2 -2
  311. package/dist/recall-concurrency-config.d.ts +1 -1
  312. package/dist/recall-disclosure-escalation.d.ts +1 -1
  313. package/dist/recall-explain-renderer.d.ts +1 -1
  314. package/dist/recall-explain-renderer.js +3 -3
  315. package/dist/recall-memory-map.d.ts +1 -1
  316. package/dist/recall-planner-llm.d.ts +1 -1
  317. package/dist/recall-query-policy.js +2 -2
  318. package/dist/recall-state.d.ts +1 -1
  319. package/dist/recall-tag-filter.d.ts +1 -1
  320. package/dist/recall-timings.d.ts +1 -1
  321. package/dist/recall-tokenization.d.ts +3 -1
  322. package/dist/recall-tokenization.js +5 -1
  323. package/dist/recall-xray-cli.d.ts +1 -1
  324. package/dist/recall-xray-cli.js +4 -4
  325. package/dist/recall-xray-renderer.d.ts +1 -1
  326. package/dist/recall-xray-renderer.js +3 -3
  327. package/dist/recall-xray.d.ts +1 -1
  328. package/dist/recall-xray.js +2 -2
  329. package/dist/reconcile/cursor.d.ts +1 -1
  330. package/dist/reconcile/manifest.d.ts +10 -1
  331. package/dist/reconcile/manifest.js +1 -1
  332. package/dist/reconcile/plan.d.ts +1 -1
  333. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  334. package/dist/replay/normalizers/claude.d.ts +1 -1
  335. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  336. package/dist/replay/normalizers/shared.d.ts +1 -1
  337. package/dist/replay/runner.d.ts +1 -1
  338. package/dist/replay/types.d.ts +1 -1
  339. package/dist/replica-divergence.d.ts +1 -1
  340. package/dist/replica-peers-config.d.ts +1 -1
  341. package/dist/resolve-auth-token.d.ts +1 -1
  342. package/dist/resume-bundles.js +6 -6
  343. package/dist/retrieval-agents.d.ts +2 -2
  344. package/dist/retrieval-tiers.d.ts +1 -1
  345. package/dist/routing/engine.d.ts +1 -1
  346. package/dist/routing/store.d.ts +1 -1
  347. package/dist/salvage-envelope.d.ts +1 -1
  348. package/dist/{scope-profiles-ClLtm9gK.d.ts → scope-profiles-CeMv7pP0.d.ts} +1 -1
  349. package/dist/search/embed-helper.d.ts +1 -1
  350. package/dist/search/factory.d.ts +1 -1
  351. package/dist/search/factory.js +5 -4
  352. package/dist/search/index.d.ts +1 -1
  353. package/dist/search/index.js +9 -8
  354. package/dist/search/lancedb-backend.d.ts +14 -1
  355. package/dist/search/lancedb-backend.js +1 -1
  356. package/dist/search/meilisearch-backend.d.ts +1 -1
  357. package/dist/search/noop-backend.d.ts +1 -1
  358. package/dist/search/orama-backend.d.ts +22 -1
  359. package/dist/search/orama-backend.js +2 -1
  360. package/dist/search/port.d.ts +1 -1
  361. package/dist/search/remote-backend.d.ts +1 -1
  362. package/dist/{semantic-consolidation-B1EkeEDj.d.ts → semantic-consolidation-B-85brYj.d.ts} +1 -1
  363. package/dist/semantic-consolidation.d.ts +2 -2
  364. package/dist/semantic-consolidation.js +14 -14
  365. package/dist/semantic-rule-promotion.js +13 -12
  366. package/dist/semantic-rule-verifier.d.ts +1 -1
  367. package/dist/semantic-rule-verifier.js +13 -13
  368. package/dist/{service-Cf3ANQj9.d.ts → service-CoO0HA2E.d.ts} +2 -2
  369. package/dist/session-observer-bands.d.ts +1 -1
  370. package/dist/session-observer-state.d.ts +1 -1
  371. package/dist/shared-context/manager.d.ts +1 -1
  372. package/dist/signal.d.ts +1 -1
  373. package/dist/source-agent-qualifier.d.ts +1 -1
  374. package/dist/source-agent-qualifier.js +15 -14
  375. package/dist/{storage-DS2O_6Qt.d.ts → storage-BVAVitkO.d.ts} +1 -1
  376. package/dist/storage.d.ts +2 -2
  377. package/dist/storage.js +12 -11
  378. package/dist/summarizer.d.ts +1 -1
  379. package/dist/summary-snapshot.d.ts +1 -1
  380. package/dist/support-passport/index.d.ts +14 -14
  381. package/dist/support-passport/index.js +31 -31
  382. package/dist/temporal-supersession.d.ts +2 -2
  383. package/dist/temporal-timeline-recall.d.ts +1 -1
  384. package/dist/temporal-validity.d.ts +1 -1
  385. package/dist/threading.d.ts +1 -1
  386. package/dist/tier-migration.d.ts +2 -2
  387. package/dist/tier-routing.d.ts +1 -1
  388. package/dist/topics.d.ts +1 -1
  389. package/dist/transcript.d.ts +1 -1
  390. package/dist/transfer/import-sqlite.js +2 -2
  391. package/dist/trust-score-stage.d.ts +1 -1
  392. package/dist/trust-score.d.ts +1 -1
  393. package/dist/trust-zones.js +2 -2
  394. package/dist/{types-BOANGhCJ.d.ts → types-DWHOxlZP.d.ts} +3 -0
  395. package/dist/types.d.ts +1 -1
  396. package/dist/types.js +1 -1
  397. package/dist/user-message-cleaning.d.ts +23 -0
  398. package/dist/user-message-cleaning.js +10 -0
  399. package/dist/user-message-cleaning.js.map +1 -0
  400. package/dist/utility-runtime.d.ts +1 -1
  401. package/dist/verified-recall.js +13 -13
  402. package/dist/whitespace.d.ts +26 -1
  403. package/dist/whitespace.js +11 -3
  404. package/dist/work-product-ledger.js +2 -2
  405. package/dist/write-envelope.d.ts +1 -1
  406. package/package.json +12 -2
  407. package/src/access-service-offline-file-content.test.ts +1 -0
  408. package/src/cli.ts +14 -13
  409. package/src/config.ts +11 -0
  410. package/src/entity-retrieval.ts +4 -7
  411. package/src/episodic-context-recall.integration.test.ts +169 -0
  412. package/src/episodic-context.test.ts +266 -0
  413. package/src/episodic-context.ts +274 -0
  414. package/src/harmonic-construction.test.ts +187 -2
  415. package/src/harmonic-retrieval.ts +54 -32
  416. package/src/index.ts +3 -4
  417. package/src/lcm/engine.ts +18 -1
  418. package/src/lifecycle/tombstones.test.ts +134 -0
  419. package/src/lifecycle/tombstones.ts +29 -2
  420. package/src/orchestration/episodic-context-section.ts +255 -0
  421. package/src/orchestration/recall-internal-deps.ts +2 -0
  422. package/src/orchestration/recall-internal.ts +40 -25
  423. package/src/orchestration/recall-result-formatter.ts +37 -0
  424. package/src/orchestration/recall-section-coordinator.ts +20 -14
  425. package/src/recall-tokenization.ts +14 -8
  426. package/src/reconcile/manifest.test.ts +133 -4
  427. package/src/reconcile/manifest.ts +43 -7
  428. package/src/search/factory.ts +1 -0
  429. package/src/search/lancedb-backend.ts +24 -16
  430. package/src/search/orama-backend.test.ts +208 -1
  431. package/src/search/orama-backend.ts +133 -18
  432. package/src/search/orama-cjk-tokenizer.test.ts +108 -0
  433. package/src/search/orama-cjk-tokenizer.ts +143 -0
  434. package/src/storage/tombstone-migration-sources.test.ts +116 -0
  435. package/src/storage/tombstone-migration-sources.ts +90 -0
  436. package/src/storage.ts +13 -34
  437. package/src/types.ts +3 -3
  438. package/src/user-message-cleaning.ts +139 -0
  439. package/src/whitespace.test.ts +178 -0
  440. package/src/whitespace.ts +119 -0
  441. package/dist/chunk-5WVUO6QT.js.map +0 -1
  442. package/dist/chunk-6MKAMLQL.js +0 -16
  443. package/dist/chunk-6MKAMLQL.js.map +0 -1
  444. package/dist/chunk-7N7DB4L5.js.map +0 -1
  445. package/dist/chunk-B2QHVLJO.js.map +0 -1
  446. package/dist/chunk-C3R732UY.js.map +0 -1
  447. package/dist/chunk-DSA47WBN.js.map +0 -1
  448. package/dist/chunk-EGW4O32Z.js.map +0 -1
  449. package/dist/chunk-G3YBWFUC.js.map +0 -1
  450. package/dist/chunk-KHQ57QLJ.js.map +0 -1
  451. package/dist/chunk-VUDALPI5.js.map +0 -1
  452. package/dist/chunk-XD4VGLDL.js.map +0 -1
  453. package/dist/chunk-XL3TATMJ.js.map +0 -1
  454. package/dist/chunk-YLHM5BQQ.js.map +0 -1
  455. package/dist/chunk-YUIBXMZY.js.map +0 -1
  456. package/dist/chunk-ZBJMUXZH.js.map +0 -1
  457. /package/dist/{auto-sync-FMWQQB3J.js.map → auto-sync-Z52VWMNC.js.map} +0 -0
  458. /package/dist/{chunk-QP2IZTUR.js.map → chunk-2TYIAKU5.js.map} +0 -0
  459. /package/dist/{chunk-HQBVQICL.js.map → chunk-347ZR6D4.js.map} +0 -0
  460. /package/dist/{chunk-76YNCJ5H.js.map → chunk-3F3CVVDS.js.map} +0 -0
  461. /package/dist/{chunk-TE4MKFT2.js.map → chunk-3MA7JVXN.js.map} +0 -0
  462. /package/dist/{chunk-N4OYPGZS.js.map → chunk-4HO3542O.js.map} +0 -0
  463. /package/dist/{chunk-HEEEMJ26.js.map → chunk-4IZ2IT7D.js.map} +0 -0
  464. /package/dist/{chunk-4XAVQLBR.js.map → chunk-4Y2RHVCV.js.map} +0 -0
  465. /package/dist/{chunk-33JBK2XP.js.map → chunk-5F6HMNMZ.js.map} +0 -0
  466. /package/dist/{chunk-5WQMORU5.js.map → chunk-5PFGMO33.js.map} +0 -0
  467. /package/dist/{chunk-6HEM6HTQ.js.map → chunk-6GGTATZF.js.map} +0 -0
  468. /package/dist/{chunk-W3Y6FYRK.js.map → chunk-7BJYTX6Q.js.map} +0 -0
  469. /package/dist/{chunk-2GRLJMKJ.js.map → chunk-7DRSWPUV.js.map} +0 -0
  470. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  471. /package/dist/{chunk-HXXGZ4KV.js.map → chunk-ALNZEWGN.js.map} +0 -0
  472. /package/dist/{chunk-S3B3UIQ3.js.map → chunk-AYIHDC5S.js.map} +0 -0
  473. /package/dist/{chunk-2RIDW23Y.js.map → chunk-BBHFAVMP.js.map} +0 -0
  474. /package/dist/{chunk-MJ4UGUR6.js.map → chunk-BHO6RHE5.js.map} +0 -0
  475. /package/dist/{chunk-URN7XWGC.js.map → chunk-BP6WMYLP.js.map} +0 -0
  476. /package/dist/{chunk-D5HDJWNN.js.map → chunk-CH627RRV.js.map} +0 -0
  477. /package/dist/{chunk-XDK6ZFLL.js.map → chunk-DROAPP6N.js.map} +0 -0
  478. /package/dist/{chunk-MU3TPZOV.js.map → chunk-DTLF2SLZ.js.map} +0 -0
  479. /package/dist/{chunk-I67HKRBF.js.map → chunk-EFWHCTYJ.js.map} +0 -0
  480. /package/dist/{chunk-NP7FLVZW.js.map → chunk-G2FCSILA.js.map} +0 -0
  481. /package/dist/{chunk-3GPBFDXH.js.map → chunk-H23GIXJC.js.map} +0 -0
  482. /package/dist/{chunk-WT6UL3UA.js.map → chunk-H7PRHUBD.js.map} +0 -0
  483. /package/dist/{chunk-4JGSG7QN.js.map → chunk-HSBQJRV2.js.map} +0 -0
  484. /package/dist/{chunk-L33N3BCA.js.map → chunk-HVKMJAEF.js.map} +0 -0
  485. /package/dist/{chunk-CSOYVTRX.js.map → chunk-IIPJKCZB.js.map} +0 -0
  486. /package/dist/{chunk-E57E5SCS.js.map → chunk-IRLH4NM2.js.map} +0 -0
  487. /package/dist/{chunk-H32ANIFP.js.map → chunk-IZRNVNPV.js.map} +0 -0
  488. /package/dist/{chunk-XBR5BAKW.js.map → chunk-JCJGYNIS.js.map} +0 -0
  489. /package/dist/{chunk-EIQFIJDM.js.map → chunk-JDI7G6EA.js.map} +0 -0
  490. /package/dist/{chunk-QWPAQLYV.js.map → chunk-JFLKSD5V.js.map} +0 -0
  491. /package/dist/{chunk-KQS72GCR.js.map → chunk-LJOIZPJH.js.map} +0 -0
  492. /package/dist/{chunk-N4EPIKSY.js.map → chunk-LLGDVG52.js.map} +0 -0
  493. /package/dist/{chunk-VOELBUS4.js.map → chunk-NXH34IPL.js.map} +0 -0
  494. /package/dist/{chunk-JGW2EUCQ.js.map → chunk-PMRUMGK6.js.map} +0 -0
  495. /package/dist/{chunk-KAB7TZN3.js.map → chunk-PSNN25DW.js.map} +0 -0
  496. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  497. /package/dist/{chunk-PA5OPZX2.js.map → chunk-QCI73Z7C.js.map} +0 -0
  498. /package/dist/{chunk-EHMMRZOZ.js.map → chunk-QICOU4RY.js.map} +0 -0
  499. /package/dist/{chunk-FW73HN33.js.map → chunk-RFH7U5LT.js.map} +0 -0
  500. /package/dist/{chunk-4SGDYYWV.js.map → chunk-RPKJHYVE.js.map} +0 -0
  501. /package/dist/{chunk-L4DLLKPN.js.map → chunk-SZ4HFZKB.js.map} +0 -0
  502. /package/dist/{chunk-MYZ4NA43.js.map → chunk-TGSMU3F2.js.map} +0 -0
  503. /package/dist/{chunk-CM4SZZBN.js.map → chunk-TIRJV2LW.js.map} +0 -0
  504. /package/dist/{chunk-CIA6ZUBA.js.map → chunk-WMOJIOIG.js.map} +0 -0
  505. /package/dist/{chunk-W4Q54HM3.js.map → chunk-WR2YKUIW.js.map} +0 -0
  506. /package/dist/{chunk-VWDTV6SH.js.map → chunk-X6E7TT3A.js.map} +0 -0
  507. /package/dist/{chunk-D4OCJSLV.js.map → chunk-YDPAE2RD.js.map} +0 -0
  508. /package/dist/{chunk-QRKYABS6.js.map → chunk-YSR3DXGC.js.map} +0 -0
  509. /package/dist/{chunk-LBJBNWS2.js.map → chunk-YTHQHH5U.js.map} +0 -0
  510. /package/dist/{chunk-GN7HO2LA.js.map → chunk-ZPGHA7EO.js.map} +0 -0
  511. /package/dist/{chunk-FQSDU634.js.map → chunk-ZS4JADYY.js.map} +0 -0
  512. /package/dist/{forget-5TWK7CZT.js.map → forget-SZ2BXDGF.js.map} +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-VEWZZM3H.js";
8
8
  import {
9
9
  buildFactProvenance
10
- } from "./chunk-VOELBUS4.js";
10
+ } from "./chunk-NXH34IPL.js";
11
11
 
12
12
  // src/extraction-source-grounding.ts
13
13
  function applyExtractionSourceGrounding2(result, sourceText, assertionSourceText = sourceText, roleAssertionSources, messageTimestamp, options) {
@@ -70,4 +70,4 @@ export {
70
70
  attachExtractionProvenance,
71
71
  filterExtractionResultBySource2 as filterExtractionResultBySource
72
72
  };
73
- //# sourceMappingURL=chunk-L4DLLKPN.js.map
73
+ //# sourceMappingURL=chunk-SZ4HFZKB.js.map
@@ -0,0 +1,152 @@
1
+ // src/episodic-context.ts
2
+ var TURN_FIELD_SEPARATOR = String.fromCharCode(1);
3
+ function resolveProvenanceTurnIndex(turnId) {
4
+ if (typeof turnId !== "string" || turnId.length === 0) return null;
5
+ const lastField = turnId.includes(TURN_FIELD_SEPARATOR) ? turnId.split(TURN_FIELD_SEPARATOR).pop() : turnId;
6
+ if (!/^\d+$/.test(lastField)) return null;
7
+ const parsed = Number.parseInt(lastField, 10);
8
+ return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;
9
+ }
10
+ function windowForTurn(sessionKey, turn, rank, memoryId) {
11
+ const fromTurn = Math.max(0, turn - 1);
12
+ return {
13
+ sessionKey,
14
+ fromTurn,
15
+ toTurn: turn + 2,
16
+ factRank: rank,
17
+ bestTurn: turn,
18
+ memoryIds: /* @__PURE__ */ new Set([memoryId])
19
+ };
20
+ }
21
+ function mergeDrafts(drafts, maxTurnsPerEpisode) {
22
+ const bySession = /* @__PURE__ */ new Map();
23
+ for (const draft of drafts) {
24
+ const list = bySession.get(draft.sessionKey);
25
+ if (list) list.push(draft);
26
+ else bySession.set(draft.sessionKey, [draft]);
27
+ }
28
+ const windows = [];
29
+ for (const [, sessionDrafts] of bySession) {
30
+ sessionDrafts.sort(
31
+ (a, b) => a.fromTurn - b.fromTurn || a.toTurn - b.toTurn
32
+ );
33
+ let current = null;
34
+ const flush = () => {
35
+ if (!current) return;
36
+ windows.push(finalizeWindow(current, maxTurnsPerEpisode));
37
+ current = null;
38
+ };
39
+ for (const draft of sessionDrafts) {
40
+ if (current && draft.fromTurn <= current.toTurn) {
41
+ current.toTurn = Math.max(current.toTurn, draft.toTurn);
42
+ if (draft.factRank < current.factRank) {
43
+ current.factRank = draft.factRank;
44
+ current.bestTurn = draft.bestTurn;
45
+ }
46
+ for (const id of draft.memoryIds) current.memoryIds.add(id);
47
+ } else {
48
+ flush();
49
+ current = { ...draft, memoryIds: new Set(draft.memoryIds) };
50
+ }
51
+ }
52
+ flush();
53
+ }
54
+ return windows;
55
+ }
56
+ function finalizeWindow(draft, maxTurnsPerEpisode) {
57
+ let { fromTurn, toTurn } = draft;
58
+ const span = toTurn - fromTurn;
59
+ if (maxTurnsPerEpisode > 0 && span > maxTurnsPerEpisode) {
60
+ fromTurn = Math.min(
61
+ Math.max(draft.bestTurn - 1, draft.fromTurn),
62
+ draft.toTurn - maxTurnsPerEpisode
63
+ );
64
+ if (fromTurn + maxTurnsPerEpisode <= draft.bestTurn) {
65
+ fromTurn = Math.min(draft.bestTurn, draft.toTurn - maxTurnsPerEpisode);
66
+ }
67
+ toTurn = fromTurn + maxTurnsPerEpisode;
68
+ }
69
+ return {
70
+ sessionKey: draft.sessionKey,
71
+ fromTurn,
72
+ toTurn,
73
+ factRank: draft.factRank,
74
+ memoryIds: [...draft.memoryIds].sort()
75
+ };
76
+ }
77
+ function compareEpisodeWindows(left, right) {
78
+ const leftIds = left.memoryIds.join("\0");
79
+ const rightIds = right.memoryIds.join("\0");
80
+ return left.factRank - right.factRank || (left.sessionKey < right.sessionKey ? -1 : left.sessionKey > right.sessionKey ? 1 : 0) || left.fromTurn - right.fromTurn || left.toTurn - right.toTurn || (leftIds < rightIds ? -1 : leftIds > rightIds ? 1 : 0);
81
+ }
82
+ function planEpisodeWindows(options) {
83
+ if (options.maxEpisodes <= 0 || options.maxTurnsPerEpisode <= 0) return [];
84
+ const drafts = [];
85
+ for (const fact of options.recalledFacts) {
86
+ if (!fact || !Array.isArray(fact.sources)) continue;
87
+ for (const source of fact.sources) {
88
+ if (!source || typeof source.sessionKey !== "string" || source.sessionKey.length === 0) {
89
+ continue;
90
+ }
91
+ const turn = resolveProvenanceTurnIndex(source.turnId);
92
+ if (turn === null) continue;
93
+ drafts.push(
94
+ windowForTurn(source.sessionKey, turn, fact.rank, fact.memoryId)
95
+ );
96
+ }
97
+ }
98
+ if (drafts.length === 0) return [];
99
+ const windows = mergeDrafts(drafts, options.maxTurnsPerEpisode);
100
+ return windows.sort(compareEpisodeWindows).slice(0, options.maxEpisodes);
101
+ }
102
+ function factsNeedingQuoteFallback(recalledFacts) {
103
+ return recalledFacts.filter(
104
+ (fact) => fact && Array.isArray(fact.sources) && fact.sources.length > 0 && fact.sources.some((source) => typeof source?.quote === "string" && source.quote.length > 0) && !fact.sources.some((source) => resolveProvenanceTurnIndex(source?.turnId) !== null)
105
+ );
106
+ }
107
+ async function planEpisodeWindowsWithFallback(options) {
108
+ const facts = [...options.recalledFacts];
109
+ const locator = options.locateQuote;
110
+ if (locator && facts.length > 0) {
111
+ for (const fact of factsNeedingQuoteFallback(options.recalledFacts)) {
112
+ for (const source of fact.sources ?? []) {
113
+ if (typeof source?.quote !== "string" || source.quote.length === 0) continue;
114
+ if (typeof source.sessionKey !== "string" || source.sessionKey.length === 0) continue;
115
+ let turn = null;
116
+ try {
117
+ turn = await locator(source.quote, source.sessionKey);
118
+ } catch {
119
+ turn = null;
120
+ }
121
+ if (turn === null || !Number.isSafeInteger(turn) || turn < 0) continue;
122
+ facts.push({
123
+ memoryId: fact.memoryId,
124
+ rank: fact.rank,
125
+ sources: [
126
+ {
127
+ sessionKey: source.sessionKey,
128
+ turnId: String(turn),
129
+ observedAt: source.observedAt,
130
+ quote: source.quote
131
+ }
132
+ ]
133
+ });
134
+ break;
135
+ }
136
+ }
137
+ }
138
+ return planEpisodeWindows({
139
+ recalledFacts: facts,
140
+ maxEpisodes: options.maxEpisodes,
141
+ maxTurnsPerEpisode: options.maxTurnsPerEpisode
142
+ });
143
+ }
144
+
145
+ export {
146
+ resolveProvenanceTurnIndex,
147
+ compareEpisodeWindows,
148
+ planEpisodeWindows,
149
+ factsNeedingQuoteFallback,
150
+ planEpisodeWindowsWithFallback
151
+ };
152
+ //# sourceMappingURL=chunk-T3GIETKV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/episodic-context.ts"],"sourcesContent":["/**\n * Episodic context planning (issue #2331, harmonic-memory P3).\n *\n * Turns the structured `sources` provenance on recalled facts into episode\n * windows over the LCM archive: resolve each source's turn, group overlapping\n * turn ranges within a session into merged episodes, and cap the episode\n * count/span. Pure planning — no archive access — plus an async wrapper that\n * applies the single documented fallback (quote lookup) through an injected\n * locator so the planner stays testable without SQLite.\n *\n * Window bounds are `[start, end)` throughout (`toTurn` exclusive); the\n * archive's `getMessages` bounds are inclusive, so the fetch site passes\n * `toTurn - 1`.\n */\n\nimport type { ProvenanceSource } from \"./types.js\";\n\n/** One fact contributing to episodic planning, with its final recall rank. */\nexport interface EpisodicFactInput {\n memoryId: string;\n /** Final recall rank of the fact (0 = best). Lower wins. */\n rank: number;\n sources?: ProvenanceSource[];\n}\n\n/** A merged, fetch-ready episode window. */\nexport interface EpisodeWindow {\n sessionKey: string;\n /** Inclusive first turn. */\n fromTurn: number;\n /** EXCLUSIVE end turn (`[start, end)` semantics). */\n toTurn: number;\n /** Best (lowest) rank among contributing facts — drives ordering. */\n factRank: number;\n /** Sorted, deduplicated contributing memory ids (citation line). */\n memoryIds: string[];\n}\n\n/** Locates a quote's turn index within a session, or null on a miss. */\nexport type QuoteLocator = (\n quote: string,\n sessionKey: string,\n) => Promise<number | null>;\n\nconst TURN_FIELD_SEPARATOR = String.fromCharCode(1);\n\n/**\n * Resolve a provenance `turnId` to a numeric LCM turn index, or null.\n *\n * Extraction writes `turnId` as the host turn fingerprint\n * (`buildTurnFingerprint`: `role␁content␁thread␁turnIndex`), so the numeric\n * LCM turn index is the LAST `␁`-separated field. A bare integer string is\n * also accepted. Anything else is unresolvable — skip, never guess.\n */\nexport function resolveProvenanceTurnIndex(turnId: unknown): number | null {\n if (typeof turnId !== \"string\" || turnId.length === 0) return null;\n const lastField = turnId.includes(TURN_FIELD_SEPARATOR)\n ? turnId.split(TURN_FIELD_SEPARATOR).pop()!\n : turnId;\n if (!/^\\d+$/.test(lastField)) return null;\n const parsed = Number.parseInt(lastField, 10);\n return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;\n}\n\ninterface DraftWindow {\n sessionKey: string;\n fromTurn: number;\n toTurn: number;\n factRank: number;\n bestTurn: number;\n memoryIds: Set<string>;\n}\n\nfunction windowForTurn(\n sessionKey: string,\n turn: number,\n rank: number,\n memoryId: string,\n): DraftWindow {\n const fromTurn = Math.max(0, turn - 1);\n return {\n sessionKey,\n fromTurn,\n toTurn: turn + 2,\n factRank: rank,\n bestTurn: turn,\n memoryIds: new Set([memoryId]),\n };\n}\n\nfunction mergeDrafts(drafts: DraftWindow[], maxTurnsPerEpisode: number): EpisodeWindow[] {\n const bySession = new Map<string, DraftWindow[]>();\n for (const draft of drafts) {\n const list = bySession.get(draft.sessionKey);\n if (list) list.push(draft);\n else bySession.set(draft.sessionKey, [draft]);\n }\n\n const windows: EpisodeWindow[] = [];\n for (const [, sessionDrafts] of bySession) {\n // Sort by fromTurn, then toTurn, so a shuffle cannot change merge results.\n sessionDrafts.sort(\n (a, b) => a.fromTurn - b.fromTurn || a.toTurn - b.toTurn,\n );\n let current: DraftWindow | null = null;\n const flush = () => {\n if (!current) return;\n windows.push(finalizeWindow(current, maxTurnsPerEpisode));\n current = null;\n };\n for (const draft of sessionDrafts) {\n if (current && draft.fromTurn <= current.toTurn) {\n // Overlapping or adjacent ([a,b) + [b,c) share no turn but read as one\n // continuous episode): merge. Merged bounds stay [start, end).\n current.toTurn = Math.max(current.toTurn, draft.toTurn);\n if (draft.factRank < current.factRank) {\n current.factRank = draft.factRank;\n current.bestTurn = draft.bestTurn;\n }\n for (const id of draft.memoryIds) current.memoryIds.add(id);\n } else {\n flush();\n current = { ...draft, memoryIds: new Set(draft.memoryIds) };\n }\n }\n flush();\n }\n return windows;\n}\n\nfunction finalizeWindow(draft: DraftWindow, maxTurnsPerEpisode: number): EpisodeWindow {\n let { fromTurn, toTurn } = draft;\n const span = toTurn - fromTurn;\n if (maxTurnsPerEpisode > 0 && span > maxTurnsPerEpisode) {\n // Trim the tail but keep the highest-ranked fact's turn inside: anchor one\n // turn of leading context on the best turn, clamped to the merged range.\n fromTurn = Math.min(\n Math.max(draft.bestTurn - 1, draft.fromTurn),\n draft.toTurn - maxTurnsPerEpisode,\n );\n // maxTurnsPerEpisode === 1 (or a clamp collision) can push the anchor\n // above the best turn; slide back down so the best turn stays included.\n if (fromTurn + maxTurnsPerEpisode <= draft.bestTurn) {\n fromTurn = Math.min(draft.bestTurn, draft.toTurn - maxTurnsPerEpisode);\n }\n toTurn = fromTurn + maxTurnsPerEpisode;\n }\n return {\n sessionKey: draft.sessionKey,\n fromTurn,\n toTurn,\n factRank: draft.factRank,\n memoryIds: [...draft.memoryIds].sort(),\n };\n}\n\n/** Total, stable ordering: rank asc, sessionKey asc, fromTurn asc, then residual identity. */\nexport function compareEpisodeWindows(\n left: EpisodeWindow,\n right: EpisodeWindow,\n): number {\n const leftIds = left.memoryIds.join(\"\\u{0}\");\n const rightIds = right.memoryIds.join(\"\\u{0}\");\n return (\n left.factRank - right.factRank ||\n (left.sessionKey < right.sessionKey ? -1 : left.sessionKey > right.sessionKey ? 1 : 0) ||\n left.fromTurn - right.fromTurn ||\n left.toTurn - right.toTurn ||\n (leftIds < rightIds ? -1 : leftIds > rightIds ? 1 : 0)\n );\n}\n\n/**\n * Plan episode windows from recalled facts' structured provenance.\n *\n * Pure: no archive access. Facts without a structured `sources` array are\n * skipped (no legacy scalar `source` parsing). Sources whose `turnId` does\n * not resolve to a number are skipped — the caller decides whether to attempt\n * the quote fallback for facts that lost every source.\n *\n * `maxEpisodes` or `maxTurnsPerEpisode` of 0 disables the section: returns\n * `[]` before any work (zero semantics, checklist item 33).\n */\nexport function planEpisodeWindows(options: {\n recalledFacts: ReadonlyArray<EpisodicFactInput>;\n maxEpisodes: number;\n maxTurnsPerEpisode: number;\n}): EpisodeWindow[] {\n if (options.maxEpisodes <= 0 || options.maxTurnsPerEpisode <= 0) return [];\n const drafts: DraftWindow[] = [];\n for (const fact of options.recalledFacts) {\n if (!fact || !Array.isArray(fact.sources)) continue;\n for (const source of fact.sources) {\n if (!source || typeof source.sessionKey !== \"string\" || source.sessionKey.length === 0) {\n continue;\n }\n const turn = resolveProvenanceTurnIndex(source.turnId);\n if (turn === null) continue;\n drafts.push(\n windowForTurn(source.sessionKey, turn, fact.rank, fact.memoryId),\n );\n }\n }\n if (drafts.length === 0) return [];\n const windows = mergeDrafts(drafts, options.maxTurnsPerEpisode);\n return windows.sort(compareEpisodeWindows).slice(0, options.maxEpisodes);\n}\n\n/**\n * Facts whose sources all failed turn resolution but that carry a quote.\n * These are the ONLY candidates for the quote-lookup fallback.\n */\nexport function factsNeedingQuoteFallback(\n recalledFacts: ReadonlyArray<EpisodicFactInput>,\n): EpisodicFactInput[] {\n return recalledFacts.filter(\n (fact) =>\n fact &&\n Array.isArray(fact.sources) &&\n fact.sources.length > 0 &&\n fact.sources.some((source) => typeof source?.quote === \"string\" && source.quote.length > 0) &&\n !fact.sources.some((source) => resolveProvenanceTurnIndex(source?.turnId) !== null),\n );\n}\n\n/**\n * Plan episode windows, applying the single documented fallback: for a fact\n * whose turnIds ALL failed resolution but that has a quote, locate the quote\n * in the archive and window around the located turn. A locator miss means the\n * fact contributes no episode. Falls back to the pure plan when no locator is\n * supplied.\n */\nexport async function planEpisodeWindowsWithFallback(options: {\n recalledFacts: ReadonlyArray<EpisodicFactInput>;\n maxEpisodes: number;\n maxTurnsPerEpisode: number;\n locateQuote?: QuoteLocator;\n}): Promise<EpisodeWindow[]> {\n const facts = [...options.recalledFacts];\n const locator = options.locateQuote;\n if (locator && facts.length > 0) {\n for (const fact of factsNeedingQuoteFallback(options.recalledFacts)) {\n for (const source of fact.sources ?? []) {\n if (typeof source?.quote !== \"string\" || source.quote.length === 0) continue;\n if (typeof source.sessionKey !== \"string\" || source.sessionKey.length === 0) continue;\n let turn: number | null = null;\n try {\n turn = await locator(source.quote, source.sessionKey);\n } catch {\n turn = null;\n }\n if (turn === null || !Number.isSafeInteger(turn) || turn < 0) continue;\n facts.push({\n memoryId: fact.memoryId,\n rank: fact.rank,\n sources: [\n {\n sessionKey: source.sessionKey,\n turnId: String(turn),\n observedAt: source.observedAt,\n quote: source.quote,\n },\n ],\n });\n break; // one located quote per fact is enough to window it\n }\n }\n }\n return planEpisodeWindows({\n recalledFacts: facts,\n maxEpisodes: options.maxEpisodes,\n maxTurnsPerEpisode: options.maxTurnsPerEpisode,\n });\n}\n"],"mappings":"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","names":[]}
@@ -5,14 +5,14 @@ import {
5
5
  } from "./chunk-5JMAGU26.js";
6
6
  import {
7
7
  runPostConsolidationMaterialize
8
- } from "./chunk-MU3TPZOV.js";
8
+ } from "./chunk-DTLF2SLZ.js";
9
9
  import {
10
10
  isSemanticConsolidationLlmOperator
11
11
  } from "./chunk-G7D6GZ5J.js";
12
12
  import {
13
13
  countRecallTokenOverlap,
14
14
  normalizeRecallTokens
15
- } from "./chunk-ZBJMUXZH.js";
15
+ } from "./chunk-DJ7HMNSL.js";
16
16
  import {
17
17
  resolvePipelineProcessingCapabilities
18
18
  } from "./chunk-JUOZ62Y7.js";
@@ -220,4 +220,4 @@ export {
220
220
  buildExtensionsBlockForConsolidation,
221
221
  materializeAfterSemanticConsolidation
222
222
  };
223
- //# sourceMappingURL=chunk-MYZ4NA43.js.map
223
+ //# sourceMappingURL=chunk-TGSMU3F2.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KJTKLXTH.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-YUIBXMZY.js";
6
+ } from "./chunk-CALURYWR.js";
7
7
  import {
8
8
  copyExistingFileToBackup,
9
9
  writeFileAtomically
@@ -260,4 +260,4 @@ export {
260
260
  backupExistingLedger,
261
261
  rebuildMemoryLifecycleLedger
262
262
  };
263
- //# sourceMappingURL=chunk-CM4SZZBN.js.map
263
+ //# sourceMappingURL=chunk-TIRJV2LW.js.map
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-7ZNJN5WZ.js";
20
20
  import {
21
21
  compareEntityTimestamps
22
- } from "./chunk-YUIBXMZY.js";
22
+ } from "./chunk-CALURYWR.js";
23
23
  import {
24
24
  normalizeEntityName
25
25
  } from "./chunk-YXZG5TVN.js";
@@ -27,6 +27,9 @@ import {
27
27
  normalizeEntityText,
28
28
  resolveRequestedEntitySectionKeys
29
29
  } from "./chunk-ZIKENA2C.js";
30
+ import {
31
+ truncateGraphemeSafe
32
+ } from "./chunk-PJKTFXE2.js";
30
33
  import {
31
34
  sanitizeMemoryContent
32
35
  } from "./chunk-5GKPFL3S.js";
@@ -54,7 +57,7 @@ function uniqueStrings(values) {
54
57
  function compactLine(value, maxLength = 220) {
55
58
  const normalized = value.replace(/\s+/g, " ").trim();
56
59
  if (normalized.length <= maxLength) return normalized;
57
- return `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}\u2026`;
60
+ return `${truncateGraphemeSafe(normalized, maxLength - 1).trimEnd()}\u2026`;
58
61
  }
59
62
  function dedupeHintSnippetsByText(snippets) {
60
63
  const deduped = /* @__PURE__ */ new Map();
@@ -811,7 +814,7 @@ function formatEntityHintSection(candidates, queryTokens, mode, maxRelatedEntiti
811
814
  }
812
815
  let result = lines.join("\n");
813
816
  if (result.length > maxChars) {
814
- result = `${result.slice(0, Math.max(0, maxChars - 15)).trimEnd()}
817
+ result = `${truncateGraphemeSafe(result, Math.max(0, maxChars - 15)).trimEnd()}
815
818
 
816
819
  ...(trimmed)
817
820
  `;
@@ -926,4 +929,4 @@ export {
926
929
  entityIndexVersion,
927
930
  entityRecentTranscriptLookbackHours
928
931
  };
929
- //# sourceMappingURL=chunk-EGW4O32Z.js.map
932
+ //# sourceMappingURL=chunk-UDTME32W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entity-retrieval.ts"],"sourcesContent":["import { resolveNamespaceCapabilities } from \"./capabilities.js\";\nimport { renderAuthorityBoundContent } from \"./recall-context-composition.js\";\nimport { createHash } from \"node:crypto\";\nimport { sanitizeMemoryContent } from \"./sanitize.js\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collectNativeKnowledgeChunks, type NativeKnowledgeChunk } from \"./native-knowledge.js\";\nimport { compareEntityTimestamps, normalizeEntityName, type StorageManager } from \"./storage.js\";\nimport { normalizeEntityText, resolveRequestedEntitySectionKeys } from \"./entity-schema.js\";\nimport type { EntityStructuredSection, MemoryFile, PluginConfig, TranscriptEntry } from \"./types.js\";\nimport { truncateGraphemeSafe } from \"./whitespace.js\";\nimport { containsPhrase } from \"./entity-retrieval-boundaries.js\";\nimport { buildOriginStructuredSections, sanitizeOriginatedFacts, type EntityOriginStructuredSection } from \"./entity-origin-fields.js\";\nimport {\n checkEntityRecallAbort,\n entityRecallSectionAbsent,\n yieldEntityRecallScan,\n yieldEntityRecallScanEvery,\n} from \"./entity-recall-cancellation.js\";\nconst ENTITY_INDEX_VERSION = 3;\nconst RECENT_TRANSCRIPT_LOOKBACK_HOURS = 24;\nconst INSTRUCTION_LIKE_RE = /\\b(always|never|must|should|remember to|do not|don't|process|workflow|template|checklist|instruction)\\b/i;\nconst METADATA_WRAPPER_RE = /^(source|context|metadata|notes?):/i;\nconst ENTITY_PRONOUN_RE = /\\b(he|him|his|she|her|they|them|their|it|its)\\b/i;\nconst BELIEF_LEDGER_SECTION_KEY = \"belief_ledger\";\nconst BELIEF_LEDGER_FACT_RE = /^claim=([^;]+);\\s*status=([^;]+);\\s*updatedAt=([^;]+);\\s*(.+)$/;\ntype EntityQueryMode = \"direct\" | \"timeline\" | \"follow_up\";\ntype EntityMentionIndexEntry = {\n canonicalId: string;\n name: string;\n type: string;\n summary?: string;\n aliases: string[];\n facts: string[];\n timelineFacts: string[];\n timelineFactOrigins?: Array<string | undefined>;\n structuredSections: EntityOriginStructuredSection[];\n timeline: Array<{\n timestamp: string;\n text: string;\n source?: string;\n sessionKey?: string;\n principal?: string;\n origin?: string;\n }>;\n relationships: Array<{ target: string; label: string }>;\n activity: Array<{ date: string; note: string }>;\n factCount: number;\n memorySnippets: string[]; memorySnippetOrigins?: Array<string | undefined>;\n nativeChunks: Array<{\n chunkId: string;\n title: string;\n sourceKind: NativeKnowledgeChunk[\"sourceKind\"];\n sourcePath: string;\n snippet: string;\n derivedDate?: string;\n }>;\n};\ntype EntityMentionIndex = {\n version: number;\n updatedAt: string;\n entityStatusVersion?: number;\n entities: EntityMentionIndexEntry[];\n};\ntype EntityCandidate = {\n entry: EntityMentionIndexEntry;\n alias: string;\n score: number;\n source: \"query\" | \"recent_turn\";\n};\ntype EntityHintSnippet = {\n text: string;\n score: number;\n kind: \"summary\" | \"fact\" | \"section\" | \"relationship\" | \"activity\" | \"memory\" | \"native\"; origin?: string;\n};\nexport interface BuildEntityRecallSectionOptions {\n config: PluginConfig;\n storage: StorageManager;\n namespaceStorage?: (namespace: string) => Promise<StorageManager>;\n query: string;\n recallNamespaces?: string[];\n recentTurns: number;\n maxHints: number;\n maxSupportingFacts: number;\n maxRelatedEntities: number;\n maxChars: number;\n transcriptEntries: TranscriptEntry[];\n originAuthorityEnabled?: boolean; untrustedOrigins?: readonly string[];\n /**\n * Cancels the build at its next checkpoint (issue #2291). Entity recall reads\n * every entity and memory file across the recalled namespaces, which is\n * minutes of work on a large or slow store; without this the scan kept running\n * after the recall that asked for it had been abandoned.\n */\n abortSignal?: AbortSignal;\n}\nfunction tokenize(value: string): string[] {\n return normalizeEntityText(value).split(/\\s+/).filter((token) => token.length >= 2);\n}\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0))];\n}\nfunction compactLine(value: string, maxLength: number = 220): string {\n const normalized = value.replace(/\\s+/g, \" \").trim();\n if (normalized.length <= maxLength) return normalized;\n return `${truncateGraphemeSafe(normalized, maxLength - 1).trimEnd()}…`;\n}\nfunction dedupeHintSnippetsByText(snippets: EntityHintSnippet[]): EntityHintSnippet[] {\n const deduped = new Map<string, EntityHintSnippet>();\n for (const snippet of snippets) {\n const key = normalizeEntityText(snippet.text);\n const existing = deduped.get(key);\n if (!existing) {\n deduped.set(key, snippet);\n continue;\n }\n if (existing.origin !== snippet.origin) {\n existing.origin = undefined;\n }\n }\n return [...deduped.values()];\n}\nfunction isBeliefLedgerSection(section: Pick<EntityStructuredSection, \"key\">): boolean {\n return normalizeEntityText(section.key).replace(/\\s+/g, \"_\") === BELIEF_LEDGER_SECTION_KEY;\n}\nfunction beliefLedgerFactKeys(sections: EntityStructuredSection[]): Set<string> {\n const keys = new Set<string>();\n for (const section of sections) {\n if (!isBeliefLedgerSection(section)) continue;\n for (const fact of section.facts) {\n keys.add(normalizeEntityText(fact));\n }\n }\n return keys;\n}\ntype RecalledEntityFact = { text: string; sourceIndex: number };\nfunction recallFactsForStructuredSection(section: EntityStructuredSection): RecalledEntityFact[] {\n if (!isBeliefLedgerSection(section)) {\n return section.facts.map((text, sourceIndex) => ({ text, sourceIndex }));\n }\n return currentActiveBeliefLedgerFactTexts(section.facts);\n}\nfunction currentActiveBeliefLedgerFactTexts(facts: string[]): RecalledEntityFact[] {\n const byClaim = new Map<string, { status: string; updatedAtMs: number; texts: RecalledEntityFact[] }>();\n for (const [sourceIndex, fact] of facts.entries()) {\n const match = BELIEF_LEDGER_FACT_RE.exec(fact.trim());\n if (!match) continue;\n const [, claimId, status, updatedAt, text] = match;\n const updatedAtMs = Date.parse(updatedAt);\n if (!claimId?.trim() || !status?.trim() || !Number.isFinite(updatedAtMs) || !text?.trim()) continue;\n const normalizedStatus = status.trim().toLowerCase();\n const normalizedClaimId = claimId.trim();\n const current = byClaim.get(normalizedClaimId);\n const inactiveTieWins =\n current &&\n updatedAtMs === current.updatedAtMs &&\n current.status === \"active\" &&\n normalizedStatus !== \"active\";\n if (!current || updatedAtMs > current.updatedAtMs || inactiveTieWins) {\n byClaim.set(normalizedClaimId, { status: normalizedStatus, updatedAtMs, texts: [{ text: text.trim(), sourceIndex }] });\n continue;\n }\n if (updatedAtMs === current.updatedAtMs && current.status === normalizedStatus) {\n current.texts.push({ text: text.trim(), sourceIndex });\n }\n }\n return [...byClaim.values()].flatMap((current) => current.status === \"active\" ? current.texts : []);\n}\nfunction relationLine(entry: EntityMentionIndexEntry, relationship: { target: string; label: string }): string {\n const normalizedLabel = relationship.label.replace(/\\s+/g, \" \").trim();\n if (normalizedLabel.length === 0) return `${entry.name} is connected to ${relationship.target}`;\n return `${entry.name} ${normalizedLabel} ${relationship.target}`;\n}\nfunction detectEntityQueryMode(query: string): EntityQueryMode | null {\n const normalized = normalizeEntityText(query);\n if (!normalized) return null;\n if (\n /^(what about|and what about|how about|what happened (with|to) (he|him|his|she|her|they|them|their|it|its)|did (he|she|they|it)|is (he|she|they|it)|was (he|she|they|it))\\b/.test(normalized)\n ) {\n return \"follow_up\";\n }\n if (\n /^(who is|who s|what do we know about|what does|tell me about|what can you tell me about|what s new with|what happened with|what happened to|status of|where is|how is)\\b/.test(normalized)\n ) {\n if (/^what does\\b/.test(normalized)) {\n if (/^what does (?:this|that|it|the|a|an|my|our|your|their)\\b/.test(normalized)) {\n return null;\n }\n if (\n /^what does [a-z0-9-]+ (?:error|warning|exception|failure|stack|trace|code|message|log)\\b/.test(normalized)\n && /\\b(mean|means|indicate|indicates|imply|implies)\\b/.test(normalized)\n ) {\n return null;\n }\n }\n return /what happened|what s new|status of|how is|where is/.test(normalized) ? \"timeline\" : \"direct\";\n }\n if (ENTITY_PRONOUN_RE.test(normalized) && normalized.split(/\\s+/).length <= 8) {\n return \"follow_up\";\n }\n return null;\n}\nfunction scoreAliasMatch(query: string, alias: string): number {\n const normalizedQuery = normalizeEntityText(query);\n const normalizedAlias = normalizeEntityText(alias);\n if (!normalizedAlias) return 0;\n if (normalizedQuery === normalizedAlias) return 10;\n if (containsPhrase(normalizedQuery, normalizedAlias)) return 8 + Math.min(normalizedAlias.split(/\\s+/).length, 3);\n const queryTokens = new Set(tokenize(normalizedQuery));\n const aliasTokens = tokenize(normalizedAlias);\n if (aliasTokens.length === 0) return 0;\n const overlap = aliasTokens.filter((token) => queryTokens.has(token)).length;\n if (overlap === 0) return 0;\n // Cross-entity contamination guard (#682 PR 2/3 R-2). For multi-token\n // aliases, partial-token overlap that hits ONLY shared common tokens\n // (like \"person\" in \"Person-A1\" / \"Person-B1\") would surface every\n // similarly-prefixed entity for a query that named only one. Require\n // that the overlap include at least one DISTINCTIVE alias token —\n // i.e. a token that does not also appear in any other entity's\n // alias-token vocabulary. Since this function is pure / per-pair, we\n // approximate \"distinctive\" by requiring the overlap to include at\n // least one token that is not a substring-of common identifier\n // affixes. The aliasTokens with length > 1 must contribute at least\n // one non-affix overlap. \"Alice Example\" ([\"alice\", \"example\"])\n // matched by query \"Tell me about Alice\" → overlap = 1 on \"alice\",\n // and \"alice\" is not an affix → score = 1. \"Person-A1\" tokens\n // [\"person\", \"a1\"] matched by query \"Who is Person-B1?\" → overlap =\n // 1 on \"person\", and \"person\" IS an affix → score = 0.\n if (aliasTokens.length > 1) {\n const nonAffixOverlap = aliasTokens.filter(\n (token) => queryTokens.has(token) && !isAliasAffixToken(token),\n ).length;\n if (nonAffixOverlap === 0) return 0;\n }\n return overlap;\n}\n/**\n * Tokens that look like type prefixes / generic role identifiers and\n * therefore should not, on their own, count as evidence that a\n * multi-token alias matches a query (#682 PR 2/3 R-2).\n *\n * Kept as a small explicit list rather than a regex so additions are\n * deliberate. The list mirrors the entity types listed in\n * `entity-schema.ts` plus the most common generic role identifiers\n * that frequently appear as the leading token of a display name.\n */\nconst ALIAS_AFFIX_TOKENS = new Set<string>([\n \"person\", \"people\", \"user\", \"users\", \"team\", \"teams\",\n \"project\", \"projects\", \"topic\", \"topics\",\n \"org\", \"orgs\", \"organization\", \"organizations\", \"company\", \"companies\",\n \"place\", \"places\", \"tool\", \"tools\", \"service\", \"services\",\n \"system\", \"systems\", \"agent\", \"agents\", \"bot\", \"bots\",\n]);\nfunction isAliasAffixToken(token: string): boolean {\n return ALIAS_AFFIX_TOKENS.has(token);\n}\nfunction isLikelyInstructionLike(value: string): boolean {\n return INSTRUCTION_LIKE_RE.test(value) || METADATA_WRAPPER_RE.test(value);\n}\nfunction sanitizeEntityFact(fact: string): string {\n const sanitized = sanitizeMemoryContent(fact);\n const clean = sanitized.text.trim();\n if (!clean) return \"\";\n if (INSTRUCTION_LIKE_RE.test(clean) && clean.length > 100) return \"\";\n return clean;\n}\nfunction scoreHintSnippet(snippet: EntityHintSnippet, queryTokens: string[]): EntityHintSnippet | null {\n const normalized = normalizeEntityText(snippet.text);\n if (!normalized) return null;\n const scored = { ...snippet };\n if (isLikelyInstructionLike(scored.text) && scored.kind !== \"summary\") {\n scored.score -= 3;\n }\n const overlap = queryTokens.filter((token) => normalized.includes(token)).length;\n scored.score += overlap * 2;\n if (METADATA_WRAPPER_RE.test(scored.text)) scored.score -= 2;\n if (scored.text.length <= 160) scored.score += 1;\n return scored.score > 0 ? scored : null;\n}\nfunction sortTimelineEntriesDesc(\n left: EntityMentionIndexEntry[\"timeline\"][number],\n right: EntityMentionIndexEntry[\"timeline\"][number],\n): number {\n const timestampOrder = compareEntityTimestamps(right.timestamp, left.timestamp);\n if (timestampOrder !== 0) {\n return timestampOrder;\n }\n return right.text.localeCompare(left.text);\n}\nfunction jaccardSimilarity(a: string, b: string): number {\n const aTokens = new Set(tokenize(a));\n const bTokens = new Set(tokenize(b));\n if (aTokens.size === 0 || bTokens.size === 0) return 0;\n let intersection = 0;\n for (const token of aTokens) {\n if (bTokens.has(token)) intersection += 1;\n }\n const union = new Set([...aTokens, ...bTokens]).size;\n return union === 0 ? 0 : intersection / union;\n}\nfunction buildAliasIndex(entries: EntityMentionIndexEntry[]): Map<string, EntityMentionIndexEntry[]> {\n const index = new Map<string, EntityMentionIndexEntry[]>();\n for (const entry of entries) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]).map(normalizeEntityText).filter(Boolean);\n for (const alias of aliases) {\n const existing = index.get(alias) ?? [];\n existing.push(entry);\n index.set(alias, existing);\n }\n }\n return index;\n}\nasync function readNativeChunks(\n config: PluginConfig,\n recallNamespaces?: string[],\n): Promise<NativeKnowledgeChunk[]> {\n if (!config.nativeKnowledge?.enabled) return [];\n return collectNativeKnowledgeChunks({\n workspaceDir: config.workspaceDir,\n memoryDir: config.memoryDir,\n config: config.nativeKnowledge,\n recallNamespaces: resolveNamespaceCapabilities(config).namespaces ? recallNamespaces : undefined,\n defaultNamespace: config.defaultNamespace,\n }).catch(() => []);\n}\nasync function resolveEntityIndexStorages(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n): Promise<StorageManager[]> {\n if (\n !resolveNamespaceCapabilities(config).namespaces ||\n !namespaceStorage ||\n !recallNamespaces ||\n recallNamespaces.length === 0\n ) {\n return [storage];\n }\n const storages: StorageManager[] = [];\n const seenDirs = new Set<string>();\n for (const namespace of uniqueStrings(recallNamespaces)) {\n try {\n const scopedStorage = await namespaceStorage(namespace);\n const storageDir = path.resolve(scopedStorage.dir);\n if (seenDirs.has(storageDir)) continue;\n seenDirs.add(storageDir);\n storages.push(scopedStorage);\n } catch {\n continue;\n }\n }\n return storages.length > 0 ? storages : [storage];\n}\nfunction entityIndexStatePath(storage: StorageManager): string {\n return path.join(storage.dir, \"state\", \"entity-mention-index.json\");\n}\n\nasync function readEntityIndexState(storage: StorageManager): Promise<EntityMentionIndex | null> {\n const raw = await readFile(entityIndexStatePath(storage), \"utf-8\").catch(() => \"\");\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<EntityMentionIndex>;\n if (parsed.version !== ENTITY_INDEX_VERSION || !Array.isArray(parsed.entities)) return null;\n return parsed as EntityMentionIndex;\n } catch {\n return null;\n }\n}\nasync function readCurrentPersistedEntityIndex(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n): Promise<EntityMentionIndex | null> {\n if (\n resolveNamespaceCapabilities(config).namespaces &&\n namespaceStorage &&\n recallNamespaces &&\n recallNamespaces.length > 0\n ) {\n return null;\n }\n const index = await readEntityIndexState(storage);\n if (!index || index.entityStatusVersion !== storage.getMemoryStatusVersion()) {\n return null;\n }\n return index;\n}\nconst namespaceEntityIndexCache = new Map<string, EntityMentionIndex>();\nconst MAX_NAMESPACE_ENTITY_INDEX_CACHE_ENTRIES = 32;\n\nfunction nativeEntityIndexRevision(chunks: NativeKnowledgeChunk[]): string {\n const projection = chunks.map((chunk) => [\n chunk.chunkId,\n chunk.sourcePath,\n chunk.title,\n chunk.sourceKind,\n uniqueStrings(chunk.aliases ?? []),\n compactLine(chunk.content, 180),\n chunk.derivedDate ?? null,\n ]);\n return createHash(\"sha256\").update(JSON.stringify(projection)).digest(\"hex\");\n}\nfunction namespaceEntityIndexCacheKey(\n storages: StorageManager[],\n recallNamespaces: string[],\n nativeRevision: string,\n): string {\n const namespaceKey = uniqueStrings(recallNamespaces).join(\"\\u001f\");\n const storageKey = storages\n .map((scopedStorage) => {\n const aliases = Object.entries(scopedStorage.entityAliases)\n .sort(([left], [right]) => left.localeCompare(right));\n return (\n `${path.resolve(scopedStorage.dir)}@${scopedStorage.getMemoryStatusVersion()}` +\n `:${scopedStorage.getMemoryCorpusVersion()}:${scopedStorage.getEntityMutationVersion()}` +\n `:${scopedStorage.hotCacheKeyId()}:${JSON.stringify(aliases)}`\n );\n })\n .join(\"\\u001f\");\n return `${namespaceKey}\\u001e${storageKey}\\u001e${nativeRevision}`;\n}\nfunction rememberNamespaceEntityIndex(key: string, index: EntityMentionIndex): void {\n if (namespaceEntityIndexCache.size >= MAX_NAMESPACE_ENTITY_INDEX_CACHE_ENTRIES) {\n const oldestKey = namespaceEntityIndexCache.keys().next().value;\n if (typeof oldestKey === \"string\") namespaceEntityIndexCache.delete(oldestKey);\n }\n namespaceEntityIndexCache.set(key, index);\n}\n\nasync function writeEntityIndexState(storage: StorageManager, index: EntityMentionIndex): Promise<void> {\n const statePath = entityIndexStatePath(storage);\n await mkdir(path.dirname(statePath), { recursive: true });\n const nextContent = JSON.stringify(index, null, 2) + \"\\n\";\n const currentContent = await readFile(statePath, \"utf-8\").catch(() => \"\");\n if (currentContent === nextContent) return;\n await writeFile(statePath, nextContent, \"utf-8\");\n}\n\nfunction nativePseudoCanonicalId(chunk: NativeKnowledgeChunk): string {\n return `native:${createHash(\"sha256\").update(chunk.sourcePath).digest(\"hex\").slice(0, 12)}`;\n}\n\nfunction createPseudoNativeEntry(chunk: NativeKnowledgeChunk): EntityMentionIndexEntry {\n const canonicalId = nativePseudoCanonicalId(chunk);\n return {\n canonicalId,\n name: chunk.title,\n type: chunk.sourceKind,\n aliases: uniqueStrings(chunk.aliases ?? []),\n facts: [],\n structuredSections: [],\n timelineFacts: [],\n timeline: [],\n relationships: [],\n activity: [],\n factCount: 0,\n memorySnippets: [],\n nativeChunks: [\n {\n chunkId: chunk.chunkId,\n title: chunk.title,\n sourceKind: chunk.sourceKind,\n sourcePath: chunk.sourcePath,\n snippet: compactLine(chunk.content, 180),\n derivedDate: chunk.derivedDate,\n },\n ],\n };\n}\n\nfunction mergeNativeChunk(entry: EntityMentionIndexEntry, chunk: NativeKnowledgeChunk): void {\n const existing = entry.nativeChunks.find((item) => item.chunkId === chunk.chunkId);\n if (existing) return;\n entry.nativeChunks.push({\n chunkId: chunk.chunkId,\n title: chunk.title,\n sourceKind: chunk.sourceKind,\n sourcePath: chunk.sourcePath,\n snippet: compactLine(chunk.content, 180),\n derivedDate: chunk.derivedDate,\n });\n entry.aliases = uniqueStrings([...entry.aliases, ...(chunk.aliases ?? [])]);\n}\n\nfunction hasFreshNativeExplicitMention(\n index: EntityMentionIndex,\n nativeChunks: NativeKnowledgeChunk[],\n query: string,\n): boolean {\n if (nativeChunks.length === 0) return false;\n const nativeCanonicalIds = new Set(nativeChunks.map(nativePseudoCanonicalId));\n const freshNativeIndex: EntityMentionIndex = {\n ...index,\n entities: [\n ...index.entities.filter((entry) => !nativeCanonicalIds.has(entry.canonicalId)),\n ...nativeChunks.map(createPseudoNativeEntry),\n ],\n };\n return resolveLanguageIndependentExplicitCandidates(freshNativeIndex, query).length > 0;\n}\n\nasync function buildEntityMentionIndex(\n storage: StorageManager,\n config: PluginConfig,\n recallNamespaces?: string[],\n namespaceStorage?: (namespace: string) => Promise<StorageManager>,\n nativeChunksOverride?: NativeKnowledgeChunk[],\n resolvedStorages?: StorageManager[],\n abortSignal?: AbortSignal,\n): Promise<EntityMentionIndex> {\n checkEntityRecallAbort(abortSignal);\n const storages = resolvedStorages ?? await resolveEntityIndexStorages(\n storage,\n config,\n recallNamespaces,\n namespaceStorage,\n );\n const shouldPersistIndex =\n storages.length === 1 && path.resolve(storages[0]!.dir) === path.resolve(storage.dir);\n const entityStatusVersionBefore = shouldPersistIndex ? storage.getMemoryStatusVersion() : undefined;\n const [previousIndex, entityFileSets, memorySets, nativeChunks] = await Promise.all([\n shouldPersistIndex ? readEntityIndexState(storage) : Promise.resolve(null),\n Promise.all(storages.map((scopedStorage) => scopedStorage.readAllEntityFiles({ abortSignal }))),\n Promise.all(storages.map((scopedStorage) => scopedStorage.readAllMemories({ abortSignal }))),\n nativeChunksOverride ? Promise.resolve(nativeChunksOverride) : readNativeChunks(config, recallNamespaces),\n ]);\n // The bulk reads now stop at their own scan boundaries (issue #2307); this\n // checkpoint still guards the (larger) indexing pass over their results.\n checkEntityRecallAbort(abortSignal);\n // Pair each entity with the storage that owns it (#1534): canonical ids must\n // reflect that store's aliases and historical migration mappings, never another\n // namespace's.\n const entityRecords = entityFileSets.flatMap((set, index) =>\n set.map((entity) => ({ entity, storage: storages[index]! })),\n );\n const memories = memorySets.flat();\n\n // The two passes over the corpus below never await real I/O, so without an\n // explicit yield they hold the event loop and no recall section deadline can\n // fire during them (issue #2291).\n let scanned = 0;\n const entities = new Map<string, EntityMentionIndexEntry>();\n for (const { entity, storage: entityStorage } of entityRecords) {\n scanned += 1;\n await yieldEntityRecallScanEvery(scanned, abortSignal);\n const canonicalId =\n typeof entityStorage.normalizeEntityName === \"function\"\n ? entityStorage.normalizeEntityName(entity.name, entity.type)\n : normalizeEntityName(entity.name, entity.type, entityStorage.entityAliases);\n const rawStructuredSections = entity.structuredSections ?? [];\n const rawBeliefLedgerFactKeys = beliefLedgerFactKeys(rawStructuredSections);\n const sanitizedFacts = entity.facts\n .map((fact) => sanitizeEntityFact(fact))\n .filter(Boolean)\n .filter((fact) => !rawBeliefLedgerFactKeys.has(normalizeEntityText(fact)))\n .map((fact) => compactLine(fact, 180));\n const { facts: timelineFacts, origins: timelineFactOrigins } = sanitizeOriginatedFacts(\n entity.timeline,\n sanitizeEntityFact,\n compactLine,\n true,\n );\n const structuredSections = buildOriginStructuredSections(\n rawStructuredSections,\n recallFactsForStructuredSection,\n sanitizeEntityFact,\n compactLine,\n );\n entities.set(canonicalId, {\n canonicalId,\n name: entity.name,\n type: entity.type,\n aliases: uniqueStrings(entity.aliases),\n summary: entity.synthesis?.trim() || entity.summary?.trim() || undefined,\n facts: sanitizedFacts,\n timelineFacts,\n ...(timelineFactOrigins.some((origin) => origin !== undefined) ? { timelineFactOrigins } : {}),\n structuredSections,\n timeline: entity.timeline.map((entry) => ({ ...entry })),\n relationships: entity.relationships.map((relationship) => ({ ...relationship })),\n activity: entity.activity.map((activity) => ({ ...activity })),\n factCount: sanitizedFacts.length,\n memorySnippets: [],\n nativeChunks: [],\n });\n }\n\n scanned = 0;\n for (const memory of memories) {\n scanned += 1;\n await yieldEntityRecallScanEvery(scanned, abortSignal);\n const entry = typeof memory.frontmatter.entityRef === \"string\" ? entities.get(memory.frontmatter.entityRef) : undefined;\n if (!entry) continue;\n const snippet = await readMemorySnippet(memory);\n if (entry.memorySnippets.includes(snippet)) continue;\n entry.memorySnippets.push(snippet);\n entry.memorySnippetOrigins = [...(entry.memorySnippetOrigins ?? []), memory.frontmatter.origin];\n }\n // Each remaining phase is another synchronous pass over the whole index\n // (alias map, native-chunk merge, sort, two full serializations). Yield between\n // them so a section deadline can fire between passes instead of only after all\n // of them (issue #2291).\n await yieldEntityRecallScan(abortSignal);\n const aliasIndex = buildAliasIndex([...entities.values()]);\n for (const chunk of nativeChunks) {\n const existingPseudo = entities.get(nativePseudoCanonicalId(chunk));\n if (existingPseudo) {\n mergeNativeChunk(existingPseudo, chunk);\n continue;\n }\n const candidateAliases = uniqueStrings([chunk.title, ...(chunk.aliases ?? [])]).map(normalizeEntityText).filter(Boolean);\n let matched = false;\n for (const alias of candidateAliases) {\n for (const entry of aliasIndex.get(alias) ?? []) {\n mergeNativeChunk(entry, chunk);\n matched = true;\n }\n }\n if (matched) continue;\n const pseudoEntry = createPseudoNativeEntry(chunk);\n entities.set(pseudoEntry.canonicalId, pseudoEntry);\n }\n\n await yieldEntityRecallScan(abortSignal);\n const sortedEntities = [...entities.values()].sort((left, right) => left.name.localeCompare(right.name));\n await yieldEntityRecallScan(abortSignal);\n const previousEntities = previousIndex ? JSON.stringify(previousIndex.entities) : \"\";\n await yieldEntityRecallScan(abortSignal);\n const nextEntities = JSON.stringify(sortedEntities);\n const entityStatusVersionAfter = shouldPersistIndex ? storage.getMemoryStatusVersion() : undefined;\n const canPersistIndex = shouldPersistIndex && entityStatusVersionBefore === entityStatusVersionAfter;\n const index: EntityMentionIndex = {\n version: ENTITY_INDEX_VERSION,\n updatedAt:\n previousIndex && previousEntities === nextEntities\n ? previousIndex.updatedAt\n : new Date().toISOString(),\n entityStatusVersion: canPersistIndex ? entityStatusVersionAfter : undefined,\n entities: sortedEntities,\n };\n if (canPersistIndex) {\n // A build the caller has abandoned must not leave a persisted index behind:\n // the write is I/O the timed-out recall no longer needs, and the next recall\n // is already competing for the same disk.\n checkEntityRecallAbort(abortSignal);\n await writeEntityIndexState(storage, index);\n }\n return index;\n}\n\nfunction resolveExplicitCandidates(\n index: EntityMentionIndex,\n query: string,\n): EntityCandidate[] {\n const candidates: EntityCandidate[] = [];\n for (const entry of index.entities) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]);\n let bestAlias = \"\";\n let bestScore = 0;\n for (const alias of aliases) {\n const score = scoreAliasMatch(query, alias);\n if (score > bestScore) {\n bestAlias = alias;\n bestScore = score;\n }\n }\n if (bestScore <= 0) continue;\n candidates.push({ entry, alias: bestAlias, score: bestScore, source: \"query\" });\n }\n return candidates.sort((left, right) => right.score - left.score);\n}\n\nconst EXPLICIT_ENTITY_MENTION_SCORE = 9;\n\nconst IMPLICIT_ENTITY_STOP_WORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"by\",\n \"can\",\n \"do\",\n \"for\",\n \"from\",\n \"has\",\n \"how\",\n \"i\",\n \"if\",\n \"in\",\n \"is\",\n \"it\",\n \"me\",\n \"my\",\n \"of\",\n \"on\",\n \"or\",\n \"the\",\n \"to\",\n \"was\",\n \"what\",\n \"when\",\n \"where\",\n \"who\",\n \"why\",\n \"with\",\n \"you\",\n \"your\",\n]);\n\nfunction isDistinctiveImplicitAlias(normalizedAlias: string): boolean {\n const tokens = normalizedAlias.split(/\\s+/).filter(Boolean);\n if (tokens.length > 1 && tokens.every((token) => IMPLICIT_ENTITY_STOP_WORDS.has(token))) return false;\n if (tokens.length !== 1) return true;\n const token = tokens[0]!;\n return Array.from(token).length > 1 && !IMPLICIT_ENTITY_STOP_WORDS.has(token);\n}\n\nfunction isShortLatinAlias(alias: string): boolean {\n return /^[A-Za-z]{2,3}$/.test(alias.trim());\n}\n\nfunction hasStrongShortLatinAliasMention(query: string, alias: string): boolean {\n const normalizedAlias = alias.trim();\n const titleCaseAlias = `${normalizedAlias[0]!.toUpperCase()}${normalizedAlias.slice(1).toLowerCase()}`;\n const forms = new Set([normalizedAlias, normalizedAlias.toUpperCase(), titleCaseAlias]);\n return [...forms].some((form) => {\n if (form === form.toLowerCase()) return false;\n const escaped = form.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`(?:^|[^A-Za-z0-9])${escaped}(?:$|[^A-Za-z0-9])`).test(query);\n });\n}\n\nfunction resolveLanguageIndependentExplicitCandidates(\n index: EntityMentionIndex,\n query: string,\n): EntityCandidate[] {\n const canonicalIdsByAlias = new Map<string, Set<string>>();\n for (const entry of index.entities) {\n for (const alias of uniqueStrings([entry.name, ...entry.aliases])) {\n const normalizedAlias = normalizeEntityText(alias);\n if (!normalizedAlias) continue;\n const canonicalIds = canonicalIdsByAlias.get(normalizedAlias) ?? new Set<string>();\n canonicalIds.add(entry.canonicalId);\n canonicalIdsByAlias.set(normalizedAlias, canonicalIds);\n }\n }\n\n const candidates: EntityCandidate[] = [];\n for (const entry of index.entities) {\n let bestAlias = \"\";\n let bestScore = 0;\n for (const alias of uniqueStrings([entry.name, ...entry.aliases])) {\n const normalizedAlias = normalizeEntityText(alias);\n const score = scoreAliasMatch(query, alias);\n if (\n !normalizedAlias ||\n !isDistinctiveImplicitAlias(normalizedAlias) ||\n (isShortLatinAlias(alias) && !hasStrongShortLatinAliasMention(query, alias)) ||\n canonicalIdsByAlias.get(normalizedAlias)?.size !== 1 ||\n score < EXPLICIT_ENTITY_MENTION_SCORE ||\n score <= bestScore\n ) {\n continue;\n }\n bestAlias = alias;\n bestScore = score;\n }\n if (bestAlias) {\n candidates.push({ entry, alias: bestAlias, score: bestScore, source: \"query\" });\n }\n }\n\n return candidates.sort(\n (left, right) => right.score - left.score || left.entry.name.localeCompare(right.entry.name),\n );\n}\n\nfunction resolveRecentTurnCandidates(\n index: EntityMentionIndex,\n transcriptEntries: TranscriptEntry[],\n recentTurns: number,\n): EntityCandidate[] {\n if (recentTurns <= 0 || transcriptEntries.length === 0) return [];\n const recentEntries = transcriptEntries.slice(-recentTurns);\n const candidates = new Map<string, EntityCandidate>();\n for (let indexOffset = recentEntries.length - 1; indexOffset >= 0; indexOffset -= 1) {\n const turn = recentEntries[indexOffset];\n const recencyBoost = recentEntries.length - indexOffset;\n const roleWeight = turn.role === \"user\" ? 2 : turn.role === \"assistant\" ? -1 : 0;\n for (const entry of index.entities) {\n const aliases = uniqueStrings([entry.name, ...entry.aliases]);\n for (const alias of aliases) {\n const score = scoreAliasMatch(turn.content, alias);\n if (score <= 0) continue;\n const current = candidates.get(entry.canonicalId);\n const weightedScore = score + Math.max(0, 6 - recencyBoost) + roleWeight;\n if (!current || weightedScore > current.score) {\n candidates.set(entry.canonicalId, {\n entry,\n alias,\n score: weightedScore,\n source: \"recent_turn\",\n });\n }\n }\n }\n }\n return [...candidates.values()].sort((left, right) => right.score - left.score);\n}\n\nasync function readMemorySnippet(memory: MemoryFile): Promise<string> {\n const content = memory.content.replace(/\\s+/g, \" \").trim();\n return compactLine(content, 180);\n}\n\nasync function buildHintSnippets(\n entry: EntityMentionIndexEntry,\n queryTokens: string[],\n mode: EntityQueryMode,\n maxSupportingFacts: number,\n requestedSectionKeys: Set<string>,\n): Promise<EntityHintSnippet[]> {\n const snippets: EntityHintSnippet[] = [];\n const aliasTokens = new Set(tokenize(uniqueStrings([entry.name, ...entry.aliases]).join(\" \")));\n if (entry.summary) {\n snippets.push({ text: compactLine(entry.summary, 180), score: 10, kind: \"summary\" });\n }\n if (requestedSectionKeys.size > 0) {\n for (const section of entry.structuredSections) {\n if (!requestedSectionKeys.has(normalizeEntityText(section.key).replace(/\\s+/g, \"_\"))) continue;\n for (const [index, fact] of section.facts.entries()) {\n snippets.push({\n text: fact,\n score: mode === \"direct\" ? 8 : 9,\n kind: \"section\",\n origin: section.factOrigins?.[index],\n });\n }\n }\n } else {\n for (const [index, fact] of entry.timelineFacts.entries()) {\n snippets.push({\n text: fact,\n score: mode === \"direct\" ? 6 : 7,\n kind: \"fact\",\n origin: entry.timelineFactOrigins?.[index],\n });\n }\n for (const section of entry.structuredSections) {\n for (const [index, fact] of section.facts.entries()) {\n const normalizedFact = normalizeEntityText(fact);\n const hasNonAliasQueryOverlap = queryTokens.some((token) =>\n !aliasTokens.has(token) && normalizedFact.includes(token)\n );\n if (entry.timelineFacts.length > 0 && !hasNonAliasQueryOverlap) {\n continue;\n }\n snippets.push({\n text: fact,\n score: mode === \"direct\" ? 6 : 7,\n kind: \"fact\",\n origin: section.factOrigins?.[index],\n });\n }\n }\n if (entry.timelineFacts.length === 0 && entry.structuredSections.length === 0) {\n for (const fact of entry.facts) {\n if (!fact.trim()) continue;\n snippets.push({ text: fact, score: mode === \"direct\" ? 6 : 7, kind: \"fact\" });\n }\n }\n }\n\n if (requestedSectionKeys.size === 0) {\n for (const relationship of entry.relationships) {\n snippets.push({\n text: compactLine(relationLine(entry, relationship), 180),\n score: mode === \"direct\" && entry.type.toLowerCase() === \"person\" ? 6 : 4,\n kind: \"relationship\",\n });\n }\n\n for (const activity of entry.activity) {\n snippets.push({\n text: compactLine(`${activity.date}: ${activity.note}`, 180),\n score: 4,\n kind: \"activity\",\n });\n }\n\n for (const [index, memorySnippet] of entry.memorySnippets.slice(0, Math.min(maxSupportingFacts, 4)).entries()) {\n snippets.push({ text: memorySnippet, score: 5, kind: \"memory\", origin: entry.memorySnippetOrigins?.[index] });\n }\n\n for (const chunk of entry.nativeChunks) {\n snippets.push({\n text: compactLine(chunk.snippet, 180),\n score: 3,\n kind: \"native\",\n });\n }\n }\n\n const deduped = new Map<string, EntityHintSnippet>();\n for (const snippet of snippets) {\n const scored = scoreHintSnippet(snippet, queryTokens);\n if (!scored) continue;\n const normalized = normalizeEntityText(scored.text);\n const existing = deduped.get(normalized);\n if (!existing) {\n deduped.set(normalized, scored);\n } else if (existing.origin !== scored.origin) {\n deduped.set(normalized, { ...(scored.score > existing.score ? scored : existing), origin: undefined });\n } else if (scored.score > existing.score) {\n deduped.set(normalized, scored);\n }\n }\n\n return [...deduped.values()]\n .filter((snippet) => snippet.score > 0)\n .sort((left, right) => right.score - left.score)\n .slice(0, maxSupportingFacts);\n}\n\nfunction summarizeUncertainty(snippets: EntityHintSnippet[]): string | null {\n const direct = snippets.filter((snippet) =>\n snippet.kind === \"summary\"\n || snippet.kind === \"fact\"\n || snippet.kind === \"section\"\n || snippet.kind === \"memory\"\n );\n if (direct.length < 2) return null;\n for (let index = 0; index < direct.length; index += 1) {\n for (let compare = index + 1; compare < direct.length; compare += 1) {\n if (jaccardSimilarity(direct[index].text, direct[compare].text) < 0.2) {\n return \"Evidence is mixed across stored facts; treat the hints below as partial and verify before answering definitively.\";\n }\n }\n }\n return null;\n}\n\nfunction formatEntityHintSection(\n candidates: Array<{\n candidate: EntityCandidate;\n snippets: EntityHintSnippet[];\n uncertainty: string | null;\n }>,\n queryTokens: string[],\n mode: EntityQueryMode,\n maxRelatedEntities: number,\n maxChars: number,\n originAuthorityEnabled: boolean, untrustedOrigins: readonly string[],\n): string | null {\n if (candidates.length === 0) return null;\n const lines: string[] = [\"## entity_answer_hints\", \"\"];\n // #1955 review: non-native snippet kinds may embed extraction-written content\n // without per-field origin — fence as unknown (least privilege; plumbing #2397).\n const renderSnippet = (snippet: EntityHintSnippet): string => snippet.kind !== \"native\"\n ? renderAuthorityBoundContent(snippet.text, snippet.origin, { enabled: originAuthorityEnabled, untrustedOrigins }) : snippet.text;\n // (see comment above)\n // #1955 review: inline fields (names/types/aliases/targets) cannot carry the\n // multi-line block fence without collapsing the hint list structure —\n // per-field origin plumbing is tracked in #2397.\n for (const { candidate, snippets, uncertainty } of candidates) {\n const hasSummary = Boolean(candidate.entry.summary?.trim());\n const preferredTopSnippets = hasSummary\n ? snippets.filter((snippet) => snippet.kind !== \"fact\")\n : snippets;\n let topSnippets = (\n preferredTopSnippets.length > 0 ? preferredTopSnippets : snippets\n ).slice(0, 3);\n const buildTimelineSnippets = (seedExcludedTexts: Set<string>): EntityHintSnippet[] => {\n const explicitTimelinePool = dedupeHintSnippetsByText(\n (candidate.entry.timeline ?? [])\n .slice()\n .sort(sortTimelineEntriesDesc)\n .map((entry) => {\n const text = sanitizeEntityFact(entry.text);\n return text\n ? scoreHintSnippet({\n text: compactLine(text, 180),\n score: 7,\n kind: \"activity\" as const,\n origin: entry.origin,\n }, queryTokens)\n : null;\n })\n .filter((snippet): snippet is EntityHintSnippet => snippet !== null)\n .filter((snippet) => !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n const activityTimelinePool = dedupeHintSnippetsByText(\n snippets\n .filter((snippet) => (\n snippet.kind === \"activity\" || snippet.kind === \"memory\"\n ) && !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n return explicitTimelinePool.length > 0\n ? explicitTimelinePool\n : activityTimelinePool.length > 0\n ? activityTimelinePool\n : dedupeHintSnippetsByText(\n snippets\n .filter((snippet) => (\n snippet.kind === \"fact\" || snippet.kind === \"summary\"\n ) && !seedExcludedTexts.has(normalizeEntityText(snippet.text))),\n ).slice(0, 2);\n };\n const baseTopSnippetTexts = new Set(topSnippets.map((snippet) => normalizeEntityText(snippet.text)));\n const timelinePool = mode !== \"direct\" ? buildTimelineSnippets(baseTopSnippetTexts) : [];\n if (mode !== \"direct\" && hasSummary && topSnippets.length < 2) {\n if (timelinePool.length > 0) {\n topSnippets = [...topSnippets, timelinePool[0]!].slice(0, 3);\n }\n }\n const topSnippetTexts = new Set(topSnippets.map((snippet) => normalizeEntityText(snippet.text)));\n lines.push(`- target: ${candidate.entry.name} (${candidate.entry.type})`);\n lines.push(`- resolution: ${candidate.source === \"recent_turn\" ? \"carried forward from recent turns via alias\" : \"matched alias\"} \"${candidate.alias}\"${candidate.source === \"recent_turn\" ? \"\" : \" in the query\"}`);\n if (uncertainty) lines.push(`- uncertainty: ${uncertainty}`);\n if (topSnippets.length > 0) {\n lines.push(\"- likely answer:\");\n for (const snippet of topSnippets) {\n lines.push(` - ${renderSnippet(snippet)}`);\n }\n }\n if (mode !== \"direct\") {\n const fallbackTimeline = timelinePool.filter(\n (snippet) => !topSnippetTexts.has(normalizeEntityText(snippet.text)),\n );\n if (fallbackTimeline.length > 0) {\n lines.push(\"- recent timeline:\");\n for (const snippet of fallbackTimeline) {\n lines.push(` - ${renderSnippet(snippet)}`);\n }\n }\n }\n const related = candidate.entry.relationships.slice(0, maxRelatedEntities).map((relationship) => relationship.target);\n if (related.length > 0) {\n lines.push(`- related entities: ${related.join(\", \")}`);\n }\n lines.push(`- support counts: facts=${candidate.entry.factCount}, memories=${candidate.entry.memorySnippets.length}, native=${candidate.entry.nativeChunks.length}`);\n lines.push(\"\");\n }\n\n let result = lines.join(\"\\n\");\n if (result.length > maxChars) {\n result = `${truncateGraphemeSafe(result, Math.max(0, maxChars - 15)).trimEnd()}\\n\\n...(trimmed)\\n`;\n }\n return result.trim().length > 0 ? result.trimEnd() : null;\n}\n\nexport async function buildEntityRecallSection(options: BuildEntityRecallSectionOptions): Promise<string | null> {\n // Checkpoints sit at the real I/O boundaries below (persisted-index read,\n // native-chunk read, storage resolution, index build). The per-candidate\n // formatting that follows never awaits real I/O, so a deadline that fires\n // during a scan is observed here (issue #2291).\n checkEntityRecallAbort(options.abortSignal);\n const prefixedMode = detectEntityQueryMode(options.query);\n const persistedIndex = prefixedMode\n ? null\n : await readCurrentPersistedEntityIndex(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n );\n checkEntityRecallAbort(options.abortSignal);\n let nativeChunks: NativeKnowledgeChunk[] | undefined;\n if (\n !prefixedMode &&\n persistedIndex &&\n resolveLanguageIndependentExplicitCandidates(persistedIndex, options.query).length === 0\n ) {\n nativeChunks = await readNativeChunks(options.config, options.recallNamespaces);\n if (!hasFreshNativeExplicitMention(persistedIndex, nativeChunks, options.query)) {\n return entityRecallSectionAbsent(options.abortSignal);\n }\n }\n const namespaceScoped =\n resolveNamespaceCapabilities(options.config).namespaces &&\n options.namespaceStorage !== undefined &&\n (options.recallNamespaces?.length ?? 0) > 0;\n if (namespaceScoped) {\n nativeChunks = await readNativeChunks(options.config, options.recallNamespaces);\n }\n const resolvedStorages = namespaceScoped\n ? await resolveEntityIndexStorages(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n )\n : undefined;\n const namespaceCacheKey =\n resolvedStorages && options.recallNamespaces && nativeChunks\n ? namespaceEntityIndexCacheKey(\n resolvedStorages,\n options.recallNamespaces,\n nativeEntityIndexRevision(nativeChunks),\n )\n : undefined;\n let index: EntityMentionIndex | undefined = namespaceCacheKey\n ? namespaceEntityIndexCache.get(namespaceCacheKey)\n : undefined;\n checkEntityRecallAbort(options.abortSignal);\n if (!index) {\n index = await buildEntityMentionIndex(\n options.storage,\n options.config,\n options.recallNamespaces,\n options.namespaceStorage,\n nativeChunks,\n resolvedStorages,\n options.abortSignal,\n );\n if (namespaceCacheKey) rememberNamespaceEntityIndex(namespaceCacheKey, index);\n }\n // Candidate resolution is another synchronous pass over every entity and alias,\n // reached even on a cache hit that did no I/O at all — so yield here too, or a\n // cached corpus could still hold the loop past the section budget (issue #2291).\n await yieldEntityRecallScan(options.abortSignal);\n const explicitCandidates = resolveExplicitCandidates(index, options.query);\n await yieldEntityRecallScan(options.abortSignal);\n const queryCandidates = prefixedMode\n ? explicitCandidates\n : resolveLanguageIndependentExplicitCandidates(index, options.query);\n const mode = prefixedMode ?? (queryCandidates.length > 0 ? \"direct\" : null);\n if (!mode) return entityRecallSectionAbsent(options.abortSignal);\n\n const candidates = queryCandidates.length > 0\n ? queryCandidates\n : resolveRecentTurnCandidates(index, options.transcriptEntries, options.recentTurns);\n\n if (candidates.length === 0) return entityRecallSectionAbsent(options.abortSignal);\n\n const queryTokens = tokenize(options.query);\n const candidateLimit = queryCandidates.length === 0 && mode === \"follow_up\"\n ? 1\n : options.maxHints;\n const rankedCandidates = candidates.slice(0, candidateLimit);\n const enriched = await Promise.all(\n rankedCandidates.map(async (candidate) => {\n const requestedSectionKeys = new Set(\n resolveRequestedEntitySectionKeys(\n options.query,\n candidate.entry.type,\n candidate.entry.structuredSections,\n options.config.entitySchemas,\n ),\n );\n const snippets = await buildHintSnippets(\n candidate.entry,\n queryTokens,\n mode,\n options.maxSupportingFacts,\n requestedSectionKeys,\n );\n return {\n candidate,\n snippets,\n uncertainty: summarizeUncertainty(snippets),\n };\n }),\n );\n\n const section = formatEntityHintSection(\n enriched,\n queryTokens,\n mode,\n options.maxRelatedEntities,\n options.maxChars,\n options.originAuthorityEnabled === true,\n options.untrustedOrigins ?? [],\n );\n // `entityRecallSectionAbsent` so a cancelled build is not recorded as a\n // successful section that simply found no entities.\n if (!section) return entityRecallSectionAbsent(options.abortSignal);\n return section;\n}\n\nexport async function readRecentEntityTranscriptEntries(\n transcriptEntriesPromise: Promise<TranscriptEntry[]>,\n recentTurns: number,\n): Promise<TranscriptEntry[]> {\n if (recentTurns <= 0) return [];\n const transcriptEntries = await transcriptEntriesPromise.catch(() => []);\n if (transcriptEntries.length === 0) return [];\n return transcriptEntries.slice(-Math.max(1, recentTurns * 2));\n}\n\nexport const entityIndexVersion = ENTITY_INDEX_VERSION;\nexport const entityRecentTranscriptLookbackHours = RECENT_TRANSCRIPT_LOOKBACK_HOURS;\n"],"mappings":"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","names":["index","token"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveCorpusNamespaceRoots
3
- } from "./chunk-I67HKRBF.js";
3
+ } from "./chunk-EFWHCTYJ.js";
4
4
  import {
5
5
  capabilityAllowsNamespace
6
6
  } from "./chunk-MZWSOLMT.js";
@@ -200,4 +200,4 @@ async function readAggregateExtractionWatermark(options) {
200
200
  export {
201
201
  readAggregateExtractionWatermark
202
202
  };
203
- //# sourceMappingURL=chunk-CIA6ZUBA.js.map
203
+ //# sourceMappingURL=chunk-WMOJIOIG.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
3
3
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES
4
- } from "./chunk-AWRJBAIH.js";
4
+ } from "./chunk-4FFROSFG.js";
5
5
  import {
6
6
  SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
7
7
  } from "./chunk-XDL5CYZN.js";
@@ -343,4 +343,4 @@ export {
343
343
  parseSupportPassportModelJob,
344
344
  SupportPassportModelBridge
345
345
  };
346
- //# sourceMappingURL=chunk-W4Q54HM3.js.map
346
+ //# sourceMappingURL=chunk-WR2YKUIW.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SupportPassportCreateGrantRequestSchema,
3
3
  defineOperation
4
- } from "./chunk-AWRJBAIH.js";
4
+ } from "./chunk-4FFROSFG.js";
5
5
  import {
6
6
  SupportPassportCardCategorySchema,
7
7
  SupportPassportMemoryIdSchema,
@@ -220,4 +220,4 @@ var supportPassportGrantAskOperation = defineOperation({
220
220
  result: await ctx.service.supportPassportAskGrant(grantId, secret, question, ctx.abortSignal)
221
221
  })
222
222
  });
223
- //# sourceMappingURL=chunk-VWDTV6SH.js.map
223
+ //# sourceMappingURL=chunk-X6E7TT3A.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  collapseWhitespace,
3
3
  truncateCodePointSafe
4
- } from "./chunk-6MKAMLQL.js";
4
+ } from "./chunk-PJKTFXE2.js";
5
5
  import {
6
6
  isSupportPassportPrivateMemory
7
7
  } from "./chunk-XDL5CYZN.js";
@@ -189,4 +189,4 @@ export {
189
189
  recallForActiveMemory,
190
190
  getMemoryForActiveMemory
191
191
  };
192
- //# sourceMappingURL=chunk-D4OCJSLV.js.map
192
+ //# sourceMappingURL=chunk-YDPAE2RD.js.map
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  countRecallTokenOverlap,
18
18
  normalizeRecallTokens
19
- } from "./chunk-ZBJMUXZH.js";
19
+ } from "./chunk-DJ7HMNSL.js";
20
20
  import {
21
21
  inferMemoryStatus,
22
22
  toMemoryPathRel
@@ -27,6 +27,9 @@ import {
27
27
  import {
28
28
  throwIfAborted
29
29
  } from "./chunk-BTTPKDIL.js";
30
+ import {
31
+ isRecord
32
+ } from "./chunk-A2IYSXDQ.js";
30
33
  import {
31
34
  listJsonFilesStrict,
32
35
  readJsonFile
@@ -53,6 +56,20 @@ async function readSourceMemories(options) {
53
56
  }
54
57
  return sourceMemories;
55
58
  }
59
+ function parseSourceMemoryInsertedAt(node) {
60
+ const insertedAtById = /* @__PURE__ */ new Map();
61
+ const insertedAtRaw = node.metadata?.[HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY];
62
+ if (!insertedAtRaw) return insertedAtById;
63
+ try {
64
+ const parsed = JSON.parse(insertedAtRaw);
65
+ if (!isRecord(parsed)) return insertedAtById;
66
+ for (const [memoryId, value] of Object.entries(parsed)) {
67
+ if (typeof value === "string") insertedAtById.set(memoryId, value);
68
+ }
69
+ } catch {
70
+ }
71
+ return insertedAtById;
72
+ }
56
73
  function projectSourceBackedNode(node, sourceMemories, memoryDir, temporalExpiredInInjection, nowMs) {
57
74
  const sourceMemoryIds = node.sourceMemoryIds ?? [];
58
75
  if (sourceMemoryIds.length === 0) return node;
@@ -61,6 +78,14 @@ function projectSourceBackedNode(node, sourceMemories, memoryDir, temporalExpire
61
78
  return memory !== void 0 && inferMemoryStatus(memory.frontmatter, toMemoryPathRel(memoryDir, memory.path)) === "active" && (temporalExpiredInInjection || !isValidityExpiredNow(memory.frontmatter, nowMs));
62
79
  });
63
80
  if (activeSourceMemoryIds.length === 0) return null;
81
+ const insertedAtById = parseSourceMemoryInsertedAt(node);
82
+ const insertedAtMs = (memoryId) => {
83
+ const parsedMs = Date.parse(insertedAtById.get(memoryId) ?? "");
84
+ return Number.isFinite(parsedMs) ? parsedMs : Date.parse(node.recordedAt);
85
+ };
86
+ activeSourceMemoryIds.sort(
87
+ (left, right) => insertedAtMs(right) - insertedAtMs(left) || compareDeterministicStrings(left, right)
88
+ );
64
89
  const activeMemories = activeSourceMemoryIds.flatMap((memoryId) => {
65
90
  const memory = sourceMemories.get(memoryId);
66
91
  return memory ? [memory] : [];
@@ -69,22 +94,14 @@ function projectSourceBackedNode(node, sourceMemories, memoryDir, temporalExpire
69
94
  (memory) => memory.frontmatter.structuredAttributes ? stripAttributesSuffix(memory.content) : memory.content
70
95
  );
71
96
  let metadata;
72
- const insertedAtRaw = node.metadata?.[HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY];
73
- if (insertedAtRaw) {
74
- try {
75
- const insertedAt = JSON.parse(insertedAtRaw);
76
- const activeInsertedAt = activeSourceMemoryIds.flatMap((memoryId) => {
77
- const value = insertedAt[memoryId];
78
- return typeof value === "string" ? [[memoryId, value]] : [];
79
- });
80
- if (activeInsertedAt.length > 0) {
81
- metadata = {
82
- [HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY]: JSON.stringify(Object.fromEntries(activeInsertedAt))
83
- };
84
- }
85
- } catch {
86
- metadata = void 0;
87
- }
97
+ const activeInsertedAt = activeSourceMemoryIds.flatMap((memoryId) => {
98
+ const value = insertedAtById.get(memoryId);
99
+ return typeof value === "string" ? [[memoryId, value]] : [];
100
+ });
101
+ if (activeInsertedAt.length > 0) {
102
+ metadata = {
103
+ [HARMONIC_SOURCE_MEMORY_INSERTED_AT_KEY]: JSON.stringify(Object.fromEntries(activeInsertedAt))
104
+ };
88
105
  }
89
106
  return {
90
107
  ...node,
@@ -279,4 +296,4 @@ async function searchHarmonicRetrieval(options) {
279
296
  export {
280
297
  searchHarmonicRetrieval
281
298
  };
282
- //# sourceMappingURL=chunk-G3YBWFUC.js.map
299
+ //# sourceMappingURL=chunk-YIIC5IDU.js.map