@remnic/core 9.45.3 → 9.45.4

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 (747) hide show
  1. package/dist/abort-error.d.ts +2 -1
  2. package/dist/abort-error.js +3 -1
  3. package/dist/access-admin-ops-surface.d.ts +14 -10
  4. package/dist/access-admin-ops-surface.js +84 -76
  5. package/dist/access-audit.js +2 -2
  6. package/dist/access-authorization-probe.d.ts +14 -10
  7. package/dist/access-authorization-probe.js +85 -77
  8. package/dist/access-boundary.d.ts +15 -11
  9. package/dist/access-boundary.js +84 -76
  10. package/dist/access-citation-namespace.js +2 -2
  11. package/dist/access-cli.js +193 -181
  12. package/dist/access-cli.js.map +1 -1
  13. package/dist/access-coding-context-resolution.d.ts +16 -0
  14. package/dist/access-coding-context-resolution.js +13 -0
  15. package/dist/access-coding-context-resolution.js.map +1 -0
  16. package/dist/access-extraction-force-flush.d.ts +14 -10
  17. package/dist/access-extraction-force-flush.js +84 -76
  18. package/dist/access-health-types.d.ts +2 -1
  19. package/dist/access-http-lcm-compaction.d.ts +16 -12
  20. package/dist/access-http-lcm-compaction.js +3 -3
  21. package/dist/access-http-lifecycle-flush.d.ts +14 -10
  22. package/dist/access-http-lifecycle-flush.js +2 -2
  23. package/dist/access-http-offline-stream.d.ts +123 -0
  24. package/dist/access-http-offline-stream.js +10 -0
  25. package/dist/access-http-offline-stream.js.map +1 -0
  26. package/dist/access-http-query.js +84 -76
  27. package/dist/access-http.d.ts +15 -10
  28. package/dist/access-http.js +105 -92
  29. package/dist/access-identity-continuity-surface.d.ts +9 -8
  30. package/dist/access-identity-continuity-surface.js +84 -76
  31. package/dist/access-lcm-surface.d.ts +14 -10
  32. package/dist/access-lcm-surface.js +84 -76
  33. package/dist/access-mcp-output-schemas.js +1 -1
  34. package/dist/access-mcp.d.ts +14 -10
  35. package/dist/access-mcp.js +95 -83
  36. package/dist/access-memory-search-fanout.d.ts +3 -2
  37. package/dist/{access-namespace-preflight-5yZ4g6F8.d.ts → access-namespace-preflight-CWUDwB4M.d.ts} +1 -1
  38. package/dist/access-namespace-preflight.d.ts +4 -3
  39. package/dist/access-namespace-preflight.js +84 -76
  40. package/dist/access-observe-helpers.d.ts +1 -0
  41. package/dist/access-observe-helpers.js +1 -1
  42. package/dist/access-observe-write-surface.d.ts +16 -10
  43. package/dist/access-observe-write-surface.js +84 -76
  44. package/dist/access-offline-manifest.d.ts +104 -0
  45. package/dist/access-offline-manifest.js +45 -0
  46. package/dist/access-offline-manifest.js.map +1 -0
  47. package/dist/access-operations-batch.js +86 -78
  48. package/dist/access-operations.d.ts +15 -11
  49. package/dist/access-operations.js +91 -80
  50. package/dist/access-recall-concurrency.d.ts +16 -26
  51. package/dist/access-recall-concurrency.js +86 -77
  52. package/dist/access-recall-response.d.ts +18 -14
  53. package/dist/access-recall-response.js +84 -76
  54. package/dist/access-recall-surface.d.ts +29 -24
  55. package/dist/access-recall-surface.js +84 -76
  56. package/dist/access-schema.js +3 -3
  57. package/dist/{access-service-CiJRsgAB.d.ts → access-service-CsU-ljFD.d.ts} +25 -16
  58. package/dist/access-service-helpers.d.ts +14 -10
  59. package/dist/access-service.d.ts +14 -10
  60. package/dist/access-service.js +84 -76
  61. package/dist/access-surface-catalog.d.ts +14 -10
  62. package/dist/access-surface-catalog.js +4 -0
  63. package/dist/access-surface-catalog.js.map +1 -1
  64. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  65. package/dist/action-confidence.d.ts +2 -1
  66. package/dist/active-memory-bridge.d.ts +2 -1
  67. package/dist/active-recall.d.ts +2 -1
  68. package/dist/active-recall.js +10 -8
  69. package/dist/active-recall.js.map +1 -1
  70. package/dist/adapters/index.js +7 -7
  71. package/dist/adapters/registry.js +3 -3
  72. package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +6 -6
  73. package/dist/behavior-learner.d.ts +2 -1
  74. package/dist/behavior-learner.js +1 -1
  75. package/dist/behavior-signals.d.ts +2 -1
  76. package/dist/bootstrap.d.ts +9 -8
  77. package/dist/briefing.d.ts +3 -2
  78. package/dist/briefing.js +23 -22
  79. package/dist/buffer-surprise-report.d.ts +2 -1
  80. package/dist/buffer-turn-helpers.d.ts +2 -1
  81. package/dist/buffer.d.ts +3 -2
  82. package/dist/buffer.js +12 -11
  83. package/dist/bulk-import/index.d.ts +4 -3
  84. package/dist/calibration.d.ts +2 -1
  85. package/dist/capabilities.d.ts +2 -1
  86. package/dist/{capsule-merge-IDWJPCWK.js → capsule-merge-Q6AR3XL7.js} +67 -54
  87. package/dist/capsule-merge-Q6AR3XL7.js.map +1 -0
  88. package/dist/{catalog-scBmy0sO.d.ts → catalog-bctMURhN.d.ts} +1 -1
  89. package/dist/causal-behavior.d.ts +2 -1
  90. package/dist/causal-behavior.js +2 -2
  91. package/dist/causal-chain.js +2 -2
  92. package/dist/causal-consolidation.d.ts +2 -1
  93. package/dist/causal-consolidation.js +27 -26
  94. package/dist/causal-consolidation.js.map +1 -1
  95. package/dist/causal-retrieval.js +2 -2
  96. package/dist/causal-trajectory-graph.d.ts +2 -1
  97. package/dist/causal-trajectory.js +1 -1
  98. package/dist/{chunk-VUPTKTDV.js → chunk-2MRHJNWL.js} +3 -3
  99. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  100. package/dist/{chunk-5IVLTFOV.js → chunk-44N6ESJ4.js} +2 -2
  101. package/dist/{chunk-WOCNN776.js → chunk-4POAMKV6.js} +100 -41
  102. package/dist/chunk-4POAMKV6.js.map +1 -0
  103. package/dist/{chunk-HO3QBJEY.js → chunk-5546W5SI.js} +2 -2
  104. package/dist/{chunk-U7GW7NE7.js → chunk-5CEECY6P.js} +10 -10
  105. package/dist/{chunk-4UH4BTGK.js → chunk-5SNZSWWR.js} +82 -82
  106. package/dist/{chunk-6CZPDBJS.js → chunk-5U7ID3EZ.js} +3 -3
  107. package/dist/{chunk-GF22HWS2.js → chunk-6NNNURLK.js} +7 -7
  108. package/dist/chunk-773TRRGT.js +36 -0
  109. package/dist/chunk-773TRRGT.js.map +1 -0
  110. package/dist/chunk-7CITSYSH.js +242 -0
  111. package/dist/chunk-7CITSYSH.js.map +1 -0
  112. package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
  113. package/dist/{chunk-E5UK4VPE.js → chunk-7SHJHPTY.js} +5 -5
  114. package/dist/{chunk-UVIKWC7M.js → chunk-7YERSTN7.js} +17 -17
  115. package/dist/{chunk-DLVPUX7U.js → chunk-7YKVM5H3.js} +8 -6
  116. package/dist/chunk-7YKVM5H3.js.map +1 -0
  117. package/dist/{chunk-3CE77VAP.js → chunk-A4JMGKCD.js} +87 -74
  118. package/dist/chunk-A4JMGKCD.js.map +1 -0
  119. package/dist/chunk-A5KNZSNA.js +26 -0
  120. package/dist/chunk-A5KNZSNA.js.map +1 -0
  121. package/dist/{chunk-S2NCTZGJ.js → chunk-AJQ57VV3.js} +15 -15
  122. package/dist/chunk-AJQ57VV3.js.map +1 -0
  123. package/dist/{chunk-CUM2BBPN.js → chunk-AUMWZSE7.js} +19 -10
  124. package/dist/chunk-AUMWZSE7.js.map +1 -0
  125. package/dist/{chunk-XYTOI63Z.js → chunk-BGHFOD5A.js} +19 -11
  126. package/dist/chunk-BGHFOD5A.js.map +1 -0
  127. package/dist/{chunk-BUE5E2HL.js → chunk-BGLY7EEM.js} +5 -314
  128. package/dist/chunk-BGLY7EEM.js.map +1 -0
  129. package/dist/chunk-BIPBQQFI.js +44 -0
  130. package/dist/chunk-BIPBQQFI.js.map +1 -0
  131. package/dist/{chunk-S5SLVSVY.js → chunk-BQIFZ2MP.js} +5 -5
  132. package/dist/chunk-BTTPKDIL.js +34 -0
  133. package/dist/{chunk-PVGDJXVK.js.map → chunk-BTTPKDIL.js.map} +1 -1
  134. package/dist/{chunk-E53DSZEN.js → chunk-C26TE27X.js} +3 -3
  135. package/dist/{chunk-LZ4LDKHZ.js → chunk-CLB32OHM.js} +6 -6
  136. package/dist/{chunk-Q6IP2ARR.js → chunk-CSOYVTRX.js} +2 -2
  137. package/dist/{chunk-XOQSEF7X.js → chunk-CVILPI77.js} +6 -6
  138. package/dist/chunk-D3I2MCN7.js +29 -0
  139. package/dist/chunk-D3I2MCN7.js.map +1 -0
  140. package/dist/{chunk-A5OJCXZL.js → chunk-DSUAAZZX.js} +15 -4
  141. package/dist/chunk-DSUAAZZX.js.map +1 -0
  142. package/dist/{chunk-HREE4JHI.js → chunk-DYVMXPCF.js} +486 -287
  143. package/dist/chunk-DYVMXPCF.js.map +1 -0
  144. package/dist/{chunk-J7VGGECD.js → chunk-DZPFMQZ7.js} +1 -1
  145. package/dist/chunk-DZPFMQZ7.js.map +1 -0
  146. package/dist/{chunk-PDLBLTOK.js → chunk-EITZHSX6.js} +9 -9
  147. package/dist/{chunk-D3J5SLQK.js → chunk-EJHEWCGQ.js} +81 -20
  148. package/dist/chunk-EJHEWCGQ.js.map +1 -0
  149. package/dist/{chunk-WUNIWKY4.js → chunk-ELIL2A37.js} +6 -6
  150. package/dist/{chunk-E6PNLPGJ.js → chunk-FZP32336.js} +806 -470
  151. package/dist/chunk-FZP32336.js.map +1 -0
  152. package/dist/{chunk-HZFHQ4AQ.js → chunk-G7A5HLUS.js} +23 -17
  153. package/dist/chunk-G7A5HLUS.js.map +1 -0
  154. package/dist/{chunk-CINZGPSJ.js → chunk-GUMZC2BO.js} +2 -2
  155. package/dist/{chunk-H24WNPA2.js → chunk-GWFSVJ4P.js} +3 -3
  156. package/dist/{chunk-7XC2HX75.js → chunk-GYPQL6XN.js} +157 -16
  157. package/dist/chunk-GYPQL6XN.js.map +1 -0
  158. package/dist/{chunk-TSH56VPU.js → chunk-HAYSYUAB.js} +2 -2
  159. package/dist/{chunk-TDHTVMPG.js → chunk-HFPASSFV.js} +7 -2
  160. package/dist/chunk-HFPASSFV.js.map +1 -0
  161. package/dist/chunk-J2WC5LF4.js +395 -0
  162. package/dist/chunk-J2WC5LF4.js.map +1 -0
  163. package/dist/{chunk-PKNLM44P.js → chunk-JH6BPLOP.js} +9 -9
  164. package/dist/{chunk-KXB4VXHY.js → chunk-JIYDRBVZ.js} +2 -2
  165. package/dist/chunk-JV3C2MNQ.js +74 -0
  166. package/dist/chunk-JV3C2MNQ.js.map +1 -0
  167. package/dist/{chunk-AV5ZEH4M.js → chunk-KVJRXN2E.js} +2 -2
  168. package/dist/{chunk-JVLCVFQ4.js → chunk-KXEFRMCF.js} +3 -3
  169. package/dist/{chunk-WFTIGIIS.js → chunk-L6CQ7WIW.js} +5 -5
  170. package/dist/{chunk-EJUEXZHX.js → chunk-LLJMAULE.js} +2 -2
  171. package/dist/{chunk-N5Z4EVOR.js → chunk-LNEWDF2A.js} +36 -11
  172. package/dist/chunk-LNEWDF2A.js.map +1 -0
  173. package/dist/{chunk-AS7YMSL6.js → chunk-M23RF3LJ.js} +4 -4
  174. package/dist/{chunk-UYLMNVY6.js → chunk-MDISBSYA.js} +16 -9
  175. package/dist/chunk-MDISBSYA.js.map +1 -0
  176. package/dist/{chunk-3F2LKUMU.js → chunk-NIS256NW.js} +2 -2
  177. package/dist/{chunk-YIAA2X3D.js → chunk-NK5RGJ65.js} +3 -3
  178. package/dist/chunk-NLDVVWCL.js +84 -0
  179. package/dist/chunk-NLDVVWCL.js.map +1 -0
  180. package/dist/{chunk-OQ5PRDDS.js → chunk-NTOIP2E6.js} +6 -6
  181. package/dist/{chunk-HLPD7B7P.js → chunk-NUEQKLNB.js} +2 -2
  182. package/dist/{chunk-4J7G5SY4.js → chunk-NZBZ7IS2.js} +72 -24
  183. package/dist/chunk-NZBZ7IS2.js.map +1 -0
  184. package/dist/{chunk-3TBLDMJA.js → chunk-O4KMGRXE.js} +5 -2
  185. package/dist/chunk-O4KMGRXE.js.map +1 -0
  186. package/dist/{chunk-33PLLLL7.js → chunk-P7NGM24P.js} +6 -6
  187. package/dist/{chunk-7TWUCYER.js → chunk-PNRA7FAD.js} +7 -7
  188. package/dist/{chunk-5I4M26Q7.js → chunk-QBSFOKY6.js} +4 -4
  189. package/dist/{chunk-QJAQNXWI.js → chunk-QCECHYZL.js} +76 -79
  190. package/dist/chunk-QCECHYZL.js.map +1 -0
  191. package/dist/{chunk-P4DRWEYC.js → chunk-QVSBTCVP.js} +2 -2
  192. package/dist/{chunk-AAIUERNB.js → chunk-R5RFK3CB.js} +6 -6
  193. package/dist/{chunk-WDISJRMG.js → chunk-RMMVQQA6.js} +2 -2
  194. package/dist/{chunk-KWMXR7XS.js → chunk-S2V7RUCL.js} +8 -1
  195. package/dist/{chunk-KWMXR7XS.js.map → chunk-S2V7RUCL.js.map} +1 -1
  196. package/dist/{chunk-5SM35XZR.js → chunk-S5NZBKKQ.js} +2 -2
  197. package/dist/{chunk-VNA7W7QF.js → chunk-SVH57F5Z.js} +12 -4
  198. package/dist/chunk-SVH57F5Z.js.map +1 -0
  199. package/dist/{chunk-WIPEXG6R.js → chunk-SXIMQLGV.js} +2 -2
  200. package/dist/{chunk-RVLJEII5.js → chunk-SYUBB3WM.js} +256 -187
  201. package/dist/chunk-SYUBB3WM.js.map +1 -0
  202. package/dist/{chunk-OAEQLRCY.js → chunk-TN76AKO3.js} +5 -5
  203. package/dist/{chunk-QN25OCUF.js → chunk-TQ4GD737.js} +5 -5
  204. package/dist/{chunk-VCD4PSK2.js → chunk-TQZ4DVBC.js} +7 -4
  205. package/dist/chunk-TQZ4DVBC.js.map +1 -0
  206. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  207. package/dist/{chunk-DNWXFTLD.js → chunk-TYISDI6B.js} +2 -2
  208. package/dist/{chunk-4LMA77JH.js → chunk-U2VLVBBH.js} +3 -3
  209. package/dist/{chunk-5ZE7QHTK.js → chunk-ULVR5KG7.js} +5 -5
  210. package/dist/{chunk-NVRYW264.js → chunk-UQWIKLQK.js} +18 -15
  211. package/dist/chunk-UQWIKLQK.js.map +1 -0
  212. package/dist/{chunk-YV32N67O.js → chunk-URS5GSM7.js} +1 -1
  213. package/dist/chunk-URS5GSM7.js.map +1 -0
  214. package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
  215. package/dist/{chunk-S2BBISHU.js → chunk-VANZKHTN.js} +3 -3
  216. package/dist/chunk-VHFXP27N.js +250 -0
  217. package/dist/chunk-VHFXP27N.js.map +1 -0
  218. package/dist/{chunk-3Y224NYC.js → chunk-VYISFWVX.js} +2 -2
  219. package/dist/{chunk-TIHMZFIV.js → chunk-W3IC7QOY.js} +3 -3
  220. package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
  221. package/dist/{chunk-P2BM76KT.js → chunk-WAS4HV46.js} +174 -43
  222. package/dist/chunk-WAS4HV46.js.map +1 -0
  223. package/dist/{chunk-57QKLRBV.js → chunk-WB7JSQCP.js} +2 -1
  224. package/dist/chunk-WB7JSQCP.js.map +1 -0
  225. package/dist/chunk-WGP57SR3.js +68 -0
  226. package/dist/chunk-WGP57SR3.js.map +1 -0
  227. package/dist/{chunk-ECK75GDJ.js → chunk-WQIHRA5F.js} +43 -24
  228. package/dist/chunk-WQIHRA5F.js.map +1 -0
  229. package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
  230. package/dist/{chunk-T2TTP3KU.js → chunk-X4IDNPOS.js} +2 -2
  231. package/dist/{chunk-BLAKS3CP.js → chunk-XL3TATMJ.js} +3 -3
  232. package/dist/{chunk-W4XJFLAL.js → chunk-XPRJSHNI.js} +2 -2
  233. package/dist/{chunk-5TFP4CUL.js → chunk-XQ3HXAQH.js} +14 -11
  234. package/dist/chunk-XQ3HXAQH.js.map +1 -0
  235. package/dist/{chunk-VWAXN2BN.js → chunk-XSFHWBQO.js} +93 -31
  236. package/dist/chunk-XSFHWBQO.js.map +1 -0
  237. package/dist/{chunk-DL7ZD3JH.js → chunk-XTAUXTDO.js} +14 -9
  238. package/dist/chunk-XTAUXTDO.js.map +1 -0
  239. package/dist/{chunk-JE7EK33X.js → chunk-Y7HRYCNW.js} +2 -2
  240. package/dist/{chunk-E6EE5B67.js → chunk-YK6BDDHP.js} +4 -4
  241. package/dist/{chunk-ES36HTSC.js → chunk-YLHM5BQQ.js} +3 -3
  242. package/dist/{chunk-RN7DY3FC.js → chunk-YMAQDHQM.js} +31 -12
  243. package/dist/chunk-YMAQDHQM.js.map +1 -0
  244. package/dist/{chunk-ULARSG5Z.js → chunk-YN6ASZUG.js} +10 -8
  245. package/dist/{chunk-ULARSG5Z.js.map → chunk-YN6ASZUG.js.map} +1 -1
  246. package/dist/{chunk-IKKWIPYN.js → chunk-YYQAKIDJ.js} +37 -1
  247. package/dist/chunk-YYQAKIDJ.js.map +1 -0
  248. package/dist/{chunk-BJKPPZ6Z.js → chunk-ZFGZ6PZ2.js} +2 -2
  249. package/dist/{chunk-CJ2ZR7UA.js → chunk-ZI32MKDW.js} +267 -214
  250. package/dist/chunk-ZI32MKDW.js.map +1 -0
  251. package/dist/{chunk-64UDOIMI.js → chunk-ZLQ37WJX.js} +2 -2
  252. package/dist/chunk-ZMAYKGPN.js +351 -0
  253. package/dist/chunk-ZMAYKGPN.js.map +1 -0
  254. package/dist/{cli-BUGN3d6_.d.ts → cli-BBHDtG36.d.ts} +5 -5
  255. package/dist/cli.d.ts +16 -12
  256. package/dist/cli.js +138 -124
  257. package/dist/compounding/engine.d.ts +3 -2
  258. package/dist/compounding/engine.js +24 -23
  259. package/dist/compounding/preference-consolidator.d.ts +2 -1
  260. package/dist/compression-optimizer.d.ts +2 -1
  261. package/dist/config.d.ts +2 -1
  262. package/dist/config.js +10 -8
  263. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  264. package/dist/connectors/codex-materialize-runner.js +23 -22
  265. package/dist/connectors/codex-materialize.d.ts +2 -1
  266. package/dist/connectors/index.d.ts +2 -1
  267. package/dist/connectors/index.js +26 -25
  268. package/dist/consolidation-provenance-check.d.ts +3 -2
  269. package/dist/consolidation-provenance-check.js +4 -4
  270. package/dist/consolidation-undo.d.ts +3 -2
  271. package/dist/consolidation-undo.js +10 -7
  272. package/dist/consolidation-undo.js.map +1 -1
  273. package/dist/contradiction/index.d.ts +3 -2
  274. package/dist/converge-config.d.ts +2 -1
  275. package/dist/convergence-refresh.d.ts +4 -3
  276. package/dist/convergence-refresh.js +27 -26
  277. package/dist/conversation-index/backend.d.ts +2 -1
  278. package/dist/conversation-index/backend.js +2 -2
  279. package/dist/conversation-index/chunker.d.ts +2 -1
  280. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  281. package/dist/conversation-index/indexer.d.ts +2 -1
  282. package/dist/conversation-index/search.d.ts +2 -1
  283. package/dist/corpus-watermark.d.ts +2 -1
  284. package/dist/corpus-watermark.js +42 -41
  285. package/dist/day-summary.d.ts +2 -1
  286. package/dist/delinearize.d.ts +2 -1
  287. package/dist/direct-answer-wiring.d.ts +2 -1
  288. package/dist/direct-answer-wiring.js +2 -2
  289. package/dist/direct-answer.d.ts +2 -1
  290. package/dist/embedding-fallback.d.ts +2 -1
  291. package/dist/embedding-fallback.js +2 -2
  292. package/dist/enrichment/index.d.ts +2 -1
  293. package/dist/entity-retrieval-boundaries.js +1 -1
  294. package/dist/entity-retrieval.d.ts +3 -2
  295. package/dist/entity-retrieval.js +24 -23
  296. package/dist/entity-schema.d.ts +2 -1
  297. package/dist/explicit-capture.d.ts +9 -8
  298. package/dist/explicit-capture.js +11 -9
  299. package/dist/external-wiki-access.d.ts +127 -0
  300. package/dist/external-wiki-access.js +186 -0
  301. package/dist/external-wiki-access.js.map +1 -0
  302. package/dist/external-wiki-cli.d.ts +13 -0
  303. package/dist/external-wiki-cli.js +96 -0
  304. package/dist/external-wiki-cli.js.map +1 -0
  305. package/dist/external-wiki-collection-registration.d.ts +39 -0
  306. package/dist/external-wiki-collection-registration.js +79 -0
  307. package/dist/external-wiki-collection-registration.js.map +1 -0
  308. package/dist/external-wiki-collection.d.ts +50 -0
  309. package/dist/external-wiki-collection.js +387 -0
  310. package/dist/external-wiki-collection.js.map +1 -0
  311. package/dist/external-wiki-config.d.ts +13 -0
  312. package/dist/external-wiki-config.js +13 -0
  313. package/dist/external-wiki-config.js.map +1 -0
  314. package/dist/external-wiki-guard.d.ts +11 -0
  315. package/dist/external-wiki-guard.js +18 -0
  316. package/dist/external-wiki-guard.js.map +1 -0
  317. package/dist/external-wiki-mcp-tools.d.ts +123 -0
  318. package/dist/external-wiki-mcp-tools.js +8 -0
  319. package/dist/external-wiki-mcp-tools.js.map +1 -0
  320. package/dist/external-wiki-search.d.ts +42 -0
  321. package/dist/external-wiki-search.js +11 -0
  322. package/dist/external-wiki-search.js.map +1 -0
  323. package/dist/external-wiki.d.ts +43 -0
  324. package/dist/external-wiki.js +16 -0
  325. package/dist/external-wiki.js.map +1 -0
  326. package/dist/extraction-error-classification.d.ts +2 -1
  327. package/dist/extraction-faithfulness.d.ts +2 -1
  328. package/dist/extraction-judge-telemetry.d.ts +2 -1
  329. package/dist/extraction-judge-training.d.ts +2 -1
  330. package/dist/extraction-judge.d.ts +2 -1
  331. package/dist/extraction-liveness.d.ts +2 -1
  332. package/dist/extraction-source-grounding-helpers.d.ts +5 -3
  333. package/dist/extraction-source-grounding-helpers.js +1 -1
  334. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  335. package/dist/extraction-source-grounding-rules.js +2 -2
  336. package/dist/extraction-source-grounding.d.ts +2 -1
  337. package/dist/extraction-source-grounding.js +5 -5
  338. package/dist/extraction.d.ts +2 -1
  339. package/dist/extraction.js +45 -43
  340. package/dist/fallback-llm.d.ts +2 -1
  341. package/dist/graph-dashboard-diff.d.ts +2 -1
  342. package/dist/graph-dashboard-key.d.ts +2 -1
  343. package/dist/graph-dashboard-parser.d.ts +2 -1
  344. package/dist/graph-edge-reinforcement.d.ts +2 -1
  345. package/dist/graph-snapshot.d.ts +2 -1
  346. package/dist/graph.d.ts +2 -1
  347. package/dist/harmonic-retrieval.js +2 -2
  348. package/dist/importance.d.ts +2 -1
  349. package/dist/importers/index.d.ts +2 -1
  350. package/dist/in-flight-reads.d.ts +2 -1
  351. package/dist/index.d.ts +362 -350
  352. package/dist/index.js +291 -259
  353. package/dist/intent.d.ts +2 -1
  354. package/dist/lcm/engine.d.ts +2 -1
  355. package/dist/lcm/engine.js +3 -3
  356. package/dist/lcm/index.d.ts +2 -1
  357. package/dist/lcm/index.js +8 -8
  358. package/dist/lcm/tools.d.ts +2 -1
  359. package/dist/lifecycle.d.ts +2 -1
  360. package/dist/live-connectors-runner.d.ts +2 -1
  361. package/dist/local-llm.d.ts +2 -1
  362. package/dist/local-llm.js +2 -2
  363. package/dist/local-model-endpoint.d.ts +2 -1
  364. package/dist/maintenance/memory-governance.d.ts +2 -1
  365. package/dist/maintenance/memory-governance.js +24 -23
  366. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  367. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +24 -23
  368. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  369. package/dist/maintenance/rebuild-memory-projection.js +26 -25
  370. package/dist/{maintenance-LbuS2rUA.d.ts → maintenance-D2mveyCd.d.ts} +3 -3
  371. package/dist/mcp-memory-inspector-app.d.ts +14 -10
  372. package/dist/mcp-read-only-tools.js +1 -1
  373. package/dist/memory-action-policy.d.ts +2 -1
  374. package/dist/memory-cache.d.ts +2 -1
  375. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  376. package/dist/memory-projection-store.d.ts +2 -1
  377. package/dist/memory-provenance.d.ts +2 -1
  378. package/dist/memory-worth-outcomes.d.ts +3 -2
  379. package/dist/models-json.d.ts +2 -1
  380. package/dist/namespaces/migrate.d.ts +4 -3
  381. package/dist/namespaces/migrate.js +40 -39
  382. package/dist/namespaces/principal.d.ts +2 -1
  383. package/dist/namespaces/search.d.ts +2 -1
  384. package/dist/namespaces/search.js +18 -18
  385. package/dist/namespaces/storage.d.ts +4 -3
  386. package/dist/namespaces/storage.js +23 -22
  387. package/dist/native-knowledge.d.ts +2 -1
  388. package/dist/offline-sync-impression-drain.d.ts +2 -1
  389. package/dist/offline-sync-impression-drain.js +11 -9
  390. package/dist/offline-sync.d.ts +29 -3
  391. package/dist/offline-sync.js +6 -2
  392. package/dist/operator-doctor-corpus.d.ts +2 -1
  393. package/dist/operator-doctor-corpus.js +45 -44
  394. package/dist/operator-doctor-replica.d.ts +2 -1
  395. package/dist/operator-doctor-replica.js +3 -3
  396. package/dist/operator-toolkit.d.ts +4 -3
  397. package/dist/operator-toolkit.js +59 -55
  398. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  399. package/dist/orchestration/maintenance.d.ts +5 -4
  400. package/dist/orchestration/maintenance.js +36 -33
  401. package/dist/{orchestrator-rHiWt32X.d.ts → orchestrator-DJYlwiUv.d.ts} +14 -7
  402. package/dist/orchestrator.d.ts +9 -8
  403. package/dist/orchestrator.js +201 -189
  404. package/dist/page-versioning.js +3 -3
  405. package/dist/patterns-cli.d.ts +2 -1
  406. package/dist/{pipeline-W_97O8BV.d.ts → pipeline-CNjY4wk3.d.ts} +1 -1
  407. package/dist/policy-runtime.d.ts +2 -1
  408. package/dist/policy-runtime.js +1 -1
  409. package/dist/proactive-contention.d.ts +2 -1
  410. package/dist/provenance.d.ts +2 -1
  411. package/dist/provenance.js +2 -2
  412. package/dist/{qmd-LWtMofAf.d.ts → qmd-C0UDZidt.d.ts} +9 -7
  413. package/dist/qmd-preflight.d.ts +5 -4
  414. package/dist/qmd-preflight.js +2 -2
  415. package/dist/qmd-recall-cache.d.ts +2 -1
  416. package/dist/qmd.d.ts +4 -3
  417. package/dist/qmd.js +5 -5
  418. package/dist/recall-concurrency-config.d.ts +2 -1
  419. package/dist/recall-disclosure-escalation.d.ts +2 -1
  420. package/dist/recall-explain-renderer.d.ts +2 -1
  421. package/dist/recall-explain-renderer.js +3 -3
  422. package/dist/recall-memory-map.d.ts +2 -1
  423. package/dist/recall-planner-llm.d.ts +2 -1
  424. package/dist/recall-state.d.ts +2 -1
  425. package/dist/recall-tag-filter.d.ts +2 -1
  426. package/dist/recall-timings.d.ts +2 -1
  427. package/dist/recall-xray-cli.d.ts +2 -1
  428. package/dist/recall-xray-cli.js +4 -4
  429. package/dist/recall-xray-renderer.d.ts +2 -1
  430. package/dist/recall-xray-renderer.js +3 -3
  431. package/dist/recall-xray.d.ts +8 -1
  432. package/dist/recall-xray.js +2 -2
  433. package/dist/reconcile/cursor.d.ts +12 -2
  434. package/dist/reconcile/cursor.js +46 -7
  435. package/dist/reconcile/cursor.js.map +1 -1
  436. package/dist/reconcile/manifest.d.ts +9 -2
  437. package/dist/reconcile/manifest.js +15 -268
  438. package/dist/reconcile/manifest.js.map +1 -1
  439. package/dist/reconcile/plan.d.ts +4 -1
  440. package/dist/reconcile/plan.js +4 -4
  441. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  442. package/dist/replay/normalizers/claude.d.ts +2 -1
  443. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  444. package/dist/replay/normalizers/shared.d.ts +2 -1
  445. package/dist/replay/runner.d.ts +2 -1
  446. package/dist/replay/types.d.ts +2 -1
  447. package/dist/replica-divergence.d.ts +2 -1
  448. package/dist/replica-divergence.js +2 -2
  449. package/dist/replica-peers-config.d.ts +2 -1
  450. package/dist/resolve-auth-token.d.ts +2 -1
  451. package/dist/resume-bundles.js +12 -10
  452. package/dist/retrieval-agents.d.ts +4 -3
  453. package/dist/retrieval-agents.js +2 -2
  454. package/dist/retrieval-tiers.d.ts +2 -1
  455. package/dist/routing/engine.d.ts +2 -1
  456. package/dist/routing/store.d.ts +2 -1
  457. package/dist/salvage-envelope.d.ts +2 -1
  458. package/dist/schemas.d.ts +32 -32
  459. package/dist/{scope-profiles-BiQKOE-p.d.ts → scope-profiles-BJzp2F5A.d.ts} +1 -1
  460. package/dist/search/embed-helper.d.ts +2 -1
  461. package/dist/search/embed-helper.js +3 -3
  462. package/dist/search/factory.d.ts +4 -2
  463. package/dist/search/factory.js +20 -18
  464. package/dist/search/index.d.ts +2 -1
  465. package/dist/search/index.js +22 -22
  466. package/dist/search/lancedb-backend.d.ts +2 -1
  467. package/dist/search/lancedb-backend.js +4 -4
  468. package/dist/search/meilisearch-backend.d.ts +2 -1
  469. package/dist/search/meilisearch-backend.js +4 -4
  470. package/dist/search/noop-backend.d.ts +2 -1
  471. package/dist/search/orama-backend.d.ts +2 -1
  472. package/dist/search/orama-backend.js +4 -4
  473. package/dist/search/port.d.ts +18 -1
  474. package/dist/search/port.js +1 -1
  475. package/dist/search/remote-backend.d.ts +2 -1
  476. package/dist/search/remote-backend.js +2 -2
  477. package/dist/secure-store/index.js +2 -2
  478. package/dist/{semantic-consolidation-dHYCyqgh.d.ts → semantic-consolidation-D4KAZO2G.d.ts} +1 -1
  479. package/dist/semantic-consolidation.d.ts +3 -2
  480. package/dist/semantic-consolidation.js +25 -24
  481. package/dist/semantic-rule-promotion.js +23 -22
  482. package/dist/semantic-rule-verifier.d.ts +2 -1
  483. package/dist/semantic-rule-verifier.js +24 -23
  484. package/dist/{service-DJG3KCQ4.d.ts → service-BeDxSqE-.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/shared-context/manager.js +2 -2
  489. package/dist/signal.d.ts +2 -1
  490. package/dist/source-agent-qualifier.d.ts +2 -1
  491. package/dist/source-agent-qualifier.js +42 -40
  492. package/dist/{storage-F9FVh-w9.d.ts → storage-DfjxusTE.d.ts} +24 -12
  493. package/dist/storage.d.ts +3 -2
  494. package/dist/storage.js +25 -24
  495. package/dist/summarizer.d.ts +2 -1
  496. package/dist/summarizer.js +5 -5
  497. package/dist/summary-snapshot.d.ts +2 -1
  498. package/dist/temporal-supersession.d.ts +3 -2
  499. package/dist/temporal-timeline-recall.d.ts +2 -1
  500. package/dist/temporal-validity.d.ts +2 -1
  501. package/dist/threading.d.ts +2 -1
  502. package/dist/tier-migration.d.ts +3 -2
  503. package/dist/tier-routing.d.ts +2 -1
  504. package/dist/tool-scoped-memory.d.ts +5 -1
  505. package/dist/tool-scoped-memory.js +3 -1
  506. package/dist/topics.d.ts +2 -1
  507. package/dist/transcript.d.ts +2 -1
  508. package/dist/transfer/capsule-import.js +4 -4
  509. package/dist/transfer/types.d.ts +12 -12
  510. package/dist/trust-score-stage.d.ts +2 -1
  511. package/dist/trust-score.d.ts +2 -1
  512. package/dist/{types-rEwubvim.d.ts → types-yX_FwERf.d.ts} +8 -1
  513. package/dist/types.d.ts +2 -1
  514. package/dist/types.js +1 -1
  515. package/dist/utility-runtime.d.ts +2 -1
  516. package/dist/verified-recall.js +24 -23
  517. package/dist/write-envelope.d.ts +2 -1
  518. package/package.json +2 -2
  519. package/src/abort-error.ts +17 -0
  520. package/src/access-admin-ops-surface.ts +1 -0
  521. package/src/access-boundary.ts +1 -0
  522. package/src/access-coding-context-resolution.ts +42 -0
  523. package/src/access-extraction-force-flush.ts +38 -2
  524. package/src/access-http-lcm-compaction.ts +5 -2
  525. package/src/access-http-offline-stream.ts +79 -0
  526. package/src/access-http.test.ts +310 -3
  527. package/src/access-http.ts +85 -21
  528. package/src/access-mcp-output-schemas.ts +36 -0
  529. package/src/access-mcp.test.ts +95 -1
  530. package/src/access-mcp.ts +7 -9
  531. package/src/access-observe-helpers.ts +64 -22
  532. package/src/access-observe-write-surface.ts +8 -0
  533. package/src/access-offline-manifest.ts +54 -0
  534. package/src/access-operations-batch.ts +3 -3
  535. package/src/access-operations.ts +13 -7
  536. package/src/access-recall-concurrency.ts +3 -27
  537. package/src/access-recall-surface.ts +3 -0
  538. package/src/access-service-health.test.ts +32 -7
  539. package/src/access-service-namespace.test.ts +55 -0
  540. package/src/access-service-observe-idempotency.test.ts +34 -2
  541. package/src/access-service-observe-lcm-parity.test.ts +138 -3
  542. package/src/access-service-observe-scope.test.ts +160 -1
  543. package/src/access-service-offline-file-content.test.ts +345 -1
  544. package/src/access-service.ts +86 -59
  545. package/src/access-surface-catalog.ts +4 -0
  546. package/src/admin/admin-surfaces.ts +2 -0
  547. package/src/binary-lifecycle/pipeline.test.ts +106 -1
  548. package/src/binary-lifecycle/pipeline.ts +3 -0
  549. package/src/coding/git-context.test.ts +47 -0
  550. package/src/coding/git-context.ts +129 -27
  551. package/src/config.test.ts +24 -0
  552. package/src/config.ts +9 -12
  553. package/src/connector-provenance.test.ts +101 -0
  554. package/src/consolidation-undo.ts +3 -0
  555. package/src/convergence-refresh.ts +14 -2
  556. package/src/correction/correction-access-wiring.ts +9 -7
  557. package/src/correction/correction-executor.test.ts +206 -2
  558. package/src/correction/correction-executor.ts +29 -20
  559. package/src/correction/correction-planner.test.ts +36 -0
  560. package/src/correction/correction-planner.ts +9 -15
  561. package/src/correction/correction-service.ts +3 -1
  562. package/src/correction/correction-storage-integration.test.ts +77 -0
  563. package/src/correction/correction-surfaces.test.ts +41 -28
  564. package/src/correction/passive-capture.test.ts +59 -0
  565. package/src/correction/passive-capture.ts +4 -1
  566. package/src/entity-retrieval-boundaries.ts +17 -4
  567. package/src/entity-retrieval.ts +27 -6
  568. package/src/external-wiki-access.test.ts +65 -0
  569. package/src/external-wiki-access.ts +31 -0
  570. package/src/external-wiki-cli.ts +92 -0
  571. package/src/external-wiki-collection-registration.test.ts +163 -0
  572. package/src/external-wiki-collection-registration.ts +101 -0
  573. package/src/external-wiki-collection.test.ts +502 -0
  574. package/src/external-wiki-collection.ts +503 -0
  575. package/src/external-wiki-config.test.ts +135 -0
  576. package/src/external-wiki-config.ts +100 -0
  577. package/src/external-wiki-guard.ts +83 -0
  578. package/src/external-wiki-mcp-tools.ts +23 -0
  579. package/src/external-wiki-search.test.ts +301 -0
  580. package/src/external-wiki-search.ts +362 -0
  581. package/src/external-wiki.test.ts +240 -0
  582. package/src/external-wiki.ts +453 -0
  583. package/src/extraction-scope-source-agent.test.ts +21 -0
  584. package/src/extraction-source-grounding-helpers.ts +243 -53
  585. package/src/extraction-source-grounding-rules.ts +133 -39
  586. package/src/extraction-source-grounding.test.ts +363 -33
  587. package/src/extraction-timeout.test.ts +1 -0
  588. package/src/extraction-watermark.test.ts +150 -7
  589. package/src/extraction.ts +8 -1
  590. package/src/index.ts +8 -0
  591. package/src/mcp-read-only-tools.ts +1 -0
  592. package/src/offline-sync.test.ts +194 -0
  593. package/src/offline-sync.ts +217 -13
  594. package/src/orchestration/external-wiki-recall-guard.test.ts +94 -0
  595. package/src/orchestration/extraction-persist.ts +19 -2
  596. package/src/orchestration/extraction-run-helpers.ts +37 -19
  597. package/src/orchestration/extraction-run.test.ts +171 -2
  598. package/src/orchestration/extraction-run.ts +11 -13
  599. package/src/orchestration/extraction-watermark.ts +106 -17
  600. package/src/orchestration/generic-recall-paths.ts +14 -0
  601. package/src/orchestration/orchestrator-helpers.ts +2 -0
  602. package/src/orchestration/orchestrator-init.ts +9 -0
  603. package/src/orchestration/recall-internal-deps.ts +6 -0
  604. package/src/orchestration/recall-internal.ts +154 -33
  605. package/src/orchestration/recall-rerank-coordinator.ts +60 -25
  606. package/src/orchestration/recall-search-pipeline.test.ts +75 -1
  607. package/src/orchestration/recall-search-pipeline.ts +50 -10
  608. package/src/orchestrator-convergence-refresh.test.ts +36 -2
  609. package/src/orchestrator.ts +13 -3
  610. package/src/page-versioning.ts +5 -19
  611. package/src/procedural/procedure-recall.ts +5 -1
  612. package/src/provenance-surfaces.test.ts +3 -0
  613. package/src/qmd-client.test.ts +78 -17
  614. package/src/qmd.test.ts +24 -0
  615. package/src/qmd.ts +224 -315
  616. package/src/recall-explain-renderer.ts +3 -0
  617. package/src/recall-rerank-coordinator.test.ts +61 -0
  618. package/src/recall-xray-renderer.test.ts +6 -0
  619. package/src/recall-xray.test.ts +88 -1
  620. package/src/recall-xray.ts +15 -0
  621. package/src/reconcile/cursor.test.ts +48 -0
  622. package/src/reconcile/cursor.ts +58 -11
  623. package/src/reconcile/manifest.test.ts +4 -0
  624. package/src/reconcile/manifest.ts +41 -51
  625. package/src/reconcile/plan.test.ts +4 -0
  626. package/src/reconcile/plan.ts +28 -16
  627. package/src/search/factory.ts +6 -6
  628. package/src/search/port.ts +25 -9
  629. package/src/secure-store/secure-fs.ts +20 -12
  630. package/src/secure-store/secure-store.test.ts +41 -2
  631. package/src/spaces/index.test.ts +61 -2
  632. package/src/spaces/index.ts +44 -18
  633. package/src/storage/entity-alias-config.ts +97 -0
  634. package/src/storage/entity-canonical-id-lock.ts +53 -23
  635. package/src/storage/entity-canonical-id-migration.ts +53 -22
  636. package/src/storage/entity-canonical-id-references.ts +3 -0
  637. package/src/storage/entity-id-safety.ts +7 -0
  638. package/src/storage/entity-store.ts +6 -2
  639. package/src/storage/memory-frontmatter-metadata.ts +4 -9
  640. package/src/storage/memory-migration-serialization.ts +10 -15
  641. package/src/storage/tombstone-blocked-capture-mutation.ts +52 -64
  642. package/src/storage/tombstone-blocked-capture-sync.ts +244 -199
  643. package/src/storage-deletion-revisions.test.ts +91 -0
  644. package/src/storage-fact-hash-index-defer.test.ts +446 -163
  645. package/src/storage.ts +534 -245
  646. package/src/tool-scoped-memory.ts +10 -0
  647. package/src/transfer/capsule-import.ts +13 -0
  648. package/src/transfer/capsule-merge.ts +13 -0
  649. package/src/trust-score-recall-paths.test.ts +75 -1
  650. package/src/types.ts +7 -3
  651. package/dist/capsule-merge-IDWJPCWK.js.map +0 -1
  652. package/dist/chunk-3CE77VAP.js.map +0 -1
  653. package/dist/chunk-3TBLDMJA.js.map +0 -1
  654. package/dist/chunk-4J7G5SY4.js.map +0 -1
  655. package/dist/chunk-57QKLRBV.js.map +0 -1
  656. package/dist/chunk-5TFP4CUL.js.map +0 -1
  657. package/dist/chunk-7XC2HX75.js.map +0 -1
  658. package/dist/chunk-A5OJCXZL.js.map +0 -1
  659. package/dist/chunk-BUE5E2HL.js.map +0 -1
  660. package/dist/chunk-CJ2ZR7UA.js.map +0 -1
  661. package/dist/chunk-CUM2BBPN.js.map +0 -1
  662. package/dist/chunk-D3J5SLQK.js.map +0 -1
  663. package/dist/chunk-DL7ZD3JH.js.map +0 -1
  664. package/dist/chunk-DLVPUX7U.js.map +0 -1
  665. package/dist/chunk-E6PNLPGJ.js.map +0 -1
  666. package/dist/chunk-ECK75GDJ.js.map +0 -1
  667. package/dist/chunk-HREE4JHI.js.map +0 -1
  668. package/dist/chunk-HZFHQ4AQ.js.map +0 -1
  669. package/dist/chunk-IKKWIPYN.js.map +0 -1
  670. package/dist/chunk-J7VGGECD.js.map +0 -1
  671. package/dist/chunk-N5Z4EVOR.js.map +0 -1
  672. package/dist/chunk-NVRYW264.js.map +0 -1
  673. package/dist/chunk-P2BM76KT.js.map +0 -1
  674. package/dist/chunk-PVGDJXVK.js +0 -21
  675. package/dist/chunk-QJAQNXWI.js.map +0 -1
  676. package/dist/chunk-RN7DY3FC.js.map +0 -1
  677. package/dist/chunk-RVLJEII5.js.map +0 -1
  678. package/dist/chunk-S2NCTZGJ.js.map +0 -1
  679. package/dist/chunk-TDHTVMPG.js.map +0 -1
  680. package/dist/chunk-UYLMNVY6.js.map +0 -1
  681. package/dist/chunk-VCD4PSK2.js.map +0 -1
  682. package/dist/chunk-VNA7W7QF.js.map +0 -1
  683. package/dist/chunk-VWAXN2BN.js.map +0 -1
  684. package/dist/chunk-WOCNN776.js.map +0 -1
  685. package/dist/chunk-XYTOI63Z.js.map +0 -1
  686. package/dist/chunk-YV32N67O.js.map +0 -1
  687. /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
  688. /package/dist/{chunk-VUPTKTDV.js.map → chunk-2MRHJNWL.js.map} +0 -0
  689. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  690. /package/dist/{chunk-5IVLTFOV.js.map → chunk-44N6ESJ4.js.map} +0 -0
  691. /package/dist/{chunk-HO3QBJEY.js.map → chunk-5546W5SI.js.map} +0 -0
  692. /package/dist/{chunk-U7GW7NE7.js.map → chunk-5CEECY6P.js.map} +0 -0
  693. /package/dist/{chunk-4UH4BTGK.js.map → chunk-5SNZSWWR.js.map} +0 -0
  694. /package/dist/{chunk-6CZPDBJS.js.map → chunk-5U7ID3EZ.js.map} +0 -0
  695. /package/dist/{chunk-GF22HWS2.js.map → chunk-6NNNURLK.js.map} +0 -0
  696. /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
  697. /package/dist/{chunk-E5UK4VPE.js.map → chunk-7SHJHPTY.js.map} +0 -0
  698. /package/dist/{chunk-UVIKWC7M.js.map → chunk-7YERSTN7.js.map} +0 -0
  699. /package/dist/{chunk-S5SLVSVY.js.map → chunk-BQIFZ2MP.js.map} +0 -0
  700. /package/dist/{chunk-E53DSZEN.js.map → chunk-C26TE27X.js.map} +0 -0
  701. /package/dist/{chunk-LZ4LDKHZ.js.map → chunk-CLB32OHM.js.map} +0 -0
  702. /package/dist/{chunk-Q6IP2ARR.js.map → chunk-CSOYVTRX.js.map} +0 -0
  703. /package/dist/{chunk-XOQSEF7X.js.map → chunk-CVILPI77.js.map} +0 -0
  704. /package/dist/{chunk-PDLBLTOK.js.map → chunk-EITZHSX6.js.map} +0 -0
  705. /package/dist/{chunk-WUNIWKY4.js.map → chunk-ELIL2A37.js.map} +0 -0
  706. /package/dist/{chunk-CINZGPSJ.js.map → chunk-GUMZC2BO.js.map} +0 -0
  707. /package/dist/{chunk-H24WNPA2.js.map → chunk-GWFSVJ4P.js.map} +0 -0
  708. /package/dist/{chunk-TSH56VPU.js.map → chunk-HAYSYUAB.js.map} +0 -0
  709. /package/dist/{chunk-PKNLM44P.js.map → chunk-JH6BPLOP.js.map} +0 -0
  710. /package/dist/{chunk-KXB4VXHY.js.map → chunk-JIYDRBVZ.js.map} +0 -0
  711. /package/dist/{chunk-AV5ZEH4M.js.map → chunk-KVJRXN2E.js.map} +0 -0
  712. /package/dist/{chunk-JVLCVFQ4.js.map → chunk-KXEFRMCF.js.map} +0 -0
  713. /package/dist/{chunk-WFTIGIIS.js.map → chunk-L6CQ7WIW.js.map} +0 -0
  714. /package/dist/{chunk-EJUEXZHX.js.map → chunk-LLJMAULE.js.map} +0 -0
  715. /package/dist/{chunk-AS7YMSL6.js.map → chunk-M23RF3LJ.js.map} +0 -0
  716. /package/dist/{chunk-3F2LKUMU.js.map → chunk-NIS256NW.js.map} +0 -0
  717. /package/dist/{chunk-YIAA2X3D.js.map → chunk-NK5RGJ65.js.map} +0 -0
  718. /package/dist/{chunk-OQ5PRDDS.js.map → chunk-NTOIP2E6.js.map} +0 -0
  719. /package/dist/{chunk-HLPD7B7P.js.map → chunk-NUEQKLNB.js.map} +0 -0
  720. /package/dist/{chunk-33PLLLL7.js.map → chunk-P7NGM24P.js.map} +0 -0
  721. /package/dist/{chunk-7TWUCYER.js.map → chunk-PNRA7FAD.js.map} +0 -0
  722. /package/dist/{chunk-5I4M26Q7.js.map → chunk-QBSFOKY6.js.map} +0 -0
  723. /package/dist/{chunk-P4DRWEYC.js.map → chunk-QVSBTCVP.js.map} +0 -0
  724. /package/dist/{chunk-AAIUERNB.js.map → chunk-R5RFK3CB.js.map} +0 -0
  725. /package/dist/{chunk-WDISJRMG.js.map → chunk-RMMVQQA6.js.map} +0 -0
  726. /package/dist/{chunk-5SM35XZR.js.map → chunk-S5NZBKKQ.js.map} +0 -0
  727. /package/dist/{chunk-WIPEXG6R.js.map → chunk-SXIMQLGV.js.map} +0 -0
  728. /package/dist/{chunk-OAEQLRCY.js.map → chunk-TN76AKO3.js.map} +0 -0
  729. /package/dist/{chunk-QN25OCUF.js.map → chunk-TQ4GD737.js.map} +0 -0
  730. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  731. /package/dist/{chunk-DNWXFTLD.js.map → chunk-TYISDI6B.js.map} +0 -0
  732. /package/dist/{chunk-4LMA77JH.js.map → chunk-U2VLVBBH.js.map} +0 -0
  733. /package/dist/{chunk-5ZE7QHTK.js.map → chunk-ULVR5KG7.js.map} +0 -0
  734. /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
  735. /package/dist/{chunk-S2BBISHU.js.map → chunk-VANZKHTN.js.map} +0 -0
  736. /package/dist/{chunk-3Y224NYC.js.map → chunk-VYISFWVX.js.map} +0 -0
  737. /package/dist/{chunk-TIHMZFIV.js.map → chunk-W3IC7QOY.js.map} +0 -0
  738. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
  739. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
  740. /package/dist/{chunk-T2TTP3KU.js.map → chunk-X4IDNPOS.js.map} +0 -0
  741. /package/dist/{chunk-BLAKS3CP.js.map → chunk-XL3TATMJ.js.map} +0 -0
  742. /package/dist/{chunk-W4XJFLAL.js.map → chunk-XPRJSHNI.js.map} +0 -0
  743. /package/dist/{chunk-JE7EK33X.js.map → chunk-Y7HRYCNW.js.map} +0 -0
  744. /package/dist/{chunk-E6EE5B67.js.map → chunk-YK6BDDHP.js.map} +0 -0
  745. /package/dist/{chunk-ES36HTSC.js.map → chunk-YLHM5BQQ.js.map} +0 -0
  746. /package/dist/{chunk-BJKPPZ6Z.js.map → chunk-ZFGZ6PZ2.js.map} +0 -0
  747. /package/dist/{chunk-64UDOIMI.js.map → chunk-ZLQ37WJX.js.map} +0 -0
@@ -16,7 +16,10 @@ import {
16
16
  buildOfflineSyncSnapshotForPaths,
17
17
  compileOfflineSyncExcludeGlobs,
18
18
  globToRegExp,
19
+ isInternalRemnicStatePath,
19
20
  OFFLINE_SYNC_MAX_MTIME_MS,
21
+ normalizeOfflineSyncSnapshot,
22
+ OFFLINE_SYNC_SNAPSHOT_FORMAT,
20
23
  readOfflineSyncFileContentChunk,
21
24
  shouldPreferIncomingOfflineRuntimeFile,
22
25
  summarizeOfflineSyncPendingChanges,
@@ -106,6 +109,197 @@ test("offline snapshot captures source-of-truth files and excludes private/inter
106
109
  await rm(root, { recursive: true, force: true });
107
110
  }
108
111
  });
