@remnic/core 9.63.6 → 9.63.7

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 (262) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +27 -25
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +28 -26
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +27 -25
  7. package/dist/access-cli.js +83 -81
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.js +27 -25
  11. package/dist/access-http-lcm-compaction.d.ts +1 -1
  12. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  13. package/dist/access-http-offline-stream.d.ts +1 -1
  14. package/dist/access-http-query.js +29 -27
  15. package/dist/access-http.d.ts +2 -2
  16. package/dist/access-http.js +43 -41
  17. package/dist/access-identity-continuity-surface.js +27 -25
  18. package/dist/access-lcm-surface.d.ts +1 -1
  19. package/dist/access-lcm-surface.js +27 -25
  20. package/dist/access-mcp.d.ts +1 -1
  21. package/dist/access-mcp.js +34 -32
  22. package/dist/access-namespace-preflight.js +27 -25
  23. package/dist/access-observe-write-surface.d.ts +1 -1
  24. package/dist/access-observe-write-surface.js +27 -25
  25. package/dist/access-offline-manifest.js +6 -5
  26. package/dist/access-operations-batch.js +29 -27
  27. package/dist/access-operations.d.ts +4 -4
  28. package/dist/access-operations.js +33 -31
  29. package/dist/access-recall-concurrency.d.ts +1 -1
  30. package/dist/access-recall-concurrency.js +27 -25
  31. package/dist/access-recall-response.d.ts +1 -1
  32. package/dist/access-recall-response.js +27 -25
  33. package/dist/access-recall-surface.d.ts +1 -1
  34. package/dist/access-recall-surface.js +27 -25
  35. package/dist/access-schema.d.ts +88 -88
  36. package/dist/access-schema.js +6 -5
  37. package/dist/access-service-helpers.d.ts +1 -1
  38. package/dist/access-service.d.ts +1 -1
  39. package/dist/access-service.js +27 -25
  40. package/dist/access-surface-catalog.d.ts +1 -1
  41. package/dist/access-surface-catalog.js +29 -27
  42. package/dist/access-surface-catalog.js.map +1 -1
  43. package/dist/active-recall.js +5 -3
  44. package/dist/active-recall.js.map +1 -1
  45. package/dist/adapters/index.js +4 -4
  46. package/dist/adapters/registry.js +2 -2
  47. package/dist/{auto-sync-BKRJDMKX.js → auto-sync-3SHMZVQS.js} +5 -3
  48. package/dist/{auto-sync-BKRJDMKX.js.map → auto-sync-3SHMZVQS.js.map} +1 -1
  49. package/dist/briefing.js +10 -10
  50. package/dist/calibration.d.ts +2 -1
  51. package/dist/calibration.js +7 -0
  52. package/dist/calibration.js.map +1 -1
  53. package/dist/causal-consolidation.js +11 -11
  54. package/dist/census-validation.d.ts +19 -0
  55. package/dist/census-validation.js +14 -0
  56. package/dist/census-validation.js.map +1 -0
  57. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  58. package/dist/{chunk-Z4N7SVVF.js → chunk-2L7DKNVE.js} +12 -7
  59. package/dist/chunk-2L7DKNVE.js.map +1 -0
  60. package/dist/{chunk-3Z5TGRFA.js → chunk-3NZAVWU5.js} +9 -9
  61. package/dist/{chunk-I5FLIB2J.js → chunk-3S3PNR5H.js} +2 -2
  62. package/dist/{chunk-R6UMNP5C.js → chunk-3T6HIIKA.js} +2 -2
  63. package/dist/{chunk-77QZW2D6.js → chunk-3TDAA7VA.js} +2 -2
  64. package/dist/{chunk-TWTUGCTY.js → chunk-3YTTAGPB.js} +6 -1
  65. package/dist/chunk-3YTTAGPB.js.map +1 -0
  66. package/dist/{chunk-DXDAQZ2K.js → chunk-42TIIO2M.js} +2 -2
  67. package/dist/{chunk-Y7COCXY2.js → chunk-4F67JJPG.js} +2 -2
  68. package/dist/{chunk-PB4WVYGC.js → chunk-5S5DUJFJ.js} +2 -2
  69. package/dist/{chunk-KYTRF64R.js → chunk-5SCFDQEJ.js} +2 -2
  70. package/dist/{chunk-GG4DN63W.js → chunk-62Y5AGCM.js} +2 -2
  71. package/dist/{chunk-KHCUVYCY.js → chunk-6UKSOXAO.js} +3 -3
  72. package/dist/{chunk-F6JYBVL6.js → chunk-7ZAC2C2U.js} +24 -24
  73. package/dist/{chunk-GF7RQWXC.js → chunk-AJRJDXYR.js} +2 -2
  74. package/dist/{chunk-YEQCMA5L.js → chunk-BOSIHHOH.js} +2 -2
  75. package/dist/{chunk-7LF2OHIJ.js → chunk-BRHKW7GY.js} +2 -2
  76. package/dist/{chunk-LX4TNSAE.js → chunk-CBY54QYW.js} +4 -4
  77. package/dist/chunk-FEHIOYML.js +168 -0
  78. package/dist/chunk-FEHIOYML.js.map +1 -0
  79. package/dist/{chunk-6YMEU6OQ.js → chunk-G72IPMR7.js} +2 -2
  80. package/dist/{chunk-7AF243WZ.js → chunk-GBVRVYF4.js} +1 -1
  81. package/dist/{chunk-GTD4Q62X.js → chunk-H4GQ2Y24.js} +3 -3
  82. package/dist/{chunk-QI5RDDEL.js → chunk-HXZNTZ3Y.js} +6 -6
  83. package/dist/{chunk-CIAI24TQ.js → chunk-IBZQQOM5.js} +3 -3
  84. package/dist/{chunk-RYST72N5.js → chunk-IINVXO3U.js} +4 -154
  85. package/dist/chunk-IINVXO3U.js.map +1 -0
  86. package/dist/{chunk-R7TZ2HCS.js → chunk-JG22O53B.js} +58 -3
  87. package/dist/chunk-JG22O53B.js.map +1 -0
  88. package/dist/{chunk-VPHSMJ2E.js → chunk-JPWSYHLB.js} +2 -2
  89. package/dist/{chunk-X7LEDA74.js → chunk-KFB4YNXM.js} +2 -2
  90. package/dist/{chunk-IPLYGWQF.js → chunk-KQAFEZQX.js} +5 -5
  91. package/dist/chunk-LQWOFU6L.js +17 -0
  92. package/dist/chunk-LQWOFU6L.js.map +1 -0
  93. package/dist/{chunk-ZUPKNWRZ.js → chunk-MIUL6AUZ.js} +3 -3
  94. package/dist/{chunk-EJY3HJMT.js → chunk-MYI3RKI6.js} +2 -2
  95. package/dist/{chunk-NA56NSKL.js → chunk-OOJCXJBN.js} +2 -2
  96. package/dist/{chunk-7KQB4EBS.js → chunk-OPPBTPUU.js} +4 -4
  97. package/dist/{chunk-ERPBRXVZ.js → chunk-PZKWPXRF.js} +2 -2
  98. package/dist/{chunk-FHKXVTM5.js → chunk-Q5XKKDFQ.js} +16 -16
  99. package/dist/{chunk-QRWMS6SI.js → chunk-Q6OL23WM.js} +2 -2
  100. package/dist/{chunk-OW7NVMGQ.js → chunk-QIZOU3FN.js} +2 -2
  101. package/dist/{chunk-V3KIRICY.js → chunk-QQYHYW2N.js} +3 -3
  102. package/dist/{chunk-YFCEBB5P.js → chunk-QTXNS3HB.js} +2 -2
  103. package/dist/{chunk-2QSZNTDO.js → chunk-RKNJBZ55.js} +4 -4
  104. package/dist/{chunk-E4KMY4KR.js → chunk-SNEUAZ6B.js} +2 -2
  105. package/dist/{chunk-TSTI6A3A.js → chunk-SYJW273H.js} +11 -11
  106. package/dist/{chunk-EFKZT6AY.js → chunk-T42L3S6A.js} +6 -11
  107. package/dist/chunk-T42L3S6A.js.map +1 -0
  108. package/dist/{chunk-YXMHUBN2.js → chunk-TOP3FSDW.js} +25 -102
  109. package/dist/chunk-TOP3FSDW.js.map +1 -0
  110. package/dist/{chunk-PBRCYYO7.js → chunk-ULZFZL7K.js} +2 -2
  111. package/dist/{chunk-UGHCZS6K.js → chunk-VFZQXYN5.js} +2 -2
  112. package/dist/{chunk-IVXVLDNT.js → chunk-WKJTMXME.js} +37 -54
  113. package/dist/chunk-WKJTMXME.js.map +1 -0
  114. package/dist/{chunk-NKB43PGI.js → chunk-WZDTSBGQ.js} +2 -2
  115. package/dist/{chunk-2UM6WHME.js → chunk-XE2QCCT2.js} +2 -2
  116. package/dist/{chunk-FPEZ74F7.js → chunk-XNJQZLAP.js} +3 -3
  117. package/dist/{chunk-SYVGVK4S.js → chunk-XTMYB2HY.js} +2 -2
  118. package/dist/{chunk-OETHJBAL.js → chunk-XV6PUXJ5.js} +71 -71
  119. package/dist/{chunk-UCLMKNHA.js → chunk-YIMV2KYM.js} +2 -2
  120. package/dist/{chunk-DYZR3Z6D.js → chunk-YMQKPSB2.js} +4 -4
  121. package/dist/{chunk-AYVCKGA6.js → chunk-YTXNDEUS.js} +2 -2
  122. package/dist/{chunk-L3CHRBHE.js → chunk-ZRUEP4IK.js} +17 -11
  123. package/dist/chunk-ZRUEP4IK.js.map +1 -0
  124. package/dist/{cli-BFBDYV0D.d.ts → cli-BTNj5DzK.d.ts} +1 -1
  125. package/dist/cli.d.ts +2 -2
  126. package/dist/cli.js +59 -57
  127. package/dist/compounding/engine.js +10 -10
  128. package/dist/config.js +5 -3
  129. package/dist/connectors/codex-materialize-runner.js +10 -10
  130. package/dist/connectors/index.js +10 -10
  131. package/dist/consolidation-provenance-check.js +2 -2
  132. package/dist/convergence-refresh.js +12 -12
  133. package/dist/conversation-index/backend.js +2 -2
  134. package/dist/corpus-watermark.js +12 -12
  135. package/dist/entity-retrieval.js +10 -10
  136. package/dist/external-wiki-access.d.ts +1 -1
  137. package/dist/external-wiki-access.js +28 -26
  138. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  139. package/dist/extraction-judge.d.ts +2 -1
  140. package/dist/extraction-judge.js +6 -1
  141. package/dist/extraction-normalization.js +2 -2
  142. package/dist/extraction-prompt.d.ts +20 -1
  143. package/dist/extraction-prompt.js +11 -1
  144. package/dist/extraction.js +13 -13
  145. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-Q2VB2E2D.js} +4 -4
  146. package/dist/harmonic-retrieval.js +1 -1
  147. package/dist/index.d.ts +680 -680
  148. package/dist/index.js +92 -90
  149. package/dist/maintenance/memory-governance.js +10 -10
  150. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
  151. package/dist/maintenance/rebuild-memory-projection.js +11 -11
  152. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  153. package/dist/namespaces/migrate.js +11 -11
  154. package/dist/namespaces/search.js +4 -4
  155. package/dist/namespaces/storage.js +10 -10
  156. package/dist/offline-sync.js +3 -2
  157. package/dist/operator-doctor-corpus.js +13 -13
  158. package/dist/operator-toolkit.js +24 -22
  159. package/dist/orchestration/maintenance.js +16 -16
  160. package/dist/orchestrator.js +85 -83
  161. package/dist/{public-http-8PcrDIYi.d.ts → public-http-BmPktTe3.d.ts} +1 -1
  162. package/dist/reconcile/cursor.js +7 -3
  163. package/dist/reconcile/cursor.js.map +1 -1
  164. package/dist/reconcile/manifest.js +3 -7
  165. package/dist/reconcile/plan.d.ts +15 -1
  166. package/dist/reconcile/plan.js +6 -10
  167. package/dist/resume-bundles.js +6 -4
  168. package/dist/schemas.d.ts +108 -108
  169. package/dist/search/factory.js +3 -3
  170. package/dist/search/index.js +3 -3
  171. package/dist/semantic-consolidation.js +16 -16
  172. package/dist/semantic-rule-promotion.js +10 -10
  173. package/dist/semantic-rule-verifier.js +10 -10
  174. package/dist/shared-context/manager.d.ts +8 -8
  175. package/dist/source-agent-qualifier.js +10 -10
  176. package/dist/storage.js +9 -9
  177. package/dist/support-passport/index.d.ts +4 -4
  178. package/dist/support-passport/index.js +30 -28
  179. package/dist/transfer/autodetect.js +1 -1
  180. package/dist/transfer/backup.js +1 -1
  181. package/dist/transfer/capsule-export.js +2 -2
  182. package/dist/transfer/types.d.ts +66 -66
  183. package/dist/verified-recall.js +10 -10
  184. package/package.json +2 -2
  185. package/src/calibration.ts +3 -1
  186. package/src/census-validation.ts +25 -0
  187. package/src/coding/architecture-surfaces.test.ts +9 -10
  188. package/src/coding/architecture-surfaces.ts +2 -35
  189. package/src/coding/codegraph-runtime-loader.test.ts +228 -0
  190. package/src/coding/codegraph-runtime.ts +30 -50
  191. package/src/coding/codegraph-surfaces.ts +2 -2
  192. package/src/coding/coding-knowledge-config.ts +35 -1
  193. package/src/coding/decision-surfaces.test.ts +9 -10
  194. package/src/coding/decision-surfaces.ts +2 -40
  195. package/src/coding/session-delta-surfaces.test.ts +9 -10
  196. package/src/coding/session-delta-surfaces.ts +2 -33
  197. package/src/extraction-judge.ts +3 -1
  198. package/src/extraction-output-language.test.ts +116 -0
  199. package/src/extraction-prompt.ts +70 -1
  200. package/src/extraction.ts +23 -95
  201. package/src/offline-sync.ts +4 -4
  202. package/src/reconcile/census-parity.test.ts +152 -0
  203. package/src/reconcile/cursor.ts +5 -5
  204. package/src/reconcile/manifest.ts +4 -11
  205. package/src/reconcile/plan.ts +18 -15
  206. package/dist/chunk-EFKZT6AY.js.map +0 -1
  207. package/dist/chunk-IVXVLDNT.js.map +0 -1
  208. package/dist/chunk-L3CHRBHE.js.map +0 -1
  209. package/dist/chunk-R7TZ2HCS.js.map +0 -1
  210. package/dist/chunk-RYST72N5.js.map +0 -1
  211. package/dist/chunk-TWTUGCTY.js.map +0 -1
  212. package/dist/chunk-YXMHUBN2.js.map +0 -1
  213. package/dist/chunk-Z4N7SVVF.js.map +0 -1
  214. package/dist/{access-service-cKQrte9Z.d.ts → access-service-CocW74uA.d.ts} +64 -64
  215. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  216. /package/dist/{chunk-3Z5TGRFA.js.map → chunk-3NZAVWU5.js.map} +0 -0
  217. /package/dist/{chunk-I5FLIB2J.js.map → chunk-3S3PNR5H.js.map} +0 -0
  218. /package/dist/{chunk-R6UMNP5C.js.map → chunk-3T6HIIKA.js.map} +0 -0
  219. /package/dist/{chunk-77QZW2D6.js.map → chunk-3TDAA7VA.js.map} +0 -0
  220. /package/dist/{chunk-DXDAQZ2K.js.map → chunk-42TIIO2M.js.map} +0 -0
  221. /package/dist/{chunk-Y7COCXY2.js.map → chunk-4F67JJPG.js.map} +0 -0
  222. /package/dist/{chunk-PB4WVYGC.js.map → chunk-5S5DUJFJ.js.map} +0 -0
  223. /package/dist/{chunk-KYTRF64R.js.map → chunk-5SCFDQEJ.js.map} +0 -0
  224. /package/dist/{chunk-GG4DN63W.js.map → chunk-62Y5AGCM.js.map} +0 -0
  225. /package/dist/{chunk-KHCUVYCY.js.map → chunk-6UKSOXAO.js.map} +0 -0
  226. /package/dist/{chunk-F6JYBVL6.js.map → chunk-7ZAC2C2U.js.map} +0 -0
  227. /package/dist/{chunk-GF7RQWXC.js.map → chunk-AJRJDXYR.js.map} +0 -0
  228. /package/dist/{chunk-YEQCMA5L.js.map → chunk-BOSIHHOH.js.map} +0 -0
  229. /package/dist/{chunk-7LF2OHIJ.js.map → chunk-BRHKW7GY.js.map} +0 -0
  230. /package/dist/{chunk-LX4TNSAE.js.map → chunk-CBY54QYW.js.map} +0 -0
  231. /package/dist/{chunk-6YMEU6OQ.js.map → chunk-G72IPMR7.js.map} +0 -0
  232. /package/dist/{chunk-7AF243WZ.js.map → chunk-GBVRVYF4.js.map} +0 -0
  233. /package/dist/{chunk-GTD4Q62X.js.map → chunk-H4GQ2Y24.js.map} +0 -0
  234. /package/dist/{chunk-QI5RDDEL.js.map → chunk-HXZNTZ3Y.js.map} +0 -0
  235. /package/dist/{chunk-CIAI24TQ.js.map → chunk-IBZQQOM5.js.map} +0 -0
  236. /package/dist/{chunk-VPHSMJ2E.js.map → chunk-JPWSYHLB.js.map} +0 -0
  237. /package/dist/{chunk-X7LEDA74.js.map → chunk-KFB4YNXM.js.map} +0 -0
  238. /package/dist/{chunk-IPLYGWQF.js.map → chunk-KQAFEZQX.js.map} +0 -0
  239. /package/dist/{chunk-ZUPKNWRZ.js.map → chunk-MIUL6AUZ.js.map} +0 -0
  240. /package/dist/{chunk-EJY3HJMT.js.map → chunk-MYI3RKI6.js.map} +0 -0
  241. /package/dist/{chunk-NA56NSKL.js.map → chunk-OOJCXJBN.js.map} +0 -0
  242. /package/dist/{chunk-7KQB4EBS.js.map → chunk-OPPBTPUU.js.map} +0 -0
  243. /package/dist/{chunk-ERPBRXVZ.js.map → chunk-PZKWPXRF.js.map} +0 -0
  244. /package/dist/{chunk-FHKXVTM5.js.map → chunk-Q5XKKDFQ.js.map} +0 -0
  245. /package/dist/{chunk-QRWMS6SI.js.map → chunk-Q6OL23WM.js.map} +0 -0
  246. /package/dist/{chunk-OW7NVMGQ.js.map → chunk-QIZOU3FN.js.map} +0 -0
  247. /package/dist/{chunk-V3KIRICY.js.map → chunk-QQYHYW2N.js.map} +0 -0
  248. /package/dist/{chunk-YFCEBB5P.js.map → chunk-QTXNS3HB.js.map} +0 -0
  249. /package/dist/{chunk-2QSZNTDO.js.map → chunk-RKNJBZ55.js.map} +0 -0
  250. /package/dist/{chunk-E4KMY4KR.js.map → chunk-SNEUAZ6B.js.map} +0 -0
  251. /package/dist/{chunk-TSTI6A3A.js.map → chunk-SYJW273H.js.map} +0 -0
  252. /package/dist/{chunk-PBRCYYO7.js.map → chunk-ULZFZL7K.js.map} +0 -0
  253. /package/dist/{chunk-UGHCZS6K.js.map → chunk-VFZQXYN5.js.map} +0 -0
  254. /package/dist/{chunk-NKB43PGI.js.map → chunk-WZDTSBGQ.js.map} +0 -0
  255. /package/dist/{chunk-2UM6WHME.js.map → chunk-XE2QCCT2.js.map} +0 -0
  256. /package/dist/{chunk-FPEZ74F7.js.map → chunk-XNJQZLAP.js.map} +0 -0
  257. /package/dist/{chunk-SYVGVK4S.js.map → chunk-XTMYB2HY.js.map} +0 -0
  258. /package/dist/{chunk-OETHJBAL.js.map → chunk-XV6PUXJ5.js.map} +0 -0
  259. /package/dist/{chunk-UCLMKNHA.js.map → chunk-YIMV2KYM.js.map} +0 -0
  260. /package/dist/{chunk-DYZR3Z6D.js.map → chunk-YMQKPSB2.js.map} +0 -0
  261. /package/dist/{chunk-AYVCKGA6.js.map → chunk-YTXNDEUS.js.map} +0 -0
  262. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-Q2VB2E2D.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/offline-sync.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n readFile,\n rename,\n rm,\n stat,\n unlink,\n utimes,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n DEFAULT_TRANSFER_EXCLUDE_DIRS,\n} from \"./transfer/exclusions.js\";\nimport {\n prepareSafeArchiveRoot,\n resolveSafeArchiveTarget,\n sha256Bytes,\n validateArchiveRelativePath,\n type SafeArchiveRoot,\n} from \"./transfer/fs-utils.js\";\nimport { parseFlexibleIsoTimestamp } from \"./utils/iso-timestamp.js\";\nimport { DEFAULT_OFFLINE_SYNC_EXCLUDE_GLOBS } from \"./offline-sync-exclude-globs.js\";\nimport {\n isEncryptedOfflineSyncFile,\n readPlainOfflineSyncFileChunk,\n sha256OfflineSyncFile,\n shouldExcludeOfflineSyncFile,\n type OfflineSyncExcludeFile,\n type OfflineSyncFileTarget,\n} from \"./offline-sync-file-io.js\";\nimport { CENSUS_MAX_MTIME_MS, isCensusMtimeMs, isSha256Hex } from \"./census-validation.js\";\nexport type { OfflineSyncExcludeFile, OfflineSyncFileTarget } from \"./offline-sync-file-io.js\";\n\nexport const OFFLINE_SYNC_SNAPSHOT_FORMAT = \"remnic.offline-sync.snapshot.v1\";\nexport const OFFLINE_SYNC_CHANGESET_FORMAT = \"remnic.offline-sync.changeset.v1\";\nexport const OFFLINE_SYNC_STATE_VERSION = 1;\nexport const OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES = 64 * 1024 * 1024;\nexport const OFFLINE_SYNC_FILE_CONTENT_TRANSFER_CHUNK_BYTES = 8 * 1024 * 1024;\nexport const OFFLINE_SYNC_APPLY_MAX_BODY_BYTES = 16 * 1024 * 1024;\nexport const OFFLINE_SYNC_SNAPSHOT_BASE_MAX_BODY_BYTES = 64 * 1024 * 1024;\nexport const OFFLINE_SYNC_MAX_MTIME_MS = CENSUS_MAX_MTIME_MS;\n\nexport interface OfflineSyncFileState {\n path: string;\n sha256: string;\n /** Byte length of the transferable content, after any readFile hook such as secure-store decryption. */\n bytes: number;\n mtimeMs: number;\n}\n\nexport interface OfflineSyncFileRecord extends OfflineSyncFileState {\n contentBase64?: string;\n}\n\nexport interface OfflineSyncFileDigest {\n sha256: string;\n bytes: number;\n}\n\nexport interface OfflineSyncDeletionRevision {\n path: string;\n mtimeMs: number;\n}\n\nexport interface OfflineSyncSnapshot {\n format: typeof OFFLINE_SYNC_SNAPSHOT_FORMAT;\n schemaVersion: 1;\n createdAt: string;\n sourceId: string;\n includeTranscripts: boolean;\n files: OfflineSyncFileRecord[];\n deletions?: OfflineSyncDeletionRevision[];\n}\n\nexport type OfflineSyncChange =\n | {\n type: \"upsert\";\n path: string;\n baseSha256?: string;\n file: OfflineSyncFileRecord & { contentBase64: string };\n }\n | {\n type: \"delete\";\n path: string;\n baseSha256: string;\n mtimeMs?: number;\n };\n\nexport interface OfflineSyncChangeset {\n format: typeof OFFLINE_SYNC_CHANGESET_FORMAT;\n schemaVersion: 1;\n createdAt: string;\n sourceId: string;\n includeTranscripts: boolean;\n changes: OfflineSyncChange[];\n}\n\nexport interface OfflineSyncState {\n version: typeof OFFLINE_SYNC_STATE_VERSION;\n remoteId: string;\n namespace?: string;\n includeTranscripts: boolean;\n lastSyncedAt: string;\n baseFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncConflict {\n path: string;\n reason:\n | \"both_modified\"\n | \"local_deleted_remote_modified\"\n | \"local_modified_remote_deleted\"\n | \"remote_exists_for_local_create\"\n | \"remote_changed_for_local_update\"\n | \"remote_deleted_for_local_update\"\n | \"remote_changed_for_local_delete\";\n baseSha256?: string;\n localSha256?: string;\n incomingSha256?: string;\n conflictPath?: string;\n}\n\nexport interface OfflineSyncApplySnapshotResult {\n upserted: number;\n deleted: number;\n skipped: number;\n pendingLocal: number;\n conflicts: OfflineSyncConflict[];\n nextBaseFiles: OfflineSyncFileState[];\n}\n\nexport interface OfflineSyncApplyChangesetResult {\n appliedUpserts: number;\n appliedDeletes: number;\n skipped: number;\n conflicts: OfflineSyncConflict[];\n currentFiles: OfflineSyncFileState[];\n currentFilesComplete?: boolean;\n}\n\nexport interface OfflineSyncChangesetSummary {\n upserts: number;\n deletes: number;\n total: number;\n}\n\nexport interface OfflineSyncFileDeleteTarget extends OfflineSyncFileTarget {\n mtimeMs?: number;\n}\n\nexport type OfflineSyncRecordDeletionRevision = (\n target: OfflineSyncFileDeleteTarget & { mtimeMs: number },\n) => Promise<void>;\n\nexport interface OfflineSyncFileWriteTarget extends OfflineSyncFileTarget {\n content: Buffer;\n}\n\nexport interface OfflineSyncFileWriteChunksTarget extends OfflineSyncFileTarget {\n chunks: AsyncIterable<Buffer>;\n}\n\nexport interface OfflineSyncFileStagingWriteTarget extends OfflineSyncFileWriteTarget {}\n\nexport interface OfflineSyncFileContentChunk extends Omit<OfflineSyncFileState, \"sha256\"> {\n sha256?: string;\n offset: number;\n chunkBytes: number;\n content: Buffer;\n}\n\nexport interface OfflineSyncApplyFileContentChunkResult {\n path: string;\n sha256: string;\n bytes: number;\n mtimeMs: number;\n offset: number;\n chunkBytes: number;\n done: boolean;\n applied: boolean;\n skipped: boolean;\n conflict?: OfflineSyncConflict;\n currentFile?: OfflineSyncFileState;\n}\n\ninterface OfflineUploadStaging {\n kind: \"single\" | \"chunks\";\n relPath: string;\n filePath: string;\n}\n\ninterface OfflineSyncFileRecordOptions {\n root: SafeArchiveRoot;\n relPath: string;\n filePath: string;\n includeContent: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n signal?: AbortSignal;\n}\n\nconst SYNC_INTERNAL_DIR = \".offline-sync\";\nconst OFFLINE_SYNC_UPLOAD_STAGING_MAX_AGE_MS = 24 * 60 * 60 * 1000;\nconst OFFLINE_SYNC_FAST_BASE_MTIME_TOLERANCE_MS = 1_000;\nconst OFFLINE_SYNC_FAST_BASE_CTIME_TOLERANCE_MS = 1;\nconst EXCLUDED_FILE_NAMES = new Set([\n \".sync-state.json\",\n]);\n\nconst EXCLUDED_FILE_PREFIXES = [\n \".remnic-sync.\",\n \".remnic-sync-state.\",\n];\n\n/**\n * Convert a tiny subset of glob syntax (`*`, `**`, `?`, literal text) into a\n * regular expression anchored at the start and end of the input. The matcher\n * is intentionally narrow — it is only used for operator-supplied\n * `offlineSyncExcludes` entries, not for full shell-style globbing.\n * `*` and `?` match within a single path segment. `**` is cross-segment\n * wherever it appears: a `star-star-slash` prefix (leading or embedded)\n * matches zero or more whole segments, and a trailing `dir/star-star`\n * matches everything under `dir/` at any depth.\n */\nexport function globToRegExp(glob: string): RegExp {\n if (typeof glob !== \"string\" || glob.length === 0) {\n throw new Error(\"offlineSyncExcludes entry must be a non-empty string\");\n }\n if (glob.includes(\"\\0\")) {\n throw new Error(\"offlineSyncExcludes entry must not contain NUL bytes\");\n }\n let source = \"\";\n for (let i = 0; i < glob.length; i += 1) {\n const ch = glob[i];\n if (ch === \"*\") {\n if (glob[i + 1] === \"*\") {\n // `**` is cross-segment wherever it appears:\n // leading `**/` -> zero or more whole segments\n // `/**` at end -> everything under the directory\n // `a/**/b` -> any depth between segments\n // (Cursor review on PR #1793: trailing `scratch/**` must match\n // nested `scratch/a/b.md`, matching the offline-mode guide.)\n if (glob[i + 2] === \"/\") {\n source += \"(?:.*/)?\";\n i += 2;\n continue;\n }\n source += \".*\";\n i += 1;\n continue;\n }\n source += \"[^/]*\";\n continue;\n }\n if (ch === \"?\") {\n source += \"[^/]\";\n continue;\n }\n if (ch === \"/\") {\n source += \"/\";\n continue;\n }\n source += ch.replace(/[\\\\^$.+()|{}\\[\\]]/g, \"\\\\$&\");\n }\n return new RegExp(`^${source}$`);\n}\n\nfunction hashText(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction sha256Buffer(buffer: Buffer): { sha256: string; bytes: number } {\n return sha256Bytes(buffer);\n}\n\nfunction throwIfOfflineSyncAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw new Error(\"offline sync request aborted\");\n}\n\nfunction compareByPath<T extends { path: string }>(left: T, right: T): number {\n return left.path.localeCompare(right.path);\n}\n\nfunction assertSha256(value: unknown, field: string): string {\n if (!isSha256Hex(value)) {\n throw new Error(`${field} must be a 64-character sha256 hex string`);\n }\n return value.toLowerCase();\n}\n\nfunction assertNonNegativeInteger(value: unknown, field: string): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n !Number.isInteger(value) ||\n value < 0\n ) {\n throw new Error(`${field} must be a non-negative integer`);\n }\n return value;\n}\n\nfunction assertNonNegativeFinite(value: unknown, field: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${field} must be a non-negative finite number`);\n }\n return value;\n}\n\nfunction assertOfflineSyncMtimeMs(value: unknown, field: string): number {\n const mtimeMs = assertNonNegativeFinite(value, field);\n if (!isCensusMtimeMs(mtimeMs)) {\n throw new Error(`${field} must be within JavaScript Date range`);\n }\n return mtimeMs;\n}\n\nfunction assertBoolean(value: unknown, field: string): boolean {\n if (typeof value !== \"boolean\") {\n throw new Error(`${field} must be a boolean`);\n }\n return value;\n}\n\nfunction normalizeSourceId(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.length > 512) {\n throw new Error(`${field} must be a non-empty string no longer than 512 characters`);\n }\n return value.trim();\n}\n\nfunction normalizeFileState(input: unknown, fieldPrefix: string): OfflineSyncFileState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(`${fieldPrefix} must be an object`);\n }\n const obj = input as Record<string, unknown>;\n const relPath = normalizeRelativePath(obj.path, `${fieldPrefix}.path`);\n return {\n path: relPath,\n sha256: assertSha256(obj.sha256, `${fieldPrefix}.sha256`),\n bytes: assertNonNegativeInteger(obj.bytes, `${fieldPrefix}.bytes`),\n mtimeMs: assertOfflineSyncMtimeMs(obj.mtimeMs, `${fieldPrefix}.mtimeMs`),\n };\n}\n\nfunction normalizeFileRecord(\n input: unknown,\n fieldPrefix: string,\n requireContent: boolean,\n): OfflineSyncFileRecord {\n const state = normalizeFileState(input, fieldPrefix);\n const obj = input as Record<string, unknown>;\n const contentBase64 = obj.contentBase64;\n if (requireContent && typeof contentBase64 !== \"string\") {\n throw new Error(`${fieldPrefix}.contentBase64 is required`);\n }\n if (contentBase64 !== undefined && typeof contentBase64 !== \"string\") {\n throw new Error(`${fieldPrefix}.contentBase64 must be a base64 string`);\n }\n return {\n ...state,\n ...(contentBase64 !== undefined ? { contentBase64 } : {}),\n };\n}\n\nfunction normalizeFileStates(input: readonly unknown[] | undefined): OfflineSyncFileState[] {\n if (!input) return [];\n if (!Array.isArray(input)) {\n throw new Error(\"baseFiles must be an array\");\n }\n return input.map((entry, index) => normalizeFileState(entry, `baseFiles[${index}]`));\n}\n\nfunction normalizeDeletionRevisions(\n input: unknown,\n fieldPrefix: string,\n): OfflineSyncDeletionRevision[] | undefined {\n if (input === undefined) return undefined;\n if (!Array.isArray(input)) {\n throw new Error(`${fieldPrefix} must be an array`);\n }\n const deletions = input.map((entry, index): OfflineSyncDeletionRevision => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`${fieldPrefix}[${index}] must be an object`);\n }\n const obj = entry as Record<string, unknown>;\n return {\n path: normalizeRelativePath(obj.path, `${fieldPrefix}[${index}].path`),\n mtimeMs: assertOfflineSyncMtimeMs(obj.mtimeMs, `${fieldPrefix}[${index}].mtimeMs`),\n };\n });\n assertUniquePaths(deletions, fieldPrefix);\n return deletions.sort(compareByPath);\n}\n\nfunction snapshotBuilderDeletions(options: {\n deletions?: readonly OfflineSyncDeletionRevision[];\n files: readonly OfflineSyncFileState[];\n paths?: readonly string[];\n includeTranscripts: boolean;\n excludeNodeLocalState?: boolean;\n userExcludeRegexps?: readonly RegExp[];\n}): OfflineSyncDeletionRevision[] | undefined {\n const deletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n if (deletions === undefined) return undefined;\n if (deletions.length === 0) return deletions;\n const presentPaths = new Set(options.files.map((file) => file.path.toLowerCase()));\n const scopedPaths = options.paths\n ? new Set(options.paths.map((relPath) => relPath.toLowerCase()))\n : undefined;\n return deletions.filter((deletion) =>\n (scopedPaths === undefined || scopedPaths.has(deletion.path.toLowerCase())) &&\n !presentPaths.has(deletion.path.toLowerCase()) &&\n !(options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(deletion.path, options.includeTranscripts)\n : shouldExcludePushRelPath(\n deletion.path,\n options.includeTranscripts,\n options.userExcludeRegexps,\n )));\n}\n\nexport async function filterOfflineSyncDeletionRevisions(options: {\n root: string;\n deletions: readonly OfflineSyncDeletionRevision[];\n includeTranscripts?: boolean;\n userExcludeRegexps?: readonly RegExp[];\n}): Promise<OfflineSyncDeletionRevision[]> {\n const deletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n if (deletions === undefined) throw new Error(\"deletions must be an array\");\n if (deletions.length === 0) return deletions;\n const root = await prepareSafeArchiveRoot(\n path.resolve(options.root),\n \"filterOfflineSyncDeletionRevisions\",\n \"root\",\n );\n const includeTranscripts = options.includeTranscripts !== false;\n const filtered: OfflineSyncDeletionRevision[] = [];\n for (const deletion of deletions) {\n if (shouldExcludePushRelPath(deletion.path, includeTranscripts, options.userExcludeRegexps)) {\n continue;\n }\n const filePath = path.join(root.abs, ...deletion.path.split(\"/\"));\n const present = await lstat(filePath).then(\n () => true,\n (error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n },\n );\n if (!present) filtered.push(deletion);\n }\n return filtered;\n}\n\nexport function normalizeOfflineSyncSnapshot(\n input: unknown,\n options: { requireContent?: boolean } = {},\n): OfflineSyncSnapshot {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync snapshot must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.format !== OFFLINE_SYNC_SNAPSHOT_FORMAT) {\n throw new Error(`offline sync snapshot format must be ${OFFLINE_SYNC_SNAPSHOT_FORMAT}`);\n }\n if (obj.schemaVersion !== 1) {\n throw new Error(\"offline sync snapshot schemaVersion must be 1\");\n }\n const createdAt = normalizeIsoString(obj.createdAt, \"createdAt\");\n const sourceId = normalizeSourceId(obj.sourceId, \"sourceId\");\n const includeTranscripts = assertBoolean(obj.includeTranscripts, \"includeTranscripts\");\n if (!Array.isArray(obj.files)) {\n throw new Error(\"offline sync snapshot files must be an array\");\n }\n const files = obj.files\n .map((entry, index) =>\n normalizeFileRecord(entry, `files[${index}]`, options.requireContent === true))\n .filter((file) => !shouldIgnoreIncomingRuntimePath(file.path))\n .sort(compareByPath);\n const deletions = normalizeDeletionRevisions(obj.deletions, \"deletions\")\n ?.filter((deletion) => !shouldIgnoreIncomingRuntimePath(deletion.path));\n const entries = deletions && deletions.length > 0 ? [...files, ...deletions] : files;\n assertUniquePaths(entries, \"offline sync snapshot\");\n if (!includeTranscripts) {\n const transcriptPath = entries\n .find((entry) => entry.path.split(\"/\")[0] === \"transcripts\")?.path;\n if (transcriptPath) {\n throw new Error(\n `offline sync snapshot includeTranscripts is false but contains transcript path: ${transcriptPath}`,\n );\n }\n }\n const excludedPath = entries\n .find((entry) => shouldExcludeRelPath(entry.path, true))?.path;\n if (excludedPath) {\n throw new Error(`offline sync snapshot contains excluded path: ${excludedPath}`);\n }\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt,\n sourceId,\n includeTranscripts,\n files,\n ...(deletions === undefined ? {} : { deletions }),\n };\n}\n\nexport function normalizeOfflineSyncChangeset(\n input: unknown,\n): OfflineSyncChangeset {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync changeset must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.format !== OFFLINE_SYNC_CHANGESET_FORMAT) {\n throw new Error(`offline sync changeset format must be ${OFFLINE_SYNC_CHANGESET_FORMAT}`);\n }\n if (obj.schemaVersion !== 1) {\n throw new Error(\"offline sync changeset schemaVersion must be 1\");\n }\n const createdAt = normalizeIsoString(obj.createdAt, \"createdAt\");\n const sourceId = normalizeSourceId(obj.sourceId, \"sourceId\");\n const includeTranscripts = assertBoolean(obj.includeTranscripts, \"includeTranscripts\");\n if (!Array.isArray(obj.changes)) {\n throw new Error(\"offline sync changeset changes must be an array\");\n }\n const changes = obj.changes.map((entry, index): OfflineSyncChange => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`changes[${index}] must be an object`);\n }\n const change = entry as Record<string, unknown>;\n const type = change.type;\n const relPath = normalizeRelativePath(change.path, `changes[${index}].path`);\n if (type === \"upsert\") {\n const file = normalizeFileRecord(\n change.file,\n `changes[${index}].file`,\n true,\n ) as OfflineSyncFileRecord & { contentBase64: string };\n if (file.path !== relPath) {\n throw new Error(`changes[${index}].file.path must match changes[${index}].path`);\n }\n const baseSha256 =\n change.baseSha256 === undefined\n ? undefined\n : assertSha256(change.baseSha256, `changes[${index}].baseSha256`);\n return {\n type: \"upsert\",\n path: relPath,\n ...(baseSha256 ? { baseSha256 } : {}),\n file,\n };\n }\n if (type === \"delete\") {\n const mtimeMs = change.mtimeMs === undefined\n ? undefined\n : assertOfflineSyncMtimeMs(change.mtimeMs, `changes[${index}].mtimeMs`);\n return {\n type: \"delete\",\n path: relPath,\n baseSha256: assertSha256(change.baseSha256, `changes[${index}].baseSha256`),\n ...(mtimeMs === undefined ? {} : { mtimeMs }),\n };\n }\n throw new Error(`changes[${index}].type must be \"upsert\" or \"delete\"`);\n }).filter((change) => !shouldIgnoreIncomingRuntimePath(change.path));\n assertUniquePaths(changes, \"offline sync changeset\");\n if (!includeTranscripts) {\n const transcriptPath = changes.find((change) => change.path.split(\"/\")[0] === \"transcripts\")?.path;\n if (transcriptPath) {\n throw new Error(\n `offline sync changeset includeTranscripts is false but contains transcript path: ${transcriptPath}`,\n );\n }\n }\n const excludedPath = changes.find((change) => shouldExcludeRelPath(change.path, true))?.path;\n if (excludedPath) {\n throw new Error(`offline sync changeset contains excluded path: ${excludedPath}`);\n }\n return {\n format: OFFLINE_SYNC_CHANGESET_FORMAT,\n schemaVersion: 1,\n createdAt,\n sourceId,\n includeTranscripts,\n changes: changes.sort(compareByPath),\n };\n}\n\nfunction normalizeIsoString(input: unknown, field: string): string {\n if (typeof input !== \"string\" || input.trim().length === 0) {\n throw new Error(`${field} must be an ISO timestamp string`);\n }\n const parsed = parseFlexibleIsoTimestamp(input.trim());\n if (parsed === null) {\n throw new Error(`${field} must be a parseable ISO timestamp`);\n }\n return new Date(parsed).toISOString();\n}\n\nfunction normalizeRelativePath(input: unknown, field: string): string {\n if (typeof input !== \"string\") {\n throw new Error(`${field} must be a POSIX relative path string`);\n }\n return validateArchiveRelativePath(input, field);\n}\n\nfunction assertUniquePaths(entries: readonly { path: string }[], context: string): void {\n const seen = new Set<string>();\n for (const entry of entries) {\n const key = entry.path.toLowerCase();\n if (seen.has(key)) {\n throw new Error(`${context} contains duplicate path: ${entry.path}`);\n }\n seen.add(key);\n }\n}\n\nexport function isInternalRemnicStatePath(relPosix: string): boolean {\n const normalized = relPosix.includes(\"\\\\\") ? relPosix.replaceAll(\"\\\\\", \"/\") : relPosix;\n return normalized === \".remnic\"\n || normalized.startsWith(\".remnic/\")\n || normalized.endsWith(\"/.remnic\")\n || normalized.includes(\"/.remnic/\");\n}\n\nfunction shouldExcludeRelPath(relPosix: string, includeTranscripts: boolean): boolean {\n if (isInternalRemnicStatePath(relPosix)) return true;\n const parts = relPosix.split(\"/\");\n if (parts.some((part) => DEFAULT_TRANSFER_EXCLUDE_DIRS.has(part))) return true;\n if (parts.some((part) => part === SYNC_INTERNAL_DIR)) return true;\n if (!includeTranscripts && parts[0] === \"transcripts\") return true;\n const basename = parts[parts.length - 1] ?? \"\";\n if (isCanonicalRuntimeStatePath(parts) && basename.includes(\".tmp-\")) return true;\n if (EXCLUDED_FILE_NAMES.has(basename)) return true;\n if (EXCLUDED_FILE_PREFIXES.some((prefix) => basename.startsWith(prefix))) return true;\n return false;\n}\n\n/**\n * Push-side variant of `shouldExcludeRelPath` for issue #1786. Combines the\n * legacy structural exclude (private dirs, sync internal, tmp runtime state,\n * excluded file names/prefixes) with the new push-only exclusion layers:\n * - the `state/*.sqlite`, `state/index_tags.json`, etc. defaults that\n * describe node-local runtime state each node rebuilds from synced\n * records, and\n * - operator-supplied `offlineSyncExcludes` regexps.\n *\n * Used ONLY by push-side enumeration/validation paths. Apply-side callers\n * must use the legacy `shouldExcludeRelPath` so a remote snapshot containing\n * `state/lcm.sqlite` can still be accepted on first sync -- the remote's\n * view is authoritative for that file until the local LCM is bootstrapped.\n */\nfunction shouldExcludePushRelPath(\n relPosix: string,\n includeTranscripts: boolean,\n userExcludeRegexps?: readonly RegExp[],\n): boolean {\n if (shouldExcludeRelPath(relPosix, includeTranscripts)) return true;\n // Issue #1786: node-local runtime state (live sqlite, derived indexes,\n // per-node governance run logs) is rebuilt by each node, never synced.\n if (matchesOfflineSyncDefaultExclude(relPosix)) return true;\n if (userExcludeRegexps && userExcludeRegexps.some((re) => re.test(relPosix))) return true;\n return false;\n}\n\n// Precompiled once at module load — this check sits on the hot\n// enumeration path for every walked file (Kilo review, PR #1793).\nconst DEFAULT_OFFLINE_SYNC_EXCLUDE_REGEXPS: readonly RegExp[] =\n DEFAULT_OFFLINE_SYNC_EXCLUDE_GLOBS.map((glob) => globToRegExp(glob));\n\nfunction matchesOfflineSyncDefaultExclude(relPosix: string): boolean {\n for (const regexp of DEFAULT_OFFLINE_SYNC_EXCLUDE_REGEXPS) {\n if (regexp.test(relPosix)) return true;\n }\n return false;\n}\n\n/**\n * Compile operator-supplied `offlineSyncExcludes` glob strings into a\n * pre-validated array of regular expressions. Empty input is allowed and\n * returns an empty list. Throws on any invalid entry — callers should treat\n * a thrown error as a fatal configuration mistake and refuse to start the\n * sync run rather than silently dropping the bad entry.\n */\nexport function compileOfflineSyncExcludeGlobs(\n globs: readonly unknown[],\n): RegExp[] {\n const out: RegExp[] = [];\n for (const entry of globs) {\n if (typeof entry !== \"string\" || entry.length === 0) {\n throw new Error(\"offlineSyncExcludes must contain only non-empty strings\");\n }\n out.push(globToRegExp(entry));\n }\n return out;\n}\n\n/**\n * Validate the operator-supplied offline-sync exclude list (#1786).\n * Rejects loudly instead of silently defaulting (CLAUDE.md rule 39):\n * a misspelled key value must fail config parse, not be ignored.\n * Lives next to the glob compiler so config.ts only carries the call.\n */\nexport function parseOfflineSyncExcludes(raw: unknown): string[] {\n if (raw === undefined || raw === null) return [];\n if (!Array.isArray(raw)) {\n throw new Error(\n `offlineSyncExcludes must be an array of non-empty glob strings; got ${typeof raw}`,\n );\n }\n for (const entry of raw) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new Error(\n \"offlineSyncExcludes must contain only non-empty glob strings\",\n );\n }\n }\n const globs = raw.map((entry) => (entry as string).trim());\n // Compile-check every glob now so a bad pattern fails at parse time\n // rather than mid-sync. compileOfflineSyncExcludeGlobs throws with a\n // per-entry message.\n compileOfflineSyncExcludeGlobs(globs);\n return globs;\n}\n\nfunction shouldIgnoreIncomingRuntimePath(relPosix: string): boolean {\n if (isInternalRemnicStatePath(relPosix)) return true;\n const parts = relPosix.split(\"/\");\n const basename = parts[parts.length - 1] ?? \"\";\n return isCanonicalRuntimeStatePath(parts) && basename.includes(\".tmp-\");\n}\n\nfunction isCanonicalRuntimeStatePath(parts: string[]): boolean {\n if (parts[0] === \"state\") return true;\n return parts[0] === \"namespaces\" && parts.length >= 4 && parts[2] === \"state\";\n}\n\nconst REMOTE_AUTHORITATIVE_RUNTIME_STATE_FILES = new Set([\n \".artifact-write-version.log\",\n \".memory-status-version.log\",\n \"buffer.json\",\n \"embeddings.json\",\n \"index_time.json\",\n \"last_intent.json\",\n \"last_qmd_recall.json\",\n \"last_recall.json\",\n \"lcm.sqlite-shm\",\n \"lcm.sqlite-wal\",\n \"memory-lifecycle-ledger.jsonl\",\n \"recall_impressions.jsonl\",\n]);\n\nconst ABSENT_INCOMING_RUNTIME_DELETE_FILES = new Set([\n \"lcm.sqlite-shm\",\n \"lcm.sqlite-wal\",\n]);\n\nexport function shouldPreferIncomingOfflineRuntimeFile(relPosix: string): boolean {\n const parts = relPosix.split(\"/\");\n const basename = parts[parts.length - 1] ?? \"\";\n return isCanonicalRuntimeStatePath(parts) && REMOTE_AUTHORITATIVE_RUNTIME_STATE_FILES.has(basename);\n}\n\nfunction shouldDeleteAbsentIncomingOfflineRuntimeFile(relPosix: string): boolean {\n const parts = relPosix.split(\"/\");\n const basename = parts[parts.length - 1] ?? \"\";\n return isCanonicalRuntimeStatePath(parts) && ABSENT_INCOMING_RUNTIME_DELETE_FILES.has(basename);\n}\n\nfunction filterBaseFilesForMode(\n files: readonly OfflineSyncFileState[],\n includeTranscripts: boolean,\n): OfflineSyncFileState[] {\n return files.filter((file) => !shouldExcludeRelPath(file.path, includeTranscripts));\n}\n\nfunction canReuseFastBaseFileState(\n baseEntry: OfflineSyncFileState,\n st: { size: number; mtimeMs: number; ctimeMs: number },\n baseCapturedAtMs: number | null,\n): boolean {\n if (baseEntry.bytes !== st.size) return false;\n if (Math.abs(baseEntry.mtimeMs - st.mtimeMs) > OFFLINE_SYNC_FAST_BASE_MTIME_TOLERANCE_MS) {\n return false;\n }\n if (baseCapturedAtMs === null) return false;\n // Node reports stat times as fractional milliseconds while Date snapshots are\n // whole milliseconds, so allow only a tiny precision window around capture.\n return st.ctimeMs - baseCapturedAtMs <= OFFLINE_SYNC_FAST_BASE_CTIME_TOLERANCE_MS;\n}\n\nasync function canReuseFastBaseFileStateFromDisk(\n baseEntry: OfflineSyncFileState,\n st: { size: number; mtimeMs: number; ctimeMs: number },\n baseCapturedAtMs: number | null,\n): Promise<boolean> {\n return canReuseFastBaseFileState(baseEntry, st, baseCapturedAtMs);\n}\n\nasync function readOfflineSyncFileRecord(\n options: OfflineSyncFileRecordOptions,\n): Promise<OfflineSyncFileRecord> {\n throwIfOfflineSyncAborted(options.signal);\n const relPath = validateArchiveRelativePath(options.relPath, \"offlineSyncFile.path\");\n let content: Buffer | null = null;\n let digest: OfflineSyncFileDigest;\n if (options.includeContent) {\n content = options.readFile\n ? await options.readFile({ root: options.root.abs, path: relPath, filePath: options.filePath })\n : await readFile(options.filePath);\n throwIfOfflineSyncAborted(options.signal);\n digest = sha256Buffer(content);\n } else if (options.readFileDigest) {\n digest = await options.readFileDigest({ root: options.root.abs, path: relPath, filePath: options.filePath });\n throwIfOfflineSyncAborted(options.signal);\n } else if (options.readFile) {\n content = await options.readFile({ root: options.root.abs, path: relPath, filePath: options.filePath });\n throwIfOfflineSyncAborted(options.signal);\n digest = sha256Buffer(content);\n content = null;\n } else {\n digest = await sha256OfflineSyncFile(options.filePath, options.signal);\n }\n throwIfOfflineSyncAborted(options.signal);\n const st = await stat(options.filePath);\n return {\n path: relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n ...(content ? { contentBase64: content.toString(\"base64\") } : {}),\n };\n}\n\nexport async function* iterateOfflineSyncSnapshotFileRecords(options: {\n root: string;\n includeContent?: boolean;\n includeTranscripts?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): AsyncIterable<OfflineSyncFileRecord> {\n throwIfOfflineSyncAborted(options.signal);\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"iterateOfflineSyncSnapshotFileRecords\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n\n async function* walk(dirAbs: string): AsyncIterable<OfflineSyncFileRecord> {\n throwIfOfflineSyncAborted(options.signal);\n let entries = await readdir(dirAbs, { withFileTypes: true });\n entries = entries.sort((left, right) => left.name.localeCompare(right.name));\n for (const entry of entries) {\n const abs = path.join(dirAbs, entry.name);\n const relPosix = path.relative(root.abs, abs).split(path.sep).join(\"/\");\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPosix, includeTranscripts)\n : shouldExcludePushRelPath(relPosix, includeTranscripts, options.userExcludeRegexps)\n ) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) {\n yield* walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPosix,\n filePath: abs,\n })) continue;\n yield await readOfflineSyncFileRecord({\n root,\n relPath: relPosix,\n filePath: abs,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n signal: options.signal,\n });\n }\n }\n\n yield* walk(root.abs);\n}\n\nexport async function buildOfflineSyncSnapshot(options: {\n root: string;\n sourceId: string;\n includeContent?: boolean;\n deletions?: readonly OfflineSyncDeletionRevision[];\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): Promise<OfflineSyncSnapshot> {\n throwIfOfflineSyncAborted(options.signal);\n const includeTranscripts = options.includeTranscripts !== false;\n const files: OfflineSyncFileRecord[] = [];\n for await (const file of iterateOfflineSyncSnapshotFileRecords(options)) files.push(file);\n throwIfOfflineSyncAborted(options.signal);\n\n const sortedFiles = files.sort(compareByPath);\n const deletions = snapshotBuilderDeletions({\n deletions: options.deletions,\n files: sortedFiles,\n includeTranscripts,\n excludeNodeLocalState: options.excludeNodeLocalState,\n userExcludeRegexps: options.userExcludeRegexps,\n });\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: sortedFiles,\n ...(deletions === undefined ? {} : { deletions }),\n };\n}\n\nexport async function buildOfflineSyncSnapshotFromBase(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n baseCapturedAt?: Date;\n includeContent?: boolean;\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): Promise<OfflineSyncSnapshot> {\n throwIfOfflineSyncAborted(options.signal);\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"buildOfflineSyncSnapshotFromBase\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const rawBaseCapturedAtMs = options.baseCapturedAt?.getTime();\n const baseCapturedAtMs = rawBaseCapturedAtMs !== undefined && Number.isFinite(rawBaseCapturedAtMs)\n ? rawBaseCapturedAtMs\n : null;\n const files: OfflineSyncFileRecord[] = [];\n\n async function walk(dirAbs: string): Promise<void> {\n throwIfOfflineSyncAborted(options.signal);\n let entries = await readdir(dirAbs, { withFileTypes: true });\n entries = entries.sort((left, right) => left.name.localeCompare(right.name));\n for (const entry of entries) {\n throwIfOfflineSyncAborted(options.signal);\n const abs = path.join(dirAbs, entry.name);\n const relPosix = path.relative(root.abs, abs).split(path.sep).join(\"/\");\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPosix, includeTranscripts)\n : shouldExcludePushRelPath(relPosix, includeTranscripts, options.userExcludeRegexps)\n ) continue;\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) {\n await walk(abs);\n continue;\n }\n if (!entry.isFile()) continue;\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPosix,\n filePath: abs,\n })) continue;\n const st = await stat(abs);\n const baseEntry = base.get(relPosix);\n if (\n options.includeContent !== true &&\n baseEntry &&\n baseCapturedAtMs !== null &&\n await canReuseFastBaseFileStateFromDisk(baseEntry, st, baseCapturedAtMs)\n ) {\n files.push(baseEntry);\n continue;\n }\n files.push(await readOfflineSyncFileRecord({\n root,\n relPath: relPosix,\n filePath: abs,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n signal: options.signal,\n }));\n }\n }\n\n await walk(root.abs);\n throwIfOfflineSyncAborted(options.signal);\n\n const sortedFiles = files.sort(compareByPath);\n const deletions = snapshotBuilderDeletions({\n deletions: options.deletions,\n files: sortedFiles,\n includeTranscripts,\n excludeNodeLocalState: options.excludeNodeLocalState,\n userExcludeRegexps: options.userExcludeRegexps,\n });\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: sortedFiles,\n ...(deletions === undefined ? {} : { deletions }),\n };\n}\n\nexport async function buildOfflineSyncSnapshotForPaths(options: {\n root: string;\n sourceId: string;\n paths: readonly string[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n includeContent?: boolean;\n includeTranscripts?: boolean;\n now?: Date;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n signal?: AbortSignal;\n}): Promise<OfflineSyncSnapshot> {\n throwIfOfflineSyncAborted(options.signal);\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"buildOfflineSyncSnapshotForPaths\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const files: OfflineSyncFileRecord[] = [];\n const seen = new Set<string>();\n\n for (const rawPath of options.paths) {\n throwIfOfflineSyncAborted(options.signal);\n const relPath = normalizeRelativePath(rawPath, \"paths[]\");\n if (seen.has(relPath)) continue;\n seen.add(relPath);\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPath, includeTranscripts)\n : shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)\n ) {\n throw new Error(`offline sync snapshot path is excluded: ${relPath}`);\n }\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) continue;\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPath,\n filePath,\n })) {\n throw new Error(`offline sync snapshot path is excluded: ${relPath}`);\n }\n files.push(await readOfflineSyncFileRecord({\n root,\n relPath,\n filePath,\n includeContent: options.includeContent === true,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n signal: options.signal,\n }));\n }\n throwIfOfflineSyncAborted(options.signal);\n\n const sortedFiles = files.sort(compareByPath);\n const deletions = snapshotBuilderDeletions({\n deletions: options.deletions,\n files: sortedFiles,\n paths: [...seen],\n includeTranscripts,\n excludeNodeLocalState: options.excludeNodeLocalState,\n userExcludeRegexps: options.userExcludeRegexps,\n });\n return {\n format: OFFLINE_SYNC_SNAPSHOT_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n files: sortedFiles,\n ...(deletions === undefined ? {} : { deletions }),\n };\n}\n\nexport async function readOfflineSyncFileContentChunk(options: {\n root: string;\n path: string;\n offset?: number;\n length?: number;\n includeTranscripts?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n excludeFile?: OfflineSyncExcludeFile;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n}): Promise<OfflineSyncFileContentChunk> {\n const rootAbs = path.resolve(options.root);\n const root = await prepareSafeArchiveRoot(rootAbs, \"readOfflineSyncFileContentChunk\", \"root\");\n const includeTranscripts = options.includeTranscripts !== false;\n const relPath = normalizeRelativePath(options.path, \"path\");\n if (\n options.excludeNodeLocalState === false\n ? shouldExcludeRelPath(relPath, includeTranscripts)\n : shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)\n ) {\n throw new Error(`offline sync file content path is excluded: ${relPath}`);\n }\n const offset = options.offset === undefined\n ? 0\n : assertNonNegativeInteger(options.offset, \"offset\");\n const requestedLength = options.length === undefined\n ? OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES\n : assertNonNegativeInteger(options.length, \"length\");\n if (requestedLength < 1 || requestedLength > OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES) {\n throw new Error(\n `length must be an integer from 1 to ${OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES}`,\n );\n }\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) {\n throw new Error(`offline sync file content path not found: ${relPath}`);\n }\n if (await shouldExcludeOfflineSyncFile(options.excludeFile, {\n root: root.abs,\n path: relPath,\n filePath,\n })) {\n throw new Error(`offline sync file content path is excluded: ${relPath}`);\n }\n const encrypted = await isEncryptedOfflineSyncFile(filePath);\n if (!encrypted) {\n if (offset > st.size) {\n throw new Error(`offset must be <= file size for ${relPath}`);\n }\n const chunk = await readPlainOfflineSyncFileChunk({\n filePath,\n offset,\n length: requestedLength,\n bytes: st.size,\n });\n return {\n path: relPath,\n bytes: st.size,\n mtimeMs: st.mtimeMs,\n offset,\n chunkBytes: chunk.length,\n content: chunk,\n };\n }\n if (!options.readFile) {\n throw new Error(`offline sync file content requires a secure-store read hook: ${relPath}`);\n }\n const content = await options.readFile({ root: root.abs, path: relPath, filePath });\n if (offset > content.length) {\n throw new Error(`offset must be <= file size for ${relPath}`);\n }\n const digest = sha256Buffer(content);\n const end = Math.min(content.length, offset + requestedLength);\n const chunk = content.subarray(offset, end);\n return {\n path: relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n offset,\n chunkBytes: chunk.length,\n content: Buffer.from(chunk),\n };\n}\n\nexport async function buildOfflineSyncChangeset(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n baseCapturedAt?: Date;\n excludePaths?: readonly string[];\n includeTranscripts?: boolean;\n now?: Date;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n}): Promise<OfflineSyncChangeset> {\n const includeTranscripts = options.includeTranscripts !== false;\n const current = await buildOfflineSyncSnapshotFromBase({\n root: options.root,\n sourceId: options.sourceId,\n baseFiles: options.baseFiles,\n deletions: options.deletions,\n baseCapturedAt: options.baseCapturedAt,\n includeContent: false,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n return buildOfflineSyncChangesetFromSnapshot({\n root: options.root,\n sourceId: options.sourceId,\n baseFiles: options.baseFiles,\n currentFiles: current.files,\n deletions: current.deletions,\n excludePaths: options.excludePaths,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n });\n}\n\nexport async function buildOfflineSyncChangesetFromSnapshot(options: {\n root: string;\n sourceId: string;\n currentFiles: readonly OfflineSyncFileState[];\n baseFiles?: readonly OfflineSyncFileState[];\n deletions?: readonly OfflineSyncDeletionRevision[];\n excludePaths?: readonly string[];\n includeTranscripts?: boolean;\n now?: Date;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<OfflineSyncChangeset> {\n const includeTranscripts = options.includeTranscripts !== false;\n const excludedPaths = new Set(\n (options.excludePaths ?? []).map((relPath) => normalizeRelativePath(relPath, \"excludePaths[]\")),\n );\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const currentMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.currentFiles),\n includeTranscripts,\n ));\n const deletions = normalizeDeletionRevisions(options.deletions, \"deletions\");\n const deletionMtimeByPath = deletions === undefined\n ? undefined\n : new Map(deletions.map((deletion) => [deletion.path, deletion.mtimeMs] as const));\n const changes: OfflineSyncChange[] = [];\n\n for (const relPath of unionPaths(base, currentMap)) {\n if (excludedPaths.has(relPath)) continue;\n // Issue #1786: node-local runtime state must never appear in a push-side\n // changeset — each node rebuilds it from synced records.\n if (shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)) continue;\n // Runtime state is remote-authoritative in offline sync: local edits and\n // deletes are not pushed; the pull phase restores or removes these files\n // from the remote snapshot.\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) continue;\n const baseEntry = base.get(relPath);\n const currentEntry = currentMap.get(relPath);\n if (currentEntry && currentEntry.sha256 !== baseEntry?.sha256) {\n const file = await buildOfflineSyncSnapshotForPaths({\n root: options.root,\n sourceId: options.sourceId,\n paths: [relPath],\n includeContent: true,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n });\n const record = file.files[0];\n if (!record || typeof record.contentBase64 !== \"string\" || record.sha256 !== currentEntry.sha256) {\n throw new Error(`offline sync file changed while building changeset: ${relPath}`);\n }\n changes.push({\n type: \"upsert\",\n path: relPath,\n ...(baseEntry ? { baseSha256: baseEntry.sha256 } : {}),\n file: record as OfflineSyncFileRecord & { contentBase64: string },\n });\n continue;\n }\n if (!currentEntry && baseEntry) {\n const mtimeMs = deletionMtimeByPath?.get(relPath);\n changes.push({\n type: \"delete\",\n path: relPath,\n baseSha256: baseEntry.sha256,\n ...(mtimeMs === undefined ? {} : { mtimeMs }),\n });\n }\n }\n\n return {\n format: OFFLINE_SYNC_CHANGESET_FORMAT,\n schemaVersion: 1,\n createdAt: (options.now ?? new Date()).toISOString(),\n sourceId: normalizeSourceId(options.sourceId, \"sourceId\"),\n includeTranscripts,\n changes: changes.sort(compareByPath),\n };\n}\n\nexport function summarizeOfflineSyncChangeset(\n changeset: OfflineSyncChangeset,\n): OfflineSyncChangesetSummary {\n const upserts = changeset.changes.filter((change) => change.type === \"upsert\").length;\n const deletes = changeset.changes.filter((change) => change.type === \"delete\").length;\n return {\n upserts,\n deletes,\n total: changeset.changes.length,\n };\n}\n\nexport async function summarizeOfflineSyncPendingChanges(options: {\n root: string;\n sourceId: string;\n baseFiles?: readonly OfflineSyncFileState[];\n baseCapturedAt?: Date;\n includeTranscripts?: boolean;\n now?: Date;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n}): Promise<OfflineSyncChangesetSummary> {\n const includeTranscripts = options.includeTranscripts !== false;\n const current = await buildOfflineSyncSnapshotFromBase({\n root: options.root,\n sourceId: options.sourceId,\n baseFiles: options.baseFiles,\n baseCapturedAt: options.baseCapturedAt,\n includeContent: false,\n includeTranscripts,\n now: options.now,\n userExcludeRegexps: options.userExcludeRegexps,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n return summarizeOfflineSyncPendingFiles({\n baseFiles: options.baseFiles,\n currentFiles: current.files,\n includeTranscripts,\n userExcludeRegexps: options.userExcludeRegexps,\n });\n}\n\nexport function summarizeOfflineSyncPendingFiles(options: {\n baseFiles?: readonly OfflineSyncFileState[];\n currentFiles: readonly OfflineSyncFileState[];\n includeTranscripts?: boolean;\n userExcludeRegexps?: readonly RegExp[];\n /**\n * When false, enumeration uses only the legacy structural excludes —\n * the apply/pull-side view of local files. Push-side callers keep the\n * default (true): built-in node-local state excludes + user excludes.\n * (Cursor review on PR #1793: apply-side local enumeration must see\n * files like state/lcm.sqlite or merges misclassify them.)\n */\n excludeNodeLocalState?: boolean;\n}): OfflineSyncChangesetSummary {\n const includeTranscripts = options.includeTranscripts !== false;\n const base = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n includeTranscripts,\n ));\n const currentMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.currentFiles),\n includeTranscripts,\n ));\n let upserts = 0;\n let deletes = 0;\n for (const relPath of unionPaths(base, currentMap)) {\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) continue;\n if (shouldExcludePushRelPath(relPath, includeTranscripts, options.userExcludeRegexps)) continue;\n const baseEntry = base.get(relPath);\n const currentEntry = currentMap.get(relPath);\n if (currentEntry && currentEntry.sha256 !== baseEntry?.sha256) {\n upserts += 1;\n continue;\n }\n if (!currentEntry && baseEntry) {\n deletes += 1;\n }\n }\n\n return {\n upserts,\n deletes,\n total: upserts + deletes,\n };\n}\n\nexport async function applyOfflineSyncSnapshot(options: {\n root: string;\n snapshot: unknown;\n baseFiles?: readonly OfflineSyncFileState[];\n currentFiles?: readonly OfflineSyncFileState[];\n deferredPaths?: readonly string[];\n allowMissingConflictContent?: boolean;\n writeConflictCopies?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;\n recordDeletionRevision?: OfflineSyncRecordDeletionRevision;\n}): Promise<OfflineSyncApplySnapshotResult> {\n const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);\n const baseMap = byPath(filterBaseFilesForMode(\n normalizeFileStates(options.baseFiles),\n snapshot.includeTranscripts,\n ));\n const incomingMap = byPath(snapshot.files);\n const deletionMtimeByPath = snapshot.deletions === undefined\n ? undefined\n : new Map(snapshot.deletions.map((deletion) => [deletion.path, deletion.mtimeMs] as const));\n const incomingBuffers = verifyRecordContents(snapshot.files, \"offline sync snapshot\", {\n requireContent: false,\n });\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncSnapshot\");\n const currentFiles = options.currentFiles\n ? filterBaseFilesForMode(normalizeFileStates(options.currentFiles), snapshot.includeTranscripts).sort(compareByPath)\n : (await buildOfflineSyncSnapshot({\n root: root.abs,\n sourceId: \"local\",\n includeContent: false,\n includeTranscripts: snapshot.includeTranscripts,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n excludeNodeLocalState: false,\n })).files;\n const currentMap = byPath(currentFiles);\n const deferredPaths = new Set(options.deferredPaths ?? []);\n if (deletionMtimeByPath && options.recordDeletionRevision) {\n for (const [relPath, mtimeMs] of deletionMtimeByPath) {\n if (\n currentMap.has(relPath) ||\n deferredPaths.has(relPath) ||\n matchesOfflineSyncDefaultExclude(relPath)\n ) {\n continue;\n }\n await options.recordDeletionRevision({\n root: root.abs,\n path: relPath,\n filePath: await resolveSafeArchiveTarget(root, relPath),\n mtimeMs,\n });\n }\n }\n const nextBase = new Map(baseMap);\n const conflicts: OfflineSyncConflict[] = [];\n let upserted = 0;\n let deleted = 0;\n let skipped = 0;\n let pendingLocal = 0;\n const conflictIncomingBuffer = (relPath: string): Buffer | undefined => {\n if (options.writeConflictCopies === false) return undefined;\n const buffer = incomingBuffers.get(relPath);\n if (buffer || options.allowMissingConflictContent === true) return buffer;\n return requiredBuffer(incomingBuffers, relPath);\n };\n\n for (const relPath of unionPaths(baseMap, incomingMap, currentMap)) {\n const base = baseMap.get(relPath);\n const incoming = incomingMap.get(relPath);\n const currentEntry = currentMap.get(relPath);\n\n if (deferredPaths.has(relPath)) {\n if (base) nextBase.set(relPath, base);\n else nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n\n if (incoming) {\n if (currentEntry?.sha256 === incoming.sha256) {\n if (await setSafeFileMtime(root, relPath, incoming.mtimeMs)) {\n nextBase.set(relPath, toFileState(incoming));\n } else {\n if (base) nextBase.set(relPath, base);\n else nextBase.delete(relPath);\n pendingLocal += 1;\n }\n skipped += 1;\n continue;\n }\n if (shouldPreferIncomingOfflineRuntimeFile(relPath) && currentEntry && base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n skipped += 1;\n continue;\n }\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile, incoming.mtimeMs);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (!currentEntry && base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n if (!currentEntry && base && incoming.sha256 !== base.sha256) {\n conflicts.push(await recordConflict({\n root,\n relPath,\n reason: \"local_deleted_remote_modified\",\n baseSha256: base.sha256,\n incomingSha256: incoming.sha256,\n incomingBuffer: conflictIncomingBuffer(relPath),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: snapshot.sourceId,\n writeFile: options.writeFile,\n }));\n nextBase.set(relPath, base);\n continue;\n }\n if (!currentEntry && !base) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile, incoming.mtimeMs);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (base && currentEntry && currentEntry.sha256 === base.sha256) {\n await writeSafeFile(root, relPath, requiredBuffer(incomingBuffers, relPath), options.writeFile, incoming.mtimeMs);\n nextBase.set(relPath, toFileState(incoming));\n upserted += 1;\n continue;\n }\n if (base && incoming.sha256 === base.sha256) {\n nextBase.set(relPath, base);\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath,\n reason: base ? \"both_modified\" : \"remote_exists_for_local_create\",\n baseSha256: base?.sha256,\n localSha256: currentEntry?.sha256,\n incomingSha256: incoming.sha256,\n incomingBuffer: conflictIncomingBuffer(relPath),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: snapshot.sourceId,\n writeFile: options.writeFile,\n }));\n if (base) nextBase.set(relPath, base);\n continue;\n }\n\n // Node-local runtime state (#1786): a push-filtered remote snapshot\n // never carries these paths, so their absence is NOT a delete\n // instruction. Drop any stale base entry (pre-#1786 state files still\n // carry them) and leave the local file untouched — deleting a live\n // sqlite WAL/SHM here would corrupt the local LCM store.\n if (matchesOfflineSyncDefaultExclude(relPath)) {\n nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n if (!currentEntry) {\n nextBase.delete(relPath);\n skipped += 1;\n continue;\n }\n if (\n shouldPreferIncomingOfflineRuntimeFile(relPath) &&\n (base || shouldDeleteAbsentIncomingOfflineRuntimeFile(relPath))\n ) {\n await deleteSafeFile(\n root,\n relPath,\n options.deleteFile,\n deletionMtimeByPath?.get(relPath),\n );\n nextBase.delete(relPath);\n deleted += 1;\n continue;\n }\n if (shouldPreferIncomingOfflineRuntimeFile(relPath)) {\n pendingLocal += 1;\n skipped += 1;\n continue;\n }\n if (base && currentEntry.sha256 === base.sha256) {\n await deleteSafeFile(\n root,\n relPath,\n options.deleteFile,\n deletionMtimeByPath?.get(relPath),\n );\n nextBase.delete(relPath);\n deleted += 1;\n continue;\n }\n if (base) {\n conflicts.push({\n path: relPath,\n reason: \"local_modified_remote_deleted\",\n baseSha256: base.sha256,\n localSha256: currentEntry.sha256,\n });\n nextBase.set(relPath, base);\n continue;\n }\n pendingLocal += 1;\n skipped += 1;\n }\n\n return {\n upserted,\n deleted,\n skipped,\n pendingLocal,\n conflicts,\n nextBaseFiles: [...nextBase.values()].sort(compareByPath),\n };\n}\n\nexport async function applyOfflineSyncChangeset(options: {\n root: string;\n changeset: unknown;\n currentFiles?: readonly OfflineSyncFileState[];\n returnCurrentFiles?: boolean;\n writeConflictCopies?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>;\n recordDeletionRevision?: OfflineSyncRecordDeletionRevision;\n}): Promise<OfflineSyncApplyChangesetResult> {\n let changeset: OfflineSyncChangeset;\n try {\n changeset = normalizeOfflineSyncChangeset(options.changeset);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n message.startsWith(\"offline sync\")\n ? message\n : `offline sync changeset invalid: ${message}`,\n );\n }\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncChangeset\");\n const records = changeset.changes\n .filter((change): change is Extract<OfflineSyncChange, { type: \"upsert\" }> => change.type === \"upsert\")\n .map((change) => change.file);\n const incomingBuffers = verifyRecordContents(records, \"offline sync changeset\");\n const currentFiles = options.currentFiles\n ? filterBaseFilesForMode(normalizeFileStates(options.currentFiles), changeset.includeTranscripts).sort(compareByPath)\n : (await buildOfflineSyncSnapshotForPaths({\n root: root.abs,\n sourceId: \"local\",\n paths: changeset.changes.map((change) => change.path),\n includeContent: false,\n includeTranscripts: changeset.includeTranscripts,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n excludeNodeLocalState: false,\n })).files;\n const currentMap = byPath(currentFiles);\n const conflicts: OfflineSyncConflict[] = [];\n let appliedUpserts = 0;\n let appliedDeletes = 0;\n let skipped = 0;\n\n for (const change of changeset.changes) {\n const currentEntry = currentMap.get(change.path);\n if (change.type === \"upsert\") {\n if (currentEntry?.sha256 === change.file.sha256) {\n if (await setSafeFileMtime(root, change.path, change.file.mtimeMs)) {\n skipped += 1;\n } else {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile, change.file.mtimeMs);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n }\n continue;\n }\n if (!change.baseSha256) {\n if (!currentEntry) {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile, change.file.mtimeMs);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath: change.path,\n reason: \"remote_exists_for_local_create\",\n localSha256: currentEntry.sha256,\n incomingSha256: change.file.sha256,\n incomingBuffer: incomingBuffers.get(change.path),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: changeset.sourceId,\n writeFile: options.writeFile,\n }));\n continue;\n }\n if (currentEntry?.sha256 === change.baseSha256) {\n await writeSafeFile(root, change.path, requiredBuffer(incomingBuffers, change.path), options.writeFile, change.file.mtimeMs);\n currentMap.set(change.path, toFileState(change.file));\n appliedUpserts += 1;\n continue;\n }\n conflicts.push(await recordConflict({\n root,\n relPath: change.path,\n reason: currentEntry ? \"remote_changed_for_local_update\" : \"remote_deleted_for_local_update\",\n baseSha256: change.baseSha256,\n localSha256: currentEntry?.sha256,\n incomingSha256: change.file.sha256,\n incomingBuffer: incomingBuffers.get(change.path),\n writeConflictCopies: options.writeConflictCopies !== false,\n sourceId: changeset.sourceId,\n writeFile: options.writeFile,\n }));\n continue;\n }\n\n if (!currentEntry) {\n if (change.mtimeMs !== undefined && options.recordDeletionRevision) {\n await options.recordDeletionRevision({\n root: root.abs,\n path: change.path,\n filePath: await resolveSafeArchiveTarget(root, change.path),\n mtimeMs: change.mtimeMs,\n });\n }\n skipped += 1;\n continue;\n }\n if (currentEntry.sha256 === change.baseSha256) {\n await deleteSafeFile(root, change.path, options.deleteFile, change.mtimeMs);\n currentMap.delete(change.path);\n appliedDeletes += 1;\n continue;\n }\n conflicts.push({\n path: change.path,\n reason: \"remote_changed_for_local_delete\",\n baseSha256: change.baseSha256,\n localSha256: currentEntry.sha256,\n });\n }\n\n return {\n appliedUpserts,\n appliedDeletes,\n skipped,\n conflicts,\n currentFiles: options.returnCurrentFiles === false\n ? [...currentMap.values()].sort(compareByPath)\n : (await buildOfflineSyncSnapshot({\n root: root.abs,\n sourceId: \"local\",\n includeContent: false,\n includeTranscripts: changeset.includeTranscripts,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n excludeNodeLocalState: false,\n })).files,\n ...(options.returnCurrentFiles === false ? { currentFilesComplete: false } : {}),\n };\n}\n\nfunction verifyRecordContents(\n records: readonly OfflineSyncFileRecord[],\n context: string,\n options: { requireContent?: boolean } = {},\n): Map<string, Buffer> {\n const buffers = new Map<string, Buffer>();\n for (const record of records) {\n if (typeof record.contentBase64 !== \"string\") {\n if (options.requireContent === false) continue;\n throw new Error(`${context}: contentBase64 is required for ${record.path}`);\n }\n const buffer = Buffer.from(record.contentBase64, \"base64\");\n const digest = sha256Buffer(buffer);\n if (digest.sha256 !== record.sha256 || digest.bytes !== record.bytes) {\n throw new Error(\n `${context}: content checksum mismatch for ${record.path}`,\n );\n }\n buffers.set(record.path, buffer);\n }\n return buffers;\n}\n\nfunction requiredBuffer(buffers: Map<string, Buffer>, relPath: string): Buffer {\n const buffer = buffers.get(relPath);\n if (!buffer) {\n throw new Error(`missing decoded content for ${relPath}`);\n }\n return buffer;\n}\n\nasync function ensureSyncRoot(rootPath: string, errorPrefix: string): Promise<SafeArchiveRoot> {\n const rootAbs = path.resolve(rootPath);\n await mkdir(rootAbs, { recursive: true });\n return prepareSafeArchiveRoot(rootAbs, errorPrefix, \"root\");\n}\n\nfunction byPath<T extends OfflineSyncFileState>(files: readonly T[]): Map<string, T> {\n const out = new Map<string, T>();\n for (const file of files) {\n out.set(validateArchiveRelativePath(file.path, \"offlineSync\"), file);\n }\n return out;\n}\n\nfunction unionPaths(...maps: Array<Map<string, unknown>>): string[] {\n const paths = new Set<string>();\n for (const map of maps) {\n for (const key of map.keys()) paths.add(key);\n }\n return [...paths].sort();\n}\n\nfunction toFileState(file: OfflineSyncFileState): OfflineSyncFileState {\n return {\n path: file.path,\n sha256: file.sha256,\n bytes: file.bytes,\n mtimeMs: file.mtimeMs,\n };\n}\n\nasync function writeSafeFile(\n root: SafeArchiveRoot,\n relPath: string,\n content: Buffer,\n writeFileHook?: (target: OfflineSyncFileWriteTarget) => Promise<void>,\n mtimeMs?: number,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n if (writeFileHook) {\n await writeFileHook({ root: root.abs, path: relPath, filePath: target, content });\n await setSafeFileMtime(root, relPath, mtimeMs);\n return;\n }\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync.${process.pid}.${randomUUID()}.tmp`,\n );\n await writeFile(tmp, content);\n try {\n const targetStat = await lstat(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (targetStat?.isSymbolicLink()) {\n throw new Error(`offline sync target is a symlink: ${relPath}`);\n }\n await rename(tmp, target);\n await setSafeFileMtime(root, relPath, mtimeMs);\n } catch (error) {\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nasync function setSafeFileMtime(\n root: SafeArchiveRoot,\n relPath: string,\n mtimeMs: number | undefined,\n): Promise<boolean> {\n if (mtimeMs === undefined) return true;\n const target = await resolveSafeArchiveTarget(root, relPath);\n const targetStat = await lstat(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!targetStat) return false;\n if (targetStat.isSymbolicLink()) {\n throw new Error(`offline sync target is a symlink: ${relPath}`);\n }\n const targetMtimeMs = assertOfflineSyncMtimeMs(mtimeMs, \"mtimeMs\");\n if (Math.abs(targetStat.mtimeMs - targetMtimeMs) <= OFFLINE_SYNC_FAST_BASE_MTIME_TOLERANCE_MS) {\n return true;\n }\n const mtime = new Date(targetMtimeMs);\n await utimes(target, mtime, mtime);\n return true;\n}\n\n/**\n * Read the local file digest for a single relative path without applying\n * push-side exclude rules. Used by apply-side helpers that need to check\n * the current local state of a path that the push-side exclude would\n * reject (e.g. `state/lcm.sqlite`). Returns `null` if the file does not\n * exist, is not a regular file, or is a symlink.\n */\nasync function readLocalFileState(options: {\n rootAbs: string;\n relPath: string;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n signal?: AbortSignal;\n}): Promise<OfflineSyncFileState | null> {\n const filePath = await resolveSafeArchiveTarget(\n await prepareSafeArchiveRoot(options.rootAbs, \"readLocalFileState\", \"rootAbs\"),\n options.relPath,\n );\n const st = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!st || st.isSymbolicLink() || !st.isFile()) return null;\n throwIfOfflineSyncAborted(options.signal);\n let digest: OfflineSyncFileDigest;\n if (options.readFileDigest) {\n digest = await options.readFileDigest({ root: options.rootAbs, path: options.relPath, filePath });\n } else if (options.readFile) {\n const content = await options.readFile({ root: options.rootAbs, path: options.relPath, filePath });\n digest = sha256Buffer(content);\n } else {\n digest = await sha256OfflineSyncFile(filePath, options.signal);\n }\n throwIfOfflineSyncAborted(options.signal);\n return {\n path: options.relPath,\n sha256: digest.sha256,\n bytes: digest.bytes,\n mtimeMs: st.mtimeMs,\n };\n}\n\nexport async function applyOfflineSyncFileContentChunk(options: {\n root: string;\n sourceId: string;\n path: string;\n sha256: string;\n bytes: number;\n mtimeMs: number;\n offset?: number;\n content: Buffer;\n baseSha256?: string;\n includeTranscripts?: boolean;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n readFileDigest?: (target: OfflineSyncFileTarget) => Promise<OfflineSyncFileDigest>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n writeStagingFile?: (target: OfflineSyncFileStagingWriteTarget) => Promise<void>;\n writeFileChunks?: (target: OfflineSyncFileWriteChunksTarget) => Promise<void>;\n}): Promise<OfflineSyncApplyFileContentChunkResult> {\n const root = await ensureSyncRoot(options.root, \"applyOfflineSyncFileContentChunk\");\n const sourceId = normalizeSourceId(options.sourceId, \"sourceId\");\n const relPath = normalizeRelativePath(options.path, \"path\");\n const includeTranscripts = options.includeTranscripts !== false;\n if (shouldExcludeRelPath(relPath, includeTranscripts)) {\n throw new Error(`offline sync file content path is excluded: ${relPath}`);\n }\n const sha256 = assertSha256(options.sha256, \"sha256\");\n const bytes = assertNonNegativeInteger(options.bytes, \"bytes\");\n const mtimeMs = assertOfflineSyncMtimeMs(options.mtimeMs, \"mtimeMs\");\n const offset = options.offset === undefined\n ? 0\n : assertNonNegativeInteger(options.offset, \"offset\");\n const baseSha256 = options.baseSha256 === undefined\n ? undefined\n : assertSha256(options.baseSha256, \"baseSha256\");\n const preferIncomingRuntimeFile = shouldPreferIncomingOfflineRuntimeFile(relPath);\n if (!Buffer.isBuffer(options.content)) {\n throw new Error(\"content must be a Buffer\");\n }\n if (options.content.length > OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES) {\n throw new Error(\n `content chunk must be ${OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES} bytes or fewer`,\n );\n }\n if (bytes > 0 && options.content.length === 0) {\n throw new Error(\"content chunk must be non-empty before EOF\");\n }\n if (offset > bytes || offset + options.content.length > bytes) {\n throw new Error(`content chunk range exceeds declared file size for ${relPath}`);\n }\n if (options.writeFile && !options.writeFileChunks) {\n throw new Error(\"offline sync upload storage hooks require writeFileChunks\");\n }\n if (options.writeFile && !options.writeStagingFile) {\n throw new Error(\"offline sync upload storage hooks require writeStagingFile\");\n }\n const baseResult = {\n path: relPath,\n sha256,\n bytes,\n mtimeMs,\n offset,\n chunkBytes: options.content.length,\n done: offset + options.content.length === bytes,\n };\n const currentFileConflict = async (\n currentFile: OfflineSyncFileState | undefined,\n ): Promise<{ conflict: OfflineSyncConflict; currentFile?: OfflineSyncFileState } | null> => {\n if (!baseSha256 && currentFile && !preferIncomingRuntimeFile) {\n const conflict = await recordConflict({\n root,\n relPath,\n reason: \"remote_exists_for_local_create\",\n localSha256: currentFile.sha256,\n incomingSha256: sha256,\n writeConflictCopies: false,\n sourceId,\n writeFile: options.writeFile,\n });\n return {\n conflict,\n currentFile,\n };\n }\n if (baseSha256 && currentFile?.sha256 !== baseSha256 && !preferIncomingRuntimeFile) {\n const conflict = await recordConflict({\n root,\n relPath,\n reason: currentFile ? \"remote_changed_for_local_update\" : \"remote_deleted_for_local_update\",\n baseSha256,\n localSha256: currentFile?.sha256,\n incomingSha256: sha256,\n writeConflictCopies: false,\n sourceId,\n writeFile: options.writeFile,\n });\n return {\n conflict,\n ...(currentFile ? { currentFile } : {}),\n };\n }\n return null;\n };\n if (offset === 0) {\n await pruneOfflineUploadStaging(root);\n const currentFile = await readLocalFileState({\n rootAbs: root.abs,\n relPath,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n if (currentFile && currentFile.sha256 === sha256) {\n await setSafeFileMtime(root, relPath, mtimeMs);\n return {\n ...baseResult,\n done: true,\n chunkBytes: 0,\n applied: false,\n skipped: true,\n currentFile: toFileState(currentFile),\n };\n }\n const conflictResult = await currentFileConflict(currentFile ? toFileState(currentFile) : undefined);\n if (conflictResult) {\n return {\n ...baseResult,\n done: true,\n chunkBytes: 0,\n applied: false,\n skipped: false,\n ...conflictResult,\n };\n }\n }\n\n const upload = await writeOfflineUploadChunk({\n root,\n sourceId,\n relPath,\n sha256,\n bytes,\n offset,\n content: options.content,\n readFile: options.readFile,\n writeFile: options.writeFile,\n writeStagingFile: options.writeStagingFile,\n });\n const done = baseResult.done;\n if (!done) {\n return {\n ...baseResult,\n applied: false,\n skipped: false,\n };\n }\n\n const digest = await digestOfflineUploadStagingContent({\n root,\n upload,\n readFile: options.readFile,\n });\n if (digest.sha256 !== sha256 || digest.bytes !== bytes) {\n await cleanupOfflineUpload(upload).catch(() => {});\n throw new Error(`offline sync upload checksum mismatch for ${relPath}`);\n }\n\n const currentFile = await readLocalFileState({\n rootAbs: root.abs,\n relPath,\n readFile: options.readFile,\n readFileDigest: options.readFileDigest,\n });\n const uploadedState: OfflineSyncFileState = {\n path: relPath,\n sha256,\n bytes,\n mtimeMs,\n };\n\n try {\n if (currentFile && currentFile.sha256 === sha256) {\n await setSafeFileMtime(root, relPath, mtimeMs);\n return {\n ...baseResult,\n applied: false,\n skipped: true,\n currentFile: uploadedState,\n };\n }\n\n const conflictResult = await currentFileConflict(currentFile ? toFileState(currentFile) : undefined);\n if (conflictResult) {\n return {\n ...baseResult,\n applied: false,\n skipped: false,\n ...conflictResult,\n };\n }\n\n await writeSafeFileFromUpload(root, relPath, upload, options.readFile, options.writeFileChunks, mtimeMs);\n return {\n ...baseResult,\n applied: true,\n skipped: false,\n currentFile: uploadedState,\n };\n } finally {\n await cleanupOfflineUpload(upload).catch(() => {});\n }\n}\n\nfunction offlineUploadRelPath(options: {\n sourceId: string;\n relPath: string;\n sha256: string;\n bytes: number;\n}): string {\n const key = hashText([\n options.sourceId,\n options.relPath,\n options.sha256,\n String(options.bytes),\n ].join(\"\\0\"));\n return `${SYNC_INTERNAL_DIR}/uploads/${key}.part`;\n}\n\nasync function offlineUploadPath(root: SafeArchiveRoot, options: {\n sourceId: string;\n relPath: string;\n sha256: string;\n bytes: number;\n}): Promise<OfflineUploadStaging> {\n const relPath = offlineUploadRelPath(options);\n return {\n kind: \"single\",\n relPath,\n filePath: await resolveSafeArchiveTarget(root, relPath),\n };\n}\n\nasync function offlineUploadChunkPath(root: SafeArchiveRoot, options: {\n sourceId: string;\n relPath: string;\n sha256: string;\n bytes: number;\n offset: number;\n}): Promise<OfflineUploadStaging> {\n const uploadRelPath = offlineUploadRelPath(options);\n const relPath = `${uploadRelPath}/${String(options.offset).padStart(20, \"0\")}.part`;\n return {\n kind: \"chunks\",\n relPath,\n filePath: await resolveSafeArchiveTarget(root, relPath),\n };\n}\n\nasync function writeOfflineUploadChunk(options: {\n root: SafeArchiveRoot;\n sourceId: string;\n relPath: string;\n sha256: string;\n bytes: number;\n offset: number;\n content: Buffer;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n writeStagingFile?: (target: OfflineSyncFileStagingWriteTarget) => Promise<void>;\n}): Promise<OfflineUploadStaging> {\n if ((options.writeFile || options.writeStagingFile) && !options.readFile) {\n throw new Error(\"offline sync upload chunk storage hooks require readFile\");\n }\n const uploadRoot = {\n ...(await offlineUploadPath(options.root, options)),\n kind: \"chunks\" as const,\n };\n if (options.offset === 0) {\n await rm(uploadRoot.filePath, { recursive: true, force: true }).catch(() => {});\n } else {\n const existing = await stat(uploadRoot.filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!existing || !existing.isDirectory()) {\n throw new Error(`offline sync upload is missing initial chunk for ${options.relPath}`);\n }\n }\n const chunk = await offlineUploadChunkPath(options.root, { ...options, offset: options.offset });\n\n const writeStagingFile = options.writeStagingFile ?? options.writeFile;\n if (writeStagingFile) {\n // Storage-backed services provide these hooks so secure-store deployments\n // keep staged partial uploads encrypted at rest without mutating indexes.\n await writeOfflineUploadContent({\n root: options.root,\n relPath: chunk.relPath,\n filePath: chunk.filePath,\n content: options.content,\n writeFile: writeStagingFile,\n });\n return uploadRoot;\n }\n\n await mkdir(path.dirname(chunk.filePath), { recursive: true });\n const existingChunk = await lstat(chunk.filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (existingChunk?.isSymbolicLink()) {\n throw new Error(`offline sync upload chunk is a symlink: ${chunk.relPath}`);\n }\n await writeFile(chunk.filePath, options.content, { mode: 0o600 });\n return uploadRoot;\n}\n\nasync function pruneOfflineUploadStaging(root: SafeArchiveRoot): Promise<void> {\n const uploadsRelPath = `${SYNC_INTERNAL_DIR}/uploads`;\n const uploadsPath = await resolveSafeArchiveTarget(root, uploadsRelPath);\n const entries = await readdir(uploadsPath, { withFileTypes: true }).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n });\n const now = Date.now();\n await Promise.all(entries.map(async (entry) => {\n if (!/^[a-f0-9]{64}\\.part$/i.test(entry.name)) return;\n const relPath = `${uploadsRelPath}/${entry.name}`;\n const filePath = await resolveSafeArchiveTarget(root, relPath);\n const info = await lstat(filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (!info) return;\n if (now - info.mtimeMs <= OFFLINE_SYNC_UPLOAD_STAGING_MAX_AGE_MS) return;\n await rm(filePath, { recursive: true, force: true });\n }));\n}\n\nasync function* readOfflineUploadStagingChunks(options: {\n root: SafeArchiveRoot;\n upload: OfflineUploadStaging;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): AsyncGenerator<Buffer> {\n if (options.upload.kind === \"single\") {\n yield await readOfflineUploadContent({\n root: options.root,\n relPath: options.upload.relPath,\n filePath: options.upload.filePath,\n readFile: options.readFile,\n });\n return;\n }\n\n const entries = await readdir(options.upload.filePath);\n const chunkNames = entries\n .filter((entry) => /^\\d{20}\\.part$/.test(entry))\n .sort();\n if (chunkNames.length === 0) {\n throw new Error(`offline sync upload is missing chunks for ${options.upload.relPath}`);\n }\n let expectedOffset = 0;\n for (const chunkName of chunkNames) {\n const offset = Number(chunkName.slice(0, 20));\n if (!Number.isSafeInteger(offset) || offset !== expectedOffset) {\n throw new Error(\n `offline sync upload offset mismatch for ${options.upload.relPath}: expected ${expectedOffset}, got ${offset}`,\n );\n }\n const relPath = `${options.upload.relPath}/${chunkName}`;\n const filePath = await resolveSafeArchiveTarget(options.root, relPath);\n const content = await readOfflineUploadContent({\n root: options.root,\n relPath,\n filePath,\n readFile: options.readFile,\n });\n expectedOffset += content.length;\n yield content;\n }\n}\n\nasync function digestOfflineUploadStagingContent(options: {\n root: SafeArchiveRoot;\n upload: OfflineUploadStaging;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<{ sha256: string; bytes: number }> {\n const hash = createHash(\"sha256\");\n let bytes = 0;\n for await (const chunk of readOfflineUploadStagingChunks(options)) {\n hash.update(chunk);\n bytes += chunk.length;\n }\n return { sha256: hash.digest(\"hex\"), bytes };\n}\n\nasync function writeSafeFileFromUpload(\n root: SafeArchiveRoot,\n relPath: string,\n upload: OfflineUploadStaging,\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>,\n writeFileChunks?: (target: OfflineSyncFileWriteChunksTarget) => Promise<void>,\n mtimeMs?: number,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n const chunks = readOfflineUploadStagingChunks({ root, upload, readFile });\n if (writeFileChunks) {\n await writeFileChunks({ root: root.abs, path: relPath, filePath: target, chunks });\n await setSafeFileMtime(root, relPath, mtimeMs);\n return;\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync.${process.pid}.${randomUUID()}.tmp`,\n );\n const handle = await open(tmp, \"w\", 0o600);\n try {\n for await (const chunk of chunks) {\n if (chunk.length > 0) await handle.write(chunk);\n }\n await handle.close();\n const targetStat = await lstat(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (targetStat?.isSymbolicLink()) {\n throw new Error(`offline sync target is a symlink: ${relPath}`);\n }\n await rename(tmp, target);\n await setSafeFileMtime(root, relPath, mtimeMs);\n } catch (error) {\n await handle.close().catch(() => {});\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nasync function cleanupOfflineUpload(upload: OfflineUploadStaging): Promise<void> {\n if (upload.kind === \"chunks\") {\n await rm(upload.filePath, { recursive: true, force: true });\n return;\n }\n await unlink(upload.filePath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw error;\n });\n}\n\nasync function readOfflineUploadContent(options: {\n root: SafeArchiveRoot;\n relPath: string;\n filePath: string;\n readFile?: (target: OfflineSyncFileTarget) => Promise<Buffer>;\n}): Promise<Buffer> {\n if (options.readFile) {\n return options.readFile({\n root: options.root.abs,\n path: options.relPath,\n filePath: options.filePath,\n });\n }\n return readFile(options.filePath);\n}\n\nasync function writeOfflineUploadContent(options: {\n root: SafeArchiveRoot;\n relPath: string;\n filePath: string;\n content: Buffer;\n writeFile: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n}): Promise<void> {\n await options.writeFile({\n root: options.root.abs,\n path: options.relPath,\n filePath: options.filePath,\n content: options.content,\n });\n}\n\nasync function deleteSafeFile(\n root: SafeArchiveRoot,\n relPath: string,\n deleteFile?: (target: OfflineSyncFileDeleteTarget) => Promise<void>,\n mtimeMs?: number,\n): Promise<void> {\n const target = await resolveSafeArchiveTarget(root, relPath);\n if (deleteFile) {\n await deleteFile({\n root: root.abs,\n path: relPath,\n filePath: target,\n ...(mtimeMs === undefined ? {} : { mtimeMs }),\n });\n return;\n }\n await unlink(target).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw error;\n });\n}\n\nasync function recordConflict(options: {\n root: SafeArchiveRoot;\n relPath: string;\n reason: OfflineSyncConflict[\"reason\"];\n baseSha256?: string;\n localSha256?: string;\n incomingSha256?: string;\n incomingBuffer?: Buffer;\n writeConflictCopies: boolean;\n sourceId: string;\n writeFile?: (target: OfflineSyncFileWriteTarget) => Promise<void>;\n}): Promise<OfflineSyncConflict> {\n let conflictPath: string | undefined;\n if (options.writeConflictCopies && options.incomingBuffer) {\n const sourceHash = hashText(options.sourceId).slice(0, 12);\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n conflictPath = `${SYNC_INTERNAL_DIR}/conflicts/${stamp}-${sourceHash}/${options.relPath}`;\n await writeSafeFile(options.root, conflictPath, options.incomingBuffer, options.writeFile);\n }\n return {\n path: options.relPath,\n reason: options.reason,\n baseSha256: options.baseSha256,\n localSha256: options.localSha256,\n incomingSha256: options.incomingSha256,\n ...(conflictPath ? { conflictPath } : {}),\n };\n}\n\nexport function defaultOfflineSyncStatePath(\n memoryDir: string,\n remoteId: string,\n namespace?: string,\n): string {\n const key = hashText(`${remoteId}\\0${namespace ?? \"\"}`).slice(0, 16);\n return path.join(path.resolve(memoryDir), SYNC_INTERNAL_DIR, \"state\", `${key}.json`);\n}\n\nexport async function readOfflineSyncState(\n statePath: string,\n): Promise<OfflineSyncState | null> {\n let raw: string;\n try {\n raw = await readFile(path.resolve(statePath), \"utf-8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n const parsed = JSON.parse(raw) as unknown;\n return normalizeOfflineSyncState(parsed);\n}\n\nexport async function writeOfflineSyncState(\n statePath: string,\n state: OfflineSyncState,\n): Promise<void> {\n const normalized = normalizeOfflineSyncState(state);\n const target = path.resolve(statePath);\n await mkdir(path.dirname(target), { recursive: true });\n const tmp = path.join(\n path.dirname(target),\n `.remnic-sync-state.${process.pid}.${randomUUID()}.tmp`,\n );\n await writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf-8\");\n try {\n await rename(tmp, target);\n } catch (error) {\n await unlink(tmp).catch(() => {});\n throw error;\n }\n}\n\nexport function offlineSyncStateFromSnapshot(options: {\n remoteId: string;\n namespace?: string;\n snapshot: OfflineSyncSnapshot;\n baseFiles?: readonly OfflineSyncFileState[];\n}): OfflineSyncState {\n const snapshot = normalizeOfflineSyncSnapshot(options.snapshot);\n return normalizeOfflineSyncState({\n version: OFFLINE_SYNC_STATE_VERSION,\n remoteId: options.remoteId,\n namespace: options.namespace,\n includeTranscripts: snapshot.includeTranscripts,\n lastSyncedAt: new Date().toISOString(),\n baseFiles: options.baseFiles ?? snapshot.files.map(toFileState),\n });\n}\n\nexport function normalizeOfflineSyncState(input: unknown): OfflineSyncState {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"offline sync state must be an object\");\n }\n const obj = input as Record<string, unknown>;\n if (obj.version !== OFFLINE_SYNC_STATE_VERSION) {\n throw new Error(`offline sync state version must be ${OFFLINE_SYNC_STATE_VERSION}`);\n }\n const namespace =\n typeof obj.namespace === \"string\" && obj.namespace.trim().length > 0\n ? obj.namespace.trim()\n : undefined;\n const baseFiles = normalizeFileStates(obj.baseFiles as readonly unknown[] | undefined)\n .sort(compareByPath);\n assertUniquePaths(baseFiles, \"offline sync state\");\n return {\n version: OFFLINE_SYNC_STATE_VERSION,\n remoteId: normalizeSourceId(obj.remoteId, \"remoteId\"),\n ...(namespace ? { namespace } : {}),\n includeTranscripts: assertBoolean(obj.includeTranscripts, \"includeTranscripts\"),\n lastSyncedAt: normalizeIsoString(obj.lastSyncedAt, \"lastSyncedAt\"),\n baseFiles,\n };\n}\n\nexport function fileStatesFromSnapshot(snapshot: OfflineSyncSnapshot): OfflineSyncFileState[] {\n return normalizeOfflineSyncSnapshot(snapshot).files.map(toFileState).sort(compareByPath);\n}\n"],"mappings":"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","names":["chunk","currentFile","readFile"]}
@@ -3,7 +3,7 @@ import {
3
3
  readNamespaceMaintenanceLastRanStatuses,
4
4
  readNamespaceMaintenanceStatuses,
5
5
  runNamespaceMaintenancePlan
6
- } from "./chunk-V3KIRICY.js";
6
+ } from "./chunk-QQYHYW2N.js";
7
7
  import {
8
8
  analyzeSessionIntegrity,
9
9
  applySessionRepair,
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-CMTINOFS.js";
15
15
  import {
16
16
  summarizeCorpusAndReplica
17
- } from "./chunk-UGHCZS6K.js";
17
+ } from "./chunk-VFZQXYN5.js";
18
18
  import {
19
19
  readJudgeVerdictStats
20
20
  } from "./chunk-OZKOPQCM.js";
@@ -32,29 +32,29 @@ import {
32
32
  } from "./chunk-2DQ2XREU.js";
33
33
  import {
34
34
  runConsolidationProvenanceCheck
35
- } from "./chunk-7KQB4EBS.js";
35
+ } from "./chunk-OPPBTPUU.js";
36
36
  import {
37
37
  reportBufferSurpriseDistribution
38
38
  } from "./chunk-YBPYIAA5.js";
39
39
  import {
40
40
  parseConfig
41
- } from "./chunk-RYST72N5.js";
41
+ } from "./chunk-IINVXO3U.js";
42
42
  import {
43
43
  readAggregateExtractionWatermark
44
- } from "./chunk-YFCEBB5P.js";
44
+ } from "./chunk-QTXNS3HB.js";
45
45
  import {
46
46
  listMemoryGovernanceRuns,
47
47
  readMemoryGovernanceRunArtifact
48
- } from "./chunk-77QZW2D6.js";
48
+ } from "./chunk-3TDAA7VA.js";
49
49
  import {
50
50
  listNamespaces
51
- } from "./chunk-ZUPKNWRZ.js";
51
+ } from "./chunk-MIUL6AUZ.js";
52
52
  import {
53
53
  analyzeGraphHealth
54
54
  } from "./chunk-YMOPYG3K.js";
