@remnic/core 9.69.33 → 9.69.35

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 (766) hide show
  1. package/dist/access-admin-ops-surface.d.ts +14 -11
  2. package/dist/access-admin-ops-surface.js +65 -60
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +14 -11
  5. package/dist/access-authorization-probe.js +66 -61
  6. package/dist/access-boundary.d.ts +14 -11
  7. package/dist/access-boundary.js +65 -60
  8. package/dist/access-cli.js +137 -133
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +3 -1
  11. package/dist/access-coding-context-resolution.js +3 -3
  12. package/dist/access-extraction-force-flush.d.ts +14 -11
  13. package/dist/access-extraction-force-flush.js +65 -60
  14. package/dist/access-health-types.d.ts +3 -1
  15. package/dist/access-http-briefing.d.ts +14 -11
  16. package/dist/access-http-briefing.js +66 -61
  17. package/dist/access-http-lcm-compaction.d.ts +14 -11
  18. package/dist/access-http-lifecycle-flush.d.ts +14 -11
  19. package/dist/access-http-offline-stream.d.ts +14 -11
  20. package/dist/access-http-query.d.ts +4 -2
  21. package/dist/access-http-query.js +67 -62
  22. package/dist/access-http.d.ts +15 -12
  23. package/dist/access-http.js +86 -82
  24. package/dist/access-identity-continuity-surface.d.ts +12 -9
  25. package/dist/access-identity-continuity-surface.js +65 -60
  26. package/dist/access-lcm-surface.d.ts +14 -11
  27. package/dist/access-lcm-surface.js +65 -60
  28. package/dist/access-mcp.d.ts +14 -11
  29. package/dist/access-mcp.js +74 -70
  30. package/dist/access-memory-search-fanout.d.ts +4 -2
  31. package/dist/{access-namespace-preflight-DMR-jOMS.d.ts → access-namespace-preflight-D8qri11P.d.ts} +1 -1
  32. package/dist/access-namespace-preflight.d.ts +5 -3
  33. package/dist/access-namespace-preflight.js +65 -60
  34. package/dist/access-observe-transcript.d.ts +12 -9
  35. package/dist/access-observe-transcript.js +3 -3
  36. package/dist/access-observe-write-surface.d.ts +16 -13
  37. package/dist/access-observe-write-surface.js +65 -60
  38. package/dist/access-offline-manifest.d.ts +48 -11
  39. package/dist/access-offline-manifest.js +18 -16
  40. package/dist/access-operations-batch.js +68 -64
  41. package/dist/access-operations.d.ts +15 -12
  42. package/dist/access-operations.js +73 -69
  43. package/dist/access-recall-concurrency.d.ts +14 -11
  44. package/dist/access-recall-concurrency.js +65 -60
  45. package/dist/access-recall-response.d.ts +14 -11
  46. package/dist/access-recall-response.js +65 -60
  47. package/dist/access-recall-surface.d.ts +14 -11
  48. package/dist/access-recall-surface.js +65 -60
  49. package/dist/access-schema.d.ts +56 -13
  50. package/dist/access-schema.js +15 -1
  51. package/dist/{access-service-CJQoQvRa.d.ts → access-service-CKu5ixg9.d.ts} +52 -50
  52. package/dist/access-service-helpers.d.ts +14 -11
  53. package/dist/access-service.d.ts +14 -11
  54. package/dist/access-service.js +65 -60
  55. package/dist/access-surface-catalog.d.ts +14 -11
  56. package/dist/access-surface-catalog.js +67 -62
  57. package/dist/access-surface-catalog.js.map +1 -1
  58. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  59. package/dist/action-confidence.d.ts +3 -1
  60. package/dist/active-memory-bridge.d.ts +3 -1
  61. package/dist/active-memory-bridge.js +2 -2
  62. package/dist/active-recall.d.ts +3 -1
  63. package/dist/active-recall.js +12 -10
  64. package/dist/active-recall.js.map +1 -1
  65. package/dist/activity/digest.d.ts +3 -1
  66. package/dist/adapters/index.d.ts +46 -1
  67. package/dist/adapters/index.js +10 -6
  68. package/dist/adapters/registry.js +2 -2
  69. package/dist/ambient-provenance.d.ts +3 -1
  70. package/dist/artifact-search.d.ts +3 -1
  71. package/dist/{auto-sync-NSHLUAQI.js → auto-sync-4YFATLFQ.js} +10 -9
  72. package/dist/{auto-sync-NSHLUAQI.js.map → auto-sync-4YFATLFQ.js.map} +1 -1
  73. package/dist/behavior-learner.d.ts +3 -1
  74. package/dist/behavior-signals.d.ts +3 -1
  75. package/dist/bootstrap.d.ts +12 -9
  76. package/dist/briefing-window.d.ts +4 -2
  77. package/dist/briefing.d.ts +4 -2
  78. package/dist/briefing.js +26 -25
  79. package/dist/buffer-surprise-report.d.ts +3 -1
  80. package/dist/buffer-turn-helpers.d.ts +3 -1
  81. package/dist/buffer.d.ts +4 -2
  82. package/dist/buffer.js +11 -10
  83. package/dist/bulk-import/index.d.ts +5 -3
  84. package/dist/calibration.d.ts +3 -1
  85. package/dist/calibration.js +3 -2
  86. package/dist/calibration.js.map +1 -1
  87. package/dist/capabilities.d.ts +3 -1
  88. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-ZCXUPLNJ.js} +2 -2
  89. package/dist/{catalog-8O9KY9eA.d.ts → catalog-Bq1AxZwF.d.ts} +1 -1
  90. package/dist/causal-behavior.d.ts +3 -1
  91. package/dist/causal-consolidation.d.ts +3 -1
  92. package/dist/causal-consolidation.js +27 -26
  93. package/dist/causal-consolidation.js.map +1 -1
  94. package/dist/causal-trajectory-graph.d.ts +3 -1
  95. package/dist/{chunk-CDKHKZL5.js → chunk-2524MOWK.js} +2 -2
  96. package/dist/{chunk-HVAEXYPL.js → chunk-255PC37A.js} +47 -25
  97. package/dist/chunk-255PC37A.js.map +1 -0
  98. package/dist/{chunk-2C3S7J2S.js → chunk-2BQ4ZIWC.js} +741 -28
  99. package/dist/chunk-2BQ4ZIWC.js.map +1 -0
  100. package/dist/{chunk-RKBLRTNT.js → chunk-2YLMUME2.js} +2 -2
  101. package/dist/{chunk-QOIOACIE.js → chunk-326KUXIR.js} +15 -648
  102. package/dist/chunk-326KUXIR.js.map +1 -0
  103. package/dist/{chunk-DBQWVT2H.js → chunk-3CBI2ZSA.js} +2 -2
  104. package/dist/{chunk-MWFGUESQ.js → chunk-3FJKJ5UZ.js} +2 -2
  105. package/dist/{chunk-NZXEK3UF.js → chunk-3Q3N35W7.js} +2 -2
  106. package/dist/{chunk-YYGZJPOK.js → chunk-42DJ235G.js} +2 -2
  107. package/dist/{chunk-SO7SV523.js → chunk-4MDKNUV4.js} +1 -1
  108. package/dist/chunk-4MDKNUV4.js.map +1 -0
  109. package/dist/chunk-5HYUUFMQ.js +1280 -0
  110. package/dist/chunk-5HYUUFMQ.js.map +1 -0
  111. package/dist/{chunk-2JVJ7UHC.js → chunk-5JG5EBVL.js} +4 -2
  112. package/dist/chunk-5JG5EBVL.js.map +1 -0
  113. package/dist/{chunk-HV7OY4DM.js → chunk-5VAF4ID4.js} +643 -202
  114. package/dist/chunk-5VAF4ID4.js.map +1 -0
  115. package/dist/{chunk-N7RWREIQ.js → chunk-65RENJGB.js} +6 -1
  116. package/dist/chunk-65RENJGB.js.map +1 -0
  117. package/dist/{chunk-JTH2SE6B.js → chunk-6J6K3STG.js} +8 -8
  118. package/dist/{chunk-H4VH5VIB.js → chunk-776GVKL7.js} +2 -2
  119. package/dist/{chunk-BUTCAMJM.js → chunk-A2YQL2FF.js} +5 -5
  120. package/dist/chunk-A5UQ52YQ.js +211 -0
  121. package/dist/chunk-A5UQ52YQ.js.map +1 -0
  122. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  123. package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
  124. package/dist/{chunk-B325AGLK.js → chunk-AZSKROVQ.js} +2 -2
  125. package/dist/{chunk-I5DZ3WGR.js → chunk-BJETIR53.js} +3 -3
  126. package/dist/{chunk-JT3EB7ZL.js → chunk-BNGHPYZU.js} +5 -5
  127. package/dist/chunk-BRZWWUCJ.js +13 -0
  128. package/dist/{chunk-FYDW33ZB.js.map → chunk-BRZWWUCJ.js.map} +1 -1
  129. package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
  130. package/dist/{chunk-5NANRSCD.js → chunk-CNV2A557.js} +5 -5
  131. package/dist/{chunk-PBGVVDLY.js → chunk-DK4X5B6I.js} +2 -2
  132. package/dist/{chunk-MFDTVQJX.js → chunk-DVOBLPSQ.js} +22 -7
  133. package/dist/chunk-DVOBLPSQ.js.map +1 -0
  134. package/dist/{chunk-N2ZNPHA3.js → chunk-ECKG5WSI.js} +2 -2
  135. package/dist/{chunk-PYLL63BF.js → chunk-EEBQFG5E.js} +9 -9
  136. package/dist/{chunk-ET356KSB.js → chunk-F4TWWUMP.js} +2 -2
  137. package/dist/{chunk-RHQMKJFG.js → chunk-F6IVBYFS.js} +55 -51
  138. package/dist/{chunk-RHQMKJFG.js.map → chunk-F6IVBYFS.js.map} +1 -1
  139. package/dist/{chunk-CLLPJ6QT.js → chunk-FQXJAC3T.js} +2 -2
  140. package/dist/{chunk-JGHXXQ2G.js → chunk-FVJ4D6L7.js} +2 -2
  141. package/dist/{chunk-DD5JFCWM.js → chunk-GCBIXUPT.js} +2 -2
  142. package/dist/{chunk-MN3LK3KN.js → chunk-GLZH5VEN.js} +2 -2
  143. package/dist/{chunk-S7T2TY65.js → chunk-HC4GFLMQ.js} +3 -3
  144. package/dist/{chunk-EQHDH4C2.js → chunk-HUT2JR6I.js} +3 -3
  145. package/dist/{chunk-UUQG7HAD.js → chunk-HXSAWV3A.js} +4 -4
  146. package/dist/{chunk-XXIHX75O.js → chunk-J7PB5UQ4.js} +3 -3
  147. package/dist/{chunk-UGPUYIET.js → chunk-JHZCXUQI.js} +221 -400
  148. package/dist/chunk-JHZCXUQI.js.map +1 -0
  149. package/dist/{chunk-LTIZHLV7.js → chunk-JR6H5CYS.js} +2 -2
  150. package/dist/{chunk-FCSZ4K2X.js → chunk-JR6PP7UM.js} +3 -3
  151. package/dist/{chunk-TCUKRAMK.js → chunk-JRWW7GM6.js} +10 -10
  152. package/dist/{chunk-Q726HSJO.js → chunk-JSRVXI6E.js} +16 -15
  153. package/dist/chunk-JSRVXI6E.js.map +1 -0
  154. package/dist/{chunk-DB5TGMLZ.js → chunk-JZ2CHRLB.js} +6 -4
  155. package/dist/{chunk-DB5TGMLZ.js.map → chunk-JZ2CHRLB.js.map} +1 -1
  156. package/dist/{chunk-JEIXTYVG.js → chunk-L2QLDZJC.js} +46 -17
  157. package/dist/chunk-L2QLDZJC.js.map +1 -0
  158. package/dist/{chunk-PL7FYKHT.js → chunk-L2WQVSKP.js} +2 -2
  159. package/dist/{chunk-JSN44KIB.js → chunk-LEMD7WZJ.js} +9 -9
  160. package/dist/{chunk-VZWXFXLX.js → chunk-LMCD5W5B.js} +2 -2
  161. package/dist/{chunk-7BMXZCOT.js → chunk-LNDLXMH6.js} +3 -3
  162. package/dist/{chunk-3QQTXYZ6.js → chunk-LSLCFCCQ.js} +2 -1
  163. package/dist/chunk-LSLCFCCQ.js.map +1 -0
  164. package/dist/{chunk-EONF76DT.js → chunk-LYDJRF45.js} +2 -2
  165. package/dist/{chunk-MKD3OMPS.js → chunk-M3MYMWXG.js} +2 -2
  166. package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
  167. package/dist/{chunk-A7XEPMQ6.js → chunk-MVAQ2WM3.js} +6 -6
  168. package/dist/chunk-MVAQ2WM3.js.map +1 -0
  169. package/dist/{chunk-6N3TQFZU.js → chunk-NN4JEFON.js} +3 -3
  170. package/dist/chunk-NPNSKE76.js +220 -0
  171. package/dist/chunk-NPNSKE76.js.map +1 -0
  172. package/dist/{chunk-MOZXTRC2.js → chunk-OQ7SSRXP.js} +19 -19
  173. package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
  174. package/dist/{chunk-4MHYKEOM.js → chunk-OS2AT2JU.js} +10 -10
  175. package/dist/{chunk-N57A4KPV.js → chunk-P3ONDDIJ.js} +2 -2
  176. package/dist/chunk-PCEYGOSL.js +66 -0
  177. package/dist/chunk-PCEYGOSL.js.map +1 -0
  178. package/dist/{chunk-R3HKWWUB.js → chunk-PHP3MUGF.js} +2 -2
  179. package/dist/{chunk-EEOUMG3J.js → chunk-PWPIERBM.js} +38 -6
  180. package/dist/chunk-PWPIERBM.js.map +1 -0
  181. package/dist/chunk-Q4AUIFUA.js +111 -0
  182. package/dist/chunk-Q4AUIFUA.js.map +1 -0
  183. package/dist/{chunk-P3SB5BNT.js → chunk-QATYVTP7.js} +2 -2
  184. package/dist/{chunk-LSYDG6MJ.js → chunk-QBLDCI6E.js} +2 -2
  185. package/dist/{chunk-KCB7F4J7.js → chunk-QURNMKME.js} +2 -2
  186. package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
  187. package/dist/{chunk-XXE5P6HJ.js → chunk-RRZKTSFG.js} +2 -2
  188. package/dist/{chunk-44T3Y7SZ.js → chunk-RUXPVSML.js} +5 -5
  189. package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
  190. package/dist/{chunk-H272ZPQ3.js → chunk-SHEHQBCG.js} +124 -23
  191. package/dist/chunk-SHEHQBCG.js.map +1 -0
  192. package/dist/{chunk-EEC4PCG5.js → chunk-SZDLX763.js} +2 -2
  193. package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
  194. package/dist/{chunk-227UFSEQ.js → chunk-TFA6HPOA.js} +2 -2
  195. package/dist/{chunk-BA6WOZOT.js → chunk-TK4FHQRN.js} +4 -4
  196. package/dist/{chunk-W27OW7AB.js → chunk-TKFSXDOB.js} +2 -2
  197. package/dist/chunk-TLHNF6GA.js +647 -0
  198. package/dist/chunk-TLHNF6GA.js.map +1 -0
  199. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  200. package/dist/{chunk-FDLDOEO6.js → chunk-UBG4GAEP.js} +51 -6
  201. package/dist/chunk-UBG4GAEP.js.map +1 -0
  202. package/dist/{chunk-CETXNLEX.js → chunk-UDZYNIDJ.js} +2 -2
  203. package/dist/{chunk-H5AFCNGA.js → chunk-UJX4I26O.js} +2 -2
  204. package/dist/{chunk-E6TDQRF6.js → chunk-UYUCCQ46.js} +2 -2
  205. package/dist/{chunk-BLUYQFRH.js → chunk-VELCIWJZ.js} +15 -11
  206. package/dist/chunk-VELCIWJZ.js.map +1 -0
  207. package/dist/{chunk-OQDPBRQ6.js → chunk-VYXDUPYE.js} +2 -2
  208. package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
  209. package/dist/chunk-W6IJMWTZ.js +72 -0
  210. package/dist/chunk-W6IJMWTZ.js.map +1 -0
  211. package/dist/{chunk-NB5BCFUY.js → chunk-WHHEPAO3.js} +4 -4
  212. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  213. package/dist/{chunk-TX2UTLXC.js → chunk-WPDKBUWX.js} +2 -2
  214. package/dist/{chunk-YFLLGRXO.js → chunk-X2QPKLPL.js} +2 -2
  215. package/dist/{chunk-PFFZWDPE.js → chunk-XCOV45MO.js} +3 -3
  216. package/dist/{chunk-5BCNEBEN.js → chunk-XPJNT6PI.js} +4 -4
  217. package/dist/chunk-XW2T4QAW.js +1 -0
  218. package/dist/{chunk-J7HFPA6O.js → chunk-Y63ZFP4X.js} +2 -2
  219. package/dist/{chunk-D223ZDQV.js → chunk-YEDVOYL2.js} +2 -2
  220. package/dist/{chunk-TLPZ6MKZ.js → chunk-YEN4TREG.js} +541 -5
  221. package/dist/chunk-YEN4TREG.js.map +1 -0
  222. package/dist/{chunk-22FVR2KE.js → chunk-YJ6VCDMZ.js} +6 -2
  223. package/dist/chunk-YJ6VCDMZ.js.map +1 -0
  224. package/dist/{chunk-RC5DXXWC.js → chunk-YM7YN37H.js} +2 -2
  225. package/dist/{chunk-BPJNF7J2.js → chunk-YNN26CIZ.js} +2 -2
  226. package/dist/{chunk-VLXBE57O.js → chunk-YVGXH72Y.js} +2 -2
  227. package/dist/{chunk-YQAXP5AC.js → chunk-YXLUTALO.js} +5 -5
  228. package/dist/{chunk-DGGB65KC.js → chunk-Z7ACR6MJ.js} +3 -3
  229. package/dist/{chunk-X35W4S3L.js → chunk-ZBEGS7OB.js} +4 -4
  230. package/dist/{chunk-O75CRYGF.js → chunk-ZEFVK7XC.js} +1 -1
  231. package/dist/chunk-ZEFVK7XC.js.map +1 -0
  232. package/dist/{chunk-XUE46UYW.js → chunk-ZLN7AROH.js} +6 -6
  233. package/dist/{chunk-E6JA6XWY.js → chunk-ZTG4P7NZ.js} +1013 -1317
  234. package/dist/chunk-ZTG4P7NZ.js.map +1 -0
  235. package/dist/{chunk-HK32G473.js → chunk-ZWEZXVYH.js} +2 -2
  236. package/dist/{cli-D57e2Mqt.d.ts → cli-Bk7Ctql4.d.ts} +5 -5
  237. package/dist/cli-fallback.d.ts +11 -4
  238. package/dist/cli-fallback.js +5 -1
  239. package/dist/cli.d.ts +16 -13
  240. package/dist/cli.js +107 -103
  241. package/dist/coding/export-okf-codegraph.d.ts +3 -1
  242. package/dist/coding/export-okf-codegraph.js +32 -30
  243. package/dist/coding/export-okf-codegraph.js.map +1 -1
  244. package/dist/coding/pre-action-gate.d.ts +3 -1
  245. package/dist/compat/checks.js +2 -2
  246. package/dist/compat/codex-cli-fallback.d.ts +1 -1
  247. package/dist/compat/codex-cli-fallback.js +5 -1
  248. package/dist/compat/codex-cli-fallback.js.map +1 -1
  249. package/dist/compounding/engine.d.ts +4 -2
  250. package/dist/compounding/engine.js +27 -26
  251. package/dist/compounding/preference-consolidator.d.ts +3 -1
  252. package/dist/compression-optimizer.d.ts +3 -1
  253. package/dist/config.d.ts +3 -1
  254. package/dist/config.js +12 -10
  255. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  256. package/dist/connectors/codex-materialize-runner.js +26 -25
  257. package/dist/connectors/codex-materialize.d.ts +3 -1
  258. package/dist/connectors/index.d.ts +3 -1
  259. package/dist/connectors/index.js +28 -27
  260. package/dist/consolidation-provenance-check.d.ts +4 -2
  261. package/dist/consolidation-undo.d.ts +4 -2
  262. package/dist/contradiction/index.d.ts +5 -3
  263. package/dist/contradiction/index.js +5 -5
  264. package/dist/{contradiction-scan-NOYMFG66.js → contradiction-scan-GVD4JJ7B.js} +3 -3
  265. package/dist/converge-config.d.ts +3 -1
  266. package/dist/convergence-refresh.d.ts +4 -2
  267. package/dist/convergence-refresh.js +28 -27
  268. package/dist/conversation-index/backend.d.ts +3 -1
  269. package/dist/conversation-index/backend.js +3 -3
  270. package/dist/conversation-index/chunker.d.ts +3 -1
  271. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  272. package/dist/conversation-index/faiss-adapter.js +2 -2
  273. package/dist/conversation-index/indexer.d.ts +3 -1
  274. package/dist/conversation-index/search.d.ts +3 -1
  275. package/dist/corpus-watermark.d.ts +3 -1
  276. package/dist/corpus-watermark.js +29 -28
  277. package/dist/cross-lingual-recall.d.ts +3 -1
  278. package/dist/day-summary.d.ts +3 -1
  279. package/dist/deep-recall-http-glue.d.ts +14 -11
  280. package/dist/deep-recall-http-glue.js +12 -2
  281. package/dist/deep-recall-mcp-tools.d.ts +14 -11
  282. package/dist/deep-recall-policy-llm.d.ts +3 -1
  283. package/dist/deep-recall-policy-llm.js +4 -3
  284. package/dist/deep-recall-seeds.d.ts +3 -1
  285. package/dist/delinearize.d.ts +3 -1
  286. package/dist/dependency-propagation-config.d.ts +3 -1
  287. package/dist/{dependency-propagation-delivery-CmniEsUK.d.ts → dependency-propagation-delivery-DLiAtj25.d.ts} +1 -1
  288. package/dist/direct-answer-wiring.d.ts +3 -1
  289. package/dist/direct-answer.d.ts +3 -1
  290. package/dist/embedding-fallback.d.ts +3 -1
  291. package/dist/enrichment/index.d.ts +3 -1
  292. package/dist/entity-origin-fields.d.ts +3 -1
  293. package/dist/entity-retrieval.d.ts +4 -2
  294. package/dist/entity-retrieval.js +26 -25
  295. package/dist/entity-schema.d.ts +3 -1
  296. package/dist/episodic-context.d.ts +3 -1
  297. package/dist/eval-trajectory-contracts.d.ts +3 -1
  298. package/dist/eval-trajectory-store.d.ts +3 -1
  299. package/dist/eval-trajectory.d.ts +3 -1
  300. package/dist/explicit-capture.d.ts +12 -9
  301. package/dist/explicit-capture.js +6 -6
  302. package/dist/external-wiki-access.d.ts +14 -11
  303. package/dist/external-wiki-access.js +66 -61
  304. package/dist/external-wiki-collection-registration.d.ts +3 -1
  305. package/dist/external-wiki-collection.d.ts +3 -1
  306. package/dist/external-wiki-mcp-tools.d.ts +14 -11
  307. package/dist/extraction-error-classification.d.ts +3 -1
  308. package/dist/extraction-faithfulness.d.ts +3 -1
  309. package/dist/extraction-faithfulness.js +4 -3
  310. package/dist/extraction-judge-telemetry.d.ts +3 -1
  311. package/dist/extraction-judge-training.d.ts +3 -1
  312. package/dist/extraction-judge.d.ts +3 -1
  313. package/dist/extraction-judge.js +5 -4
  314. package/dist/extraction-liveness.d.ts +3 -1
  315. package/dist/extraction-normalization.d.ts +3 -1
  316. package/dist/extraction-prompt.d.ts +3 -1
  317. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  318. package/dist/extraction-source-grounding.d.ts +3 -1
  319. package/dist/extraction.d.ts +3 -1
  320. package/dist/extraction.js +38 -36
  321. package/dist/fallback-llm.d.ts +3 -1
  322. package/dist/fallback-llm.js +3 -2
  323. package/dist/{first-start-migration-RC345GPL.js → first-start-migration-L3UFX5CU.js} +3 -3
  324. package/dist/generic-recall-paths-DbitKJI5.d.ts +23 -0
  325. package/dist/graph-append-error.d.ts +3 -1
  326. package/dist/graph-dashboard-diff.d.ts +3 -1
  327. package/dist/graph-dashboard-key.d.ts +3 -1
  328. package/dist/graph-dashboard-parser.d.ts +3 -1
  329. package/dist/graph-edge-reinforcement.d.ts +3 -1
  330. package/dist/graph-jsonl.d.ts +3 -1
  331. package/dist/graph-path-reconstruction.d.ts +3 -1
  332. package/dist/graph-path-scoring.d.ts +3 -1
  333. package/dist/graph-snapshot.d.ts +3 -1
  334. package/dist/graph.d.ts +3 -1
  335. package/dist/harmonic-retrieval.js +2 -2
  336. package/dist/importance.d.ts +3 -1
  337. package/dist/importers/index.d.ts +3 -1
  338. package/dist/importers/test-utils.d.ts +3 -1
  339. package/dist/in-flight-reads.d.ts +3 -1
  340. package/dist/{index-BTAsSkPG.d.ts → index-BINUgPFo.d.ts} +2 -2
  341. package/dist/index.d.ts +303 -245
  342. package/dist/index.js +316 -214
  343. package/dist/intent.d.ts +3 -1
  344. package/dist/lcm/engine.d.ts +3 -1
  345. package/dist/lcm/engine.js +2 -2
  346. package/dist/lcm/index.d.ts +3 -1
  347. package/dist/lcm/index.js +7 -7
  348. package/dist/lcm/tools.d.ts +3 -1
  349. package/dist/lifecycle.d.ts +3 -1
  350. package/dist/live-connectors-runner.d.ts +3 -1
  351. package/dist/local-llm-config.d.ts +26 -0
  352. package/dist/local-llm-config.js +1 -0
  353. package/dist/local-llm.d.ts +5 -1
  354. package/dist/local-llm.js +3 -3
  355. package/dist/local-model-endpoint.d.ts +3 -1
  356. package/dist/location/index.d.ts +5 -3
  357. package/dist/location/index.js +29 -28
  358. package/dist/maintenance/memory-governance.d.ts +3 -1
  359. package/dist/maintenance/memory-governance.js +26 -25
  360. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  361. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +26 -25
  362. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  363. package/dist/maintenance/rebuild-memory-projection.js +27 -26
  364. package/dist/{maintenance-DCvQGTzL.d.ts → maintenance-ag1gYztC.d.ts} +378 -4
  365. package/dist/mcp-memory-inspector-app.d.ts +14 -11
  366. package/dist/memory-action-policy.d.ts +3 -1
  367. package/dist/memory-cache.d.ts +3 -1
  368. package/dist/memory-controller.d.ts +3 -1
  369. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  370. package/dist/memory-projection-store.d.ts +3 -1
  371. package/dist/memory-provenance.d.ts +3 -1
  372. package/dist/memory-snapshot.d.ts +3 -1
  373. package/dist/memory-subject-cli.d.ts +14 -11
  374. package/dist/memory-subject.d.ts +14 -11
  375. package/dist/memory-worth-outcomes.d.ts +4 -2
  376. package/dist/migrate/from-engram.js +2 -2
  377. package/dist/models-json.d.ts +3 -1
  378. package/dist/namespaces/migrate.d.ts +5 -3
  379. package/dist/namespaces/migrate.js +27 -26
  380. package/dist/namespaces/principal.d.ts +3 -1
  381. package/dist/namespaces/search.d.ts +3 -1
  382. package/dist/namespaces/search.js +8 -8
  383. package/dist/namespaces/storage.d.ts +5 -3
  384. package/dist/namespaces/storage.js +26 -25
  385. package/dist/native-knowledge.d.ts +3 -1
  386. package/dist/network/tailscale.js +2 -2
  387. package/dist/offline-sync-impression-drain.d.ts +3 -1
  388. package/dist/offline-sync-impression-drain.js +6 -6
  389. package/dist/operator-doctor-corpus.d.ts +3 -1
  390. package/dist/operator-doctor-corpus.js +30 -29
  391. package/dist/operator-doctor-replica.d.ts +3 -1
  392. package/dist/operator-toolkit.d.ts +5 -3
  393. package/dist/operator-toolkit.js +44 -42
  394. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  395. package/dist/orchestration/maintenance.d.ts +6 -4
  396. package/dist/orchestration/maintenance.js +44 -39
  397. package/dist/{orchestrator-CvCsp1tz.d.ts → orchestrator-Cf3G-3Ed.d.ts} +17 -29
  398. package/dist/orchestrator.d.ts +12 -9
  399. package/dist/orchestrator.js +141 -135
  400. package/dist/patterns-cli.d.ts +3 -1
  401. package/dist/{pipeline-JAdwKBS7.d.ts → pipeline-AwB03fw_.d.ts} +1 -1
  402. package/dist/policy-runtime.d.ts +3 -1
  403. package/dist/proactive-contention.d.ts +3 -1
  404. package/dist/provenance.d.ts +3 -1
  405. package/dist/{public-http-h-yWu9rj.d.ts → public-http-BetSQn7q.d.ts} +1 -1
  406. package/dist/{qmd-Cvw9RWKr.d.ts → qmd-Bfaydrfm.d.ts} +1 -1
  407. package/dist/qmd-preflight.d.ts +4 -2
  408. package/dist/qmd-recall-cache.d.ts +3 -1
  409. package/dist/qmd.d.ts +4 -2
  410. package/dist/qmd.js +2 -2
  411. package/dist/recall-concurrency-config.d.ts +3 -1
  412. package/dist/recall-disclosure-escalation.d.ts +3 -1
  413. package/dist/recall-explain-renderer.d.ts +3 -1
  414. package/dist/recall-explain-renderer.js +3 -3
  415. package/dist/recall-memory-map.d.ts +3 -1
  416. package/dist/recall-navigate-access.d.ts +3 -1
  417. package/dist/recall-navigate-access.js +2 -2
  418. package/dist/recall-navigate-disclosure.d.ts +3 -1
  419. package/dist/recall-navigate-disclosure.js +1 -1
  420. package/dist/recall-navigate.d.ts +3 -1
  421. package/dist/recall-navigate.js +2 -2
  422. package/dist/recall-planner-llm.d.ts +3 -1
  423. package/dist/recall-planner-llm.js +3 -2
  424. package/dist/recall-planner-llm.js.map +1 -1
  425. package/dist/recall-state-view-admission.d.ts +57 -0
  426. package/dist/recall-state-view-admission.js +39 -0
  427. package/dist/recall-state-view-admission.js.map +1 -0
  428. package/dist/recall-state-view-inject.js +2 -2
  429. package/dist/recall-state-view-render.js +2 -2
  430. package/dist/recall-state-view-widen.d.ts +18 -1
  431. package/dist/recall-state-view-widen.js +2 -2
  432. package/dist/recall-state-view-wire.d.ts +1 -1
  433. package/dist/recall-state-view-wire.js +3 -3
  434. package/dist/recall-state-view.d.ts +1 -0
  435. package/dist/recall-state-view.js +1 -1
  436. package/dist/recall-state.d.ts +3 -1
  437. package/dist/recall-tag-filter.d.ts +3 -1
  438. package/dist/recall-timings.d.ts +3 -1
  439. package/dist/recall-xray-cli.d.ts +3 -1
  440. package/dist/recall-xray-cli.js +4 -4
  441. package/dist/recall-xray-renderer.d.ts +3 -1
  442. package/dist/recall-xray-renderer.js +3 -3
  443. package/dist/recall-xray.d.ts +10 -1
  444. package/dist/recall-xray.js +2 -2
  445. package/dist/reconcile/cursor.d.ts +12 -2
  446. package/dist/reconcile/cursor.js +6 -4
  447. package/dist/reconcile/cursor.js.map +1 -1
  448. package/dist/reconcile/manifest.d.ts +38 -2
  449. package/dist/reconcile/manifest.js +15 -5
  450. package/dist/reconcile/plan.d.ts +3 -1
  451. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  452. package/dist/replay/normalizers/claude.d.ts +3 -1
  453. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  454. package/dist/replay/normalizers/shared.d.ts +3 -1
  455. package/dist/replay/runner.d.ts +3 -1
  456. package/dist/replay/types.d.ts +3 -1
  457. package/dist/replica-divergence.d.ts +3 -1
  458. package/dist/replica-peers-config.d.ts +3 -1
  459. package/dist/{resolution-VKATP2HT.js → resolution-OHJZG45O.js} +6 -6
  460. package/dist/resolution-OHJZG45O.js.map +1 -0
  461. package/dist/resolve-auth-token.d.ts +3 -1
  462. package/dist/resume-bundles.js +13 -11
  463. package/dist/retrieval-agents.d.ts +4 -2
  464. package/dist/retrieval-tiers.d.ts +3 -1
  465. package/dist/routing/engine.d.ts +3 -1
  466. package/dist/routing/store.d.ts +3 -1
  467. package/dist/runtime/child-process.d.ts +1 -1
  468. package/dist/runtime/child-process.js +1 -1
  469. package/dist/salvage-envelope.d.ts +3 -1
  470. package/dist/salvage-envelope.js +2 -2
  471. package/dist/{scope-profiles-BShpTPeV.d.ts → scope-profiles-nxTKvjE-.d.ts} +1 -1
  472. package/dist/search/embed-helper.d.ts +3 -1
  473. package/dist/search/factory.d.ts +3 -1
  474. package/dist/search/factory.js +7 -7
  475. package/dist/search/index.d.ts +3 -1
  476. package/dist/search/index.js +11 -11
  477. package/dist/search/lancedb-backend.d.ts +3 -1
  478. package/dist/search/meilisearch-backend.d.ts +3 -1
  479. package/dist/search/noop-backend.d.ts +3 -1
  480. package/dist/search/orama-backend.d.ts +3 -1
  481. package/dist/search/port.d.ts +3 -1
  482. package/dist/search/remote-backend.d.ts +3 -1
  483. package/dist/{semantic-consolidation-CusOpe9F.d.ts → semantic-consolidation-C83DVakV.d.ts} +1 -1
  484. package/dist/semantic-consolidation.d.ts +4 -2
  485. package/dist/semantic-consolidation.js +27 -26
  486. package/dist/semantic-rule-promotion.js +26 -25
  487. package/dist/semantic-rule-verifier.d.ts +3 -1
  488. package/dist/semantic-rule-verifier.js +26 -25
  489. package/dist/{service-BbuVh1eS.d.ts → service-q-xtOoAr.d.ts} +2 -2
  490. package/dist/session-observer-bands.d.ts +3 -1
  491. package/dist/session-observer-state.d.ts +3 -1
  492. package/dist/shared-context/manager.d.ts +3 -1
  493. package/dist/signal.d.ts +3 -1
  494. package/dist/source-agent-qualifier.d.ts +3 -1
  495. package/dist/source-agent-qualifier.js +35 -33
  496. package/dist/standup/build.js +26 -25
  497. package/dist/{storage-BBLLuVTF.d.ts → storage-Ca0MbTfm.d.ts} +67 -6
  498. package/dist/storage.d.ts +5 -3
  499. package/dist/storage.js +25 -24
  500. package/dist/subject-config.d.ts +3 -1
  501. package/dist/subject-config.js +2 -2
  502. package/dist/summarizer.d.ts +3 -1
  503. package/dist/summarizer.js +6 -6
  504. package/dist/summary-snapshot.d.ts +3 -1
  505. package/dist/support-passport/index.d.ts +50 -15
  506. package/dist/support-passport/index.js +73 -64
  507. package/dist/temporal-supersession.d.ts +4 -2
  508. package/dist/temporal-timeline-recall.d.ts +3 -1
  509. package/dist/temporal-validity.d.ts +3 -1
  510. package/dist/threading.d.ts +3 -1
  511. package/dist/tier-migration.d.ts +4 -2
  512. package/dist/tier-routing.d.ts +3 -1
  513. package/dist/tier-routing.js +2 -2
  514. package/dist/{tier-stats-KA6OZX2C.js → tier-stats-VK5PCO2L.js} +3 -3
  515. package/dist/topics.d.ts +3 -1
  516. package/dist/transcript.d.ts +3 -1
  517. package/dist/transfer/capsule-import.js +1 -1
  518. package/dist/transfer/export-okf.d.ts +3 -1
  519. package/dist/transfer/export-okf.js +27 -26
  520. package/dist/transfer/types.d.ts +24 -24
  521. package/dist/trust-score-stage.d.ts +3 -1
  522. package/dist/trust-score.d.ts +3 -1
  523. package/dist/{types-igV4-sbB.d.ts → types-yDgWDkrJ.d.ts} +60 -34
  524. package/dist/types.d.ts +3 -1
  525. package/dist/types.js +1 -1
  526. package/dist/utility-runtime.d.ts +3 -1
  527. package/dist/verified-recall.js +26 -25
  528. package/dist/who-knows-cli.d.ts +14 -11
  529. package/dist/who-knows-cli.js +27 -26
  530. package/dist/who-knows.d.ts +14 -11
  531. package/dist/who-knows.js +26 -25
  532. package/dist/write-envelope.d.ts +5 -2
  533. package/dist/write-envelope.js +3 -1
  534. package/package.json +2 -2
  535. package/src/access-category-alias.test.ts +216 -0
  536. package/src/access-mcp.test.ts +73 -0
  537. package/src/access-mcp.ts +6 -6
  538. package/src/access-observe-write-surface.ts +19 -4
  539. package/src/access-offline-manifest.ts +297 -16
  540. package/src/access-recall-surface.ts +5 -5
  541. package/src/access-schema.ts +76 -7
  542. package/src/access-service.ts +11 -2
  543. package/src/activity/config.test.ts +124 -1
  544. package/src/activity/config.ts +150 -18
  545. package/src/activity/index.ts +3 -0
  546. package/src/activity/journal-extract-storage.test.ts +129 -0
  547. package/src/activity/journal-extract.test.ts +314 -0
  548. package/src/activity/journal-extract.ts +247 -0
  549. package/src/activity/journal-heading.test.ts +24 -1
  550. package/src/activity/journal-heading.ts +36 -0
  551. package/src/activity/journal-read.test.ts +242 -0
  552. package/src/activity/journal-read.ts +183 -0
  553. package/src/activity/journal-source.test.ts +15 -15
  554. package/src/activity/journal-source.ts +21 -14
  555. package/src/activity/journal-state.lock-worker.ts +30 -0
  556. package/src/activity/journal-state.test.ts +144 -0
  557. package/src/activity/journal-state.ts +107 -0
  558. package/src/activity/journal-strip.test.ts +106 -52
  559. package/src/activity/journal-strip.ts +35 -10
  560. package/src/activity/journal-vault-integration.test.ts +230 -0
  561. package/src/activity/journal-vault-provenance.test.ts +9 -7
  562. package/src/activity/journal-vault-provenance.ts +4 -10
  563. package/src/activity/journal-vault-read.test.ts +3 -2
  564. package/src/activity/journal-vault-read.ts +9 -139
  565. package/src/activity/journal.test.ts +74 -23
  566. package/src/activity/runner.test.ts +116 -1
  567. package/src/activity/runner.ts +25 -0
  568. package/src/activity/scheduler.ts +4 -0
  569. package/src/activity/store.test.ts +18 -0
  570. package/src/activity/store.ts +14 -0
  571. package/src/activity/sync-registration.ts +4 -0
  572. package/src/activity/timeline/analysis-metadata.ts +2 -0
  573. package/src/activity/timeline/analysis-provider.ts +140 -0
  574. package/src/activity/timeline/analysis-run.test.ts +419 -0
  575. package/src/activity/timeline/analysis-run.ts +106 -0
  576. package/src/activity/timeline/analysis.ts +66 -37
  577. package/src/activity/timeline/corrections.ts +9 -0
  578. package/src/activity/timeline/index.ts +3 -0
  579. package/src/activity/timeline/query.test.ts +71 -0
  580. package/src/activity/timeline/query.ts +57 -8
  581. package/src/activity/timeline/regenerate.test.ts +505 -0
  582. package/src/activity/timeline/regenerate.ts +373 -0
  583. package/src/activity/types.ts +40 -5
  584. package/src/adapters/grok-opencode.test.ts +146 -0
  585. package/src/adapters/grok.ts +53 -0
  586. package/src/adapters/index.ts +2 -0
  587. package/src/adapters/opencode.ts +52 -0
  588. package/src/adapters/registry.ts +4 -0
  589. package/src/cli-fallback.ts +13 -4
  590. package/src/config.test.ts +27 -1
  591. package/src/config.ts +17 -1
  592. package/src/dedup/merge.test.ts +732 -25
  593. package/src/fallback-llm.test.ts +53 -0
  594. package/src/fallback-llm.ts +12 -0
  595. package/src/index.ts +2 -0
  596. package/src/local-llm-config.ts +25 -0
  597. package/src/local-llm.ts +3 -1
  598. package/src/orchestration/dependency-propagation-recovery-replay.ts +1 -1
  599. package/src/orchestration/extraction-persist-deps.ts +9 -0
  600. package/src/orchestration/extraction-persist-promotion.test.ts +265 -6
  601. package/src/orchestration/extraction-persist-promotion.ts +42 -3
  602. package/src/orchestration/extraction-persist.ts +3 -3
  603. package/src/orchestration/harmonic-construction-persist.test.ts +115 -4
  604. package/src/orchestration/harmonic-construction-persist.ts +34 -6
  605. package/src/orchestration/maintenance.ts +1 -0
  606. package/src/orchestration/orchestrator-helpers.ts +6 -0
  607. package/src/orchestration/recall-entry.ts +16 -0
  608. package/src/orchestration/recall-internal-deps.ts +14 -0
  609. package/src/orchestration/recall-internal.ts +41 -58
  610. package/src/orchestration/recall-result-formatter.ts +11 -1
  611. package/src/orchestration/recall-search-pipeline.ts +121 -11
  612. package/src/orchestration/recall-state-view-pipeline.test.ts +211 -0
  613. package/src/orchestration/semantic-merge-commit-effects.ts +76 -17
  614. package/src/orchestration/semantic-merge-persist.ts +121 -16
  615. package/src/orchestration/semantic-merge-promotion-payload.ts +133 -54
  616. package/src/orchestrator.ts +7 -35
  617. package/src/providers/codex-subscription.test.ts +666 -0
  618. package/src/providers/codex-subscription.ts +743 -0
  619. package/src/recall-disclosure.test.ts +20 -0
  620. package/src/recall-state-view-admission.ts +114 -0
  621. package/src/recall-state-view-asof.test.ts +176 -0
  622. package/src/recall-state-view-call.test.ts +175 -0
  623. package/src/recall-state-view-config.test.ts +16 -0
  624. package/src/recall-state-view-widen.test.ts +70 -0
  625. package/src/recall-state-view-widen.ts +28 -7
  626. package/src/recall-state-view-wire.ts +3 -1
  627. package/src/recall-state-view-zero-diff.test.ts +20 -11
  628. package/src/recall-state-view.test.ts +142 -0
  629. package/src/recall-state-view.ts +72 -24
  630. package/src/recall-xray-renderer.test.ts +27 -0
  631. package/src/recall-xray-renderer.ts +4 -0
  632. package/src/recall-xray.ts +13 -0
  633. package/src/reconcile/cursor.ts +23 -33
  634. package/src/reconcile/manifest.ts +96 -11
  635. package/src/reconcile-identity-cache.test.ts +378 -0
  636. package/src/runtime/child-process.ts +1 -1
  637. package/src/storage/cas-revision-host.ts +75 -0
  638. package/src/storage/cas-revision-store.test.ts +459 -0
  639. package/src/storage/cas-revision-store.ts +661 -0
  640. package/src/storage/deletion-revision-store.ts +80 -6
  641. package/src/storage/tombstone-blocked-capture-index.ts +15 -0
  642. package/src/storage/tombstone-blocked-capture-mutation.ts +67 -7
  643. package/src/storage/tombstone-blocked-capture-sync.ts +55 -20
  644. package/src/storage-contract/failure-semantics.test.ts +1 -1
  645. package/src/storage-frontmatter-cas.test.ts +698 -1
  646. package/src/storage-replay.test.ts +166 -3
  647. package/src/storage.ts +41 -41
  648. package/src/support-passport/card-projection.ts +82 -33
  649. package/src/temporal-supersession.test.ts +10 -10
  650. package/src/types.ts +10 -29
  651. package/src/write-envelope.ts +1 -1
  652. package/dist/chunk-22FVR2KE.js.map +0 -1
  653. package/dist/chunk-2C3S7J2S.js.map +0 -1
  654. package/dist/chunk-2JVJ7UHC.js.map +0 -1
  655. package/dist/chunk-2QSZNTDO.js +0 -56
  656. package/dist/chunk-2QSZNTDO.js.map +0 -1
  657. package/dist/chunk-3QQTXYZ6.js.map +0 -1
  658. package/dist/chunk-5VCDKQWQ.js +0 -560
  659. package/dist/chunk-5VCDKQWQ.js.map +0 -1
  660. package/dist/chunk-A7XEPMQ6.js.map +0 -1
  661. package/dist/chunk-BLUYQFRH.js.map +0 -1
  662. package/dist/chunk-E6JA6XWY.js.map +0 -1
  663. package/dist/chunk-EEOUMG3J.js.map +0 -1
  664. package/dist/chunk-FDLDOEO6.js.map +0 -1
  665. package/dist/chunk-FYDW33ZB.js +0 -13
  666. package/dist/chunk-H272ZPQ3.js.map +0 -1
  667. package/dist/chunk-HV7OY4DM.js.map +0 -1
  668. package/dist/chunk-HVAEXYPL.js.map +0 -1
  669. package/dist/chunk-JEIXTYVG.js.map +0 -1
  670. package/dist/chunk-LRICZIGN.js +0 -52
  671. package/dist/chunk-LRICZIGN.js.map +0 -1
  672. package/dist/chunk-MFDTVQJX.js.map +0 -1
  673. package/dist/chunk-N7RWREIQ.js.map +0 -1
  674. package/dist/chunk-O75CRYGF.js.map +0 -1
  675. package/dist/chunk-Q726HSJO.js.map +0 -1
  676. package/dist/chunk-QOIOACIE.js.map +0 -1
  677. package/dist/chunk-SEDEKFYQ.js +0 -1
  678. package/dist/chunk-SO7SV523.js.map +0 -1
  679. package/dist/chunk-TLPZ6MKZ.js.map +0 -1
  680. package/dist/chunk-UGPUYIET.js.map +0 -1
  681. package/src/activity/journal-mode.test.ts +0 -32
  682. package/src/activity/journal-mode.ts +0 -20
  683. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
  684. /package/dist/{chunk-CDKHKZL5.js.map → chunk-2524MOWK.js.map} +0 -0
  685. /package/dist/{chunk-RKBLRTNT.js.map → chunk-2YLMUME2.js.map} +0 -0
  686. /package/dist/{chunk-DBQWVT2H.js.map → chunk-3CBI2ZSA.js.map} +0 -0
  687. /package/dist/{chunk-MWFGUESQ.js.map → chunk-3FJKJ5UZ.js.map} +0 -0
  688. /package/dist/{chunk-NZXEK3UF.js.map → chunk-3Q3N35W7.js.map} +0 -0
  689. /package/dist/{chunk-YYGZJPOK.js.map → chunk-42DJ235G.js.map} +0 -0
  690. /package/dist/{chunk-JTH2SE6B.js.map → chunk-6J6K3STG.js.map} +0 -0
  691. /package/dist/{chunk-H4VH5VIB.js.map → chunk-776GVKL7.js.map} +0 -0
  692. /package/dist/{chunk-BUTCAMJM.js.map → chunk-A2YQL2FF.js.map} +0 -0
  693. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  694. /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
  695. /package/dist/{chunk-B325AGLK.js.map → chunk-AZSKROVQ.js.map} +0 -0
  696. /package/dist/{chunk-I5DZ3WGR.js.map → chunk-BJETIR53.js.map} +0 -0
  697. /package/dist/{chunk-JT3EB7ZL.js.map → chunk-BNGHPYZU.js.map} +0 -0
  698. /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
  699. /package/dist/{chunk-5NANRSCD.js.map → chunk-CNV2A557.js.map} +0 -0
  700. /package/dist/{chunk-PBGVVDLY.js.map → chunk-DK4X5B6I.js.map} +0 -0
  701. /package/dist/{chunk-N2ZNPHA3.js.map → chunk-ECKG5WSI.js.map} +0 -0
  702. /package/dist/{chunk-PYLL63BF.js.map → chunk-EEBQFG5E.js.map} +0 -0
  703. /package/dist/{chunk-ET356KSB.js.map → chunk-F4TWWUMP.js.map} +0 -0
  704. /package/dist/{chunk-CLLPJ6QT.js.map → chunk-FQXJAC3T.js.map} +0 -0
  705. /package/dist/{chunk-JGHXXQ2G.js.map → chunk-FVJ4D6L7.js.map} +0 -0
  706. /package/dist/{chunk-DD5JFCWM.js.map → chunk-GCBIXUPT.js.map} +0 -0
  707. /package/dist/{chunk-MN3LK3KN.js.map → chunk-GLZH5VEN.js.map} +0 -0
  708. /package/dist/{chunk-S7T2TY65.js.map → chunk-HC4GFLMQ.js.map} +0 -0
  709. /package/dist/{chunk-EQHDH4C2.js.map → chunk-HUT2JR6I.js.map} +0 -0
  710. /package/dist/{chunk-UUQG7HAD.js.map → chunk-HXSAWV3A.js.map} +0 -0
  711. /package/dist/{chunk-XXIHX75O.js.map → chunk-J7PB5UQ4.js.map} +0 -0
  712. /package/dist/{chunk-LTIZHLV7.js.map → chunk-JR6H5CYS.js.map} +0 -0
  713. /package/dist/{chunk-FCSZ4K2X.js.map → chunk-JR6PP7UM.js.map} +0 -0
  714. /package/dist/{chunk-TCUKRAMK.js.map → chunk-JRWW7GM6.js.map} +0 -0
  715. /package/dist/{chunk-PL7FYKHT.js.map → chunk-L2WQVSKP.js.map} +0 -0
  716. /package/dist/{chunk-JSN44KIB.js.map → chunk-LEMD7WZJ.js.map} +0 -0
  717. /package/dist/{chunk-VZWXFXLX.js.map → chunk-LMCD5W5B.js.map} +0 -0
  718. /package/dist/{chunk-7BMXZCOT.js.map → chunk-LNDLXMH6.js.map} +0 -0
  719. /package/dist/{chunk-EONF76DT.js.map → chunk-LYDJRF45.js.map} +0 -0
  720. /package/dist/{chunk-MKD3OMPS.js.map → chunk-M3MYMWXG.js.map} +0 -0
  721. /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
  722. /package/dist/{chunk-6N3TQFZU.js.map → chunk-NN4JEFON.js.map} +0 -0
  723. /package/dist/{chunk-MOZXTRC2.js.map → chunk-OQ7SSRXP.js.map} +0 -0
  724. /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
  725. /package/dist/{chunk-4MHYKEOM.js.map → chunk-OS2AT2JU.js.map} +0 -0
  726. /package/dist/{chunk-N57A4KPV.js.map → chunk-P3ONDDIJ.js.map} +0 -0
  727. /package/dist/{chunk-R3HKWWUB.js.map → chunk-PHP3MUGF.js.map} +0 -0
  728. /package/dist/{chunk-P3SB5BNT.js.map → chunk-QATYVTP7.js.map} +0 -0
  729. /package/dist/{chunk-LSYDG6MJ.js.map → chunk-QBLDCI6E.js.map} +0 -0
  730. /package/dist/{chunk-KCB7F4J7.js.map → chunk-QURNMKME.js.map} +0 -0
  731. /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
  732. /package/dist/{chunk-XXE5P6HJ.js.map → chunk-RRZKTSFG.js.map} +0 -0
  733. /package/dist/{chunk-44T3Y7SZ.js.map → chunk-RUXPVSML.js.map} +0 -0
  734. /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
  735. /package/dist/{chunk-EEC4PCG5.js.map → chunk-SZDLX763.js.map} +0 -0
  736. /package/dist/{chunk-E2ZHGBAK.js.map → chunk-T2JSUEH6.js.map} +0 -0
  737. /package/dist/{chunk-227UFSEQ.js.map → chunk-TFA6HPOA.js.map} +0 -0
  738. /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
  739. /package/dist/{chunk-W27OW7AB.js.map → chunk-TKFSXDOB.js.map} +0 -0
  740. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  741. /package/dist/{chunk-CETXNLEX.js.map → chunk-UDZYNIDJ.js.map} +0 -0
  742. /package/dist/{chunk-H5AFCNGA.js.map → chunk-UJX4I26O.js.map} +0 -0
  743. /package/dist/{chunk-E6TDQRF6.js.map → chunk-UYUCCQ46.js.map} +0 -0
  744. /package/dist/{chunk-OQDPBRQ6.js.map → chunk-VYXDUPYE.js.map} +0 -0
  745. /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
  746. /package/dist/{chunk-NB5BCFUY.js.map → chunk-WHHEPAO3.js.map} +0 -0
  747. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  748. /package/dist/{chunk-TX2UTLXC.js.map → chunk-WPDKBUWX.js.map} +0 -0
  749. /package/dist/{chunk-YFLLGRXO.js.map → chunk-X2QPKLPL.js.map} +0 -0
  750. /package/dist/{chunk-PFFZWDPE.js.map → chunk-XCOV45MO.js.map} +0 -0
  751. /package/dist/{chunk-5BCNEBEN.js.map → chunk-XPJNT6PI.js.map} +0 -0
  752. /package/dist/{chunk-SEDEKFYQ.js.map → chunk-XW2T4QAW.js.map} +0 -0
  753. /package/dist/{chunk-J7HFPA6O.js.map → chunk-Y63ZFP4X.js.map} +0 -0
  754. /package/dist/{chunk-D223ZDQV.js.map → chunk-YEDVOYL2.js.map} +0 -0
  755. /package/dist/{chunk-RC5DXXWC.js.map → chunk-YM7YN37H.js.map} +0 -0
  756. /package/dist/{chunk-BPJNF7J2.js.map → chunk-YNN26CIZ.js.map} +0 -0
  757. /package/dist/{chunk-VLXBE57O.js.map → chunk-YVGXH72Y.js.map} +0 -0
  758. /package/dist/{chunk-YQAXP5AC.js.map → chunk-YXLUTALO.js.map} +0 -0
  759. /package/dist/{chunk-DGGB65KC.js.map → chunk-Z7ACR6MJ.js.map} +0 -0
  760. /package/dist/{chunk-X35W4S3L.js.map → chunk-ZBEGS7OB.js.map} +0 -0
  761. /package/dist/{chunk-XUE46UYW.js.map → chunk-ZLN7AROH.js.map} +0 -0
  762. /package/dist/{chunk-HK32G473.js.map → chunk-ZWEZXVYH.js.map} +0 -0
  763. /package/dist/{contradiction-scan-NOYMFG66.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  764. /package/dist/{first-start-migration-RC345GPL.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  765. /package/dist/{resolution-VKATP2HT.js.map → local-llm-config.js.map} +0 -0
  766. /package/dist/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -1,16 +1,22 @@
1
1
  import * as nodePath from "node:path";
2
- import type { Orchestrator } from "./orchestrator.js";
3
- import { iterateOfflineSyncSnapshotFileRecords } from "./offline-sync.js";
4
2
  import { offlineSyncStorageForSnapshot } from "./offline-sync-impression-drain.js";
3
+ import { iterateOfflineSyncSnapshotFileRecords } from "./offline-sync.js";
4
+ import type { Orchestrator } from "./orchestrator.js";
5
5
  import {
6
- buildReconcileManifestFile,
6
+ CONTENT_HASH_NORMALIZER_VERSION,
7
+ IDENTITY_RESOLUTION_VERSION,
7
8
  RECONCILE_MANIFEST_FORMAT,
8
9
  RECONCILE_MANIFEST_SCHEMA_VERSION,
9
10
  type ReconcileManifest,
10
11
  type ReconcileManifestFile,
12
+ type ReconcileMemoryIdentity,
11
13
  type ReconcileMemoryParser,
14
+ buildReconcileManifestFile,
15
+ citationTemplateFingerprint,
16
+ isCachedIdentityReusable,
17
+ isReconcileMemoryIdentity,
12
18
  } from "./reconcile/manifest.js";
13
- import { isSupportPassportPrivateMemory } from "./support-passport/card-projection.js";
19
+ import { createPersistedSupportPassportPrivateFileExclusion } from "./support-passport/card-projection.js";
14
20
 
15
21
  export interface OfflineSyncManifestRequest {
16
22
  includeTranscripts?: boolean;
@@ -22,14 +28,179 @@ export interface OfflineSyncManifestStreamResponse extends Omit<ReconcileManifes
22
28
  files: AsyncIterable<ReconcileManifestFile>;
23
29
  }
24
30
 
31
+ export interface ServerIdentityCacheEntry {
32
+ path: string;
33
+ sha256: string;
34
+ memory?: ReconcileMemoryIdentity;
35
+ /** Stamped on sha-only entries so an upgrade re-parses them. */
36
+ normalizerVersion?: number;
37
+ identityResolutionVersion?: number;
38
+ /** Stat identity the exclusion classification was computed against. */
39
+ statIdentity?: string;
40
+ /** Persisted support-passport private-memory classification for statIdentity. */
41
+ excluded?: boolean;
42
+ }
43
+
44
+ /**
45
+ * Decide what the manifest stream should persist, and whether a write is
46
+ * needed at all.
47
+ *
48
+ * A write is required whenever the persisted set changed — an identity was
49
+ * rebuilt, or an entry was dropped because its file lost its identity — and
50
+ * also when a completed walk leaves entries for paths it never saw, which are
51
+ * files that have since been deleted. Skipping the write in that last case
52
+ * would strand those entries on disk forever.
53
+ *
54
+ * Pruning is gated on the walk completing: an aborted or partially consumed
55
+ * stream has simply not observed the remaining paths, so it may only add.
56
+ */
57
+ export function planServerIdentityCacheWrite(input: {
58
+ persisted: ReadonlyMap<string, ServerIdentityCacheEntry>;
59
+ yieldedPaths: ReadonlySet<string>;
60
+ streamCompleted: boolean;
61
+ cacheDirty: boolean;
62
+ }): { shouldWrite: boolean; entries: ServerIdentityCacheEntry[] } {
63
+ const entries = input.streamCompleted
64
+ ? [...input.persisted.values()].filter((entry) => input.yieldedPaths.has(entry.path))
65
+ : [...input.persisted.values()];
66
+ return { shouldWrite: input.cacheDirty || entries.length !== input.persisted.size, entries };
67
+ }
68
+
69
+ /**
70
+ * The cache lives under `.remnic/` rather than `state/`: snapshot enumeration
71
+ * excludes internal `.remnic/` paths structurally (`isInternalRemnicStatePath`),
72
+ * whereas `state/` is only filtered by an allowlist of known node-local
73
+ * artifacts. Under `state/` this node-local cache would be advertised as a peer
74
+ * file, so convergence would transfer the cache itself — and the stream rewrites
75
+ * it during finalization, so the advertised digest could go stale mid-transfer.
76
+ */
77
+ function serverIdentityCachePath(storageDir: string): string {
78
+ return nodePath.join(storageDir, ".remnic", "state", "converge-identity-cache.json");
79
+ }
80
+
81
+ async function loadServerIdentityCache(
82
+ storageDir: string,
83
+ citationTemplate?: string
84
+ ): Promise<Map<string, ServerIdentityCacheEntry>> {
85
+ const cache = new Map<string, ServerIdentityCacheEntry>();
86
+ try {
87
+ const raw = JSON.parse(
88
+ await import("node:fs/promises").then((fs) => fs.readFile(serverIdentityCachePath(storageDir), "utf8"))
89
+ ) as {
90
+ citationTemplate?: string;
91
+ files?: unknown[];
92
+ };
93
+ // Identities are derived after stripping inline attribution for a specific
94
+ // citation template; entries written under a different one would produce
95
+ // wrong contentHash values for unchanged files.
96
+ if (raw.citationTemplate !== citationTemplateFingerprint(citationTemplate)) return cache;
97
+ for (const candidate of raw.files ?? []) {
98
+ const entry = candidate as Partial<ServerIdentityCacheEntry> | null;
99
+ if (typeof entry?.path !== "string" || typeof entry.sha256 !== "string") continue;
100
+ if (entry.memory !== undefined && !isReconcileMemoryIdentity(entry.memory)) continue;
101
+ if (entry.statIdentity !== undefined && typeof entry.statIdentity !== "string") continue;
102
+ if (entry.excluded !== undefined && typeof entry.excluded !== "boolean") continue;
103
+ if (entry.normalizerVersion !== undefined && typeof entry.normalizerVersion !== "number") continue;
104
+ if (entry.identityResolutionVersion !== undefined && typeof entry.identityResolutionVersion !== "number") {
105
+ continue;
106
+ }
107
+ cache.set(entry.path, {
108
+ path: entry.path,
109
+ sha256: entry.sha256,
110
+ ...(entry.memory ? { memory: entry.memory } : {}),
111
+ ...(entry.memory
112
+ ? {}
113
+ : {
114
+ ...(typeof entry.normalizerVersion === "number" ? { normalizerVersion: entry.normalizerVersion } : {}),
115
+ ...(typeof entry.identityResolutionVersion === "number"
116
+ ? { identityResolutionVersion: entry.identityResolutionVersion }
117
+ : {}),
118
+ }),
119
+ ...(entry.statIdentity !== undefined && entry.excluded !== undefined
120
+ ? { statIdentity: entry.statIdentity, excluded: entry.excluded }
121
+ : {}),
122
+ });
123
+ }
124
+ } catch {
125
+ // missing or corrupt cache: cold build
126
+ }
127
+ return cache;
128
+ }
129
+
130
+ const serverIdentityCacheWriteLocks = new Map<string, Promise<void>>();
131
+
132
+ /** Serialize cache replacements per path: overlapping manifest streams for one
133
+ * namespace would otherwise each publish a whole-file snapshot, and the slower
134
+ * stream built from older filesystem state would overwrite the newer one. */
135
+ async function withServerIdentityCacheWriteLock(cachePath: string, write: () => Promise<void>): Promise<void> {
136
+ const previous = serverIdentityCacheWriteLocks.get(cachePath) ?? Promise.resolve();
137
+ const next = previous.then(write, write);
138
+ serverIdentityCacheWriteLocks.set(cachePath, next);
139
+ try {
140
+ await next;
141
+ } finally {
142
+ if (serverIdentityCacheWriteLocks.get(cachePath) === next) {
143
+ serverIdentityCacheWriteLocks.delete(cachePath);
144
+ }
145
+ }
146
+ }
147
+
148
+ /** Union of the entries being written and the current on-disk set; on conflict
149
+ * the write wins (it reflects the newer run). Callers hold the write lock. */
150
+ async function mergeServerIdentityCacheEntries(
151
+ fs: typeof import("node:fs/promises"),
152
+ cachePath: string,
153
+ entries: readonly ServerIdentityCacheEntry[],
154
+ citationTemplate: string | undefined,
155
+ dropped: ReadonlySet<string> = new Set()
156
+ ): Promise<ServerIdentityCacheEntry[]> {
157
+ const merged = new Map(entries.map((entry) => [entry.path, entry]));
158
+ try {
159
+ const raw = JSON.parse(await fs.readFile(cachePath, "utf8")) as {
160
+ citationTemplate?: string;
161
+ files?: unknown[];
162
+ };
163
+ if (raw.citationTemplate === citationTemplateFingerprint(citationTemplate)) {
164
+ for (const candidate of raw.files ?? []) {
165
+ const entry = candidate as Partial<ServerIdentityCacheEntry> | null;
166
+ if (typeof entry?.path !== "string" || typeof entry.sha256 !== "string") continue;
167
+ if (entry.memory !== undefined && !isReconcileMemoryIdentity(entry.memory)) continue;
168
+ if (dropped.has(entry.path) || merged.has(entry.path)) continue;
169
+ merged.set(entry.path, {
170
+ path: entry.path,
171
+ sha256: entry.sha256,
172
+ ...(entry.memory ? { memory: entry.memory } : {}),
173
+ ...(entry.memory
174
+ ? {}
175
+ : {
176
+ ...(typeof entry.normalizerVersion === "number" ? { normalizerVersion: entry.normalizerVersion } : {}),
177
+ ...(typeof entry.identityResolutionVersion === "number"
178
+ ? { identityResolutionVersion: entry.identityResolutionVersion }
179
+ : {}),
180
+ }),
181
+ });
182
+ }
183
+ }
184
+ } catch {
185
+ // missing or unreadable current cache: the write set stands alone
186
+ }
187
+ return [...merged.values()];
188
+ }
189
+
25
190
  export async function createOfflineSyncManifestStream(
26
191
  orchestrator: Orchestrator,
27
192
  namespace: string,
28
193
  userExcludeRegexps: RegExp[],
29
194
  options: OfflineSyncManifestRequest,
30
- parseMemory: ReconcileMemoryParser,
195
+ parseMemory: ReconcileMemoryParser
31
196
  ): Promise<OfflineSyncManifestStreamResponse> {
32
197
  const storage = await offlineSyncStorageForSnapshot(orchestrator, namespace);
198
+ const citationTemplate = orchestrator.config.inlineSourceAttributionFormat;
199
+ const identityCache = await loadServerIdentityCache(storage.dir, citationTemplate);
200
+ // The exclusion callback runs before every yield; without the persisted
201
+ // classification it would read and parse every candidate file, defeating the
202
+ // warm-cache skip entirely.
203
+ const classificationUpdates = new Map<string, { statIdentity: string; excluded: boolean }>();
33
204
  const snapshotFiles = iterateOfflineSyncSnapshotFileRecords({
34
205
  root: storage.dir,
35
206
  includeContent: false,
@@ -37,23 +208,133 @@ export async function createOfflineSyncManifestStream(
37
208
  readFileDigest: async ({ filePath }) => storage.digestOfflineSyncFile(filePath),
38
209
  signal: options.signal,
39
210
  userExcludeRegexps,
40
- excludeFile: async ({ filePath }) => {
41
- const memory = await storage.readMemoryByPath(filePath);
42
- return memory ? isSupportPassportPrivateMemory(memory) : false;
43
- },
211
+ excludeFile: createPersistedSupportPassportPrivateFileExclusion(storage, identityCache, classificationUpdates),
44
212
  });
45
213
  return {
46
214
  namespace,
47
215
  format: RECONCILE_MANIFEST_FORMAT,
48
216
  schemaVersion: RECONCILE_MANIFEST_SCHEMA_VERSION,
49
217
  files: (async function* () {
50
- for await (const file of snapshotFiles) {
51
- yield await buildReconcileManifestFile(
52
- file,
53
- async ({ path }) => storage.readOfflineSyncFile(nodePath.join(storage.dir, path)),
54
- parseMemory,
55
- orchestrator.config.inlineSourceAttributionFormat,
56
- );
218
+ // Any change to the persisted set, not just a rebuilt identity: a file
219
+ // that lost its identity, or a completed walk that must prune vanished
220
+ // paths, also has to reach disk or the removal is lost forever.
221
+ let cacheDirty = false;
222
+ let streamCompleted = false;
223
+ // Seeded with every previously cached entry so a partially consumed
224
+ // stream (client disconnect, abort) can only add to the cache. Writing
225
+ // just this run's rebuilds would drop every cache hit, so one edit to a
226
+ // large corpus would shrink the cache to that single entry and force a
227
+ // near-cold rebuild on the next request.
228
+ const persistedEntries = new Map(identityCache);
229
+ const yieldedPaths = new Set<string>();
230
+ const flush = async (): Promise<void> => {
231
+ const { shouldWrite, entries } = planServerIdentityCacheWrite({
232
+ persisted: persistedEntries,
233
+ yieldedPaths,
234
+ streamCompleted,
235
+ cacheDirty,
236
+ });
237
+ if (!shouldWrite) return;
238
+ try {
239
+ const fs = await import("node:fs/promises");
240
+ const cachePath = serverIdentityCachePath(storage.dir);
241
+ await withServerIdentityCacheWriteLock(cachePath, async () => {
242
+ // Merge with whatever is on disk NOW: a concurrent stream for the
243
+ // same namespace may have published newer entries after this
244
+ // request loaded its snapshot, and a blind whole-file replace
245
+ // would discard them.
246
+ const written = new Set(entries.map((entry) => entry.path));
247
+ const dropped = streamCompleted
248
+ ? new Set([...identityCache.keys()].filter((pathName) => !written.has(pathName)))
249
+ : new Set<string>();
250
+ const merged = await mergeServerIdentityCacheEntries(
251
+ fs,
252
+ cachePath,
253
+ entries,
254
+ citationTemplate,
255
+ dropped
256
+ );
257
+ await fs.mkdir(nodePath.dirname(cachePath), { recursive: true });
258
+ const tmp = `${cachePath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
259
+ await fs.writeFile(
260
+ tmp,
261
+ JSON.stringify({ citationTemplate: citationTemplateFingerprint(citationTemplate), files: merged })
262
+ );
263
+ await fs.rename(tmp, cachePath);
264
+ });
265
+ } catch {
266
+ // cache persistence is best-effort
267
+ }
268
+ };
269
+ try {
270
+ const applyClassification = (path: string, sha256: string): void => {
271
+ const classification = classificationUpdates.get(path);
272
+ if (classification === undefined) return;
273
+ const entry = persistedEntries.get(path) ?? { path, sha256 };
274
+ if (entry.statIdentity === classification.statIdentity && entry.excluded === classification.excluded) {
275
+ return;
276
+ }
277
+ persistedEntries.set(path, {
278
+ ...entry,
279
+ ...(entry.memory ? { memory: entry.memory } : {}),
280
+ statIdentity: classification.statIdentity,
281
+ excluded: classification.excluded,
282
+ });
283
+ cacheDirty = true;
284
+ };
285
+ for await (const file of snapshotFiles) {
286
+ yieldedPaths.add(file.path);
287
+ const cached = identityCache.get(file.path);
288
+ if (
289
+ cached !== undefined &&
290
+ cached.sha256.toLowerCase() === file.sha256.toLowerCase() &&
291
+ isCachedIdentityReusable(cached)
292
+ ) {
293
+ applyClassification(file.path, file.sha256);
294
+ yield {
295
+ ...file,
296
+ ...(cached.memory
297
+ ? { memory: cached.memory }
298
+ : {
299
+ normalizerVersion: cached.normalizerVersion,
300
+ identityResolutionVersion: cached.identityResolutionVersion,
301
+ }),
302
+ };
303
+ continue;
304
+ }
305
+ const built = await buildReconcileManifestFile(
306
+ file,
307
+ async ({ path }) => storage.readOfflineSyncFile(nodePath.join(storage.dir, path)),
308
+ parseMemory,
309
+ citationTemplate
310
+ );
311
+ // Negative results persist too: a memory-shaped file that parses
312
+ // without an identity would otherwise be re-read on every warm run.
313
+ const previous = persistedEntries.get(built.path);
314
+ if (previous?.sha256 !== built.sha256 || (built.memory !== undefined && previous?.memory !== built.memory)) {
315
+ cacheDirty = true;
316
+ }
317
+ if (built.memory === undefined && built.normalizerVersion === undefined) {
318
+ // Read failed: do not persist a negative identity for this SHA.
319
+ yield built;
320
+ continue;
321
+ }
322
+ persistedEntries.set(built.path, {
323
+ path: built.path,
324
+ sha256: built.sha256,
325
+ ...(built.memory !== undefined
326
+ ? { memory: built.memory }
327
+ : {
328
+ normalizerVersion: built.normalizerVersion,
329
+ identityResolutionVersion: built.identityResolutionVersion,
330
+ }),
331
+ });
332
+ applyClassification(built.path, built.sha256);
333
+ yield built;
334
+ }
335
+ streamCompleted = true;
336
+ } finally {
337
+ await flush();
57
338
  }
58
339
  })(),
59
340
  };
@@ -833,11 +833,10 @@ export class AccessRecallSurface {
833
833
  this.deps.budget.gc();
834
834
  }
835
835
  const topK = Number.isFinite(request.topK) ? Math.max(0, Math.floor(request.topK ?? 0)) : undefined;
836
- // Issue #680 — historical recall pin. Validate at the input
837
- // boundary so a malformed `asOf` is rejected with a structured
838
- // 400 instead of silently flooring at NaN inside the orchestrator
839
- // (CLAUDE.md rule 51, gotcha #51). Empty / undefined is fine —
840
- // means "no pin".
836
+ // Issue #680 — historical recall pin. Validate at the input boundary so
837
+ // a malformed `asOf` is rejected with a structured 400 instead of
838
+ // silently flooring at NaN inside the orchestrator (rule 51, gotcha #51).
839
+ // Empty / undefined is fine — means "no pin".
841
840
  let asOf: string | undefined;
842
841
  if (request.asOf !== undefined && request.asOf !== null) {
843
842
  if (typeof request.asOf !== "string" || request.asOf.trim().length === 0) {
@@ -863,6 +862,7 @@ export class AccessRecallSurface {
863
862
  },
864
863
  ...(authenticatedPrincipal ? { principalOverride: authenticatedPrincipal } : {}),
865
864
  ...(request.sourceConnector ? { sourceConnector: request.sourceConnector } : {}),
865
+ ...(request.stateView !== undefined ? { stateView: request.stateView } : {}),
866
866
  ...(asOf !== undefined ? { asOf } : {}),
867
867
  ...(request.includeLowConfidence === true ? { includeLowConfidence: true } : {}),
868
868
  ...(request.abortSignal ? { abortSignal: request.abortSignal } : {}),
@@ -3,6 +3,8 @@
3
3
  // field-level detail so consumers get clear feedback on malformed requests.
4
4
 
5
5
  import { z } from "zod";
6
+ import { isMemoryCategory, MEMORY_CATEGORY_NAMES } from "./write-envelope.js";
7
+ import type { MemoryCategory } from "./types.js";
6
8
  import {
7
9
  ACTION_CONFIDENCE_CONTEXT_READINESS,
8
10
  ACTION_CONFIDENCE_RISK_CATEGORIES,
@@ -145,6 +147,13 @@ export const recallRequestSchema = z.object({
145
147
  * recall traversal (issue #681). Defaults to false.
146
148
  */
147
149
  includeLowConfidence: z.boolean().optional(),
150
+ /**
151
+ * #1952 — per-call opt-in to state-aware recall views for this recall.
152
+ * ORs with the `recallStateViews` config flag; a change-intent query
153
+ * (e.g. "when did", "used to", "switched") is still required for any
154
+ * effect, so this can never perturb ordinary recalls.
155
+ */
156
+ stateView: z.boolean().optional(),
148
157
  });
149
158
 
150
159
  export const recallExplainRequestSchema = z.object({
@@ -258,13 +267,73 @@ export const deepRecallRequestSchema = z.object({
258
267
  // ---------------------------------------------------------------------------
259
268
 
260
269
  const writeContentSchema = z.string().min(1, "content is required").max(50000);
261
- const categorySchema = z
262
- .enum([
263
- "fact", "preference", "correction", "entity", "decision",
264
- "relationship", "principle", "commitment", "moment", "skill", "rule", "procedure",
265
- "reasoning_trace",
266
- ])
267
- .optional();
270
+ /**
271
+ * #2780: the canonical category set stays authoritative (`isMemoryCategory`),
272
+ * with exactly four admitted input-compat aliases — the project-shaped
273
+ * spellings fleet telemetry actually shows (`project`, `project_state`,
274
+ * `project-state`, `project_update`) — for a project-shaped category that
275
+ * does not exist. Exact match only, no case folding: `Project_State` and
276
+ * near-misses like `projection` reject like any other invalid category.
277
+ * Aliases are NOT enum members: the write-surface funnel coerces them to
278
+ * "fact" and reports the coercion on the response. Everything else rejects
279
+ * naming the full valid set plus a "use fact" hint so callers learn the
280
+ * canonical name.
281
+ */
282
+ const PROJECT_CATEGORY_ALIASES: Record<string, true> = {
283
+ project: true,
284
+ project_state: true,
285
+ "project-state": true,
286
+ project_update: true,
287
+ };
288
+
289
+ export interface CategoryAliasCoercion {
290
+ from: string;
291
+ to: "fact";
292
+ }
293
+
294
+ export function coerceProjectCategoryAlias<T extends { category?: string }>(
295
+ request: T,
296
+ ): { request: T; categoryCoercion?: CategoryAliasCoercion } {
297
+ const category = request.category;
298
+ if (category === undefined || PROJECT_CATEGORY_ALIASES[category] !== true) {
299
+ return { request };
300
+ }
301
+ return { request: { ...request, category: "fact" }, categoryCoercion: { from: category, to: "fact" } };
302
+ }
303
+
304
+ /**
305
+ * #2780 fix B: an idempotent replay returns the FIRST request's stored
306
+ * response, whose coercion note names that request's spelling. Rewrite the
307
+ * note from the CURRENT raw request so every response identifies what its
308
+ * caller actually sent; the stored idempotent result is reused untouched.
309
+ */
310
+ export function reapplyCategoryCoercion<T extends { categoryCoercion?: CategoryAliasCoercion }>(
311
+ response: T,
312
+ categoryCoercion: CategoryAliasCoercion | undefined,
313
+ ): T {
314
+ if (categoryCoercion !== undefined) {
315
+ return { ...response, categoryCoercion };
316
+ }
317
+ if (response.categoryCoercion === undefined) {
318
+ return response;
319
+ }
320
+ const { categoryCoercion: _stored, ...rest } = response;
321
+ return rest as T;
322
+ }
323
+
324
+ const categorySchema = (
325
+ z
326
+ .string()
327
+ .superRefine((value, ctx) => {
328
+ if (isMemoryCategory(value)) return;
329
+ if (PROJECT_CATEGORY_ALIASES[value] === true) return;
330
+ ctx.addIssue({
331
+ code: z.ZodIssueCode.custom,
332
+ message: `category must be one of: ${MEMORY_CATEGORY_NAMES.join(", ")}; for project state/facts use "fact"`,
333
+ });
334
+ })
335
+ .optional() as unknown as z.ZodType<MemoryCategory | undefined, z.ZodTypeDef, MemoryCategory | undefined>
336
+ );
268
337
  const confidenceSchema = z.number().min(0).max(1).optional();
269
338
  const tagsSchema = z.array(z.string().max(256)).max(50).optional();
270
339
  const entityRefSchema = z.string().trim().max(512).optional();
@@ -291,6 +291,7 @@ import {
291
291
  } from "./memory-worth-outcomes.js";
292
292
  import type { LcmMessagePartInput, MessagePartSourceFormat } from "./message-parts/index.js";
293
293
  import type { ObserveRequest, RecallRequest } from "./access-schema.js";
294
+ import { coerceProjectCategoryAlias, type CategoryAliasCoercion } from "./access-schema.js";
294
295
  import { recordObjectiveStateSnapshotsFromObservedMessages } from "./objective-state-writers.js";
295
296
  import { objectiveStateStoreOverrideForNamespace } from "./objective-state.js";
296
297
  import { offlineSyncStorageForSnapshot } from "./offline-sync-impression-drain.js";
@@ -980,6 +981,8 @@ export interface EngramAccessWriteResponse {
980
981
  duplicateOf?: string;
981
982
  idempotencyKey?: string;
982
983
  idempotencyReplay?: boolean;
984
+ /** #2780: set when a project-shaped category alias was coerced to "fact". */
985
+ categoryCoercion?: CategoryAliasCoercion;
983
986
  }
984
987
 
985
988
  export interface EngramAccessObserveMessage {
@@ -2935,7 +2938,11 @@ export class EngramAccessService extends SupportPassportAccessServiceBase {
2935
2938
  return this.accessObserveWriteSurface.memoryStore(request, hooks);
2936
2939
  }
2937
2940
 
2938
- async peekMemoryStoreIdempotency(request: EngramAccessMemoryStoreRequest): Promise<EngramAccessIdempotencyStatus> {
2941
+ async peekMemoryStoreIdempotency(
2942
+ rawRequest: EngramAccessMemoryStoreRequest
2943
+ ): Promise<EngramAccessIdempotencyStatus> {
2944
+ // #2780: fingerprint the COERCED category so peek never diverges from the write it predicts.
2945
+ const { request } = coerceProjectCategoryAlias(rawRequest);
2939
2946
  const namespace = await this.resolveCodingScopedWriteNamespace(request);
2940
2947
  const schemaVersion = request.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
2941
2948
  if (schemaVersion !== ENGRAM_ACCESS_WRITE_SCHEMA_VERSION) {
@@ -2970,8 +2977,10 @@ export class EngramAccessService extends SupportPassportAccessServiceBase {
2970
2977
  }
2971
2978
 
2972
2979
  async peekSuggestionSubmitIdempotency(
2973
- request: EngramAccessSuggestionSubmitRequest
2980
+ rawRequest: EngramAccessSuggestionSubmitRequest
2974
2981
  ): Promise<EngramAccessIdempotencyStatus> {
2982
+ // #2780: fingerprint the COERCED category so peek never diverges from the write it predicts.
2983
+ const { request } = coerceProjectCategoryAlias(rawRequest);
2975
2984
  const namespace = await this.resolveCodingScopedWriteNamespace(request);
2976
2985
  const schemaVersion = request.schemaVersion ?? ENGRAM_ACCESS_WRITE_SCHEMA_VERSION;
2977
2986
  if (schemaVersion !== ENGRAM_ACCESS_WRITE_SCHEMA_VERSION) {
@@ -19,7 +19,8 @@ test("parseActivityConfig defaults to an inert, search-only configuration", () =
19
19
  maxMemoriesPerDay: 0,
20
20
  timeline: {
21
21
  enabled: false,
22
- journal: { enabled: false, source: "file" },
22
+ analysis: { enabled: false },
23
+ journal: { enabled: false, source: "memoryDir", extractionMode: "off" },
23
24
  qa: { enabled: false, maxRangeDays: 31 },
24
25
  vault: {
25
26
  enabled: false,
@@ -36,6 +37,7 @@ test("parseActivityConfig defaults to an inert, search-only configuration", () =
36
37
  locations: { enabled: false, target: "daily", section: "Locations" },
37
38
  },
38
39
  insertUnderHeading: "",
40
+ readback: { journalSection: "" },
39
41
  wikilinks: { places: false, placesFolder: "Places" },
40
42
  properties: { mode: "off", prefix: "remnic_" },
41
43
  autoPublish: true,
@@ -174,6 +176,127 @@ test("activity config rejects a null maxMemoriesPerDay instead of silently uncap
174
176
  assert.throws(() => parseActivityConfig({ maxMemoriesPerDay: null }), /maxMemoriesPerDay/);
175
177
  });
176
178
 
179
+ test("activity timeline analysis defaults off with no provider settings stored", () => {
180
+ const timeline = parseActivityConfig(undefined).timeline;
181
+ assert.deepEqual(timeline.analysis, { enabled: false });
182
+ // The gate is independent of the timeline master switch and of capture.
183
+ assert.equal(parseActivityConfig({ timeline: { enabled: true } }).timeline.analysis.enabled, false);
184
+ });
185
+
186
+ test("activity timeline analysis parses a valid enabled block", () => {
187
+ const analysis = parseActivityConfig({
188
+ timeline: {
189
+ analysis: {
190
+ enabled: true,
191
+ provider: "openai",
192
+ model: "gpt-5.2",
193
+ timeoutMs: 30_000,
194
+ preferences: ["terse titles", "no emoji"],
195
+ },
196
+ },
197
+ }).timeline.analysis;
198
+ assert.deepEqual(analysis, {
199
+ enabled: true,
200
+ provider: "openai",
201
+ model: "gpt-5.2",
202
+ timeoutMs: 30_000,
203
+ preferences: ["terse titles", "no emoji"],
204
+ });
205
+ });
206
+
207
+ test("activity timeline analysis rejects enabling without an explicit provider and model", () => {
208
+ assert.throws(
209
+ () => parseActivityConfig({ timeline: { analysis: { enabled: true } } }),
210
+ /provider and model are required/,
211
+ );
212
+ assert.throws(
213
+ () => parseActivityConfig({ timeline: { analysis: { enabled: true, provider: "openai" } } }),
214
+ /provider and model are required/,
215
+ );
216
+ });
217
+
218
+ test("activity timeline analysis rejects prose or blank provider/model identifiers", () => {
219
+ for (const provider of ["Summarize this user's activity", " ", "has space"]) {
220
+ assert.throws(
221
+ () => parseActivityConfig({ timeline: { analysis: { provider, model: "m" } } }),
222
+ /activity\.timeline\.analysis\.provider must be an identifier/,
223
+ );
224
+ }
225
+ assert.throws(
226
+ () => parseActivityConfig({ timeline: { analysis: { provider: "openai", model: "" } } }),
227
+ /activity\.timeline\.analysis\.model must be an identifier/,
228
+ );
229
+ });
230
+
231
+ test("activity timeline analysis rejects a slash in the provider segment", () => {
232
+ assert.throws(
233
+ () =>
234
+ parseActivityConfig({
235
+ timeline: { analysis: { enabled: true, provider: "gateway/openai", model: "gpt-test" } },
236
+ }),
237
+ /provider must be a single provider segment/,
238
+ );
239
+ const ok = parseActivityConfig({
240
+ timeline: { analysis: { enabled: true, provider: "openai", model: "org/gpt-test" } },
241
+ }).timeline.analysis;
242
+ assert.equal(ok.model, "org/gpt-test");
243
+ });
244
+
245
+ test("activity timeline analysis rejects provider and model longer than metadata max", () => {
246
+ const tooLong = `m${"x".repeat(120)}`;
247
+ assert.throws(
248
+ () =>
249
+ parseActivityConfig({
250
+ timeline: { analysis: { enabled: true, provider: tooLong, model: "gpt-test" } },
251
+ }),
252
+ /provider must be at most 120 characters/,
253
+ );
254
+ assert.throws(
255
+ () =>
256
+ parseActivityConfig({
257
+ timeline: { analysis: { enabled: true, provider: "openai", model: tooLong } },
258
+ }),
259
+ /model must be at most 120 characters/,
260
+ );
261
+ });
262
+
263
+ test("activity timeline analysis rejects invalid timeout and preferences shapes", () => {
264
+ const base = { provider: "openai", model: "gpt-5.2" } as const;
265
+ for (const timeoutMs of [0, 999, 120_001, 1.5, "fast"]) {
266
+ assert.throws(
267
+ () => parseActivityConfig({ timeline: { analysis: { ...base, enabled: true, timeoutMs } } }),
268
+ /timeoutMs/,
269
+ );
270
+ }
271
+ assert.throws(
272
+ () => parseActivityConfig({ timeline: { analysis: { ...base, preferences: "terse" } } }),
273
+ /preferences must be an array/,
274
+ );
275
+ assert.throws(
276
+ () => parseActivityConfig({ timeline: { analysis: { ...base, preferences: [""] } } }),
277
+ /preferences entries/,
278
+ );
279
+ assert.throws(
280
+ () =>
281
+ parseActivityConfig({
282
+ timeline: { analysis: { ...base, preferences: Array.from({ length: 17 }, () => "p") } },
283
+ }),
284
+ /at most 16/,
285
+ );
286
+ assert.throws(
287
+ () => parseActivityConfig({ timeline: { analysis: { ...base, preferences: ["x".repeat(201)] } } }),
288
+ /at most 200 characters/,
289
+ );
290
+ });
291
+
292
+ test("activity timeline analysis rejects a non-object or non-boolean block", () => {
293
+ assert.throws(() => parseActivityConfig({ timeline: { analysis: "on" } }), /analysis must be an object/);
294
+ assert.throws(
295
+ () => parseActivityConfig({ timeline: { analysis: { enabled: 3 } } }),
296
+ /analysis\.enabled must be a boolean/,
297
+ );
298
+ });
299
+
177
300
  test("vault publish section names are rejected at config load when the publisher would reject them", () => {
178
301
  // `Timeline-->` and an embedded newline both pass a trimmed-string check
179
302
  // but break the `<!-- remnic:<name>:start -->` marker, so `publishVaultNote`