112
+ test("offline snapshots preserve actual deletion revisions and never use capture time", async () => {
113
+ const root = await tempDir("remnic-offline-deletion-census");
114
+ try {
115
+ const deletion = { path: "facts/deleted.md", mtimeMs: 2000 };
116
+ const snapshot = await buildOfflineSyncSnapshot({
117
+ root,
118
+ sourceId: "local",
119
+ now: new Date(4000),
120
+ deletions: [deletion],
121
+ });
122
+ assert.deepEqual(snapshot.deletions, [deletion]);
123
+ assert.equal(snapshot.createdAt, new Date(4000).toISOString());
124
+
125
+ await write(root, deletion.path, "recreated");
126
+ const recreated = await buildOfflineSyncSnapshot({
127
+ root,
128
+ sourceId: "local",
129
+ now: new Date(5000),
130
+ deletions: [deletion],
131
+ });
132
+ assert.deepEqual(recreated.deletions, []);
133
+
134
+ const legacy = normalizeOfflineSyncSnapshot({
135
+ format: "remnic.offline-sync.snapshot.v1",
136
+ schemaVersion: 1,
137
+ createdAt: new Date(6000).toISOString(),
138
+ sourceId: "legacy",
139
+ includeTranscripts: false,
140
+ files: [],
141
+ });
142
+ assert.equal(legacy.deletions, undefined);
143
+ } finally {
144
+ await rm(root, { recursive: true, force: true });
145
+ }
146
+ });
147
+
148
+ test("offline delete changes propagate the originating deletion revision", async () => {
149
+ const root = await tempDir("remnic-offline-delete-revision");
150
+ try {
151
+ const relativePath = "facts/deleted.md";
152
+ const content = Buffer.from("delete me");
153
+ const sha256 = createHash("sha256").update(content).digest("hex");
154
+ await write(root, relativePath, content);
155
+ let receivedMtimeMs: number | undefined;
156
+
157
+ const result = await applyOfflineSyncChangeset({
158
+ root,
159
+ currentFiles: [{ path: relativePath, sha256, bytes: content.length, mtimeMs: 1000 }],
160
+ changeset: {
161
+ format: "remnic.offline-sync.changeset.v1",
162
+ schemaVersion: 1,
163
+ createdAt: new Date(4000).toISOString(),
164
+ sourceId: "peer",
165
+ includeTranscripts: false,
166
+ changes: [{ type: "delete", path: relativePath, baseSha256: sha256, mtimeMs: 2000 }],
167
+ },
168
+ deleteFile: async ({ filePath, mtimeMs }) => {
169
+ receivedMtimeMs = mtimeMs;
170
+ await rm(filePath);
171
+ },
172
+ });
173
+
174
+ assert.equal(result.appliedDeletes, 1);
175
+ assert.equal(receivedMtimeMs, 2000);
176
+ } finally {
177
+ await rm(root, { recursive: true, force: true });
178
+ }
179
+ });
180
+
181
+ test("offline apply relays known deletion metadata when the target is already absent", async () => {
182
+ const root = await tempDir("remnic-offline-delete-relay");
183
+ try {
184
+ const relativePath = "facts/deleted.md";
185
+ const sha256 = "a".repeat(64);
186
+ let receivedRevision: { path: string; mtimeMs: number } | undefined;
187
+
188
+ const result = await applyOfflineSyncChangeset({
189
+ root,
190
+ currentFiles: [],
191
+ changeset: {
192
+ format: "remnic.offline-sync.changeset.v1",
193
+ schemaVersion: 1,
194
+ createdAt: new Date(4000).toISOString(),
195
+ sourceId: "peer",
196
+ includeTranscripts: false,
197
+ changes: [{ type: "delete", path: relativePath, baseSha256: sha256, mtimeMs: 2000 }],
198
+ },
199
+ recordDeletionRevision: async ({ path, mtimeMs }) => {
200
+ receivedRevision = { path, mtimeMs };
201
+ },
202
+ });
203
+
204
+ assert.equal(result.skipped, 1);
205
+ assert.deepEqual(receivedRevision, { path: relativePath, mtimeMs: 2000 });
206
+ } finally {
207
+ await rm(root, { recursive: true, force: true });
208
+ }
209
+ });
210
+
211
+
212
+ test("offline sync excludes the internal Remnic tree from snapshots and file transfer", async () => {
213
+ const root = await tempDir("remnic-offline-internal-state");
214
+ const internalPaths = [
215
+ ".remnic/state/converge-cursors/peer.json",
216
+ ".remnic/state/converge.lock",
217
+ ".remnic/state/converge.tmp-123",
218
+ ".remnic/state/conflicts/fact.remote",
219
+ ];
220
+ const corpusPath = "Facts/.remnic-notes/MixedCase.md";
221
+ try {
222
+ for (const relPath of internalPaths) await write(root, relPath, relPath);
223
+ await write(root, corpusPath, "corpus");
224
+
225
+ assert.equal(isInternalRemnicStatePath(".remnic"), true);
226
+ assert.equal(isInternalRemnicStatePath(internalPaths[0]!), true);
227
+ assert.equal(isInternalRemnicStatePath(".Remnic/state/cursor.json"), false);
228
+ assert.equal(isInternalRemnicStatePath("facts/.remnic/note.md"), true);
229
+ assert.equal(isInternalRemnicStatePath("facts\\.remnic\\note.md"), true);
230
+
231
+ const snapshot = await buildOfflineSyncSnapshot({
232
+ root,
233
+ sourceId: "local",
234
+ includeContent: false,
235
+ });
236
+ assert.deepEqual(snapshot.files.map((file) => file.path), [corpusPath]);
237
+
238
+ await assert.rejects(
239
+ () => buildOfflineSyncSnapshotForPaths({
240
+ root,
241
+ sourceId: "local",
242
+ paths: [internalPaths[0]!],
243
+ }),
244
+ /offline sync snapshot path is excluded/,
245
+ );
246
+ await assert.rejects(
247
+ () => readOfflineSyncFileContentChunk({
248
+ root,
249
+ path: internalPaths[0]!,
250
+ }),
251
+ /offline sync file content path is excluded/,
252
+ );
253
+
254
+ const cursorContent = Buffer.from(internalPaths[0]!);
255
+ await assert.rejects(
256
+ () => applyOfflineSyncFileContentChunk({
257
+ root,
258
+ sourceId: "peer",
259
+ path: internalPaths[0]!,
260
+ sha256: createHash("sha256").update(cursorContent).digest("hex"),
261
+ bytes: cursorContent.length,
262
+ mtimeMs: Date.now(),
263
+ offset: 0,
264
+ content: cursorContent,
265
+ }),
266
+ /offline sync file content path is excluded/,
267
+ );
268
+ const writes: string[] = [];
269
+ const applyResult = await applyOfflineSyncSnapshot({
270
+ root,
271
+ snapshot: {
272
+ format: OFFLINE_SYNC_SNAPSHOT_FORMAT,
273
+ schemaVersion: 1,
274
+ createdAt: new Date().toISOString(),
275
+ sourceId: "peer",
276
+ includeTranscripts: true,
277
+ files: [{
278
+ path: internalPaths[0]!,
279
+ sha256: createHash("sha256").update(cursorContent).digest("hex"),
280
+ bytes: cursorContent.length,
281
+ mtimeMs: Date.now(),
282
+ contentBase64: cursorContent.toString("base64"),
283
+ }],
284
+ },
285
+ baseFiles: [],
286
+ currentFiles: [],
287
+ writeFile: async ({ path: relPath }) => {
288
+ writes.push(relPath);
289
+ },
290
+ deleteFile: async ({ path: relPath }) => {
291
+ writes.push(relPath);
292
+ },
293
+ });
294
+ assert.deepEqual(writes, []);
295
+ assert.equal(applyResult.upserted, 0);
296
+ assert.equal(applyResult.deleted, 0);
297
+
298
+ assert.equal(await readUtf8(root, internalPaths[0]!), internalPaths[0]);
299
+ } finally {
300
+ await rm(root, { recursive: true, force: true });
301
+ }
302
+ });
109
303
 
