@remnic/core 9.69.33 → 9.69.34

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 (759) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -11
  2. package/dist/access-admin-ops-surface.js +61 -56
  3. package/dist/access-authorization-probe.d.ts +13 -11
  4. package/dist/access-authorization-probe.js +62 -57
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +61 -56
  7. package/dist/access-cli.js +129 -125
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +2 -1
  10. package/dist/access-coding-context-resolution.js +3 -3
  11. package/dist/access-extraction-force-flush.d.ts +13 -11
  12. package/dist/access-extraction-force-flush.js +61 -56
  13. package/dist/access-health-types.d.ts +2 -1
  14. package/dist/access-http-briefing.d.ts +13 -11
  15. package/dist/access-http-briefing.js +62 -57
  16. package/dist/access-http-lcm-compaction.d.ts +13 -11
  17. package/dist/access-http-lifecycle-flush.d.ts +13 -11
  18. package/dist/access-http-offline-stream.d.ts +13 -11
  19. package/dist/access-http-query.d.ts +3 -2
  20. package/dist/access-http-query.js +63 -58
  21. package/dist/access-http.d.ts +14 -12
  22. package/dist/access-http.js +82 -78
  23. package/dist/access-identity-continuity-surface.d.ts +11 -9
  24. package/dist/access-identity-continuity-surface.js +61 -56
  25. package/dist/access-lcm-surface.d.ts +13 -11
  26. package/dist/access-lcm-surface.js +61 -56
  27. package/dist/access-mcp.d.ts +13 -11
  28. package/dist/access-mcp.js +70 -66
  29. package/dist/access-memory-search-fanout.d.ts +3 -2
  30. package/dist/{access-namespace-preflight-DMR-jOMS.d.ts → access-namespace-preflight-kXG8MvYx.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +4 -3
  32. package/dist/access-namespace-preflight.js +61 -56
  33. package/dist/access-observe-transcript.d.ts +11 -9
  34. package/dist/access-observe-transcript.js +3 -3
  35. package/dist/access-observe-write-surface.d.ts +15 -13
  36. package/dist/access-observe-write-surface.js +61 -56
  37. package/dist/access-offline-manifest.d.ts +47 -11
  38. package/dist/access-offline-manifest.js +18 -16
  39. package/dist/access-operations-batch.js +64 -60
  40. package/dist/access-operations.d.ts +14 -12
  41. package/dist/access-operations.js +69 -65
  42. package/dist/access-recall-concurrency.d.ts +13 -11
  43. package/dist/access-recall-concurrency.js +61 -56
  44. package/dist/access-recall-response.d.ts +13 -11
  45. package/dist/access-recall-response.js +61 -56
  46. package/dist/access-recall-surface.d.ts +13 -11
  47. package/dist/access-recall-surface.js +61 -56
  48. package/dist/access-schema.d.ts +55 -13
  49. package/dist/access-schema.js +15 -1
  50. package/dist/{access-service-CJQoQvRa.d.ts → access-service-WUm2LnXZ.d.ts} +52 -50
  51. package/dist/access-service-helpers.d.ts +13 -11
  52. package/dist/access-service.d.ts +13 -11
  53. package/dist/access-service.js +61 -56
  54. package/dist/access-surface-catalog.d.ts +13 -11
  55. package/dist/access-surface-catalog.js +63 -58
  56. package/dist/access-surface-catalog.js.map +1 -1
  57. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  58. package/dist/action-confidence.d.ts +2 -1
  59. package/dist/active-memory-bridge.d.ts +2 -1
  60. package/dist/active-memory-bridge.js +2 -2
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +12 -10
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +2 -1
  65. package/dist/adapters/index.d.ts +46 -1
  66. package/dist/adapters/index.js +10 -6
  67. package/dist/adapters/registry.js +2 -2
  68. package/dist/ambient-provenance.d.ts +2 -1
  69. package/dist/artifact-search.d.ts +2 -1
  70. package/dist/{auto-sync-NSHLUAQI.js → auto-sync-4YFATLFQ.js} +10 -9
  71. package/dist/{auto-sync-NSHLUAQI.js.map → auto-sync-4YFATLFQ.js.map} +1 -1
  72. package/dist/behavior-learner.d.ts +2 -1
  73. package/dist/behavior-signals.d.ts +2 -1
  74. package/dist/bootstrap.d.ts +11 -9
  75. package/dist/briefing-window.d.ts +3 -2
  76. package/dist/briefing.d.ts +3 -2
  77. package/dist/briefing.js +25 -24
  78. package/dist/buffer-surprise-report.d.ts +2 -1
  79. package/dist/buffer-turn-helpers.d.ts +2 -1
  80. package/dist/buffer.d.ts +3 -2
  81. package/dist/buffer.js +11 -10
  82. package/dist/bulk-import/index.d.ts +4 -3
  83. package/dist/calibration.d.ts +2 -1
  84. package/dist/calibration.js +3 -2
  85. package/dist/calibration.js.map +1 -1
  86. package/dist/capabilities.d.ts +2 -1
  87. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-ZCXUPLNJ.js} +2 -2
  88. package/dist/{catalog-8O9KY9eA.d.ts → catalog-BaCx29iv.d.ts} +1 -1
  89. package/dist/causal-behavior.d.ts +2 -1
  90. package/dist/causal-consolidation.d.ts +2 -1
  91. package/dist/causal-consolidation.js +26 -25
  92. package/dist/causal-consolidation.js.map +1 -1
  93. package/dist/causal-trajectory-graph.d.ts +2 -1
  94. package/dist/{chunk-CDKHKZL5.js → chunk-2524MOWK.js} +2 -2
  95. package/dist/{chunk-HVAEXYPL.js → chunk-255PC37A.js} +47 -25
  96. package/dist/chunk-255PC37A.js.map +1 -0
  97. package/dist/{chunk-7BMXZCOT.js → chunk-2AU4D4HQ.js} +3 -3
  98. package/dist/{chunk-LTIZHLV7.js → chunk-2JCA2PQT.js} +2 -2
  99. package/dist/{chunk-XXIHX75O.js → chunk-2UZ5ZH6W.js} +3 -3
  100. package/dist/{chunk-QOIOACIE.js → chunk-326KUXIR.js} +15 -648
  101. package/dist/chunk-326KUXIR.js.map +1 -0
  102. package/dist/{chunk-P3SB5BNT.js → chunk-34QW2LK2.js} +2 -2
  103. package/dist/{chunk-EONF76DT.js → chunk-36UBSLFN.js} +2 -2
  104. package/dist/{chunk-DBQWVT2H.js → chunk-3CBI2ZSA.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-TCUKRAMK.js → chunk-4JVQRFZD.js} +7 -7
  108. package/dist/{chunk-22FVR2KE.js → chunk-4MIS4CQW.js} +6 -2
  109. package/dist/chunk-4MIS4CQW.js.map +1 -0
  110. package/dist/{chunk-PYLL63BF.js → chunk-4PB2MBY6.js} +9 -9
  111. package/dist/{chunk-UUQG7HAD.js → chunk-4WCNPQQ5.js} +4 -4
  112. package/dist/{chunk-UGPUYIET.js → chunk-5A7ZUOBA.js} +220 -399
  113. package/dist/chunk-5A7ZUOBA.js.map +1 -0
  114. package/dist/chunk-5HYUUFMQ.js +1280 -0
  115. package/dist/chunk-5HYUUFMQ.js.map +1 -0
  116. package/dist/{chunk-H4VH5VIB.js → chunk-5QBDLMGG.js} +2 -2
  117. package/dist/{chunk-RKBLRTNT.js → chunk-5SDSVX7N.js} +2 -2
  118. package/dist/{chunk-DGGB65KC.js → chunk-5THU7NFP.js} +3 -3
  119. package/dist/{chunk-N7RWREIQ.js → chunk-65RENJGB.js} +6 -1
  120. package/dist/chunk-65RENJGB.js.map +1 -0
  121. package/dist/{chunk-BPJNF7J2.js → chunk-6CCRSQWT.js} +2 -2
  122. package/dist/{chunk-XXE5P6HJ.js → chunk-6XYC7NM4.js} +2 -2
  123. package/dist/{chunk-J7HFPA6O.js → chunk-6YAIN5XJ.js} +2 -2
  124. package/dist/{chunk-I5DZ3WGR.js → chunk-757NP436.js} +3 -3
  125. package/dist/{chunk-2C3S7J2S.js → chunk-7CAY3YKP.js} +741 -28
  126. package/dist/chunk-7CAY3YKP.js.map +1 -0
  127. package/dist/{chunk-E6TDQRF6.js → chunk-7J2CGXG3.js} +2 -2
  128. package/dist/{chunk-BUTCAMJM.js → chunk-A2YQL2FF.js} +5 -5
  129. package/dist/chunk-A5UQ52YQ.js +211 -0
  130. package/dist/chunk-A5UQ52YQ.js.map +1 -0
  131. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  132. package/dist/{chunk-R3HKWWUB.js → chunk-A7WOWDZK.js} +2 -2
  133. package/dist/{chunk-6N3TQFZU.js → chunk-AIKTQVV3.js} +3 -3
  134. package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
  135. package/dist/{chunk-W27OW7AB.js → chunk-APFKZVJS.js} +2 -2
  136. package/dist/{chunk-B325AGLK.js → chunk-AQIRQUCP.js} +2 -2
  137. package/dist/{chunk-S7T2TY65.js → chunk-AXFR2NQ5.js} +3 -3
  138. package/dist/{chunk-FCSZ4K2X.js → chunk-BJJWRWER.js} +3 -3
  139. package/dist/{chunk-JT3EB7ZL.js → chunk-BNGHPYZU.js} +5 -5
  140. package/dist/chunk-BRZWWUCJ.js +13 -0
  141. package/dist/{chunk-FYDW33ZB.js.map → chunk-BRZWWUCJ.js.map} +1 -1
  142. package/dist/{chunk-N57A4KPV.js → chunk-C2BFTYD7.js} +2 -2
  143. package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
  144. package/dist/{chunk-Q726HSJO.js → chunk-CRUFVJOX.js} +16 -15
  145. package/dist/chunk-CRUFVJOX.js.map +1 -0
  146. package/dist/{chunk-X35W4S3L.js → chunk-D3IZCN5P.js} +4 -4
  147. package/dist/{chunk-44T3Y7SZ.js → chunk-EJIEQOPB.js} +5 -5
  148. package/dist/{chunk-ET356KSB.js → chunk-F4TWWUMP.js} +2 -2
  149. package/dist/{chunk-CLLPJ6QT.js → chunk-FQXJAC3T.js} +2 -2
  150. package/dist/{chunk-DD5JFCWM.js → chunk-GCBIXUPT.js} +2 -2
  151. package/dist/{chunk-N2ZNPHA3.js → chunk-IFFLUCCU.js} +2 -2
  152. package/dist/{chunk-RHQMKJFG.js → chunk-ISYZ5DUI.js} +51 -47
  153. package/dist/{chunk-RHQMKJFG.js.map → chunk-ISYZ5DUI.js.map} +1 -1
  154. package/dist/{chunk-PFFZWDPE.js → chunk-JZDH2ZZK.js} +3 -3
  155. package/dist/{chunk-TX2UTLXC.js → chunk-K6IPSW5B.js} +2 -2
  156. package/dist/{chunk-4MHYKEOM.js → chunk-KDJHLOZP.js} +10 -10
  157. package/dist/{chunk-KCB7F4J7.js → chunk-KYGOQV37.js} +2 -2
  158. package/dist/{chunk-JEIXTYVG.js → chunk-L2QLDZJC.js} +46 -17
  159. package/dist/chunk-L2QLDZJC.js.map +1 -0
  160. package/dist/{chunk-A7XEPMQ6.js → chunk-LAVJC57X.js} +3 -3
  161. package/dist/chunk-LAVJC57X.js.map +1 -0
  162. package/dist/{chunk-VZWXFXLX.js → chunk-LMCD5W5B.js} +2 -2
  163. package/dist/{chunk-3QQTXYZ6.js → chunk-LSLCFCCQ.js} +2 -1
  164. package/dist/chunk-LSLCFCCQ.js.map +1 -0
  165. package/dist/{chunk-MKD3OMPS.js → chunk-M3MYMWXG.js} +2 -2
  166. package/dist/{chunk-PL7FYKHT.js → chunk-MMG5K6XJ.js} +2 -2
  167. package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
  168. package/dist/{chunk-E6JA6XWY.js → chunk-ND2O2PVN.js} +1013 -1317
  169. package/dist/chunk-ND2O2PVN.js.map +1 -0
  170. package/dist/chunk-NPNSKE76.js +220 -0
  171. package/dist/chunk-NPNSKE76.js.map +1 -0
  172. package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
  173. package/dist/{chunk-DB5TGMLZ.js → chunk-OZUXKUPD.js} +6 -4
  174. package/dist/{chunk-DB5TGMLZ.js.map → chunk-OZUXKUPD.js.map} +1 -1
  175. package/dist/chunk-PCEYGOSL.js +66 -0
  176. package/dist/chunk-PCEYGOSL.js.map +1 -0
  177. package/dist/{chunk-LSYDG6MJ.js → chunk-PEXW2JCK.js} +2 -2
  178. package/dist/{chunk-EEOUMG3J.js → chunk-PWPIERBM.js} +38 -6
  179. package/dist/chunk-PWPIERBM.js.map +1 -0
  180. package/dist/chunk-Q4AUIFUA.js +111 -0
  181. package/dist/chunk-Q4AUIFUA.js.map +1 -0
  182. package/dist/{chunk-SO7SV523.js → chunk-Q6LCCIZN.js} +1 -1
  183. package/dist/chunk-Q6LCCIZN.js.map +1 -0
  184. package/dist/{chunk-MOZXTRC2.js → chunk-QF4J3KMV.js} +19 -19
  185. package/dist/{chunk-JGHXXQ2G.js → chunk-QLJ6762U.js} +2 -2
  186. package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
  187. package/dist/{chunk-CETXNLEX.js → chunk-RQO3J4MR.js} +2 -2
  188. package/dist/{chunk-5NANRSCD.js → chunk-RR7G2X7C.js} +5 -5
  189. package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
  190. package/dist/{chunk-EQHDH4C2.js → chunk-S76KRJDG.js} +3 -3
  191. package/dist/{chunk-H272ZPQ3.js → chunk-SHEHQBCG.js} +124 -23
  192. package/dist/chunk-SHEHQBCG.js.map +1 -0
  193. package/dist/{chunk-EEC4PCG5.js → chunk-SZDLX763.js} +2 -2
  194. package/dist/{chunk-MFDTVQJX.js → chunk-SZWEDG3H.js} +12 -6
  195. package/dist/chunk-SZWEDG3H.js.map +1 -0
  196. package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
  197. package/dist/{chunk-JSN44KIB.js → chunk-T2YFZ27G.js} +9 -9
  198. package/dist/{chunk-227UFSEQ.js → chunk-TFA6HPOA.js} +2 -2
  199. package/dist/{chunk-BA6WOZOT.js → chunk-TK4FHQRN.js} +4 -4
  200. package/dist/chunk-TLHNF6GA.js +647 -0
  201. package/dist/chunk-TLHNF6GA.js.map +1 -0
  202. package/dist/{chunk-NB5BCFUY.js → chunk-TWYTGIBR.js} +4 -4
  203. package/dist/{chunk-FDLDOEO6.js → chunk-UBG4GAEP.js} +51 -6
  204. package/dist/chunk-UBG4GAEP.js.map +1 -0
  205. package/dist/{chunk-MWFGUESQ.js → chunk-UEZKN6VR.js} +2 -2
  206. package/dist/{chunk-H5AFCNGA.js → chunk-UJX4I26O.js} +2 -2
  207. package/dist/{chunk-BLUYQFRH.js → chunk-VELCIWJZ.js} +15 -11
  208. package/dist/chunk-VELCIWJZ.js.map +1 -0
  209. package/dist/{chunk-PBGVVDLY.js → chunk-VIZR45AN.js} +2 -2
  210. package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
  211. package/dist/{chunk-JTH2SE6B.js → chunk-W5BLTZZJ.js} +8 -8
  212. package/dist/chunk-W6IJMWTZ.js +72 -0
  213. package/dist/chunk-W6IJMWTZ.js.map +1 -0
  214. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  215. package/dist/{chunk-YFLLGRXO.js → chunk-X2QPKLPL.js} +2 -2
  216. package/dist/{chunk-MN3LK3KN.js → chunk-X424T5JQ.js} +2 -2
  217. package/dist/{chunk-5BCNEBEN.js → chunk-XPJNT6PI.js} +4 -4
  218. package/dist/{chunk-2JVJ7UHC.js → chunk-XQU3CPF2.js} +4 -2
  219. package/dist/chunk-XQU3CPF2.js.map +1 -0
  220. package/dist/chunk-XW2T4QAW.js +1 -0
  221. package/dist/{chunk-D223ZDQV.js → chunk-YEDVOYL2.js} +2 -2
  222. package/dist/{chunk-TLPZ6MKZ.js → chunk-YEN4TREG.js} +541 -5
  223. package/dist/chunk-YEN4TREG.js.map +1 -0
  224. package/dist/{chunk-RC5DXXWC.js → chunk-YM7YN37H.js} +2 -2
  225. package/dist/{chunk-VLXBE57O.js → chunk-YVGXH72Y.js} +2 -2
  226. package/dist/{chunk-YQAXP5AC.js → chunk-YXLUTALO.js} +5 -5
  227. package/dist/{chunk-OQDPBRQ6.js → chunk-Z7YDVHDI.js} +2 -2
  228. package/dist/{chunk-O75CRYGF.js → chunk-ZEFVK7XC.js} +1 -1
  229. package/dist/chunk-ZEFVK7XC.js.map +1 -0
  230. package/dist/{chunk-XUE46UYW.js → chunk-ZLN7AROH.js} +6 -6
  231. package/dist/{chunk-HV7OY4DM.js → chunk-ZMKYCFJ7.js} +640 -199
  232. package/dist/chunk-ZMKYCFJ7.js.map +1 -0
  233. package/dist/{chunk-HK32G473.js → chunk-ZWEZXVYH.js} +2 -2
  234. package/dist/{cli-D57e2Mqt.d.ts → cli-5mTYh1Tn.d.ts} +5 -5
  235. package/dist/cli-fallback.d.ts +11 -4
  236. package/dist/cli-fallback.js +5 -1
  237. package/dist/cli.d.ts +15 -13
  238. package/dist/cli.js +102 -98
  239. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  240. package/dist/coding/export-okf-codegraph.js +31 -29
  241. package/dist/coding/export-okf-codegraph.js.map +1 -1
  242. package/dist/coding/pre-action-gate.d.ts +2 -1
  243. package/dist/compat/checks.js +2 -2
  244. package/dist/compat/codex-cli-fallback.d.ts +1 -1
  245. package/dist/compat/codex-cli-fallback.js +5 -1
  246. package/dist/compat/codex-cli-fallback.js.map +1 -1
  247. package/dist/compounding/engine.d.ts +3 -2
  248. package/dist/compounding/engine.js +26 -25
  249. package/dist/compounding/preference-consolidator.d.ts +2 -1
  250. package/dist/compression-optimizer.d.ts +2 -1
  251. package/dist/config.d.ts +2 -1
  252. package/dist/config.js +12 -10
  253. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  254. package/dist/connectors/codex-materialize-runner.js +25 -24
  255. package/dist/connectors/codex-materialize.d.ts +2 -1
  256. package/dist/connectors/index.d.ts +2 -1
  257. package/dist/connectors/index.js +27 -26
  258. package/dist/consolidation-provenance-check.d.ts +3 -2
  259. package/dist/consolidation-undo.d.ts +3 -2
  260. package/dist/contradiction/index.d.ts +4 -3
  261. package/dist/contradiction/index.js +5 -5
  262. package/dist/{contradiction-scan-NOYMFG66.js → contradiction-scan-GVD4JJ7B.js} +3 -3
  263. package/dist/converge-config.d.ts +2 -1
  264. package/dist/convergence-refresh.d.ts +3 -2
  265. package/dist/convergence-refresh.js +27 -26
  266. package/dist/conversation-index/backend.d.ts +2 -1
  267. package/dist/conversation-index/backend.js +3 -3
  268. package/dist/conversation-index/chunker.d.ts +2 -1
  269. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  270. package/dist/conversation-index/faiss-adapter.js +2 -2
  271. package/dist/conversation-index/indexer.d.ts +2 -1
  272. package/dist/conversation-index/search.d.ts +2 -1
  273. package/dist/corpus-watermark.d.ts +2 -1
  274. package/dist/corpus-watermark.js +28 -27
  275. package/dist/cross-lingual-recall.d.ts +2 -1
  276. package/dist/day-summary.d.ts +2 -1
  277. package/dist/deep-recall-http-glue.d.ts +13 -11
  278. package/dist/deep-recall-http-glue.js +12 -2
  279. package/dist/deep-recall-mcp-tools.d.ts +13 -11
  280. package/dist/deep-recall-policy-llm.d.ts +2 -1
  281. package/dist/deep-recall-policy-llm.js +4 -3
  282. package/dist/deep-recall-seeds.d.ts +2 -1
  283. package/dist/delinearize.d.ts +2 -1
  284. package/dist/dependency-propagation-config.d.ts +2 -1
  285. package/dist/{dependency-propagation-delivery-CmniEsUK.d.ts → dependency-propagation-delivery-CDQCxNll.d.ts} +1 -1
  286. package/dist/direct-answer-wiring.d.ts +2 -1
  287. package/dist/direct-answer.d.ts +2 -1
  288. package/dist/embedding-fallback.d.ts +2 -1
  289. package/dist/enrichment/index.d.ts +2 -1
  290. package/dist/entity-origin-fields.d.ts +2 -1
  291. package/dist/entity-retrieval.d.ts +3 -2
  292. package/dist/entity-retrieval.js +25 -24
  293. package/dist/entity-schema.d.ts +2 -1
  294. package/dist/episodic-context.d.ts +2 -1
  295. package/dist/eval-trajectory-contracts.d.ts +2 -1
  296. package/dist/eval-trajectory-store.d.ts +2 -1
  297. package/dist/eval-trajectory.d.ts +2 -1
  298. package/dist/explicit-capture.d.ts +11 -9
  299. package/dist/explicit-capture.js +6 -6
  300. package/dist/external-wiki-access.d.ts +13 -11
  301. package/dist/external-wiki-access.js +62 -57
  302. package/dist/external-wiki-collection-registration.d.ts +2 -1
  303. package/dist/external-wiki-collection.d.ts +2 -1
  304. package/dist/external-wiki-mcp-tools.d.ts +13 -11
  305. package/dist/extraction-error-classification.d.ts +2 -1
  306. package/dist/extraction-faithfulness.d.ts +2 -1
  307. package/dist/extraction-faithfulness.js +4 -3
  308. package/dist/extraction-judge-telemetry.d.ts +2 -1
  309. package/dist/extraction-judge-training.d.ts +2 -1
  310. package/dist/extraction-judge.d.ts +2 -1
  311. package/dist/extraction-judge.js +5 -4
  312. package/dist/extraction-liveness.d.ts +2 -1
  313. package/dist/extraction-normalization.d.ts +2 -1
  314. package/dist/extraction-prompt.d.ts +2 -1
  315. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  316. package/dist/extraction-source-grounding.d.ts +2 -1
  317. package/dist/extraction.d.ts +2 -1
  318. package/dist/extraction.js +36 -34
  319. package/dist/fallback-llm.d.ts +2 -1
  320. package/dist/fallback-llm.js +3 -2
  321. package/dist/{first-start-migration-RC345GPL.js → first-start-migration-L3UFX5CU.js} +3 -3
  322. package/dist/generic-recall-paths-CqAZyXKX.d.ts +23 -0
  323. package/dist/graph-append-error.d.ts +2 -1
  324. package/dist/graph-dashboard-diff.d.ts +2 -1
  325. package/dist/graph-dashboard-key.d.ts +2 -1
  326. package/dist/graph-dashboard-parser.d.ts +2 -1
  327. package/dist/graph-edge-reinforcement.d.ts +2 -1
  328. package/dist/graph-jsonl.d.ts +2 -1
  329. package/dist/graph-path-reconstruction.d.ts +2 -1
  330. package/dist/graph-path-scoring.d.ts +2 -1
  331. package/dist/graph-snapshot.d.ts +2 -1
  332. package/dist/graph.d.ts +2 -1
  333. package/dist/harmonic-retrieval.js +2 -2
  334. package/dist/importance.d.ts +2 -1
  335. package/dist/importers/index.d.ts +2 -1
  336. package/dist/importers/test-utils.d.ts +2 -1
  337. package/dist/in-flight-reads.d.ts +2 -1
  338. package/dist/{index-BTAsSkPG.d.ts → index-BNluTxBp.d.ts} +2 -2
  339. package/dist/index.d.ts +302 -245
  340. package/dist/index.js +307 -205
  341. package/dist/intent.d.ts +2 -1
  342. package/dist/lcm/engine.d.ts +2 -1
  343. package/dist/lcm/engine.js +2 -2
  344. package/dist/lcm/index.d.ts +2 -1
  345. package/dist/lcm/index.js +4 -4
  346. package/dist/lcm/tools.d.ts +2 -1
  347. package/dist/lifecycle.d.ts +2 -1
  348. package/dist/live-connectors-runner.d.ts +2 -1
  349. package/dist/local-llm.d.ts +4 -1
  350. package/dist/local-llm.js +2 -2
  351. package/dist/local-model-endpoint.d.ts +2 -1
  352. package/dist/location/index.d.ts +4 -3
  353. package/dist/location/index.js +28 -27
  354. package/dist/maintenance/memory-governance.d.ts +2 -1
  355. package/dist/maintenance/memory-governance.js +25 -24
  356. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  357. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -24
  358. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  359. package/dist/maintenance/rebuild-memory-projection.js +26 -25
  360. package/dist/{maintenance-DCvQGTzL.d.ts → maintenance-8hmWOMY_.d.ts} +378 -4
  361. package/dist/mcp-memory-inspector-app.d.ts +13 -11
  362. package/dist/memory-action-policy.d.ts +2 -1
  363. package/dist/memory-cache.d.ts +2 -1
  364. package/dist/memory-controller.d.ts +2 -1
  365. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  366. package/dist/memory-projection-store.d.ts +2 -1
  367. package/dist/memory-provenance.d.ts +2 -1
  368. package/dist/memory-snapshot.d.ts +2 -1
  369. package/dist/memory-subject-cli.d.ts +13 -11
  370. package/dist/memory-subject.d.ts +13 -11
  371. package/dist/memory-worth-outcomes.d.ts +3 -2
  372. package/dist/migrate/from-engram.js +2 -2
  373. package/dist/models-json.d.ts +2 -1
  374. package/dist/namespaces/migrate.d.ts +4 -3
  375. package/dist/namespaces/migrate.js +26 -25
  376. package/dist/namespaces/principal.d.ts +2 -1
  377. package/dist/namespaces/search.d.ts +2 -1
  378. package/dist/namespaces/search.js +8 -8
  379. package/dist/namespaces/storage.d.ts +4 -3
  380. package/dist/namespaces/storage.js +25 -24
  381. package/dist/native-knowledge.d.ts +2 -1
  382. package/dist/network/tailscale.js +2 -2
  383. package/dist/offline-sync-impression-drain.d.ts +2 -1
  384. package/dist/offline-sync-impression-drain.js +6 -6
  385. package/dist/operator-doctor-corpus.d.ts +2 -1
  386. package/dist/operator-doctor-corpus.js +29 -28
  387. package/dist/operator-doctor-replica.d.ts +2 -1
  388. package/dist/operator-toolkit.d.ts +4 -3
  389. package/dist/operator-toolkit.js +43 -41
  390. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  391. package/dist/orchestration/maintenance.d.ts +5 -4
  392. package/dist/orchestration/maintenance.js +43 -38
  393. package/dist/{orchestrator-CvCsp1tz.d.ts → orchestrator-BUd_3Q86.d.ts} +17 -29
  394. package/dist/orchestrator.d.ts +11 -9
  395. package/dist/orchestrator.js +133 -127
  396. package/dist/patterns-cli.d.ts +2 -1
  397. package/dist/{pipeline-JAdwKBS7.d.ts → pipeline-Dv1Bv0ma.d.ts} +1 -1
  398. package/dist/policy-runtime.d.ts +2 -1
  399. package/dist/proactive-contention.d.ts +2 -1
  400. package/dist/provenance.d.ts +2 -1
  401. package/dist/{public-http-h-yWu9rj.d.ts → public-http-L-IymRBN.d.ts} +1 -1
  402. package/dist/{qmd-Cvw9RWKr.d.ts → qmd-Mj508lHA.d.ts} +1 -1
  403. package/dist/qmd-preflight.d.ts +3 -2
  404. package/dist/qmd-recall-cache.d.ts +2 -1
  405. package/dist/qmd.d.ts +3 -2
  406. package/dist/qmd.js +2 -2
  407. package/dist/recall-concurrency-config.d.ts +2 -1
  408. package/dist/recall-disclosure-escalation.d.ts +2 -1
  409. package/dist/recall-explain-renderer.d.ts +2 -1
  410. package/dist/recall-explain-renderer.js +3 -3
  411. package/dist/recall-memory-map.d.ts +2 -1
  412. package/dist/recall-navigate-access.d.ts +2 -1
  413. package/dist/recall-navigate-access.js +2 -2
  414. package/dist/recall-navigate-disclosure.d.ts +2 -1
  415. package/dist/recall-navigate-disclosure.js +1 -1
  416. package/dist/recall-navigate.d.ts +2 -1
  417. package/dist/recall-navigate.js +2 -2
  418. package/dist/recall-planner-llm.d.ts +2 -1
  419. package/dist/recall-planner-llm.js +3 -2
  420. package/dist/recall-planner-llm.js.map +1 -1
  421. package/dist/recall-state-view-admission.d.ts +56 -0
  422. package/dist/recall-state-view-admission.js +39 -0
  423. package/dist/recall-state-view-inject.js +2 -2
  424. package/dist/recall-state-view-render.js +2 -2
  425. package/dist/recall-state-view-widen.d.ts +18 -1
  426. package/dist/recall-state-view-widen.js +2 -2
  427. package/dist/recall-state-view-wire.d.ts +1 -1
  428. package/dist/recall-state-view-wire.js +3 -3
  429. package/dist/recall-state-view.d.ts +1 -0
  430. package/dist/recall-state-view.js +1 -1
  431. package/dist/recall-state.d.ts +2 -1
  432. package/dist/recall-tag-filter.d.ts +2 -1
  433. package/dist/recall-timings.d.ts +2 -1
  434. package/dist/recall-xray-cli.d.ts +2 -1
  435. package/dist/recall-xray-cli.js +4 -4
  436. package/dist/recall-xray-renderer.d.ts +2 -1
  437. package/dist/recall-xray-renderer.js +3 -3
  438. package/dist/recall-xray.d.ts +9 -1
  439. package/dist/recall-xray.js +2 -2
  440. package/dist/reconcile/cursor.d.ts +11 -2
  441. package/dist/reconcile/cursor.js +6 -4
  442. package/dist/reconcile/cursor.js.map +1 -1
  443. package/dist/reconcile/manifest.d.ts +37 -2
  444. package/dist/reconcile/manifest.js +15 -5
  445. package/dist/reconcile/plan.d.ts +2 -1
  446. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  447. package/dist/replay/normalizers/claude.d.ts +2 -1
  448. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  449. package/dist/replay/normalizers/shared.d.ts +2 -1
  450. package/dist/replay/runner.d.ts +2 -1
  451. package/dist/replay/types.d.ts +2 -1
  452. package/dist/replica-divergence.d.ts +2 -1
  453. package/dist/replica-peers-config.d.ts +2 -1
  454. package/dist/{resolution-VKATP2HT.js → resolution-OHJZG45O.js} +6 -6
  455. package/dist/resolution-OHJZG45O.js.map +1 -0
  456. package/dist/resolve-auth-token.d.ts +2 -1
  457. package/dist/resume-bundles.js +13 -11
  458. package/dist/retrieval-agents.d.ts +3 -2
  459. package/dist/retrieval-tiers.d.ts +2 -1
  460. package/dist/routing/engine.d.ts +2 -1
  461. package/dist/routing/store.d.ts +2 -1
  462. package/dist/runtime/child-process.d.ts +1 -1
  463. package/dist/runtime/child-process.js +1 -1
  464. package/dist/salvage-envelope.d.ts +2 -1
  465. package/dist/salvage-envelope.js +2 -2
  466. package/dist/{scope-profiles-BShpTPeV.d.ts → scope-profiles-B6BGVbxm.d.ts} +1 -1
  467. package/dist/search/embed-helper.d.ts +2 -1
  468. package/dist/search/factory.d.ts +2 -1
  469. package/dist/search/factory.js +7 -7
  470. package/dist/search/index.d.ts +2 -1
  471. package/dist/search/index.js +11 -11
  472. package/dist/search/lancedb-backend.d.ts +2 -1
  473. package/dist/search/meilisearch-backend.d.ts +2 -1
  474. package/dist/search/noop-backend.d.ts +2 -1
  475. package/dist/search/orama-backend.d.ts +2 -1
  476. package/dist/search/port.d.ts +2 -1
  477. package/dist/search/remote-backend.d.ts +2 -1
  478. package/dist/{semantic-consolidation-CusOpe9F.d.ts → semantic-consolidation-J-598F5M.d.ts} +1 -1
  479. package/dist/semantic-consolidation.d.ts +3 -2
  480. package/dist/semantic-consolidation.js +26 -25
  481. package/dist/semantic-rule-promotion.js +25 -24
  482. package/dist/semantic-rule-verifier.d.ts +2 -1
  483. package/dist/semantic-rule-verifier.js +25 -24
  484. package/dist/{service-BbuVh1eS.d.ts → service-ZQkJ52cz.d.ts} +2 -2
  485. package/dist/session-observer-bands.d.ts +2 -1
  486. package/dist/session-observer-state.d.ts +2 -1
  487. package/dist/shared-context/manager.d.ts +2 -1
  488. package/dist/signal.d.ts +2 -1
  489. package/dist/source-agent-qualifier.d.ts +2 -1
  490. package/dist/source-agent-qualifier.js +34 -32
  491. package/dist/standup/build.js +25 -24
  492. package/dist/{storage-BBLLuVTF.d.ts → storage-CU_hZUgP.d.ts} +67 -6
  493. package/dist/storage.d.ts +4 -3
  494. package/dist/storage.js +24 -23
  495. package/dist/subject-config.d.ts +2 -1
  496. package/dist/subject-config.js +2 -2
  497. package/dist/summarizer.d.ts +2 -1
  498. package/dist/summarizer.js +5 -5
  499. package/dist/summary-snapshot.d.ts +2 -1
  500. package/dist/support-passport/index.d.ts +49 -15
  501. package/dist/support-passport/index.js +69 -60
  502. package/dist/temporal-supersession.d.ts +3 -2
  503. package/dist/temporal-timeline-recall.d.ts +2 -1
  504. package/dist/temporal-validity.d.ts +2 -1
  505. package/dist/threading.d.ts +2 -1
  506. package/dist/tier-migration.d.ts +3 -2
  507. package/dist/tier-routing.d.ts +2 -1
  508. package/dist/tier-routing.js +2 -2
  509. package/dist/{tier-stats-KA6OZX2C.js → tier-stats-VK5PCO2L.js} +3 -3
  510. package/dist/topics.d.ts +2 -1
  511. package/dist/transcript.d.ts +2 -1
  512. package/dist/transfer/capsule-import.js +1 -1
  513. package/dist/transfer/export-okf.d.ts +2 -1
  514. package/dist/transfer/export-okf.js +26 -25
  515. package/dist/transfer/types.d.ts +24 -24
  516. package/dist/trust-score-stage.d.ts +2 -1
  517. package/dist/trust-score.d.ts +2 -1
  518. package/dist/{types-igV4-sbB.d.ts → types-BGxTvLBO.d.ts} +58 -13
  519. package/dist/types.d.ts +2 -1
  520. package/dist/types.js +1 -1
  521. package/dist/utility-runtime.d.ts +2 -1
  522. package/dist/verified-recall.js +25 -24
  523. package/dist/who-knows-cli.d.ts +13 -11
  524. package/dist/who-knows-cli.js +26 -25
  525. package/dist/who-knows.d.ts +13 -11
  526. package/dist/who-knows.js +25 -24
  527. package/dist/write-envelope.d.ts +4 -2
  528. package/dist/write-envelope.js +3 -1
  529. package/package.json +2 -2
  530. package/src/access-category-alias.test.ts +216 -0
  531. package/src/access-mcp.test.ts +73 -0
  532. package/src/access-mcp.ts +6 -6
  533. package/src/access-observe-write-surface.ts +19 -4
  534. package/src/access-offline-manifest.ts +297 -16
  535. package/src/access-recall-surface.ts +5 -5
  536. package/src/access-schema.ts +76 -7
  537. package/src/access-service.ts +11 -2
  538. package/src/activity/config.test.ts +124 -1
  539. package/src/activity/config.ts +150 -18
  540. package/src/activity/index.ts +3 -0
  541. package/src/activity/journal-extract-storage.test.ts +129 -0
  542. package/src/activity/journal-extract.test.ts +314 -0
  543. package/src/activity/journal-extract.ts +247 -0
  544. package/src/activity/journal-heading.test.ts +24 -1
  545. package/src/activity/journal-heading.ts +36 -0
  546. package/src/activity/journal-read.test.ts +242 -0
  547. package/src/activity/journal-read.ts +183 -0
  548. package/src/activity/journal-source.test.ts +15 -15
  549. package/src/activity/journal-source.ts +21 -14
  550. package/src/activity/journal-state.lock-worker.ts +30 -0
  551. package/src/activity/journal-state.test.ts +144 -0
  552. package/src/activity/journal-state.ts +107 -0
  553. package/src/activity/journal-strip.test.ts +106 -52
  554. package/src/activity/journal-strip.ts +35 -10
  555. package/src/activity/journal-vault-integration.test.ts +230 -0
  556. package/src/activity/journal-vault-provenance.test.ts +9 -7
  557. package/src/activity/journal-vault-provenance.ts +4 -10
  558. package/src/activity/journal-vault-read.test.ts +3 -2
  559. package/src/activity/journal-vault-read.ts +9 -139
  560. package/src/activity/journal.test.ts +74 -23
  561. package/src/activity/runner.test.ts +116 -1
  562. package/src/activity/runner.ts +25 -0
  563. package/src/activity/scheduler.ts +4 -0
  564. package/src/activity/store.test.ts +18 -0
  565. package/src/activity/store.ts +14 -0
  566. package/src/activity/sync-registration.ts +4 -0
  567. package/src/activity/timeline/analysis-metadata.ts +2 -0
  568. package/src/activity/timeline/analysis-provider.ts +140 -0
  569. package/src/activity/timeline/analysis-run.test.ts +419 -0
  570. package/src/activity/timeline/analysis-run.ts +106 -0
  571. package/src/activity/timeline/analysis.ts +66 -37
  572. package/src/activity/timeline/corrections.ts +9 -0
  573. package/src/activity/timeline/index.ts +3 -0
  574. package/src/activity/timeline/query.test.ts +71 -0
  575. package/src/activity/timeline/query.ts +57 -8
  576. package/src/activity/timeline/regenerate.test.ts +505 -0
  577. package/src/activity/timeline/regenerate.ts +373 -0
  578. package/src/activity/types.ts +40 -5
  579. package/src/adapters/grok-opencode.test.ts +146 -0
  580. package/src/adapters/grok.ts +53 -0
  581. package/src/adapters/index.ts +2 -0
  582. package/src/adapters/opencode.ts +52 -0
  583. package/src/adapters/registry.ts +4 -0
  584. package/src/cli-fallback.ts +13 -4
  585. package/src/config.test.ts +3 -1
  586. package/src/config.ts +4 -0
  587. package/src/dedup/merge.test.ts +732 -25
  588. package/src/fallback-llm.test.ts +53 -0
  589. package/src/fallback-llm.ts +12 -0
  590. package/src/index.ts +2 -0
  591. package/src/local-llm.ts +3 -1
  592. package/src/orchestration/dependency-propagation-recovery-replay.ts +1 -1
  593. package/src/orchestration/extraction-persist-deps.ts +9 -0
  594. package/src/orchestration/extraction-persist-promotion.test.ts +265 -6
  595. package/src/orchestration/extraction-persist-promotion.ts +42 -3
  596. package/src/orchestration/extraction-persist.ts +3 -3
  597. package/src/orchestration/harmonic-construction-persist.test.ts +115 -4
  598. package/src/orchestration/harmonic-construction-persist.ts +34 -6
  599. package/src/orchestration/maintenance.ts +1 -0
  600. package/src/orchestration/orchestrator-helpers.ts +6 -0
  601. package/src/orchestration/recall-entry.ts +16 -0
  602. package/src/orchestration/recall-internal-deps.ts +14 -0
  603. package/src/orchestration/recall-internal.ts +41 -58
  604. package/src/orchestration/recall-result-formatter.ts +11 -1
  605. package/src/orchestration/recall-search-pipeline.ts +121 -11
  606. package/src/orchestration/recall-state-view-pipeline.test.ts +211 -0
  607. package/src/orchestration/semantic-merge-commit-effects.ts +76 -17
  608. package/src/orchestration/semantic-merge-persist.ts +121 -16
  609. package/src/orchestration/semantic-merge-promotion-payload.ts +133 -54
  610. package/src/orchestrator.ts +7 -35
  611. package/src/providers/codex-subscription.test.ts +666 -0
  612. package/src/providers/codex-subscription.ts +743 -0
  613. package/src/recall-disclosure.test.ts +20 -0
  614. package/src/recall-state-view-admission.ts +114 -0
  615. package/src/recall-state-view-asof.test.ts +176 -0
  616. package/src/recall-state-view-call.test.ts +175 -0
  617. package/src/recall-state-view-config.test.ts +16 -0
  618. package/src/recall-state-view-widen.test.ts +70 -0
  619. package/src/recall-state-view-widen.ts +28 -7
  620. package/src/recall-state-view-wire.ts +3 -1
  621. package/src/recall-state-view-zero-diff.test.ts +20 -11
  622. package/src/recall-state-view.test.ts +142 -0
  623. package/src/recall-state-view.ts +72 -24
  624. package/src/recall-xray-renderer.test.ts +27 -0
  625. package/src/recall-xray-renderer.ts +4 -0
  626. package/src/recall-xray.ts +13 -0
  627. package/src/reconcile/cursor.ts +23 -33
  628. package/src/reconcile/manifest.ts +96 -11
  629. package/src/reconcile-identity-cache.test.ts +378 -0
  630. package/src/runtime/child-process.ts +1 -1
  631. package/src/storage/cas-revision-host.ts +75 -0
  632. package/src/storage/cas-revision-store.test.ts +459 -0
  633. package/src/storage/cas-revision-store.ts +661 -0
  634. package/src/storage/deletion-revision-store.ts +80 -6
  635. package/src/storage/tombstone-blocked-capture-index.ts +15 -0
  636. package/src/storage/tombstone-blocked-capture-mutation.ts +67 -7
  637. package/src/storage/tombstone-blocked-capture-sync.ts +55 -20
  638. package/src/storage-contract/failure-semantics.test.ts +1 -1
  639. package/src/storage-frontmatter-cas.test.ts +698 -1
  640. package/src/storage-replay.test.ts +166 -3
  641. package/src/storage.ts +41 -41
  642. package/src/support-passport/card-projection.ts +82 -33
  643. package/src/temporal-supersession.test.ts +10 -10
  644. package/src/types.ts +7 -7
  645. package/src/write-envelope.ts +1 -1
  646. package/dist/chunk-22FVR2KE.js.map +0 -1
  647. package/dist/chunk-2C3S7J2S.js.map +0 -1
  648. package/dist/chunk-2JVJ7UHC.js.map +0 -1
  649. package/dist/chunk-2QSZNTDO.js +0 -56
  650. package/dist/chunk-2QSZNTDO.js.map +0 -1
  651. package/dist/chunk-3QQTXYZ6.js.map +0 -1
  652. package/dist/chunk-5VCDKQWQ.js +0 -560
  653. package/dist/chunk-5VCDKQWQ.js.map +0 -1
  654. package/dist/chunk-A7XEPMQ6.js.map +0 -1
  655. package/dist/chunk-BLUYQFRH.js.map +0 -1
  656. package/dist/chunk-E6JA6XWY.js.map +0 -1
  657. package/dist/chunk-EEOUMG3J.js.map +0 -1
  658. package/dist/chunk-FDLDOEO6.js.map +0 -1
  659. package/dist/chunk-FYDW33ZB.js +0 -13
  660. package/dist/chunk-H272ZPQ3.js.map +0 -1
  661. package/dist/chunk-HV7OY4DM.js.map +0 -1
  662. package/dist/chunk-HVAEXYPL.js.map +0 -1
  663. package/dist/chunk-JEIXTYVG.js.map +0 -1
  664. package/dist/chunk-LRICZIGN.js +0 -52
  665. package/dist/chunk-LRICZIGN.js.map +0 -1
  666. package/dist/chunk-MFDTVQJX.js.map +0 -1
  667. package/dist/chunk-N7RWREIQ.js.map +0 -1
  668. package/dist/chunk-O75CRYGF.js.map +0 -1
  669. package/dist/chunk-Q726HSJO.js.map +0 -1
  670. package/dist/chunk-QOIOACIE.js.map +0 -1
  671. package/dist/chunk-SEDEKFYQ.js +0 -1
  672. package/dist/chunk-SO7SV523.js.map +0 -1
  673. package/dist/chunk-TLPZ6MKZ.js.map +0 -1
  674. package/dist/chunk-UGPUYIET.js.map +0 -1
  675. package/src/activity/journal-mode.test.ts +0 -32
  676. package/src/activity/journal-mode.ts +0 -20
  677. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
  678. /package/dist/{chunk-CDKHKZL5.js.map → chunk-2524MOWK.js.map} +0 -0
  679. /package/dist/{chunk-7BMXZCOT.js.map → chunk-2AU4D4HQ.js.map} +0 -0
  680. /package/dist/{chunk-LTIZHLV7.js.map → chunk-2JCA2PQT.js.map} +0 -0
  681. /package/dist/{chunk-XXIHX75O.js.map → chunk-2UZ5ZH6W.js.map} +0 -0
  682. /package/dist/{chunk-P3SB5BNT.js.map → chunk-34QW2LK2.js.map} +0 -0
  683. /package/dist/{chunk-EONF76DT.js.map → chunk-36UBSLFN.js.map} +0 -0
  684. /package/dist/{chunk-DBQWVT2H.js.map → chunk-3CBI2ZSA.js.map} +0 -0
  685. /package/dist/{chunk-NZXEK3UF.js.map → chunk-3Q3N35W7.js.map} +0 -0
  686. /package/dist/{chunk-YYGZJPOK.js.map → chunk-42DJ235G.js.map} +0 -0
  687. /package/dist/{chunk-TCUKRAMK.js.map → chunk-4JVQRFZD.js.map} +0 -0
  688. /package/dist/{chunk-PYLL63BF.js.map → chunk-4PB2MBY6.js.map} +0 -0
  689. /package/dist/{chunk-UUQG7HAD.js.map → chunk-4WCNPQQ5.js.map} +0 -0
  690. /package/dist/{chunk-H4VH5VIB.js.map → chunk-5QBDLMGG.js.map} +0 -0
  691. /package/dist/{chunk-RKBLRTNT.js.map → chunk-5SDSVX7N.js.map} +0 -0
  692. /package/dist/{chunk-DGGB65KC.js.map → chunk-5THU7NFP.js.map} +0 -0
  693. /package/dist/{chunk-BPJNF7J2.js.map → chunk-6CCRSQWT.js.map} +0 -0
  694. /package/dist/{chunk-XXE5P6HJ.js.map → chunk-6XYC7NM4.js.map} +0 -0
  695. /package/dist/{chunk-J7HFPA6O.js.map → chunk-6YAIN5XJ.js.map} +0 -0
  696. /package/dist/{chunk-I5DZ3WGR.js.map → chunk-757NP436.js.map} +0 -0
  697. /package/dist/{chunk-E6TDQRF6.js.map → chunk-7J2CGXG3.js.map} +0 -0
  698. /package/dist/{chunk-BUTCAMJM.js.map → chunk-A2YQL2FF.js.map} +0 -0
  699. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  700. /package/dist/{chunk-R3HKWWUB.js.map → chunk-A7WOWDZK.js.map} +0 -0
  701. /package/dist/{chunk-6N3TQFZU.js.map → chunk-AIKTQVV3.js.map} +0 -0
  702. /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
  703. /package/dist/{chunk-W27OW7AB.js.map → chunk-APFKZVJS.js.map} +0 -0
  704. /package/dist/{chunk-B325AGLK.js.map → chunk-AQIRQUCP.js.map} +0 -0
  705. /package/dist/{chunk-S7T2TY65.js.map → chunk-AXFR2NQ5.js.map} +0 -0
  706. /package/dist/{chunk-FCSZ4K2X.js.map → chunk-BJJWRWER.js.map} +0 -0
  707. /package/dist/{chunk-JT3EB7ZL.js.map → chunk-BNGHPYZU.js.map} +0 -0
  708. /package/dist/{chunk-N57A4KPV.js.map → chunk-C2BFTYD7.js.map} +0 -0
  709. /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
  710. /package/dist/{chunk-X35W4S3L.js.map → chunk-D3IZCN5P.js.map} +0 -0
  711. /package/dist/{chunk-44T3Y7SZ.js.map → chunk-EJIEQOPB.js.map} +0 -0
  712. /package/dist/{chunk-ET356KSB.js.map → chunk-F4TWWUMP.js.map} +0 -0
  713. /package/dist/{chunk-CLLPJ6QT.js.map → chunk-FQXJAC3T.js.map} +0 -0
  714. /package/dist/{chunk-DD5JFCWM.js.map → chunk-GCBIXUPT.js.map} +0 -0
  715. /package/dist/{chunk-N2ZNPHA3.js.map → chunk-IFFLUCCU.js.map} +0 -0
  716. /package/dist/{chunk-PFFZWDPE.js.map → chunk-JZDH2ZZK.js.map} +0 -0
  717. /package/dist/{chunk-TX2UTLXC.js.map → chunk-K6IPSW5B.js.map} +0 -0
  718. /package/dist/{chunk-4MHYKEOM.js.map → chunk-KDJHLOZP.js.map} +0 -0
  719. /package/dist/{chunk-KCB7F4J7.js.map → chunk-KYGOQV37.js.map} +0 -0
  720. /package/dist/{chunk-VZWXFXLX.js.map → chunk-LMCD5W5B.js.map} +0 -0
  721. /package/dist/{chunk-MKD3OMPS.js.map → chunk-M3MYMWXG.js.map} +0 -0
  722. /package/dist/{chunk-PL7FYKHT.js.map → chunk-MMG5K6XJ.js.map} +0 -0
  723. /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
  724. /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
  725. /package/dist/{chunk-LSYDG6MJ.js.map → chunk-PEXW2JCK.js.map} +0 -0
  726. /package/dist/{chunk-MOZXTRC2.js.map → chunk-QF4J3KMV.js.map} +0 -0
  727. /package/dist/{chunk-JGHXXQ2G.js.map → chunk-QLJ6762U.js.map} +0 -0
  728. /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
  729. /package/dist/{chunk-CETXNLEX.js.map → chunk-RQO3J4MR.js.map} +0 -0
  730. /package/dist/{chunk-5NANRSCD.js.map → chunk-RR7G2X7C.js.map} +0 -0
  731. /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
  732. /package/dist/{chunk-EQHDH4C2.js.map → chunk-S76KRJDG.js.map} +0 -0
  733. /package/dist/{chunk-EEC4PCG5.js.map → chunk-SZDLX763.js.map} +0 -0
  734. /package/dist/{chunk-E2ZHGBAK.js.map → chunk-T2JSUEH6.js.map} +0 -0
  735. /package/dist/{chunk-JSN44KIB.js.map → chunk-T2YFZ27G.js.map} +0 -0
  736. /package/dist/{chunk-227UFSEQ.js.map → chunk-TFA6HPOA.js.map} +0 -0
  737. /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
  738. /package/dist/{chunk-NB5BCFUY.js.map → chunk-TWYTGIBR.js.map} +0 -0
  739. /package/dist/{chunk-MWFGUESQ.js.map → chunk-UEZKN6VR.js.map} +0 -0
  740. /package/dist/{chunk-H5AFCNGA.js.map → chunk-UJX4I26O.js.map} +0 -0
  741. /package/dist/{chunk-PBGVVDLY.js.map → chunk-VIZR45AN.js.map} +0 -0
  742. /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
  743. /package/dist/{chunk-JTH2SE6B.js.map → chunk-W5BLTZZJ.js.map} +0 -0
  744. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  745. /package/dist/{chunk-YFLLGRXO.js.map → chunk-X2QPKLPL.js.map} +0 -0
  746. /package/dist/{chunk-MN3LK3KN.js.map → chunk-X424T5JQ.js.map} +0 -0
  747. /package/dist/{chunk-5BCNEBEN.js.map → chunk-XPJNT6PI.js.map} +0 -0
  748. /package/dist/{chunk-SEDEKFYQ.js.map → chunk-XW2T4QAW.js.map} +0 -0
  749. /package/dist/{chunk-D223ZDQV.js.map → chunk-YEDVOYL2.js.map} +0 -0
  750. /package/dist/{chunk-RC5DXXWC.js.map → chunk-YM7YN37H.js.map} +0 -0
  751. /package/dist/{chunk-VLXBE57O.js.map → chunk-YVGXH72Y.js.map} +0 -0
  752. /package/dist/{chunk-YQAXP5AC.js.map → chunk-YXLUTALO.js.map} +0 -0
  753. /package/dist/{chunk-OQDPBRQ6.js.map → chunk-Z7YDVHDI.js.map} +0 -0
  754. /package/dist/{chunk-XUE46UYW.js.map → chunk-ZLN7AROH.js.map} +0 -0
  755. /package/dist/{chunk-HK32G473.js.map → chunk-ZWEZXVYH.js.map} +0 -0
  756. /package/dist/{contradiction-scan-NOYMFG66.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  757. /package/dist/{first-start-migration-RC345GPL.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  758. /package/dist/{resolution-VKATP2HT.js.map → recall-state-view-admission.js.map} +0 -0
  759. /package/dist/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -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`
@@ -2,13 +2,18 @@ import path from "node:path";
2
2
 
3
3
  import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
4
4
  import { assertValidTimezone } from "./digest.js";
5
+ import { applyLegacyJournalHeading } from "./journal-heading.js";
6
+ import { checkVaultJournalPrerequisites } from "./journal-vault-prereq.js";
5
7
  import { resolveJournalSource } from "./journal-source.js";
6
8
  import { validateVaultNoteTemplate } from "./vault-path.js";
7
9
  import { validateRegionName } from "./vault-region.js";
10
+ import { TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS } from "./timeline/analysis.js";
11
+ import { ANALYSIS_METADATA_MAX_FIELD_LENGTH, isAnalysisIdentifier } from "./timeline/analysis-metadata.js";
8
12
  import type {
9
13
  ActivityConfig,
10
14
  ActivityExtractionMode,
11
15
  ActivitySourceConfig,
16
+ ActivityTimelineAnalysisConfig,
12
17
  ActivityTimelineConfig,
13
18
  ActivityTimelineJournalConfig,
14
19
  ActivityTimelineQaConfig,
@@ -38,7 +43,8 @@ export function defaultActivityConfig(): ActivityConfig {
38
43
  maxMemoriesPerDay: 0,
39
44
  timeline: {
40
45
  enabled: false,
41
- journal: { enabled: false, source: "file" },
46
+ analysis: parseTimelineAnalysisConfig(undefined),
47
+ journal: { enabled: false, source: "memoryDir", extractionMode: "off" },
42
48
  qa: { enabled: false, maxRangeDays: 31 },
43
49
  vault: parseTimelineVaultConfig(undefined),
44
50
  },
@@ -215,7 +221,8 @@ function parseTimelineConfig(raw: unknown): ActivityTimelineConfig {
215
221
  if (raw === undefined) {
216
222
  return {
217
223
  enabled: false,
218
- journal: { enabled: false, source: "file" },
224
+ analysis: parseTimelineAnalysisConfig(undefined),
225
+ journal: { enabled: false, source: "memoryDir", extractionMode: "off" },
219
226
  qa: parseTimelineQaConfig(undefined),
220
227
  vault: parseTimelineVaultConfig(undefined),
221
228
  };
@@ -228,11 +235,123 @@ function parseTimelineConfig(raw: unknown): ActivityTimelineConfig {
228
235
  if (timeline.enabled !== undefined && enabledValue === undefined) {
229
236
  throw new TypeError("activity.timeline.enabled must be a boolean");
230
237
  }
238
+ const journal = parseTimelineJournalConfig(timeline.journal);
239
+ let vault = parseTimelineVaultConfig(timeline.vault);
240
+ const journalRaw = timeline.journal;
241
+ const headingRaw =
242
+ typeof journalRaw === "object" && journalRaw !== null && !Array.isArray(journalRaw)
243
+ ? (journalRaw as Record<string, unknown>).heading
244
+ : undefined;
245
+ if (headingRaw !== undefined) {
246
+ const aliased = applyLegacyJournalHeading({
247
+ journalSection: vault.readback.journalSection,
248
+ heading: headingRaw,
249
+ });
250
+ process.emitWarning(
251
+ aliased.ignoredLegacyHeading
252
+ ? 'activity.timeline.journal.heading is deprecated and ignored because activity.timeline.vault.readback.journalSection is set; use vault.readback.journalSection.'
253
+ : 'activity.timeline.journal.heading is deprecated; use activity.timeline.vault.readback.journalSection.',
254
+ { type: "DeprecationWarning", code: "REMNIC_DEP_JOURNAL_HEADING" },
255
+ );
256
+ if (aliased.usedLegacyHeading) {
257
+ vault = { ...vault, readback: { ...vault.readback, journalSection: aliased.journalSection } };
258
+ }
259
+ }
260
+ if (journal.source === "vault") {
261
+ // Parse-time prerequisite gate (issue #1987): the error names EVERY
262
+ // missing prerequisite, never just the first (§1/§39).
263
+ const prereq = checkVaultJournalPrerequisites({
264
+ vaultEnabled: vault.enabled,
265
+ dailyNotePath: vault.dailyNotePath,
266
+ journalSection: vault.readback.journalSection,
267
+ });
268
+ if (!prereq.ok) {
269
+ throw new RangeError(
270
+ `activity.timeline.journal.source "vault" requires ${prereq.message}`,
271
+ );
272
+ }
273
+ }
231
274
  return {
232
275
  enabled: enabledValue ?? false,
233
- journal: parseTimelineJournalConfig(timeline.journal),
276
+ analysis: parseTimelineAnalysisConfig(timeline.analysis),
277
+ journal,
234
278
  qa: parseTimelineQaConfig(timeline.qa),
235
- vault: parseTimelineVaultConfig(timeline.vault),
279
+ vault,
280
+ };
281
+ }
282
+
283
+ /**
284
+ * Parse the `activity.timeline.analysis.*` block (issue #2050). Independent
285
+ * gate, default off: disabled means zero provider calls and zero analysis
286
+ * artifacts. Enabling requires an explicit provider and model; every invalid
287
+ * value is rejected at parse time — never silently defaulted or fallen back.
288
+ */
289
+ function parseTimelineAnalysisConfig(raw: unknown): ActivityTimelineAnalysisConfig {
290
+ if (raw === undefined) return { enabled: false };
291
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
292
+ throw new TypeError("activity.timeline.analysis must be an object");
293
+ }
294
+ const analysis = raw as Record<string, unknown>;
295
+ const enabled = requireBool(analysis.enabled, "activity.timeline.analysis.enabled", false);
296
+ const provider = optionalNonEmptyString(analysis.provider, "activity.timeline.analysis.provider")?.trim();
297
+ const model = optionalNonEmptyString(analysis.model, "activity.timeline.analysis.model")?.trim();
298
+ for (const [key, value] of [
299
+ ["provider", provider],
300
+ ["model", model],
301
+ ] as const) {
302
+ if (value === undefined) continue;
303
+ if (key === "provider" && value.includes("/")) {
304
+ throw new RangeError(
305
+ "activity.timeline.analysis.provider must be a single provider segment (no '/')",
306
+ );
307
+ }
308
+ if (!isAnalysisIdentifier(value)) {
309
+ throw new RangeError(
310
+ `activity.timeline.analysis.${key} must be an identifier (letters, digits, and ._:-/ only)`,
311
+ );
312
+ }
313
+ if (value.length > ANALYSIS_METADATA_MAX_FIELD_LENGTH) {
314
+ throw new RangeError(
315
+ `activity.timeline.analysis.${key} must be at most ${ANALYSIS_METADATA_MAX_FIELD_LENGTH} characters`,
316
+ );
317
+ }
318
+ }
319
+ if (enabled && (provider === undefined || model === undefined)) {
320
+ throw new RangeError(
321
+ "activity.timeline.analysis.provider and model are required when analysis is enabled",
322
+ );
323
+ }
324
+ const timeoutMsValue = coerceNumber(analysis.timeoutMs, "activity.timeline.analysis.timeoutMs");
325
+ if (analysis.timeoutMs !== undefined && timeoutMsValue === undefined) {
326
+ throw new TypeError("activity.timeline.analysis.timeoutMs must be a finite number");
327
+ }
328
+ const timeoutMs = timeoutMsValue ?? TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS;
329
+ if (!Number.isInteger(timeoutMs) || timeoutMs < 1_000 || timeoutMs > 120_000) {
330
+ throw new RangeError("activity.timeline.analysis.timeoutMs must be an integer from 1000 to 120000");
331
+ }
332
+ if (analysis.preferences !== undefined) {
333
+ if (!Array.isArray(analysis.preferences)) {
334
+ throw new TypeError("activity.timeline.analysis.preferences must be an array of strings");
335
+ }
336
+ if (analysis.preferences.length > 16) {
337
+ throw new RangeError("activity.timeline.analysis.preferences supports at most 16 entries");
338
+ }
339
+ for (const entry of analysis.preferences) {
340
+ if (typeof entry !== "string" || entry.trim().length === 0) {
341
+ throw new TypeError("activity.timeline.analysis.preferences entries must be non-empty strings");
342
+ }
343
+ if (entry.length > 200) {
344
+ throw new RangeError("activity.timeline.analysis.preferences entries must be at most 200 characters");
345
+ }
346
+ }
347
+ }
348
+ const preferences = analysis.preferences as string[] | undefined;
349
+ return {
350
+ enabled,
351
+ ...(provider === undefined ? {} : { provider }),
352
+ ...(model === undefined ? {} : { model }),
353
+ ...(analysis.timeoutMs !== undefined || timeoutMsValue !== undefined ? { timeoutMs } : {}),
354
+ ...(preferences === undefined ? {} : { preferences }),
236
355
  };
237
356
  }
238
357
 
@@ -312,6 +431,17 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
312
431
  const propertiesRaw = vault.properties;
313
432
  const properties: ActivityTimelineVaultConfig["properties"] =
314
433
  propertiesRaw === undefined ? { mode: "off", prefix: "remnic_" } : parseVaultProperties(propertiesRaw);
434
+ const readbackRaw = vault.readback;
435
+ if (readbackRaw !== undefined && (typeof readbackRaw !== "object" || readbackRaw === null || Array.isArray(readbackRaw))) {
436
+ throw new TypeError("activity.timeline.vault.readback must be an object");
437
+ }
438
+ const readbackJournalSection = optionalNonEmptyString(
439
+ (readbackRaw as Record<string, unknown> | undefined)?.journalSection,
440
+ "activity.timeline.vault.readback.journalSection",
441
+ );
442
+ const readback = {
443
+ journalSection: readbackJournalSection ?? "",
444
+ };
315
445
 
316
446
  return {
317
447
  enabled,
@@ -323,6 +453,7 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
323
453
  sectionStrategy,
324
454
  publish,
325
455
  insertUnderHeading,
456
+ readback,
326
457
  wikilinks,
327
458
  properties,
328
459
  autoPublish,
@@ -348,6 +479,7 @@ function defaultVaultConfig(): ActivityTimelineVaultConfig {
348
479
  wikilinks: { places: false, placesFolder: "Places" },
349
480
  properties: { mode: "off", prefix: "remnic_" },
350
481
  autoPublish: true,
482
+ readback: { journalSection: "" },
351
483
  };
352
484
  }
353
485
 
@@ -470,7 +602,7 @@ function parseVaultProperties(raw: unknown): ActivityTimelineVaultConfig["proper
470
602
  }
471
603
 
472
604
  function parseTimelineJournalConfig(raw: unknown): ActivityTimelineJournalConfig {
473
- if (raw === undefined) return { enabled: false, source: "file" };
605
+ if (raw === undefined) return { enabled: false, source: "memoryDir", extractionMode: "off" };
474
606
  if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
475
607
  throw new TypeError("activity.timeline.journal must be an object");
476
608
  }
@@ -479,22 +611,22 @@ function parseTimelineJournalConfig(raw: unknown): ActivityTimelineJournalConfig
479
611
  if (journal.enabled !== undefined && enabledValue === undefined) {
480
612
  throw new TypeError("activity.timeline.journal.enabled must be a boolean");
481
613
  }
482
- const heading = journal.heading;
483
- if (heading !== undefined && typeof heading !== "string") {
484
- throw new TypeError("activity.timeline.journal.heading must be a string");
485
- }
486
- const source = journal.source === undefined ? "file" : typeof journal.source === "string" ? journal.source : "";
487
- const resolved = resolveJournalSource({ source, heading: heading ?? "" });
614
+ const source = journal.source === undefined ? "memoryDir" : typeof journal.source === "string" ? journal.source : "";
615
+ const resolved = resolveJournalSource({ source });
488
616
  if (!resolved.ok) {
489
- if (resolved.error === "unknown_source") {
490
- throw new RangeError('activity.timeline.journal.source must be one of "file", "vault"');
491
- }
492
- throw new RangeError('activity.timeline.journal.heading must be a non-empty string when source is "vault"');
617
+ throw new RangeError('activity.timeline.journal.source must be one of "memoryDir", "vault"');
618
+ }
619
+ if (resolved.deprecatedAlias === "file") {
620
+ process.emitWarning(
621
+ 'activity.timeline.journal.source "file" is deprecated; use "memoryDir".',
622
+ { type: "DeprecationWarning", code: "REMNIC_DEP_JOURNAL_SOURCE_FILE" },
623
+ );
493
624
  }
494
- if (resolved.mode === "vault") {
495
- return { enabled: enabledValue ?? false, source: "vault", heading: resolved.heading };
625
+ const extractionMode = journal.extractionMode === undefined ? "off" : journal.extractionMode;
626
+ if (extractionMode !== "off" && extractionMode !== "review") {
627
+ throw new RangeError('activity.timeline.journal.extractionMode must be one of "off", "review"');
496
628
  }
497
- return { enabled: enabledValue ?? false, source: "file" };
629
+ return { enabled: enabledValue ?? false, source: resolved.mode, extractionMode };
498
630
  }
499
631
 
500
632
  function parseTimelineQaConfig(raw: unknown): ActivityTimelineQaConfig {
@@ -16,6 +16,9 @@ export * from "./config.js";
16
16
  export * from "./reindex.js";
17
17
  export * from "./timeline/index.js";
18
18
  export * from "./journal.js";
19
+ export * from "./journal-read.js";
20
+ export * from "./journal-state.js";
21
+ export * from "./journal-extract.js";
19
22
  export * from "./journal-vault-read.js";
20
23
  export * from "./journal-vault-prereq.js";
21
24
  export * from "./journal-vault-provenance.js";
@@ -0,0 +1,129 @@
1
+ import assert from "node:assert/strict";
2
+ import { readdirSync, readFileSync, statSync } from "node:fs";
3
+ import path from "node:path";
4
+ import test from "node:test";
5
+
6
+ import { parseConfig } from "../config.js";
7
+ import { NamespaceStorageRouter } from "../namespaces/storage.js";
8
+ import { StorageManager } from "../storage.js";
9
+ import { withTempDir } from "../testing/tmp-dir.js";
10
+ import {
11
+ createJournalMemoryWriter,
12
+ runJournalReviewExtraction,
13
+ type JournalExtractionDeps,
14
+ } from "./journal-extract.js";
15
+
16
+ const FACT = "I decided to encrypt the journal write path.";
17
+ const MAGIC = Buffer.from("REMNIC-ENC");
18
+
19
+ function walkFiles(root: string): string[] {
20
+ const out: string[] = [];
21
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
22
+ const full = path.join(root, entry.name);
23
+ if (entry.isDirectory()) out.push(...walkFiles(full));
24
+ else out.push(full);
25
+ }
26
+ return out;
27
+ }
28
+
29
+ function extractDeps(storage: StorageManager, category: "decision" | "fact" = "decision"): JournalExtractionDeps {
30
+ return {
31
+ extract: async () => ({
32
+ facts: [
33
+ {
34
+ content: FACT,
35
+ category,
36
+ confidence: 0.9,
37
+ tags: [],
38
+ entityRef: undefined,
39
+ },
40
+ ],
41
+ profileUpdates: [],
42
+ entities: [],
43
+ questions: [],
44
+ }),
45
+ writer: createJournalMemoryWriter(storage),
46
+ };
47
+ }
48
+
49
+ test("journal writer encrypts on-disk bodies and never stores the fact as plaintext", async () => {
50
+ await withTempDir(async (dir) => {
51
+ const config = parseConfig({ memoryDir: dir });
52
+ const storage = new StorageManager(config.memoryDir);
53
+ await storage.ensureDirectories();
54
+ storage.setSecureStoreRequired(true);
55
+ storage.setSecureStoreKey(Buffer.alloc(32, 7));
56
+ const result = await runJournalReviewExtraction({
57
+ date: "2026-08-20",
58
+ journalText: FACT,
59
+ source: "memoryDir",
60
+ journalConfig: { extractionMode: "review" },
61
+ deps: extractDeps(storage),
62
+ });
63
+ assert.equal(result.completed, true);
64
+ assert.equal(result.pendingReview, 1);
65
+ const bodies = walkFiles(dir)
66
+ .filter((file) => !file.includes(`${path.sep}state${path.sep}`))
67
+ .map((file) => readFileSync(file));
68
+ assert.ok(bodies.some((buf) => buf.subarray(0, MAGIC.length).equals(MAGIC)));
69
+ assert.equal(
70
+ bodies.some((buf) => buf.toString("utf8").includes(FACT)),
71
+ false,
72
+ "encrypted journal writes must not leave the fact as plaintext",
73
+ );
74
+ });
75
+ });
76
+
77
+ test("journal writer uses NamespaceStorageRouter.storageFor(defaultNamespace)", async () => {
78
+ await withTempDir(async (dir) => {
79
+ const config = parseConfig({ memoryDir: dir });
80
+ const router = new NamespaceStorageRouter(config);
81
+ const storage = await router.storageFor(config.defaultNamespace);
82
+ await storage.ensureDirectories();
83
+ const result = await runJournalReviewExtraction({
84
+ date: "2026-08-20",
85
+ journalText: FACT,
86
+ source: "memoryDir",
87
+ journalConfig: { extractionMode: "review" },
88
+ deps: extractDeps(storage),
89
+ });
90
+ assert.equal(result.completed, true);
91
+ assert.equal(result.pendingReview, 1);
92
+ assert.ok(walkFiles(dir).some((file) => statSync(file).isFile()));
93
+ });
94
+ });
95
+
96
+ test("tombstoned journal facts are skipped and not written as pending_review", async () => {
97
+ await withTempDir(async (dir) => {
98
+ const config = parseConfig({ memoryDir: dir });
99
+ const storage = new StorageManager(config.memoryDir);
100
+ await storage.ensureDirectories();
101
+ storage.setTombstonesConfig({
102
+ enabled: true,
103
+ semanticMatch: false,
104
+ semanticThreshold: 0.9,
105
+ namespace: config.defaultNamespace,
106
+ });
107
+ const tombstoneId = await storage.appendTombstone({
108
+ reason: "correction",
109
+ createdBy: "user_correction",
110
+ sourceMemoryId: "retired-journal-fact",
111
+ rawContent: FACT,
112
+ });
113
+ assert.ok(tombstoneId);
114
+ const before = walkFiles(dir);
115
+ const result = await runJournalReviewExtraction({
116
+ date: "2026-08-20",
117
+ journalText: FACT,
118
+ source: "memoryDir",
119
+ journalConfig: { extractionMode: "review" },
120
+ deps: extractDeps(storage, "fact"),
121
+ });
122
+ assert.equal(result.completed, true);
123
+ assert.equal(result.pendingReview, 0);
124
+ assert.equal(result.skipped, 1);
125
+ const after = walkFiles(dir).filter((file) => !before.includes(file));
126
+ const pending = after.filter((file) => file.includes("pending_review") || file.includes("pending-review"));
127
+ assert.equal(pending.length, 0, "tombstoned content must not land as a new pending_review file");
128
+ });
129
+ });