@remnic/core 9.69.102 → 9.69.104

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 (366) hide show
  1. package/dist/access-admin-ops-surface.js +53 -52
  2. package/dist/access-authorization-probe.js +54 -53
  3. package/dist/access-boundary.js +53 -52
  4. package/dist/access-cli.js +153 -150
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +53 -52
  7. package/dist/access-http-briefing.js +54 -53
  8. package/dist/access-http-query.js +55 -54
  9. package/dist/access-http.js +77 -76
  10. package/dist/access-identity-continuity-surface.js +53 -52
  11. package/dist/access-lcm-surface.js +53 -52
  12. package/dist/access-mcp.js +66 -65
  13. package/dist/access-namespace-preflight.js +53 -52
  14. package/dist/access-observe-write-category.js +9 -9
  15. package/dist/access-observe-write-surface.js +53 -52
  16. package/dist/access-offline-manifest.js +6 -6
  17. package/dist/access-operations-batch.js +57 -56
  18. package/dist/access-operations.js +64 -63
  19. package/dist/access-recall-concurrency.js +53 -52
  20. package/dist/access-recall-response.js +53 -52
  21. package/dist/access-recall-surface.js +53 -52
  22. package/dist/access-schema.js +8 -8
  23. package/dist/access-service.js +53 -52
  24. package/dist/access-surface-catalog.js +55 -54
  25. package/dist/access-surface-catalog.js.map +1 -1
  26. package/dist/active-recall.js +21 -20
  27. package/dist/active-recall.js.map +1 -1
  28. package/dist/adapters/index.js +4 -4
  29. package/dist/adapters/registry.js +2 -2
  30. package/dist/briefing.js +14 -13
  31. package/dist/buffer.js +5 -5
  32. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  33. package/dist/{capsule-merge-ZCXUPLNJ.js → capsule-merge-42GJGDUC.js} +4 -3
  34. package/dist/{capsule-merge-ZCXUPLNJ.js.map → capsule-merge-42GJGDUC.js.map} +1 -1
  35. package/dist/causal-behavior.js +2 -2
  36. package/dist/causal-chain.js +2 -2
  37. package/dist/causal-consolidation.js +17 -16
  38. package/dist/causal-consolidation.js.map +1 -1
  39. package/dist/causal-retrieval.js +2 -2
  40. package/dist/causal-trajectory-graph.js +3 -3
  41. package/dist/causal-trajectory.js +1 -1
  42. package/dist/{chunk-47LTKAGL.js → chunk-2COXDQ6C.js} +21 -6
  43. package/dist/chunk-2COXDQ6C.js.map +1 -0
  44. package/dist/{chunk-IOYY6ROU.js → chunk-2MMBJE53.js} +7 -7
  45. package/dist/{chunk-QSXEQPC4.js → chunk-2OFDC3AK.js} +2 -2
  46. package/dist/{chunk-4MP2Q2EI.js → chunk-2TCNEJ36.js} +4 -4
  47. package/dist/{chunk-5FAGCOZD.js → chunk-2U3R3DDH.js} +9 -9
  48. package/dist/{chunk-SCXURCVT.js → chunk-2UPTRDGM.js} +3 -3
  49. package/dist/{chunk-XVZA6VXC.js → chunk-3SL52JKD.js} +4 -4
  50. package/dist/{chunk-SBOCJ47I.js → chunk-5R4YPRAR.js} +19 -6
  51. package/dist/chunk-5R4YPRAR.js.map +1 -0
  52. package/dist/{chunk-ANPRNTPT.js → chunk-63LFM77Z.js} +15 -2
  53. package/dist/chunk-63LFM77Z.js.map +1 -0
  54. package/dist/{chunk-DINOVGA5.js → chunk-6WRHNA4I.js} +48 -48
  55. package/dist/chunk-6WRHNA4I.js.map +1 -0
  56. package/dist/{chunk-DSPWVQZ6.js → chunk-73R4HOOK.js} +3 -3
  57. package/dist/chunk-7CT3AI52.js +84 -0
  58. package/dist/chunk-7CT3AI52.js.map +1 -0
  59. package/dist/{chunk-PHBH74Q6.js → chunk-7NBUE5VY.js} +2 -2
  60. package/dist/{chunk-S533KGX6.js → chunk-7X7A7KVN.js} +2 -2
  61. package/dist/{chunk-XEATJBNB.js → chunk-7YQR6XHY.js} +71 -71
  62. package/dist/{chunk-F5MINS3R.js → chunk-A6WNTVA7.js} +3 -3
  63. package/dist/{chunk-F5MINS3R.js.map → chunk-A6WNTVA7.js.map} +1 -1
  64. package/dist/{chunk-533RHNHB.js → chunk-ATFFWIKL.js} +2 -2
  65. package/dist/{chunk-QCYUIZK2.js → chunk-AU43D3IT.js} +7 -7
  66. package/dist/{chunk-JZ66PN72.js → chunk-AWSP3WNM.js} +2 -2
  67. package/dist/{chunk-IY47KPML.js → chunk-B3OFQP5Y.js} +6 -6
  68. package/dist/{chunk-4DXNOVNW.js → chunk-B454SHPU.js} +6 -6
  69. package/dist/{chunk-3LMOJXZR.js → chunk-BKVCTTEN.js} +2 -2
  70. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  71. package/dist/{chunk-CZN53OT5.js → chunk-CGBE3N7T.js} +2 -2
  72. package/dist/{chunk-HWLIMQE2.js → chunk-CHDGJJV6.js} +2 -2
  73. package/dist/{chunk-UYPQOASU.js → chunk-CNBGAFDY.js} +2 -2
  74. package/dist/{chunk-JTC3PBNH.js → chunk-DB6XFMOF.js} +3 -3
  75. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  76. package/dist/{chunk-UFIZRMQZ.js → chunk-E4XLFYHV.js} +61 -29
  77. package/dist/chunk-E4XLFYHV.js.map +1 -0
  78. package/dist/{chunk-4OXXDL3X.js → chunk-EWWK65CI.js} +2 -2
  79. package/dist/{chunk-DFPG47ET.js → chunk-EZ3F4YIN.js} +11 -11
  80. package/dist/{chunk-V3I4NLZP.js → chunk-FYX2LXIX.js} +2 -2
  81. package/dist/{chunk-PNVOKGAX.js → chunk-G5I5ZT6O.js} +2 -2
  82. package/dist/{chunk-7Z2UKRNJ.js → chunk-GQ6ZF4LD.js} +2 -2
  83. package/dist/{chunk-PEZAHDDU.js → chunk-GZ2KV2RO.js} +5 -5
  84. package/dist/chunk-H6Z3RNW3.js +330 -0
  85. package/dist/chunk-H6Z3RNW3.js.map +1 -0
  86. package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
  87. package/dist/{chunk-AXHU56C3.js → chunk-HWGFTTPS.js} +2 -2
  88. package/dist/{chunk-2SGLMP2E.js → chunk-IDSZNHIP.js} +2 -2
  89. package/dist/{chunk-LO4UKPKX.js → chunk-IFCKHPY4.js} +2 -2
  90. package/dist/{chunk-ZHXSOMYH.js → chunk-IOMLGJHG.js} +4 -4
  91. package/dist/{chunk-YRULQW5J.js → chunk-ISX7GVZE.js} +4 -4
  92. package/dist/{chunk-5PHZSD75.js → chunk-J3ZJBX7I.js} +2 -2
  93. package/dist/{chunk-X5TAWDRO.js → chunk-JC7QQ2DJ.js} +2 -2
  94. package/dist/{chunk-RFQT7IZO.js → chunk-JRDL3FGM.js} +3 -3
  95. package/dist/{chunk-OGZC2WUX.js → chunk-JWFTPRYD.js} +2 -2
  96. package/dist/{chunk-7OA4JWP5.js → chunk-KFHEZJQZ.js} +2 -2
  97. package/dist/{chunk-P3WRFSYF.js → chunk-KMN2JE4D.js} +2 -2
  98. package/dist/{chunk-GNBZB43J.js → chunk-KV7LFOPF.js} +2 -2
  99. package/dist/{chunk-L6YCGS7I.js → chunk-KYUVFCT2.js} +2 -2
  100. package/dist/{chunk-5BVL2XUD.js → chunk-LHDSCWDK.js} +17 -17
  101. package/dist/{chunk-SF7CWSR6.js → chunk-LXJZUNLX.js} +2 -2
  102. package/dist/{chunk-XCB6QDL6.js → chunk-M5GVCJSJ.js} +8 -2
  103. package/dist/chunk-M5GVCJSJ.js.map +1 -0
  104. package/dist/{chunk-DGS34QSY.js → chunk-MFZACYZ6.js} +2 -2
  105. package/dist/{chunk-PYYQCHJC.js → chunk-MZOQ26LH.js} +2 -2
  106. package/dist/{chunk-R2TVWQLR.js → chunk-NT2Q6AHC.js} +2 -2
  107. package/dist/{chunk-ABGM2BN4.js → chunk-O43AAJFQ.js} +2 -2
  108. package/dist/{chunk-G3BW6SDE.js → chunk-OFGTRDWX.js} +3 -3
  109. package/dist/{chunk-6Z263Z3E.js → chunk-OWV6LKNZ.js} +2 -2
  110. package/dist/{chunk-HIHN4XHL.js → chunk-PQ7EB5AD.js} +3 -3
  111. package/dist/{chunk-VVYLVE6R.js → chunk-PQKZLBCJ.js} +1 -1
  112. package/dist/{chunk-OFFW73OZ.js → chunk-PRNR47DI.js} +2 -2
  113. package/dist/{chunk-UL7KDVLC.js → chunk-PZ2QQULY.js} +11 -11
  114. package/dist/{chunk-55NZVUNI.js → chunk-QAIVTLL2.js} +3 -3
  115. package/dist/{chunk-M7T2NKET.js → chunk-QKCGOECM.js} +2 -2
  116. package/dist/{chunk-ARY6O3JN.js → chunk-QUNCLKHM.js} +2 -2
  117. package/dist/{chunk-Z3O53WZR.js → chunk-QWUJWBZ5.js} +2 -2
  118. package/dist/{chunk-RZXFXKWY.js → chunk-QX3K3INR.js} +2 -2
  119. package/dist/{chunk-HFOY2SBG.js → chunk-RYN4AIRM.js} +7 -5
  120. package/dist/chunk-RYN4AIRM.js.map +1 -0
  121. package/dist/{chunk-4LNCLZNK.js → chunk-S2GR3T7W.js} +2 -2
  122. package/dist/{chunk-VPOAMPDD.js → chunk-SFDBLCZV.js} +59 -59
  123. package/dist/{chunk-2IWBHZ3H.js → chunk-SIGDETMB.js} +2 -2
  124. package/dist/chunk-SP4DB6SX.js +19 -0
  125. package/dist/chunk-SP4DB6SX.js.map +1 -0
  126. package/dist/{chunk-DBWNTLLI.js → chunk-STQC2FYQ.js} +6 -6
  127. package/dist/{chunk-S5R77WHV.js → chunk-SWXPR5SE.js} +2 -2
  128. package/dist/{chunk-3DNTFZAT.js → chunk-T32YYUT2.js} +2 -2
  129. package/dist/{chunk-W5JQSVPZ.js → chunk-T6RQNV7E.js} +2 -2
  130. package/dist/{chunk-O23QMYN4.js → chunk-TRN56SPQ.js} +2 -2
  131. package/dist/{chunk-NM3BT2OH.js → chunk-TXTRHF3B.js} +2 -2
  132. package/dist/{chunk-7AUIGOH4.js → chunk-VDVHIRCK.js} +2 -2
  133. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  134. package/dist/{chunk-ZGYLPCWN.js → chunk-VO2BNAA2.js} +3 -3
  135. package/dist/{chunk-WVEECBCG.js → chunk-VV2MVHCJ.js} +2 -2
  136. package/dist/{chunk-HVDEKJJR.js → chunk-VYIBRCVW.js} +70 -61
  137. package/dist/chunk-VYIBRCVW.js.map +1 -0
  138. package/dist/{chunk-B3O3IRZN.js → chunk-VZBW6CDG.js} +1 -1
  139. package/dist/{chunk-JPKK466T.js → chunk-W5XWHTDO.js} +2 -2
  140. package/dist/{chunk-CYG3K2T2.js → chunk-WR66CTVU.js} +6 -6
  141. package/dist/{chunk-JNAOTN7B.js → chunk-XLWMNDQR.js} +4 -4
  142. package/dist/chunk-XLWMNDQR.js.map +1 -0
  143. package/dist/{chunk-RP7RSENW.js → chunk-XQWKB6PY.js} +2 -2
  144. package/dist/{chunk-64S6X4IU.js → chunk-XTN54NML.js} +4 -4
  145. package/dist/{chunk-UCPGOUDZ.js → chunk-Y57GJDG5.js} +108 -3
  146. package/dist/chunk-Y57GJDG5.js.map +1 -0
  147. package/dist/{chunk-KYLYXGKD.js → chunk-YI6XIFQV.js} +2 -2
  148. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  149. package/dist/{chunk-Y7427SL7.js → chunk-Z6EZCN6Z.js} +10 -10
  150. package/dist/{chunk-5K2ALMSZ.js → chunk-ZRUC7FD3.js} +2 -2
  151. package/dist/cli.js +103 -102
  152. package/dist/coding/export-okf-codegraph.js +13 -12
  153. package/dist/coding/export-okf-codegraph.js.map +1 -1
  154. package/dist/coding/pre-action-gate.js +2 -2
  155. package/dist/compounding/engine.js +14 -13
  156. package/dist/config.js +21 -20
  157. package/dist/connectors/codex-materialize-runner.js +14 -13
  158. package/dist/connectors/index.js +14 -13
  159. package/dist/consolidation-provenance-check.js +4 -3
  160. package/dist/consolidation-undo.js +3 -2
  161. package/dist/consolidation-undo.js.map +1 -1
  162. package/dist/contradiction/index.js +3 -2
  163. package/dist/convergence-refresh.js +16 -15
  164. package/dist/corpus-watermark.js +16 -15
  165. package/dist/dashboard-runtime.js +2 -2
  166. package/dist/deep-recall-http-glue.js +9 -9
  167. package/dist/deep-recall.js +2 -2
  168. package/dist/embedding-fallback.d.ts +2 -1
  169. package/dist/embedding-fallback.d.ts.map +1 -1
  170. package/dist/embedding-fallback.js +2 -2
  171. package/dist/embedding-index-storage.d.ts +28 -1
  172. package/dist/embedding-index-storage.d.ts.map +1 -1
  173. package/dist/embedding-index-storage.js +1 -1
  174. package/dist/entity-mention-carry.d.ts +16 -0
  175. package/dist/entity-mention-carry.d.ts.map +1 -0
  176. package/dist/entity-mention-carry.js +8 -0
  177. package/dist/entity-mention-epoch.d.ts +22 -0
  178. package/dist/entity-mention-epoch.d.ts.map +1 -0
  179. package/dist/entity-mention-epoch.js +8 -0
  180. package/dist/entity-mention-index-cache.d.ts +28 -0
  181. package/dist/entity-mention-index-cache.d.ts.map +1 -0
  182. package/dist/entity-mention-index-cache.js +29 -0
  183. package/dist/entity-mention-index-cache.js.map +1 -0
  184. package/dist/entity-retrieval.d.ts.map +1 -1
  185. package/dist/entity-retrieval.js +18 -15
  186. package/dist/event-order-recall.js +2 -2
  187. package/dist/external-wiki-access.js +54 -53
  188. package/dist/extraction-span-materialize.js +2 -2
  189. package/dist/extraction.js +21 -20
  190. package/dist/{graph-edge-decay-MKIRZ762.js → graph-edge-decay-PVKDKLQK.js} +6 -6
  191. package/dist/graph-edge-decay-PVKDKLQK.js.map +1 -0
  192. package/dist/graph-jsonl.js +4 -4
  193. package/dist/graph-snapshot.js +4 -4
  194. package/dist/graph.js +5 -5
  195. package/dist/harmonic-retrieval.js +1 -1
  196. package/dist/index.js +187 -184
  197. package/dist/lcm/engine.js +4 -4
  198. package/dist/lcm/index.js +13 -13
  199. package/dist/location/index.js +16 -15
  200. package/dist/maintenance/memory-governance.js +14 -13
  201. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -13
  202. package/dist/maintenance/rebuild-memory-projection.js +15 -14
  203. package/dist/memory-browse-operations.js +54 -53
  204. package/dist/memory-browse.js +5 -5
  205. package/dist/memory-corpus-version.d.ts +8 -3
  206. package/dist/memory-corpus-version.d.ts.map +1 -1
  207. package/dist/memory-corpus-version.js +2 -1
  208. package/dist/namespaces/migrate.js +15 -14
  209. package/dist/namespaces/search.js +7 -7
  210. package/dist/namespaces/storage.js +14 -13
  211. package/dist/offline-sync-changeset-generations.js +4 -4
  212. package/dist/offline-sync-embedding-generation.js +3 -3
  213. package/dist/offline-sync-exclude-globs.d.ts +8 -0
  214. package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
  215. package/dist/offline-sync-exclude-globs.js +3 -1
  216. package/dist/offline-sync-snapshot-stream.js +6 -6
  217. package/dist/offline-sync.d.ts.map +1 -1
  218. package/dist/offline-sync.js +9 -9
  219. package/dist/operator-doctor-corpus.js +17 -16
  220. package/dist/operator-toolkit.js +34 -33
  221. package/dist/orchestration/maintenance.js +22 -21
  222. package/dist/orchestrator.js +153 -150
  223. package/dist/page-versioning.js +3 -2
  224. package/dist/preferences/preference-drift.d.ts.map +1 -1
  225. package/dist/procedural/library-maintenance.d.ts.map +1 -1
  226. package/dist/qmd.js +4 -4
  227. package/dist/recall-navigation-operations.js +54 -53
  228. package/dist/recall-navigation.js +53 -52
  229. package/dist/recall-state-view-admission.js +5 -5
  230. package/dist/recall-why-service.js +5 -5
  231. package/dist/{resolution-BROE3TRO.js → resolution-RSG4HZTL.js} +4 -3
  232. package/dist/resolution-RSG4HZTL.js.map +1 -0
  233. package/dist/resume-bundles.js +22 -21
  234. package/dist/search/factory.js +6 -6
  235. package/dist/search/index.js +12 -12
  236. package/dist/semantic-consolidation.js +15 -14
  237. package/dist/semantic-rule-promotion.js +14 -13
  238. package/dist/semantic-rule-verifier.js +14 -13
  239. package/dist/source-agent-qualifier.js +17 -16
  240. package/dist/standup/build.js +14 -13
  241. package/dist/storage/entity-mention-frontmatter-hold.d.ts +14 -0
  242. package/dist/storage/entity-mention-frontmatter-hold.d.ts.map +1 -0
  243. package/dist/storage.d.ts +13 -9
  244. package/dist/storage.d.ts.map +1 -1
  245. package/dist/storage.js +13 -12
  246. package/dist/support-passport/index.js +56 -55
  247. package/dist/transfer/backup.js +2 -2
  248. package/dist/transfer/capsule-export.js +2 -2
  249. package/dist/transfer/capsule-import.js +5 -4
  250. package/dist/transfer/export-okf.js +14 -13
  251. package/dist/verified-recall.js +14 -13
  252. package/dist/who-knows-cli.js +15 -14
  253. package/dist/who-knows.js +14 -13
  254. package/package.json +2 -2
  255. package/src/embedding-fallback-cross-process.test.ts +533 -0
  256. package/src/embedding-fallback.ts +19 -7
  257. package/src/embedding-index-storage.test.ts +482 -2
  258. package/src/embedding-index-storage.ts +131 -2
  259. package/src/entity-mention-carry.ts +31 -0
  260. package/src/entity-mention-epoch.ts +120 -0
  261. package/src/entity-mention-index-cache.ts +443 -0
  262. package/src/entity-retrieval.ts +72 -71
  263. package/src/maintenance/rebuild-memory-projection.ts +1 -1
  264. package/src/memory-corpus-version.ts +13 -3
  265. package/src/offline-sync-exclude-globs.ts +23 -0
  266. package/src/offline-sync.test.ts +325 -0
  267. package/src/offline-sync.ts +17 -1
  268. package/src/preferences/preference-drift.ts +5 -3
  269. package/src/procedural/library-maintenance.ts +4 -3
  270. package/src/semantic-rule-promotion.ts +1 -1
  271. package/src/storage/entity-mention-frontmatter-hold.ts +44 -0
  272. package/src/storage.ts +40 -38
  273. package/dist/chunk-47LTKAGL.js.map +0 -1
  274. package/dist/chunk-ANPRNTPT.js.map +0 -1
  275. package/dist/chunk-DINOVGA5.js.map +0 -1
  276. package/dist/chunk-HFOY2SBG.js.map +0 -1
  277. package/dist/chunk-HVDEKJJR.js.map +0 -1
  278. package/dist/chunk-JNAOTN7B.js.map +0 -1
  279. package/dist/chunk-SBOCJ47I.js.map +0 -1
  280. package/dist/chunk-UCPGOUDZ.js.map +0 -1
  281. package/dist/chunk-UFIZRMQZ.js.map +0 -1
  282. package/dist/chunk-XCB6QDL6.js.map +0 -1
  283. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  284. /package/dist/{chunk-IOYY6ROU.js.map → chunk-2MMBJE53.js.map} +0 -0
  285. /package/dist/{chunk-QSXEQPC4.js.map → chunk-2OFDC3AK.js.map} +0 -0
  286. /package/dist/{chunk-4MP2Q2EI.js.map → chunk-2TCNEJ36.js.map} +0 -0
  287. /package/dist/{chunk-5FAGCOZD.js.map → chunk-2U3R3DDH.js.map} +0 -0
  288. /package/dist/{chunk-SCXURCVT.js.map → chunk-2UPTRDGM.js.map} +0 -0
  289. /package/dist/{chunk-XVZA6VXC.js.map → chunk-3SL52JKD.js.map} +0 -0
  290. /package/dist/{chunk-DSPWVQZ6.js.map → chunk-73R4HOOK.js.map} +0 -0
  291. /package/dist/{chunk-PHBH74Q6.js.map → chunk-7NBUE5VY.js.map} +0 -0
  292. /package/dist/{chunk-S533KGX6.js.map → chunk-7X7A7KVN.js.map} +0 -0
  293. /package/dist/{chunk-XEATJBNB.js.map → chunk-7YQR6XHY.js.map} +0 -0
  294. /package/dist/{chunk-533RHNHB.js.map → chunk-ATFFWIKL.js.map} +0 -0
  295. /package/dist/{chunk-QCYUIZK2.js.map → chunk-AU43D3IT.js.map} +0 -0
  296. /package/dist/{chunk-JZ66PN72.js.map → chunk-AWSP3WNM.js.map} +0 -0
  297. /package/dist/{chunk-IY47KPML.js.map → chunk-B3OFQP5Y.js.map} +0 -0
  298. /package/dist/{chunk-4DXNOVNW.js.map → chunk-B454SHPU.js.map} +0 -0
  299. /package/dist/{chunk-3LMOJXZR.js.map → chunk-BKVCTTEN.js.map} +0 -0
  300. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  301. /package/dist/{chunk-CZN53OT5.js.map → chunk-CGBE3N7T.js.map} +0 -0
  302. /package/dist/{chunk-HWLIMQE2.js.map → chunk-CHDGJJV6.js.map} +0 -0
  303. /package/dist/{chunk-UYPQOASU.js.map → chunk-CNBGAFDY.js.map} +0 -0
  304. /package/dist/{chunk-JTC3PBNH.js.map → chunk-DB6XFMOF.js.map} +0 -0
  305. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  306. /package/dist/{chunk-4OXXDL3X.js.map → chunk-EWWK65CI.js.map} +0 -0
  307. /package/dist/{chunk-DFPG47ET.js.map → chunk-EZ3F4YIN.js.map} +0 -0
  308. /package/dist/{chunk-V3I4NLZP.js.map → chunk-FYX2LXIX.js.map} +0 -0
  309. /package/dist/{chunk-PNVOKGAX.js.map → chunk-G5I5ZT6O.js.map} +0 -0
  310. /package/dist/{chunk-7Z2UKRNJ.js.map → chunk-GQ6ZF4LD.js.map} +0 -0
  311. /package/dist/{chunk-PEZAHDDU.js.map → chunk-GZ2KV2RO.js.map} +0 -0
  312. /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
  313. /package/dist/{chunk-AXHU56C3.js.map → chunk-HWGFTTPS.js.map} +0 -0
  314. /package/dist/{chunk-2SGLMP2E.js.map → chunk-IDSZNHIP.js.map} +0 -0
  315. /package/dist/{chunk-LO4UKPKX.js.map → chunk-IFCKHPY4.js.map} +0 -0
  316. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-IOMLGJHG.js.map} +0 -0
  317. /package/dist/{chunk-YRULQW5J.js.map → chunk-ISX7GVZE.js.map} +0 -0
  318. /package/dist/{chunk-5PHZSD75.js.map → chunk-J3ZJBX7I.js.map} +0 -0
  319. /package/dist/{chunk-X5TAWDRO.js.map → chunk-JC7QQ2DJ.js.map} +0 -0
  320. /package/dist/{chunk-RFQT7IZO.js.map → chunk-JRDL3FGM.js.map} +0 -0
  321. /package/dist/{chunk-OGZC2WUX.js.map → chunk-JWFTPRYD.js.map} +0 -0
  322. /package/dist/{chunk-7OA4JWP5.js.map → chunk-KFHEZJQZ.js.map} +0 -0
  323. /package/dist/{chunk-P3WRFSYF.js.map → chunk-KMN2JE4D.js.map} +0 -0
  324. /package/dist/{chunk-GNBZB43J.js.map → chunk-KV7LFOPF.js.map} +0 -0
  325. /package/dist/{chunk-L6YCGS7I.js.map → chunk-KYUVFCT2.js.map} +0 -0
  326. /package/dist/{chunk-5BVL2XUD.js.map → chunk-LHDSCWDK.js.map} +0 -0
  327. /package/dist/{chunk-SF7CWSR6.js.map → chunk-LXJZUNLX.js.map} +0 -0
  328. /package/dist/{chunk-DGS34QSY.js.map → chunk-MFZACYZ6.js.map} +0 -0
  329. /package/dist/{chunk-PYYQCHJC.js.map → chunk-MZOQ26LH.js.map} +0 -0
  330. /package/dist/{chunk-R2TVWQLR.js.map → chunk-NT2Q6AHC.js.map} +0 -0
  331. /package/dist/{chunk-ABGM2BN4.js.map → chunk-O43AAJFQ.js.map} +0 -0
  332. /package/dist/{chunk-G3BW6SDE.js.map → chunk-OFGTRDWX.js.map} +0 -0
  333. /package/dist/{chunk-6Z263Z3E.js.map → chunk-OWV6LKNZ.js.map} +0 -0
  334. /package/dist/{chunk-HIHN4XHL.js.map → chunk-PQ7EB5AD.js.map} +0 -0
  335. /package/dist/{chunk-VVYLVE6R.js.map → chunk-PQKZLBCJ.js.map} +0 -0
  336. /package/dist/{chunk-OFFW73OZ.js.map → chunk-PRNR47DI.js.map} +0 -0
  337. /package/dist/{chunk-UL7KDVLC.js.map → chunk-PZ2QQULY.js.map} +0 -0
  338. /package/dist/{chunk-55NZVUNI.js.map → chunk-QAIVTLL2.js.map} +0 -0
  339. /package/dist/{chunk-M7T2NKET.js.map → chunk-QKCGOECM.js.map} +0 -0
  340. /package/dist/{chunk-ARY6O3JN.js.map → chunk-QUNCLKHM.js.map} +0 -0
  341. /package/dist/{chunk-Z3O53WZR.js.map → chunk-QWUJWBZ5.js.map} +0 -0
  342. /package/dist/{chunk-RZXFXKWY.js.map → chunk-QX3K3INR.js.map} +0 -0
  343. /package/dist/{chunk-4LNCLZNK.js.map → chunk-S2GR3T7W.js.map} +0 -0
  344. /package/dist/{chunk-VPOAMPDD.js.map → chunk-SFDBLCZV.js.map} +0 -0
  345. /package/dist/{chunk-2IWBHZ3H.js.map → chunk-SIGDETMB.js.map} +0 -0
  346. /package/dist/{chunk-DBWNTLLI.js.map → chunk-STQC2FYQ.js.map} +0 -0
  347. /package/dist/{chunk-S5R77WHV.js.map → chunk-SWXPR5SE.js.map} +0 -0
  348. /package/dist/{chunk-3DNTFZAT.js.map → chunk-T32YYUT2.js.map} +0 -0
  349. /package/dist/{chunk-W5JQSVPZ.js.map → chunk-T6RQNV7E.js.map} +0 -0
  350. /package/dist/{chunk-O23QMYN4.js.map → chunk-TRN56SPQ.js.map} +0 -0
  351. /package/dist/{chunk-NM3BT2OH.js.map → chunk-TXTRHF3B.js.map} +0 -0
  352. /package/dist/{chunk-7AUIGOH4.js.map → chunk-VDVHIRCK.js.map} +0 -0
  353. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  354. /package/dist/{chunk-ZGYLPCWN.js.map → chunk-VO2BNAA2.js.map} +0 -0
  355. /package/dist/{chunk-WVEECBCG.js.map → chunk-VV2MVHCJ.js.map} +0 -0
  356. /package/dist/{chunk-B3O3IRZN.js.map → chunk-VZBW6CDG.js.map} +0 -0
  357. /package/dist/{chunk-JPKK466T.js.map → chunk-W5XWHTDO.js.map} +0 -0
  358. /package/dist/{chunk-CYG3K2T2.js.map → chunk-WR66CTVU.js.map} +0 -0
  359. /package/dist/{chunk-RP7RSENW.js.map → chunk-XQWKB6PY.js.map} +0 -0
  360. /package/dist/{chunk-64S6X4IU.js.map → chunk-XTN54NML.js.map} +0 -0
  361. /package/dist/{chunk-KYLYXGKD.js.map → chunk-YI6XIFQV.js.map} +0 -0
  362. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  363. /package/dist/{chunk-Y7427SL7.js.map → chunk-Z6EZCN6Z.js.map} +0 -0
  364. /package/dist/{chunk-5K2ALMSZ.js.map → chunk-ZRUC7FD3.js.map} +0 -0
  365. /package/dist/{graph-edge-decay-MKIRZ762.js.map → entity-mention-carry.js.map} +0 -0
  366. /package/dist/{resolution-BROE3TRO.js.map → entity-mention-epoch.js.map} +0 -0
