@remnic/core 9.69.73 → 9.69.74

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 (241) hide show
  1. package/dist/access-admin-ops-surface.js +34 -34
  2. package/dist/access-authorization-probe.js +35 -35
  3. package/dist/access-boundary.js +34 -34
  4. package/dist/access-cli.js +98 -97
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +34 -34
  7. package/dist/access-http-briefing.js +35 -35
  8. package/dist/access-http-query.js +36 -36
  9. package/dist/access-http.js +53 -53
  10. package/dist/access-identity-continuity-surface.js +34 -34
  11. package/dist/access-lcm-surface.js +34 -34
  12. package/dist/access-mcp.js +45 -45
  13. package/dist/access-namespace-preflight.js +34 -34
  14. package/dist/access-observe-write-category.js +6 -6
  15. package/dist/access-observe-write-surface.js +34 -34
  16. package/dist/access-offline-manifest.js +3 -3
  17. package/dist/access-operations-batch.js +37 -37
  18. package/dist/access-operations.js +44 -44
  19. package/dist/access-recall-concurrency.js +34 -34
  20. package/dist/access-recall-response.js +34 -34
  21. package/dist/access-recall-surface.js +34 -34
  22. package/dist/access-schema.js +5 -5
  23. package/dist/access-service.js +34 -34
  24. package/dist/access-surface-catalog.js +36 -36
  25. package/dist/active-recall.js +14 -13
  26. package/dist/active-recall.js.map +1 -1
  27. package/dist/briefing.js +7 -7
  28. package/dist/buffer.js +1 -1
  29. package/dist/causal-behavior.js +2 -2
  30. package/dist/causal-chain.js +2 -2
  31. package/dist/causal-consolidation.js +10 -10
  32. package/dist/causal-retrieval.js +2 -2
  33. package/dist/causal-trajectory-graph.js +2 -2
  34. package/dist/causal-trajectory.js +1 -1
  35. package/dist/{chunk-HRQWSXNB.js → chunk-2IH2WNM6.js} +3 -3
  36. package/dist/{chunk-ADWCQWK3.js → chunk-2JJVJMN6.js} +2 -2
  37. package/dist/{chunk-GWK7FEUL.js → chunk-2U3R3DDH.js} +6 -6
  38. package/dist/{chunk-GWQVMKUJ.js → chunk-2UPTRDGM.js} +3 -3
  39. package/dist/{chunk-ONEUTVGJ.js → chunk-3SBDUMPW.js} +2 -2
  40. package/dist/{chunk-CMAGVPS2.js → chunk-47AONXWB.js} +2 -2
  41. package/dist/{chunk-JX2NWPQ4.js → chunk-4ETSHAIZ.js} +10 -10
  42. package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
  43. package/dist/{chunk-GUWH5SOO.js → chunk-542IROS3.js} +2 -2
  44. package/dist/{chunk-7FL25VH3.js → chunk-5TS5QOZS.js} +6 -6
  45. package/dist/{chunk-AYDU5MJC.js → chunk-5W62ZVC6.js} +2 -2
  46. package/dist/{chunk-B2FMRNHA.js → chunk-A5HBAR5Y.js} +2 -2
  47. package/dist/{chunk-5ID5RTHY.js → chunk-A7AI3WDN.js} +2 -2
  48. package/dist/{chunk-GNC5X3J7.js → chunk-AG5QWIU7.js} +11 -11
  49. package/dist/{chunk-ZDTG7ALZ.js → chunk-B2PGHXTP.js} +2 -2
  50. package/dist/{chunk-JDBZSRUA.js → chunk-BFUYPEJB.js} +2 -2
  51. package/dist/{chunk-ICMXLHSC.js → chunk-BMTR244T.js} +2 -2
  52. package/dist/{chunk-RG7ZWG3M.js → chunk-BRJNNP7R.js} +2 -2
  53. package/dist/{chunk-DQFZOPDL.js → chunk-CGO3A7SR.js} +2 -2
  54. package/dist/{chunk-SF6RFI5Z.js → chunk-CHDGJJV6.js} +2 -2
  55. package/dist/{chunk-AJEUESNJ.js → chunk-FJZUIM5G.js} +2 -2
  56. package/dist/{chunk-YDMN7TUM.js → chunk-FRD5N3CS.js} +2 -2
  57. package/dist/chunk-GBGLS44T.js +20 -0
  58. package/dist/chunk-GBGLS44T.js.map +1 -0
  59. package/dist/{chunk-D5F2Z6WO.js → chunk-GLX4SU4W.js} +2 -2
  60. package/dist/{chunk-XY25CPAO.js → chunk-GM2UUMWJ.js} +5 -5
  61. package/dist/{chunk-266NJ2YF.js → chunk-GXHRNONR.js} +2 -2
  62. package/dist/{chunk-VVKLAB3Y.js → chunk-HA5V67N4.js} +2 -2
  63. package/dist/{chunk-5TC6MQOW.js → chunk-HS75MCQF.js} +4 -4
  64. package/dist/{chunk-ADZLUBNE.js → chunk-HVWLZ7ZQ.js} +3 -3
  65. package/dist/{chunk-DDNML3YE.js → chunk-HXRZRYHQ.js} +2 -2
  66. package/dist/{chunk-2WMXZYMS.js → chunk-HZZIH5SW.js} +2 -2
  67. package/dist/{chunk-YHU5XUF4.js → chunk-IFCKHPY4.js} +2 -2
  68. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  69. package/dist/{chunk-2VV3XLZB.js → chunk-IXLHREAB.js} +4 -4
  70. package/dist/{chunk-2XGPN5TL.js → chunk-JLNJ7AGH.js} +5 -5
  71. package/dist/{chunk-G3QJVHFG.js → chunk-JTGL6UX7.js} +12 -9
  72. package/dist/chunk-JTGL6UX7.js.map +1 -0
  73. package/dist/{chunk-B6RTKSOT.js → chunk-KK6TS7ED.js} +3 -3
  74. package/dist/{chunk-HW4DKAAA.js → chunk-KSJP3AWY.js} +2 -2
  75. package/dist/{chunk-6E5GYDIE.js → chunk-MFZACYZ6.js} +2 -2
  76. package/dist/{chunk-NEARGPN7.js → chunk-ML64HXAN.js} +2 -2
  77. package/dist/{chunk-BGBW4H7C.js → chunk-NKIK4VFP.js} +2 -2
  78. package/dist/{chunk-KNPWG3VI.js → chunk-NNPJWVGN.js} +32 -32
  79. package/dist/{chunk-WXPIEWQW.js → chunk-NS2SFWKC.js} +3 -3
  80. package/dist/{chunk-VQJ7UAKA.js → chunk-NVPE6AJ3.js} +1 -1
  81. package/dist/{chunk-GRSFFLUY.js → chunk-OMU54WOM.js} +2 -2
  82. package/dist/{chunk-JUOJGZPV.js → chunk-PDY7C73D.js} +3 -3
  83. package/dist/{chunk-UBCVHKZQ.js → chunk-QNUK4SUE.js} +2 -2
  84. package/dist/{chunk-NZUHZVHF.js → chunk-QOL6OTIK.js} +2 -2
  85. package/dist/{chunk-BICNRVEC.js → chunk-QWUJWBZ5.js} +2 -2
  86. package/dist/{chunk-OVO545UE.js → chunk-QXDZYPBL.js} +2 -2
  87. package/dist/{chunk-W7PY7IIB.js → chunk-RBAG3VUT.js} +13 -13
  88. package/dist/{chunk-WJPRWNZN.js → chunk-RWQXTR35.js} +2 -2
  89. package/dist/{chunk-BIKX37D2.js → chunk-SIV2ENTD.js} +28 -28
  90. package/dist/{chunk-QVWNNN64.js → chunk-SUD76OMV.js} +89 -83
  91. package/dist/chunk-SUD76OMV.js.map +1 -0
  92. package/dist/{chunk-YEHKKZ5T.js → chunk-SYTPPMCM.js} +2 -2
  93. package/dist/{chunk-2ZU6CYTJ.js → chunk-T3XDF5RO.js} +2 -2
  94. package/dist/{chunk-SUI5JQVE.js → chunk-UHQ5UPAQ.js} +2 -2
  95. package/dist/{chunk-RDWVTUXZ.js → chunk-V6ULW25E.js} +2 -2
  96. package/dist/{chunk-FN6E373Q.js → chunk-VE456O3R.js} +2 -2
  97. package/dist/{chunk-VDKZTNG5.js → chunk-VSBY5HAI.js} +2 -2
  98. package/dist/{chunk-LMMQKZK3.js → chunk-VZBW6CDG.js} +1 -1
  99. package/dist/{chunk-RFVF5PLN.js → chunk-WZGSSLYI.js} +2 -2
  100. package/dist/{chunk-TRLPF7ZP.js → chunk-Y4IQFWGD.js} +2 -2
  101. package/dist/{chunk-WQZZDN5M.js → chunk-ZHOXXHT5.js} +4 -4
  102. package/dist/{chunk-5I63ZRIH.js → chunk-ZIJ5FAI4.js} +4 -4
  103. package/dist/{chunk-BSCR5TEN.js → chunk-ZL3Q4OWJ.js} +2 -2
  104. package/dist/{chunk-MQTCNXTG.js → chunk-ZMV67JXV.js} +4 -4
  105. package/dist/cli.js +76 -75
  106. package/dist/coding/export-okf-codegraph.js +6 -6
  107. package/dist/coding/pre-action-gate.js +2 -2
  108. package/dist/compounding/engine.js +7 -7
  109. package/dist/config-search-backend.d.ts +5 -0
  110. package/dist/config-search-backend.d.ts.map +1 -0
  111. package/dist/config-search-backend.js +8 -0
  112. package/dist/config.d.ts.map +1 -1
  113. package/dist/config.js +14 -13
  114. package/dist/connectors/codex-materialize-runner.js +7 -7
  115. package/dist/connectors/index.js +7 -7
  116. package/dist/convergence-refresh.js +9 -9
  117. package/dist/corpus-watermark.js +9 -9
  118. package/dist/deep-recall-http-glue.js +6 -6
  119. package/dist/deep-recall.js +2 -2
  120. package/dist/entity-retrieval.js +7 -7
  121. package/dist/event-order-recall.js +2 -2
  122. package/dist/external-wiki-access.js +35 -35
  123. package/dist/extraction.js +9 -9
  124. package/dist/{graph-edge-decay-ROSUPDX3.js → graph-edge-decay-PVKDKLQK.js} +5 -5
  125. package/dist/graph-edge-decay-PVKDKLQK.js.map +1 -0
  126. package/dist/graph-jsonl.js +3 -3
  127. package/dist/graph-snapshot.js +3 -3
  128. package/dist/graph.js +4 -4
  129. package/dist/harmonic-retrieval.js +1 -1
  130. package/dist/index.js +107 -106
  131. package/dist/lcm/index.js +3 -3
  132. package/dist/location/index.js +9 -9
  133. package/dist/maintenance/memory-governance.js +7 -7
  134. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +7 -7
  135. package/dist/maintenance/rebuild-memory-projection.js +8 -8
  136. package/dist/memory-browse-operations.js +35 -35
  137. package/dist/namespaces/migrate.js +8 -8
  138. package/dist/namespaces/search.js +3 -3
  139. package/dist/namespaces/storage.js +7 -7
  140. package/dist/offline-sync.js +2 -2
  141. package/dist/operator-doctor-corpus.js +10 -10
  142. package/dist/operator-toolkit.js +25 -24
  143. package/dist/orchestration/extraction-persist-citation.d.ts +4 -0
  144. package/dist/orchestration/extraction-persist-citation.d.ts.map +1 -0
  145. package/dist/orchestration/extraction-persist.d.ts +1 -3
  146. package/dist/orchestration/extraction-persist.d.ts.map +1 -1
  147. package/dist/orchestration/maintenance.js +15 -15
  148. package/dist/orchestrator.js +98 -97
  149. package/dist/recall-navigation-operations.js +35 -35
  150. package/dist/recall-navigation.js +34 -34
  151. package/dist/resume-bundles.js +15 -14
  152. package/dist/search/factory.js +2 -2
  153. package/dist/search/index.js +4 -4
  154. package/dist/semantic-consolidation.js +8 -8
  155. package/dist/semantic-rule-promotion.js +7 -7
  156. package/dist/semantic-rule-verifier.js +7 -7
  157. package/dist/source-agent-qualifier.js +7 -7
  158. package/dist/standup/build.js +7 -7
  159. package/dist/storage.js +6 -6
  160. package/dist/support-passport/index.js +37 -37
  161. package/dist/transfer/autodetect.js +1 -1
  162. package/dist/transfer/backup.js +1 -1
  163. package/dist/transfer/capsule-export.js +2 -2
  164. package/dist/transfer/export-okf.js +7 -7
  165. package/dist/verified-recall.js +7 -7
  166. package/dist/who-knows-cli.js +8 -8
  167. package/dist/who-knows.js +7 -7
  168. package/package.json +2 -2
  169. package/src/config-search-backend.test.ts +21 -0
  170. package/src/config-search-backend.ts +17 -0
  171. package/src/config.ts +2 -3
  172. package/src/orchestration/extraction-persist-citation.test.ts +9 -0
  173. package/src/orchestration/extraction-persist-citation.ts +37 -0
  174. package/src/orchestration/extraction-persist.ts +8 -42
  175. package/dist/chunk-G3QJVHFG.js.map +0 -1
  176. package/dist/chunk-QVWNNN64.js.map +0 -1
  177. /package/dist/{chunk-HRQWSXNB.js.map → chunk-2IH2WNM6.js.map} +0 -0
  178. /package/dist/{chunk-ADWCQWK3.js.map → chunk-2JJVJMN6.js.map} +0 -0
  179. /package/dist/{chunk-GWK7FEUL.js.map → chunk-2U3R3DDH.js.map} +0 -0
  180. /package/dist/{chunk-GWQVMKUJ.js.map → chunk-2UPTRDGM.js.map} +0 -0
  181. /package/dist/{chunk-ONEUTVGJ.js.map → chunk-3SBDUMPW.js.map} +0 -0
  182. /package/dist/{chunk-CMAGVPS2.js.map → chunk-47AONXWB.js.map} +0 -0
  183. /package/dist/{chunk-JX2NWPQ4.js.map → chunk-4ETSHAIZ.js.map} +0 -0
  184. /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
  185. /package/dist/{chunk-GUWH5SOO.js.map → chunk-542IROS3.js.map} +0 -0
  186. /package/dist/{chunk-7FL25VH3.js.map → chunk-5TS5QOZS.js.map} +0 -0
  187. /package/dist/{chunk-AYDU5MJC.js.map → chunk-5W62ZVC6.js.map} +0 -0
  188. /package/dist/{chunk-B2FMRNHA.js.map → chunk-A5HBAR5Y.js.map} +0 -0
  189. /package/dist/{chunk-5ID5RTHY.js.map → chunk-A7AI3WDN.js.map} +0 -0
  190. /package/dist/{chunk-GNC5X3J7.js.map → chunk-AG5QWIU7.js.map} +0 -0
  191. /package/dist/{chunk-ZDTG7ALZ.js.map → chunk-B2PGHXTP.js.map} +0 -0
  192. /package/dist/{chunk-JDBZSRUA.js.map → chunk-BFUYPEJB.js.map} +0 -0
  193. /package/dist/{chunk-ICMXLHSC.js.map → chunk-BMTR244T.js.map} +0 -0
  194. /package/dist/{chunk-RG7ZWG3M.js.map → chunk-BRJNNP7R.js.map} +0 -0
  195. /package/dist/{chunk-DQFZOPDL.js.map → chunk-CGO3A7SR.js.map} +0 -0
  196. /package/dist/{chunk-SF6RFI5Z.js.map → chunk-CHDGJJV6.js.map} +0 -0
  197. /package/dist/{chunk-AJEUESNJ.js.map → chunk-FJZUIM5G.js.map} +0 -0
  198. /package/dist/{chunk-YDMN7TUM.js.map → chunk-FRD5N3CS.js.map} +0 -0
  199. /package/dist/{chunk-D5F2Z6WO.js.map → chunk-GLX4SU4W.js.map} +0 -0
  200. /package/dist/{chunk-XY25CPAO.js.map → chunk-GM2UUMWJ.js.map} +0 -0
  201. /package/dist/{chunk-266NJ2YF.js.map → chunk-GXHRNONR.js.map} +0 -0
  202. /package/dist/{chunk-VVKLAB3Y.js.map → chunk-HA5V67N4.js.map} +0 -0
  203. /package/dist/{chunk-5TC6MQOW.js.map → chunk-HS75MCQF.js.map} +0 -0
  204. /package/dist/{chunk-ADZLUBNE.js.map → chunk-HVWLZ7ZQ.js.map} +0 -0
  205. /package/dist/{chunk-DDNML3YE.js.map → chunk-HXRZRYHQ.js.map} +0 -0
  206. /package/dist/{chunk-2WMXZYMS.js.map → chunk-HZZIH5SW.js.map} +0 -0
  207. /package/dist/{chunk-YHU5XUF4.js.map → chunk-IFCKHPY4.js.map} +0 -0
  208. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  209. /package/dist/{chunk-2VV3XLZB.js.map → chunk-IXLHREAB.js.map} +0 -0
  210. /package/dist/{chunk-2XGPN5TL.js.map → chunk-JLNJ7AGH.js.map} +0 -0
  211. /package/dist/{chunk-B6RTKSOT.js.map → chunk-KK6TS7ED.js.map} +0 -0
  212. /package/dist/{chunk-HW4DKAAA.js.map → chunk-KSJP3AWY.js.map} +0 -0
  213. /package/dist/{chunk-6E5GYDIE.js.map → chunk-MFZACYZ6.js.map} +0 -0
  214. /package/dist/{chunk-NEARGPN7.js.map → chunk-ML64HXAN.js.map} +0 -0
  215. /package/dist/{chunk-BGBW4H7C.js.map → chunk-NKIK4VFP.js.map} +0 -0
  216. /package/dist/{chunk-KNPWG3VI.js.map → chunk-NNPJWVGN.js.map} +0 -0
  217. /package/dist/{chunk-WXPIEWQW.js.map → chunk-NS2SFWKC.js.map} +0 -0
  218. /package/dist/{chunk-VQJ7UAKA.js.map → chunk-NVPE6AJ3.js.map} +0 -0
  219. /package/dist/{chunk-GRSFFLUY.js.map → chunk-OMU54WOM.js.map} +0 -0
  220. /package/dist/{chunk-JUOJGZPV.js.map → chunk-PDY7C73D.js.map} +0 -0
  221. /package/dist/{chunk-UBCVHKZQ.js.map → chunk-QNUK4SUE.js.map} +0 -0
  222. /package/dist/{chunk-NZUHZVHF.js.map → chunk-QOL6OTIK.js.map} +0 -0
  223. /package/dist/{chunk-BICNRVEC.js.map → chunk-QWUJWBZ5.js.map} +0 -0
  224. /package/dist/{chunk-OVO545UE.js.map → chunk-QXDZYPBL.js.map} +0 -0
  225. /package/dist/{chunk-W7PY7IIB.js.map → chunk-RBAG3VUT.js.map} +0 -0
  226. /package/dist/{chunk-WJPRWNZN.js.map → chunk-RWQXTR35.js.map} +0 -0
  227. /package/dist/{chunk-BIKX37D2.js.map → chunk-SIV2ENTD.js.map} +0 -0
  228. /package/dist/{chunk-YEHKKZ5T.js.map → chunk-SYTPPMCM.js.map} +0 -0
  229. /package/dist/{chunk-2ZU6CYTJ.js.map → chunk-T3XDF5RO.js.map} +0 -0
  230. /package/dist/{chunk-SUI5JQVE.js.map → chunk-UHQ5UPAQ.js.map} +0 -0
  231. /package/dist/{chunk-RDWVTUXZ.js.map → chunk-V6ULW25E.js.map} +0 -0
  232. /package/dist/{chunk-FN6E373Q.js.map → chunk-VE456O3R.js.map} +0 -0
  233. /package/dist/{chunk-VDKZTNG5.js.map → chunk-VSBY5HAI.js.map} +0 -0
  234. /package/dist/{chunk-LMMQKZK3.js.map → chunk-VZBW6CDG.js.map} +0 -0
  235. /package/dist/{chunk-RFVF5PLN.js.map → chunk-WZGSSLYI.js.map} +0 -0
  236. /package/dist/{chunk-TRLPF7ZP.js.map → chunk-Y4IQFWGD.js.map} +0 -0
  237. /package/dist/{chunk-WQZZDN5M.js.map → chunk-ZHOXXHT5.js.map} +0 -0
  238. /package/dist/{chunk-5I63ZRIH.js.map → chunk-ZIJ5FAI4.js.map} +0 -0
  239. /package/dist/{chunk-BSCR5TEN.js.map → chunk-ZL3Q4OWJ.js.map} +0 -0
  240. /package/dist/{chunk-MQTCNXTG.js.map → chunk-ZMV67JXV.js.map} +0 -0
  241. /package/dist/{graph-edge-decay-ROSUPDX3.js.map → config-search-backend.js.map} +0 -0
