@remnic/core 10.0.62 → 10.0.64

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 (331) hide show
  1. package/dist/access-admin-ops-surface.js +46 -46
  2. package/dist/access-authorization-probe.js +47 -47
  3. package/dist/access-boundary.js +46 -46
  4. package/dist/access-cli.js +96 -96
  5. package/dist/access-extraction-force-flush.js +46 -46
  6. package/dist/access-http-briefing.js +47 -47
  7. package/dist/access-http-query.js +48 -48
  8. package/dist/access-http.js +66 -66
  9. package/dist/access-identity-continuity-surface.js +46 -46
  10. package/dist/access-lcm-surface.js +46 -46
  11. package/dist/access-mcp.js +58 -58
  12. package/dist/access-namespace-preflight.js +46 -46
  13. package/dist/access-observe-write-category.js +11 -11
  14. package/dist/access-observe-write-surface.js +46 -46
  15. package/dist/access-offline-manifest.js +10 -10
  16. package/dist/access-operations-batch.js +50 -50
  17. package/dist/access-operations.js +57 -57
  18. package/dist/access-recall-concurrency.js +46 -46
  19. package/dist/access-recall-response.js +46 -46
  20. package/dist/access-recall-surface.js +46 -46
  21. package/dist/access-schema.js +6 -6
  22. package/dist/access-service.js +46 -46
  23. package/dist/access-surface-catalog.js +48 -48
  24. package/dist/active-recall.js +21 -21
  25. package/dist/{auto-sync-UQQ6YJSB.js → auto-sync-ANOJDQD4.js} +7 -7
  26. package/dist/briefing.js +14 -14
  27. package/dist/buffer.d.ts +1 -1
  28. package/dist/buffer.d.ts.map +1 -1
  29. package/dist/buffer.js +7 -7
  30. package/dist/{capsule-merge-D4BTIJGK.js → capsule-merge-XVTQJJ6R.js} +4 -4
  31. package/dist/capture-write-lock.js +2 -2
  32. package/dist/causal-behavior.js +2 -2
  33. package/dist/causal-chain.js +2 -2
  34. package/dist/causal-consolidation.js +17 -17
  35. package/dist/causal-retrieval.js +2 -2
  36. package/dist/causal-trajectory-graph.js +3 -3
  37. package/dist/causal-trajectory.js +1 -1
  38. package/dist/{chunk-S4OZKPBS.js → chunk-2D7BTSDW.js} +2 -2
  39. package/dist/{chunk-WB3OFPM2.js → chunk-2DNFRLLL.js} +3 -3
  40. package/dist/{chunk-EKPRLTAE.js → chunk-2RUTN7PR.js} +2 -2
  41. package/dist/{chunk-6EZPYZT3.js → chunk-2ZSRACNK.js} +42 -42
  42. package/dist/{chunk-X4PAATLA.js → chunk-3LBDEGQA.js} +4 -4
  43. package/dist/{chunk-GDCKOER4.js → chunk-3LSTL6EY.js} +9 -18
  44. package/dist/chunk-3LSTL6EY.js.map +1 -0
  45. package/dist/{chunk-QCAJMIAE.js → chunk-434E4BTO.js} +3 -3
  46. package/dist/{chunk-TPKB7T6Z.js → chunk-4XINO77L.js} +2 -2
  47. package/dist/{chunk-EADUOZWH.js → chunk-5JABRT5G.js} +5 -5
  48. package/dist/{chunk-6I6DFULH.js → chunk-5KDDAQ6K.js} +2 -2
  49. package/dist/{chunk-YDIOMDBW.js → chunk-5QV6CE6K.js} +3 -3
  50. package/dist/{chunk-QI7LLSWX.js → chunk-5UEGL5BF.js} +3 -3
  51. package/dist/{chunk-TMWSCE2L.js → chunk-5ZHFPUBC.js} +11 -11
  52. package/dist/{chunk-TUCEP2LS.js → chunk-63A2BU2B.js} +2 -2
  53. package/dist/{chunk-264B57GV.js → chunk-6D3IWYNY.js} +71 -88
  54. package/dist/chunk-6D3IWYNY.js.map +1 -0
  55. package/dist/{chunk-HJ3UTGIW.js → chunk-6P7U3HWG.js} +4 -4
  56. package/dist/{chunk-UEDC2VGP.js → chunk-7JYK7NNY.js} +2 -2
  57. package/dist/{chunk-IWAB7JVH.js → chunk-7ZTGMEXF.js} +2 -2
  58. package/dist/{chunk-QYAXMXOB.js → chunk-A7BM2JTH.js} +2 -2
  59. package/dist/{chunk-HSHLDSPX.js → chunk-AUFPPBC3.js} +3 -3
  60. package/dist/{chunk-QJ6IR35B.js → chunk-B7VD36TI.js} +4 -4
  61. package/dist/{chunk-ECT5ME6X.js → chunk-BBHKN2CN.js} +2 -2
  62. package/dist/{chunk-WA6XRNWE.js → chunk-BH7NVSEC.js} +4 -4
  63. package/dist/{chunk-QIMGULGN.js → chunk-BNZAR6PO.js} +2 -2
  64. package/dist/{chunk-C5OW2FFB.js → chunk-BOZQAUAJ.js} +2 -2
  65. package/dist/{chunk-WJCXUE2J.js → chunk-BV2BRHD4.js} +5 -5
  66. package/dist/{chunk-Z2T5BPOZ.js → chunk-CIEEYVUB.js} +2 -2
  67. package/dist/{chunk-PA6ZNFB7.js → chunk-CLSKGTAT.js} +2 -2
  68. package/dist/{chunk-YRL4PGPP.js → chunk-DRTSPRWL.js} +2 -2
  69. package/dist/{chunk-ZRSXXWIX.js → chunk-E4QIX2OB.js} +3 -3
  70. package/dist/{chunk-EBRG7ZIK.js → chunk-EBV6VXKF.js} +24 -2
  71. package/dist/{chunk-EBRG7ZIK.js.map → chunk-EBV6VXKF.js.map} +1 -1
  72. package/dist/{chunk-X2ZLHUEO.js → chunk-ECF627KC.js} +2 -2
  73. package/dist/{chunk-XICJL56Z.js → chunk-EI6M5NVK.js} +2 -2
  74. package/dist/{chunk-564YP3DW.js → chunk-ER7XANP3.js} +3 -3
  75. package/dist/{chunk-ILMB3X4X.js → chunk-FKGLJJVS.js} +3 -3
  76. package/dist/{chunk-L74VVEJA.js → chunk-FR7PK7ED.js} +3 -3
  77. package/dist/{chunk-UXRCORZX.js → chunk-FUDKGJDN.js} +2 -2
  78. package/dist/{chunk-GNEB3WXR.js → chunk-G6L3REL3.js} +2 -2
  79. package/dist/{chunk-4P4VLPGB.js → chunk-GKL6QYZO.js} +1 -1
  80. package/dist/{chunk-IMNJJKHW.js → chunk-GRAUQXQB.js} +28 -28
  81. package/dist/{chunk-JVFYP2LD.js → chunk-GROHOWR5.js} +2 -2
  82. package/dist/{chunk-LIUI46BX.js → chunk-H6VJSITJ.js} +2 -2
  83. package/dist/{chunk-YGM47S7M.js → chunk-HFEGRMFG.js} +8 -8
  84. package/dist/{chunk-A6JV3WHI.js → chunk-HG3CG557.js} +2 -2
  85. package/dist/{chunk-7JFXXA57.js → chunk-HHL4MX3W.js} +2 -2
  86. package/dist/{chunk-53OWLEAD.js → chunk-HNOSWPKG.js} +2 -2
  87. package/dist/{chunk-IJKBIOWL.js → chunk-HOR4RMUM.js} +25 -25
  88. package/dist/{chunk-WZEDFDJ6.js → chunk-HRRAOTOQ.js} +15 -15
  89. package/dist/{chunk-A5L5KGDI.js → chunk-IAYUTGF2.js} +2 -2
  90. package/dist/{chunk-WVEEVYMH.js → chunk-IGOW4TJE.js} +3 -3
  91. package/dist/{chunk-MKE5DP3S.js → chunk-IHCXMYSE.js} +2 -2
  92. package/dist/{chunk-SDXBR5QO.js → chunk-IZJQNDGI.js} +2 -2
  93. package/dist/{chunk-BQOOUKEN.js → chunk-JL5HXL25.js} +6 -6
  94. package/dist/{chunk-ZFU2B2GM.js → chunk-JPY3RMG2.js} +5 -5
  95. package/dist/{chunk-TWRPWJJT.js → chunk-JRVMCZE3.js} +2 -2
  96. package/dist/{chunk-FYPKSR6Z.js → chunk-KISOMGY2.js} +2 -2
  97. package/dist/{chunk-J62O2UW5.js → chunk-KNMSD2MQ.js} +2 -2
  98. package/dist/{chunk-MTVC5S5N.js → chunk-KO224R36.js} +2 -2
  99. package/dist/{chunk-UFQB5VQ5.js → chunk-KQJUEQ2E.js} +7 -7
  100. package/dist/{chunk-QNIYL5SK.js → chunk-KQLBXUUQ.js} +2 -2
  101. package/dist/{chunk-W5EO4USJ.js → chunk-KQUSP6LB.js} +2 -2
  102. package/dist/{chunk-BDNPW3KM.js → chunk-KYSSUY66.js} +4 -4
  103. package/dist/{chunk-R25JMO5O.js → chunk-LDHR465K.js} +2 -2
  104. package/dist/{chunk-CYEEVWQ6.js → chunk-LIGZO7XN.js} +2 -2
  105. package/dist/{chunk-QKXPOLQD.js → chunk-M4IEZGCK.js} +2 -2
  106. package/dist/{chunk-Q3DAWUAV.js → chunk-MRF5V5CD.js} +2 -2
  107. package/dist/{chunk-HTTZ3GJ6.js → chunk-MUHGYV2V.js} +2 -2
  108. package/dist/{chunk-HNZH57JK.js → chunk-N4T5FW6U.js} +2 -2
  109. package/dist/{chunk-YLB7TW2B.js → chunk-NM2II57L.js} +4 -4
  110. package/dist/{chunk-3VNRDRBM.js → chunk-OVL5AD3N.js} +2 -2
  111. package/dist/{chunk-3HLWLYRD.js → chunk-P2EM5LKH.js} +2 -2
  112. package/dist/{chunk-XL2EE5W3.js → chunk-PLCYKAWH.js} +2 -2
  113. package/dist/{chunk-JIYJIH5N.js → chunk-QDZWQBLU.js} +3 -3
  114. package/dist/{chunk-YXW4KXCV.js → chunk-QGJSBU4R.js} +2 -2
  115. package/dist/{chunk-DM5QZ3YU.js → chunk-QGVCFVX6.js} +2 -2
  116. package/dist/{chunk-VSHWPOUB.js → chunk-RJWL3RHB.js} +2 -2
  117. package/dist/{chunk-WU5WTCH5.js → chunk-RZH5RVJC.js} +3 -3
  118. package/dist/{chunk-76LKZ42K.js → chunk-SHHZWSSE.js} +2 -2
  119. package/dist/{chunk-N7CATBYH.js → chunk-SNS3DWG6.js} +2 -2
  120. package/dist/{chunk-IVJI5FDA.js → chunk-T22FBDG3.js} +2 -2
  121. package/dist/{chunk-YH7HJNWV.js → chunk-TGQW3AMK.js} +4 -4
  122. package/dist/{chunk-KQXRVELF.js → chunk-TIGYOZBU.js} +2 -2
  123. package/dist/{chunk-Z45353ML.js → chunk-UH6ROXFJ.js} +2 -2
  124. package/dist/{chunk-C2AYUXEF.js → chunk-UYUFDTIX.js} +2 -2
  125. package/dist/{chunk-2AKIVSHP.js → chunk-W26D2USW.js} +2 -2
  126. package/dist/{chunk-FZVZYU5C.js → chunk-W7K5BP3M.js} +3 -3
  127. package/dist/{chunk-ZARHK7PT.js → chunk-WWH7GJ42.js} +2 -2
  128. package/dist/{chunk-4NLHEE2Z.js → chunk-XLCEFUAU.js} +2 -2
  129. package/dist/{chunk-PWEIZCPS.js → chunk-XOFIJGB2.js} +2 -2
  130. package/dist/{chunk-6VBKU3FY.js → chunk-XVQVF2TK.js} +18 -12
  131. package/dist/chunk-XVQVF2TK.js.map +1 -0
  132. package/dist/{chunk-TRSKATZQ.js → chunk-XZ66U5M3.js} +2 -2
  133. package/dist/{chunk-UUZ7KZAO.js → chunk-Y33KJ556.js} +2 -2
  134. package/dist/{chunk-BU4W2ISH.js → chunk-YJQJRXUI.js} +2 -2
  135. package/dist/{chunk-QBK3IM6W.js → chunk-YSATDEBY.js} +2 -2
  136. package/dist/{chunk-WR5POHQ3.js → chunk-YUTT4ZTI.js} +2 -2
  137. package/dist/{chunk-JCL7RO2G.js → chunk-ZOBYTRBU.js} +2 -2
  138. package/dist/{chunk-FMOUUWQN.js → chunk-ZPLQ27MY.js} +3 -3
  139. package/dist/cli.js +81 -81
  140. package/dist/coding/export-okf-codegraph.js +14 -14
  141. package/dist/coding/pre-action-gate.js +2 -2
  142. package/dist/compounding/engine.js +16 -16
  143. package/dist/config.js +21 -21
  144. package/dist/connectors/codex-materialize-runner.js +14 -14
  145. package/dist/connectors/index.js +14 -14
  146. package/dist/consolidation-provenance-check.js +4 -4
  147. package/dist/consolidation-undo.js +3 -3
  148. package/dist/contradiction/index.js +5 -5
  149. package/dist/convergence-refresh.js +16 -16
  150. package/dist/corpus-watermark.js +16 -16
  151. package/dist/deep-recall-http-glue.js +7 -7
  152. package/dist/embedding-fallback.js +3 -3
  153. package/dist/embedding-generation-lock.js +2 -2
  154. package/dist/{entity-canonical-id-migration-CUDCKWPF.js → entity-canonical-id-migration-JJSTZF73.js} +4 -4
  155. package/dist/entity-retrieval.js +14 -14
  156. package/dist/explicit-capture.js +8 -8
  157. package/dist/external-wiki-access.js +47 -47
  158. package/dist/extraction.js +18 -18
  159. package/dist/{forget-E6ZTUKEC.js → forget-DE56ICCL.js} +3 -3
  160. package/dist/{graph-edge-decay-2BZTY2IM.js → graph-edge-decay-OEX5OGMI.js} +6 -6
  161. package/dist/graph-jsonl.js +4 -4
  162. package/dist/graph-snapshot.js +4 -4
  163. package/dist/graph-write-lock.js +2 -2
  164. package/dist/graph.js +3 -3
  165. package/dist/harmonic-retrieval.js +14 -14
  166. package/dist/index.js +96 -96
  167. package/dist/location/index.js +17 -17
  168. package/dist/maintenance/memory-governance.js +14 -14
  169. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  170. package/dist/maintenance/rebuild-memory-projection-runner.js +16 -16
  171. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  172. package/dist/memory-browse-operations.js +47 -47
  173. package/dist/memory-subject.js +3 -3
  174. package/dist/namespaces/migrate.js +15 -15
  175. package/dist/namespaces/storage.js +14 -14
  176. package/dist/offline-sync-changeset-generations.js +4 -4
  177. package/dist/offline-sync-embedding-generation.js +3 -3
  178. package/dist/offline-sync-impression-drain.js +3 -3
  179. package/dist/offline-sync-snapshot-stream.js +6 -6
  180. package/dist/offline-sync.js +5 -5
  181. package/dist/operator-doctor-corpus.js +17 -17
  182. package/dist/operator-toolkit.js +33 -33
  183. package/dist/orchestration/buffer-drain-runner.js +96 -96
  184. package/dist/orchestration/extraction-run-helpers.d.ts +0 -3
  185. package/dist/orchestration/extraction-run-helpers.d.ts.map +1 -1
  186. package/dist/orchestration/extraction-run.d.ts +4 -2
  187. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  188. package/dist/orchestration/maintenance.js +26 -26
  189. package/dist/orchestrator.js +96 -96
  190. package/dist/page-versioning.js +3 -3
  191. package/dist/recall-navigation-operations.js +47 -47
  192. package/dist/recall-navigation.js +46 -46
  193. package/dist/recall-state.js +2 -2
  194. package/dist/reconcile/manifest.js +3 -3
  195. package/dist/{resolution-NNYG37YB.js → resolution-BNWE5Y25.js} +6 -6
  196. package/dist/resume-bundles.js +22 -22
  197. package/dist/salvage-envelope.js +5 -5
  198. package/dist/semantic-consolidation.js +15 -15
  199. package/dist/semantic-rule-promotion.js +14 -14
  200. package/dist/semantic-rule-verifier.js +14 -14
  201. package/dist/source-agent-qualifier.js +17 -17
  202. package/dist/standup/build.js +14 -14
  203. package/dist/storage/buffer-drain-claims.js +2 -2
  204. package/dist/storage/buffer-session-files.js +2 -2
  205. package/dist/storage.d.ts +1 -0
  206. package/dist/storage.d.ts.map +1 -1
  207. package/dist/storage.js +13 -13
  208. package/dist/subject-config.js +4 -4
  209. package/dist/summarizer.js +3 -3
  210. package/dist/summary-snapshot.js +2 -2
  211. package/dist/support-passport/index.js +49 -49
  212. package/dist/transfer/capsule-import.js +4 -4
  213. package/dist/transfer/export-okf.js +14 -14
  214. package/dist/utils/serialize-mutations.d.ts +13 -0
  215. package/dist/utils/serialize-mutations.d.ts.map +1 -1
  216. package/dist/utils/serialize-mutations.js +3 -1
  217. package/dist/verified-recall.js +14 -14
  218. package/dist/who-knows-cli.js +15 -15
  219. package/dist/who-knows.js +14 -14
  220. package/dist/write-envelope.js +4 -4
  221. package/package.json +2 -2
  222. package/src/buffer-incremental-persistence.test.ts +42 -0
  223. package/src/buffer.ts +7 -23
  224. package/src/orchestration/extraction-run-helpers.ts +33 -52
  225. package/src/orchestration/extraction-run.ts +54 -54
  226. package/src/orchestrator-flush.test.ts +103 -79
  227. package/src/storage-update-meta.test.ts +114 -0
  228. package/src/storage.ts +7 -6
  229. package/src/utils/serialize-mutations.ts +53 -0
  230. package/dist/chunk-264B57GV.js.map +0 -1
  231. package/dist/chunk-6VBKU3FY.js.map +0 -1
  232. package/dist/chunk-GDCKOER4.js.map +0 -1
  233. /package/dist/{auto-sync-UQQ6YJSB.js.map → auto-sync-ANOJDQD4.js.map} +0 -0
  234. /package/dist/{capsule-merge-D4BTIJGK.js.map → capsule-merge-XVTQJJ6R.js.map} +0 -0
  235. /package/dist/{chunk-S4OZKPBS.js.map → chunk-2D7BTSDW.js.map} +0 -0
  236. /package/dist/{chunk-WB3OFPM2.js.map → chunk-2DNFRLLL.js.map} +0 -0
  237. /package/dist/{chunk-EKPRLTAE.js.map → chunk-2RUTN7PR.js.map} +0 -0
  238. /package/dist/{chunk-6EZPYZT3.js.map → chunk-2ZSRACNK.js.map} +0 -0
  239. /package/dist/{chunk-X4PAATLA.js.map → chunk-3LBDEGQA.js.map} +0 -0
  240. /package/dist/{chunk-QCAJMIAE.js.map → chunk-434E4BTO.js.map} +0 -0
  241. /package/dist/{chunk-TPKB7T6Z.js.map → chunk-4XINO77L.js.map} +0 -0
  242. /package/dist/{chunk-EADUOZWH.js.map → chunk-5JABRT5G.js.map} +0 -0
  243. /package/dist/{chunk-6I6DFULH.js.map → chunk-5KDDAQ6K.js.map} +0 -0
  244. /package/dist/{chunk-YDIOMDBW.js.map → chunk-5QV6CE6K.js.map} +0 -0
  245. /package/dist/{chunk-QI7LLSWX.js.map → chunk-5UEGL5BF.js.map} +0 -0
  246. /package/dist/{chunk-TMWSCE2L.js.map → chunk-5ZHFPUBC.js.map} +0 -0
  247. /package/dist/{chunk-TUCEP2LS.js.map → chunk-63A2BU2B.js.map} +0 -0
  248. /package/dist/{chunk-HJ3UTGIW.js.map → chunk-6P7U3HWG.js.map} +0 -0
  249. /package/dist/{chunk-UEDC2VGP.js.map → chunk-7JYK7NNY.js.map} +0 -0
  250. /package/dist/{chunk-IWAB7JVH.js.map → chunk-7ZTGMEXF.js.map} +0 -0
  251. /package/dist/{chunk-QYAXMXOB.js.map → chunk-A7BM2JTH.js.map} +0 -0
  252. /package/dist/{chunk-HSHLDSPX.js.map → chunk-AUFPPBC3.js.map} +0 -0
  253. /package/dist/{chunk-QJ6IR35B.js.map → chunk-B7VD36TI.js.map} +0 -0
  254. /package/dist/{chunk-ECT5ME6X.js.map → chunk-BBHKN2CN.js.map} +0 -0
  255. /package/dist/{chunk-WA6XRNWE.js.map → chunk-BH7NVSEC.js.map} +0 -0
  256. /package/dist/{chunk-QIMGULGN.js.map → chunk-BNZAR6PO.js.map} +0 -0
  257. /package/dist/{chunk-C5OW2FFB.js.map → chunk-BOZQAUAJ.js.map} +0 -0
  258. /package/dist/{chunk-WJCXUE2J.js.map → chunk-BV2BRHD4.js.map} +0 -0
  259. /package/dist/{chunk-Z2T5BPOZ.js.map → chunk-CIEEYVUB.js.map} +0 -0
  260. /package/dist/{chunk-PA6ZNFB7.js.map → chunk-CLSKGTAT.js.map} +0 -0
  261. /package/dist/{chunk-YRL4PGPP.js.map → chunk-DRTSPRWL.js.map} +0 -0
  262. /package/dist/{chunk-ZRSXXWIX.js.map → chunk-E4QIX2OB.js.map} +0 -0
  263. /package/dist/{chunk-X2ZLHUEO.js.map → chunk-ECF627KC.js.map} +0 -0
  264. /package/dist/{chunk-XICJL56Z.js.map → chunk-EI6M5NVK.js.map} +0 -0
  265. /package/dist/{chunk-564YP3DW.js.map → chunk-ER7XANP3.js.map} +0 -0
  266. /package/dist/{chunk-ILMB3X4X.js.map → chunk-FKGLJJVS.js.map} +0 -0
  267. /package/dist/{chunk-L74VVEJA.js.map → chunk-FR7PK7ED.js.map} +0 -0
  268. /package/dist/{chunk-UXRCORZX.js.map → chunk-FUDKGJDN.js.map} +0 -0
  269. /package/dist/{chunk-GNEB3WXR.js.map → chunk-G6L3REL3.js.map} +0 -0
  270. /package/dist/{chunk-4P4VLPGB.js.map → chunk-GKL6QYZO.js.map} +0 -0
  271. /package/dist/{chunk-IMNJJKHW.js.map → chunk-GRAUQXQB.js.map} +0 -0
  272. /package/dist/{chunk-JVFYP2LD.js.map → chunk-GROHOWR5.js.map} +0 -0
  273. /package/dist/{chunk-LIUI46BX.js.map → chunk-H6VJSITJ.js.map} +0 -0
  274. /package/dist/{chunk-YGM47S7M.js.map → chunk-HFEGRMFG.js.map} +0 -0
  275. /package/dist/{chunk-A6JV3WHI.js.map → chunk-HG3CG557.js.map} +0 -0
  276. /package/dist/{chunk-7JFXXA57.js.map → chunk-HHL4MX3W.js.map} +0 -0
  277. /package/dist/{chunk-53OWLEAD.js.map → chunk-HNOSWPKG.js.map} +0 -0
  278. /package/dist/{chunk-IJKBIOWL.js.map → chunk-HOR4RMUM.js.map} +0 -0
  279. /package/dist/{chunk-WZEDFDJ6.js.map → chunk-HRRAOTOQ.js.map} +0 -0
  280. /package/dist/{chunk-A5L5KGDI.js.map → chunk-IAYUTGF2.js.map} +0 -0
  281. /package/dist/{chunk-WVEEVYMH.js.map → chunk-IGOW4TJE.js.map} +0 -0
  282. /package/dist/{chunk-MKE5DP3S.js.map → chunk-IHCXMYSE.js.map} +0 -0
  283. /package/dist/{chunk-SDXBR5QO.js.map → chunk-IZJQNDGI.js.map} +0 -0
  284. /package/dist/{chunk-BQOOUKEN.js.map → chunk-JL5HXL25.js.map} +0 -0
  285. /package/dist/{chunk-ZFU2B2GM.js.map → chunk-JPY3RMG2.js.map} +0 -0
  286. /package/dist/{chunk-TWRPWJJT.js.map → chunk-JRVMCZE3.js.map} +0 -0
  287. /package/dist/{chunk-FYPKSR6Z.js.map → chunk-KISOMGY2.js.map} +0 -0
  288. /package/dist/{chunk-J62O2UW5.js.map → chunk-KNMSD2MQ.js.map} +0 -0
  289. /package/dist/{chunk-MTVC5S5N.js.map → chunk-KO224R36.js.map} +0 -0
  290. /package/dist/{chunk-UFQB5VQ5.js.map → chunk-KQJUEQ2E.js.map} +0 -0
  291. /package/dist/{chunk-QNIYL5SK.js.map → chunk-KQLBXUUQ.js.map} +0 -0
  292. /package/dist/{chunk-W5EO4USJ.js.map → chunk-KQUSP6LB.js.map} +0 -0
  293. /package/dist/{chunk-BDNPW3KM.js.map → chunk-KYSSUY66.js.map} +0 -0
  294. /package/dist/{chunk-R25JMO5O.js.map → chunk-LDHR465K.js.map} +0 -0
  295. /package/dist/{chunk-CYEEVWQ6.js.map → chunk-LIGZO7XN.js.map} +0 -0
  296. /package/dist/{chunk-QKXPOLQD.js.map → chunk-M4IEZGCK.js.map} +0 -0
  297. /package/dist/{chunk-Q3DAWUAV.js.map → chunk-MRF5V5CD.js.map} +0 -0
  298. /package/dist/{chunk-HTTZ3GJ6.js.map → chunk-MUHGYV2V.js.map} +0 -0
  299. /package/dist/{chunk-HNZH57JK.js.map → chunk-N4T5FW6U.js.map} +0 -0
  300. /package/dist/{chunk-YLB7TW2B.js.map → chunk-NM2II57L.js.map} +0 -0
  301. /package/dist/{chunk-3VNRDRBM.js.map → chunk-OVL5AD3N.js.map} +0 -0
  302. /package/dist/{chunk-3HLWLYRD.js.map → chunk-P2EM5LKH.js.map} +0 -0
  303. /package/dist/{chunk-XL2EE5W3.js.map → chunk-PLCYKAWH.js.map} +0 -0
  304. /package/dist/{chunk-JIYJIH5N.js.map → chunk-QDZWQBLU.js.map} +0 -0
  305. /package/dist/{chunk-YXW4KXCV.js.map → chunk-QGJSBU4R.js.map} +0 -0
  306. /package/dist/{chunk-DM5QZ3YU.js.map → chunk-QGVCFVX6.js.map} +0 -0
  307. /package/dist/{chunk-VSHWPOUB.js.map → chunk-RJWL3RHB.js.map} +0 -0
  308. /package/dist/{chunk-WU5WTCH5.js.map → chunk-RZH5RVJC.js.map} +0 -0
  309. /package/dist/{chunk-76LKZ42K.js.map → chunk-SHHZWSSE.js.map} +0 -0
  310. /package/dist/{chunk-N7CATBYH.js.map → chunk-SNS3DWG6.js.map} +0 -0
  311. /package/dist/{chunk-IVJI5FDA.js.map → chunk-T22FBDG3.js.map} +0 -0
  312. /package/dist/{chunk-YH7HJNWV.js.map → chunk-TGQW3AMK.js.map} +0 -0
  313. /package/dist/{chunk-KQXRVELF.js.map → chunk-TIGYOZBU.js.map} +0 -0
  314. /package/dist/{chunk-Z45353ML.js.map → chunk-UH6ROXFJ.js.map} +0 -0
  315. /package/dist/{chunk-C2AYUXEF.js.map → chunk-UYUFDTIX.js.map} +0 -0
  316. /package/dist/{chunk-2AKIVSHP.js.map → chunk-W26D2USW.js.map} +0 -0
  317. /package/dist/{chunk-FZVZYU5C.js.map → chunk-W7K5BP3M.js.map} +0 -0
  318. /package/dist/{chunk-ZARHK7PT.js.map → chunk-WWH7GJ42.js.map} +0 -0
  319. /package/dist/{chunk-4NLHEE2Z.js.map → chunk-XLCEFUAU.js.map} +0 -0
  320. /package/dist/{chunk-PWEIZCPS.js.map → chunk-XOFIJGB2.js.map} +0 -0
  321. /package/dist/{chunk-TRSKATZQ.js.map → chunk-XZ66U5M3.js.map} +0 -0
  322. /package/dist/{chunk-UUZ7KZAO.js.map → chunk-Y33KJ556.js.map} +0 -0
  323. /package/dist/{chunk-BU4W2ISH.js.map → chunk-YJQJRXUI.js.map} +0 -0
  324. /package/dist/{chunk-QBK3IM6W.js.map → chunk-YSATDEBY.js.map} +0 -0
  325. /package/dist/{chunk-WR5POHQ3.js.map → chunk-YUTT4ZTI.js.map} +0 -0
  326. /package/dist/{chunk-JCL7RO2G.js.map → chunk-ZOBYTRBU.js.map} +0 -0
  327. /package/dist/{chunk-FMOUUWQN.js.map → chunk-ZPLQ27MY.js.map} +0 -0
  328. /package/dist/{entity-canonical-id-migration-CUDCKWPF.js.map → entity-canonical-id-migration-JJSTZF73.js.map} +0 -0
  329. /package/dist/{forget-E6ZTUKEC.js.map → forget-DE56ICCL.js.map} +0 -0
  330. /package/dist/{graph-edge-decay-2BZTY2IM.js.map → graph-edge-decay-OEX5OGMI.js.map} +0 -0
  331. /package/dist/{resolution-NNYG37YB.js.map → resolution-BNWE5Y25.js.map} +0 -0