55
55
  import {
56
56
  StorageManager
57
- } from "./chunk-FHKXVTM5.js";
57
+ } from "./chunk-Q5XKKDFQ.js";
58
58
  import {
59
59
  lintWorkspaceFiles
60
60
  } from "./chunk-DM2T26WE.js";
@@ -1683,4 +1683,4 @@ export {
1683
1683
  runBenchmarkRecall,
1684
1684
  runOperatorRepair
1685
1685
  };
1686
- //# sourceMappingURL=chunk-3Z5TGRFA.js.map
1686
+ //# sourceMappingURL=chunk-3NZAVWU5.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7T4TOGMS.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-IVXVLDNT.js";
6
+ } from "./chunk-WKJTMXME.js";
7
7
 
8
8
  // src/external-wiki-access.ts
9
9
  import { z } from "zod";
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
26
26
  export {
27
27
  externalWikiSearchOperation
28
28
  };
29
- //# sourceMappingURL=chunk-I5FLIB2J.js.map
29
+ //# sourceMappingURL=chunk-3S3PNR5H.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-FHKXVTM5.js";
3
+ } from "./chunk-Q5XKKDFQ.js";
4
4
  import {
5
5
  getCachedRuleMemories,
6
6
  setCachedRuleMemories
@@ -119,4 +119,4 @@ export {
119
119
  compareVerifiedSemanticRuleResults,
120
120
  searchVerifiedSemanticRules
121
121
  };
122
- //# sourceMappingURL=chunk-R6UMNP5C.js.map
122
+ //# sourceMappingURL=chunk-3T6HIIKA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-FHKXVTM5.js";
3
+ } from "./chunk-Q5XKKDFQ.js";
4
4
  import {
5
5
  bumpMemoryCorpusVersionForDir
6
6
  } from "./chunk-XCB6QDL6.js";
