@remnic/core 9.43.0 → 9.45.0

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 (258) hide show
  1. package/dist/access-admin-ops-surface.d.ts +5 -5
  2. package/dist/access-admin-ops-surface.js +42 -41
  3. package/dist/access-authorization-probe.d.ts +5 -5
  4. package/dist/access-authorization-probe.js +43 -42
  5. package/dist/access-boundary.d.ts +5 -5
  6. package/dist/access-boundary.js +42 -41
  7. package/dist/access-cli.js +100 -97
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +5 -5
  10. package/dist/access-extraction-force-flush.js +42 -41
  11. package/dist/access-http-lcm-compaction.d.ts +5 -5
  12. package/dist/access-http-lifecycle-flush.d.ts +5 -5
  13. package/dist/access-http-query.d.ts +8 -0
  14. package/dist/access-http-query.js +180 -0
  15. package/dist/access-http.d.ts +5 -5
  16. package/dist/access-http.js +51 -49
  17. package/dist/access-identity-continuity-surface.d.ts +4 -4
  18. package/dist/access-identity-continuity-surface.js +42 -41
  19. package/dist/access-lcm-surface.d.ts +5 -5
  20. package/dist/access-lcm-surface.js +42 -41
  21. package/dist/access-mcp.d.ts +5 -5
  22. package/dist/access-mcp.js +47 -46
  23. package/dist/access-namespace-preflight.js +42 -41
  24. package/dist/access-observe-write-surface.d.ts +5 -5
  25. package/dist/access-observe-write-surface.js +42 -41
  26. package/dist/access-operations-batch.js +44 -43
  27. package/dist/access-operations.d.ts +8 -8
  28. package/dist/access-operations.js +46 -45
  29. package/dist/access-recall-concurrency.d.ts +5 -5
  30. package/dist/access-recall-concurrency.js +42 -41
  31. package/dist/access-recall-response.d.ts +5 -5
  32. package/dist/access-recall-response.js +42 -41
  33. package/dist/access-recall-surface.d.ts +5 -5
  34. package/dist/access-recall-surface.js +42 -41
  35. package/dist/access-schema.d.ts +84 -84
  36. package/dist/access-schema.js +3 -3
  37. package/dist/{access-service-D1BkxwSf.d.ts → access-service-DBo88Dmm.d.ts} +14 -4
  38. package/dist/access-service-helpers.d.ts +5 -5
  39. package/dist/access-service.d.ts +5 -5
  40. package/dist/access-service.js +42 -41
  41. package/dist/access-surface-catalog.d.ts +5 -5
  42. package/dist/access-surface-catalog.js +5 -0
  43. package/dist/access-surface-catalog.js.map +1 -1
  44. package/dist/access-wearables-meetings-surface.d.ts +2 -2
  45. package/dist/{auto-sync-UPTUVE4X.js → auto-sync-5OE5QOZB.js} +3 -3
  46. package/dist/bootstrap.d.ts +4 -4
  47. package/dist/briefing.d.ts +1 -1
  48. package/dist/briefing.js +9 -8
  49. package/dist/buffer.d.ts +1 -1
  50. package/dist/buffer.js +6 -6
  51. package/dist/causal-behavior.js +2 -2
  52. package/dist/causal-chain.js +2 -2
  53. package/dist/causal-consolidation.js +13 -12
  54. package/dist/causal-consolidation.js.map +1 -1
  55. package/dist/causal-retrieval.js +2 -2
  56. package/dist/causal-trajectory-graph.js +2 -2
  57. package/dist/causal-trajectory.js +1 -1
  58. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  59. package/dist/{chunk-CMENJQ6I.js → chunk-2QR2RRH6.js} +2 -2
  60. package/dist/{chunk-ZERSIPFC.js → chunk-3HKQOFOV.js} +22 -20
  61. package/dist/{chunk-ZERSIPFC.js.map → chunk-3HKQOFOV.js.map} +1 -1
  62. package/dist/{chunk-4DYBLQZC.js → chunk-3HLCRYBV.js} +3 -3
  63. package/dist/{chunk-L2DPF4DF.js → chunk-3SHB4YAW.js} +4 -4
  64. package/dist/{chunk-UV72DEZD.js → chunk-4B77XSG5.js} +5 -5
  65. package/dist/{chunk-GUQYMOPU.js → chunk-4LMA77JH.js} +5 -5
  66. package/dist/{chunk-Q53RLEW7.js → chunk-5SM35XZR.js} +2 -2
  67. package/dist/{chunk-YJHU5B3M.js → chunk-5YGO5VEH.js} +2 -2
  68. package/dist/{chunk-AX2J2LC4.js → chunk-5ZE7QHTK.js} +2 -2
  69. package/dist/{chunk-5QZEVMLY.js → chunk-65V4K4MT.js} +56 -38
  70. package/dist/chunk-65V4K4MT.js.map +1 -0
  71. package/dist/{chunk-YFHMW37V.js → chunk-6CZPDBJS.js} +5 -5
  72. package/dist/{chunk-BI6RE2ZS.js → chunk-6OLQJJYE.js} +2 -2
  73. package/dist/chunk-6UWB5PTR.js +413 -0
  74. package/dist/chunk-6UWB5PTR.js.map +1 -0
  75. package/dist/chunk-6ZYQ36IB.js +30 -0
  76. package/dist/chunk-6ZYQ36IB.js.map +1 -0
  77. package/dist/{chunk-GS5UVGQK.js → chunk-7JO6RVBI.js} +6 -6
  78. package/dist/{chunk-MBTPUVHZ.js → chunk-7PVFOFPJ.js} +2 -2
  79. package/dist/{chunk-KPJQTSRJ.js → chunk-C7EI7CA6.js} +2 -2
  80. package/dist/{chunk-NRV4Y3PM.js → chunk-CAGPP5NB.js} +1 -1
  81. package/dist/{chunk-NF3U3MPG.js → chunk-ECK75GDJ.js} +2 -2
  82. package/dist/{chunk-KDXD2AM6.js → chunk-FLBPATMZ.js} +44 -44
  83. package/dist/{chunk-OEXKYYVH.js → chunk-FVGQ5LIS.js} +6 -6
  84. package/dist/{chunk-AR2FSZBP.js → chunk-G24XIK6H.js} +2 -2
  85. package/dist/{chunk-5TOV3D6U.js → chunk-GBJJUPNV.js} +6 -6
  86. package/dist/{chunk-UP67AFRN.js → chunk-GOPWZYZH.js} +29 -29
  87. package/dist/chunk-GOPWZYZH.js.map +1 -0
  88. package/dist/{chunk-EPQ76W5T.js → chunk-GQBZ7EVF.js} +2 -2
  89. package/dist/{chunk-BGXHVOBI.js → chunk-HLPD7B7P.js} +2 -2
  90. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  91. package/dist/{chunk-JDXDA5OO.js → chunk-J4OKD6QX.js} +2 -2
  92. package/dist/{chunk-LZ5JKQCS.js → chunk-JZ7SSAQ5.js} +3 -3
  93. package/dist/chunk-K6OTW3TP.js +24 -0
  94. package/dist/chunk-K6OTW3TP.js.map +1 -0
  95. package/dist/{chunk-EHKDORQN.js → chunk-NVRYW264.js} +9 -9
  96. package/dist/{chunk-MU7ZHSZE.js → chunk-PO5LSKQO.js} +2 -2
  97. package/dist/{chunk-ONHRRJZM.js → chunk-QJAQNXWI.js} +6 -6
  98. package/dist/{chunk-WGCTFGLW.js → chunk-QQ3NDJOM.js} +3 -3
  99. package/dist/{chunk-BEQOZOYZ.js → chunk-RVLJEII5.js} +30 -511
  100. package/dist/chunk-RVLJEII5.js.map +1 -0
  101. package/dist/chunk-S5SLVSVY.js +517 -0
  102. package/dist/chunk-S5SLVSVY.js.map +1 -0
  103. package/dist/{chunk-QY66HJ4X.js → chunk-SS7YWVPF.js} +5 -5
  104. package/dist/{chunk-ZVVASRUT.js → chunk-U5G66ORD.js} +90 -88
  105. package/dist/chunk-U5G66ORD.js.map +1 -0
  106. package/dist/{chunk-JYIFGGEM.js → chunk-UZGJFIIG.js} +2 -2
  107. package/dist/{chunk-NHRNYJPJ.js → chunk-VCGPO2VD.js} +7 -7
  108. package/dist/{chunk-F2KMAFEB.js → chunk-VRYJSKOM.js} +2 -2
  109. package/dist/{chunk-HNZKVLAN.js → chunk-W6ROK2KU.js} +2 -2
  110. package/dist/{chunk-SEUSFKNS.js → chunk-WC4SPYHX.js} +14 -14
  111. package/dist/{chunk-MSXWUXFE.js → chunk-WG2PI44B.js} +2 -2
  112. package/dist/{chunk-4VXGRIH6.js → chunk-WUNIWKY4.js} +5 -5
  113. package/dist/{chunk-3C2TGBDB.js → chunk-XFQRFWVS.js} +2 -2
  114. package/dist/{chunk-5N26WBPQ.js → chunk-XMZV27S5.js} +5 -5
  115. package/dist/{chunk-JGXXPDM2.js → chunk-YQQK7W7T.js} +3 -3
  116. package/dist/{chunk-3F2LKUMU.js → chunk-ZAB5PG65.js} +2 -2
  117. package/dist/{chunk-MVW234LO.js → chunk-ZPJJE7MF.js} +2 -2
  118. package/dist/{chunk-6GIMMNVK.js → chunk-ZS5UZU5M.js} +4 -4
  119. package/dist/{cli-IUhV-lmk.d.ts → cli-DQ4VhjqX.d.ts} +3 -3
  120. package/dist/cli.d.ts +6 -6
  121. package/dist/cli.js +69 -67
  122. package/dist/compounding/engine.d.ts +1 -1
  123. package/dist/compounding/engine.js +9 -8
  124. package/dist/connectors/codex-materialize-runner.js +9 -8
  125. package/dist/connectors/index.js +9 -8
  126. package/dist/consolidation-provenance-check.d.ts +1 -1
  127. package/dist/consolidation-undo.d.ts +1 -1
  128. package/dist/contradiction/index.d.ts +1 -1
  129. package/dist/convergence-refresh.d.ts +24 -0
  130. package/dist/convergence-refresh.js +75 -0
  131. package/dist/convergence-refresh.js.map +1 -0
  132. package/dist/conversation-index/backend.js +2 -2
  133. package/dist/corpus-watermark.js +20 -19
  134. package/dist/entity-retrieval.d.ts +1 -1
  135. package/dist/entity-retrieval.js +9 -8
  136. package/dist/explicit-capture.d.ts +4 -4
  137. package/dist/explicit-capture.js +4 -3
  138. package/dist/extraction.js +15 -14
  139. package/dist/{graph-edge-decay-Z6ENALU2.js → graph-edge-decay-GF3ZSGSP.js} +4 -4
  140. package/dist/graph-edge-decay-GF3ZSGSP.js.map +1 -0
  141. package/dist/graph-snapshot.js +3 -3
  142. package/dist/graph.js +2 -2
  143. package/dist/index.d.ts +398 -398
  144. package/dist/index.js +161 -158
  145. package/dist/lcm/index.js +3 -3
  146. package/dist/maintenance/memory-governance.js +10 -9
  147. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +1 -1
  148. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +9 -8
  149. package/dist/maintenance/rebuild-memory-projection.d.ts +1 -1
  150. package/dist/maintenance/rebuild-memory-projection.js +11 -10
  151. package/dist/{maintenance-DVBLXkFw.d.ts → maintenance-_RV38GlE.d.ts} +1 -1
  152. package/dist/mcp-memory-inspector-app.d.ts +5 -5
  153. package/dist/memory-worth-outcomes.d.ts +1 -1
  154. package/dist/namespaces/migrate.d.ts +1 -1
  155. package/dist/namespaces/migrate.js +19 -18
  156. package/dist/namespaces/search.js +9 -9
  157. package/dist/namespaces/storage.d.ts +1 -1
  158. package/dist/namespaces/storage.js +9 -8
  159. package/dist/offline-sync-impression-drain.js +4 -4
  160. package/dist/operator-doctor-corpus.js +21 -20
  161. package/dist/operator-toolkit.d.ts +1 -1
  162. package/dist/operator-toolkit.js +30 -29
  163. package/dist/orchestration/compression-guideline-coordinator.d.ts +1 -1
  164. package/dist/orchestration/maintenance.d.ts +2 -2
  165. package/dist/orchestration/maintenance.js +16 -15
  166. package/dist/{orchestrator-fYTncnLy.d.ts → orchestrator-B2ecFpRO.d.ts} +4 -4
  167. package/dist/orchestrator.d.ts +4 -4
  168. package/dist/orchestrator.js +101 -98
  169. package/dist/qmd.js +4 -4
  170. package/dist/reconcile/manifest.d.ts +33 -0
  171. package/dist/reconcile/manifest.js +248 -0
  172. package/dist/reconcile/manifest.js.map +1 -0
  173. package/dist/reconcile/plan.d.ts +1 -1
  174. package/dist/reconcile/plan.js +8 -404
  175. package/dist/reconcile/plan.js.map +1 -1
  176. package/dist/resume-bundles.js +1 -1
  177. package/dist/schemas.d.ts +76 -76
  178. package/dist/search/factory.js +8 -8
  179. package/dist/search/index.js +14 -14
  180. package/dist/semantic-consolidation.js +11 -10
  181. package/dist/semantic-rule-promotion.js +9 -8
  182. package/dist/semantic-rule-verifier.js +10 -9
  183. package/dist/{service-CLuMO-pa.d.ts → service-DW06sY3P.d.ts} +1 -1
  184. package/dist/shared-context/manager.d.ts +8 -8
  185. package/dist/source-agent-qualifier.js +14 -13
  186. package/dist/{storage-Blr71GpS.d.ts → storage-qRIQPA6F.d.ts} +12 -0
  187. package/dist/storage.d.ts +1 -1
  188. package/dist/storage.js +8 -7
  189. package/dist/temporal-supersession.d.ts +1 -1
  190. package/dist/tier-migration.d.ts +1 -1
  191. package/dist/transfer/autodetect.js +1 -1
  192. package/dist/transfer/backup.js +1 -1
  193. package/dist/transfer/capsule-export.js +2 -2
  194. package/dist/transfer/types.d.ts +66 -66
  195. package/dist/verified-recall.js +10 -9
  196. package/package.json +12 -2
  197. package/src/access-http-query.ts +25 -0
  198. package/src/access-http.test.ts +136 -0
  199. package/src/access-http.ts +26 -26
  200. package/src/access-service-offline-file-content.test.ts +40 -0
  201. package/src/access-service.ts +34 -0
  202. package/src/access-surface-catalog.ts +5 -0
  203. package/src/convergence-refresh.ts +28 -0
  204. package/src/orchestrator-convergence-refresh.test.ts +114 -0
  205. package/src/orchestrator.ts +5 -4
  206. package/src/reconcile/manifest.test.ts +261 -0
  207. package/src/reconcile/manifest.ts +278 -0
  208. package/src/reconcile/plan.ts +1 -0
  209. package/src/storage/content-hash-index.ts +26 -0
  210. package/dist/chunk-5QZEVMLY.js.map +0 -1
  211. package/dist/chunk-BEQOZOYZ.js.map +0 -1
  212. package/dist/chunk-UP67AFRN.js.map +0 -1
  213. package/dist/chunk-ZVVASRUT.js.map +0 -1
  214. /package/dist/{graph-edge-decay-Z6ENALU2.js.map → access-http-query.js.map} +0 -0
  215. /package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-5OE5QOZB.js.map} +0 -0
  216. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  217. /package/dist/{chunk-CMENJQ6I.js.map → chunk-2QR2RRH6.js.map} +0 -0
  218. /package/dist/{chunk-4DYBLQZC.js.map → chunk-3HLCRYBV.js.map} +0 -0
  219. /package/dist/{chunk-L2DPF4DF.js.map → chunk-3SHB4YAW.js.map} +0 -0
  220. /package/dist/{chunk-UV72DEZD.js.map → chunk-4B77XSG5.js.map} +0 -0
  221. /package/dist/{chunk-GUQYMOPU.js.map → chunk-4LMA77JH.js.map} +0 -0
  222. /package/dist/{chunk-Q53RLEW7.js.map → chunk-5SM35XZR.js.map} +0 -0
  223. /package/dist/{chunk-YJHU5B3M.js.map → chunk-5YGO5VEH.js.map} +0 -0
  224. /package/dist/{chunk-AX2J2LC4.js.map → chunk-5ZE7QHTK.js.map} +0 -0
  225. /package/dist/{chunk-YFHMW37V.js.map → chunk-6CZPDBJS.js.map} +0 -0
  226. /package/dist/{chunk-BI6RE2ZS.js.map → chunk-6OLQJJYE.js.map} +0 -0
  227. /package/dist/{chunk-GS5UVGQK.js.map → chunk-7JO6RVBI.js.map} +0 -0
  228. /package/dist/{chunk-MBTPUVHZ.js.map → chunk-7PVFOFPJ.js.map} +0 -0
  229. /package/dist/{chunk-KPJQTSRJ.js.map → chunk-C7EI7CA6.js.map} +0 -0
  230. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-CAGPP5NB.js.map} +0 -0
  231. /package/dist/{chunk-NF3U3MPG.js.map → chunk-ECK75GDJ.js.map} +0 -0
  232. /package/dist/{chunk-KDXD2AM6.js.map → chunk-FLBPATMZ.js.map} +0 -0
  233. /package/dist/{chunk-OEXKYYVH.js.map → chunk-FVGQ5LIS.js.map} +0 -0
  234. /package/dist/{chunk-AR2FSZBP.js.map → chunk-G24XIK6H.js.map} +0 -0
  235. /package/dist/{chunk-5TOV3D6U.js.map → chunk-GBJJUPNV.js.map} +0 -0
  236. /package/dist/{chunk-EPQ76W5T.js.map → chunk-GQBZ7EVF.js.map} +0 -0
  237. /package/dist/{chunk-BGXHVOBI.js.map → chunk-HLPD7B7P.js.map} +0 -0
  238. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  239. /package/dist/{chunk-JDXDA5OO.js.map → chunk-J4OKD6QX.js.map} +0 -0
  240. /package/dist/{chunk-LZ5JKQCS.js.map → chunk-JZ7SSAQ5.js.map} +0 -0
  241. /package/dist/{chunk-EHKDORQN.js.map → chunk-NVRYW264.js.map} +0 -0
  242. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-PO5LSKQO.js.map} +0 -0
  243. /package/dist/{chunk-ONHRRJZM.js.map → chunk-QJAQNXWI.js.map} +0 -0
  244. /package/dist/{chunk-WGCTFGLW.js.map → chunk-QQ3NDJOM.js.map} +0 -0
  245. /package/dist/{chunk-QY66HJ4X.js.map → chunk-SS7YWVPF.js.map} +0 -0
  246. /package/dist/{chunk-JYIFGGEM.js.map → chunk-UZGJFIIG.js.map} +0 -0
  247. /package/dist/{chunk-NHRNYJPJ.js.map → chunk-VCGPO2VD.js.map} +0 -0
  248. /package/dist/{chunk-F2KMAFEB.js.map → chunk-VRYJSKOM.js.map} +0 -0
  249. /package/dist/{chunk-HNZKVLAN.js.map → chunk-W6ROK2KU.js.map} +0 -0
  250. /package/dist/{chunk-SEUSFKNS.js.map → chunk-WC4SPYHX.js.map} +0 -0
  251. /package/dist/{chunk-MSXWUXFE.js.map → chunk-WG2PI44B.js.map} +0 -0
  252. /package/dist/{chunk-4VXGRIH6.js.map → chunk-WUNIWKY4.js.map} +0 -0
  253. /package/dist/{chunk-3C2TGBDB.js.map → chunk-XFQRFWVS.js.map} +0 -0
  254. /package/dist/{chunk-5N26WBPQ.js.map → chunk-XMZV27S5.js.map} +0 -0
  255. /package/dist/{chunk-JGXXPDM2.js.map → chunk-YQQK7W7T.js.map} +0 -0
  256. /package/dist/{chunk-3F2LKUMU.js.map → chunk-ZAB5PG65.js.map} +0 -0
  257. /package/dist/{chunk-MVW234LO.js.map → chunk-ZPJJE7MF.js.map} +0 -0
  258. /package/dist/{chunk-6GIMMNVK.js.map → chunk-ZS5UZU5M.js.map} +0 -0
