@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
@@ -3,61 +3,68 @@ import test from "node:test";
3
3
 
4
4
  import { stripRemnicOwnedRegions } from "./journal-strip.js";
5
5
 
6
- test("stripRemnicOwnedRegions removes a marker pair and keeps user text", () => {
7
- const text = [
8
- "Morning standup.",
9
- "<!-- remnic:timeline:start -->",
10
- "9:00 deep work",
11
- "<!-- remnic:timeline:end -->",
12
- "Wrote the parser.",
13
- ].join("\n");
14
- assert.equal(stripRemnicOwnedRegions(text, []), "Morning standup.\nWrote the parser.");
6
+ const START = (name = "timeline") => `<!-- remnic:${name}:start -->`;
7
+ const END = (name = "timeline") => `<!-- remnic:${name}:end -->`;
8
+
9
+ test("removes a marker pair and keeps user text", () => {
10
+ const text = ["Morning standup.", START(), "9:00 deep work", END(), "Wrote the parser."].join("\n");
11
+ const result = stripRemnicOwnedRegions(text, []);
12
+ assert.equal(result.text, "Morning standup.\nWrote the parser.");
13
+ assert.deepEqual(result.warnings, []);
15
14
  });
16
15
 
17
- test("stripRemnicOwnedRegions keeps one blank line where a removal doubled it", () => {
18
- const text = [
19
- "Before.",
20
- "",
21
- "<!-- remnic:timeline:start -->",
22
- "generated",
23
- "<!-- remnic:timeline:end -->",
24
- "",
25
- "After.",
26
- ].join("\n");
27
- assert.equal(stripRemnicOwnedRegions(text, []), "Before.\n\nAfter.");
16
+ test("keeps one blank line where a removal doubled it", () => {
17
+ const text = ["Before.", "", START(), "generated", END(), "", "After."].join("\n");
18
+ assert.equal(stripRemnicOwnedRegions(text, []).text, "Before.\n\nAfter.");
28
19
  });
29
20
 
30
- test("stripRemnicOwnedRegions removes two distinct marker pairs", () => {
21
+ test("removes two distinct marker pairs", () => {
31
22
  const text = [
32
23
  "head",
33
- "<!-- remnic:timeline:start -->",
24
+ START("timeline"),
34
25
  "timeline body",
35
- "<!-- remnic:timeline:end -->",
26
+ END("timeline"),
36
27
  "middle",
37
- "<!-- remnic:digest:start -->",
28
+ START("digest"),
38
29
  "digest body",
39
- "<!-- remnic:digest:end -->",
30
+ END("digest"),
40
31
  "tail",
41
32
  ].join("\n");
42
- assert.equal(stripRemnicOwnedRegions(text, []), "head\nmiddle\ntail");
33
+ const result = stripRemnicOwnedRegions(text, []);
34
+ assert.equal(result.text, "head\nmiddle\ntail");
35
+ assert.deepEqual(result.warnings, []);
36
+ });
37
+
38
+ test("strips an unterminated start marker to the end and warns", () => {
39
+ const text = ["kept", START(), "generated", "later user text"].join("\n");
40
+ const result = stripRemnicOwnedRegions(text, []);
41
+ assert.equal(result.text, "kept");
42
+ assert.equal(result.warnings.length, 1);
43
+ assert.match(result.warnings[0]!, /unclosed remnic region "timeline"/);
43
44
  });
44
45
 
45
- test("stripRemnicOwnedRegions strips an unterminated start marker to the end of input", () => {
46
- const text = ["kept", "<!-- remnic:timeline:start -->", "generated", "later user text"].join("\n");
47
- assert.equal(stripRemnicOwnedRegions(text, []), "kept");
46
+ test("an unmatched end marker fails closed: everything before it is stripped, with a warning", () => {
47
+ // A pair split across the section boundary leaves a bare END inside the
48
+ // journal section; text before it is presumed published output.
49
+ const text = ["Before.", END(), "After."].join("\n");
50
+ const result = stripRemnicOwnedRegions(text, []);
51
+ assert.equal(result.text, "After.");
52
+ assert.equal(result.warnings.length, 1);
53
+ assert.match(result.warnings[0]!, /unmatched remnic region end "timeline"/);
48
54
  });
49
55
 
50
- test("stripRemnicOwnedRegions removes an orphan end marker and keeps surrounding text", () => {
51
- const text = ["Before.", "<!-- remnic:timeline:end -->", "After."].join("\n");
52
- assert.equal(stripRemnicOwnedRegions(text, []), "Before.\nAfter.");
56
+ test("matched pairs after an unmatched end are still removed", () => {
57
+ const text = ["leaked", END(), "kept", START(), "owned", END(), "also kept"].join("\n");
58
+ const result = stripRemnicOwnedRegions(text, []);
59
+ assert.equal(result.text, "kept\nalso kept");
53
60
  });
54
61
 
55
- test("stripRemnicOwnedRegions removes an owned heading section up to the next same-level heading", () => {
62
+ test("removes an owned heading section up to the next same-level heading", () => {
56
63
  const text = ["## Journal", "intro", "## Timeline", "card one", "## Notes", "kept"].join("\n");
57
- assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]), "## Journal\nintro\n## Notes\nkept");
64
+ assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]).text, "## Journal\nintro\n## Notes\nkept");
58
65
  });
59
66
 
60
- test("stripRemnicOwnedRegions does not end an owned section at a deeper heading", () => {
67
+ test("does not end an owned section at a deeper heading", () => {
61
68
  const text = [
62
69
  "## Journal",
63
70
  "## Timeline",
@@ -67,31 +74,35 @@ test("stripRemnicOwnedRegions does not end an owned section at a deeper heading"
67
74
  "## Notes",
68
75
  "kept",
69
76
  ].join("\n");
70
- assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]), "## Journal\n## Notes\nkept");
77
+ assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]).text, "## Journal\n## Notes\nkept");
71
78
  });
72
79
 
73
- test("stripRemnicOwnedRegions preserves a non-owned heading section", () => {
80
+ test("preserves a non-owned heading section", () => {
74
81
  const text = ["## Journal", "## Timeline", "card one", "## Notes", "kept"].join("\n");
75
- assert.equal(stripRemnicOwnedRegions(text, ["Digest"]), text);
82
+ assert.equal(stripRemnicOwnedRegions(text, ["Digest"]).text, text);
76
83
  });
77
84
 
78
- test("stripRemnicOwnedRegions ignores blank and whitespace owned heading entries", () => {
85
+ test("ignores blank and whitespace owned heading entries", () => {
79
86
  const text = ["## Timeline", "card one", ""].join("\n");
80
- assert.equal(stripRemnicOwnedRegions(text, ["", " ", "\t"]), text);
87
+ assert.equal(stripRemnicOwnedRegions(text, ["", " ", "\t"]).text, text);
81
88
  });
82
89
 
83
- test("stripRemnicOwnedRegions trims configured owned heading entries", () => {
90
+ test("trims configured owned heading entries", () => {
84
91
  const text = ["## Timeline", "card", "## Notes", "kept"].join("\n");
85
- assert.equal(stripRemnicOwnedRegions(text, [" Timeline "]), "## Notes\nkept");
92
+ assert.equal(stripRemnicOwnedRegions(text, [" Timeline "]).text, "## Notes\nkept");
86
93
  });
87
94
 
88
- test("stripRemnicOwnedRegions returns empty string for empty input", () => {
89
- assert.equal(stripRemnicOwnedRegions("", ["Timeline"]), "");
95
+ test("returns empty string for empty input", () => {
96
+ const result = stripRemnicOwnedRegions("", ["Timeline"]);
97
+ assert.equal(result.text, "");
98
+ assert.deepEqual(result.warnings, []);
90
99
  });
91
100
 
92
- test("stripRemnicOwnedRegions returns unchanged text when nothing is owned", () => {
101
+ test("returns unchanged text when nothing is owned", () => {
93
102
  const text = ["first", "", "second", "", "third"].join("\n");
94
- assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]), text);
103
+ const result = stripRemnicOwnedRegions(text, ["Timeline"]);
104
+ assert.equal(result.text, text);
105
+ assert.deepEqual(result.warnings, []);
95
106
  });
96
107
 
97
108
  // Regression: the journal-section reader normalizes tab separators, extra
@@ -108,12 +119,9 @@ test("owned heading matching accepts every ATX form the section reader accepts",
108
119
  "## Timeline ##",
109
120
  "## Timeline ### ",
110
121
  ]) {
111
- const stripped = stripRemnicOwnedRegions(
112
- [headingLine, body].join("\n"),
113
- ["Timeline"],
114
- );
122
+ const result = stripRemnicOwnedRegions([headingLine, body].join("\n"), ["Timeline"]);
115
123
  assert.equal(
116
- stripped,
124
+ result.text,
117
125
  ["## User Notes", "kept"].join("\n"),
118
126
  `heading line ${JSON.stringify(headingLine)} must strip as owned`,
119
127
  );
@@ -122,5 +130,51 @@ test("owned heading matching accepts every ATX form the section reader accepts",
122
130
 
123
131
  test("an indented heading is not owned, matching the section reader", () => {
124
132
  const text = [" ## Timeline", "not owned body"].join("\n");
125
- assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]), text);
133
+ assert.equal(stripRemnicOwnedRegions(text, ["Timeline"]).text, text);
134
+ });
135
+
136
+ // Generative property test (issue #1987): for random user text with random
137
+ // Remnic regions injected at random positions, strip returns EXACTLY the
138
+ // user text — no user line lost, no owned line kept. Seeded PRNG for
139
+ // deterministic CI.
140
+ test("property: injected regions vanish and user text survives byte-for-byte", () => {
141
+ let seed = 0x2a1987;
142
+ const rand = (max: number): number => {
143
+ seed = (seed * 1103515245 + 12345) & 0x7fffffff;
144
+ return seed % max;
145
+ };
146
+ const USER_LINES = [
147
+ "Walked the dog.",
148
+ "Tagebuch 📝 Eintrag.",
149
+ " indented thought",
150
+ "I decided to ship the parser.",
151
+ "We committed to the review pass.",
152
+ ];
153
+ const REGION_NAMES = ["timeline", "weekly", "digest", "standup"];
154
+
155
+ for (let iteration = 0; iteration < 200; iteration += 1) {
156
+ const userLineCount = 1 + rand(USER_LINES.length);
157
+ const userLines: string[] = [];
158
+ for (let i = 0; i < userLineCount; i += 1) userLines.push(USER_LINES[rand(USER_LINES.length)]!);
159
+ const regionCount = rand(4);
160
+ const injections: Array<{ at: number; lines: string[] }> = [];
161
+ for (let i = 0; i < regionCount; i += 1) {
162
+ const name = REGION_NAMES[rand(REGION_NAMES.length)]!;
163
+ injections.push({
164
+ at: rand(userLines.length + 1),
165
+ lines: [START(name), `OWNED ${name} ${i}`, END(name)],
166
+ });
167
+ }
168
+ let mixed: string[] = [];
169
+ let userCursor = 0;
170
+ for (const injection of injections.sort((a, b) => a.at - b.at)) {
171
+ mixed = mixed.concat(userLines.slice(userCursor, injection.at), injection.lines);
172
+ userCursor = injection.at;
173
+ }
174
+ mixed = mixed.concat(userLines.slice(userCursor));
175
+
176
+ const result = stripRemnicOwnedRegions(mixed.join("\n"), ["Timeline"]);
177
+ assert.equal(result.text, userLines.join("\n"), `iteration ${iteration}: ${JSON.stringify(mixed)}`);
178
+ assert.deepEqual(result.warnings, [], `iteration ${iteration} must be warning-free`);
179
+ }
126
180
  });
@@ -4,13 +4,19 @@
4
4
  * Loop prevention for vault journals: before daily-note text is treated
5
5
  * as journal text, every managed marker region and every configured
6
6
  * owned heading section is removed, so published output can never
7
- * re-enter the journal. An unterminated start marker fails closed and
8
- * strips to the end of the section. Pure string-in/string-out. No
9
- * filesystem. Heading lines parse through the SAME exported ATX
10
- * parser the journal-section reader uses, so a heading the reader
11
- * recognizes is always a heading this stripper strips.
7
+ * re-enter the journal. Pure string-in/string-out. No filesystem.
8
+ *
9
+ * Fail-closed marker semantics a partial Remnic region is NEVER kept:
10
+ * - an unterminated start marker strips to the end of the section and
11
+ * records a warning;
12
+ * - an end marker with no matching start (a pair split across the
13
+ * journal-section boundary) strips everything before it in the
14
+ * section, so pre-section published output cannot leak in, and
15
+ * records a warning.
16
+ * Heading lines parse through the SAME exported ATX parser the
17
+ * journal-section reader uses, so a heading the reader recognizes is
18
+ * always a heading this stripper strips.
12
19
  */
13
-
14
20
  import { parseAtxHeading } from "./journal-section.js";
15
21
 
16
22
  const MARKER_OPEN = "<!-- remnic:";
@@ -18,16 +24,23 @@ const MARKER_CLOSE = "-->";
18
24
  const START_SUFFIX = ":start";
19
25
  const END_SUFFIX = ":end";
20
26
 
27
+ export interface StripResult {
28
+ text: string;
29
+ warnings: readonly string[];
30
+ }
31
+
21
32
  type RegionMarker = { kind: "start" | "end"; name: string };
22
33
 
23
34
  export function stripRemnicOwnedRegions(
24
35
  sectionText: string,
25
36
  ownedHeadings: readonly string[],
26
- ): string {
27
- return stripOwnedHeadings(stripMarkerRegions(sectionText), ownedHeadings);
37
+ ): StripResult {
38
+ const warnings: string[] = [];
39
+ const marked = stripMarkerRegions(sectionText, warnings);
40
+ return { text: stripOwnedHeadings(marked, ownedHeadings), warnings };
28
41
  }
29
42
 
30
- function stripMarkerRegions(text: string): string {
43
+ function stripMarkerRegions(text: string, warnings: string[]): string {
31
44
  const lines = text.split("\n");
32
45
  const keep = lines.map(() => true);
33
46
  let openName: string | null = null;
@@ -40,9 +53,21 @@ function stripMarkerRegions(text: string): string {
40
53
  }
41
54
  if (marker) {
42
55
  keep[i] = false;
43
- if (marker.kind === "start") openName = marker.name;
56
+ if (marker.kind === "start") {
57
+ openName = marker.name;
58
+ } else {
59
+ for (let j = 0; j < i; j++) keep[j] = false;
60
+ // Stray end marker: the matching start lives outside this section
61
+ // (a pair split across the section boundary). Everything before it
62
+ // in the section is presumed published output — fail closed.
63
+ warnings.push(`unmatched remnic region end "${marker.name}"`);
64
+
65
+ }
44
66
  }
45
67
  }
68
+ if (openName !== null) {
69
+ warnings.push(`unclosed remnic region "${openName}"`);
70
+ }
46
71
  return emitKeptLines(lines, keep);
47
72
  }
48
73
 
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Integration: vault journal → review-only extraction → review queue
3
+ * (issue #1987 acceptance criteria).
4
+ *
5
+ * Full round trip in a temp memoryDir + fixture vault against the REAL
6
+ * StorageManager: pending_review candidates only, hash-skip on unchanged
7
+ * days, exactly one re-extraction per edit, publisher coexistence on the
8
+ * same note, and no journal-derived memory reaching active without
9
+ * approval.
10
+ */
11
+ import assert from "node:assert/strict";
12
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
13
+ import { tmpdir } from "node:os";
14
+ import path from "node:path";
15
+ import test from "node:test";
16
+
17
+ import { StorageManager } from "../index.js";
18
+ import { createJournalMemoryWriter, runJournalReviewExtraction } from "../activity/journal-extract.js";
19
+ import { readJournalForDate } from "../activity/journal-read.js";
20
+ import {
21
+ journalUnchanged,
22
+ readTimelineState,
23
+ setJournalHash,
24
+ hashJournalText,
25
+ writeTimelineState,
26
+ } from "../activity/journal-state.js";
27
+ import { publishVaultNote } from "../activity/vault-publisher.js";
28
+ import type { ActivityTimelineVaultConfig } from "../activity/types.js";
29
+
30
+ const START = "<!-- remnic:timeline:start -->";
31
+ const END = "<!-- remnic:timeline:end -->";
32
+
33
+ function vaultConfig(vaultPath: string): ActivityTimelineVaultConfig {
34
+ return {
35
+ enabled: true,
36
+ vaultPath,
37
+ dailyNotePath: "{yyyy}-{MM}-{dd}.md",
38
+ weeklyNotePath: "",
39
+ createMissingNotes: true,
40
+ noteTemplate: "",
41
+ sectionStrategy: "markers",
42
+ publish: {
43
+ timeline: { enabled: true, target: "daily", section: "timeline" },
44
+ standup: { enabled: false, target: "daily", section: "Standup" },
45
+ weekly: { enabled: false, target: "weekly", section: "Weekly Review" },
46
+ locations: { enabled: false, target: "daily", section: "Locations" },
47
+ },
48
+ insertUnderHeading: "",
49
+ readback: { journalSection: "Journal" },
50
+ wikilinks: { places: false, placesFolder: "Places" },
51
+ properties: { mode: "off", prefix: "remnic_" },
52
+ autoPublish: true,
53
+ };
54
+ }
55
+
56
+ interface Fixture {
57
+ vault: string;
58
+ memoryDir: string;
59
+ storage: StorageManager;
60
+ config: ActivityTimelineVaultConfig;
61
+ }
62
+
63
+ async function withFixture(fn: (fx: Fixture) => Promise<void>): Promise<void> {
64
+ const vault = mkdtempSync(path.join(tmpdir(), "remnic-journal-it-vault-"));
65
+ const memoryDir = mkdtempSync(path.join(tmpdir(), "remnic-journal-it-mem-"));
66
+ const storage = new StorageManager(memoryDir);
67
+ await storage.ensureDirectories();
68
+ try {
69
+ await fn({ vault, memoryDir, storage, config: vaultConfig(vault) });
70
+ } finally {
71
+ rmSync(vault, { recursive: true, force: true });
72
+ rmSync(memoryDir, { recursive: true, force: true });
73
+ }
74
+ }
75
+
76
+ function notePath(fx: Fixture, date: string): string {
77
+ return path.join(fx.vault, `${date}.md`);
78
+ }
79
+
80
+ function writeNote(fx: Fixture, date: string, lines: string[]): void {
81
+ writeFileSync(notePath(fx, date), lines.join("\n"));
82
+ }
83
+
84
+ function mockExtract(facts: string[]) {
85
+ return async () => ({
86
+ facts: facts.map((content) => ({
87
+ content,
88
+ category: "decision" as const,
89
+ confidence: 0.9,
90
+ tags: [],
91
+ entityRef: undefined,
92
+ })),
93
+ profileUpdates: [],
94
+ entities: [],
95
+ questions: [],
96
+ });
97
+ }
98
+
99
+ test("vault journal round trip: pending_review only, journalSource=vault, hash-skip, re-extract once", async () => {
100
+ await withFixture(async (fx) => {
101
+ writeNote(fx, "2026-08-20", [
102
+ "---",
103
+ "date: 2026-08-20",
104
+ "---",
105
+ "## Journal",
106
+ "I decided to move the parser to its own module.",
107
+ START,
108
+ "- 09:00 published card",
109
+ END,
110
+ "## Timeline",
111
+ START,
112
+ "sibling published",
113
+ END,
114
+ "",
115
+ ]);
116
+ const read = readJournalForDate({ vault: fx.config, date: "2026-08-20" });
117
+ assert.ok(read.ok && read.exists);
118
+ assert.match(read.text, /I decided to move the parser/);
119
+ assert.doesNotMatch(read.text, /published card/);
120
+ assert.doesNotMatch(read.text, /sibling published/);
121
+
122
+ // First extraction: exactly one pending_review candidate.
123
+ const first = await runJournalReviewExtraction({
124
+ date: "2026-08-20",
125
+ journalText: read.text,
126
+ source: "vault",
127
+ journalConfig: { extractionMode: "review" },
128
+ deps: {
129
+ extract: mockExtract(["I decided to move the parser to its own module."]),
130
+ writer: createJournalMemoryWriter(fx.storage),
131
+ },
132
+ });
133
+ assert.equal(first.pendingReview, 1);
134
+ assert.equal(first.completed, true);
135
+
136
+ const memories = await fx.storage.readAllMemories();
137
+ assert.equal(memories.length, 1);
138
+ const memory = memories[0]!;
139
+ assert.equal(memory.frontmatter.status, "pending_review");
140
+ assert.deepEqual(memory.frontmatter.tags, ["journal", "journal-day:2026-08-20"]);
141
+ assert.equal(memory.frontmatter.valid_at, "2026-08-20T00:00:00.000Z");
142
+ assert.equal(memory.frontmatter.structuredAttributes?.journalSource, "vault");
143
+
144
+ // Hash-skip: unchanged note + stored hash → zero new candidates.
145
+ const state = setJournalHash(readTimelineState(fx.memoryDir), "2026-08-20", hashJournalText(read.text));
146
+ writeTimelineState(fx.memoryDir, state);
147
+ assert.equal(journalUnchanged(readTimelineState(fx.memoryDir), "2026-08-20", read.text), true);
148
+ const second = await runJournalReviewExtraction({
149
+ date: "2026-08-20",
150
+ journalText: read.text,
151
+ source: "vault",
152
+ journalConfig: { extractionMode: "review" },
153
+ deps: {
154
+ extract: mockExtract(["I decided to move the parser to its own module."]),
155
+ writer: createJournalMemoryWriter(fx.storage),
156
+ },
157
+ });
158
+ assert.equal(second.pendingReview, 0);
159
+ assert.equal(second.skipped, 1);
160
+ assert.equal((await fx.storage.readAllMemories()).length, 1);
161
+
162
+ // Note edited: the changed hash re-runs the pass; the new fact lands
163
+ // pending_review, the old one is untouched (not active, not duplicated).
164
+ writeNote(fx, "2026-08-20", [
165
+ "## Journal",
166
+ "I decided to move the parser to its own module.",
167
+ "I also committed to a weekly review pass.",
168
+ "",
169
+ ]);
170
+ const reread = readJournalForDate({ vault: fx.config, date: "2026-08-20" });
171
+ assert.ok(reread.ok && reread.exists);
172
+ const third = await runJournalReviewExtraction({
173
+ date: "2026-08-20",
174
+ journalText: reread.text,
175
+ source: "vault",
176
+ journalConfig: { extractionMode: "review" },
177
+ deps: {
178
+ extract: mockExtract([
179
+ "I decided to move the parser to its own module.",
180
+ "I also committed to a weekly review pass.",
181
+ ]),
182
+ writer: createJournalMemoryWriter(fx.storage),
183
+ },
184
+ });
185
+ assert.equal(third.pendingReview, 1);
186
+ assert.equal(third.skipped, 1);
187
+ const after = await fx.storage.readAllMemories();
188
+ assert.equal(after.length, 2);
189
+ for (const m of after) {
190
+ assert.equal(m.frontmatter.status, "pending_review", "no journal memory reaches active without approval");
191
+ }
192
+ });
193
+ });
194
+
195
+ test("publisher and readback coexist byte-safely on the same note", async () => {
196
+ await withFixture(async (fx) => {
197
+ mkdirSync(path.join(fx.vault, "templates"), { recursive: true });
198
+ writeNote(fx, "2026-08-21", [
199
+ "---",
200
+ "date: 2026-08-21",
201
+ "---",
202
+ "## Journal",
203
+ "user line one",
204
+ "user line two",
205
+ "## Timeline",
206
+ "",
207
+ ]);
208
+ const before = readFileSync(notePath(fx, "2026-08-21"), "utf8");
209
+
210
+ // Publish a timeline region into the note (markers strategy).
211
+ const status = publishVaultNote({
212
+ vaultPath: fx.vault,
213
+ notePathTemplate: "{yyyy}-{MM}-{dd}.md",
214
+ date: "2026-08-21",
215
+ sections: [{ name: "timeline", content: "- published card" }],
216
+ strategy: "markers",
217
+ insertUnderHeading: "Timeline",
218
+ });
219
+ assert.equal(status.results[0]?.outcome, "updated");
220
+ const afterPublish = readFileSync(notePath(fx, "2026-08-21"), "utf8");
221
+ assert.notEqual(afterPublish, before);
222
+ assert.match(afterPublish, /remnic:timeline:start/);
223
+
224
+ // Readback returns the user text byte-identically; only Remnic's own
225
+ // region was added by the publish.
226
+ const read = readJournalForDate({ vault: fx.config, date: "2026-08-21" });
227
+ assert.ok(read.ok && read.exists);
228
+ assert.equal(read.text, "user line one\nuser line two");
229
+ });
230
+ });
@@ -14,16 +14,16 @@ test("vault source produces the documented tags, attributes, and validAt", () =>
14
14
  );
15
15
  });
16
16
 
17
- test("file source differs only in the attribute value", () => {
17
+ test("memoryDir source differs only in the attribute value", () => {
18
18
  const vault = buildJournalMemoryProvenance({ source: "vault", date: "2026-08-01" });
19
- const file = buildJournalMemoryProvenance({ source: "file", date: "2026-08-01" });
20
- assert.deepEqual(file.structuredAttributes, { journalSource: "file" });
21
- assert.deepEqual(file.tags, vault.tags);
22
- assert.equal(file.validAt, vault.validAt);
19
+ const memoryDir = buildJournalMemoryProvenance({ source: "memoryDir", date: "2026-08-01" });
20
+ assert.deepEqual(memoryDir.structuredAttributes, { journalSource: "memoryDir" });
21
+ assert.deepEqual(memoryDir.tags, vault.tags);
22
+ assert.equal(memoryDir.validAt, vault.validAt);
23
23
  });
24
24
 
25
25
  test("every structured attribute value is a string", () => {
26
- for (const source of ["file", "vault"] as const) {
26
+ for (const source of ["memoryDir", "vault"] as const) {
27
27
  const { structuredAttributes } = buildJournalMemoryProvenance({
28
28
  source,
29
29
  date: "2026-08-01",
@@ -35,7 +35,9 @@ test("every structured attribute value is a string", () => {
35
35
  });
36
36
 
37
37
  test("unknown source throws RangeError naming source", () => {
38
- for (const source of ["memoryDir", "vault ", "Vault", ""]) {
38
+ // "file" is a documented legacy alias of "memoryDir" (journal-source.ts),
39
+ // covered in journal-source.test.ts — it must NOT throw here.
40
+ for (const source of ["vault ", "Vault", ""]) {
39
41
  assert.throws(
40
42
  () => buildJournalMemoryProvenance({ source, date: "2026-08-01" }),
41
43
  RangeError,
@@ -3,9 +3,8 @@
3
3
  *
4
4
  * Pure: no I/O, no clock — the day comes from the caller. The source is
5
5
  * validated through the journal-source parser, so `structuredAttributes.
6
- * journalSource` is always a canonical journal source value ("file" |
7
- * "vault"), never a re-declared copy of the allow-list. Exported helper;
8
- * caller wiring into journal memory generation is a later slice.
6
+ * journalSource` is always a canonical journal source value ("memoryDir"
7
+ * | "vault"), never a re-declared copy of the allow-list.
9
8
  */
10
9
  import { resolveJournalSource } from "./journal-source.js";
11
10
 
@@ -26,15 +25,10 @@ export function buildJournalMemoryProvenance(input: {
26
25
  if (typeof input.source !== "string") {
27
26
  throw new RangeError("journal provenance source must be a string");
28
27
  }
29
- const resolved = resolveJournalSource({
30
- source: input.source,
31
- // Provenance never consumes the heading; vault mode just requires a
32
- // non-empty one to resolve.
33
- heading: "journal",
34
- });
28
+ const resolved = resolveJournalSource({ source: input.source });
35
29
  if (!resolved.ok) {
36
30
  throw new RangeError(
37
- `journal provenance source must be one of "file", "vault": ${JSON.stringify(input.source)}`,
31
+ `journal provenance source must be one of "memoryDir", "vault": ${JSON.stringify(input.source)}`,
38
32
  );
39
33
  }
40
34
 
@@ -1,7 +1,8 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
3
 
4
- import { readVaultJournal, stripRemnicOwnedRegions } from "./journal-vault-read.js";
4
+ import { readVaultJournal } from "./journal-vault-read.js";
5
+ import { stripRemnicOwnedRegions } from "./journal-strip.js";
5
6
 
6
7
  const START = "<!-- remnic:timeline:start -->";
7
8
  const END = "<!-- remnic:timeline:end -->";
@@ -146,7 +147,7 @@ test("stripRemnicOwnedRegions returns only user text after injected regions", ()
146
147
  for (const name of names) {
147
148
  const region = `<!-- remnic:${name}:start -->\nOWNED ${name}\n<!-- remnic:${name}:end -->\n`;
148
149
  const mixed = `${region}${user}${region}${user}`;
149
- const stripped = stripRemnicOwnedRegions(mixed);
150
+ const stripped = stripRemnicOwnedRegions(mixed, []);
150
151
  assert.equal(stripped.text, `${user}${user}`);
151
152
  assert.deepEqual(stripped.warnings, []);
152
153
  }