@@ -20,7 +20,7 @@ import {
20
20
  assertEmbeddingGenerationLockHeld,
21
21
  embeddingGenerationLockPath,
22
22
  withEmbeddingGenerationLock
23
- } from "./chunk-TRSKATZQ.js";
23
+ } from "./chunk-XZ66U5M3.js";
24
24
  import {
25
25
  GENERATION_MARKER_BASENAME,
26
26
  beginGenerationMarker,
@@ -709,4 +709,4 @@ export {
709
709
  divergedEmbeddingGenerationDeferrals,
710
710
  applyIncomingEmbeddingGenerations
711
711
  };
712
- //# sourceMappingURL=chunk-6I6DFULH.js.map
712
+ //# sourceMappingURL=chunk-5KDDAQ6K.js.map
@@ -37,10 +37,10 @@ import {
37
37
  } from "./chunk-YCVB7X56.js";
38
38
  import {
39
39
  fillWearableConversationLocations
40
- } from "./chunk-S4OZKPBS.js";
40
+ } from "./chunk-2D7BTSDW.js";
41
41
  import {
42
42
  composeMemoryEnvelope
43
- } from "./chunk-TWRPWJJT.js";
43
+ } from "./chunk-JRVMCZE3.js";
44
44
  import {
45
45
  log
46
46
  } from "./chunk-3WCASNQZ.js";