110
304
  test("offline snapshot abort signal stops filesystem snapshot work", async () => {
111
305
  const root = await tempDir("remnic-offline-snapshot-abort");
@@ -54,6 +54,11 @@ export interface OfflineSyncFileDigest {
54
54
  bytes: number;
55
55
  }
56
56
 
57
+ export interface OfflineSyncDeletionRevision {
58
+ path: string;
59
+ mtimeMs: number;
60
+ }
61
+
57
62
  export interface OfflineSyncSnapshot {
58
63
  format: typeof OFFLINE_SYNC_SNAPSHOT_FORMAT;
59
64
  schemaVersion: 1;
@@ -61,6 +66,7 @@ export interface OfflineSyncSnapshot {
61
66
  sourceId: string;
62
67
  includeTranscripts: boolean;
63
68
  files: OfflineSyncFileRecord[];
69
+ deletions?: OfflineSyncDeletionRevision[];
64
70
  }
65
71
 
66
72
  export type OfflineSyncChange =
@@ -74,6 +80,7 @@ export type OfflineSyncChange =
74
80
  type: "delete";
75
81
  path: string;
76
82
  baseSha256: string;
83
+ mtimeMs?: number;
77
84
  };
78
85
 
79
86
  export interface OfflineSyncChangeset {
@@ -140,6 +147,14 @@ export interface OfflineSyncFileTarget {
140
147
  filePath: string;
141
148
  }
142
149
 
150
+ export interface OfflineSyncFileDeleteTarget extends OfflineSyncFileTarget {
151
+ mtimeMs?: number;
152
+ }
153
+
154
+ export type OfflineSyncRecordDeletionRevision = (
155
+ target: OfflineSyncFileDeleteTarget & { mtimeMs: number },
156
+ ) => Promise<void>;
157
+
143
158
  export interface OfflineSyncFileWriteTarget extends OfflineSyncFileTarget {
144
159
  content: Buffer;
145
160
  }
@@ -360,6 +375,88 @@ function normalizeFileStates(input: readonly unknown[] | undefined): OfflineSync
360
375
  return input.map((entry, index) => normalizeFileState(entry, `baseFiles[${index}]`));
361
376
  }
362
377
 
378
+ function normalizeDeletionRevisions(
379
+ input: unknown,
380
+ fieldPrefix: string,
381
+ ): OfflineSyncDeletionRevision[] | undefined {
382
+ if (input === undefined) return undefined;
383
+ if (!Array.isArray(input)) {
384
+ throw new Error(`${fieldPrefix} must be an array`);
385
+ }
386
+ const deletions = input.map((entry, index): OfflineSyncDeletionRevision => {
387
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
388
+ throw new Error(`${fieldPrefix}[${index}] must be an object`);
389
+ }
390
+ const obj = entry as Record<string, unknown>;
391
+ return {
392
+ path: normalizeRelativePath(obj.path, `${fieldPrefix}[${index}].path`),
393
+ mtimeMs: assertOfflineSyncMtimeMs(obj.mtimeMs, `${fieldPrefix}[${index}].mtimeMs`),
394
+ };
395
+ });
396
+ assertUniquePaths(deletions, fieldPrefix);
397
+ return deletions.sort(compareByPath);
398
+ }
399
+
400
+ function snapshotBuilderDeletions(options: {
401
+ deletions?: readonly OfflineSyncDeletionRevision[];
402
+ files: readonly OfflineSyncFileState[];
403
+ paths?: readonly string[];
404
+ includeTranscripts: boolean;
405
+ excludeNodeLocalState?: boolean;
406
+ userExcludeRegexps?: readonly RegExp[];
407
+ }): OfflineSyncDeletionRevision[] | undefined {
408
+ const deletions = normalizeDeletionRevisions(options.deletions, "deletions");
409
+ if (deletions === undefined) return undefined;
410
+ if (deletions.length === 0) return deletions;
411
+ const presentPaths = new Set(options.files.map((file) => file.path.toLowerCase()));
412
+ const scopedPaths = options.paths
413
+ ? new Set(options.paths.map((relPath) => relPath.toLowerCase()))
414
+ : undefined;
415
+ return deletions.filter((deletion) =>
416
+ (scopedPaths === undefined || scopedPaths.has(deletion.path.toLowerCase())) &&
417
+ !presentPaths.has(deletion.path.toLowerCase()) &&
418
+ !(options.excludeNodeLocalState === false
419
+ ? shouldExcludeRelPath(deletion.path, options.includeTranscripts)
420
+ : shouldExcludePushRelPath(
421
+ deletion.path,
422
+ options.includeTranscripts,
423
+ options.userExcludeRegexps,
424
+ )));
425
+ }
426
+
427
+ export async function filterOfflineSyncDeletionRevisions(options: {
428
+ root: string;
429
+ deletions: readonly OfflineSyncDeletionRevision[];
430
+ includeTranscripts?: boolean;
431
+ userExcludeRegexps?: readonly RegExp[];
432
+ }): Promise<OfflineSyncDeletionRevision[]> {
433
+ const deletions = normalizeDeletionRevisions(options.deletions, "deletions");
434
+ if (deletions === undefined) throw new Error("deletions must be an array");
435
+ if (deletions.length === 0) return deletions;
436
+ const root = await prepareSafeArchiveRoot(
437
+ path.resolve(options.root),
438
+ "filterOfflineSyncDeletionRevisions",
439
+ "root",
440
+ );
441
+ const includeTranscripts = options.includeTranscripts !== false;
442
+ const filtered: OfflineSyncDeletionRevision[] = [];
443
+ for (const deletion of deletions) {
444
+ if (shouldExcludePushRelPath(deletion.path, includeTranscripts, options.userExcludeRegexps)) {
445
+ continue;
446
+ }
447
+ const filePath = path.join(root.abs, ...deletion.path.split("/"));
448
+ const present = await lstat(filePath).then(
449
+ () => true,
450
+ (error: unknown) => {
451
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return false;
452
+ throw error;
453
+ },
454
+ );
455
+ if (!present) filtered.push(deletion);
456
+ }
457
+ return filtered;
458
+ }
459
+
363
460
  export function normalizeOfflineSyncSnapshot(
364
461
  input: unknown,
365
462
  options: { requireContent?: boolean } = {},
@@ -385,16 +482,21 @@ export function normalizeOfflineSyncSnapshot(
385
482
  normalizeFileRecord(entry, `files[${index}]`, options.requireContent === true))
386
483
  .filter((file) => !shouldIgnoreIncomingRuntimePath(file.path))
387
484
  .sort(compareByPath);
388
- assertUniquePaths(files, "offline sync snapshot");
485
+ const deletions = normalizeDeletionRevisions(obj.deletions, "deletions")
486
+ ?.filter((deletion) => !shouldIgnoreIncomingRuntimePath(deletion.path));
487
+ const entries = deletions && deletions.length > 0 ? [...files, ...deletions] : files;
488
+ assertUniquePaths(entries, "offline sync snapshot");
389
489
  if (!includeTranscripts) {
390
- const transcriptPath = files.find((file) => file.path.split("/")[0] === "transcripts")?.path;
490
+ const transcriptPath = entries
491
+ .find((entry) => entry.path.split("/")[0] === "transcripts")?.path;
391
492
  if (transcriptPath) {
392
493
  throw new Error(
393
494
  `offline sync snapshot includeTranscripts is false but contains transcript path: ${transcriptPath}`,
394
495
  );
395
496
  }
396
497
  }
397
- const excludedPath = files.find((file) => shouldExcludeRelPath(file.path, true))?.path;
498
+ const excludedPath = entries
499
+ .find((entry) => shouldExcludeRelPath(entry.path, true))?.path;
398
500
  if (excludedPath) {
399
501
  throw new Error(`offline sync snapshot contains excluded path: ${excludedPath}`);
400
502
  }
@@ -405,6 +507,7 @@ export function normalizeOfflineSyncSnapshot(
405
507
  sourceId,
406
508
  includeTranscripts,
407
509
  files,
510
+ ...(deletions === undefined ? {} : { deletions }),
408
511
  };
409
512
  }
410
513
 
@@ -455,10 +558,14 @@ export function normalizeOfflineSyncChangeset(
455
558
  };
456
559
  }