@@ -14,6 +14,7 @@
14
14
  * caching or provider logic (that lives in `embedding-fallback.ts`).
15
15
  */
16
16
  import path from "node:path";
17
+ import { randomUUID } from "node:crypto";
17
18
  import { constants as bufferConstants } from "node:buffer";
18
19
  import { lstat, mkdir, mkdtemp, realpath, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
19
20
  import { log } from "./logger.js";
@@ -165,6 +166,21 @@ function replacementBackupPath(shardDir: string): string {
165
166
  return path.join(path.dirname(shardDir), "embeddings.pre-replace.tmp");
166
167
  }
167
168
 
169
+ /**
170
+ * Warm-cache generation marker (`<stateDir>/embeddings.generation`).
171
+ * Two-phase publication barrier: in-flight before a publication's first
172
+ * destructive write, fresh unique value after its last write. A stamp is
173
+ * therefore stable only for a completed generation — readers can never
174
+ * cache a stamp that stays stable while generation bytes change, and an
175
+ * in-flight stamp never repeats, so probes cached during a failed
176
+ * completion keep revalidating (PR #3176 codex P2). Plain fs like the
177
+ * status file.
178
+ */
179
+ const GENERATION_MARKER_BASENAME = "embeddings.generation";
180
+
181
+ /** Reserved in-flight marker value; never equals a completion marker. */
182
+ const GENERATION_MARKER_IN_FLIGHT = "in-flight";
183
+
168
184
  /**
169
185
  * Stable FNV-1a shard assignment: an entry always hashes to the same shard,
170
186
  * so an update or removal never needs a manifest to find its file.
@@ -469,7 +485,9 @@ export class EmbeddingIndexFileStore {
469
485
  * the published position after an interrupted replacement. Returns true
470
486
  * when a rollback happened. Only fires in the actual rename gap
471
487
  * (published directory absent); callers must invalidate any cached index
472
- * view when this returns true.
488
+ * view when this returns true. A successful rollback finalizes the
489
+ * generation marker strictly: a failed completion write fails the
490
+ * recovery instead of leaving every search reloading forever.
473
491
  */
474
492
  async recoverIfInterrupted(fence?: EmbeddingGenerationFence): Promise<boolean> {
475
493
  // Only the rename gap (published directory absent) is recoverable. When
@@ -492,6 +510,7 @@ export class EmbeddingIndexFileStore {
492
510
  // The rollback rename is destructive: reassert lock ownership first.
493
511
  await fence?.();
494
512
  await rename(backupPath, this.shardDir);
513
+ await this.writeGenerationMarker(randomUUID());
495
514
  log.warn(
496
515
  `embedding index: recovered interrupted replacement; former generation restored from ${backupPath}`,
497
516
  );
@@ -514,6 +533,97 @@ export class EmbeddingIndexFileStore {
514
533
  }
515
534
  }
516
535
 
536
+ /** Barrier first half: strict, so bytes can never change under a stable stamp. */
537
+ private async beginGenerationMarker(): Promise<void> {
538
+ await this.writeGenerationMarker(GENERATION_MARKER_IN_FLIGHT);
539
+ }
540
+
541
+ /**
542
+ * Barrier second half: written after the last content write. Best-effort:
543
+ * a failure leaves the in-flight marker, whose stamp identityStamp()
544
+ * never repeats, so cached probes revalidate on every search until a
545
+ * publication completes.
546
+ */
547
+ private async completeGenerationMarker(): Promise<void> {
548
+ await this.writeGenerationMarker(randomUUID()).catch((err) => {
549
+ log.warn(`embedding index: could not write generation completion marker: ${err instanceof Error ? err.message : String(err)}`);
550
+ });
551
+ }
552
+
553
+ private async writeGenerationMarker(value: string): Promise<void> {
554
+ await this.writeAtomicFile(
555
+ path.join(path.dirname(this.shardDir), GENERATION_MARKER_BASENAME),
556
+ value,
557
+ { bypassSecureIo: true },
558
+ );
559
+ }
560
+
561
+ /** Marker value, or null when absent/unreadable (pre-marker stores keep the stat stamp). */
562
+ private async readGenerationMarker(): Promise<string | null> {
563
+ try {
564
+ const raw = await readFile(
565
+ path.join(path.dirname(this.shardDir), GENERATION_MARKER_BASENAME),
566
+ "utf-8",
567
+ );
568
+ const value = raw.trim();
569
+ return value.length > 0 ? value : null;
570
+ } catch {
571
+ return null;
572
+ }
573
+ }
574
+
575
+ /**
576
+ * Warm-cache stamp. A completed generation marker alone would freeze the
577
+ * stamp for a pre-marker writer in a rolling deployment (it publishes
578
+ * shard/index changes without updating the marker), so the marker is
579
+ * combined with the watched path's stat: the marker keeps consecutive
580
+ * publications distinct on coarse-tick filesystems, the stat keeps
581
+ * legacy writers visible. In-flight never repeats, forcing revalidation
582
+ * until a publication completes. Stores never published through this
583
+ * module keep the plain stat stamp — a directory stat alone aliases
584
+ * consecutive publications on coarse-tick filesystems and across inode
585
+ * reuse.
586
+ */
587
+ async identityStamp(): Promise<string> {
588
+ const layout = await this.detectLayout();
589
+ if (layout === "sharded") {
590
+ const info = await lstat(this.shardDir).catch((err) => {
591
+ // SAFETY: only the errno code is inspected; any other rejection shape rethrows uninterpreted.
592
+ if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
593
+ throw new EmbeddingIndexStorageError(
594
+ `cannot stat embedding index shard directory ${this.shardDir}: ${err instanceof Error ? err.message : String(err)}`,
595
+ );
596
+ });
597
+ if (!info) return "rename-gap";
598
+ const marker = await this.readGenerationMarker();
599
+ // An in-flight marker must never produce a repeatable stamp: a probe
600
+ // that cached one (completion write failed) must revalidate on every
601
+ // later probe until a publication completes.
602
+ if (marker) {
603
+ if (marker === GENERATION_MARKER_IN_FLIGHT) return `gen:${randomUUID()}`;
604
+ return `gen:${marker}:${info.ino}:${info.mtimeMs}`;
605
+ }
606
+ return `shard:${info.ino}:${info.mtimeMs}`;
607
+ }
608
+ if (layout === "legacy") {
609
+ const info = await stat(this.indexPath).catch((err) => {
610
+ // SAFETY: only the errno code is inspected; any other rejection shape rethrows uninterpreted.
611
+ if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
612
+ throw new EmbeddingIndexStorageError(
613
+ `cannot stat embedding index file ${this.indexPath}: ${err instanceof Error ? err.message : String(err)}`,
614
+ );
615
+ });
616
+ if (!info) return "rename-gap";
617
+ const marker = await this.readGenerationMarker();
618
+ if (marker) {
619
+ if (marker === GENERATION_MARKER_IN_FLIGHT) return `gen:${randomUUID()}`;
620
+ return `gen:${marker}:${info.ino}:${info.mtimeMs}`;
621
+ }
622
+ return `legacy:${info.ino}:${info.mtimeMs}`;
623
+ }
624
+ return "empty";
625
+ }
626
+
517
627
  /** Header identity of the authoritative generation, read leniently. */
518
628
  async identityFromDisk(): Promise<EmbeddingIndexIdentity | null> {
519
629
  const layout = await this.detectLayout();
@@ -751,6 +861,8 @@ export class EmbeddingIndexFileStore {
751
861
  // Serialization is done: reassert lock ownership immediately before
752
862
  // the destructive live-generation writes.
753
863
  await opts.fence?.();
864
+ await this.beginGenerationMarker();
865
+ await opts.fence?.();
754
866
  for (const payload of payloads) {
755
867
  await this.writeAtomicFile(
756
868
  path.join(this.shardDir, shardFileName(payload.shardIndex)),
@@ -764,6 +876,7 @@ export class EmbeddingIndexFileStore {
764
876
  await rm(path.join(this.shardDir, shardFileName(shardIndex)), { force: true });
765
877
  }
766
878
  }
879
+ await this.completeGenerationMarker();
767
880
  return;
768
881
  }
769
882
 
@@ -779,7 +892,10 @@ export class EmbeddingIndexFileStore {
779
892
  // Serialized above: reassert lock ownership immediately before the
780
893
  // destructive atomic write.
781
894
  await opts.fence?.();
895
+ await this.beginGenerationMarker();
896
+ await opts.fence?.();
782
897
  await this.writeAtomicFile(this.indexPath, whole);
898
+ await this.completeGenerationMarker();
783
899
  return;
784
900
  }
785
901
 
@@ -920,6 +1036,9 @@ export class EmbeddingIndexFileStore {
920
1036
  // delay between the cleanup and the rename still allows a stale-break,
921
1037
  // and publishing now would clobber the peer's write.
922
1038
  await fence?.();
1039
+ // Publication barrier: in-flight before the renames, final at commit.
1040
+ await this.beginGenerationMarker();
1041
+ await fence?.();
923
1042
  let demoted = false;
924
1043
  try {
925
1044
  await stat(this.shardDir);
@@ -931,9 +1050,19 @@ export class EmbeddingIndexFileStore {
931
1050
  try {
932
1051
  await rename(stagingDir, this.shardDir);
933
1052
  } catch (err) {
934
- if (demoted) await rename(backupPath, this.shardDir).catch(() => undefined);
1053
+ if (demoted) {
1054
+ try {
1055
+ await rename(backupPath, this.shardDir);
1056
+ await this.completeGenerationMarker();
1057
+ } catch (rollbackErr) {
1058
+ log.warn(`embedding index: publication rollback did not restore the generation; marker stays in-flight: ${rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr)}`);
1059
+ }
1060
+ } else {
1061
+ await this.completeGenerationMarker();
1062
+ }
935
1063
  throw err;
936
1064
  }
1065
+ await this.completeGenerationMarker();
937
1066
  await rm(backupPath, { recursive: true, force: true }).catch((err) => {
938
1067
  log.warn(`embedding index: could not remove replacement backup ${backupPath}: ${err}`);
939
1068
  });
@@ -0,0 +1,31 @@
1
+ export type CarriedMemorySnippet = {
2
+ memorySnippets: string[];
3
+ memorySnippetOrigins?: Array<string | undefined>;
4
+ };
5
+
6
+ /**
7
+ * Copy snippets from the previous index onto entities that already existed.
8
+ * A canonical id with nothing to copy was created after that index, so any
9
+ * memory that already pointed at it was skipped. The caller schedules one
10
+ * full reconcile for that case.
11
+ */
12
+ export function applyCarriedMemorySnippets(
13
+ entities: Iterable<{
14
+ canonicalId: string;
15
+ memorySnippets: string[];
16
+ memorySnippetOrigins?: Array<string | undefined>;
17
+ }>,
18
+ carried: ReadonlyMap<string, CarriedMemorySnippet>,
19
+ ): boolean {
20
+ let missing = false;
21
+ for (const entry of entities) {
22
+ const previous = carried.get(entry.canonicalId);
23
+ if (!previous) {
24
+ missing = true;
25
+ continue;
26
+ }
27
+ entry.memorySnippets = previous.memorySnippets.slice();
28
+ if (previous.memorySnippetOrigins) entry.memorySnippetOrigins = previous.memorySnippetOrigins.slice();
29
+ }
30
+ return missing;
31
+ }
@@ -0,0 +1,120 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { appendFileSync, mkdirSync, statSync } from "node:fs";
3
+ import path from "node:path";
4
+
5
+ /**
6
+ * Entity-mention freshness, separate from the hot-memories corpus sentinel.
7
+ *
8
+ * Every memory write bumps the corpus version so the hot cache stays coherent.
9
+ * The entity mention index does not depend on heat, decay, lifecycle, or
10
+ * lastValidatedAt, so those rewrites must not force a fact-file rescan.
11
+ * Content, entityRef, and origin changes bump this epoch. Metadata-only
12
+ * frontmatter rewrites run inside `hold()` and leave it alone.
13
+ *
14
+ * The on-disk sentinel is the byte size of `state/.entity-mention-epoch.log`
15
+ * (same pattern as the other version logs). A failed append adds one to an
16
+ * in-process extra, and `current` is the file size plus that extra. A later
17
+ * successful append, including one from another process, grows the file and
18
+ * moves `current` past those failed bumps. `reset` drops caches that
19
+ * registered at load (the mention index).
20
+ */
21
+ const fallbackByDir = new Map<string, { extra: number; disk: number }>();
22
+ const suppression = new AsyncLocalStorage<true>();
23
+ let onReset: (() => void) | null = null;
24
+
25
+ type MentionFrontmatter = {
26
+ entityRef?: unknown;
27
+ origin?: unknown;
28
+ };
29
+
30
+ function epochFile(dir: string): string {
31
+ return path.join(path.resolve(dir), "state", ".entity-mention-epoch.log");
32
+ }
33
+
34
+ function mentionField(value: unknown): string | undefined {
35
+ return typeof value === "string" ? value : undefined;
36
+ }
37
+
38
+ function diskSize(filePath: string): number {
39
+ try {
40
+ return statSync(filePath).size;
41
+ } catch {
42
+ return 0;
43
+ }
44
+ }
45
+
46
+ function localEpoch(key: string, disk: number): { extra: number; disk: number } {
47
+ const existing = fallbackByDir.get(key);
48
+ if (existing) return existing;
49
+ const created = { extra: 0, disk };
50
+ fallbackByDir.set(key, created);
51
+ return created;
52
+ }
53
+
54
+ function bump(dir: string): void {
55
+ const key = path.resolve(dir);
56
+ const filePath = epochFile(dir);
57
+ const before = diskSize(filePath);
58
+ let appended = false;
59
+ try {
60
+ mkdirSync(path.dirname(filePath), { recursive: true });
61
+ appendFileSync(filePath, "x");
62
+ appended = true;
63
+ } catch {
64
+ // The file can still be stat-able (read-only, or the disk is full). The
65
+ // in-process counter has to move or this process keeps serving a stale index.
66
+ }
67
+ const after = diskSize(filePath);
68
+ const local = localEpoch(key, before);
69
+ if (!appended || after <= before) local.extra += 1;
70
+ noteDisk(local, after);
71
+ }
72
+
73
+ function noteDisk(local: { extra: number; disk: number }, disk: number): void {
74
+ if (disk < local.disk) local.extra += local.disk - disk;
75
+ local.disk = disk;
76
+ }
77
+
78
+ function current(dir: string): number {
79
+ const key = path.resolve(dir);
80
+ const disk = diskSize(epochFile(dir));
81
+ const local = fallbackByDir.get(key);
82
+ if (!local) return disk;
83
+ noteDisk(local, disk);
84
+ // Failed appends stay ahead of the file. A peer's later successful append
85
+ // grows `disk` and must not land on the same number as those local failures.
86
+ return disk + local.extra;
87
+ }
88
+
89
+ function suppressed(): boolean {
90
+ return suppression.getStore() === true;
91
+ }
92
+
93
+ function hold<T>(fn: () => T): T {
94
+ return suppression.run(true, fn);
95
+ }
96
+
97
+ function registerReset(fn: () => void): void {
98
+ onReset = fn;
99
+ }
100
+
101
+ function reset(): void {
102
+ onReset?.();
103
+ }
104
+
105
+ function neutral(before: MentionFrontmatter, after: MentionFrontmatter): boolean {
106
+ return (
107
+ mentionField(before.entityRef) === mentionField(after.entityRef) &&
108
+ mentionField(before.origin) === mentionField(after.origin)
109
+ );
110
+ }
111
+
112
+ export const entityMentionEpoch = {
113
+ bump,
114
+ current,
115
+ suppressed,
116
+ hold,
117
+ neutral,
118
+ registerReset,
119
+ reset,
120
+ };