@@ -1329,4 +1329,4 @@ export {
1329
1329
  syncWearableSource,
1330
1330
  defaultTimezone
1331
1331
  };
1332
- //# sourceMappingURL=chunk-YDIOMDBW.js.map
1332
+ //# sourceMappingURL=chunk-5QV6CE6K.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  resolveDefaultNamespaceRoot,
3
3
  resolveNamespaceStorageRoot
4
- } from "./chunk-FMOUUWQN.js";
4
+ } from "./chunk-ZPLQ27MY.js";
5
5
  import {
6
6
  MutationSerializer,
7
7
  withHeldFileLock
8
- } from "./chunk-EBRG7ZIK.js";
8
+ } from "./chunk-EBV6VXKF.js";
9
9
  import {
10
10
  isSafeRouteNamespace
11
11
  } from "./chunk-PCXDUHQH.js";
@@ -1596,4 +1596,4 @@ export {
1596
1596
  isNamespaceKind,
1597
1597
  NamespaceCatalog
1598
1598
  };
1599
- //# sourceMappingURL=chunk-QI7LLSWX.js.map
1599
+ //# sourceMappingURL=chunk-5UEGL5BF.js.map
@@ -3,7 +3,7 @@ import {
3
3
  readNamespaceMaintenanceLastRanStatuses,
4
4
  readNamespaceMaintenanceStatuses,
5
5
  runNamespaceMaintenancePlan
6
- } from "./chunk-QCAJMIAE.js";
6
+ } from "./chunk-434E4BTO.js";
7
7
  import {
8
8
  analyzeSessionIntegrity,
9
9
  applySessionRepair,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-CMTINOFS.js";
15
15
  import {
16
16
  summarizeCorpusAndReplica
17
- } from "./chunk-YRL4PGPP.js";
17
+ } from "./chunk-DRTSPRWL.js";
18
18
  import {
19
19
  readJudgeVerdictStats
20
20
  } from "./chunk-OZKOPQCM.js";
@@ -32,32 +32,32 @@ import {
32
32
  } from "./chunk-2DQ2XREU.js";
33
33
  import {
34
34
  runConsolidationProvenanceCheck
35
- } from "./chunk-XL2EE5W3.js";
35
+ } from "./chunk-PLCYKAWH.js";
36
36
  import {
37
37
  reportBufferSurpriseDistribution
38
38
  } from "./chunk-YBPYIAA5.js";
39
39
  import {
40
40
  parseConfig
41
- } from "./chunk-YLB7TW2B.js";
41
+ } from "./chunk-NM2II57L.js";
42
42
  import {
43
43
  readAggregateExtractionWatermark
44
- } from "./chunk-GNEB3WXR.js";
44
+ } from "./chunk-G6L3REL3.js";
45
45
  import {
46
46
  listNamespaces
47
- } from "./chunk-UXRCORZX.js";
47
+ } from "./chunk-FUDKGJDN.js";
48
48
  import {
49
49
  listMemoryGovernanceRuns,
50
50
  readMemoryGovernanceRunArtifact
51
- } from "./chunk-L74VVEJA.js";
51
+ } from "./chunk-FR7PK7ED.js";
52
52
  import {
53
53
  analyzeGraphHealth
54
- } from "./chunk-QKXPOLQD.js";
54
+ } from "./chunk-M4IEZGCK.js";
55
55
  import {
56
56
  summarizeExtractionLiveness
57
57
  } from "./chunk-AWD36R4D.js";
58
58
  import {
59
59
  StorageManager
60
- } from "./chunk-6VBKU3FY.js";
60
+ } from "./chunk-XVQVF2TK.js";
61
61
  import {
62
62
  lintWorkspaceFiles
63
63
  } from "./chunk-DM2T26WE.js";
@@ -1069,7 +1069,7 @@ async function summarizeBufferSurpriseDistribution(storage, config) {
1069
1069
  }
1070
1070
  }
1071
1071
  async function summarizeGraphEdgeDecayStatus(config) {
1072
- const { readGraphEdgeDecayStatus } = await import("./graph-edge-decay-2BZTY2IM.js");
1072
+ const { readGraphEdgeDecayStatus } = await import("./graph-edge-decay-OEX5OGMI.js");
1073
1073
  const { graphEdgeDecayEnabled } = config;
1074
1074
  const enabled = graphEdgeDecayEnabled === true;
1075
1075
  if (!enabled) {
@@ -1683,4 +1683,4 @@ export {
1683
1683
  runBenchmarkRecall,
1684
1684
  runOperatorRepair
1685
1685
  };
1686
- //# sourceMappingURL=chunk-TMWSCE2L.js.map
1686
+ //# sourceMappingURL=chunk-5ZHFPUBC.js.map
@@ -5,7 +5,7 @@ import {
5
5
  embeddingGenerationMembership,
6
6
  embeddingShardDirOf,
7
7
  isEmbeddingGenerationDirPath
8
- } from "./chunk-6I6DFULH.js";
8
+ } from "./chunk-5KDDAQ6K.js";
9
9
  import {
10
10
  resolveSafeArchiveTarget
11
11
  } from "./chunk-GCGJW34D.js";
@@ -369,4 +369,4 @@ export {
369
369
  applyChangesetEmbeddingGenerations,
370
370
  buildChangesetGenerationManifest
371
371
  };
372
- //# sourceMappingURL=chunk-TUCEP2LS.js.map
372
+ //# sourceMappingURL=chunk-63A2BU2B.js.map
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-23G5P7TA.js";
13
13
  import {
14
14
  tagPersistedMemories
15
- } from "./chunk-S4OZKPBS.js";
15
+ } from "./chunk-2D7BTSDW.js";
16
16
  import {
17
17
  resolveScopeProfilePlan
18
18
  } from "./chunk-7EPY3IQL.js";
@@ -151,41 +151,28 @@ async function runExtractionPostPersist(options) {
151
151
  }
152
152
  log.warn(`runExtraction: ${stage} failed after durable persistence; continuing with buffer clear`, error);
153
153
  };
