@remnic/core 10.0.14 → 10.0.15

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 (355) hide show
  1. package/dist/abstraction-nodes.js +3 -2
  2. package/dist/access-admin-ops-surface.js +33 -31
  3. package/dist/access-authorization-probe.js +34 -32
  4. package/dist/access-boundary.js +33 -31
  5. package/dist/access-cli.js +87 -85
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +33 -31
  8. package/dist/access-http-briefing.js +34 -32
  9. package/dist/access-http-query.js +35 -33
  10. package/dist/access-http.js +52 -50
  11. package/dist/access-identity-continuity-surface.js +33 -31
  12. package/dist/access-lcm-surface.js +33 -31
  13. package/dist/access-mcp.js +44 -42
  14. package/dist/access-namespace-preflight.js +33 -31
  15. package/dist/access-observe-write-category.js +4 -3
  16. package/dist/access-observe-write-surface.js +33 -31
  17. package/dist/access-offline-manifest.js +3 -2
  18. package/dist/access-operations-batch.js +36 -34
  19. package/dist/access-operations.js +43 -41
  20. package/dist/access-recall-concurrency.js +33 -31
  21. package/dist/access-recall-response.js +33 -31
  22. package/dist/access-recall-surface.js +33 -31
  23. package/dist/access-schema.js +3 -2
  24. package/dist/access-service.js +33 -31
  25. package/dist/access-surface-catalog.js +35 -33
  26. package/dist/access-surface-catalog.js.map +1 -1
  27. package/dist/active-recall.js +14 -12
  28. package/dist/active-recall.js.map +1 -1
  29. package/dist/briefing.js +10 -8
  30. package/dist/calibration.d.ts.map +1 -1
  31. package/dist/calibration.js +6 -3
  32. package/dist/calibration.js.map +1 -1
  33. package/dist/causal-behavior.js +4 -3
  34. package/dist/causal-behavior.js.map +1 -1
  35. package/dist/causal-chain.js +4 -3
  36. package/dist/causal-consolidation.js +14 -12
  37. package/dist/causal-consolidation.js.map +1 -1
  38. package/dist/causal-retrieval.js +4 -3
  39. package/dist/causal-retrieval.js.map +1 -1
  40. package/dist/causal-trajectory.js +3 -2
  41. package/dist/{chunk-J7JWFZHI.js → chunk-22RM2ZUJ.js} +37 -37
  42. package/dist/{chunk-63B2IZYE.js → chunk-23ZQPP2G.js} +6 -1
  43. package/dist/chunk-23ZQPP2G.js.map +1 -0
  44. package/dist/{chunk-YFMBHQRG.js → chunk-2PTH4PRL.js} +2 -2
  45. package/dist/{chunk-TITG2NBS.js → chunk-2PYHLSXK.js} +2 -2
  46. package/dist/{chunk-B6O2YLUR.js → chunk-2Z5DIDQD.js} +6 -1
  47. package/dist/chunk-2Z5DIDQD.js.map +1 -0
  48. package/dist/{chunk-KH2LKDX7.js → chunk-33G67YZF.js} +2 -2
  49. package/dist/{chunk-LCKVXX5F.js → chunk-3GNIJUUE.js} +2 -2
  50. package/dist/{chunk-SWIKABKI.js → chunk-3Q3XD3NO.js} +2 -2
  51. package/dist/{chunk-4KY5GSMB.js → chunk-4PDTVVSW.js} +2 -2
  52. package/dist/{chunk-HM7RHKS4.js → chunk-4RNBLLZR.js} +2 -2
  53. package/dist/{chunk-PAZ35RJ4.js → chunk-4SCZZ3U7.js} +240 -55
  54. package/dist/chunk-4SCZZ3U7.js.map +1 -0
  55. package/dist/{chunk-Y4NKEXQT.js → chunk-5ATSXCAG.js} +3 -3
  56. package/dist/{chunk-JDZFIR2S.js → chunk-5KGYTX5O.js} +2 -2
  57. package/dist/{chunk-NW2E4CI2.js → chunk-5SMR542T.js} +2 -2
  58. package/dist/{chunk-S7LWX2PQ.js → chunk-655FVTCD.js} +2 -2
  59. package/dist/{chunk-ZSH2NRDV.js → chunk-6WGMZQGG.js} +2 -2
  60. package/dist/{chunk-W47S5TIH.js → chunk-7VQ6AI7H.js} +2 -2
  61. package/dist/{chunk-G7NYVKD6.js → chunk-B2NXOVZN.js} +2 -2
  62. package/dist/{chunk-N7KYEVLK.js → chunk-BK2BVLZW.js} +2 -2
  63. package/dist/{chunk-QJ622LTI.js → chunk-BQOGQULP.js} +30 -8
  64. package/dist/chunk-BQOGQULP.js.map +1 -0
  65. package/dist/{chunk-S2I7DL5Q.js → chunk-C2RW36YR.js} +2 -2
  66. package/dist/{chunk-P5NQN4JE.js → chunk-C6JMGAMO.js} +6 -2
  67. package/dist/chunk-C6JMGAMO.js.map +1 -0
  68. package/dist/{chunk-6LG7BWKW.js → chunk-CFZ4SXXH.js} +2 -2
  69. package/dist/{chunk-BLVHDY2U.js → chunk-DOWACHYO.js} +5 -2
  70. package/dist/chunk-DOWACHYO.js.map +1 -0
  71. package/dist/{chunk-4OSG5Y6M.js → chunk-DPSOFK4D.js} +2 -2
  72. package/dist/{chunk-QOZJCSFO.js → chunk-DQR2LD3V.js} +2 -2
  73. package/dist/{chunk-EBA5DA77.js → chunk-EOU6V4IN.js} +2 -2
  74. package/dist/{chunk-5WCJLQTM.js → chunk-F2772ATT.js} +2 -2
  75. package/dist/{chunk-46EST7JO.js → chunk-F2XNSIPP.js} +2 -2
  76. package/dist/{chunk-PZHQWFR3.js → chunk-G3UUAQOD.js} +2 -2
  77. package/dist/{chunk-YE36AJL7.js → chunk-GCVDFX66.js} +2 -2
  78. package/dist/{chunk-FFOVKNQV.js → chunk-GFAM2LTC.js} +2 -2
  79. package/dist/{chunk-T2YX56QI.js → chunk-GQJKVQJR.js} +2 -2
  80. package/dist/{chunk-L5DAHSEZ.js → chunk-GWVNGDJW.js} +2 -2
  81. package/dist/{chunk-N45NEBOD.js → chunk-GZXXPCWJ.js} +3 -3
  82. package/dist/{chunk-EPJDSQHF.js → chunk-H5IUN433.js} +2 -2
  83. package/dist/{chunk-EUAIYYYR.js → chunk-H6FREOYX.js} +7 -7
  84. package/dist/{chunk-FSIMZNBC.js → chunk-HBAOOSHU.js} +2 -2
  85. package/dist/{chunk-Q4E24IRR.js → chunk-HDN7IVIO.js} +14 -11
  86. package/dist/chunk-HDN7IVIO.js.map +1 -0
  87. package/dist/{chunk-T3FMRLWQ.js → chunk-HFSPY26A.js} +2 -2
  88. package/dist/{chunk-GH7AOMJD.js → chunk-IJMDBYCO.js} +2 -2
  89. package/dist/{chunk-JQ7XU625.js → chunk-IUCPLBDS.js} +6 -6
  90. package/dist/{chunk-WSGPFRBH.js → chunk-IWD33CF4.js} +2 -2
  91. package/dist/{chunk-4IHBN6WU.js → chunk-JKMIGCK6.js} +2 -2
  92. package/dist/{chunk-ROBHL3GL.js → chunk-JWX2Q6HS.js} +2 -2
  93. package/dist/{chunk-4O6WRBGE.js → chunk-KJXP6RUG.js} +5 -1
  94. package/dist/chunk-KJXP6RUG.js.map +1 -0
  95. package/dist/{chunk-JIHMUOOS.js → chunk-KLJVTZ3R.js} +3 -3
  96. package/dist/{chunk-FP4JYE66.js → chunk-KW4AJ7T3.js} +2 -2
  97. package/dist/{chunk-NIRQGDYC.js → chunk-L5VCT7LU.js} +5 -1
  98. package/dist/chunk-L5VCT7LU.js.map +1 -0
  99. package/dist/{chunk-LS2FHUML.js → chunk-LQ5SS4OP.js} +3 -3
  100. package/dist/{chunk-SIIRTDJ4.js → chunk-LWFWZTWX.js} +2 -2
  101. package/dist/{chunk-BMWN7B3Y.js → chunk-LXATZLSC.js} +3 -3
  102. package/dist/{chunk-B665A6BO.js → chunk-MJIOGYKX.js} +2 -2
  103. package/dist/{chunk-RTKV5XHL.js → chunk-MO6N4QYY.js} +2 -2
  104. package/dist/{chunk-N4C7QKOG.js → chunk-MWWAQXZ6.js} +2 -2
  105. package/dist/{chunk-ZJVMUBYF.js → chunk-NHUX6GXA.js} +6 -6
  106. package/dist/{chunk-CB6ANA2I.js → chunk-NZCKG25S.js} +2 -2
  107. package/dist/{chunk-UMTCNEVQ.js → chunk-O2YPCFJT.js} +11 -11
  108. package/dist/{chunk-TZNDKTX5.js → chunk-OQR42XCN.js} +37 -33
  109. package/dist/chunk-OQR42XCN.js.map +1 -0
  110. package/dist/{chunk-JYZSRNR7.js → chunk-PIITB2YZ.js} +2 -2
  111. package/dist/chunk-PPUNC7UX.js +73 -0
  112. package/dist/chunk-PPUNC7UX.js.map +1 -0
  113. package/dist/{chunk-EQWEIIKQ.js → chunk-PQM3B54K.js} +6 -1
  114. package/dist/chunk-PQM3B54K.js.map +1 -0
  115. package/dist/{chunk-UQDG3YLN.js → chunk-PRU7OF3Y.js} +3 -3
  116. package/dist/{chunk-EU534WGS.js → chunk-PVHQSLNN.js} +7 -7
  117. package/dist/{chunk-5VC7J76U.js → chunk-QPH52AZB.js} +2 -2
  118. package/dist/{chunk-XISROV24.js → chunk-QSEUUQUF.js} +2 -2
  119. package/dist/chunk-QUIRIG2P.js +31 -0
  120. package/dist/chunk-QUIRIG2P.js.map +1 -0
  121. package/dist/{chunk-FUFAXVBA.js → chunk-RI2KCQHP.js} +6 -2
  122. package/dist/chunk-RI2KCQHP.js.map +1 -0
  123. package/dist/{chunk-QX6JN3O4.js → chunk-RP7PQWZM.js} +6 -6
  124. package/dist/{chunk-O2IPAX26.js → chunk-RTTPBBAN.js} +4 -4
  125. package/dist/{chunk-W5MCEVUS.js → chunk-RYYVMZBR.js} +2 -2
  126. package/dist/{chunk-WLMZ2L5P.js → chunk-T7ASDYNK.js} +2 -2
  127. package/dist/{chunk-P7TOIOT7.js → chunk-THEPGZBM.js} +2 -2
  128. package/dist/{chunk-QODKDRSP.js → chunk-TMC7HBED.js} +4 -4
  129. package/dist/{chunk-I7S55EOB.js → chunk-TPNCXSXP.js} +2 -2
  130. package/dist/{chunk-SS3IS2JR.js → chunk-UGYUBENJ.js} +2 -2
  131. package/dist/{chunk-GELS5Z5Z.js → chunk-V3TXIXXY.js} +3 -3
  132. package/dist/{chunk-WVADKFWV.js → chunk-VNZMZPAC.js} +2 -2
  133. package/dist/{chunk-JPTPS4OB.js → chunk-VPXIKBPX.js} +2 -2
  134. package/dist/{chunk-OP6N4H6A.js → chunk-W3FVQBGF.js} +2 -2
  135. package/dist/{chunk-DPR2WTN3.js → chunk-WGTR573G.js} +16 -16
  136. package/dist/{chunk-W3K3HITK.js → chunk-WLT6LTQP.js} +2 -2
  137. package/dist/{chunk-GMXWTJNU.js → chunk-XKRXN63M.js} +2 -2
  138. package/dist/{chunk-ZV65I6ME.js → chunk-XLBFX63V.js} +28 -25
  139. package/dist/chunk-XLBFX63V.js.map +1 -0
  140. package/dist/{chunk-KR6ZKECI.js → chunk-XYGQSDTH.js} +3 -3
  141. package/dist/{chunk-6WHJ2EAB.js → chunk-Z64TS5V4.js} +2 -2
  142. package/dist/{chunk-NHLLKEKK.js → chunk-ZAJLJ35W.js} +2 -2
  143. package/dist/{chunk-O4SGYW7H.js → chunk-ZKHSAMTE.js} +2 -2
  144. package/dist/cli.d.ts.map +1 -1
  145. package/dist/cli.js +72 -70
  146. package/dist/coding/export-okf-codegraph.js +9 -7
  147. package/dist/coding/export-okf-codegraph.js.map +1 -1
  148. package/dist/coding/pre-action-gate.js +4 -3
  149. package/dist/commitment-ledger.js +3 -2
  150. package/dist/compounding/engine.js +11 -9
  151. package/dist/config.js +14 -12
  152. package/dist/connectors/codex-materialize-runner.js +10 -8
  153. package/dist/connectors/index.js +10 -8
  154. package/dist/consolidation-provenance-check.d.ts.map +1 -1
  155. package/dist/consolidation-provenance-check.js +2 -1
  156. package/dist/contradiction/index.js +3 -2
  157. package/dist/convergence-refresh.js +12 -10
  158. package/dist/corpus-watermark.js +12 -10
  159. package/dist/correction/correction-planner.d.ts.map +1 -1
  160. package/dist/cue-anchors.js +4 -3
  161. package/dist/deep-recall-http-glue.js +4 -3
  162. package/dist/{dreams-ledger-567VKVOU.js → dreams-ledger-UCHHRQ4R.js} +3 -2
  163. package/dist/entity-retrieval.js +10 -8
  164. package/dist/eval-trajectory-store.js +4 -3
  165. package/dist/eval-trajectory.js +4 -3
  166. package/dist/evals.js +3 -2
  167. package/dist/external-wiki-access.js +34 -32
  168. package/dist/extraction.js +12 -10
  169. package/dist/{first-start-migration-6A5BJPDW.js → first-start-migration-QVD22WWS.js} +6 -5
  170. package/dist/{first-start-migration-6A5BJPDW.js.map → first-start-migration-QVD22WWS.js.map} +1 -1
  171. package/dist/harmonic-construction.js +5 -4
  172. package/dist/harmonic-retrieval.js +14 -12
  173. package/dist/harmonic-source-lookup.js +3 -2
  174. package/dist/index.js +87 -85
  175. package/dist/json-store.d.ts.map +1 -1
  176. package/dist/json-store.js +2 -1
  177. package/dist/location/index.js +12 -10
  178. package/dist/maintenance/dreams-ledger.d.ts.map +1 -1
  179. package/dist/maintenance/memory-governance.d.ts.map +1 -1
  180. package/dist/maintenance/memory-governance.js +10 -8
  181. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -8
  182. package/dist/maintenance/rebuild-memory-projection-runner.js +12 -10
  183. package/dist/maintenance/rebuild-memory-projection.js +11 -9
  184. package/dist/memory-browse-operations.js +34 -32
  185. package/dist/namespaces/migrate.js +11 -9
  186. package/dist/namespaces/search.js +7 -6
  187. package/dist/namespaces/storage.d.ts.map +1 -1
  188. package/dist/namespaces/storage.js +10 -8
  189. package/dist/objective-state-writers.js +4 -3
  190. package/dist/objective-state.js +3 -2
  191. package/dist/offline-sync-snapshot-stream.js +3 -2
  192. package/dist/offline-sync.d.ts.map +1 -1
  193. package/dist/offline-sync.js +2 -1
  194. package/dist/operator-doctor-corpus.js +13 -11
  195. package/dist/operator-toolkit.js +25 -23
  196. package/dist/orchestration/maintenance.js +20 -18
  197. package/dist/orchestrator.js +87 -85
  198. package/dist/profiling.d.ts.map +1 -1
  199. package/dist/profiling.js +2 -1
  200. package/dist/recall-navigation-operations.js +34 -32
  201. package/dist/recall-navigation.js +33 -31
  202. package/dist/{resolution-7AY36LGJ.js → resolution-ZU5BIAJA.js} +4 -3
  203. package/dist/resume-bundles.js +19 -17
  204. package/dist/retrieval-agents.d.ts +1 -1
  205. package/dist/retrieval-agents.d.ts.map +1 -1
  206. package/dist/retrieval-agents.js +7 -1
  207. package/dist/search/document-scanner.d.ts.map +1 -1
  208. package/dist/search/document-scanner.js +2 -1
  209. package/dist/search/factory.js +6 -5
  210. package/dist/search/index.js +6 -5
  211. package/dist/search/lancedb-backend.js +3 -2
  212. package/dist/search/meilisearch-backend.js +3 -2
  213. package/dist/search/orama-backend.js +3 -2
  214. package/dist/semantic-consolidation.js +11 -9
  215. package/dist/semantic-rule-promotion.js +10 -8
  216. package/dist/semantic-rule-verifier.js +10 -8
  217. package/dist/source-agent-qualifier.js +10 -8
  218. package/dist/standup/build.js +10 -8
  219. package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
  220. package/dist/storage/entity-store.d.ts +32 -1
  221. package/dist/storage/entity-store.d.ts.map +1 -1
  222. package/dist/storage/memory-read-store.d.ts.map +1 -1
  223. package/dist/storage/supersession-audit.d.ts.map +1 -1
  224. package/dist/storage.d.ts.map +1 -1
  225. package/dist/storage.js +9 -7
  226. package/dist/support-passport/index.js +36 -34
  227. package/dist/{tier-stats-RQM76XYY.js → tier-stats-C3IAMS4X.js} +6 -5
  228. package/dist/{tier-stats-RQM76XYY.js.map → tier-stats-C3IAMS4X.js.map} +1 -1
  229. package/dist/transcript.d.ts.map +1 -1
  230. package/dist/transcript.js +2 -1
  231. package/dist/transfer/export-okf.js +10 -8
  232. package/dist/trust-zones.js +3 -2
  233. package/dist/utility-learner.js +4 -3
  234. package/dist/utility-runtime.js +5 -4
  235. package/dist/utility-telemetry.js +3 -2
  236. package/dist/utils/macos-replication-junk.d.ts +32 -0
  237. package/dist/utils/macos-replication-junk.d.ts.map +1 -0
  238. package/dist/utils/malformed-entity-record.d.ts +24 -0
  239. package/dist/utils/malformed-entity-record.d.ts.map +1 -0
  240. package/dist/verified-recall.js +10 -8
  241. package/dist/who-knows-cli.js +11 -9
  242. package/dist/who-knows.js +10 -8
  243. package/dist/work-product-ledger.js +3 -2
  244. package/package.json +2 -2
  245. package/src/calibration.ts +3 -2
  246. package/src/cli.ts +2 -2
  247. package/src/consolidation-provenance-check.ts +2 -0
  248. package/src/correction/correction-planner.ts +3 -2
  249. package/src/json-store.ts +3 -0
  250. package/src/macos-replication-junk-scanners.test.ts +275 -0
  251. package/src/maintenance/dreams-ledger.ts +2 -0
  252. package/src/maintenance/memory-governance.ts +2 -0
  253. package/src/namespaces/storage.ts +2 -0
  254. package/src/offline-sync-macos-junk.test.ts +169 -0
  255. package/src/offline-sync.ts +7 -0
  256. package/src/profiling.ts +2 -1
  257. package/src/retrieval-agents.ts +29 -12
  258. package/src/search/document-scanner.ts +4 -0
  259. package/src/storage/entity-canonical-id-migration.ts +56 -13
  260. package/src/storage/entity-store.ts +173 -15
  261. package/src/storage/memory-read-store.ts +30 -5
  262. package/src/storage/supersession-audit.ts +2 -0
  263. package/src/storage.ts +3 -2
  264. package/src/transcript.ts +11 -10
  265. package/src/utils/macos-replication-junk.test.ts +46 -0
  266. package/src/utils/macos-replication-junk.ts +65 -0
  267. package/src/utils/malformed-entity-record.ts +101 -0
  268. package/dist/chunk-4O6WRBGE.js.map +0 -1
  269. package/dist/chunk-63B2IZYE.js.map +0 -1
  270. package/dist/chunk-B6O2YLUR.js.map +0 -1
  271. package/dist/chunk-BLVHDY2U.js.map +0 -1
  272. package/dist/chunk-EQWEIIKQ.js.map +0 -1
  273. package/dist/chunk-FUFAXVBA.js.map +0 -1
  274. package/dist/chunk-NIRQGDYC.js.map +0 -1
  275. package/dist/chunk-P5NQN4JE.js.map +0 -1
  276. package/dist/chunk-PAZ35RJ4.js.map +0 -1
  277. package/dist/chunk-Q4E24IRR.js.map +0 -1
  278. package/dist/chunk-QJ622LTI.js.map +0 -1
  279. package/dist/chunk-TZNDKTX5.js.map +0 -1
  280. package/dist/chunk-ZV65I6ME.js.map +0 -1
  281. /package/dist/{chunk-J7JWFZHI.js.map → chunk-22RM2ZUJ.js.map} +0 -0
  282. /package/dist/{chunk-YFMBHQRG.js.map → chunk-2PTH4PRL.js.map} +0 -0
  283. /package/dist/{chunk-TITG2NBS.js.map → chunk-2PYHLSXK.js.map} +0 -0
  284. /package/dist/{chunk-KH2LKDX7.js.map → chunk-33G67YZF.js.map} +0 -0
  285. /package/dist/{chunk-LCKVXX5F.js.map → chunk-3GNIJUUE.js.map} +0 -0
  286. /package/dist/{chunk-SWIKABKI.js.map → chunk-3Q3XD3NO.js.map} +0 -0
  287. /package/dist/{chunk-4KY5GSMB.js.map → chunk-4PDTVVSW.js.map} +0 -0
  288. /package/dist/{chunk-HM7RHKS4.js.map → chunk-4RNBLLZR.js.map} +0 -0
  289. /package/dist/{chunk-Y4NKEXQT.js.map → chunk-5ATSXCAG.js.map} +0 -0
  290. /package/dist/{chunk-JDZFIR2S.js.map → chunk-5KGYTX5O.js.map} +0 -0
  291. /package/dist/{chunk-NW2E4CI2.js.map → chunk-5SMR542T.js.map} +0 -0
  292. /package/dist/{chunk-S7LWX2PQ.js.map → chunk-655FVTCD.js.map} +0 -0
  293. /package/dist/{chunk-ZSH2NRDV.js.map → chunk-6WGMZQGG.js.map} +0 -0
  294. /package/dist/{chunk-W47S5TIH.js.map → chunk-7VQ6AI7H.js.map} +0 -0
  295. /package/dist/{chunk-G7NYVKD6.js.map → chunk-B2NXOVZN.js.map} +0 -0
  296. /package/dist/{chunk-N7KYEVLK.js.map → chunk-BK2BVLZW.js.map} +0 -0
  297. /package/dist/{chunk-S2I7DL5Q.js.map → chunk-C2RW36YR.js.map} +0 -0
  298. /package/dist/{chunk-6LG7BWKW.js.map → chunk-CFZ4SXXH.js.map} +0 -0
  299. /package/dist/{chunk-4OSG5Y6M.js.map → chunk-DPSOFK4D.js.map} +0 -0
  300. /package/dist/{chunk-QOZJCSFO.js.map → chunk-DQR2LD3V.js.map} +0 -0
  301. /package/dist/{chunk-EBA5DA77.js.map → chunk-EOU6V4IN.js.map} +0 -0
  302. /package/dist/{chunk-5WCJLQTM.js.map → chunk-F2772ATT.js.map} +0 -0
  303. /package/dist/{chunk-46EST7JO.js.map → chunk-F2XNSIPP.js.map} +0 -0
  304. /package/dist/{chunk-PZHQWFR3.js.map → chunk-G3UUAQOD.js.map} +0 -0
  305. /package/dist/{chunk-YE36AJL7.js.map → chunk-GCVDFX66.js.map} +0 -0
  306. /package/dist/{chunk-FFOVKNQV.js.map → chunk-GFAM2LTC.js.map} +0 -0
  307. /package/dist/{chunk-T2YX56QI.js.map → chunk-GQJKVQJR.js.map} +0 -0
  308. /package/dist/{chunk-L5DAHSEZ.js.map → chunk-GWVNGDJW.js.map} +0 -0
  309. /package/dist/{chunk-N45NEBOD.js.map → chunk-GZXXPCWJ.js.map} +0 -0
  310. /package/dist/{chunk-EPJDSQHF.js.map → chunk-H5IUN433.js.map} +0 -0
  311. /package/dist/{chunk-EUAIYYYR.js.map → chunk-H6FREOYX.js.map} +0 -0
  312. /package/dist/{chunk-FSIMZNBC.js.map → chunk-HBAOOSHU.js.map} +0 -0
  313. /package/dist/{chunk-T3FMRLWQ.js.map → chunk-HFSPY26A.js.map} +0 -0
  314. /package/dist/{chunk-GH7AOMJD.js.map → chunk-IJMDBYCO.js.map} +0 -0
  315. /package/dist/{chunk-JQ7XU625.js.map → chunk-IUCPLBDS.js.map} +0 -0
  316. /package/dist/{chunk-WSGPFRBH.js.map → chunk-IWD33CF4.js.map} +0 -0
  317. /package/dist/{chunk-4IHBN6WU.js.map → chunk-JKMIGCK6.js.map} +0 -0
  318. /package/dist/{chunk-ROBHL3GL.js.map → chunk-JWX2Q6HS.js.map} +0 -0
  319. /package/dist/{chunk-JIHMUOOS.js.map → chunk-KLJVTZ3R.js.map} +0 -0
  320. /package/dist/{chunk-FP4JYE66.js.map → chunk-KW4AJ7T3.js.map} +0 -0
  321. /package/dist/{chunk-LS2FHUML.js.map → chunk-LQ5SS4OP.js.map} +0 -0
  322. /package/dist/{chunk-SIIRTDJ4.js.map → chunk-LWFWZTWX.js.map} +0 -0
  323. /package/dist/{chunk-BMWN7B3Y.js.map → chunk-LXATZLSC.js.map} +0 -0
  324. /package/dist/{chunk-B665A6BO.js.map → chunk-MJIOGYKX.js.map} +0 -0
  325. /package/dist/{chunk-RTKV5XHL.js.map → chunk-MO6N4QYY.js.map} +0 -0
  326. /package/dist/{chunk-N4C7QKOG.js.map → chunk-MWWAQXZ6.js.map} +0 -0
  327. /package/dist/{chunk-ZJVMUBYF.js.map → chunk-NHUX6GXA.js.map} +0 -0
  328. /package/dist/{chunk-CB6ANA2I.js.map → chunk-NZCKG25S.js.map} +0 -0
  329. /package/dist/{chunk-UMTCNEVQ.js.map → chunk-O2YPCFJT.js.map} +0 -0
  330. /package/dist/{chunk-JYZSRNR7.js.map → chunk-PIITB2YZ.js.map} +0 -0
  331. /package/dist/{chunk-UQDG3YLN.js.map → chunk-PRU7OF3Y.js.map} +0 -0
  332. /package/dist/{chunk-EU534WGS.js.map → chunk-PVHQSLNN.js.map} +0 -0
  333. /package/dist/{chunk-5VC7J76U.js.map → chunk-QPH52AZB.js.map} +0 -0
  334. /package/dist/{chunk-XISROV24.js.map → chunk-QSEUUQUF.js.map} +0 -0
  335. /package/dist/{chunk-QX6JN3O4.js.map → chunk-RP7PQWZM.js.map} +0 -0
  336. /package/dist/{chunk-O2IPAX26.js.map → chunk-RTTPBBAN.js.map} +0 -0
  337. /package/dist/{chunk-W5MCEVUS.js.map → chunk-RYYVMZBR.js.map} +0 -0
  338. /package/dist/{chunk-WLMZ2L5P.js.map → chunk-T7ASDYNK.js.map} +0 -0
  339. /package/dist/{chunk-P7TOIOT7.js.map → chunk-THEPGZBM.js.map} +0 -0
  340. /package/dist/{chunk-QODKDRSP.js.map → chunk-TMC7HBED.js.map} +0 -0
  341. /package/dist/{chunk-I7S55EOB.js.map → chunk-TPNCXSXP.js.map} +0 -0
  342. /package/dist/{chunk-SS3IS2JR.js.map → chunk-UGYUBENJ.js.map} +0 -0
  343. /package/dist/{chunk-GELS5Z5Z.js.map → chunk-V3TXIXXY.js.map} +0 -0
  344. /package/dist/{chunk-WVADKFWV.js.map → chunk-VNZMZPAC.js.map} +0 -0
  345. /package/dist/{chunk-JPTPS4OB.js.map → chunk-VPXIKBPX.js.map} +0 -0
  346. /package/dist/{chunk-OP6N4H6A.js.map → chunk-W3FVQBGF.js.map} +0 -0
  347. /package/dist/{chunk-DPR2WTN3.js.map → chunk-WGTR573G.js.map} +0 -0
  348. /package/dist/{chunk-W3K3HITK.js.map → chunk-WLT6LTQP.js.map} +0 -0
  349. /package/dist/{chunk-GMXWTJNU.js.map → chunk-XKRXN63M.js.map} +0 -0
  350. /package/dist/{chunk-KR6ZKECI.js.map → chunk-XYGQSDTH.js.map} +0 -0
  351. /package/dist/{chunk-6WHJ2EAB.js.map → chunk-Z64TS5V4.js.map} +0 -0
  352. /package/dist/{chunk-NHLLKEKK.js.map → chunk-ZAJLJ35W.js.map} +0 -0
  353. /package/dist/{chunk-O4SGYW7H.js.map → chunk-ZKHSAMTE.js.map} +0 -0
  354. /package/dist/{dreams-ledger-567VKVOU.js.map → dreams-ledger-UCHHRQ4R.js.map} +0 -0
  355. /package/dist/{resolution-7AY36LGJ.js.map → resolution-ZU5BIAJA.js.map} +0 -0