@@ -125,6 +125,10 @@ import { applySemanticMergeAtPersist, runMergedTargetPostEffects, writeMergedVer
125
125
  import { buildMergedTargetPromotionPayload } from "./semantic-merge-promotion-payload.js";
126
126
  import { persistMergedTargetThreadEpisode } from "./semantic-merge-commit-effects.js";
127
127
  import { ExtractionAnchorSnapshot } from "./extraction-anchor-snapshot.js";
128
+ import {
129
+ applyInlineCitation as applyInlineCitationToContent,
130
+ normalizeStoredHashSource as normalizeStoredHashSourceContent,
131
+ } from "./extraction-persist-citation.js";
128
132
 
129
133
  export class ExtractionPersistCoordinator {
130
134
  constructor(
@@ -145,26 +149,12 @@ export class ExtractionPersistCoordinator {
145
149
  sourceContext?: ExtractionSourceContext,
146
150
  baseNamespace?: string,
147
151
  scopeProfileWritePlan?: ResolvedScopeProfilePlan | null,
148
- /** Verbatim source turn text the facts were extracted from (faithfulness gate #1576). */
149
152
  sourceText?: string,
150
153
  graphCaps: GraphConstructionCapabilitySet = resolveGraphConstructionCapabilities(this.deps.config),
151
154
  lifecycleCaps: MemoryLifecycleCapabilitySet = resolveMemoryLifecycleCapabilities(this.deps.config),
152
155
  ): Promise<{ persistedIds: string[]; memoryPathById: Map<string, string> }> {
153
- // Inline source attribution (issue #369). When enabled, every extracted
154
- // fact is rewritten to carry a compact provenance tag inside its body so
155
- // the citation survives hostile memory text, copy/paste, and LLM quoting.
156
- // The helper is a no-op when the feature flag is off, so legacy pipelines
157
- // see zero behavioral change.
158
156
  const citationEnabled = resolvePipelineProcessingCapabilities(this.deps.config).inlineSourceAttribution === true;
159
157
  const citationTemplate = this.deps.config.inlineSourceAttributionFormat;
160
- // #1909: the main-path fact writes defer their per-fact fact-hash-index flush
161
- // to the orchestrator's end-of-persist reconciling batch save ONLY when fact
162
- // deduplication is enabled (with it off, contentHashIndexForStorage() returns
163
- // null and the batch save is a no-op, so the write must save immediately).
164
- // Round 11: there is NO fact-hashes.ready marker anymore — the fact-hash
165
- // index is ALWAYS rebuilt from the corpus on restart (see
166
- // ensureFactHashIndexAuthoritative), so a deferred write, crash, or
167
- // multi-process interleave is safe by construction with no marker to guard.
168
158
  const factDedupEnabled = resolveRecallAuxiliaryCapabilities(this.deps.config).factDeduplication;
169
159
  const harmonicConstructionEnabled = resolveCapabilities(this.deps.config).harmonicRetrieval;
170
160
  const harmonicAnchorsEnabled =
@@ -182,40 +172,16 @@ export class ExtractionPersistCoordinator {
182
172
  let harmonicSourceOrder = 0;
183
173
  const promotedCopyProbe = createBatchPromotedCopyProbe(this.deps.config, this.deps.getStorageRouter, scopeProfileWritePlan); // #2330 finding F: one promoted-copy scan per namespace per batch
184
174
 
185
- // Canonicalize stored content for dedup comparison: strip citations
186
- // (using the same template), sanitize, then normalize whitespace.
187
- const normalizeStoredHashSource = (raw: string): string =>
188
- ContentHashIndex.normalizeContent(
189
- sanitizeMemoryContent(
190
- citationEnabled && hasCitationForTemplate(raw, citationTemplate)
191
- ? stripCitationForTemplate(raw, citationTemplate)
192
- : raw,
193
- ).text,
194
- );
195
- // The stable fields (agent, session) are computed once; `ts` is intentionally
196
- // omitted here and added fresh per invocation so each fact in a large batch
197
- // gets its own insertion timestamp rather than sharing a single batch-start time.
175
+ const normalizeStoredHashSource = (raw: string): string =>
176
+ normalizeStoredHashSourceContent(raw, citationEnabled, citationTemplate);
198
177
  const citationContextBase: Omit<CitationContext, "ts"> = citationEnabled
199
178
  ? {
200
179
  agent: sourceContext?.principal,
201
180
  session: sourceContext?.sessionKey,
202
181
  }
203
182
  : {};
204
- const applyInlineCitation = (content: string): string => {
205
- if (!citationEnabled) return content;
206
- if (typeof content !== "string" || content.length === 0) return content;
207
- // Build a fresh CitationContext per call so `ts` reflects the actual
208
- // insertion time of each individual fact rather than the batch-start time.
209
- const citationContext: CitationContext = {
210
- ...citationContextBase,
211
- ts: new Date().toISOString(),
212
- };
213
- // `attachCitation` already calls `hasCitationForTemplate` internally and
214
- // is a no-op when the content already carries a citation (default or
215
- // custom template). The outer check was redundant and has been removed
216
- // to avoid a maintenance hazard where the two guard paths could diverge.
217
- return attachCitation(content, citationContext, citationTemplate);
218
- };
183
+ const applyInlineCitation = (content: string): string =>
184
+ applyInlineCitationToContent(content, citationEnabled, citationTemplate, citationContextBase);
219
185
  const persistedIds: string[] = [];
220
186
  const memoryPathById = new Map<string, string>();
221
187
  const anchorSnapshots = new ExtractionAnchorSnapshot({