154
- let meta = options.meta;
154
+ const applyPostPersistMetadata = async (fresh) => {
155
+ if (options.extractionFingerprint && options.shouldPersistProcessedFingerprint) {
156
+ try {
157
+ await options.recordProcessedExtractionFingerprint(options.storage, options.extractionFingerprint, fresh);
158
+ } catch (error) {
159
+ metadataFailed = true;
160
+ log.warn("runExtraction: processed fingerprint failed after durable persistence; continuing with buffer clear", error);
161
+ }
162
+ }
163
+ fresh.extractionCount += 1;
164
+ fresh.lastExtractionAt = (/* @__PURE__ */ new Date()).toISOString();
165
+ fresh.totalMemories += Array.isArray(options.result.facts) ? options.result.facts.length : 0;
166
+ fresh.totalEntities += Array.isArray(options.result.entities) ? options.result.entities.length : 0;
167
+ };
155
168
  try {
156
- meta ??= await options.runDeadlineAware(
157
- () => options.storage.loadMeta(),
158
- "during_post_persist_load_meta",
169
+ await options.runDeadlineAware(
170
+ () => options.storage.updateMeta(applyPostPersistMetadata),
171
+ "during_post_persist_meta_save",
159
172
  false
160
173
  );
161
174
  } catch (error) {
162
- recordFailure("metadata load", error);
163
- }
164
- if (meta && options.extractionFingerprint && options.shouldPersistProcessedFingerprint) {
165
- try {
166
- await options.runDeadlineAware(
167
- () => options.recordProcessedExtractionFingerprint(options.storage, options.extractionFingerprint, meta),
168
- "during_post_persist_fingerprint",
169
- false
170
- );
171
- } catch (error) {
172
- recordFailure("processed fingerprint", error);
173
- }
174
- }
175
- if (meta) {
176
- meta.extractionCount += 1;
177
- meta.lastExtractionAt = (/* @__PURE__ */ new Date()).toISOString();
178
- meta.totalMemories += Array.isArray(options.result.facts) ? options.result.facts.length : 0;
179
- meta.totalEntities += Array.isArray(options.result.entities) ? options.result.entities.length : 0;
180
- try {
181
- await options.runDeadlineAware(
182
- () => options.storage.saveMeta(meta),
183
- "during_post_persist_meta_save",
184
- false
185
- );
186
- } catch (error) {
187
- recordFailure("metadata save", error);
188
- }
175
+ recordFailure("metadata save", error);
189
176
  }
190
177
  const runBestEffort = options.runPostPersistBestEffort;
191
178
  await runExtractionDeferRetention(runBestEffort, {
@@ -209,12 +196,11 @@ async function runExtractionPostPersist(options) {
209
196
  throw options.createDeadlineError("during_buffer_clear");
210
197
  }
211
198
  if (deadlineError) throw deadlineError;
212
- return { meta, metadataFailed };
199
+ return { metadataFailed };
213
200
  }
214
201
  async function commitEmptySuccessExtraction(args) {
215
202
  const {
216
203
  storage,
217
- meta: existingMeta,
218
204
  extractionFingerprint,
219
205
  shouldPersistProcessedFingerprint,
220
206
  hasExtractionFailure,
@@ -228,20 +214,16 @@ async function commitEmptySuccessExtraction(args) {
228
214
  if (!shouldRecordFingerprint && !shouldStampLiveness) return;
229
215
  const metadataFailureIsFatal = shouldRecordFingerprint;
230
216
  try {
231
- const meta = existingMeta ?? await runDeadlineAware(
232
- () => storage.loadMeta(),
233
- "during_empty_success_liveness_load",
234
- false
235
- );
236
- if (shouldRecordFingerprint) {
237
- await recordProcessedExtractionFingerprint(storage, extractionFingerprint, meta);
238
- }
239
- if (shouldStampLiveness) {
240
- meta.extractionCount += 1;
241
- meta.lastExtractionAt = (/* @__PURE__ */ new Date()).toISOString();
242
- }
243
217
  await runDeadlineAware(
244
- () => storage.saveMeta(meta),
218
+ () => storage.updateMeta(async (meta) => {
219
+ if (shouldRecordFingerprint) {
220
+ await recordProcessedExtractionFingerprint(storage, extractionFingerprint, meta);
221
+ }
222
+ if (shouldStampLiveness) {
223
+ meta.extractionCount += 1;
224
+ meta.lastExtractionAt = (/* @__PURE__ */ new Date()).toISOString();
225
+ }
226
+ }),
245
227
  "during_empty_success_liveness_save",
246
228
  false
247
229
  );
@@ -481,36 +463,39 @@ ${normalized}`).digest("hex");
481
463
  }
482
464
  }
483
465
  }
484
- /** Record an extraction failure into per-fingerprint backoff state + breaker,
485
- * persisting to namespace meta. Fail-open: never throws upward. */
486
- async recordExtractionFailure(storage, namespace, fingerprint, cls, meta, now) {
466
+ /** Record an extraction failure into per-fingerprint backoff state + breaker, persisting to namespace meta. Fail-open. */
467
+ async recordExtractionFailure(namespace, fingerprint, cls, meta, now) {
487
468
  try {
488
469
  this.hydrateRetryStateFromMeta(namespace, meta);
489
- const nsMap = this.extractionRetryState.get(namespace) ?? /* @__PURE__ */ new Map();
490
- const prev = nsMap.get(fingerprint);
491
- const attempts = (prev?.attempts ?? 0) + 1;
492
- const firstFailedAtMs = prev?.firstFailedAtMs ?? now;
493
- let nextEligibleAtMs;
494
- if (cls === "parse_empty" && attempts > this.config.extractionParseEmptyMaxAttempts) {
495
- nextEligibleAtMs = now + Math.max(0, this.config.extractionRetryMaxBackoffMs);
496
- } else {
497
- nextEligibleAtMs = computeExtractionRetryNextEligibleMs(
498
- attempts,
499
- this.config.extractionRetryScheduleMs,
500
- this.config.extractionRetryMaxBackoffMs,
501
- this.config.extractionRetryJitterRatio,
502
- now
503
- );
504
- }
505
- nsMap.set(fingerprint, { attempts, nextEligibleAtMs, firstFailedAtMs, lastFailureClass: cls });
506
- this.extractionRetryState.set(namespace, nsMap);
507
- this.onProviderFailure(cls, now);
470
+ this.applyExtractionFailureToMemory(namespace, fingerprint, cls, now);
508
471
  this.persistRetryStateToMeta(namespace, meta);
509
- await storage.saveMeta(meta);
510
472
  } catch (err) {
511
473
  log.warn("runExtraction: failed to record extraction retry state (non-fatal)", err);
512
474
  }
513
475
  }
476
+ /** Failure backoff into the in-memory mirror + breaker WITHOUT touching meta — the fallback
477
+ * when the locked meta write cannot run: the retry gate reads this mirror, so it stays shut. */
478
+ applyExtractionFailureToMemory(namespace, fingerprint, cls, now) {
479
+ const nsMap = this.extractionRetryState.get(namespace) ?? /* @__PURE__ */ new Map();
480
+ const prev = nsMap.get(fingerprint);
481
+ const attempts = (prev?.attempts ?? 0) + 1;
482
+ const firstFailedAtMs = prev?.firstFailedAtMs ?? now;
483
+ let nextEligibleAtMs;
484
+ if (cls === "parse_empty" && attempts > this.config.extractionParseEmptyMaxAttempts) {
485
+ nextEligibleAtMs = now + Math.max(0, this.config.extractionRetryMaxBackoffMs);
486
+ } else {
487
+ nextEligibleAtMs = computeExtractionRetryNextEligibleMs(
488
+ attempts,
489
+ this.config.extractionRetryScheduleMs,
490
+ this.config.extractionRetryMaxBackoffMs,
491
+ this.config.extractionRetryJitterRatio,
492
+ now
493
+ );
494
+ }
495
+ nsMap.set(fingerprint, { attempts, nextEligibleAtMs, firstFailedAtMs, lastFailureClass: cls });
496
+ this.extractionRetryState.set(namespace, nsMap);
497
+ this.onProviderFailure(cls, now);
498
+ }
514
499
  /** Delete a fingerprint's retry entry from the mirror + meta. Returns whether
515
500
  * meta changed (so the caller can decide to persist). Does not touch the
516
501
  * breaker — callers pair this with `resetProviderBreakerOnSuccess`. */
@@ -892,16 +877,11 @@ ${normalized}`).digest("hex");
892
877
  let recordedRetryFailure = false;
893
878
  if (extractionFingerprint && extractionRetryEnabled) {
894
879
  if (extractionFailure) {
880
+ const failureClass = result.extractionFailureClass ?? "provider_retryable";
895
881
  try {
896
- meta ??= await runDeadlineAware(() => storage.loadMeta(), "during_retry_bookkeeping_load", false);
897
882
  await runDeadlineAware(
898
- () => this.recordExtractionFailure(
899
- storage,
900
- selfNamespace,
901
- extractionFingerprint,
902
- result.extractionFailureClass ?? "provider_retryable",
903
- meta,
904
- Date.now()
883
+ () => storage.updateMeta(
884
+ (freshMeta) => this.recordExtractionFailure(selfNamespace, extractionFingerprint, failureClass, freshMeta, Date.now())
905
885
  ),
906
886
  "during_retry_bookkeeping_save",
907
887
  false
@@ -909,16 +889,22 @@ ${normalized}`).digest("hex");
909
889
  recordedRetryFailure = true;
910
890
  } catch (err) {
911
891
  if (err instanceof ExtractionDeadlineError) throw err;
912
- log.warn("runExtraction: failed to load meta for retry bookkeeping (non-fatal)", err);
892
+ if (err instanceof Error && err.message.includes("meta.json.lock not acquired"))
893
+ this.applyExtractionFailureToMemory(selfNamespace, extractionFingerprint, failureClass, Date.now());
894
+ recordedRetryFailure = true;
895
+ log.warn("runExtraction: retry state kept in memory; meta persist will catch up", err);
913
896
  }
914
897
  } else if (result.extractionSkippedReason === void 0) {
915
898
  this.resetProviderBreakerOnSuccess();
916
899
  try {
917
- meta ??= await runDeadlineAware(() => storage.loadMeta(), "during_retry_bookkeeping_load", false);
918
- this.hydrateRetryStateFromMeta(selfNamespace, meta);
919
- if (this.clearExtractionRetryEntry(selfNamespace, extractionFingerprint, meta)) {
920
- await runDeadlineAware(() => storage.saveMeta(meta), "during_retry_bookkeeping_save", false);
921
- }
900
+ await runDeadlineAware(
901
+ () => storage.updateMeta((freshMeta) => {
902
+ this.hydrateRetryStateFromMeta(selfNamespace, freshMeta);
903
+ return this.clearExtractionRetryEntry(selfNamespace, extractionFingerprint, freshMeta);
904
+ }),
905
+ "during_retry_bookkeeping_save",
906
+ false
907
+ );
922
908
  } catch (err) {
923
909
  if (err instanceof ExtractionDeadlineError) throw err;
924
910
  log.warn("runExtraction: failed to persist cleared retry state (non-fatal)", err);
@@ -938,7 +924,6 @@ ${normalized}`).digest("hex");
938
924
  }
939
925
  const emptySuccessCommit = {
940
926
  storage,
941
- meta,
942
927
  extractionFingerprint,
943
928
  shouldPersistProcessedFingerprint,
944
929
  hasExtractionFailure: Boolean(extractionFailure),
@@ -1008,7 +993,6 @@ ${normalized}`).digest("hex");
1008
993
  const postPersist = await runExtractionPostPersist({
1009
994
  result,
1010
995
  storage,
1011
- meta: meta ?? void 0,
1012
996
  extractionFingerprint: extractionFingerprint ?? void 0,
1013
997
  shouldPersistProcessedFingerprint,
1014
998
  recordProcessedExtractionFingerprint: this.deps.recordProcessedExtractionFingerprint,
@@ -1026,7 +1010,6 @@ ${normalized}`).digest("hex");
1026
1010
  clearBuffer,
1027
1011
  failOnExtractionFailure: options.failOnExtractionFailure === true
1028
1012
  });
1029
- meta = postPersist.meta ?? null;
1030
1013
  const postPersistMetadataFailed = postPersist.metadataFailed;
1031
1014
  await runPostPersistBestEffort(
1032
1015
  "during_post_persist_passive_capture",
@@ -1100,4 +1083,4 @@ export {
1100
1083
  ExtractionDeadlineError,
1101
1084
  ExtractionRunCoordinator
1102
1085
  };
1103
- //# sourceMappingURL=chunk-264B57GV.js.map
1086
+ //# sourceMappingURL=chunk-6D3IWYNY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orchestration/extraction-run-helpers.ts","../src/orchestration/extraction-run.ts","../src/orchestration/extraction-origin-context.ts"],"sourcesContent":["import type { BufferTurn, ExtractionFailureClass, ExtractionResult, MetaState } from \"../types.js\";\nimport type { StorageManager } from \"../index.js\";\nimport { log } from \"../logger.js\";\nimport type { ExtractionRunResult } from \"./extraction-run.js\";\n\nexport function combineExtractionAbortSignals(\n primary: AbortSignal | undefined,\n deadlineController: AbortController | undefined,\n): AbortSignal | undefined {\n if (!deadlineController) return primary;\n return primary ? AbortSignal.any([primary, deadlineController.signal]) : deadlineController.signal;\n}\n\n\n/** Result of a run whose extraction found nothing durable; `retained` marks a recorded failure that left the window in the buffer. */\nexport function emptyExtractionResult(retained: boolean, failureClass?: ExtractionFailureClass): ExtractionRunResult {\n const result: ExtractionRunResult = { status: \"skipped\", reason: \"empty_extraction_result\", persistedCount: 0, durableOutputCount: 0 };\n if (retained) Object.assign(result, { retainedBuffer: true, failureClass: failureClass ?? \"provider_retryable\" }); // same default as the retry bookkeeping\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function deriveTopicsFromExtraction(result: ExtractionResult): string[] {\n if (!isRecord(result)) return [];\n const topics = new Set<string>();\n const facts = Array.isArray(result.facts) ? result.facts : [];\n for (const rawFact of facts) {\n if (!isRecord(rawFact)) continue;\n const tags = Array.isArray(rawFact.tags) ? rawFact.tags : [];\n for (const tag of tags) {\n if (typeof tag === \"string\" && tag.length >= 2) topics.add(tag.toLowerCase());\n }\n if (typeof rawFact.entityRef === \"string\" && rawFact.entityRef.length >= 2) {\n topics.add(rawFact.entityRef.toLowerCase());\n }\n if (typeof rawFact.category === \"string\" && rawFact.category.length > 0) {\n topics.add(rawFact.category);\n }\n }\n const entities = Array.isArray(result.entities) ? result.entities : [];\n for (const rawEntity of entities) {\n if (!isRecord(rawEntity)) continue;\n if (typeof rawEntity.name === \"string\" && rawEntity.name.length >= 2) {\n topics.add(rawEntity.name.toLowerCase());\n }\n }\n return [...topics].slice(0, 16);\n}\n\n/** Bounded cap on persisted per-fingerprint retry-state entries (per namespace meta). */\nexport const EXTRACTION_RETRY_STATE_MAX_ENTRIES = 500;\n\nexport interface ExtractionRetryStateEntry {\n attempts: number;\n nextEligibleAtMs: number;\n firstFailedAtMs: number;\n lastFailureClass: ExtractionFailureClass;\n}\n\nexport interface ExtractionResilienceStatus {\n breaker: {\n state: \"closed\" | \"open\" | \"half_open\";\n openUntilMs: number;\n consecutiveFailures: number;\n lastReason: string;\n };\n backoffFingerprintCount: number;\n}\n\n/**\n * Pure backoff scheduler. Returns the absolute ms timestamp at which a\n * fingerprint that has failed `attempts` times becomes eligible again:\n * exponential via the configured schedule, clamped to `maxBackoffMs`, with\n * ±`jitterRatio` multiplicative jitter. `rng` is injectable for deterministic\n * tests. Never returns a timestamp before `now`.\n */\nexport function computeExtractionRetryNextEligibleMs(\n attempts: number,\n scheduleMs: readonly number[],\n maxBackoffMs: number,\n jitterRatio: number,\n now: number,\n rng: () => number = Math.random,\n): number {\n if (!Number.isFinite(attempts) || !Number.isInteger(attempts) || attempts < 1) {\n throw new RangeError(\"attempts must be a finite integer >= 1\");\n }\n if (!Number.isFinite(maxBackoffMs) || maxBackoffMs < 0) {\n throw new RangeError(\"maxBackoffMs must be a finite number >= 0\");\n }\n if (!Number.isFinite(jitterRatio) || jitterRatio < 0 || jitterRatio > 1) {\n throw new RangeError(\"jitterRatio must be a finite number in [0, 1]\");\n }\n const safeNow = Number.isFinite(now) ? now : 0;\n const cap = maxBackoffMs;\n if (!Array.isArray(scheduleMs) || scheduleMs.length === 0) {\n return safeNow + cap;\n }\n const idx = Math.min(attempts - 1, scheduleMs.length - 1);\n const step = scheduleMs[idx];\n const base = Math.min(typeof step === \"number\" && Number.isFinite(step) && step > 0 ? step : cap, cap);\n const randomValue = rng();\n if (!Number.isFinite(randomValue) || randomValue < 0 || randomValue > 1) {\n throw new RangeError(\"rng() must return a finite number in [0, 1]\");\n }\n const jitter = 1 + (randomValue * 2 - 1) * jitterRatio;\n return safeNow + Math.max(0, Math.round(base * jitter));\n}\n\n/**\n * Cap the persisted retry-state array to the newest `maxEntries` by\n * firstFailedAt. Guards invalid caps so they cannot turn `slice(-maxEntries)`\n * into an unbounded copy (AGENTS.md rule 17).\n */\nexport function capExtractionRetryStateEntries<T extends { firstFailedAt: string }>(\n entries: readonly T[],\n maxEntries: number,\n): T[] {\n if (!Number.isFinite(maxEntries) || !Number.isInteger(maxEntries) || maxEntries <= 0) return [];\n const sorted = [...entries].sort((a, b) => a.firstFailedAt.localeCompare(b.firstFailedAt));\n return sorted.slice(-maxEntries);\n}\n\n/**\n * Derive a single `sourceConnector` from a batch of turns.\n * Returns the connector ONLY when ALL turns carry the same connector.\n * Mixed tagged/untagged batches return undefined — extraction facts are\n * persisted at batch level, so attributing them to the single tagged\n * connector would falsely label facts from untagged turns.\n * Conflicting connectors (different values) also return undefined.\n */\nexport function deriveSourceConnector(turns: readonly BufferTurn[]): string | undefined {\n if (turns.length === 0) return undefined;\n const connectors = new Set<string>();\n let untaggedCount = 0;\n for (const turn of turns) {\n if (typeof turn.sourceConnector === \"string\" && turn.sourceConnector.length > 0) {\n connectors.add(turn.sourceConnector);\n } else {\n untaggedCount += 1;\n }\n }\n // All turns must agree on the same connector — no untagged turns mixed in.\n if (untaggedCount > 0) return undefined;\n return connectors.size === 1 ? [...connectors][0] : undefined;\n}\n\nexport async function runExtractionPostPersistBestEffort(\n runDeadlineAware: (\n operation: () => Promise<unknown>,\n phase: string,\n clearTimerOnError?: boolean,\n options?: { ignoreAbort?: boolean; ignoreDeadline?: boolean },\n ) => Promise<unknown>,\n stage: string,\n operation: () => Promise<unknown>,\n options?: { ignoreAbort?: boolean; ignoreDeadline?: boolean; propagateErrors?: boolean },\n): Promise<void> {\n try {\n await runDeadlineAware(operation, stage, false, {\n ignoreAbort: options?.ignoreAbort,\n ignoreDeadline: options?.ignoreDeadline,\n });\n } catch (error) {\n if (options?.propagateErrors) throw error;\n log.warn(`runExtraction: ${stage} failed after persistence (non-fatal)`, error);\n }\n}\n\n/**\n * Applies deferred-judge retention only to live, non-shadow extraction runs.\n * Replay/import paths must not synthesize live-buffer entries after persistence.\n */\nexport interface ExtractionDeferRetentionOptions {\n clearBufferAfterExtraction: boolean;\n extractionJudgeShadow: boolean;\n getDeferredCount: () => number;\n normalizedTurns: BufferTurn[];\n bufferKey: string;\n retainDeferredTurns: (bufferKey: string, turns: BufferTurn[], max: number) => Promise<void>;\n}\n\nexport async function runExtractionDeferRetention(\n runPostPersistBestEffort: (\n stage: string,\n operation: () => Promise<unknown>,\n options?: { ignoreAbort?: boolean },\n ) => Promise<void>,\n options: ExtractionDeferRetentionOptions,\n): Promise<void> {\n await runPostPersistBestEffort(\"during_defer_retention\", async () => {\n if (options.clearBufferAfterExtraction && !options.extractionJudgeShadow) {\n const deferredCount = options.getDeferredCount();\n if (deferredCount > 0 && options.normalizedTurns.length > 0) {\n await options.retainDeferredTurns(options.bufferKey, options.normalizedTurns, 10);\n } else {\n await options.retainDeferredTurns(options.bufferKey, [], 0);\n }\n }\n });\n}\n\nexport interface ExtractionPostPersistOptions {\n result: ExtractionResult;\n storage: StorageManager;\n extractionFingerprint?: string;\n shouldPersistProcessedFingerprint: boolean;\n recordProcessedExtractionFingerprint: (\n storage: StorageManager,\n fingerprint: string,\n meta: MetaState,\n ) => Promise<void>;\n runDeadlineAware: (\n operation: () => Promise<unknown>,\n phase: string,\n clearTimerOnError?: boolean,\n options?: { ignoreAbort?: boolean; ignoreDeadline?: boolean },\n ) => Promise<unknown>;\n isDeadlineError: (error: unknown) => boolean;\n createDeadlineError: (stage: string) => Error;\n deadlineMs?: number;\n clearBufferAfterExtraction: boolean;\n runPostPersistBestEffort: (\n stage: string,\n operation: () => Promise<unknown>,\n options?: { ignoreAbort?: boolean; ignoreDeadline?: boolean; propagateErrors?: boolean },\n ) => Promise<void>;\n extractionJudgeShadow: boolean;\n getDeferredCount: () => number;\n normalizedTurns: BufferTurn[];\n bufferKey: string;\n retainDeferredTurns: (bufferKey: string, turns: BufferTurn[], max: number) => Promise<void>;\n clearBuffer: (options?: { ignoreAbort?: boolean }) => Promise<void>;\n failOnExtractionFailure: boolean;\n}\n\nexport interface ExtractionPostPersistResult {\n metadataFailed: boolean;\n}\n\nexport async function runExtractionPostPersist(\n options: ExtractionPostPersistOptions,\n): Promise<ExtractionPostPersistResult> {\n let metadataFailed = false;\n let deadlineError: Error | undefined;\n const recordFailure = (stage: string, error: unknown): void => {\n metadataFailed = true;\n if (options.isDeadlineError(error) && deadlineError === undefined) {\n deadlineError = error as Error;\n }\n log.warn(`runExtraction: ${stage} failed after durable persistence; continuing with buffer clear`, error);\n };\n // Applied under the storage's per-dir meta lock (storage.updateMeta): the\n // fingerprint record and the counters land on a FRESHLY loaded meta, so a\n // concurrent extraction's updates are not reverted by this save.\n const applyPostPersistMetadata = async (fresh: MetaState): Promise<void> => {\n if (options.extractionFingerprint && options.shouldPersistProcessedFingerprint) {\n try {\n await options.recordProcessedExtractionFingerprint(options.storage, options.extractionFingerprint, fresh);\n } catch (error) {\n metadataFailed = true;\n log.warn(\"runExtraction: processed fingerprint failed after durable persistence; continuing with buffer clear\", error);\n }\n }\n fresh.extractionCount += 1;\n fresh.lastExtractionAt = new Date().toISOString();\n fresh.totalMemories += Array.isArray(options.result.facts) ? options.result.facts.length : 0;\n fresh.totalEntities += Array.isArray(options.result.entities) ? options.result.entities.length : 0;\n };\n try {\n await options.runDeadlineAware(\n () => options.storage.updateMeta(applyPostPersistMetadata),\n \"during_post_persist_meta_save\",\n false,\n );\n } catch (error) {\n recordFailure(\"metadata save\", error);\n }\n const runBestEffort = options.runPostPersistBestEffort;\n await runExtractionDeferRetention(runBestEffort, {\n clearBufferAfterExtraction: options.clearBufferAfterExtraction,\n extractionJudgeShadow: options.extractionJudgeShadow,\n getDeferredCount: options.getDeferredCount,\n normalizedTurns: options.normalizedTurns,\n bufferKey: options.bufferKey,\n retainDeferredTurns: options.retainDeferredTurns,\n });\n await runBestEffort(\n \"during_buffer_clear\",\n () => options.clearBuffer({ ignoreAbort: true }),\n {\n ignoreAbort: true,\n ignoreDeadline: options.failOnExtractionFailure,\n propagateErrors: options.failOnExtractionFailure,\n },\n );\n if (options.failOnExtractionFailure && typeof options.deadlineMs === \"number\" && Date.now() >= options.deadlineMs) {\n throw options.createDeadlineError(\"during_buffer_clear\");\n }\n if (deadlineError) throw deadlineError;\n return { metadataFailed };\n}\n\n/**\n * Record a processed fingerprint when applicable and advance the extraction\n * liveness watermark only for a provider-backed empty success. Fingerprinted\n * imports treat the metadata save as load-bearing dedupe state; normal live\n * runs treat the stamp as diagnostic and fail open. Deadline errors always\n * propagate.\n */\nexport async function commitEmptySuccessExtraction(args: {\n storage: StorageManager;\n extractionFingerprint: string | null;\n shouldPersistProcessedFingerprint: boolean;\n hasExtractionFailure: boolean;\n extractionSkippedReason: ExtractionResult[\"extractionSkippedReason\"];\n recordProcessedExtractionFingerprint: (storage: StorageManager, fingerprint: string, meta: MetaState) => Promise<unknown>;\n runDeadlineAware: <T>(operation: () => Promise<T>, phase: string, clearTimerOnError?: boolean) => Promise<T>;\n isDeadlineError: (error: unknown) => boolean;\n}): Promise<void> {\n const {\n storage,\n extractionFingerprint,\n shouldPersistProcessedFingerprint,\n hasExtractionFailure,\n extractionSkippedReason,\n recordProcessedExtractionFingerprint,\n runDeadlineAware,\n isDeadlineError,\n } = args;\n const shouldRecordFingerprint =\n extractionFingerprint !== null &&\n shouldPersistProcessedFingerprint &&\n !hasExtractionFailure;\n const shouldStampLiveness =\n !hasExtractionFailure && extractionSkippedReason === undefined;\n if (!shouldRecordFingerprint && !shouldStampLiveness) return;\n\n const metadataFailureIsFatal = shouldRecordFingerprint;\n try {\n await runDeadlineAware(\n () =>\n storage.updateMeta(async (meta) => {\n if (shouldRecordFingerprint) {\n await recordProcessedExtractionFingerprint(storage, extractionFingerprint!, meta);\n }\n if (shouldStampLiveness) {\n meta.extractionCount += 1;\n meta.lastExtractionAt = new Date().toISOString();\n }\n }),\n \"during_empty_success_liveness_save\",\n false,\n );\n } catch (err) {\n if (isDeadlineError(err)) throw err;\n if (metadataFailureIsFatal) throw err;\n log.warn(\"runExtraction: failed to stamp empty-success liveness watermark (non-fatal)\", err);\n }\n}\n","/**\n * Buffer → extract → persist coordinator (issue #1526, seam 15).\n * Owns runExtraction, shouldQueueExtraction, buildExtractionFingerprint,\n * normalizeExtractionFingerprintTurns and recordProcessedExtractionFingerprint.\n * The orchestrator delegates here and retains cross-subsystem routing,\n * persistence and post-write side effects via injected dependencies.\n * Extracted from orchestrator.ts without behavior changes.\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { StorageManager } from \"../index.js\";\nimport { NamespaceStorageRouter } from \"../namespaces/storage.js\";\nimport type { ExtractionEngine } from \"../extraction.js\";\nimport type { SmartBuffer } from \"../buffer.js\";\nimport type { ThreadingManager } from \"../threading.js\";\nimport type { BoxBuilder } from \"../boxes.js\";\nimport { resolvePrincipal, defaultNamespaceForPrincipal } from \"../namespaces/principal.js\";\nimport { resolveScopeProfilePlan, type ResolvedScopeProfilePlan } from \"../namespaces/scope-profiles.js\";\nimport { resolveCodingNamespaceOverlay } from \"../coding/coding-namespace.js\";\nimport type { CodingContext } from \"../types.js\";\nimport { deriveExtractionOriginContext, type ExtractionSourceContext } from \"./extraction-origin-context.js\";\nimport {\n resolvePresentationCapabilities,\n resolveMemoryLifecycleCapabilities,\n type GraphConstructionCapabilitySet,\n type MemoryLifecycleCapabilitySet,\n} from \"../capabilities.js\";\nimport { parseFlexibleIsoTimestamp } from \"../utils/iso-timestamp.js\";\nimport { tagPersistedMemories } from \"../location/tagging.js\";\nimport { log } from \"../logger.js\";\nimport { emitExtractionLlmFailureError, recordExtractionLlmFailure, recordExtractionLlmSuccess } from \"../extraction-llm-health.js\";\nimport type { PluginConfig, BufferTurn, ExtractionResult, MetaState, ExtractionFailureClass } from \"../types.js\";\nimport type { TierMigrationCycleSummary } from \"../recall-state.js\";\n\nexport interface ExtractionRunResult {\n status: \"completed\" | \"skipped\";\n reason?: string;\n persistedCount: number;\n durableOutputCount: number;\n postPersistMetadataFailed?: boolean;\n retainedBuffer?: boolean; failureClass?: ExtractionFailureClass; // retained: the run left the window in the buffer for a retry (a recorded failure) of this class\n}\n\nexport class ExtractionDeadlineError extends Error {\n readonly stage: string;\n\n constructor(stage: string) {\n super(`replay extraction deadline exceeded (${stage})`);\n this.name = \"ExtractionDeadlineError\";\n this.stage = stage;\n }\n}\n\n/** Dependencies injected by the orchestrator. All stable references or\n * live accessors — lazy getters for anything tests reassign\n * post-construction (buffer, extraction, storageRouter, threading). */\nexport interface ExtractionRunCoordinatorDeps {\n config: PluginConfig;\n getBuffer: () => SmartBuffer;\n getExtraction: () => Pick<ExtractionEngine, \"extract\">;\n getStorageRouter: () => Pick<NamespaceStorageRouter, \"storageFor\">;\n getThreading: () => Pick<ThreadingManager, \"processTurn\" | \"updateThreadTitle\">;\n\n persistExtraction: (\n result: ExtractionResult,\n storage: StorageManager,\n threadIdForExtraction?: string | null,\n sourceContext?: ExtractionSourceContext,\n baseNamespace?: string,\n scopeProfileWritePlan?: ResolvedScopeProfilePlan | null,\n sourceText?: string,\n graphCaps?: GraphConstructionCapabilitySet,\n lifecycleCaps?: MemoryLifecycleCapabilitySet\n ) => Promise<{ persistedIds: string[]; memoryPathById: Map<string, string> }>;\n\n maybeCapturePassiveCorrections: (\n turns: readonly BufferTurn[],\n opts: {\n sessionKey: string;\n principal?: string;\n namespace: string;\n bufferKey: string;\n isLiveSession: boolean;\n abortSignal?: AbortSignal;\n }\n ) => Promise<void>;\n\n resolveSelfNamespace: (sessionKey?: string) => string;\n getCodingContextForSession: (sessionKey: string) => CodingContext | null;\n applyCodingNamespaceOverlay: (sessionKey: string, namespace: string) => string;\n boxBuilderFor: (storage: StorageManager) => Pick<BoxBuilder, \"onExtraction\">;\n appendPersistedThreadEpisodes: (threadId: string, ids: string[]) => Promise<void>;\n maybeScheduleConsolidation: (nonZero: boolean) => void;\n requestQmdMaintenance: () => void;\n runTierMigrationCycle: (\n storage: StorageManager,\n trigger: \"extraction\" | \"maintenance\" | \"manual\",\n options?: {\n dryRun?: boolean;\n limitOverride?: number;\n force?: boolean;\n }\n ) => Promise<TierMigrationCycleSummary>;\n getLastPersistExtractionDeferredCount: () => number;\n recordProcessedExtractionFingerprint: (\n storage: StorageManager,\n fingerprint: string,\n preloadedMeta?: Awaited<ReturnType<StorageManager[\"loadMeta\"]>>\n ) => Promise<void>;\n}\n\n// Recall/extraction abort helpers live in orchestrator-helpers.ts since\n// #1526 seam 25; this file previously carried duplicate copies\n// (AGENTS.md rule 8 — no duplicated helpers).\nimport { raceRecallAbort, throwIfRecallAborted } from \"./orchestrator-helpers.js\";\nimport {\n capExtractionRetryStateEntries,\n combineExtractionAbortSignals,\n commitEmptySuccessExtraction,\n computeExtractionRetryNextEligibleMs,\n deriveSourceConnector,\n deriveTopicsFromExtraction, emptyExtractionResult,\n runExtractionPostPersist,\n runExtractionPostPersistBestEffort,\n EXTRACTION_RETRY_STATE_MAX_ENTRIES,\n} from \"./extraction-run-helpers.js\";\nimport type { ExtractionResilienceStatus, ExtractionRetryStateEntry } from \"./extraction-run-helpers.js\";\n\nexport {\n capExtractionRetryStateEntries,\n computeExtractionRetryNextEligibleMs,\n deriveSourceConnector,\n deriveTopicsFromExtraction,\n};\nexport type { ExtractionResilienceStatus };\n\n/**\n * Coordinates the extraction run pipeline. Holds the dedupe fingerprint\n * cache (`recentExtractionFingerprints`) and delegates all side effects\n * to injected orchestrator methods.\n */\nexport class ExtractionRunCoordinator {\n private readonly recentExtractionFingerprints = new Map<string, number>();\n // Per-fingerprint extraction retry/backoff state (extraction hot-loop\n // hardening). Outer key = namespace, inner key = fingerprint. Hydrated lazily\n // from namespace-scoped meta so the hot path is a Map lookup; persisted back\n // to meta on change (restart-safe, cross-process coherent via the shared\n // meta.json). The breaker below is intentionally per-process in-memory\n // (mirrors local-llm.cooldownUntilMs); a restart clears it but the persisted\n // backoff still throttles, so a restart can't resurrect the hot loop.\n private readonly extractionRetryState = new Map<string, Map<string, ExtractionRetryStateEntry>>();\n private readonly hydratedRetryNamespaces = new Set<string>();\n private providerBreaker: {\n consecutiveFailures: number;\n openUntilMs: number;\n state: \"closed\" | \"open\" | \"half_open\";\n lastReason: string;\n } = { consecutiveFailures: 0, openUntilMs: 0, state: \"closed\", lastReason: \"\" };\n\n constructor(private readonly deps: ExtractionRunCoordinatorDeps) {}\n\n private get config(): PluginConfig {\n return this.deps.config;\n }\n\n // -------------------------------------------------------------------------\n // Source-valid-at helpers (moved from orchestrator.ts module scope)\n // -------------------------------------------------------------------------\n\n private latestSourceValidAtFromTurns(turns: readonly BufferTurn[]): string | undefined {\n let latestMs: number | null = null;\n for (const turn of turns) {\n if (turn.extractionContextOnly === true) continue;\n if (typeof turn.sourceValidAt !== \"string\") continue;\n const parsed = parseFlexibleIsoTimestamp(turn.sourceValidAt.trim());\n if (parsed === null) continue;\n if (latestMs === null || parsed > latestMs) {\n latestMs = parsed;\n }\n }\n return latestMs === null ? undefined : new Date(latestMs).toISOString();\n }\n\n // -------------------------------------------------------------------------\n // Extraction dedupe fingerprint helpers\n // -------------------------------------------------------------------------\n\n normalizeExtractionFingerprintTurns(turns: BufferTurn[]): string[] {\n if (!Array.isArray(turns) || turns.length === 0) return [];\n return turns\n .filter((turn) => turn.role === \"user\" || turn.role === \"assistant\")\n .map((turn) => {\n if (typeof turn.turnFingerprint === \"string\" && turn.turnFingerprint.length > 0) {\n return `fp:${turn.turnFingerprint}`;\n }\n return `${turn.role}:${(turn.content ?? \"\").replace(/\\s+/g, \" \").trim().slice(0, this.config.extractionMaxTurnChars)}`;\n })\n .filter((value) => value.length > 0);\n }\n\n buildExtractionFingerprint(turns: BufferTurn[], bufferKey: string): string | null {\n const normalized = this.normalizeExtractionFingerprintTurns(turns).join(\"\\n\");\n if (!normalized) return null;\n return createHash(\"sha256\").update(`${bufferKey}\\n${normalized}`).digest(\"hex\");\n }\n\n shouldQueueExtraction(turns: BufferTurn[], options: { commit?: boolean; bufferKey?: string } = {}): boolean {\n const lifecycleCaps = resolveMemoryLifecycleCapabilities(this.config);\n if (!lifecycleCaps.extractionDedupe) return true;\n if (!Array.isArray(turns) || turns.length === 0) return false;\n\n const bufferKey = options.bufferKey ?? turns[0]?.sessionKey ?? \"default\";\n const fingerprint = this.buildExtractionFingerprint(turns, bufferKey);\n if (!fingerprint) return false;\n const now = Date.now();\n const seenAt = this.recentExtractionFingerprints.get(fingerprint);\n if (seenAt && now - seenAt < this.config.extractionDedupeWindowMs) {\n log.debug(\"extraction dedupe: skipped duplicate buffered turn set\");\n return false;\n }\n\n if (options.commit !== false) {\n this.recentExtractionFingerprints.set(fingerprint, now);\n }\n // Keep this cache bounded to avoid unbounded growth.\n if (options.commit !== false && this.recentExtractionFingerprints.size > 200) {\n const entries = Array.from(this.recentExtractionFingerprints.entries()).sort((a, b) => a[1] - b[1]);\n for (const [key] of entries.slice(0, entries.length - 200)) {\n this.recentExtractionFingerprints.delete(key);\n }\n }\n\n return true;\n }\n\n // -------------------------------------------------------------------------\n // Processed-fingerprint recording\n // -------------------------------------------------------------------------\n\n async recordProcessedExtractionFingerprint(\n storage: StorageManager,\n fingerprint: string,\n preloadedMeta?: Awaited<ReturnType<StorageManager[\"loadMeta\"]>>\n ): Promise<void> {\n const meta = preloadedMeta ?? (await storage.loadMeta());\n const observedAt = new Date().toISOString();\n const seen = new Map(\n (meta.processedExtractionFingerprints ?? []).map((entry) => [entry.fingerprint, entry.observedAt])\n );\n seen.set(fingerprint, observedAt);\n meta.processedExtractionFingerprints = Array.from(seen.entries())\n .map(([value, at]) => ({ fingerprint: value, observedAt: at }))\n .sort((left, right) => left.observedAt.localeCompare(right.observedAt))\n .slice(-500);\n if (!preloadedMeta) {\n await storage.saveMeta(meta);\n }\n }\n\n // -------------------------------------------------------------------------\n // Extraction retry/backoff + circuit breaker (extraction hot-loop hardening)\n // -------------------------------------------------------------------------\n\n /** Lazily hydrate the in-memory retry-state mirror for a namespace from meta.\n * One-time per namespace per coordinator; the hot path is then a Map lookup.\n * Cross-process coherence: a fresh coordinator hydrates from the shared\n * meta.json, so a failure persisted by another process is honored here. */\n private hydrateRetryStateFromMeta(namespace: string, meta: MetaState): void {\n if (this.hydratedRetryNamespaces.has(namespace)) return;\n this.hydratedRetryNamespaces.add(namespace);\n const nsMap = this.extractionRetryState.get(namespace) ?? new Map<string, ExtractionRetryStateEntry>();\n for (const entry of meta.extractionRetryState ?? []) {\n const nextEligibleAtMs = Date.parse(entry.nextEligibleAt);\n const firstFailedAtMs = Date.parse(entry.firstFailedAt);\n nsMap.set(entry.fingerprint, {\n attempts: entry.attempts,\n nextEligibleAtMs: Number.isFinite(nextEligibleAtMs) ? nextEligibleAtMs : 0,\n firstFailedAtMs: Number.isFinite(firstFailedAtMs) ? firstFailedAtMs : Date.now(),\n lastFailureClass: entry.lastFailureClass,\n });\n }\n this.extractionRetryState.set(namespace, nsMap);\n }\n\n private logBreakerTransition(state: \"closed\" | \"open\" | \"half_open\"): void {\n // Once per state change (not per attempt) — AGENTS.md observability rule.\n log.warn(\"extraction: provider circuit breaker transition\", {\n state,\n consecutiveFailures: this.providerBreaker.consecutiveFailures,\n lastReason: this.providerBreaker.lastReason,\n openUntilMs: this.providerBreaker.openUntilMs,\n });\n }\n\n /** True while the breaker suppresses non-forced attempts. Flips an expired\n * `open` breaker to `half_open`, which allows exactly one probe (the next\n * non-forced attempt) because the extraction queue is a serial drain. */\n private isProviderBreakerOpen(now: number): boolean {\n if (now < this.providerBreaker.openUntilMs) return true;\n if (this.providerBreaker.state === \"open\") {\n this.providerBreaker.state = \"half_open\";\n this.logBreakerTransition(\"half_open\");\n }\n return false;\n }\n\n private onProviderFailure(cls: ExtractionFailureClass, now: number): void {\n this.providerBreaker.consecutiveFailures += 1;\n const trip =\n cls === \"auth_config\" ||\n // A failed half-open probe re-opens immediately (standard breaker\n // semantics). Without this, an auth_config-opened breaker (which trips\n // below the threshold) would get stuck half_open after a transient\n // probe failure and stop suppressing (cursor review).\n this.providerBreaker.state === \"half_open\" ||\n this.providerBreaker.consecutiveFailures >= this.config.extractionBreakerFailureThreshold;\n if (!trip) return;\n const cooldown =\n cls === \"auth_config\"\n ? this.config.extractionBreakerAuthCooldownMs\n : this.config.extractionBreakerCooldownMs;\n this.providerBreaker.openUntilMs = now + Math.max(0, cooldown);\n this.providerBreaker.lastReason = cls;\n if (this.providerBreaker.state !== \"open\") {\n this.providerBreaker.state = \"open\";\n this.logBreakerTransition(\"open\");\n }\n }\n\n private resetProviderBreakerOnSuccess(): void {\n const wasDisturbed =\n this.providerBreaker.state !== \"closed\" ||\n this.providerBreaker.consecutiveFailures > 0 ||\n this.providerBreaker.openUntilMs > 0;\n if (!wasDisturbed) return;\n const wasOpen = this.providerBreaker.state !== \"closed\";\n this.providerBreaker.consecutiveFailures = 0;\n this.providerBreaker.openUntilMs = 0;\n this.providerBreaker.lastReason = \"\";\n this.providerBreaker.state = \"closed\";\n if (wasOpen) this.logBreakerTransition(\"closed\");\n }\n\n /** Rebuild `meta.extractionRetryState` from the in-memory namespace mirror,\n * bounded to the newest entries, and prune the mirror to match. */\n private persistRetryStateToMeta(namespace: string, meta: MetaState): void {\n const nsMap = this.extractionRetryState.get(namespace);\n const entries = nsMap\n ? Array.from(nsMap.entries()).map(([fingerprint, st]) => ({\n fingerprint,\n attempts: st.attempts,\n nextEligibleAt: new Date(st.nextEligibleAtMs).toISOString(),\n firstFailedAt: new Date(st.firstFailedAtMs).toISOString(),\n lastFailureClass: st.lastFailureClass,\n }))\n : [];\n const capped = capExtractionRetryStateEntries(entries, EXTRACTION_RETRY_STATE_MAX_ENTRIES);\n meta.extractionRetryState = capped;\n if (nsMap && capped.length < nsMap.size) {\n const kept = new Set(capped.map((e) => e.fingerprint));\n for (const key of Array.from(nsMap.keys())) {\n if (!kept.has(key)) nsMap.delete(key);\n }\n }\n }\n /** Record an extraction failure into per-fingerprint backoff state + breaker, persisting to namespace meta. Fail-open. */\n private async recordExtractionFailure(\n namespace: string,\n fingerprint: string,\n cls: ExtractionFailureClass,\n meta: MetaState,\n now: number,\n ): Promise<void> {\n try {\n this.hydrateRetryStateFromMeta(namespace, meta);\n this.applyExtractionFailureToMemory(namespace, fingerprint, cls, now);\n this.persistRetryStateToMeta(namespace, meta);\n // The caller's storage.updateMeta persists this — saving here would write the same file twice.\n } catch (err) {\n // Fail-open: recording failure state must never crash observe/recall.\n log.warn(\"runExtraction: failed to record extraction retry state (non-fatal)\", err);\n }\n }\n\n /** Failure backoff into the in-memory mirror + breaker WITHOUT touching meta — the fallback\n * when the locked meta write cannot run: the retry gate reads this mirror, so it stays shut. */\n private applyExtractionFailureToMemory(\n namespace: string,\n fingerprint: string,\n cls: ExtractionFailureClass,\n now: number,\n ): void {\n const nsMap = this.extractionRetryState.get(namespace) ?? new Map<string, ExtractionRetryStateEntry>();\n const prev = nsMap.get(fingerprint);\n const attempts = (prev?.attempts ?? 0) + 1;\n const firstFailedAtMs = prev?.firstFailedAtMs ?? now;\n let nextEligibleAtMs: number;\n if (cls === \"parse_empty\" && attempts > this.config.extractionParseEmptyMaxAttempts) {\n // parse_empty budget exhausted → long-park (still never marked processed).\n nextEligibleAtMs = now + Math.max(0, this.config.extractionRetryMaxBackoffMs);\n } else {\n nextEligibleAtMs = computeExtractionRetryNextEligibleMs(\n attempts,\n this.config.extractionRetryScheduleMs,\n this.config.extractionRetryMaxBackoffMs,\n this.config.extractionRetryJitterRatio,\n now,\n );\n }\n nsMap.set(fingerprint, { attempts, nextEligibleAtMs, firstFailedAtMs, lastFailureClass: cls });\n this.extractionRetryState.set(namespace, nsMap);\n this.onProviderFailure(cls, now);\n }\n\n /** Delete a fingerprint's retry entry from the mirror + meta. Returns whether\n * meta changed (so the caller can decide to persist). Does not touch the\n * breaker — callers pair this with `resetProviderBreakerOnSuccess`. */\n private clearExtractionRetryEntry(namespace: string, fingerprint: string, meta: MetaState): boolean {\n const nsMap = this.extractionRetryState.get(namespace);\n if (!nsMap?.has(fingerprint)) return false;\n nsMap.delete(fingerprint);\n this.persistRetryStateToMeta(namespace, meta);\n return true;\n }\n\n /** Live in-process resilience snapshot (breaker + backoff population). */\n getExtractionResilienceStatus(): ExtractionResilienceStatus {\n let backoffFingerprintCount = 0;\n for (const nsMap of this.extractionRetryState.values()) {\n backoffFingerprintCount += nsMap.size;\n }\n return {\n breaker: {\n state: this.providerBreaker.state,\n openUntilMs: this.providerBreaker.openUntilMs,\n consecutiveFailures: this.providerBreaker.consecutiveFailures,\n lastReason: this.providerBreaker.lastReason,\n },\n backoffFingerprintCount,\n };\n }\n\n // -------------------------------------------------------------------------\n // Main extraction pipeline\n // -------------------------------------------------------------------------\n\n async runExtraction(\n turns: BufferTurn[],\n options: {\n clearBufferAfterExtraction?: boolean;\n clearMatchingTurns?: boolean; retentionWindow?: readonly BufferTurn[];\n skipCharThreshold?: boolean;\n skipUserTurnThreshold?: boolean;\n deadlineMs?: number;\n bufferKey?: string;\n abortSignal?: AbortSignal;\n failOnExtractionFailure?: boolean;\n /** Write-rate commit boundary, after persistence returns. */\n onDurableCommit?: () => void;\n /** Disarm preemption once persistence can no longer be aborted. */\n onBeforePersist?: () => void;\n /**\n * Explicit namespace override for the write path (#460). When set, this\n * is the namespace where extraction writes go instead of the one derived\n * from `defaultNamespaceForPrincipal(resolvePrincipal(sessionKey))`.\n * The resolved `principal` is still threaded into memory metadata for\n * provenance; only the storage target is overridden.\n */\n writeNamespaceOverride?: string;\n /**\n * Pin the provenance principal instead of deriving it from\n * `resolvePrincipal(sessionKey)`. When set, this is the identity an\n * access surface already authenticated; used so observed-turn provenance\n * is correct even though `turn.sessionKey` is the original key.\n */\n principalOverride?: string;\n /**\n * Access scope resolution may already have selected a profile while the\n * session context remains intentionally unbound. Reuse that plan for\n * persistence instead of deriving it from shared session state.\n */\n scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;\n /**\n * Force the extractor call, bypassing the retry-backoff / circuit-breaker\n * gate (extraction hot-loop hardening). Set by explicit flush paths.\n */\n forceExtractionAttempt?: boolean;\n } = {}\n ): Promise<ExtractionRunResult> {\n log.debug(`running extraction on ${turns.length} turns`);\n const clearBufferAfterExtraction = options.clearBufferAfterExtraction ?? true;\n const clearMatchingTurns = options.clearMatchingTurns === true;\n const skipCharThreshold = options.skipCharThreshold ?? false;\n const skipUserTurnThreshold = options.skipUserTurnThreshold ?? false;\n const deadlineMs =\n typeof options.deadlineMs === \"number\" && Number.isFinite(options.deadlineMs) ? options.deadlineMs : undefined;\n const bufferKey = options.bufferKey ?? turns[0]?.sessionKey ?? \"default\";\n const throwIfDeadlineExceeded = (stage: string): void => {\n if (typeof deadlineMs === \"number\" && Date.now() >= deadlineMs) {\n throw new ExtractionDeadlineError(stage);\n }\n };\n const throwIfAborted = (stage: string): void => {\n throwIfRecallAborted(options.abortSignal, `extraction aborted (${stage})`);\n };\n const runPassiveCapture = async (\n captureTurns: readonly BufferTurn[],\n captureOptions: {\n sessionKey: string;\n principal?: string;\n namespace: string;\n bufferKey: string;\n isLiveSession: boolean;\n abortSignal?: AbortSignal;\n },\n ): Promise<void> => {\n const deadlineController =\n typeof deadlineMs === \"number\" && Number.isFinite(deadlineMs) ? new AbortController() : undefined;\n const captureSignal = combineExtractionAbortSignals(captureOptions.abortSignal ?? options.abortSignal,\n deadlineController);\n let deadlineTimer: NodeJS.Timeout | undefined;\n if (deadlineController && typeof deadlineMs === \"number\") {\n const scheduleDeadlineAbort = (): void => {\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) {\n deadlineController.abort();\n return;\n }\n deadlineTimer = setTimeout(\n () => {\n if (Date.now() >= deadlineMs) {\n deadlineController.abort();\n } else {\n scheduleDeadlineAbort();\n }\n },\n Math.min(remainingMs, 2_147_483_647),\n );\n };\n scheduleDeadlineAbort();\n }\n try {\n await raceRecallAbort(\n this.deps.maybeCapturePassiveCorrections(captureTurns, {\n ...captureOptions,\n ...(captureSignal ? { abortSignal: captureSignal } : {}),\n }),\n captureSignal,\n \"extraction aborted (during_passive_capture)\",\n );\n } catch (error) {\n if (typeof deadlineMs === \"number\" && Date.now() >= deadlineMs) {\n throw new ExtractionDeadlineError(\"during_passive_capture\");\n }\n throw error;\n } finally {\n if (deadlineTimer) clearTimeout(deadlineTimer);\n }\n };\n const clearBuffer = async (clearOptions?: { ignoreAbort?: boolean }) => {\n options.onBeforePersist?.();\n if (clearOptions?.ignoreAbort !== true) {\n throwIfDeadlineExceeded(\"before_clear_buffer\");\n throwIfAborted(\"before_clear_buffer\");\n }\n if (clearBufferAfterExtraction) {\n await this.deps\n .getBuffer()\n .clearAfterExtraction(bufferKey, turns, clearMatchingTurns ? { allowNonPrefix: true } : undefined);\n }\n };\n\n // Skip extraction for cron job sessions - these are system operations, not user conversations\n const sessionKey = turns[0]?.sessionKey ?? \"\";\n if (sessionKey.includes(\":cron:\")) {\n log.debug(`skipping extraction for cron session: ${sessionKey}`);\n await clearBuffer();\n return {\n status: \"skipped\",\n reason: \"cron_session\",\n persistedCount: 0,\n durableOutputCount: 0,\n };\n }\n\n const normalizedTurns = turns\n .filter((t) => (t.role === \"user\" || t.role === \"assistant\") && typeof t.content === \"string\")\n .map((t) => ({\n ...t,\n content: t.content.trim().slice(0, this.config.extractionMaxTurnChars),\n }))\n .filter((t) => t.content.length > 0);\n const targetTurns = normalizedTurns.filter((turn) => turn.extractionContextOnly !== true);\n if (targetTurns.length === 0) {\n log.debug(\"skipping extraction: no non-context turns after normalization\");\n // Context-only turns may still contain corrections (review: \"context-only\n // turns skip capture\"). Scan normalizedTurns before clearing the buffer.\n if (normalizedTurns.length > 0) {\n throwIfDeadlineExceeded(\"before_context_only_capture\");\n const capturePrincipal =\n typeof options.principalOverride === \"string\" && options.principalOverride.length > 0\n ? options.principalOverride\n : resolvePrincipal(sessionKey, this.config);\n const captureNamespace =\n typeof options.writeNamespaceOverride === \"string\" && options.writeNamespaceOverride.length > 0\n ? options.writeNamespaceOverride\n : this.deps.resolveSelfNamespace(sessionKey);\n await runPassiveCapture(normalizedTurns as BufferTurn[], {\n sessionKey,\n principal: capturePrincipal,\n namespace: captureNamespace,\n bufferKey,\n isLiveSession: clearBufferAfterExtraction,\n });\n throwIfDeadlineExceeded(\"before_context_only_clear\");\n }\n await clearBuffer();\n return { status: \"skipped\", reason: \"empty_normalized_turns\", persistedCount: 0, durableOutputCount: 0 };\n }\n const sourceValidAt = this.latestSourceValidAtFromTurns(targetTurns);\n throwIfDeadlineExceeded(\"before_extract\");\n throwIfAborted(\"before_extract\");\n\n const userTurns = targetTurns.filter((t) => t.role === \"user\");\n const totalChars = targetTurns.reduce((sum, t) => sum + t.content.length, 0);\n const belowCharThreshold = totalChars < this.config.extractionMinChars;\n const belowUserTurnThreshold = !skipUserTurnThreshold && userTurns.length < this.config.extractionMinUserTurns;\n if ((!skipCharThreshold && belowCharThreshold) || belowUserTurnThreshold) {\n log.debug(`skipping extraction: below threshold (totalChars=${totalChars}, userTurns=${userTurns.length})`);\n // Passive correction capture runs even when extraction is skipped for\n // being below the char/user-turn threshold (review: \"skipped extraction\n // skips capture\"). A short correction like \"stop using Vim\" is under\n // extractionMinChars but is exactly the high-value case this feature\n // exists for. The write namespace resolves through the SAME scope-profile\n // plan as the full extraction path so corrections target the active\n // profile's write layer, not just resolveSelfNamespace (review:\n // \"below-threshold wrong namespace\"). The ACL in passiveCorrectionService\n // authorizes the actual plan/apply.\n {\n const capturePrincipal =\n typeof options.principalOverride === \"string\" && options.principalOverride.length > 0\n ? options.principalOverride\n : resolvePrincipal(sessionKey, this.config);\n const captureWO =\n typeof options.writeNamespaceOverride === \"string\" && options.writeNamespaceOverride.length > 0\n ? options.writeNamespaceOverride\n : undefined;\n const captureCodingCtx = sessionKey ? this.deps.getCodingContextForSession(sessionKey) : null;\n const captureCodingOv = resolveCodingNamespaceOverlay(\n captureCodingCtx,\n this.config.codingMode,\n this.config.defaultNamespace\n );\n const captureScopePlan = resolveScopeProfilePlan({\n config: this.config,\n principal: capturePrincipal,\n codingContext: captureCodingCtx,\n codingOverlay: captureCodingOv,\n });\n const captureNamespace =\n captureWO ?? captureScopePlan?.writeNamespace ?? this.deps.resolveSelfNamespace(sessionKey);\n await runPassiveCapture(normalizedTurns as BufferTurn[], {\n sessionKey,\n principal: capturePrincipal,\n namespace: captureNamespace,\n bufferKey,\n isLiveSession: clearBufferAfterExtraction,\n });\n }\n await clearBuffer();\n return {\n status: \"skipped\",\n reason: \"below_threshold\",\n persistedCount: 0,\n durableOutputCount: 0,\n };\n }\n\n // Provenance principal honours the access-surface override (#1495 thread 1,\n // mirroring the recall path's `principalOverride`, issue #570 PR 4). Access\n // surfaces that authenticated the caller at the transport layer pass their\n // resolved principal so provenance uses the SAME identity the surface\n // authorized, instead of `resolvePrincipal(sessionKey)` — which on a\n // namespace-prefixed key would collapse to `default`. The ORIGINAL,\n // un-prefixed session key still drives threading.\n const principal =\n typeof options.principalOverride === \"string\" && options.principalOverride.length > 0\n ? options.principalOverride\n : resolvePrincipal(sessionKey, this.config);\n // Write path — explicit callers still win. Otherwise, an active hosted\n // scope profile owns the extraction write target so hook-captured turns land\n // in the same layer that profile recall searches. Without a profile, preserve\n // the existing coding-agent overlay behavior (issue #569).\n const explicitWriteNamespace =\n typeof options.writeNamespaceOverride === \"string\" && options.writeNamespaceOverride.length > 0\n ? options.writeNamespaceOverride\n : undefined;\n const codingContextForWrite = sessionKey ? this.deps.getCodingContextForSession(sessionKey) : null;\n const codingOverlayForWrite = resolveCodingNamespaceOverlay(\n codingContextForWrite,\n this.config.codingMode,\n this.config.defaultNamespace\n );\n const scopeProfileGatePlan =\n options.scopeProfileWritePlan !== undefined\n ? options.scopeProfileWritePlan\n : resolveScopeProfilePlan({\n config: this.config,\n principal,\n codingContext: codingContextForWrite,\n codingOverlay: codingOverlayForWrite,\n });\n const scopeProfileWritePlan =\n explicitWriteNamespace && options.scopeProfileWritePlan === undefined\n ? null\n : scopeProfileGatePlan;\n if (scopeProfileWritePlan) {\n const selectedLayer = scopeProfileWritePlan.layers.find((layer) => layer.id === scopeProfileWritePlan.writeLayer);\n const writeNamespaceReadable = scopeProfileWritePlan.readNamespaces.includes(\n scopeProfileWritePlan.writeNamespace\n );\n if (!selectedLayer?.writable || !writeNamespaceReadable) {\n log.warn(\n `runExtraction: skipping scope profile ${scopeProfileWritePlan.profileId} because write layer ${scopeProfileWritePlan.writeLayer} is not writable inside the profile read stack`\n );\n await clearBuffer();\n return {\n status: \"skipped\",\n reason: \"scope_profile_no_writable_layer\",\n persistedCount: 0,\n durableOutputCount: 0,\n };\n }\n }\n const selfNamespace =\n explicitWriteNamespace ??\n scopeProfileWritePlan?.writeNamespace ??\n this.deps.applyCodingNamespaceOverlay(sessionKey, defaultNamespaceForPrincipal(principal, this.config));\n const extractionDeadlineController =\n typeof deadlineMs === \"number\" && Number.isFinite(deadlineMs)\n ? new AbortController()\n : undefined;\n const extractionAbortSignal = extractionDeadlineController\n ? options.abortSignal\n ? AbortSignal.any([options.abortSignal, extractionDeadlineController.signal])\n : extractionDeadlineController.signal\n : options.abortSignal;\n let extractionDeadlineTimer: NodeJS.Timeout | undefined;\n const clearExtractionDeadlineTimer = (): void => {\n if (extractionDeadlineTimer) {\n clearTimeout(extractionDeadlineTimer);\n extractionDeadlineTimer = undefined;\n }\n };\n const runDeadlineAware = async <T>(\n operation: () => Promise<T>,\n phase: string,\n clearTimerOnError = true,\n options: { ignoreAbort?: boolean; ignoreDeadline?: boolean } = {},\n ): Promise<T> => {\n const operationSignal = options.ignoreAbort ? undefined : extractionAbortSignal;\n try {\n if (!options.ignoreDeadline && typeof deadlineMs === \"number\" && Date.now() >= deadlineMs) {\n throwIfDeadlineExceeded(phase);\n }\n if (operationSignal?.aborted) {\n throwIfAborted(phase);\n }\n return await raceRecallAbort(\n operation(),\n operationSignal,\n `extraction aborted (${phase})`,\n );\n } catch (error) {\n if (clearTimerOnError) clearExtractionDeadlineTimer();\n if (!options.ignoreDeadline && typeof deadlineMs === \"number\" && Date.now() >= deadlineMs) {\n throw new ExtractionDeadlineError(phase);\n }\n throw error;\n }\n };\n if (extractionDeadlineController && typeof deadlineMs === \"number\") {\n const deadline = deadlineMs;\n const maxTimerDelayMs = 2_147_483_647;\n const scheduleDeadlineAbort = (): void => {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n extractionDeadlineController.abort();\n return;\n }\n extractionDeadlineTimer = setTimeout(() => {\n if (Date.now() >= deadline) {\n extractionDeadlineController.abort();\n } else {\n scheduleDeadlineAbort();\n }\n }, Math.min(remainingMs, maxTimerDelayMs));\n };\n scheduleDeadlineAbort();\n }\n const storage = await runDeadlineAware(\n () => this.deps.getStorageRouter().storageFor(selfNamespace),\n \"during_storage\",\n );\n const shouldPersistProcessedFingerprint = targetTurns.some((turn) => turn.persistProcessedFingerprint === true);\n const extractionFingerprint = this.buildExtractionFingerprint(targetTurns, bufferKey);\n let meta = extractionFingerprint && shouldPersistProcessedFingerprint\n ? await runDeadlineAware(() => storage.loadMeta(), \"during_load_meta\")\n : null;\n if (\n extractionFingerprint &&\n shouldPersistProcessedFingerprint &&\n (meta?.processedExtractionFingerprints ?? []).some((entry) => entry.fingerprint === extractionFingerprint)\n ) {\n await runDeadlineAware(() => clearBuffer(), \"during_clear_buffer\");\n clearExtractionDeadlineTimer();\n return {\n status: \"skipped\",\n reason: \"processed_fingerprint\",\n persistedCount: 0,\n durableOutputCount: 0,\n };\n }\n\n // Extraction retry/backoff + circuit-breaker gate (extraction hot-loop\n // hardening). Suppresses re-attempts of a recently-failed fingerprint and\n // short-circuits every fingerprint while the provider breaker is open, so a\n // failing LLM endpoint is not hammered once per observe. Forced flushes and\n // fail-closed callers bypass the gate (rule 18) but still record failures.\n // On a suppressed attempt the buffer is deliberately NOT cleared, so no\n // extractable turn is dropped — it is retried after cooldown/nextEligibleAt.\n const forcedExtractionAttempt =\n options.failOnExtractionFailure === true || options.forceExtractionAttempt === true;\n // Resolve the gate through the shared lifecycle capability plan (issue\n // #1523) rather than reading the raw config flag at each call site.\n const extractionRetryEnabled = resolveMemoryLifecycleCapabilities(this.config).extractionRetry;\n if (extractionFingerprint && !forcedExtractionAttempt && extractionRetryEnabled) {\n try {\n meta ??= await runDeadlineAware(() => storage.loadMeta(), \"during_retry_gate\");\n this.hydrateRetryStateFromMeta(selfNamespace, meta);\n const nowMs = Date.now();\n let suppressReason: \"provider_circuit_open\" | \"extraction_backoff\" | null = null;\n if (this.isProviderBreakerOpen(nowMs)) {\n suppressReason = \"provider_circuit_open\";\n } else {\n const st = this.extractionRetryState.get(selfNamespace)?.get(extractionFingerprint);\n if (st && nowMs < st.nextEligibleAtMs) suppressReason = \"extraction_backoff\";\n }\n if (suppressReason) {\n // Passive correction capture is local and must not be delayed by a\n // provider cooldown. It remains fail-open.\n try {\n await runDeadlineAware(\n () => runPassiveCapture(normalizedTurns as BufferTurn[], {\n sessionKey,\n principal,\n namespace: selfNamespace,\n bufferKey,\n isLiveSession: clearBufferAfterExtraction,\n }),\n \"during_passive_capture\",\n );\n } catch (captureErr) {\n if (captureErr instanceof ExtractionDeadlineError) throw captureErr;\n log.warn(\"runExtraction: passive correction capture failed on suppressed attempt (non-fatal)\", captureErr);\n }\n clearExtractionDeadlineTimer();\n return { status: \"skipped\", reason: suppressReason, persistedCount: 0, durableOutputCount: 0 };\n }\n } catch (err) {\n if (err instanceof ExtractionDeadlineError) throw err;\n // Fail-open: a gate error must never block extraction.\n log.warn(\"runExtraction: extraction retry gate check failed; proceeding (fail-open)\", err);\n }\n }\n\n // Pass existing entity names so the LLM can reuse them instead of inventing variants.\n const existingEntities = await runDeadlineAware(\n () => storage.listEntityNames(),\n \"during_list_entity_names\",\n );\n let result: ExtractionResult;\n try {\n result = await raceRecallAbort(\n this.deps.getExtraction().extract(normalizedTurns, existingEntities, extractionAbortSignal),\n extractionAbortSignal,\n \"extraction aborted (during_extract)\",\n );\n } catch (error) {\n clearExtractionDeadlineTimer();\n if (typeof deadlineMs === \"number\" && Date.now() >= deadlineMs) {\n throw new ExtractionDeadlineError(\"during_extract\");\n }\n throw error;\n }\n try {\n throwIfDeadlineExceeded(\"before_persist\");\n throwIfAborted(\"before_persist\");\n\n // Defensive: validate extraction result before processing. Explicit\n // fail-closed callers, such as flush-plan import, must not observe\n // malformed extractor output as a successful skip.\n if (!result) {\n log.warn(\"runExtraction: extraction returned null/undefined\");\n if (options.failOnExtractionFailure) {\n throw new Error(\"extraction failed: invalid_extraction_result\");\n }\n await clearBuffer();\n return {\n status: \"skipped\",\n reason: \"invalid_extraction_result\",\n persistedCount: 0,\n durableOutputCount: 0,\n };\n }\n const invalidExtractionResultFields = [\n [\"facts\", result.facts],\n [\"entities\", result.entities],\n [\"questions\", result.questions],\n [\"profileUpdates\", result.profileUpdates],\n ]\n .filter(([, value]) => !Array.isArray(value))\n .map(([field]) => field);\n if (invalidExtractionResultFields.length > 0) {\n log.warn(\"runExtraction: extraction returned invalid collection fields\", {\n invalidFields: invalidExtractionResultFields,\n resultKeys: typeof result === \"object\" && result !== null ? Object.keys(result) : [],\n });\n if (options.failOnExtractionFailure) {\n throw new Error(\"extraction failed: invalid_extraction_result\");\n }\n await clearBuffer();\n return {\n status: \"skipped\",\n reason: \"invalid_extraction_result\",\n persistedCount: 0,\n durableOutputCount: 0,\n };\n }\n const extractionFailure =\n typeof result.extractionFailure === \"string\" && result.extractionFailure.trim().length > 0\n ? result.extractionFailure\n : undefined;\n // Issue #3140: surface extraction-LLM outages on /health and as an\n // ERROR-level deduplicated event instead of debug-only lines. Records on\n // every completed attempt so a later success clears the failure.\n if (extractionFailure) {\n recordExtractionLlmFailure(extractionFailure);\n emitExtractionLlmFailureError(extractionFailure, result.extractionFailureClass);\n } else if (result.extractionSkippedReason !== undefined) {\n // Prefiltered batch: no LLM was contacted, so we cannot confirm or deny\n // reachability. Do not clear the outage state.\n } else {\n recordExtractionLlmSuccess();\n }\n let recordedRetryFailure = false;\n // Record failure into backoff/breaker state, or heal on success. Runs for\n // every result path (empty and durable), before the fail-closed throw, so a\n // forced flush still records its failure (rule 18). Gated by\n // extractionRetryEnabled so a disabled feature restores prior behavior.\n if (extractionFingerprint && extractionRetryEnabled) {\n if (extractionFailure) {\n const failureClass = result.extractionFailureClass ?? \"provider_retryable\";\n try {\n await runDeadlineAware(\n () =>\n storage.updateMeta((freshMeta) =>\n this.recordExtractionFailure(selfNamespace, extractionFingerprint, failureClass, freshMeta, Date.now()),\n ),\n \"during_retry_bookkeeping_save\",\n false,\n );\n recordedRetryFailure = true;\n } catch (err) {\n if (err instanceof ExtractionDeadlineError) throw err;\n // Fail-open, but retain the turns (a cleared buffer with no retry state drops them). Only a\n // LOCK skip reaches here without the mutator having run — a later save must not double-count.\n if (err instanceof Error && err.message.includes(\"meta.json.lock not acquired\"))\n this.applyExtractionFailureToMemory(selfNamespace, extractionFingerprint, failureClass, Date.now());\n recordedRetryFailure = true;\n log.warn(\"runExtraction: retry state kept in memory; meta persist will catch up\", err);\n }\n } else if (result.extractionSkippedReason === undefined) {\n // Provider responded without failure → breaker heals; clear any\n // parked backoff for this fingerprint so it proceeds normally.\n this.resetProviderBreakerOnSuccess();\n try {\n await runDeadlineAware(\n () =>\n storage.updateMeta((freshMeta) => {\n // Hydrate the mirror from persisted meta before clearing: a forced flush\n // bypassed the retry gate, and a stale persisted entry would keep blocking.\n this.hydrateRetryStateFromMeta(selfNamespace, freshMeta);\n // `false` skips the save when nothing was parked for this fingerprint.\n return this.clearExtractionRetryEntry(selfNamespace, extractionFingerprint, freshMeta);\n }),\n \"during_retry_bookkeeping_save\",\n false,\n );\n } catch (err) {\n if (err instanceof ExtractionDeadlineError) throw err;\n log.warn(\"runExtraction: failed to persist cleared retry state (non-fatal)\", err);\n }\n }\n }\n if (options.failOnExtractionFailure && extractionFailure) {\n throw new Error(`extraction failed: ${extractionFailure}`);\n }\n if (\n result.facts.length === 0 &&\n result.entities.length === 0 &&\n result.questions.length === 0 &&\n result.profileUpdates.length === 0\n ) {\n log.debug(\"runExtraction: extraction produced no durable outputs; skipping persistence\");\n if (extractionFailure) {\n log.warn(\n \"runExtraction: extraction reported failure with no durable outputs; not marking fingerprint processed\",\n { extractionFailure }\n );\n }\n const emptySuccessCommit = {\n storage,\n extractionFingerprint,\n shouldPersistProcessedFingerprint,\n hasExtractionFailure: Boolean(extractionFailure),\n extractionSkippedReason: result.extractionSkippedReason,\n recordProcessedExtractionFingerprint: this.deps.recordProcessedExtractionFingerprint,\n runDeadlineAware,\n isDeadlineError: (error: unknown) => error instanceof ExtractionDeadlineError,\n };\n if (shouldPersistProcessedFingerprint) {\n await commitEmptySuccessExtraction(emptySuccessCommit);\n }\n await runPassiveCapture(normalizedTurns as BufferTurn[], {\n sessionKey,\n principal,\n namespace: selfNamespace,\n bufferKey,\n isLiveSession: clearBufferAfterExtraction,\n });\n if (recordedRetryFailure) {\n log.debug(\"runExtraction: retaining buffer for backoff retry after failure\");\n } else {\n await clearBuffer();\n }\n if (!shouldPersistProcessedFingerprint) {\n await commitEmptySuccessExtraction(emptySuccessCommit);\n }\n return emptyExtractionResult(recordedRetryFailure, result.extractionFailureClass);\n }\n\n let threadIdForExtraction: string | null = null;\n if (resolvePresentationCapabilities(this.config).threading && turns.length > 0) {\n const lastTurn = turns[turns.length - 1];\n try {\n threadIdForExtraction = await runDeadlineAware(\n () => this.deps.getThreading().processTurn(lastTurn, []),\n \"during_threading\",\n );\n } catch (err) {\n if (err instanceof ExtractionDeadlineError) throw err;\n // Fail-open: threading errors must not block memory persistence.\n log.warn(\"[threading] processTurn failed before persistence (non-fatal)\", err);\n }\n }\n const originContext = deriveExtractionOriginContext(targetTurns, result.sourceConnector);\n options.onBeforePersist?.();\n throwIfDeadlineExceeded(\"before_persist\");\n throwIfAborted(\"before_persist\");\n\n const { persistedIds } = await this.deps.persistExtraction(\n result,\n storage,\n threadIdForExtraction,\n { sessionKey, principal, validAt: sourceValidAt, ...originContext },\n // Pass the KNOWN base namespace (NHIdx) so the catalog write touch records the\n // real namespace rather than a guess decoded from the storage dir.\n selfNamespace,\n scopeProfileWritePlan,\n // Verbatim source turns for the faithfulness gate (#1576) so it can\n // locate a quote per fact when #1575 spans are absent.\n normalizedTurns\n .map((t) => t.content)\n .join(\"\\n\\n\")\n );\n const durableOutputCount =\n result.facts.length + result.entities.length + result.questions.length + result.profileUpdates.length;\n try {\n options.onDurableCommit?.();\n } catch (error) {\n log.warn(\"runExtraction: durable-commit callback failed\", error);\n }\n const runPostPersistBestEffort = runExtractionPostPersistBestEffort.bind(null, runDeadlineAware);\n await tagPersistedMemories(storage, persistedIds, this.config);\n const postPersist = await runExtractionPostPersist({\n result,\n storage,\n extractionFingerprint: extractionFingerprint ?? undefined,\n shouldPersistProcessedFingerprint,\n recordProcessedExtractionFingerprint: this.deps.recordProcessedExtractionFingerprint,\n runDeadlineAware,\n isDeadlineError: (error) => error instanceof ExtractionDeadlineError,\n createDeadlineError: (stage) => new ExtractionDeadlineError(stage),\n deadlineMs,\n clearBufferAfterExtraction,\n runPostPersistBestEffort,\n extractionJudgeShadow: this.config.extractionJudgeShadow,\n getDeferredCount: () => this.deps.getLastPersistExtractionDeferredCount(),\n normalizedTurns: normalizedTurns as BufferTurn[],\n bufferKey,\n retainDeferredTurns: (key, retainedTurns, max) =>\n this.deps.getBuffer().retainDeferredTurns(key, retainedTurns, max, options.retentionWindow ?? turns),\n clearBuffer,\n failOnExtractionFailure: options.failOnExtractionFailure === true,\n });\n const postPersistMetadataFailed = postPersist.metadataFailed;\n\n // Passive correction capture (issue #1581) — detect corrections expressed\n // passively in the extracted turns and route to the Correction Contract.\n // Runs AFTER persistence + buffer clear so a capture failure never blocks\n // the extraction return. `clearBufferAfterExtraction` gates live-session\n // auto-apply (replay/import → queue-only).\n await runPostPersistBestEffort(\"during_post_persist_passive_capture\", () =>\n runPassiveCapture(normalizedTurns as BufferTurn[], {\n sessionKey,\n principal,\n namespace: selfNamespace,\n bufferKey,\n isLiveSession: clearBufferAfterExtraction,\n abortSignal: extractionAbortSignal,\n }),\n );\n\n // Build memory box from this extraction (v8.0 Phase 2A)\n // Topics are derived from the current extraction's facts and entities only —\n // not from readAllMemories() — so box topics accurately reflect the current\n // session window and the call is free of expensive full-corpus I/O.\n if (resolvePresentationCapabilities(this.config).memoryBoxes && persistedIds.length > 0) {\n const extractionTopics = deriveTopicsFromExtraction(result);\n // Derive episodic metadata from buffer turns (REMem-inspired)\n const firstUserTurn = turns.find((t) => t.role === \"user\");\n const boxGoal = firstUserTurn?.content?.slice(0, 100)?.trim() || undefined;\n await runPostPersistBestEffort(\"during_memory_box\", () =>\n this.deps.boxBuilderFor(storage).onExtraction({\n topics: extractionTopics,\n memoryIds: persistedIds,\n timestamp: new Date().toISOString(),\n goal: boxGoal,\n }),\n );\n }\n\n // Batch-append persisted IDs so non-fact memories (entities/questions) are\n // always attached to the thread. The helper excludes pending_review ids (#1635).\n if (resolvePresentationCapabilities(this.config).threading && threadIdForExtraction && persistedIds.length > 0) {\n await runPostPersistBestEffort(\"during_thread_episode_append\", () =>\n this.deps.appendPersistedThreadEpisodes(threadIdForExtraction, persistedIds),\n );\n }\n\n // Thread title update for the already-established thread context.\n if (resolvePresentationCapabilities(this.config).threading && threadIdForExtraction) {\n const conversationContent = turns.map((t) => t.content).join(\" \");\n await runPostPersistBestEffort(\"during_thread_title_update\", () =>\n this.deps.getThreading().updateThreadTitle(threadIdForExtraction, conversationContent),\n );\n }\n\n // Check if consolidation is needed (debounced + non-zero gated).\n const nonZeroExtraction = durableOutputCount > 0;\n try {\n // The increment of nonZeroExtractionsSinceConsolidation moved into\n // the scheduler with the rest of the cadence state (issue #1526 PR1).\n this.deps.maybeScheduleConsolidation(nonZeroExtraction);\n } catch (err) {\n log.warn(\"runExtraction: consolidation scheduling failed after persistence (non-fatal)\", err);\n }\n\n try {\n this.deps.requestQmdMaintenance();\n } catch (err) {\n log.warn(\"runExtraction: QMD maintenance scheduling failed after persistence (non-fatal)\", err);\n }\n\n await runPostPersistBestEffort(\"during_tier_migration\", () =>\n this.deps.runTierMigrationCycle(storage, \"extraction\"),\n );\n\n return {\n status: \"completed\",\n persistedCount: persistedIds.length,\n durableOutputCount,\n postPersistMetadataFailed,\n };\n } finally {\n clearExtractionDeadlineTimer();\n }\n }\n}\n","/**\n * Derive issue #1955 origin metadata at the extraction boundary.\n */\n\nimport { classifyOrigin, type OriginClass } from \"../security/origin-authority.js\";\nimport type { BufferTurn } from \"../types.js\";\n\nexport interface ExtractionSourceContext {\n sessionKey?: string;\n principal?: string;\n validAt?: string;\n sourceConnector?: string;\n turnRole?: \"user\" | \"assistant\" | \"tool\" | string;\n importAdapter?: string;\n originConflict?: boolean;\n}\n\n/** Derive one origin context from the turns that supplied an extraction. */\nexport function deriveExtractionOriginContext(\n targetTurns: readonly BufferTurn[],\n fallbackConnector?: string,\n): Pick<ExtractionSourceContext, \"turnRole\" | \"importAdapter\" | \"sourceConnector\" | \"originConflict\"> {\n const originRoles = new Set(targetTurns.map((turn) => turn.originRole ?? turn.role));\n const turnRole = originRoles.size === 1 ? [...originRoles][0] : undefined;\n const originConnectors = new Set(\n targetTurns\n .map((turn) => turn.sourceConnector)\n .filter((connector): connector is string => typeof connector === \"string\" && connector.length > 0),\n );\n // Mirror the pre-#1955 provenance rule: a batch only carries a connector\n // when EVERY turn is tagged with the same one — a mixed tagged+untagged\n // batch must stay connector-less (connector-provenance-lifecycle tests).\n const connector =\n targetTurns.length > 0 &&\n targetTurns.every(\n (turn) => typeof turn.sourceConnector === \"string\" && turn.sourceConnector.length > 0,\n ) &&\n originConnectors.size === 1\n ? [...originConnectors][0]\n : undefined;\n const originAdapters = new Set(\n targetTurns\n .map((turn) => turn.importProvenance?.sourceLabel)\n .filter((adapter): adapter is string => typeof adapter === \"string\" && adapter.length > 0),\n );\n // Conflict when identities disagree OR are only partially present: a batch\n // where some turns carry an import label (or connector) and others do not\n // must classify as unknown, never fall back to the uniform turn role\n // (#1955 review: mixed import labels previously became `user`).\n const everyTurnHasConnector =\n targetTurns.length > 0 &&\n targetTurns.every((turn) => typeof turn.sourceConnector === \"string\" && turn.sourceConnector.length > 0);\n const everyTurnHasAdapter =\n targetTurns.length > 0 &&\n targetTurns.every(\n (turn) => typeof turn.importProvenance?.sourceLabel === \"string\" && turn.importProvenance.sourceLabel.length > 0,\n );\n const originConflict =\n originConnectors.size > 1 ||\n originAdapters.size > 1 ||\n (originConnectors.size > 0 && originAdapters.size > 0) ||\n (originConnectors.size > 0 && !everyTurnHasConnector) ||\n (originAdapters.size > 0 && !everyTurnHasAdapter);\n const importAdapter =\n targetTurns.length > 0 &&\n targetTurns.every(\n (turn) =>\n typeof turn.importProvenance?.sourceLabel === \"string\" &&\n turn.importProvenance.sourceLabel.length > 0,\n ) &&\n originAdapters.size === 1\n ? [...originAdapters][0]\n : undefined;\n return {\n ...(turnRole ? { turnRole } : {}),\n ...(importAdapter ? { importAdapter } : {}),\n ...(originConflict ? { originConflict: true } : {}),\n sourceConnector: fallbackConnector ?? connector,\n };\n}\n\n/** Classify the persisted origin without reading config flags. */\nexport function classifyExtractionOrigin(sourceContext?: ExtractionSourceContext): OriginClass {\n if (sourceContext?.originConflict === true) return \"unknown\";\n return classifyOrigin({\n turnRole: sourceContext?.turnRole,\n connectorId: sourceContext?.sourceConnector,\n importAdapter: sourceContext?.importAdapter,\n });\n}\n"],"mappings":"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","names":["connector","options"]}