@@ -5,6 +5,7 @@ import path from "node:path";
5
5
  import { stripAttributesSuffix } from "../structured-attributes.js";
6
6
  import type { MemoryFile } from "../types.js";
7
7
  import { isErrnoCode } from "../utils/errno.js";
8
+ import { isMacOsReplicationJunkBasename } from "../utils/macos-replication-junk.js";
8
9
 
9
10
  export interface SupersessionAuditLookup {
10
11
  correctionsDir: string;
@@ -27,6 +28,7 @@ export async function hasSupersessionAudit(
27
28
  }
28
29
 
29
30
  for (const entry of entries) {
31
+ if (isMacOsReplicationJunkBasename(entry.name)) continue;
30
32
  if (!entry.isFile() || !entry.name.endsWith(".md")) continue;
31
33
  const memory = await lookup.readMemoryByPath(path.join(lookup.correctionsDir, entry.name));
32
34
  if (
package/src/storage.ts CHANGED
@@ -65,6 +65,7 @@ import { readEntityAliasConfigSync } from "./storage/entity-alias-config.js";
65
65
  import { assertSafeEntityId } from "./storage/entity-id-safety.js";
66
66
  export { normalizeEntityName } from "./entity-id-normalization.js";
67
67
  import { isErrnoCode } from "./utils/errno.js";
68
+ import { isMacOsReplicationJunkBasename } from "./utils/macos-replication-junk.js";
68
69
  import { getCategoryDir, categoryDirName } from "./utils/category-dir.js";
69
70
  import { decodeYamlScalar } from "./utils/yaml-scalar.js";
70
71
  import { qmdCollectionPathParts, qmdResultPathCandidates } from "./orchestration/qmd-result-resolver.js";
@@ -4882,7 +4883,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
4882
4883
 
4883
4884
  const readDir = async (dir: string) => {
4884
4885
  try {
4885
- const entries = await readdir(dir, { withFileTypes: true });
4886
+ const entries = (await readdir(dir, { withFileTypes: true })).filter((e) => !isMacOsReplicationJunkBasename(e.name));
4886
4887
  for (const entry of entries) {
4887
4888
  checkCorpusReadAbort(options);
4888
4889
  const fullPath = path.join(dir, entry.name);
@@ -7133,7 +7134,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
7133
7134
  const summaries: MemorySummary[] = [];
7134
7135
 
7135
7136
  for (const file of files) {
7136
- if (!file.endsWith(".json")) continue;
7137
+ if (isMacOsReplicationJunkBasename(file) || !file.endsWith(".json")) continue;
7137
7138
  const filePath = path.join(this.summariesDir, file);
7138
7139
  const raw = await this.readStorageSecureFile(filePath);
7139
7140
  summaries.push(JSON.parse(raw) as MemorySummary);
package/src/transcript.ts CHANGED
@@ -6,6 +6,7 @@ import { analyzeSessionIntegrity, type SessionIntegrityReport } from "./session-
6
6
  import { isDailyFileDatedBefore, resolveSafeStoragePath } from "./storage-paths.js";
7
7
  import { sessionStoragePaths } from "./session-identity.js";
8
8
  import { estimateTokenCount } from "./token-estimate.js";
9
+ import { isMacOsReplicationJunkBasename } from "./utils/macos-replication-junk.js";
9
10
 
10
11
  type DirectorySessionStatus = "missing" | "empty" | "matches" | "occupied";
11
12
  type DirectoryOwnershipCacheEntry = {
@@ -166,7 +167,7 @@ export class TranscriptManager {
166
167
  for (const idEnt of idEntries) {
167
168
  if (!idEnt.isDirectory()) continue;
168
169
  const chanDir = path.join(typeDir, idEnt.name);
169
- const files = (await readdir(chanDir)).filter((f) => f.endsWith(".jsonl")).sort();
170
+ const files = (await readdir(chanDir)).filter((f) => f.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(f)).sort();
170
171
  const last = files[files.length - 1];
171
172
  if (!last) continue;
172
173
  try {
@@ -261,7 +262,7 @@ export class TranscriptManager {
261
262
 
262
263
  let names: string[];
263
264
  try {
264
- names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl"));
265
+ names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file));
265
266
  } catch {
266
267
  return "occupied";
267
268
  }
@@ -345,7 +346,7 @@ export class TranscriptManager {
345
346
  ): Promise<void> {
346
347
  try {
347
348
  const channelDir = await resolveSafeStoragePath(root, dir);
348
- const names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl"));
349
+ const names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file));
349
350
  const fileSizes = await this.directoryJsonlFileSizes(root, dir, names);
350
351
  if (!fileSizes) return;
351
352
  this.directoryOwnershipCache.set(
@@ -380,7 +381,7 @@ export class TranscriptManager {
380
381
 
381
382
  let names: string[];
382
383
  try {
383
- names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl")).sort();
384
+ names = (await readdir(channelDir)).filter((file) => file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file)).sort();
384
385
  } catch {
385
386
  continue;
386
387
  }
@@ -641,14 +642,14 @@ export class TranscriptManager {
641
642
  try {
642
643
  const channelFiles = await readdir(channelDir);
643
644
  for (const file of channelFiles) {
644
- if (file.endsWith(".jsonl")) {
645
+ if (file.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(file)) {
645
646
  files.push(path.join(entry.name, channelTypeEntry.name, file));
646
647
  }
647
648
  }
648
649
  } catch {
649
650
  // Skip unreadable directories
650
651
  }
651
- } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl")) {
652
+ } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(channelTypeEntry.name)) {
652
653
  // Legacy: channel type dir contains .jsonl files directly
653
654
  files.push(path.join(entry.name, channelTypeEntry.name));
654
655
  }
@@ -656,7 +657,7 @@ export class TranscriptManager {
656
657
  } catch {
657
658
  // Skip unreadable directories
658
659
  }
659
- } else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
660
+ } else if (entry.isFile() && entry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(entry.name)) {
660
661
  // Legacy flat file - still include for backward compatibility
661
662
  files.push(entry.name);
662
663
  }
@@ -865,7 +866,7 @@ export class TranscriptManager {
865
866
  try {
866
867
  const channelFiles = await readdir(channelDir);
867
868
  for (const file of channelFiles) {
868
- if (!file.endsWith(".jsonl")) continue;
869
+ if (isMacOsReplicationJunkBasename(file) || !file.endsWith(".jsonl")) continue;
869
870
 
870
871
  const filePath = path.join(channelDir, file);
871
872
 
@@ -894,7 +895,7 @@ export class TranscriptManager {
894
895
  } catch (err) {
895
896
  log.debug(`failed to process channel directory ${entry.name}/${channelTypeEntry.name}:`, err);
896
897
  }
897
- } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl")) {
898
+ } else if (channelTypeEntry.isFile() && channelTypeEntry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(channelTypeEntry.name)) {
898
899
  // Legacy: channel type dir contains .jsonl files directly
899
900
  const filePath = path.join(channelTypeDir, channelTypeEntry.name);
900
901
  const cleaned = await this.cleanupTranscriptFile(filePath, cutoff);
@@ -906,7 +907,7 @@ export class TranscriptManager {
906
907
  } catch (err) {
907
908
  log.debug(`failed to process channel type directory ${entry.name}:`, err);
908
909
  }
909
- } else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
910
+ } else if (entry.isFile() && entry.name.endsWith(".jsonl") && !isMacOsReplicationJunkBasename(entry.name)) {
910
911
  // Handle legacy flat files - delete if older than retentionDays
911
912
  if (this.isLegacyTranscriptFile(entry.name)) {
912
913
  const dateStr = entry.name.slice(0, 10);
@@ -0,0 +1,46 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import {
5
+ isMacOsReplicationJunkBasename,
6
+ isMacOsReplicationJunkRelativePath,
7
+ warnIgnoredMacOsReplicationJunk,
8
+ withoutMacOsReplicationJunk,
9
+ } from "./macos-replication-junk.js";
10
+
11
+ test("macOS replication junk is AppleDouble sidecars and .DS_Store only", () => {
12
+ assert.equal(isMacOsReplicationJunkBasename("._project-notes.md"), true);
13
+ assert.equal(isMacOsReplicationJunkBasename("._"), true);
14
+ assert.equal(isMacOsReplicationJunkBasename(".DS_Store"), true);
15
+ assert.equal(isMacOsReplicationJunkBasename("project-notes.md"), false);
16
+ assert.equal(isMacOsReplicationJunkBasename(".gitignore"), false);
17
+ assert.equal(isMacOsReplicationJunkBasename("DS_Store"), false);
18
+ assert.equal(isMacOsReplicationJunkRelativePath("namespaces/lab/entities/._project-notes.md"), true);
19
+ assert.equal(isMacOsReplicationJunkRelativePath("namespaces\\lab\\.DS_Store"), true);
20
+ assert.equal(isMacOsReplicationJunkRelativePath("entities/project-notes.md"), false);
21
+ });
22
+
23
+ test("withoutMacOsReplicationJunk keeps real names and counts junk once", () => {
24
+ const { kept, ignored } = withoutMacOsReplicationJunk(
25
+ ["project-notes.md", "._project-notes.md", ".DS_Store", "correction-1.md"],
26
+ (name) => name
27
+ );
28
+ assert.deepEqual(kept, ["project-notes.md", "correction-1.md"]);
29
+ assert.equal(ignored, 2);
30
+ });
31
+
32
+ test("warnIgnoredMacOsReplicationJunk emits one summary per directory and count", () => {
33
+ const messages: string[] = [];
34
+ const warn = (message: string) => {
35
+ messages.push(message);
36
+ };
37
+ const directory = `junk-warn-${process.pid}-${Date.now()}`;
38
+ warnIgnoredMacOsReplicationJunk(directory, 2, warn);
39
+ warnIgnoredMacOsReplicationJunk(directory, 2, warn);
40
+ warnIgnoredMacOsReplicationJunk(directory, 0, warn);
41
+ warnIgnoredMacOsReplicationJunk(directory, 3, warn);
42
+ assert.deepEqual(messages, [
43
+ "ignored 2 macOS replication junk file(s) (._* and .DS_Store)",
44
+ "ignored 3 macOS replication junk file(s) (._* and .DS_Store)",
45
+ ]);
46
+ });
@@ -0,0 +1,65 @@
1
+ /**
2
+ * macOS Finder metadata that arrives through Mac-to-Linux copies.
3
+ *
4
+ * AppleDouble sidecars are named `._` plus the real file's basename
5
+ * (`._project-notes.md` beside `project-notes.md`). Finder also writes
6
+ * `.DS_Store` into any directory it opens. Neither is a Remnic record.
7
+ * Directory scanners and replication must ignore them so they are never
8
+ * parsed as entities, memories, or sync objects.
9
+ *
10
+ * QMD's own indexer already drops every hidden path (`dot: false` plus a
11
+ * hidden-segment filter). Callers that build index inputs themselves still
12
+ * use this helper so the non-QMD scanners stay in parity.
13
+ */
14
+
15
+ const warnedJunkDirectories = new Set<string>();
16
+
17
+ /** True for an AppleDouble sidecar or a Finder `.DS_Store` file. */
18
+ export function isMacOsReplicationJunkBasename(basename: string): boolean {
19
+ return basename === ".DS_Store" || basename.startsWith("._");
20
+ }
21
+
22
+ /** True when the final path segment is macOS replication junk. */
23
+ export function isMacOsReplicationJunkRelativePath(relPath: string): boolean {
24
+ const normalized = relPath.includes("\\") ? relPath.replaceAll("\\", "/") : relPath;
25
+ const slash = normalized.lastIndexOf("/");
26
+ const basename = slash === -1 ? normalized : normalized.slice(slash + 1);
27
+ return isMacOsReplicationJunkBasename(basename);
28
+ }
29
+
30
+ /**
31
+ * Drop junk names from a directory listing. `ignored` is the count of
32
+ * names removed, so the caller can emit one summary warning.
33
+ */
34
+ export function withoutMacOsReplicationJunk<T>(
35
+ entries: readonly T[],
36
+ basenameOf: (entry: T) => string
37
+ ): { kept: T[]; ignored: number } {
38
+ const kept: T[] = [];
39
+ let ignored = 0;
40
+ for (const entry of entries) {
41
+ if (isMacOsReplicationJunkBasename(basenameOf(entry))) {
42
+ ignored += 1;
43
+ continue;
44
+ }
45
+ kept.push(entry);
46
+ }
47
+ return { kept, ignored };
48
+ }
49
+
50
+ /**
51
+ * Emit at most one junk warning per directory and count. A later scan of
52
+ * the same directory (entity migration, then entity load) stays quiet
53
+ * instead of repeating the same summary.
54
+ */
55
+ export function warnIgnoredMacOsReplicationJunk(
56
+ directoryKey: string,
57
+ count: number,
58
+ warn: (message: string) => void
59
+ ): void {
60
+ if (count <= 0) return;
61
+ const key = `${directoryKey}\0${count}`;
62
+ if (warnedJunkDirectories.has(key)) return;
63
+ warnedJunkDirectories.add(key);
64
+ warn(`ignored ${count} macOS replication junk file(s) (._* and .DS_Store)`);
65
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Heading and type flags for an entity markdown body.
3
+ *
4
+ * The heading rule matches `parseEntityFile`: a line must start with `# `
5
+ * (hash, space) and the remainder must contain a name. A tab after `#`
6
+ * is not a heading. The type rule matches a `**Type:**` line with a
7
+ * non-empty value. A missing type line is still readable: the parser
8
+ * defaults the type to `other`.
9
+ */
10
+ function entityRecordFlags(content: string): { hasName: boolean; hasType: boolean } {
11
+ const body = entityRecordBody(content);
12
+ let hasName = false;
13
+ let hasType = false;
14
+ let start = 0;
15
+ while (start <= body.length) {
16
+ const newline = body.indexOf("\n", start);
17
+ const end = newline === -1 ? body.length : newline;
18
+ let line = body.slice(start, end);
19
+ if (line.endsWith("\r")) line = line.slice(0, -1);
20
+ if (!hasName && line.startsWith("# ") && line.slice(2).trim().length > 0) hasName = true;
21
+ if (!hasType && line.startsWith("**Type:**") && line.slice("**Type:**".length).trim().length > 0) {
22
+ hasType = true;
23
+ }
24
+ if (hasName && hasType) return { hasName, hasType };
25
+ if (newline === -1) break;
26
+ start = newline + 1;
27
+ }
28
+ return { hasName, hasType };
29
+ }
30
+
31
+ /**
32
+ * No `# ` name. A named file whose type line is absent stays readable:
33
+ * `parseEntityFile` defaults the type to `other`.
34
+ */
35
+ export function isUnnamedEntityRecord(content: string): boolean {
36
+ return !entityRecordFlags(content).hasName;
37
+ }
38
+
39
+ function entityBodyHasText(content: string): boolean {
40
+ const body = entityRecordBody(content);
41
+ for (let i = 0; i < body.length; i++) {
42
+ const char = body.charCodeAt(i);
43
+ if (char !== 32 && char !== 9 && char !== 10 && char !== 13) return true;
44
+ }
45
+ return false;
46
+ }
47
+
48
+ /**
49
+ * Unnamed entity body that still has text. An empty body under frontmatter
50
+ * stays readable so a canonical filename can supply the type. A tab heading,
51
+ * a blank `# ` heading, or prose with no name does not.
52
+ */
53
+ export function isPopulatedUnnamedEntityRecord(content: string): boolean {
54
+ return isUnnamedEntityRecord(content) && entityBodyHasText(content);
55
+ }
56
+
57
+ /**
58
+ * Unnamed file that still looks like an entity record (`#` or `**Type:**`).
59
+ * Direct filename recall keeps unstructured placeholders such as "content".
60
+ */
61
+ export function isShapedUnnamedEntityRecord(content: string): boolean {
62
+ if (!isUnnamedEntityRecord(content)) return false;
63
+ const body = entityRecordBody(content);
64
+ let start = 0;
65
+ while (start <= body.length) {
66
+ const newline = body.indexOf("\n", start);
67
+ const end = newline === -1 ? body.length : newline;
68
+ let line = body.slice(start, end);
69
+ if (line.endsWith("\r")) line = line.slice(0, -1);
70
+ if (line.startsWith("#") || line.startsWith("**Type:**")) return true;
71
+ if (newline === -1) break;
72
+ start = newline + 1;
73
+ }
74
+ return false;
75
+ }
76
+
77
+ /**
78
+ * Migration gate. Canonical ids are derived from name and type, and the
79
+ * old startup throw required an explicit `**Type:**` line. Files that
80
+ * only have a heading stay on disk and are not renamed. Listing does not
81
+ * use this predicate: `parseEntityFile` defaults a missing type to `other`.
82
+ */
83
+ export function isMalformedEntityRecord(content: string): boolean {
84
+ const flags = entityRecordFlags(content);
85
+ return !flags.hasName || !flags.hasType;
86
+ }
87
+
88
+ function entityRecordBody(content: string): string {
89
+ const firstNewline = content.indexOf("\n");
90
+ if (firstNewline === -1) return content;
91
+ const firstLine = content.slice(0, firstNewline).endsWith("\r")
92
+ ? content.slice(0, firstNewline - 1)
93
+ : content.slice(0, firstNewline);
94
+ if (firstLine !== "---") return content;
95
+ const close = content.indexOf("\n---", firstNewline + 1);
96
+ if (close === -1) return content;
97
+ let rest = close + "\n---".length;
98
+ if (content.charAt(rest) === "\r") rest += 1;
99
+ if (content.charAt(rest) === "\n") rest += 1;
100
+ return content.slice(rest);
101
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/search/document-scanner.ts"],"sourcesContent":["import path from \"node:path\";\nimport { lstat, readdir, readFile, realpath } from \"node:fs/promises\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport { assertPathInsideRoot } from \"../utils/path-containment.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\n\nexport interface IndexableDocument {\n /** Memory ID from frontmatter or filename stem */\n docid: string;\n /** Absolute file path */\n path: string;\n /** Markdown body (no YAML frontmatter) */\n content: string;\n /** First ~200 chars for display */\n snippet: string;\n}\n\n/**\n * Parse YAML frontmatter from a markdown string.\n * Returns the frontmatter key-value pairs and body, or null if no frontmatter block.\n */\nfunction parseFrontmatter(raw: string): { data: Record<string, string>; body: string } | null {\n // Support both LF and CRLF line endings\n const normalized = raw.replace(/\\r\\n/g, \"\\n\");\n const match = normalized.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return null;\n\n const fmBlock = match[1];\n const body = (match[2] ?? \"\").trim();\n const data: Record<string, string> = {};\n\n for (const line of fmBlock.split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n data[key] = value;\n }\n\n return { data, body };\n}\n\n/**\n * Recursively scan a directory for `.md` files and return IndexableDocuments.\n */\nasync function scanDir(dir: string, memoryRootReal: string): Promise<IndexableDocument[]> {\n const docs: IndexableDocument[] = [];\n try {\n const dirStat = await lstat(dir);\n if (dirStat.isSymbolicLink()) {\n throw new Error(`Refusing to scan symlinked memory category directory: ${dir}`);\n }\n if (!dirStat.isDirectory()) {\n const error = new Error(`Memory category path is not a directory: ${dir}`) as NodeJS.ErrnoException;\n error.code = \"ENOTDIR\";\n throw error;\n }\n assertPathInsideRoot(memoryRootReal, await realpath(dir), dir);\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n assertPathInsideRoot(memoryRootReal, await realpath(fullPath), fullPath);\n const sub = await scanDir(fullPath, memoryRootReal);\n docs.push(...sub);\n } else if (entry.name.endsWith(\".md\")) {\n try {\n assertPathInsideRoot(memoryRootReal, await realpath(fullPath), fullPath);\n const raw = await readFile(fullPath, \"utf-8\");\n const parsed = parseFrontmatter(raw);\n const body = parsed ? parsed.body : raw.trim();\n const docid = parsed?.data.id || path.basename(entry.name, \".md\");\n docs.push({\n docid,\n path: fullPath,\n content: body,\n snippet: body.slice(0, 200),\n });\n } catch {\n // Skip unreadable files\n }\n }\n }\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) {\n // Optional category directories may not exist yet.\n return docs;\n }\n throw err;\n }\n return docs;\n}\n\n/**\n * Scan every recall category subdir of memoryDir for indexable markdown\n * documents. The directory set is derived from `RECALL_FALLBACK_DIRS`\n * (utils/category-dir.ts → ALL_CATEGORY_DIRS minus non-recall queue dirs) —\n * the single source of truth — so adding a new category never requires\n * touching this scanner. Non-QMD backends (Orama / Meilisearch / LanceDB)\n * build their index through this helper; deriving from RECALL_FALLBACK_DIRS\n * keeps them in parity with writeMemory's category-dir routing (issue #1546)\n * and the QMD filesystem-fallback corpus. reasoning-traces/ and the other\n * category dirs are covered automatically (issue #564 PR 3 no longer needs a\n * hand-maintained list). scanDir tolerates missing dirs (ENOENT), so category\n * dirs that do not exist yet are skipped.\n */\nexport async function scanMemoryDir(memoryDir: string): Promise<IndexableDocument[]> {\n let memoryRootReal: string;\n try {\n memoryRootReal = await realpath(memoryDir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) {\n return [];\n }\n throw err;\n }\n const perDir = await Promise.all(\n RECALL_FALLBACK_DIRS.map((dir) => scanDir(path.join(memoryDir, dir), memoryRootReal)),\n );\n return perDir.flat();\n}\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,OAAO,SAAS,UAAU,gBAAgB;AAoBnD,SAAS,iBAAiB,KAAoE;AAE5F,QAAM,aAAa,IAAI,QAAQ,SAAS,IAAI;AAC5C,QAAM,QAAQ,WAAW,MAAM,oCAAoC;AACnE,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAU,MAAM,CAAC;AACvB,QAAM,QAAQ,MAAM,CAAC,KAAK,IAAI,KAAK;AACnC,QAAM,OAA+B,CAAC;AAEtC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,aAAa,GAAI;AACrB,UAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK;AACzC,UAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK;AAC5C,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO,EAAE,MAAM,KAAK;AACtB;AAKA,eAAe,QAAQ,KAAa,gBAAsD;AACxF,QAAM,OAA4B,CAAC;AACnC,MAAI;AACF,UAAM,UAAU,MAAM,MAAM,GAAG;AAC/B,QAAI,QAAQ,eAAe,GAAG;AAC5B,YAAM,IAAI,MAAM,yDAAyD,GAAG,EAAE;AAAA,IAChF;AACA,QAAI,CAAC,QAAQ,YAAY,GAAG;AAC1B,YAAM,QAAQ,IAAI,MAAM,4CAA4C,GAAG,EAAE;AACzE,YAAM,OAAO;AACb,YAAM;AAAA,IACR;AACA,yBAAqB,gBAAgB,MAAM,SAAS,GAAG,GAAG,GAAG;AAE7D,UAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,eAAe,EAAG;AAC5B,YAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAI,MAAM,YAAY,GAAG;AACvB,6BAAqB,gBAAgB,MAAM,SAAS,QAAQ,GAAG,QAAQ;AACvE,cAAM,MAAM,MAAM,QAAQ,UAAU,cAAc;AAClD,aAAK,KAAK,GAAG,GAAG;AAAA,MAClB,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,YAAI;AACF,+BAAqB,gBAAgB,MAAM,SAAS,QAAQ,GAAG,QAAQ;AACvE,gBAAM,MAAM,MAAM,SAAS,UAAU,OAAO;AAC5C,gBAAM,SAAS,iBAAiB,GAAG;AACnC,gBAAM,OAAO,SAAS,OAAO,OAAO,IAAI,KAAK;AAC7C,gBAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK,SAAS,MAAM,MAAM,KAAK;AAChE,eAAK,KAAK;AAAA,YACR;AAAA,YACA,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,KAAK,MAAM,GAAG,GAAG;AAAA,UAC5B,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,GAAG;AAE9B,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAeA,eAAsB,cAAc,WAAiD;AACnF,MAAI;AACJ,MAAI;AACF,qBAAiB,MAAM,SAAS,SAAS;AAAA,EAC3C,SAAS,KAAK;AACZ,QAAI,YAAY,KAAK,QAAQ,GAAG;AAC9B,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACA,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,qBAAqB,IAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,WAAW,GAAG,GAAG,cAAc,CAAC;AAAA,EACtF;AACA,SAAO,OAAO,KAAK;AACrB;","names":[]}