@@ -765,4 +765,4 @@ export {
765
765
  listMemoryGovernanceRuns,
766
766
  readMemoryGovernanceRunArtifact
767
767
  };
768
- //# sourceMappingURL=chunk-77QZW2D6.js.map
768
+ //# sourceMappingURL=chunk-3TDAA7VA.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ OUTPUT_LANGUAGE_POLICY
3
+ } from "./chunk-JG22O53B.js";
1
4
  import {
2
5
  normalizeProcedureSteps
3
6
  } from "./chunk-QDW3E4RD.js";
@@ -93,6 +96,7 @@ Rules:
93
96
  2. When in doubt between accept and reject, lean toward accept \u2014 false negatives (losing a useful fact) are worse than false positives (keeping a marginal one).
94
97
  3. Use defer only when another turn of context would genuinely change the verdict.
95
98
  4. Output valid JSON only. No markdown fences, no commentary.
99
+ 5. ${OUTPUT_LANGUAGE_POLICY}
96
100
 
97
101
  Example output:
98
102
  [{"index": 0, "kind": "accept", "durable": true, "reason": "Stable personal preference"}, {"index": 1, "kind": "reject", "durable": false, "reason": "Ephemeral build status"}, {"index": 2, "kind": "defer", "durable": false, "reason": "Ambiguous pronoun"}]`;
@@ -479,6 +483,7 @@ export {
479
483
  isDurableVerdict,
480
484
  isValidCachedVerdict,
481
485
  normalizeCachedVerdict,
486
+ JUDGE_SYSTEM_PROMPT,
482
487
  validateProcedureExtraction,
483
488
  judgeFactDurability,
484
489
  clearVerdictCache,
@@ -486,4 +491,4 @@ export {
486
491
  createVerdictCache,
487
492
  createDeferCountMap
488
493
  };
489
- //# sourceMappingURL=chunk-TWTUGCTY.js.map
494
+ //# sourceMappingURL=chunk-3YTTAGPB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extraction-judge.ts"],"sourcesContent":["/**\n * Extraction Judge — LLM-as-judge fact-worthiness gate (issue #376).\n *\n * Evaluates extracted facts against a durability rubric before they are\n * persisted. Facts that are unlikely to be useful 30+ days from now or\n * across sessions are rejected (or shadow-logged depending on config).\n *\n * Design constraints:\n * - Corrections and principles are auto-approved (safety bypass).\n * - Critical-importance facts are auto-approved.\n * - Batches respect extractionJudgeBatchSize.\n * - Content-hash caching avoids redundant LLM calls.\n * - Performance budget: <= 1.5s per batch.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { log } from \"./logger.js\";\nimport type { PluginConfig, ImportanceLevel } from \"./types.js\";\nimport type { LocalLlmClient } from \"./local-llm.js\";\nimport { type FallbackLlmClient, gatewayTaskChainOptions } from \"./fallback-llm.js\";\nimport { extractJsonCandidates } from \"./json-extract.js\";\nimport { normalizeProcedureSteps } from \"./procedural/procedure-types.js\";\nimport { OUTPUT_LANGUAGE_POLICY } from \"./extraction-prompt.js\";\n\n// ---------------------------------------------------------------------------\n// Public interfaces\n// ---------------------------------------------------------------------------\n\nexport interface JudgeCandidate {\n text: string;\n category: string;\n confidence: number;\n tags?: string[];\n /** Local importance level, set by caller before judging. */\n importanceLevel?: ImportanceLevel;\n}\n\n/**\n * Verdict kinds (issue #562, PR 1).\n *\n * - `\"accept\"`: fact is durable, persist it.\n * - `\"reject\"`: fact is not durable, drop it.\n * - `\"defer\"`: fact is ambiguous; push it back into the buffer for another\n * pass with fresh context. Inspired by MemReader (arxiv 2604.07877).\n *\n * PR 1 only introduces the type. No emit path produces `\"defer\"` yet — the\n * defer-capable prompt, buffer re-routing, telemetry, and GRPO data\n * collection are landing in PRs 2, 3, and 4 respectively.\n */\nexport type JudgeVerdictKind = \"accept\" | \"reject\" | \"defer\";\n\n/**\n * Judge verdict shape.\n *\n * Back-compat note: `kind` is optional. Verdicts serialized before PR 1\n * (both in-memory cache entries and any persisted caches) only carry\n * `{ durable, reason }`. Downstream consumers must either read `durable`\n * directly, or use {@link getVerdictKind} / {@link isDurableVerdict} which\n * gracefully fall back to the boolean when `kind` is missing, and ignore\n * unknown future `kind` values rather than crashing.\n */\nexport interface JudgeVerdict {\n /**\n * True iff the fact should be persisted. For `\"defer\"` verdicts this is\n * `false` — a deferred fact is not (yet) persisted, so callers that only\n * look at `durable` will treat defer as \"skip this turn\", which matches\n * the pre-PR-1 fail-closed behavior for non-accepted verdicts.\n */\n durable: boolean;\n reason: string;\n /**\n * Optional explicit verdict kind. Added in PR 1 of issue #562. Legacy\n * verdicts (including cache entries produced before this field existed)\n * do not set `kind`; use {@link getVerdictKind} to read this safely.\n */\n kind?: JudgeVerdictKind;\n}\n\n/**\n * Resolve a verdict's effective kind.\n *\n * - If `kind` is explicitly set to one of the known values, return it.\n * - If `kind` is absent, infer from `durable` (back-compat with pre-PR-1\n * cache entries and emit paths that have not been updated yet).\n * - If `kind` is set to an unrecognised value (forward-compat, e.g. a\n * future cache entry loaded by an older build), fall back to `durable`\n * so we never crash on unknown strings.\n */\nexport function getVerdictKind(verdict: JudgeVerdict): JudgeVerdictKind {\n const raw = verdict.kind;\n if (raw === \"accept\" || raw === \"reject\" || raw === \"defer\") {\n return raw;\n }\n return verdict.durable ? \"accept\" : \"reject\";\n}\n\n/**\n * Type guard: returns `true` only for verdicts that should be persisted.\n * Treats both `\"reject\"` and `\"defer\"` as \"not durable\" — defer means the\n * caller should re-evaluate later, not write now.\n */\nexport function isDurableVerdict(verdict: JudgeVerdict): boolean {\n return getVerdictKind(verdict) === \"accept\";\n}\n\n/**\n * Validate a cache entry loaded from persistence / another process.\n *\n * Strict: accepts legacy `{ durable, reason }` entries and new entries\n * whose `kind` is one of the three known `JudgeVerdictKind` values.\n * Rejects structurally wrong types and unknown `kind` strings so the\n * type-guard narrowing is sound — callers that receive\n * `value is JudgeVerdict` can safely treat `kind` as the declared\n * union.\n *\n * Forward-compat is handled by {@link normalizeCachedVerdict}, which\n * drops unknown `kind` strings before validation so a newer build's\n * cache entry still loads instead of being rejected.\n */\nexport function isValidCachedVerdict(value: unknown): value is JudgeVerdict {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n if (typeof v.durable !== \"boolean\") return false;\n if (typeof v.reason !== \"string\") return false;\n if (v.kind !== undefined) {\n if (v.kind !== \"accept\" && v.kind !== \"reject\" && v.kind !== \"defer\") {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Forward-compatible cache-entry loader.\n *\n * Drops unknown `kind` strings to `undefined` (so `getVerdictKind` can\n * fall back to `durable`), then validates structurally. Non-string\n * `kind` values are still treated as structural violations and rejected.\n * Returns the sanitised verdict, or `null` when the entry is structurally\n * unusable.\n */\nexport function normalizeCachedVerdict(value: unknown): JudgeVerdict | null {\n if (typeof value !== \"object\" || value === null) return null;\n const v = value as Record<string, unknown>;\n if (typeof v.durable !== \"boolean\") return null;\n if (typeof v.reason !== \"string\") return null;\n let kind: JudgeVerdictKind | undefined;\n if (v.kind !== undefined) {\n if (typeof v.kind !== \"string\") return null;\n if (v.kind === \"accept\" || v.kind === \"reject\" || v.kind === \"defer\") {\n kind = v.kind;\n }\n // Unknown string `kind`: dropped to undefined for forward-compat.\n }\n const out: JudgeVerdict = { durable: v.durable, reason: v.reason };\n if (kind !== undefined) out.kind = kind;\n return out;\n}\n\nexport interface JudgeBatchResult {\n verdicts: Map<number, JudgeVerdict>;\n /** Number of verdicts served from cache. */\n cached: number;\n /** Number of verdicts produced by an LLM call. */\n judged: number;\n /** Total wall-clock time in milliseconds. */\n elapsed: number;\n /**\n * Number of verdicts in this batch that resolved to `\"defer\"` (issue #562,\n * PR 2). Callers can use this to decide whether to retain buffer turns for\n * the next extraction pass.\n */\n deferred: number;\n /**\n * Number of defers that were forcibly converted to `\"reject\"` because the\n * same candidate text had already been deferred at least\n * `extractionJudgeMaxDeferrals` times. Rolled out of `deferred` — a\n * candidate counted here is *not* also in `deferred`.\n */\n deferredCappedToReject: number;\n}\n\n/**\n * Per-verdict observation emitted by `judgeFactDurability` when an\n * `onVerdict` callback is supplied (issue #562, PR 3). Used to wire the\n * observation ledger / telemetry stream without coupling the judge module\n * directly to filesystem I/O. One event is emitted for every resolved\n * verdict, including auto-approved and cache-hit paths.\n */\nexport interface JudgeVerdictObservation {\n verdict: JudgeVerdict;\n /** The original `JudgeCandidate` passed in (same reference). */\n candidate: JudgeCandidate;\n /** SHA-256 of `text\\0category`, same key the cache/deferCounter use. */\n contentHash: string;\n /** Verdict resolution path. Useful for debugging + dashboards. */\n source: \"auto-approve\" | \"cache\" | \"llm\" | \"llm-cap-rejected\" | \"fail-open\";\n /**\n * How many times this candidate had already been deferred before this\n * verdict resolved. 0 when the candidate had never been deferred.\n */\n priorDeferrals: number;\n /**\n * Milliseconds from batch start to now. Shared across verdicts emitted in\n * the same batch.\n */\n elapsedMs: number;\n}\n\n// ---------------------------------------------------------------------------\n// Prompt (embedded; mirrors prompts/extraction_judge.prompt.md)\n// ---------------------------------------------------------------------------\n\nexport const JUDGE_SYSTEM_PROMPT = `You are a memory curator evaluating whether extracted facts are **durable** — worth storing for long-term recall across sessions.\n\nA fact is **durable** if it will still be useful 30+ days from now and is relevant across multiple sessions, not just the current task.\n\nReturn one of three verdicts per candidate:\n\nACCEPT — the fact is durable, persist it:\n- Personal preferences, identities, or relationships\n- Decisions with rationale that affect future work\n- Corrections to previously held beliefs\n- Principles, rules, or constraints the user wants respected\n- Stable facts about projects, tools, or workflows\n- Commitments, deadlines, or obligations\n\nREJECT — the fact is not durable, drop it:\n- Transient task details (\"currently debugging line 42\")\n- Ephemeral state (\"the build is running now\")\n- Routine operations (\"ran npm install\")\n- Conversational filler or acknowledgements\n- Information that will be stale within hours\n- Step-by-step instructions for a one-time task\n\nDEFER — the fact MIGHT be durable but needs more context to decide. The candidate will be re-evaluated on a later extraction pass with fresh context; if it cannot be resolved within a small number of re-evaluations it will be rejected.\n- Ambiguous referents (\"he said they'd follow up on it\")\n- Partial or in-progress statements that might become durable once completed\n- Future-tense commitments whose subject or timeline is unclear\n- Facts whose durability hinges on context not present in the candidate text\n\nDo NOT use defer as a soft reject. Reject facts you are confident are transient. Only defer when another turn of context would genuinely change the verdict.\n\nReturn a JSON array of objects with these fields:\n- index: number (the candidate index)\n- kind: string — one of \"accept\", \"reject\", \"defer\"\n- reason: string (brief explanation, under 80 characters)\n\nYou may also include durable (boolean) for backwards compatibility: true for accept, false for reject or defer. If kind is omitted, durable determines the verdict.\n\nRules:\n1. Return exactly one verdict per input candidate, matched by index.\n2. When in doubt between accept and reject, lean toward accept — false negatives (losing a useful fact) are worse than false positives (keeping a marginal one).\n3. Use defer only when another turn of context would genuinely change the verdict.\n4. Output valid JSON only. No markdown fences, no commentary.\n5. ${OUTPUT_LANGUAGE_POLICY}\n\nExample output:\n[{\"index\": 0, \"kind\": \"accept\", \"durable\": true, \"reason\": \"Stable personal preference\"}, {\"index\": 1, \"kind\": \"reject\", \"durable\": false, \"reason\": \"Ephemeral build status\"}, {\"index\": 2, \"kind\": \"defer\", \"durable\": false, \"reason\": \"Ambiguous pronoun\"}]`;\n\n// ---------------------------------------------------------------------------\n// Content-hash cache (in-memory, per-process fallback)\n// ---------------------------------------------------------------------------\n\n/** Maximum entries before evicting the oldest half. */\nconst VERDICT_CACHE_MAX_SIZE = 10_000;\n\n/** Module-level fallback cache, used when callers do not pass their own. */\nconst defaultVerdictCache = new Map<string, JudgeVerdict>();\n\n/**\n * Per-content-hash deferral counter (issue #562, PR 2).\n *\n * When the judge emits a `\"defer\"` verdict for a candidate whose content\n * has already been deferred `extractionJudgeMaxDeferrals` times, the verdict\n * is forcibly converted to `\"reject\"` so a pathological LLM response cannot\n * produce an infinite defer loop.\n *\n * Module-level with a size cap so stale test state cannot leak between runs\n * in the unlikely case a caller does not clear it between processes.\n */\nconst defaultDeferCounts = new Map<string, number>();\nconst DEFER_COUNT_MAX_SIZE = 20_000;\n\nfunction cacheKey(text: string, category: string): string {\n return createHash(\"sha256\").update(`${text}\\0${category}`).digest(\"hex\");\n}\n\n/**\n * Resolve the effective defer cap from config, defaulting to 2 when the\n * config value is missing or non-positive. Matches the PR 2 spec.\n */\nfunction resolveDeferCap(config: PluginConfig): number {\n const raw = (config as { extractionJudgeMaxDeferrals?: number })\n .extractionJudgeMaxDeferrals;\n if (typeof raw === \"number\" && Number.isFinite(raw) && raw >= 1) {\n return Math.floor(raw);\n }\n return 2;\n}\n\n/**\n * Enforce the max-size invariant on a verdict cache. When the cache exceeds\n * VERDICT_CACHE_MAX_SIZE, the oldest half of entries are deleted (Map\n * iteration order is insertion order).\n */\nfunction enforceMaxCacheSize(cache: Map<string, JudgeVerdict>): void {\n if (cache.size <= VERDICT_CACHE_MAX_SIZE) return;\n const deleteCount = Math.floor(cache.size / 2);\n let deleted = 0;\n for (const key of cache.keys()) {\n if (deleted >= deleteCount) break;\n cache.delete(key);\n deleted++;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Categories that bypass the judge (safety / correctness)\n// ---------------------------------------------------------------------------\n\nconst AUTO_APPROVE_CATEGORIES = new Set([\"correction\", \"principle\"]);\n\n/** Explicit trigger phrasing — procedures must match to persist (issue #519). */\nconst PROCEDURE_TRIGGER_RE =\n /(when you|whenever|before you|before running|always\\s|first\\b.*\\bthen|to deploy|to ship|run these steps|follow these steps|how (i|we)\\s|recipe for|workflow|each time you)/i;\n\n/**\n * Deterministic gate for extracted `procedure` memories: ≥2 steps with non-empty\n * intents and explicit trigger wording in title and/or steps.\n */\nexport function validateProcedureExtraction(input: {\n content: string;\n procedureSteps?: unknown;\n}): JudgeVerdict {\n const steps = normalizeProcedureSteps(input.procedureSteps);\n if (steps.length < 2) {\n return { durable: false, reason: \"Procedure requires at least two steps with intents\" };\n }\n const combined = [input.content, ...steps.map((s) => s.intent)].join(\" \").toLowerCase();\n if (!PROCEDURE_TRIGGER_RE.test(combined)) {\n return { durable: false, reason: \"Procedure missing explicit trigger phrasing\" };\n }\n return { durable: true, reason: \"Procedure structure validated\" };\n}\n\n// ---------------------------------------------------------------------------\n// Core judge function\n// ---------------------------------------------------------------------------\n\n/**\n * Evaluate a batch of candidate facts for durability.\n *\n * Auto-approves corrections, principles, and critical-importance facts.\n * Remaining candidates are batched (up to extractionJudgeBatchSize),\n * checked against an in-memory content-hash cache, and sent to the LLM\n * for verdict.\n */\nexport async function judgeFactDurability(\n candidates: JudgeCandidate[],\n config: PluginConfig,\n localLlm: LocalLlmClient | null,\n fallbackLlm: FallbackLlmClient | null,\n cache?: Map<string, JudgeVerdict>,\n deferCounts?: Map<string, number>,\n onVerdict?: (observation: JudgeVerdictObservation) => void,\n): Promise<JudgeBatchResult> {\n const startMs = Date.now();\n const verdicts = new Map<number, JudgeVerdict>();\n let cached = 0;\n let judged = 0;\n let deferred = 0;\n let deferredCappedToReject = 0;\n\n // Use caller-provided cache for per-orchestrator scoping, or fall back\n // to the module-level default cache.\n const verdictCache = cache ?? defaultVerdictCache;\n const deferCountMap = deferCounts ?? defaultDeferCounts;\n const deferCap = resolveDeferCap(config);\n\n // Lazy emit (Codex P2): when `onVerdict` is undefined (default path —\n // telemetry off), payload construction is skipped entirely. Callers\n // pass a factory instead of a pre-built observation so the `sha256`\n // `contentHash` and surrounding object allocation only run when a\n // subscriber is present. For large batches with telemetry off this\n // removes per-verdict overhead that would otherwise fire on every\n // auto-approved / cache / fail-open path.\n const emit = (build: () => JudgeVerdictObservation): void => {\n if (!onVerdict) return;\n let observation: JudgeVerdictObservation;\n try {\n observation = build();\n } catch (err) {\n log.debug(\n `extraction-judge: onVerdict builder threw (non-fatal): ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n try {\n onVerdict(observation);\n } catch (err) {\n // Fail-open: telemetry errors must never block extraction.\n log.debug(\n `extraction-judge: onVerdict callback threw (non-fatal): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n };\n\n if (candidates.length === 0) {\n return {\n verdicts,\n cached,\n judged,\n elapsed: 0,\n deferred,\n deferredCappedToReject,\n };\n }\n\n // Indices that need LLM judgment\n const pendingIndices: number[] = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const c = candidates[i];\n\n // Auto-approve safety categories\n if (AUTO_APPROVE_CATEGORIES.has(c.category)) {\n const v: JudgeVerdict = {\n durable: true,\n reason: `Auto-approved: ${c.category} category bypasses judge`,\n };\n verdicts.set(i, v);\n emit(() => ({\n verdict: v,\n candidate: c,\n contentHash: cacheKey(c.text, c.category),\n source: \"auto-approve\",\n priorDeferrals: 0,\n elapsedMs: Date.now() - startMs,\n }));\n continue;\n }\n\n // Auto-approve critical importance\n if (c.importanceLevel === \"critical\") {\n const v: JudgeVerdict = {\n durable: true,\n reason: \"Auto-approved: critical importance\",\n };\n verdicts.set(i, v);\n emit(() => ({\n verdict: v,\n candidate: c,\n contentHash: cacheKey(c.text, c.category),\n source: \"auto-approve\",\n priorDeferrals: 0,\n elapsedMs: Date.now() - startMs,\n }));\n continue;\n }\n\n // Check cache\n const key = cacheKey(c.text, c.category);\n const cachedVerdict = verdictCache.get(key);\n if (cachedVerdict) {\n verdicts.set(i, cachedVerdict);\n cached++;\n emit(() => ({\n verdict: cachedVerdict,\n candidate: c,\n contentHash: key,\n source: \"cache\",\n priorDeferrals: deferCountMap.get(key) ?? 0,\n elapsedMs: Date.now() - startMs,\n }));\n continue;\n }\n\n pendingIndices.push(i);\n }\n\n // If all resolved without LLM, return early\n if (pendingIndices.length === 0) {\n return {\n verdicts,\n cached,\n judged,\n elapsed: Date.now() - startMs,\n deferred,\n deferredCappedToReject,\n };\n }\n\n // Batch the pending candidates up to batchSize\n const batchSize = config.extractionJudgeBatchSize;\n for (let batchStart = 0; batchStart < pendingIndices.length; batchStart += batchSize) {\n const batchIndices = pendingIndices.slice(batchStart, batchStart + batchSize);\n const batchPayload = batchIndices.map((idx) => ({\n index: idx,\n text: candidates[idx].text,\n category: candidates[idx].category,\n confidence: candidates[idx].confidence,\n }));\n\n const userPrompt = JSON.stringify(batchPayload);\n\n try {\n const llmResponse = await callJudgeLlm(\n userPrompt,\n config,\n localLlm,\n fallbackLlm,\n );\n\n if (llmResponse) {\n const parsed = parseJudgeResponse(llmResponse, batchIndices);\n // Per-batch defer-increment dedupe (codex P2): a single extraction\n // pass must not advance the cap more than once for identical\n // candidate content, even if the same text appears multiple times\n // in the same LLM response. Duplicate hits share the first\n // increment's `priorDeferrals` snapshot.\n const deferredThisBatch = new Set<string>();\n for (const [idx, rawVerdict] of parsed.entries()) {\n const c = candidates[idx];\n const key = cacheKey(c.text, c.category);\n let verdict = rawVerdict;\n let source: JudgeVerdictObservation[\"source\"] = \"llm\";\n const priorDefers = deferCountMap.get(key) ?? 0;\n\n // Defer cap (issue #562, PR 2). A candidate that has already been\n // deferred `deferCap` times is forcibly rejected so a pathological\n // LLM response cannot produce an infinite defer loop.\n if (getVerdictKind(verdict) === \"defer\") {\n if (priorDefers >= deferCap) {\n verdict = {\n durable: false,\n reason: `Defer cap reached (${deferCap} prior defers); rejecting`,\n kind: \"reject\",\n };\n source = \"llm-cap-rejected\";\n // Only clear + count the cap conversion once per batch for\n // this key — duplicates in the same response all resolve to\n // reject but should not inflate the cap-rejection counter.\n if (!deferredThisBatch.has(key)) {\n deferCountMap.delete(key);\n deferredCappedToReject++;\n deferredThisBatch.add(key);\n }\n } else if (!deferredThisBatch.has(key)) {\n deferCountMap.set(key, priorDefers + 1);\n deferred++;\n deferredThisBatch.add(key);\n // Bound the per-process defer-counter map.\n if (deferCountMap.size > DEFER_COUNT_MAX_SIZE) {\n const drop = Math.floor(deferCountMap.size / 2);\n let dropped = 0;\n for (const k of deferCountMap.keys()) {\n if (dropped >= drop) break;\n deferCountMap.delete(k);\n dropped++;\n }\n }\n }\n // else: duplicate defer for a key already counted this batch —\n // no additional counter increment, verdict still marked defer.\n } else {\n // On accept/reject, clear any outstanding defer counter so a\n // future reappearance of the same text starts fresh.\n deferCountMap.delete(key);\n }\n\n verdicts.set(idx, verdict);\n judged++;\n // Cache non-defer verdicts. Defer is intentionally NOT cached:\n // caching it would short-circuit the re-evaluation pass that is\n // the entire point of the defer verdict.\n if (getVerdictKind(verdict) !== \"defer\") {\n verdictCache.set(key, verdict);\n }\n emit(() => ({\n verdict,\n candidate: c,\n contentHash: key,\n source,\n priorDeferrals: priorDefers,\n elapsedMs: Date.now() - startMs,\n }));\n }\n // Evict oldest entries if cache exceeds max size\n enforceMaxCacheSize(verdictCache);\n }\n } catch (err) {\n // Fail-open: if the LLM call fails, approve all candidates in this batch\n log.warn(\n `extraction-judge: LLM call failed, approving batch (fail-open): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Fill in any missing verdicts from this batch (fail-open: approve).\n // Clear defer counts so a transient outage doesn't leave stale state\n // that causes later defers to hit the cap early.\n for (const idx of batchIndices) {\n if (!verdicts.has(idx)) {\n const c = candidates[idx];\n const hash = cacheKey(c.text, c.category);\n // Capture the prior deferral count BEFORE clearing so the\n // telemetry event reflects the true state rather than always 0.\n const priorDefers = deferCountMap.get(hash) ?? 0;\n deferCountMap.delete(hash);\n const v: JudgeVerdict = {\n durable: true,\n reason: \"Approved by default (judge unavailable or parse error)\",\n };\n verdicts.set(idx, v);\n emit(() => {\n return {\n verdict: v,\n candidate: c,\n contentHash: hash,\n source: \"fail-open\",\n priorDeferrals: priorDefers,\n elapsedMs: Date.now() - startMs,\n };\n });\n }\n }\n }\n\n return {\n verdicts,\n cached,\n judged,\n elapsed: Date.now() - startMs,\n deferred,\n deferredCappedToReject,\n };\n}\n\n// ---------------------------------------------------------------------------\n// LLM call helpers\n// ---------------------------------------------------------------------------\n\nasync function callJudgeLlm(\n userPrompt: string,\n config: PluginConfig,\n localLlm: LocalLlmClient | null,\n fallbackLlm: FallbackLlmClient | null,\n): Promise<string | null> {\n const messages: Array<{ role: \"system\" | \"user\"; content: string }> = [\n { role: \"system\", content: JUDGE_SYSTEM_PROMPT },\n { role: \"user\", content: userPrompt },\n ];\n\n const modelOverride = config.extractionJudgeModel || undefined;\n\n // When modelSource is \"gateway\", skip localLlm and go directly to fallback\n // (the gateway-routed backend). This respects the operator's explicit\n // routing preference.\n const skipLocal = config.modelSource === \"gateway\";\n\n // Route judge-gated extractions through the SAME shared resolution as every\n // other background task (taskModelChain > gatewayAgentId in gateway mode), so\n // the judge never silently falls back to the persona/default chain when a\n // task chain is configured (gotcha #22, #39). Issue #1365 / PR #1425.\n const gatewayChain = gatewayTaskChainOptions(config);\n\n // Try local LLM first (unless modelSource says gateway)\n if (localLlm && !skipLocal) {\n try {\n const result = await (localLlm as any).chatCompletion(messages, {\n temperature: 0.1,\n maxTokens: 2048,\n responseFormat: { type: \"json_object\" },\n timeoutMs: 1500,\n operation: \"extraction-judge\",\n ...(modelOverride ? { model: modelOverride } : {}),\n });\n if (result?.content) {\n return result.content;\n }\n } catch (err) {\n log.debug(\n `extraction-judge: local LLM failed, trying fallback: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Try fallback LLM\n if (fallbackLlm) {\n try {\n const result = await fallbackLlm.chatCompletion(\n messages as Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n {\n temperature: 0.1,\n maxTokens: 2048,\n timeoutMs: 1500,\n ...(modelOverride ? { model: modelOverride } : {}),\n ...gatewayChain,\n },\n );\n if (result?.content) {\n return result.content;\n }\n } catch (err) {\n log.debug(\n `extraction-judge: fallback LLM failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Response parsing\n// ---------------------------------------------------------------------------\n\nfunction parseJudgeResponse(\n raw: string,\n expectedIndices: number[],\n): Map<number, JudgeVerdict> {\n const result = new Map<number, JudgeVerdict>();\n const expectedSet = new Set(expectedIndices);\n\n try {\n // Try direct parse first, then fall back to JSON extraction\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n const candidates = extractJsonCandidates(raw);\n if (candidates.length > 0) {\n parsed = JSON.parse(candidates[0]);\n }\n }\n\n if (!Array.isArray(parsed)) {\n // Might be wrapped in an object with a key\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const values = Object.values(parsed as Record<string, unknown>);\n for (const v of values) {\n if (Array.isArray(v)) {\n parsed = v;\n break;\n }\n }\n }\n if (!Array.isArray(parsed)) {\n log.debug(\"extraction-judge: response is not an array, cannot parse\");\n return result;\n }\n }\n\n for (const item of parsed) {\n if (\n typeof item !== \"object\" ||\n item === null ||\n typeof (item as any).index !== \"number\"\n ) {\n continue;\n }\n const idx = (item as any).index as number;\n if (!expectedSet.has(idx)) continue;\n\n // Parse kind first — it's the primary signal in PR 2 and above.\n // Fall back to durable for pre-PR-2 model responses that only return\n // the boolean.\n let kind: JudgeVerdictKind | undefined;\n const rawKind = (item as any).kind;\n const rawAction = (item as any).action;\n if (rawKind === \"accept\" || rawKind === \"reject\" || rawKind === \"defer\") {\n kind = rawKind;\n } else if (\n rawAction === \"accept\" ||\n rawAction === \"reject\" ||\n rawAction === \"defer\"\n ) {\n // Tolerate `action` as an alias — MemReader uses that word in the\n // paper and models may echo it.\n kind = rawAction;\n }\n\n const hasDurable = typeof (item as any).durable === \"boolean\";\n const durableFromModel = hasDurable\n ? ((item as any).durable as boolean)\n : undefined;\n\n // Resolve the durable flag from kind when present; otherwise trust\n // the model's boolean; otherwise fail-open to durable=true.\n let durable: boolean;\n if (kind === \"accept\") {\n durable = true;\n } else if (kind === \"reject\" || kind === \"defer\") {\n durable = false;\n } else if (durableFromModel !== undefined) {\n durable = durableFromModel;\n } else {\n durable = true; // fail-open\n }\n\n const reason =\n typeof (item as any).reason === \"string\"\n ? ((item as any).reason as string).slice(0, 120)\n : \"No reason provided\";\n\n const verdict: JudgeVerdict = { durable, reason };\n if (kind !== undefined) verdict.kind = kind;\n result.set(idx, verdict);\n }\n } catch (err) {\n log.debug(\n `extraction-judge: failed to parse response: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Cache management (exposed for testing)\n// ---------------------------------------------------------------------------\n\n/** Clear the in-memory default verdict cache. Primarily for tests. */\nexport function clearVerdictCache(): void {\n defaultVerdictCache.clear();\n defaultDeferCounts.clear();\n}\n\n/** Return the current default verdict cache size. Primarily for tests. */\nexport function verdictCacheSize(): number {\n return defaultVerdictCache.size;\n}\n\n/** Create a new per-instance verdict cache. Orchestrators should hold one. */\nexport function createVerdictCache(): Map<string, JudgeVerdict> {\n return new Map();\n}\n\n/**\n * Create a new per-instance defer-counter map. Orchestrators should hold one\n * alongside their verdict cache so defer counts survive across extraction\n * passes within a single orchestrator but do not leak across orchestrators.\n */\nexport function createDeferCountMap(): Map<string, number> {\n return new Map();\n}\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-5JMAGU26.js";
6
6
  import {
7
7
  runPostConsolidationMaterialize
8
- } from "./chunk-YEQCMA5L.js";
8
+ } from "./chunk-BOSIHHOH.js";
9
9
  import {
10
10
  isSemanticConsolidationLlmOperator
11
11
  } from "./chunk-G7D6GZ5J.js";