@@ -0,0 +1,248 @@
1
+ import {
2
+ summarizeReconcilePlan
3
+ } from "../chunk-6UWB5PTR.js";
4
+ import "../chunk-EGGE52UU.js";
5
+ import {
6
+ inferMemoryStatus
7
+ } from "../chunk-7RJUVTVF.js";
8
+ import {
9
+ ContentHashIndex
10
+ } from "../chunk-S5SLVSVY.js";
11
+ import "../chunk-W5H6ZRPT.js";
12
+ import "../chunk-FFAZ2XFU.js";
13
+ import "../chunk-7XC2HX75.js";
14
+ import "../chunk-UI3NYK34.js";
15
+ import "../chunk-GCGJW34D.js";
16
+ import "../chunk-AREGMX2J.js";
17
+ import "../chunk-P7FMDTKL.js";
18
+ import "../chunk-5TFP4CUL.js";
19
+ import "../chunk-A6XUJE5D.js";
20
+ import "../chunk-5UZXUTVO.js";
21
+ import {
22
+ RECALL_FALLBACK_DIRS
23
+ } from "../chunk-VS2IYZRU.js";
24
+ import "../chunk-3WCASNQZ.js";
25
+ import "../chunk-PZ5AY32C.js";
26
+
27
+ // src/reconcile/manifest.ts
28
+ import { createHash } from "crypto";
29
+ var RECONCILE_MANIFEST_FORMAT = "remnic-reconcile-manifest";
30
+ var RECONCILE_MANIFEST_SCHEMA_VERSION = 1;
31
+ var SHA256_PATTERN = /^[a-f0-9]{64}$/i;
32
+ var MEMORY_DIRS = new Set(RECALL_FALLBACK_DIRS);
33
+ function isMemoryPath(filePath) {
34
+ if (!filePath.endsWith(".md")) return false;
35
+ const segments = filePath.split("/");
36
+ let index = 0;
37
+ if (segments[index] === "cold" || segments[index] === "archive") index += 1;
38
+ return MEMORY_DIRS.has(segments[index] ?? "");
39
+ }
40
+ function parseScalar(value) {
41
+ if (value === void 0) return void 0;
42
+ const trimmed = value.trim();
43
+ if (trimmed.length === 0) return void 0;
44
+ if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
45
+ try {
46
+ const parsed = JSON.parse(trimmed);
47
+ return typeof parsed === "string" ? parsed : trimmed;
48
+ } catch {
49
+ return trimmed.slice(1, -1).replace(/\\"/g, '"');
50
+ }
51
+ }
52
+ if (trimmed.startsWith("'") && trimmed.endsWith("'")) {
53
+ return trimmed.slice(1, -1).replace(/''/g, "'");
54
+ }
55
+ return trimmed;
56
+ }
57
+ function parsedMemoryIdentity(filePath, raw) {
58
+ if (!isMemoryPath(filePath)) return void 0;
59
+ const match = (Buffer.isBuffer(raw) ? raw.toString("utf8") : raw).match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
60
+ if (!match) return void 0;
61
+ const fields = /* @__PURE__ */ new Map();
62
+ for (const line of match[1].split("\n")) {
63
+ const separator = line.indexOf(":");
64
+ if (separator > 0) fields.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim());
65
+ }
66
+ const id = parseScalar(fields.get("id"));
67
+ if (!id) return void 0;
68
+ const category = parseScalar(fields.get("category")) ?? "fact";
69
+ const storedHash = parseScalar(fields.get("contentHash"));
70
+ const contentHash = storedHash && SHA256_PATTERN.test(storedHash) ? storedHash.toLowerCase() : ContentHashIndex.computeHash(match[2].trim());
71
+ const status = inferMemoryStatus(
72
+ {
73
+ status: parseScalar(fields.get("status")),
74
+ archivedAt: parseScalar(fields.get("archivedAt"))
75
+ },
76
+ filePath
77
+ );
78
+ return { id, category, contentHash, status };
79
+ }
80
+ async function buildReconcileManifest(options) {
81
+ const cachedByPath = /* @__PURE__ */ new Map();
82
+ for (const cached of options.cachedFiles ?? []) {
83
+ cachedByPath.set(cached.path, cached);
84
+ }
85
+ const files = [];
86
+ for (const file of options.files) {
87
+ const cached = cachedByPath.get(file.path);
88
+ if (cached?.sha256.toLowerCase() === file.sha256.toLowerCase()) {
89
+ files.push({ ...file, ...cached.memory ? { memory: cached.memory } : {} });
90
+ continue;
91
+ }
92
+ let raw = null;
93
+ if (isMemoryPath(file.path)) {
94
+ try {
95
+ raw = await options.readFile(file);
96
+ } catch {
97
+ raw = null;
98
+ }
99
+ }
100
+ if (raw !== null && createHash("sha256").update(raw).digest("hex") !== file.sha256.toLowerCase()) {
101
+ raw = null;
102
+ }
103
+ const memory = raw === null ? void 0 : parsedMemoryIdentity(file.path, raw);
104
+ files.push({ ...file, ...memory ? { memory } : {} });
105
+ }
106
+ files.sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0);
107
+ return {
108
+ format: RECONCILE_MANIFEST_FORMAT,
109
+ schemaVersion: RECONCILE_MANIFEST_SCHEMA_VERSION,
110
+ files
111
+ };
112
+ }
113
+ function activeFactByPath(manifest) {
114
+ const result = /* @__PURE__ */ new Map();
115
+ for (const file of manifest?.files ?? []) {
116
+ if (file.memory?.category === "fact" && file.memory.status === "active") {
117
+ result.set(file.path, file);
118
+ }
119
+ }
120
+ return result;
121
+ }
122
+ function contentHashRows(files) {
123
+ const rows = [];
124
+ for (const file of files) {
125
+ rows.push({ path: file.path, contentHash: file.memory.contentHash });
126
+ }
127
+ return rows;
128
+ }
129
+ function comparePlanEntries(left, right) {
130
+ if (left.namespace !== right.namespace) return left.namespace < right.namespace ? -1 : 1;
131
+ return left.path < right.path ? -1 : left.path > right.path ? 1 : 0;
132
+ }
133
+ function collapseActiveFactDuplicates(plan, localManifests, peerManifests) {
134
+ const entriesByNamespace = /* @__PURE__ */ new Map();
135
+ for (const entry of plan.entries) {
136
+ const entries2 = entriesByNamespace.get(entry.namespace) ?? [];
137
+ entries2.push({ ...entry });
138
+ entriesByNamespace.set(entry.namespace, entries2);
139
+ }
140
+ let changed = false;
141
+ for (const namespace of /* @__PURE__ */ new Set([...localManifests.keys(), ...peerManifests.keys()])) {
142
+ const entries2 = entriesByNamespace.get(namespace) ?? [];
143
+ const localManifest = localManifests.get(namespace);
144
+ const peerManifest = peerManifests.get(namespace);
145
+ const localByPath = activeFactByPath(localManifest);
146
+ const peerByPath = activeFactByPath(peerManifest);
147
+ const localFilesByPath = new Map((localManifest?.files ?? []).map((file) => [file.path, file]));
148
+ const peerFilesByPath = new Map((peerManifest?.files ?? []).map((file) => [file.path, file]));
149
+ const localByHash = /* @__PURE__ */ new Map();
150
+ const peerByHash = /* @__PURE__ */ new Map();
151
+ for (const file of localByPath.values()) {
152
+ const hash = file.memory.contentHash;
153
+ const bucket = localByHash.get(hash) ?? [];
154
+ bucket.push(file);
155
+ localByHash.set(hash, bucket);
156
+ }
157
+ for (const file of peerByPath.values()) {
158
+ const hash = file.memory.contentHash;
159
+ const bucket = peerByHash.get(hash) ?? [];
160
+ bucket.push(file);
161
+ peerByHash.set(hash, bucket);
162
+ }
163
+ const removed = /* @__PURE__ */ new Set();
164
+ const replacements = [];
165
+ for (const hash of /* @__PURE__ */ new Set([...localByHash.keys(), ...peerByHash.keys()])) {
166
+ const localCandidates = (localByHash.get(hash) ?? []).filter((file) => {
167
+ const opposite = peerFilesByPath.get(file.path);
168
+ const activeOpposite = peerByPath.get(file.path);
169
+ return opposite === void 0 || activeOpposite?.memory.contentHash === hash;
170
+ });
171
+ const peerCandidates = (peerByHash.get(hash) ?? []).filter((file) => {
172
+ const opposite = localFilesByPath.get(file.path);
173
+ const activeOpposite = localByPath.get(file.path);
174
+ return opposite === void 0 || activeOpposite?.memory.contentHash === hash;
175
+ });
176
+ const localPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(localCandidates));
177
+ const peerPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(peerCandidates));
178
+ if (localPath && peerPath && localPath !== peerPath) {
179
+ const localFile = localByPath.get(localPath);
180
+ const peerFile = peerByPath.get(peerPath);
181
+ if (!localFile || !peerFile) continue;
182
+ const duplicatePaths = /* @__PURE__ */ new Set([
183
+ ...localCandidates.map((file) => file.path),
184
+ ...peerCandidates.map((file) => file.path)
185
+ ]);
186
+ const unsafeEntry = entries2.some(
187
+ (entry) => duplicatePaths.has(entry.path) && (entry.action === "suppress" || entry.action === "conflict")
188
+ );
189
+ if (unsafeEntry) continue;
190
+ for (const entry of entries2) {
191
+ if (duplicatePaths.has(entry.path) && (entry.action === "pull" || entry.action === "push" || entry.action === "identical")) {
192
+ removed.add(entry);
193
+ }
194
+ }
195
+ replacements.push({
196
+ path: localPath < peerPath ? localPath : peerPath,
197
+ namespace,
198
+ action: "identical",
199
+ reason: "semantic_duplicate",
200
+ localSha256: localFile.sha256,
201
+ peerSha256: peerFile.sha256
202
+ });
203
+ changed = true;
204
+ continue;
205
+ }
206
+ const sameSideEntries = entries2.filter((entry) => {
207
+ if (localPath && entry.reason === "local_only") {
208
+ return localCandidates.some((file) => file.path === entry.path);
209
+ }
210
+ if (peerPath && entry.reason === "peer_only") {
211
+ return peerCandidates.some((file) => file.path === entry.path);
212
+ }
213
+ return false;
214
+ });
215
+ const canonicalPath = localPath ?? peerPath;
216
+ const hasSharedCanonical = localPath !== void 0 && localPath === peerPath;
217
+ if (!canonicalPath || sameSideEntries.length === 0 || !hasSharedCanonical && sameSideEntries.length < 2) {
218
+ continue;
219
+ }
220
+ for (const entry of sameSideEntries) {
221
+ if (entry.path !== canonicalPath) {
222
+ removed.add(entry);
223
+ changed = true;
224
+ }
225
+ }
226
+ }
227
+ if (removed.size > 0 || replacements.length > 0) {
228
+ entriesByNamespace.set(
229
+ namespace,
230
+ [...entries2.filter((entry) => !removed.has(entry)), ...replacements].sort(comparePlanEntries)
231
+ );
232
+ }
233
+ }
234
+ if (!changed) return plan;
235
+ const entries = [...entriesByNamespace.values()].flat().sort(comparePlanEntries);
236
+ return {
237
+ entries,
238
+ byNamespace: summarizeReconcilePlan(entries),
239
+ converged: entries.every((entry) => entry.action === "identical")
240
+ };
241
+ }
242
+ export {
243
+ RECONCILE_MANIFEST_FORMAT,
244
+ RECONCILE_MANIFEST_SCHEMA_VERSION,
245
+ buildReconcileManifest,
246
+ collapseActiveFactDuplicates
247
+ };
248
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/reconcile/manifest.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { inferMemoryStatus } from \"../memory-lifecycle-ledger-utils.js\";\nimport { ContentHashIndex, type ContentHashPathEntry } from \"../storage/content-hash-index.js\";\nimport type { MemoryFrontmatter, MemoryStatus } from \"../types.js\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport {\n type ReconcileFileState,\n type ReconcilePlan,\n type ReconcilePlanEntry,\n summarizeReconcilePlan,\n} from \"./plan.js\";\n\nexport const RECONCILE_MANIFEST_FORMAT = \"remnic-reconcile-manifest\";\nexport const RECONCILE_MANIFEST_SCHEMA_VERSION = 1;\n\nexport interface ReconcileMemoryIdentity {\n id: string;\n category: string;\n contentHash: string;\n status: MemoryStatus;\n}\n\nexport interface ReconcileManifestFile extends ReconcileFileState {\n memory?: ReconcileMemoryIdentity;\n}\n\ntype ActiveFactManifestFile = ReconcileManifestFile & { memory: ReconcileMemoryIdentity };\n\nexport interface ReconcileManifest {\n format: typeof RECONCILE_MANIFEST_FORMAT;\n schemaVersion: typeof RECONCILE_MANIFEST_SCHEMA_VERSION;\n files: ReconcileManifestFile[];\n}\n\nexport interface BuildReconcileManifestOptions {\n files: Iterable<ReconcileFileState>;\n readFile: (file: ReconcileFileState) => Promise<Buffer | string | null>;\n cachedFiles?: Iterable<ReconcileManifestFile>;\n}\n\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/i;\nconst MEMORY_DIRS = new Set(RECALL_FALLBACK_DIRS);\n\nfunction isMemoryPath(filePath: string): boolean {\n if (!filePath.endsWith(\".md\")) return false;\n const segments = filePath.split(\"/\");\n let index = 0;\n if (segments[index] === \"cold\" || segments[index] === \"archive\") index += 1;\n return MEMORY_DIRS.has(segments[index] ?? \"\");\n}\n\nfunction parseScalar(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" ? parsed : trimmed;\n } catch {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"');\n }\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction parsedMemoryIdentity(filePath: string, raw: Buffer | string): ReconcileMemoryIdentity | undefined {\n if (!isMemoryPath(filePath)) return undefined;\n const match = (Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : raw).match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return undefined;\n const fields = new Map<string, string>();\n for (const line of match[1].split(\"\\n\")) {\n const separator = line.indexOf(\":\");\n if (separator > 0) fields.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim());\n }\n const id = parseScalar(fields.get(\"id\"));\n if (!id) return undefined;\n const category = parseScalar(fields.get(\"category\")) ?? \"fact\";\n const storedHash = parseScalar(fields.get(\"contentHash\"));\n const contentHash =\n storedHash && SHA256_PATTERN.test(storedHash)\n ? storedHash.toLowerCase()\n : ContentHashIndex.computeHash(match[2].trim());\n const status = inferMemoryStatus(\n {\n status: parseScalar(fields.get(\"status\")) as MemoryStatus | undefined,\n archivedAt: parseScalar(fields.get(\"archivedAt\")),\n } as MemoryFrontmatter,\n filePath\n );\n return { id, category, contentHash, status };\n}\n\nexport async function buildReconcileManifest(options: BuildReconcileManifestOptions): Promise<ReconcileManifest> {\n const cachedByPath = new Map<string, ReconcileManifestFile>();\n for (const cached of options.cachedFiles ?? []) {\n cachedByPath.set(cached.path, cached);\n }\n\n const files: ReconcileManifestFile[] = [];\n for (const file of options.files) {\n const cached = cachedByPath.get(file.path);\n if (cached?.sha256.toLowerCase() === file.sha256.toLowerCase()) {\n files.push({ ...file, ...(cached.memory ? { memory: cached.memory } : {}) });\n continue;\n }\n\n let raw: Buffer | string | null = null;\n if (isMemoryPath(file.path)) {\n try {\n raw = await options.readFile(file);\n } catch {\n raw = null;\n }\n }\n if (raw !== null && createHash(\"sha256\").update(raw).digest(\"hex\") !== file.sha256.toLowerCase()) {\n raw = null;\n }\n const memory = raw === null ? undefined : parsedMemoryIdentity(file.path, raw);\n files.push({ ...file, ...(memory ? { memory } : {}) });\n }\n files.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));\n return {\n format: RECONCILE_MANIFEST_FORMAT,\n schemaVersion: RECONCILE_MANIFEST_SCHEMA_VERSION,\n files,\n };\n}\n\nfunction activeFactByPath(manifest: ReconcileManifest | undefined): Map<string, ActiveFactManifestFile> {\n const result = new Map<string, ActiveFactManifestFile>();\n for (const file of manifest?.files ?? []) {\n if (file.memory?.category === \"fact\" && file.memory.status === \"active\") {\n result.set(file.path, file as ActiveFactManifestFile);\n }\n }\n return result;\n}\n\nfunction contentHashRows(files: Iterable<ActiveFactManifestFile>): ContentHashPathEntry[] {\n const rows: ContentHashPathEntry[] = [];\n for (const file of files) {\n rows.push({ path: file.path, contentHash: file.memory.contentHash });\n }\n return rows;\n}\n\nfunction comparePlanEntries(left: ReconcilePlanEntry, right: ReconcilePlanEntry): number {\n if (left.namespace !== right.namespace) return left.namespace < right.namespace ? -1 : 1;\n return left.path < right.path ? -1 : left.path > right.path ? 1 : 0;\n}\n\nexport function collapseActiveFactDuplicates(\n plan: ReconcilePlan,\n localManifests: ReadonlyMap<string, ReconcileManifest>,\n peerManifests: ReadonlyMap<string, ReconcileManifest>\n): ReconcilePlan {\n const entriesByNamespace = new Map<string, ReconcilePlanEntry[]>();\n for (const entry of plan.entries) {\n const entries = entriesByNamespace.get(entry.namespace) ?? [];\n entries.push({ ...entry });\n entriesByNamespace.set(entry.namespace, entries);\n }\n\n let changed = false;\n for (const namespace of new Set([...localManifests.keys(), ...peerManifests.keys()])) {\n const entries = entriesByNamespace.get(namespace) ?? [];\n const localManifest = localManifests.get(namespace);\n const peerManifest = peerManifests.get(namespace);\n const localByPath = activeFactByPath(localManifest);\n const peerByPath = activeFactByPath(peerManifest);\n const localFilesByPath = new Map((localManifest?.files ?? []).map((file) => [file.path, file]));\n const peerFilesByPath = new Map((peerManifest?.files ?? []).map((file) => [file.path, file]));\n const localByHash = new Map<string, ActiveFactManifestFile[]>();\n const peerByHash = new Map<string, ActiveFactManifestFile[]>();\n\n for (const file of localByPath.values()) {\n const hash = file.memory.contentHash;\n const bucket = localByHash.get(hash) ?? [];\n bucket.push(file);\n localByHash.set(hash, bucket);\n }\n for (const file of peerByPath.values()) {\n const hash = file.memory.contentHash;\n const bucket = peerByHash.get(hash) ?? [];\n bucket.push(file);\n peerByHash.set(hash, bucket);\n }\n\n const removed = new Set<ReconcilePlanEntry>();\n const replacements: ReconcilePlanEntry[] = [];\n for (const hash of new Set([...localByHash.keys(), ...peerByHash.keys()])) {\n const localCandidates = (localByHash.get(hash) ?? []).filter((file) => {\n const opposite = peerFilesByPath.get(file.path);\n const activeOpposite = peerByPath.get(file.path);\n return opposite === undefined || activeOpposite?.memory.contentHash === hash;\n });\n const peerCandidates = (peerByHash.get(hash) ?? []).filter((file) => {\n const opposite = localFilesByPath.get(file.path);\n const activeOpposite = localByPath.get(file.path);\n return opposite === undefined || activeOpposite?.memory.contentHash === hash;\n });\n const localPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(localCandidates));\n const peerPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(peerCandidates));\n\n if (localPath && peerPath && localPath !== peerPath) {\n const localFile = localByPath.get(localPath);\n const peerFile = peerByPath.get(peerPath);\n if (!localFile || !peerFile) continue;\n const duplicatePaths = new Set([\n ...localCandidates.map((file) => file.path),\n ...peerCandidates.map((file) => file.path),\n ]);\n const unsafeEntry = entries.some(\n (entry) => duplicatePaths.has(entry.path) && (entry.action === \"suppress\" || entry.action === \"conflict\")\n );\n if (unsafeEntry) continue;\n for (const entry of entries) {\n if (\n duplicatePaths.has(entry.path) &&\n (entry.action === \"pull\" || entry.action === \"push\" || entry.action === \"identical\")\n ) {\n removed.add(entry);\n }\n }\n replacements.push({\n path: localPath < peerPath ? localPath : peerPath,\n namespace,\n action: \"identical\",\n reason: \"semantic_duplicate\",\n localSha256: localFile.sha256,\n peerSha256: peerFile.sha256,\n });\n changed = true;\n continue;\n }\n\n const sameSideEntries = entries.filter((entry) => {\n if (localPath && entry.reason === \"local_only\") {\n return localCandidates.some((file) => file.path === entry.path);\n }\n if (peerPath && entry.reason === \"peer_only\") {\n return peerCandidates.some((file) => file.path === entry.path);\n }\n return false;\n });\n const canonicalPath = localPath ?? peerPath;\n const hasSharedCanonical = localPath !== undefined && localPath === peerPath;\n if (!canonicalPath || sameSideEntries.length === 0 || (!hasSharedCanonical && sameSideEntries.length < 2)) {\n continue;\n }\n for (const entry of sameSideEntries) {\n if (entry.path !== canonicalPath) {\n removed.add(entry);\n changed = true;\n }\n }\n }\n\n if (removed.size > 0 || replacements.length > 0) {\n entriesByNamespace.set(\n namespace,\n [...entries.filter((entry) => !removed.has(entry)), ...replacements].sort(comparePlanEntries)\n );\n }\n }\n\n if (!changed) return plan;\n const entries = [...entriesByNamespace.values()].flat().sort(comparePlanEntries);\n return {\n entries,\n byNamespace: summarizeReconcilePlan(entries),\n converged: entries.every((entry) => entry.action === \"identical\"),\n };\n}\n"],"mappings":"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","names":["entries"]}
@@ -66,7 +66,7 @@ interface ReconcilePlanEntry {
66
66
  }
67
67
  type ReconcileReason = "peer_only" | "local_only"
68
68
  /** Cursor showed only that side moved since agreement; both still hold the path. */
69
- | "peer_changed" | "local_changed" | "same_content" | "both_modified" | "peer_deleted" | "local_deleted"
69
+ | "peer_changed" | "local_changed" | "same_content" | "semantic_duplicate" | "both_modified" | "peer_deleted" | "local_deleted"
70
70
  /** Peer deleted it while this side edited it — the offline-sync delete/modify pair. */
71
71
  | "local_modified_peer_deleted" | "local_deleted_peer_modified" | "tombstoned";
72
72
  interface ReconcileNamespaceReport {