@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
@@ -0,0 +1,144 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawn } from "node:child_process";
3
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { createRequire } from "node:module";
5
+ import path from "node:path";
6
+ import test from "node:test";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ import { withTempDir, withTempDirSync } from "../testing/tmp-dir.js";
10
+ import {
11
+ hashJournalText,
12
+ journalUnchanged,
13
+ readTimelineState,
14
+ setJournalHash,
15
+ timelineStatePath,
16
+ writeTimelineState,
17
+ } from "./journal-state.js";
18
+
19
+ const require = createRequire(import.meta.url);
20
+
21
+ test("missing state file reads as empty", () => {
22
+ withTempDirSync((dir) => {
23
+ assert.deepEqual(readTimelineState(dir), { version: 1, journal: {} });
24
+ });
25
+ });
26
+
27
+ test("corrupt state file reads as empty and never blocks extraction", () => {
28
+ withTempDirSync((dir) => {
29
+ mkdirSync(path.join(dir, "state"), { recursive: true });
30
+ writeFileSync(timelineStatePath(dir), "{not json");
31
+ assert.deepEqual(readTimelineState(dir), { version: 1, journal: {} });
32
+ });
33
+ });
34
+
35
+ test("non-string or empty hash entries are dropped on read", () => {
36
+ withTempDirSync((dir) => {
37
+ writeTimelineState(dir, {
38
+ version: 1,
39
+ journal: { "2026-08-20": "abc", "2026-08-21": "", bad: 5 } as unknown as Record<string, string>,
40
+ });
41
+ const state = readTimelineState(dir);
42
+ assert.deepEqual(state.journal, { "2026-08-20": "abc" });
43
+ });
44
+ });
45
+
46
+ test("write is a durable round-trip through JSON on disk", () => {
47
+ withTempDirSync((dir) => {
48
+ const state = setJournalHash({ version: 1, journal: {} }, "2026-08-20", hashJournalText("day one"));
49
+ writeTimelineState(dir, state);
50
+ assert.equal(readFileSync(timelineStatePath(dir), "utf8"), `${JSON.stringify(state, null, 2)}\n`);
51
+ assert.deepEqual(readTimelineState(dir), state);
52
+ });
53
+ });
54
+
55
+ test("journalUnchanged is true only for identical post-strip text", () => {
56
+ const state = setJournalHash({ version: 1, journal: {} }, "2026-08-20", hashJournalText("text"));
57
+ assert.equal(journalUnchanged(state, "2026-08-20", "text"), true);
58
+ assert.equal(journalUnchanged(state, "2026-08-20", "text "), false);
59
+ assert.equal(journalUnchanged(state, "2026-08-20", "edited"), false);
60
+ assert.equal(journalUnchanged(state, "2026-08-21", "text"), false);
61
+ assert.equal(journalUnchanged({ version: 1, journal: {} }, "2026-08-20", "text"), false);
62
+ });
63
+
64
+ test("setJournalHash is pure — the input state object is not mutated", () => {
65
+ const original = { version: 1, journal: {} } as const;
66
+ const next = setJournalHash(original, "2026-08-20", "h");
67
+ assert.deepEqual(original.journal, {});
68
+ assert.deepEqual(next.journal, { "2026-08-20": "h" });
69
+ });
70
+
71
+ test("hashJournalText is deterministic and content-sensitive", () => {
72
+ assert.equal(hashJournalText("a"), hashJournalText("a"));
73
+ assert.notEqual(hashJournalText("a"), hashJournalText("b"));
74
+ assert.match(hashJournalText("a"), /^[0-9a-f]{64}$/);
75
+ });
76
+
77
+ test("writeTimelineState uses a unique temp path then rename", () => {
78
+ withTempDirSync((dir) => {
79
+ const first = setJournalHash({ version: 1, journal: {} }, "2026-08-20", hashJournalText("a"));
80
+ writeTimelineState(dir, first);
81
+ const second = setJournalHash(first, "2026-08-21", hashJournalText("b"));
82
+ writeTimelineState(dir, second);
83
+ assert.deepEqual(readTimelineState(dir), second);
84
+ assert.match(readFileSync(timelineStatePath(dir), "utf8"), /2026-08-21/);
85
+ });
86
+ });
87
+
88
+ function runLockWorker(env: Record<string, string>): Promise<void> {
89
+ const tsxCli = require.resolve("tsx/cli");
90
+ const worker = fileURLToPath(new URL("./journal-state.lock-worker.ts", import.meta.url));
91
+ return new Promise((resolve, reject) => {
92
+ const child = spawn(process.execPath, [tsxCli, worker], {
93
+ env: { ...process.env, ...env },
94
+ stdio: ["ignore", "pipe", "pipe"],
95
+ });
96
+ let stderr = "";
97
+ child.stderr.setEncoding("utf8");
98
+ child.stderr.on("data", (chunk) => {
99
+ stderr += chunk;
100
+ });
101
+ child.on("error", reject);
102
+ child.on("close", (code) => {
103
+ if (code === 0) resolve();
104
+ else reject(new Error(`lock worker exited ${code}: ${stderr}`));
105
+ });
106
+ });
107
+ }
108
+
109
+ test("two processes extracting the same date produce one candidate", async () => {
110
+ await withTempDir(async (dir) => {
111
+ const marker = path.join(dir, "candidates");
112
+ writeFileSync(marker, "");
113
+ const env = {
114
+ JOURNAL_LOCK_DIR: dir,
115
+ JOURNAL_LOCK_DATE: "2026-08-20",
116
+ JOURNAL_LOCK_TEXT: "same day body",
117
+ JOURNAL_LOCK_MARKER: marker,
118
+ };
119
+ await Promise.all([runLockWorker(env), runLockWorker(env)]);
120
+ assert.equal(readFileSync(marker, "utf8"), "1");
121
+ });
122
+ });
123
+
124
+ test("different dates extract concurrently without sharing a lock", async () => {
125
+ await withTempDir(async (dir) => {
126
+ const marker = path.join(dir, "candidates");
127
+ writeFileSync(marker, "");
128
+ await Promise.all([
129
+ runLockWorker({
130
+ JOURNAL_LOCK_DIR: dir,
131
+ JOURNAL_LOCK_DATE: "2026-08-20",
132
+ JOURNAL_LOCK_TEXT: "day a",
133
+ JOURNAL_LOCK_MARKER: marker,
134
+ }),
135
+ runLockWorker({
136
+ JOURNAL_LOCK_DIR: dir,
137
+ JOURNAL_LOCK_DATE: "2026-08-21",
138
+ JOURNAL_LOCK_TEXT: "day b",
139
+ JOURNAL_LOCK_MARKER: marker,
140
+ }),
141
+ ]);
142
+ assert.equal(readFileSync(marker, "utf8"), "11");
143
+ });
144
+ });
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Per-day change detection for journal extraction (issue #1987).
3
+ *
4
+ * `<memoryDir>/state/timeline.json` stores a content hash of the
5
+ * POST-STRIP journal text per day. An unchanged day is never re-extracted
6
+ * (same pattern as the wearables day-skip); a day edited weeks later
7
+ * re-extracts exactly once per content change.
8
+ */
9
+ import { createHash, randomBytes } from "node:crypto";
10
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
11
+ import path from "node:path";
12
+
13
+ import { withHeldFileLock } from "../utils/serialize-mutations.js";
14
+
15
+ export interface TimelineState {
16
+ version: 1;
17
+ journal: Record<string, string>;
18
+ }
19
+
20
+ const STATE_DIR_NAME = "state";
21
+ const STATE_FILE_NAME = "timeline.json";
22
+
23
+ export function timelineStatePath(memoryDir: string): string {
24
+ return path.join(memoryDir, STATE_DIR_NAME, STATE_FILE_NAME);
25
+ }
26
+
27
+ /** Hash the post-strip section text — Remnic-stripped noise must not re-trigger extraction. */
28
+ export function hashJournalText(text: string): string {
29
+ return createHash("sha256").update(text, "utf8").digest("hex");
30
+ }
31
+
32
+ export function readTimelineState(memoryDir: string): TimelineState {
33
+ const filePath = timelineStatePath(memoryDir);
34
+ let parsed: unknown;
35
+ try {
36
+ parsed = JSON.parse(readFileSync(filePath, "utf8"));
37
+ } catch {
38
+ // A corrupt state file must never block extraction: treat as empty.
39
+ return { version: 1, journal: {} };
40
+ }
41
+ if (typeof parsed !== "object" || parsed === null || !("journal" in parsed)) {
42
+ return { version: 1, journal: {} };
43
+ }
44
+ const journal: unknown = parsed.journal;
45
+ if (typeof journal !== "object" || journal === null) return { version: 1, journal: {} };
46
+ const hashes: Record<string, string> = {};
47
+ for (const [date, value] of Object.entries(journal)) {
48
+ if (typeof value === "string" && value.length > 0) hashes[date] = value;
49
+ }
50
+ return { version: 1, journal: hashes };
51
+ }
52
+
53
+ /** Write new before deleting old (§42): unique temp file first, then an atomic rename. */
54
+ export function writeTimelineState(memoryDir: string, state: TimelineState): void {
55
+ const filePath = timelineStatePath(memoryDir);
56
+ mkdirSync(path.dirname(filePath), { recursive: true });
57
+ const tempPath = `${filePath}.${process.pid}.${randomBytes(8).toString("hex")}.tmp`;
58
+ writeFileSync(tempPath, `${JSON.stringify(state, null, 2)}\n`);
59
+ renameSync(tempPath, filePath);
60
+ }
61
+
62
+ export function journalDateLockPath(memoryDir: string, date: string): string {
63
+ return path.join(memoryDir, STATE_DIR_NAME, `journal-extract-${date}.lock`);
64
+ }
65
+
66
+ export function timelineStateLockPath(memoryDir: string): string {
67
+ return `${timelineStatePath(memoryDir)}.lock`;
68
+ }
69
+
70
+ const DATE_LOCK_OPTS = { staleMs: 120_000, maxWaitMs: 60_000 } as const;
71
+ const STATE_LOCK_OPTS = { staleMs: 30_000, maxWaitMs: 15_000 } as const;
72
+
73
+ /** Hold the per-date extract lock for hash reread → extract → commit. Fail closed. */
74
+ export async function withJournalDateLock<T>(
75
+ memoryDir: string,
76
+ date: string,
77
+ task: () => Promise<T>,
78
+ ): Promise<T> {
79
+ return withHeldFileLock(journalDateLockPath(memoryDir, date), DATE_LOCK_OPTS, async (acquired) => {
80
+ if (!acquired) {
81
+ throw new Error(`journal: could not acquire the extract lock for ${date}`);
82
+ }
83
+ return task();
84
+ });
85
+ }
86
+
87
+ /** Reread-merge one day's hash under the state-file lock, unique tmp + rename. */
88
+ export async function commitJournalHash(memoryDir: string, date: string, hash: string): Promise<void> {
89
+ await withHeldFileLock(timelineStateLockPath(memoryDir), STATE_LOCK_OPTS, async (acquired) => {
90
+ if (!acquired) {
91
+ throw new Error("journal: could not acquire the timeline state lock");
92
+ }
93
+ const latest = readTimelineState(memoryDir);
94
+ writeTimelineState(memoryDir, setJournalHash(latest, date, hash));
95
+ });
96
+ }
97
+
98
+ /** Pure update: set one day's hash. Returns a new state object. */
99
+ export function setJournalHash(state: TimelineState, date: string, hash: string): TimelineState {
100
+ return { ...state, journal: { ...state.journal, [date]: hash } };
101
+ }
102
+
103
+ /** True when the day's stored hash matches — unchanged days are skipped. */
104
+ export function journalUnchanged(state: TimelineState, date: string, text: string): boolean {
105
+ const stored = state.journal[date];
106
+ return typeof stored === "string" && stored === hashJournalText(text);
107
+ }
@@ -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