@@ -220,4 +220,4 @@ export {
220
220
  buildExtensionsBlockForConsolidation,
221
221
  materializeAfterSemanticConsolidation
222
222
  };
223
- //# sourceMappingURL=chunk-DXDAQZ2K.js.map
223
+ //# sourceMappingURL=chunk-42TIIO2M.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getVerdictKind
3
- } from "./chunk-TWTUGCTY.js";
3
+ } from "./chunk-3YTTAGPB.js";
4
4
  import {
5
5
  scoreImportance
6
6
  } from "./chunk-JXS5PDQ7.js";
@@ -1320,4 +1320,4 @@ export {
1320
1320
  syncWearableSource,
1321
1321
  defaultTimezone
1322
1322
  };
1323
- //# sourceMappingURL=chunk-Y7COCXY2.js.map
1323
+ //# sourceMappingURL=chunk-4F67JJPG.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
3
3
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES
4
- } from "./chunk-IVXVLDNT.js";
4
+ } from "./chunk-WKJTMXME.js";
5
5
  import {
6
6
  SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
7
7
  } from "./chunk-XDL5CYZN.js";
@@ -343,4 +343,4 @@ export {
343
343
  parseSupportPassportModelJob,
344
344
  SupportPassportModelBridge
345
345
  };
346
- //# sourceMappingURL=chunk-PB4WVYGC.js.map
346
+ //# sourceMappingURL=chunk-5S5DUJFJ.js.map