457
560
  if (type === "delete") {
561
+ const mtimeMs = change.mtimeMs === undefined
562
+ ? undefined
563
+ : assertOfflineSyncMtimeMs(change.mtimeMs, `changes[${index}].mtimeMs`);
458
564
  return {
459
565
  type: "delete",
460
566
  path: relPath,
461
567
  baseSha256: assertSha256(change.baseSha256, `changes[${index}].baseSha256`),
568
+ ...(mtimeMs === undefined ? {} : { mtimeMs }),
462
569
  };
463
570
  }
464
571
  throw new Error(`changes[${index}].type must be "upsert" or "delete"`);
@@ -515,7 +622,16 @@ function assertUniquePaths(entries: readonly { path: string }[], context: string
515
622
  }
516
623
  }
517
624
 
625
+ export function isInternalRemnicStatePath(relPosix: string): boolean {
626
+ const normalized = relPosix.includes("\\") ? relPosix.replaceAll("\\", "/") : relPosix;
627
+ return normalized === ".remnic"
628
+ || normalized.startsWith(".remnic/")
629
+ || normalized.endsWith("/.remnic")
630
+ || normalized.includes("/.remnic/");
631
+ }
632
+
518
633
  function shouldExcludeRelPath(relPosix: string, includeTranscripts: boolean): boolean {
634
+ if (isInternalRemnicStatePath(relPosix)) return true;
519
635
  const parts = relPosix.split("/");
520
636
  if (parts.some((part) => DEFAULT_TRANSFER_EXCLUDE_DIRS.has(part))) return true;
521
637
  if (parts.some((part) => part === SYNC_INTERNAL_DIR)) return true;
@@ -615,6 +731,7 @@ export function parseOfflineSyncExcludes(raw: unknown): string[] {
615
731
  }
616
732
 
617
733
  function shouldIgnoreIncomingRuntimePath(relPosix: string): boolean {
734
+ if (isInternalRemnicStatePath(relPosix)) return true;
618
735
  const parts = relPosix.split("/");
619
736
  const basename = parts[parts.length - 1] ?? "";
620
737
  return isCanonicalRuntimeStatePath(parts) && basename.includes(".tmp-");
@@ -826,6 +943,7 @@ export async function buildOfflineSyncSnapshot(options: {
826
943
  root: string;
827
944
  sourceId: string;
828
945
  includeContent?: boolean;
946
+ deletions?: readonly OfflineSyncDeletionRevision[];
829
947
  includeTranscripts?: boolean;
830
948
  now?: Date;
831
949
  readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
@@ -847,13 +965,22 @@ export async function buildOfflineSyncSnapshot(options: {
847
965
  for await (const file of iterateOfflineSyncSnapshotFileRecords(options)) files.push(file);
848
966
  throwIfOfflineSyncAborted(options.signal);
849
967
 
968
+ const sortedFiles = files.sort(compareByPath);
969
+ const deletions = snapshotBuilderDeletions({
970
+ deletions: options.deletions,
971
+ files: sortedFiles,
972
+ includeTranscripts,
973
+ excludeNodeLocalState: options.excludeNodeLocalState,
974
+ userExcludeRegexps: options.userExcludeRegexps,
975
+ });
850
976
  return {
851
977
  format: OFFLINE_SYNC_SNAPSHOT_FORMAT,
852
978
  schemaVersion: 1,
853
979
  createdAt: (options.now ?? new Date()).toISOString(),
854
980
  sourceId: normalizeSourceId(options.sourceId, "sourceId"),
855
981
  includeTranscripts,
856
- files: files.sort(compareByPath),
982
+ files: sortedFiles,
983
+ ...(deletions === undefined ? {} : { deletions }),
857
984
  };
858
985
  }
859
986
 
@@ -861,6 +988,7 @@ export async function buildOfflineSyncSnapshotFromBase(options: {
861
988
  root: string;
862
989
  sourceId: string;
863
990
  baseFiles?: readonly OfflineSyncFileState[];
991
+ deletions?: readonly OfflineSyncDeletionRevision[];
864
992
  baseCapturedAt?: Date;
865
993
  includeContent?: boolean;
866
994
  includeTranscripts?: boolean;
@@ -937,13 +1065,22 @@ export async function buildOfflineSyncSnapshotFromBase(options: {
937
1065
  await walk(root.abs);
938
1066
  throwIfOfflineSyncAborted(options.signal);
939
1067
 
1068
+ const sortedFiles = files.sort(compareByPath);
1069
+ const deletions = snapshotBuilderDeletions({
1070
+ deletions: options.deletions,
1071
+ files: sortedFiles,
1072
+ includeTranscripts,
1073
+ excludeNodeLocalState: options.excludeNodeLocalState,
1074
+ userExcludeRegexps: options.userExcludeRegexps,
1075
+ });
940
1076
  return {
941
1077
  format: OFFLINE_SYNC_SNAPSHOT_FORMAT,
942
1078
  schemaVersion: 1,
943
1079
  createdAt: (options.now ?? new Date()).toISOString(),
944
1080
  sourceId: normalizeSourceId(options.sourceId, "sourceId"),
945
1081
  includeTranscripts,
946
- files: files.sort(compareByPath),
1082
+ files: sortedFiles,
1083
+ ...(deletions === undefined ? {} : { deletions }),
947
1084
  };
948
1085
  }
949
1086
 
@@ -951,6 +1088,7 @@ export async function buildOfflineSyncSnapshotForPaths(options: {
951
1088
  root: string;
952
1089
  sourceId: string;
953
1090
  paths: readonly string[];
1091
+ deletions?: readonly OfflineSyncDeletionRevision[];
954
1092
  includeContent?: boolean;
955
1093
  includeTranscripts?: boolean;
956
1094
  now?: Date;
@@ -1004,13 +1142,23 @@ export async function buildOfflineSyncSnapshotForPaths(options: {
1004
1142
  }
1005
1143
  throwIfOfflineSyncAborted(options.signal);
1006
1144
 
1145
+ const sortedFiles = files.sort(compareByPath);
1146
+ const deletions = snapshotBuilderDeletions({
1147
+ deletions: options.deletions,
1148
+ files: sortedFiles,
1149
+ paths: [...seen],
1150
+ includeTranscripts,
1151
+ excludeNodeLocalState: options.excludeNodeLocalState,
1152
+ userExcludeRegexps: options.userExcludeRegexps,
1153
+ });
1007
1154
  return {
1008
1155
  format: OFFLINE_SYNC_SNAPSHOT_FORMAT,
1009
1156
  schemaVersion: 1,
1010
1157
  createdAt: (options.now ?? new Date()).toISOString(),
1011
1158
  sourceId: normalizeSourceId(options.sourceId, "sourceId"),
1012
1159
  includeTranscripts,
1013
- files: files.sort(compareByPath),
1160
+ files: sortedFiles,
1161
+ ...(deletions === undefined ? {} : { deletions }),
1014
1162
  };
1015
1163
  }
1016
1164
 
@@ -1106,6 +1254,7 @@ export async function buildOfflineSyncChangeset(options: {
1106
1254
  root: string;
1107
1255
  sourceId: string;
1108
1256
  baseFiles?: readonly OfflineSyncFileState[];
1257
+ deletions?: readonly OfflineSyncDeletionRevision[];
1109
1258
  baseCapturedAt?: Date;
1110
1259
  excludePaths?: readonly string[];
1111
1260
  includeTranscripts?: boolean;
@@ -1127,6 +1276,7 @@ export async function buildOfflineSyncChangeset(options: {
1127
1276
  root: options.root,
1128
1277
  sourceId: options.sourceId,
1129
1278
  baseFiles: options.baseFiles,
1279
+ deletions: options.deletions,
1130
1280
  baseCapturedAt: options.baseCapturedAt,
1131
1281
  includeContent: false,
1132
1282
  includeTranscripts,
@@ -1140,6 +1290,7 @@ export async function buildOfflineSyncChangeset(options: {
1140
1290
  sourceId: options.sourceId,
1141
1291
  baseFiles: options.baseFiles,
1142
1292
  currentFiles: current.files,
1293
+ deletions: current.deletions,
1143
1294
  excludePaths: options.excludePaths,
1144
1295
  includeTranscripts,
1145
1296
  now: options.now,
@@ -1153,6 +1304,7 @@ export async function buildOfflineSyncChangesetFromSnapshot(options: {
1153
1304
  sourceId: string;
1154
1305
  currentFiles: readonly OfflineSyncFileState[];
1155
1306
  baseFiles?: readonly OfflineSyncFileState[];
1307
+ deletions?: readonly OfflineSyncDeletionRevision[];
1156
1308
  excludePaths?: readonly string[];
1157
1309
  includeTranscripts?: boolean;
1158
1310
  now?: Date;
@@ -1179,6 +1331,10 @@ export async function buildOfflineSyncChangesetFromSnapshot(options: {
1179
1331
  normalizeFileStates(options.currentFiles),
1180
1332
  includeTranscripts,
1181
1333
  ));
1334
+ const deletions = normalizeDeletionRevisions(options.deletions, "deletions");
1335
+ const deletionMtimeByPath = deletions === undefined
1336
+ ? undefined
1337
+ : new Map(deletions.map((deletion) => [deletion.path, deletion.mtimeMs] as const));
1182
1338
  const changes: OfflineSyncChange[] = [];
1183
1339
 
1184
1340
  for (const relPath of unionPaths(base, currentMap)) {
@@ -1216,10 +1372,12 @@ export async function buildOfflineSyncChangesetFromSnapshot(options: {
1216
1372
  continue;
1217
1373
  }
1218
1374
  if (!currentEntry && baseEntry) {
1375
+ const mtimeMs = deletionMtimeByPath?.get(relPath);
1219
1376
  changes.push({
1220
1377
  type: "delete",
1221
1378
  path: relPath,
1222
1379
  baseSha256: baseEntry.sha256,
1380
+ ...(mtimeMs === undefined ? {} : { mtimeMs }),
1223
1381
  });
1224
1382
  }
1225
1383
  }
@@ -1343,7 +1501,8 @@ export async function applyOfflineSyncSnapshot(options: {
1343
1501
  readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
1344
1502
  readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;
1345
1503
  writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;
1346
- deleteFile?: (target: OfflineSyncFileTarget) => Promise<void>;
1504
+ deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;
1505
+ recordDeletionRevision?: OfflineSyncRecordDeletionRevision;
1347
1506
  }): Promise<OfflineSyncApplySnapshotResult> {
1348
1507
  const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);
1349
1508
  const baseMap = byPath(filterBaseFilesForMode(
@@ -1351,6 +1510,9 @@ export async function applyOfflineSyncSnapshot(options: {
1351
1510
  snapshot.includeTranscripts,
1352
1511
  ));
1353
1512
  const incomingMap = byPath(snapshot.files);
1513
+ const deletionMtimeByPath = snapshot.deletions === undefined
1514
+ ? undefined
1515
+ : new Map(snapshot.deletions.map((deletion) => [deletion.path, deletion.mtimeMs] as const));
1354
1516
  const incomingBuffers = verifyRecordContents(snapshot.files, "offline sync snapshot", {
1355
1517
  requireContent: false,
1356
1518
  });
@@ -1368,6 +1530,23 @@ export async function applyOfflineSyncSnapshot(options: {
1368
1530
  })).files;
1369
1531
  const currentMap = byPath(currentFiles);
1370
1532
  const deferredPaths = new Set(options.deferredPaths ?? []);
1533
+ if (deletionMtimeByPath && options.recordDeletionRevision) {
1534
+ for (const [relPath, mtimeMs] of deletionMtimeByPath) {
1535
+ if (
1536
+ currentMap.has(relPath) ||
1537
+ deferredPaths.has(relPath) ||
1538
+ matchesOfflineSyncDefaultExclude(relPath)
1539
+ ) {
1540
+ continue;
1541
+ }
1542
+ await options.recordDeletionRevision({
1543
+ root: root.abs,
1544
+ path: relPath,
1545
+ filePath: await resolveSafeArchiveTarget(root, relPath),
1546
+ mtimeMs,
1547
+ });
1548
+ }
1549
+ }
1371
1550
  const nextBase = new Map(baseMap);
1372
1551
  const conflicts: OfflineSyncConflict[] = [];
1373
1552
  let upserted = 0;
@@ -1490,7 +1669,12 @@ export async function applyOfflineSyncSnapshot(options: {
1490
1669
  shouldPreferIncomingOfflineRuntimeFile(relPath) &&
1491
1670
  (base || shouldDeleteAbsentIncomingOfflineRuntimeFile(relPath))
1492
1671
  ) {
1493
- await deleteSafeFile(root, relPath, options.deleteFile);
1672
+ await deleteSafeFile(
1673
+ root,
1674
+ relPath,
1675
+ options.deleteFile,
1676
+ deletionMtimeByPath?.get(relPath),
1677
+ );
1494
1678
  nextBase.delete(relPath);
1495
1679
  deleted += 1;
1496
1680
  continue;
@@ -1501,7 +1685,12 @@ export async function applyOfflineSyncSnapshot(options: {
1501
1685
  continue;
1502
1686
  }
1503
1687
  if (base && currentEntry.sha256 === base.sha256) {
1504
- await deleteSafeFile(root, relPath, options.deleteFile);
1688
+ await deleteSafeFile(
1689
+ root,
1690
+ relPath,
1691
+ options.deleteFile,
1692
+ deletionMtimeByPath?.get(relPath),
1693
+ );
1505
1694
  nextBase.delete(relPath);
1506
1695
  deleted += 1;
1507
1696
  continue;
@@ -1539,7 +1728,8 @@ export async function applyOfflineSyncChangeset(options: {
1539
1728
  readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;
1540
1729
  readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;
1541
1730
  writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;
1542
- deleteFile?: (target: OfflineSyncFileTarget) => Promise<void>;
1731
+ deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;
1732
+ recordDeletionRevision?: OfflineSyncRecordDeletionRevision;
1543
1733
  }): Promise<OfflineSyncApplyChangesetResult> {
1544
1734
  let changeset: OfflineSyncChangeset;
1545
1735
  try {
@@ -1630,11 +1820,19 @@ export async function applyOfflineSyncChangeset(options: {
1630
1820
  }
1631
1821
 
1632
1822
  if (!currentEntry) {
1823
+ if (change.mtimeMs !== undefined && options.recordDeletionRevision) {
1824
+ await options.recordDeletionRevision({
1825
+ root: root.abs,
1826
+ path: change.path,
1827
+ filePath: await resolveSafeArchiveTarget(root, change.path),
1828
+ mtimeMs: change.mtimeMs,
1829
+ });
1830
+ }
1633
1831
  skipped += 1;
1634
1832
  continue;
1635
1833
  }
1636
1834
  if (currentEntry.sha256 === change.baseSha256) {
1637
- await deleteSafeFile(root, change.path, options.deleteFile);
1835
+ await deleteSafeFile(root, change.path, options.deleteFile, change.mtimeMs);
1638
1836
  currentMap.delete(change.path);
1639
1837
  appliedDeletes += 1;
1640
1838
  continue;
@@ -2310,11 +2508,17 @@ async function writeOfflineUploadContent(options: {
2310
2508
  async function deleteSafeFile(
2311
2509
  root: SafeArchiveRoot,
2312
2510
  relPath: string,
2313
- deleteFile?: (target: OfflineSyncFileTarget) => Promise<void>,
2511
+ deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>,
2512
+ mtimeMs?: number,
2314
2513
  ): Promise<void> {
2315
2514
  const target = await resolveSafeArchiveTarget(root, relPath);
2316
2515
  if (deleteFile) {
2317
- await deleteFile({ root: root.abs, path: relPath, filePath: target });
2516
+ await deleteFile({
2517
+ root: root.abs,
2518
+ path: relPath,
2519
+ filePath: target,
2520
+ ...(mtimeMs === undefined ? {} : { mtimeMs }),
2521
+ });
2318
2522
  return;
2319
2523
  }
2320
2524
  await unlink(target).catch((error: unknown) => {