@remnic/core 10.0.59 → 10.0.61

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 (370) hide show
  1. package/dist/access-admin-ops-surface.js +53 -50
  2. package/dist/access-authorization-probe.js +54 -51
  3. package/dist/access-boundary.js +53 -50
  4. package/dist/access-cli.js +143 -140
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +53 -50
  7. package/dist/access-http-briefing.js +54 -51
  8. package/dist/access-http-query.js +55 -52
  9. package/dist/access-http.js +76 -73
  10. package/dist/access-identity-continuity-surface.js +53 -50
  11. package/dist/access-lcm-surface.js +53 -50
  12. package/dist/access-mcp.js +64 -61
  13. package/dist/access-namespace-preflight.js +53 -50
  14. package/dist/access-observe-write-category.js +10 -10
  15. package/dist/access-observe-write-surface.js +53 -50
  16. package/dist/access-offline-manifest.js +7 -7
  17. package/dist/access-operations-batch.js +56 -53
  18. package/dist/access-operations.js +63 -60
  19. package/dist/access-recall-concurrency.js +53 -50
  20. package/dist/access-recall-response.js +53 -50
  21. package/dist/access-recall-surface.js +53 -50
  22. package/dist/access-schema.js +9 -9
  23. package/dist/access-service.js +53 -50
  24. package/dist/access-surface-catalog.js +55 -52
  25. package/dist/access-surface-catalog.js.map +1 -1
  26. package/dist/active-recall.js +24 -20
  27. package/dist/active-recall.js.map +1 -1
  28. package/dist/adapters/index.js +7 -7
  29. package/dist/adapters/registry.js +3 -3
  30. package/dist/briefing.js +16 -12
  31. package/dist/buffer-persistence.d.ts +14 -3
  32. package/dist/buffer-persistence.d.ts.map +1 -1
  33. package/dist/buffer-persistence.js +1 -1
  34. package/dist/buffer-turn-helpers.d.ts +7 -0
  35. package/dist/buffer-turn-helpers.d.ts.map +1 -1
  36. package/dist/buffer-turn-helpers.js +5 -3
  37. package/dist/buffer.d.ts +2 -0
  38. package/dist/buffer.d.ts.map +1 -1
  39. package/dist/buffer.js +7 -7
  40. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-GWVG7LGC.js} +2 -2
  41. package/dist/causal-behavior.js +2 -2
  42. package/dist/causal-chain.js +2 -2
  43. package/dist/causal-consolidation.js +19 -15
  44. package/dist/causal-consolidation.js.map +1 -1
  45. package/dist/causal-retrieval.js +2 -2
  46. package/dist/causal-trajectory-graph.js +2 -2
  47. package/dist/causal-trajectory.js +1 -1
  48. package/dist/{chunk-ZAZZOQAQ.js → chunk-23OEPU3K.js} +2 -2
  49. package/dist/{chunk-XDKEHZUC.js → chunk-264B57GV.js} +2 -2
  50. package/dist/{chunk-5U2BBF7E.js → chunk-46U6L5DM.js} +20 -10
  51. package/dist/chunk-46U6L5DM.js.map +1 -0
  52. package/dist/chunk-4LZ7SVKM.js +211 -0
  53. package/dist/chunk-4LZ7SVKM.js.map +1 -0
  54. package/dist/{chunk-NRGQ5HJO.js → chunk-4P4VLPGB.js} +1 -1
  55. package/dist/{chunk-GIRWNTMV.js → chunk-4PG5R6BJ.js} +2 -2
  56. package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
  57. package/dist/{chunk-RG3I2663.js → chunk-64JLBFCQ.js} +2 -2
  58. package/dist/{chunk-G3T6YMBO.js → chunk-64S6X4IU.js} +7 -7
  59. package/dist/{chunk-WASVDS6G.js → chunk-6HTEPYOI.js} +4 -4
  60. package/dist/{chunk-6AEKSOWV.js → chunk-6I6DFULH.js} +8 -8
  61. package/dist/{chunk-DJR37Q37.js → chunk-6T4CMKNP.js} +2 -2
  62. package/dist/{chunk-RHJ5VGB3.js → chunk-73A2DDDR.js} +2 -2
  63. package/dist/{chunk-4B73TQQV.js → chunk-7AKPLEJV.js} +2 -2
  64. package/dist/{chunk-UHH67NLU.js → chunk-7OKYO2UC.js} +2 -2
  65. package/dist/{chunk-KAL5SXPP.js → chunk-7ULSP7AU.js} +6 -6
  66. package/dist/{chunk-USNU3BEQ.js → chunk-A4FZLM6Q.js} +2 -2
  67. package/dist/{chunk-VV73XT3A.js → chunk-BJLCV2P3.js} +2 -2
  68. package/dist/{chunk-KQAFEZQX.js → chunk-BUKK5SWA.js} +2 -2
  69. package/dist/{chunk-DJFULNXK.js → chunk-C2AYUXEF.js} +2 -2
  70. package/dist/{chunk-QY24FSXT.js → chunk-D3BYJSHX.js} +51 -51
  71. package/dist/{chunk-JZRQY7ZQ.js → chunk-D4WR56FR.js} +2 -2
  72. package/dist/{chunk-3E3Z6UA3.js → chunk-DMYNM3WG.js} +124 -97
  73. package/dist/chunk-DMYNM3WG.js.map +1 -0
  74. package/dist/{chunk-FB4JQEFS.js → chunk-DP22K7IC.js} +2 -2
  75. package/dist/{chunk-EJFOGYF3.js → chunk-DTQJ7BRN.js} +3 -3
  76. package/dist/{chunk-MLUPSZFK.js → chunk-DZL5PBEJ.js} +2 -2
  77. package/dist/{chunk-JD5F5MYN.js → chunk-EGCC5OJE.js} +3 -3
  78. package/dist/{chunk-IQSRVR6Z.js → chunk-EJ4RS7I7.js} +2 -2
  79. package/dist/{chunk-WBN66HPI.js → chunk-ELHJK7LM.js} +6 -6
  80. package/dist/{chunk-EH46DHBU.js → chunk-ENAPZQA6.js} +2 -2
  81. package/dist/{chunk-LLG5VNK7.js → chunk-F2UAAI6B.js} +2 -2
  82. package/dist/{chunk-YZNTAOPZ.js → chunk-FKNNWH7P.js} +2 -2
  83. package/dist/{chunk-AAANTXCQ.js → chunk-FZVZYU5C.js} +2 -2
  84. package/dist/{chunk-ON77FQXH.js → chunk-G6GMZJQ4.js} +2 -2
  85. package/dist/{chunk-OL7A7NKH.js → chunk-GNP4BV4Z.js} +2 -2
  86. package/dist/{chunk-GDYLZ6FR.js → chunk-HJ3UTGIW.js} +3 -3
  87. package/dist/{chunk-CCL2OXFO.js → chunk-HSHLDSPX.js} +3 -3
  88. package/dist/{chunk-R4BR62UO.js → chunk-HWMGQDZI.js} +2 -2
  89. package/dist/{chunk-BPIAXMGC.js → chunk-IIUEHIQ2.js} +2 -2
  90. package/dist/{chunk-RTJJPW3C.js → chunk-ILMB3X4X.js} +5 -5
  91. package/dist/{chunk-RFT4OPYI.js → chunk-IPN67KVR.js} +2 -2
  92. package/dist/chunk-JCL7RO2G.js +674 -0
  93. package/dist/chunk-JCL7RO2G.js.map +1 -0
  94. package/dist/{chunk-IEW6NDHX.js → chunk-JGSWWD33.js} +9 -9
  95. package/dist/{chunk-A3UFV4K3.js → chunk-JIYJIH5N.js} +2 -2
  96. package/dist/{chunk-4G2A7MH3.js → chunk-JKUVPVKR.js} +3 -3
  97. package/dist/{chunk-YJHOVA42.js → chunk-JL5FHZ7O.js} +30 -6
  98. package/dist/chunk-JL5FHZ7O.js.map +1 -0
  99. package/dist/{chunk-VCLNU6MY.js → chunk-L2HSSVVD.js} +2 -2
  100. package/dist/{chunk-U2A56LLF.js → chunk-L334PSLW.js} +8 -8
  101. package/dist/{chunk-HQUYENKK.js → chunk-LIUI46BX.js} +3 -3
  102. package/dist/{chunk-ERMT5WQM.js → chunk-MKE5DP3S.js} +2 -2
  103. package/dist/{chunk-4OFXLQJD.js → chunk-MPDLLLOG.js} +8 -3
  104. package/dist/chunk-MPDLLLOG.js.map +1 -0
  105. package/dist/{chunk-6BO27AWQ.js → chunk-MPJ7VHHA.js} +2 -2
  106. package/dist/{chunk-WXBVGKS6.js → chunk-N7RAABFM.js} +182 -421
  107. package/dist/chunk-N7RAABFM.js.map +1 -0
  108. package/dist/{chunk-KMJDH4KX.js → chunk-NSUGAIIB.js} +16 -16
  109. package/dist/{chunk-7NT3FKAF.js → chunk-NXHBQC2O.js} +2 -2
  110. package/dist/{chunk-JEX2JL3U.js → chunk-OH55F76C.js} +2 -2
  111. package/dist/{chunk-37VTMUAL.js → chunk-OUJ4DVR5.js} +2 -2
  112. package/dist/{chunk-2NLLXCJG.js → chunk-OWHERGF2.js} +2 -2
  113. package/dist/{chunk-2IVK5IDY.js → chunk-P5F7ISLV.js} +2 -2
  114. package/dist/{chunk-PM4PKC3Y.js → chunk-PNVQNAJM.js} +3 -3
  115. package/dist/{chunk-FXWX7VD3.js → chunk-PRYDNBCO.js} +12 -12
  116. package/dist/{chunk-YDDLSGYE.js → chunk-PUTH5REB.js} +2 -2
  117. package/dist/{chunk-GFAEKSFR.js → chunk-QBK3IM6W.js} +5 -5
  118. package/dist/{chunk-KRAMCBIW.js → chunk-QKXPOLQD.js} +4 -4
  119. package/dist/{chunk-YDT3OEYF.js → chunk-R4ZHF4K2.js} +2 -2
  120. package/dist/{chunk-ISNPYOXR.js → chunk-RBUR6USI.js} +5 -5
  121. package/dist/{chunk-WZYAXOGO.js → chunk-RZSHIJYY.js} +2 -2
  122. package/dist/{chunk-TYSD7UQO.js → chunk-SVTIWBSA.js} +2 -2
  123. package/dist/{chunk-AMKIIRLL.js → chunk-TBFAQHQZ.js} +2 -2
  124. package/dist/{chunk-ZE5N4JSY.js → chunk-TKCJI7WA.js} +2 -2
  125. package/dist/{chunk-RYB553SS.js → chunk-TLOAAOT3.js} +2 -2
  126. package/dist/{chunk-RKRX4C4H.js → chunk-TPKB7T6Z.js} +2 -2
  127. package/dist/{chunk-JZCBMKR5.js → chunk-TUCEP2LS.js} +5 -5
  128. package/dist/{chunk-KZMRMKC7.js → chunk-U7MIMS2Y.js} +11 -1
  129. package/dist/chunk-U7MIMS2Y.js.map +1 -0
  130. package/dist/{chunk-OMWQO7H6.js → chunk-UEDC2VGP.js} +2 -2
  131. package/dist/{chunk-X7Y7WX73.js → chunk-UVYI6VIX.js} +1 -1
  132. package/dist/{chunk-JY2BGCYN.js → chunk-VCYH2XUY.js} +2 -2
  133. package/dist/{chunk-NGH74LDV.js → chunk-WD2QH3JM.js} +9 -9
  134. package/dist/{chunk-G6A3SGCE.js → chunk-WVEEVYMH.js} +8 -25
  135. package/dist/chunk-WVEEVYMH.js.map +1 -0
  136. package/dist/{chunk-UGTYADB4.js → chunk-WWSJQ7MP.js} +3 -3
  137. package/dist/{chunk-UQBOPCDK.js → chunk-X4PAATLA.js} +2 -2
  138. package/dist/{chunk-KBOQQEVC.js → chunk-XAFSZ4DP.js} +2 -2
  139. package/dist/{chunk-2S6JADBB.js → chunk-XICJL56Z.js} +2 -2
  140. package/dist/{chunk-Y5KESB7T.js → chunk-XJDSZFBZ.js} +45 -45
  141. package/dist/{chunk-24SIB3EW.js → chunk-XWE3EOWX.js} +2 -2
  142. package/dist/{chunk-Y77FXULH.js → chunk-XWXBXBOX.js} +2 -2
  143. package/dist/{chunk-VKQI47DJ.js → chunk-Y7427SL7.js} +4 -4
  144. package/dist/{chunk-TEH5MDX5.js → chunk-YH7HJNWV.js} +22 -22
  145. package/dist/chunk-YHTG64XV.js +117 -0
  146. package/dist/chunk-YHTG64XV.js.map +1 -0
  147. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  148. package/dist/{chunk-2M36PR7R.js → chunk-Z2T5BPOZ.js} +2 -2
  149. package/dist/cli.js +100 -97
  150. package/dist/coding/export-okf-codegraph.js +15 -11
  151. package/dist/coding/export-okf-codegraph.js.map +1 -1
  152. package/dist/coding/pre-action-gate.js +2 -2
  153. package/dist/compounding/engine.js +17 -13
  154. package/dist/config.js +24 -20
  155. package/dist/connectors/codex-materialize-runner.js +16 -12
  156. package/dist/connectors/index.js +16 -12
  157. package/dist/convergence-refresh.js +18 -14
  158. package/dist/corpus-scan-worker-host.d.ts +109 -0
  159. package/dist/corpus-scan-worker-host.d.ts.map +1 -0
  160. package/dist/corpus-scan-worker-host.js +15 -0
  161. package/dist/corpus-scan-worker.entry.d.ts +21 -0
  162. package/dist/corpus-scan-worker.entry.d.ts.map +1 -0
  163. package/dist/corpus-scan-worker.entry.js +60 -0
  164. package/dist/corpus-scan-worker.entry.js.map +1 -0
  165. package/dist/corpus-scan-worker.entry.mjs +176 -0
  166. package/dist/corpus-scan.d.ts +71 -0
  167. package/dist/corpus-scan.d.ts.map +1 -0
  168. package/dist/corpus-scan.js +16 -0
  169. package/dist/corpus-watermark.d.ts.map +1 -1
  170. package/dist/corpus-watermark.js +18 -14
  171. package/dist/dashboard-runtime.js +2 -2
  172. package/dist/deep-recall-http-glue.js +10 -10
  173. package/dist/embedding-fallback.js +2 -2
  174. package/dist/{entity-canonical-id-migration-F3JVG6K6.js → entity-canonical-id-migration-CUDCKWPF.js} +4 -2
  175. package/dist/entity-canonical-id-migration-CUDCKWPF.js.map +1 -0
  176. package/dist/entity-retrieval.js +18 -14
  177. package/dist/event-order-recall.js +3 -3
  178. package/dist/external-wiki-access.js +54 -51
  179. package/dist/extraction.js +21 -17
  180. package/dist/{graph-edge-decay-IU75NV42.js → graph-edge-decay-2BZTY2IM.js} +5 -5
  181. package/dist/graph-edge-decay-2BZTY2IM.js.map +1 -0
  182. package/dist/graph-jsonl.js +3 -3
  183. package/dist/graph-snapshot.js +3 -3
  184. package/dist/graph.js +2 -2
  185. package/dist/harmonic-retrieval.js +16 -12
  186. package/dist/index.d.ts +1 -1
  187. package/dist/index.d.ts.map +1 -1
  188. package/dist/index.js +174 -169
  189. package/dist/lcm/engine.js +2 -2
  190. package/dist/lcm/index.js +5 -5
  191. package/dist/location/index.js +18 -14
  192. package/dist/maintenance/memory-governance.js +16 -12
  193. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -12
  194. package/dist/maintenance/rebuild-memory-projection-runner.js +18 -14
  195. package/dist/maintenance/rebuild-memory-projection.js +17 -13
  196. package/dist/memory-browse-operations.js +54 -51
  197. package/dist/memory-browse.js +5 -5
  198. package/dist/namespaces/migrate.js +17 -13
  199. package/dist/namespaces/search.js +7 -7
  200. package/dist/namespaces/storage.js +16 -12
  201. package/dist/offline-sync-changeset-generations.js +4 -4
  202. package/dist/offline-sync-embedding-generation.js +3 -3
  203. package/dist/offline-sync-snapshot-stream.js +7 -7
  204. package/dist/offline-sync.js +6 -6
  205. package/dist/operator-doctor-corpus.js +19 -15
  206. package/dist/operator-toolkit.js +35 -31
  207. package/dist/orchestration/buffer-drain-gate.d.ts +21 -0
  208. package/dist/orchestration/buffer-drain-gate.d.ts.map +1 -0
  209. package/dist/orchestration/buffer-drain-runner.d.ts +79 -0
  210. package/dist/orchestration/buffer-drain-runner.d.ts.map +1 -0
  211. package/dist/orchestration/buffer-drain-runner.js +780 -0
  212. package/dist/orchestration/buffer-drain-runner.js.map +1 -0
  213. package/dist/orchestration/buffer-swap.d.ts +12 -0
  214. package/dist/orchestration/buffer-swap.d.ts.map +1 -0
  215. package/dist/orchestration/maintenance.js +26 -22
  216. package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
  217. package/dist/orchestrator.d.ts +4 -1
  218. package/dist/orchestrator.d.ts.map +1 -1
  219. package/dist/orchestrator.js +143 -140
  220. package/dist/qmd.js +4 -4
  221. package/dist/recall-navigation-operations.js +54 -51
  222. package/dist/recall-navigation.js +53 -50
  223. package/dist/recall-state-view-admission.js +5 -5
  224. package/dist/recall-why-service.js +5 -5
  225. package/dist/resume-bundles.js +25 -21
  226. package/dist/search/factory.js +6 -6
  227. package/dist/search/index.js +12 -12
  228. package/dist/semantic-consolidation.js +17 -13
  229. package/dist/semantic-rule-promotion.js +16 -12
  230. package/dist/semantic-rule-verifier.js +16 -12
  231. package/dist/source-agent-qualifier.js +19 -15
  232. package/dist/standup/build.js +16 -12
  233. package/dist/storage/buffer-drain-claims.d.ts +159 -0
  234. package/dist/storage/buffer-drain-claims.d.ts.map +1 -0
  235. package/dist/storage/buffer-drain-claims.js +18 -0
  236. package/dist/storage/buffer-drain-claims.js.map +1 -0
  237. package/dist/storage/buffer-session-files.d.ts +14 -2
  238. package/dist/storage/buffer-session-files.d.ts.map +1 -1
  239. package/dist/storage/buffer-session-files.js +22 -0
  240. package/dist/storage/buffer-session-files.js.map +1 -0
  241. package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
  242. package/dist/storage/memory-read-store.d.ts +5 -9
  243. package/dist/storage/memory-read-store.d.ts.map +1 -1
  244. package/dist/storage.d.ts +6 -1
  245. package/dist/storage.d.ts.map +1 -1
  246. package/dist/storage.js +17 -13
  247. package/dist/support-passport/index.js +56 -53
  248. package/dist/transfer/backup.js +2 -2
  249. package/dist/transfer/capsule-export.js +2 -2
  250. package/dist/transfer/capsule-import.js +2 -2
  251. package/dist/transfer/export-okf.js +16 -12
  252. package/dist/verified-recall.js +16 -12
  253. package/dist/who-knows-cli.js +17 -13
  254. package/dist/who-knows.js +16 -12
  255. package/package.json +32 -2
  256. package/scripts/build-with-heap.mjs +8 -0
  257. package/src/buffer-drain-handover.test.ts +307 -0
  258. package/src/buffer-persistence.ts +27 -5
  259. package/src/buffer-turn-helpers.ts +16 -0
  260. package/src/buffer.ts +32 -2
  261. package/src/corpus-scan-worker-host.ts +314 -0
  262. package/src/corpus-scan-worker.entry.mjs +176 -0
  263. package/src/corpus-scan-worker.entry.ts +95 -0
  264. package/src/corpus-scan.ts +215 -0
  265. package/src/corpus-watermark.ts +28 -12
  266. package/src/index.ts +1 -1
  267. package/src/orchestration/buffer-drain-gate.test.ts +40 -0
  268. package/src/orchestration/buffer-drain-gate.ts +38 -0
  269. package/src/orchestration/buffer-drain-runner.ts +312 -0
  270. package/src/orchestration/buffer-swap.ts +27 -0
  271. package/src/orchestration/turn-ingestion.ts +2 -0
  272. package/src/orchestrator.ts +9 -6
  273. package/src/storage/buffer-drain-claims.test.ts +448 -0
  274. package/src/storage/buffer-drain-claims.ts +593 -0
  275. package/src/storage/buffer-session-files.ts +50 -3
  276. package/src/storage/entity-canonical-id-migration.ts +4 -26
  277. package/src/storage/memory-read-store.ts +17 -99
  278. package/src/storage.ts +8 -11
  279. package/src/testing/subjects/extraction-lifecycle.test.ts +34 -0
  280. package/dist/chunk-3E3Z6UA3.js.map +0 -1
  281. package/dist/chunk-4OFXLQJD.js.map +0 -1
  282. package/dist/chunk-5U2BBF7E.js.map +0 -1
  283. package/dist/chunk-G6A3SGCE.js.map +0 -1
  284. package/dist/chunk-KZMRMKC7.js.map +0 -1
  285. package/dist/chunk-WXBVGKS6.js.map +0 -1
  286. package/dist/chunk-YJHOVA42.js.map +0 -1
  287. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
  288. /package/dist/{chunk-ZAZZOQAQ.js.map → chunk-23OEPU3K.js.map} +0 -0
  289. /package/dist/{chunk-XDKEHZUC.js.map → chunk-264B57GV.js.map} +0 -0
  290. /package/dist/{chunk-NRGQ5HJO.js.map → chunk-4P4VLPGB.js.map} +0 -0
  291. /package/dist/{chunk-GIRWNTMV.js.map → chunk-4PG5R6BJ.js.map} +0 -0
  292. /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
  293. /package/dist/{chunk-RG3I2663.js.map → chunk-64JLBFCQ.js.map} +0 -0
  294. /package/dist/{chunk-G3T6YMBO.js.map → chunk-64S6X4IU.js.map} +0 -0
  295. /package/dist/{chunk-WASVDS6G.js.map → chunk-6HTEPYOI.js.map} +0 -0
  296. /package/dist/{chunk-6AEKSOWV.js.map → chunk-6I6DFULH.js.map} +0 -0
  297. /package/dist/{chunk-DJR37Q37.js.map → chunk-6T4CMKNP.js.map} +0 -0
  298. /package/dist/{chunk-RHJ5VGB3.js.map → chunk-73A2DDDR.js.map} +0 -0
  299. /package/dist/{chunk-4B73TQQV.js.map → chunk-7AKPLEJV.js.map} +0 -0
  300. /package/dist/{chunk-UHH67NLU.js.map → chunk-7OKYO2UC.js.map} +0 -0
  301. /package/dist/{chunk-KAL5SXPP.js.map → chunk-7ULSP7AU.js.map} +0 -0
  302. /package/dist/{chunk-USNU3BEQ.js.map → chunk-A4FZLM6Q.js.map} +0 -0
  303. /package/dist/{chunk-VV73XT3A.js.map → chunk-BJLCV2P3.js.map} +0 -0
  304. /package/dist/{chunk-KQAFEZQX.js.map → chunk-BUKK5SWA.js.map} +0 -0
  305. /package/dist/{chunk-DJFULNXK.js.map → chunk-C2AYUXEF.js.map} +0 -0
  306. /package/dist/{chunk-QY24FSXT.js.map → chunk-D3BYJSHX.js.map} +0 -0
  307. /package/dist/{chunk-JZRQY7ZQ.js.map → chunk-D4WR56FR.js.map} +0 -0
  308. /package/dist/{chunk-FB4JQEFS.js.map → chunk-DP22K7IC.js.map} +0 -0
  309. /package/dist/{chunk-EJFOGYF3.js.map → chunk-DTQJ7BRN.js.map} +0 -0
  310. /package/dist/{chunk-MLUPSZFK.js.map → chunk-DZL5PBEJ.js.map} +0 -0
  311. /package/dist/{chunk-JD5F5MYN.js.map → chunk-EGCC5OJE.js.map} +0 -0
  312. /package/dist/{chunk-IQSRVR6Z.js.map → chunk-EJ4RS7I7.js.map} +0 -0
  313. /package/dist/{chunk-WBN66HPI.js.map → chunk-ELHJK7LM.js.map} +0 -0
  314. /package/dist/{chunk-EH46DHBU.js.map → chunk-ENAPZQA6.js.map} +0 -0
  315. /package/dist/{chunk-LLG5VNK7.js.map → chunk-F2UAAI6B.js.map} +0 -0
  316. /package/dist/{chunk-YZNTAOPZ.js.map → chunk-FKNNWH7P.js.map} +0 -0
  317. /package/dist/{chunk-AAANTXCQ.js.map → chunk-FZVZYU5C.js.map} +0 -0
  318. /package/dist/{chunk-ON77FQXH.js.map → chunk-G6GMZJQ4.js.map} +0 -0
  319. /package/dist/{chunk-OL7A7NKH.js.map → chunk-GNP4BV4Z.js.map} +0 -0
  320. /package/dist/{chunk-GDYLZ6FR.js.map → chunk-HJ3UTGIW.js.map} +0 -0
  321. /package/dist/{chunk-CCL2OXFO.js.map → chunk-HSHLDSPX.js.map} +0 -0
  322. /package/dist/{chunk-R4BR62UO.js.map → chunk-HWMGQDZI.js.map} +0 -0
  323. /package/dist/{chunk-BPIAXMGC.js.map → chunk-IIUEHIQ2.js.map} +0 -0
  324. /package/dist/{chunk-RTJJPW3C.js.map → chunk-ILMB3X4X.js.map} +0 -0
  325. /package/dist/{chunk-RFT4OPYI.js.map → chunk-IPN67KVR.js.map} +0 -0
  326. /package/dist/{chunk-IEW6NDHX.js.map → chunk-JGSWWD33.js.map} +0 -0
  327. /package/dist/{chunk-A3UFV4K3.js.map → chunk-JIYJIH5N.js.map} +0 -0
  328. /package/dist/{chunk-4G2A7MH3.js.map → chunk-JKUVPVKR.js.map} +0 -0
  329. /package/dist/{chunk-VCLNU6MY.js.map → chunk-L2HSSVVD.js.map} +0 -0
  330. /package/dist/{chunk-U2A56LLF.js.map → chunk-L334PSLW.js.map} +0 -0
  331. /package/dist/{chunk-HQUYENKK.js.map → chunk-LIUI46BX.js.map} +0 -0
  332. /package/dist/{chunk-ERMT5WQM.js.map → chunk-MKE5DP3S.js.map} +0 -0
  333. /package/dist/{chunk-6BO27AWQ.js.map → chunk-MPJ7VHHA.js.map} +0 -0
  334. /package/dist/{chunk-KMJDH4KX.js.map → chunk-NSUGAIIB.js.map} +0 -0
  335. /package/dist/{chunk-7NT3FKAF.js.map → chunk-NXHBQC2O.js.map} +0 -0
  336. /package/dist/{chunk-JEX2JL3U.js.map → chunk-OH55F76C.js.map} +0 -0
  337. /package/dist/{chunk-37VTMUAL.js.map → chunk-OUJ4DVR5.js.map} +0 -0
  338. /package/dist/{chunk-2NLLXCJG.js.map → chunk-OWHERGF2.js.map} +0 -0
  339. /package/dist/{chunk-2IVK5IDY.js.map → chunk-P5F7ISLV.js.map} +0 -0
  340. /package/dist/{chunk-PM4PKC3Y.js.map → chunk-PNVQNAJM.js.map} +0 -0
  341. /package/dist/{chunk-FXWX7VD3.js.map → chunk-PRYDNBCO.js.map} +0 -0
  342. /package/dist/{chunk-YDDLSGYE.js.map → chunk-PUTH5REB.js.map} +0 -0
  343. /package/dist/{chunk-GFAEKSFR.js.map → chunk-QBK3IM6W.js.map} +0 -0
  344. /package/dist/{chunk-KRAMCBIW.js.map → chunk-QKXPOLQD.js.map} +0 -0
  345. /package/dist/{chunk-YDT3OEYF.js.map → chunk-R4ZHF4K2.js.map} +0 -0
  346. /package/dist/{chunk-ISNPYOXR.js.map → chunk-RBUR6USI.js.map} +0 -0
  347. /package/dist/{chunk-WZYAXOGO.js.map → chunk-RZSHIJYY.js.map} +0 -0
  348. /package/dist/{chunk-TYSD7UQO.js.map → chunk-SVTIWBSA.js.map} +0 -0
  349. /package/dist/{chunk-AMKIIRLL.js.map → chunk-TBFAQHQZ.js.map} +0 -0
  350. /package/dist/{chunk-ZE5N4JSY.js.map → chunk-TKCJI7WA.js.map} +0 -0
  351. /package/dist/{chunk-RYB553SS.js.map → chunk-TLOAAOT3.js.map} +0 -0
  352. /package/dist/{chunk-RKRX4C4H.js.map → chunk-TPKB7T6Z.js.map} +0 -0
  353. /package/dist/{chunk-JZCBMKR5.js.map → chunk-TUCEP2LS.js.map} +0 -0
  354. /package/dist/{chunk-OMWQO7H6.js.map → chunk-UEDC2VGP.js.map} +0 -0
  355. /package/dist/{chunk-X7Y7WX73.js.map → chunk-UVYI6VIX.js.map} +0 -0
  356. /package/dist/{chunk-JY2BGCYN.js.map → chunk-VCYH2XUY.js.map} +0 -0
  357. /package/dist/{chunk-NGH74LDV.js.map → chunk-WD2QH3JM.js.map} +0 -0
  358. /package/dist/{chunk-UGTYADB4.js.map → chunk-WWSJQ7MP.js.map} +0 -0
  359. /package/dist/{chunk-UQBOPCDK.js.map → chunk-X4PAATLA.js.map} +0 -0
  360. /package/dist/{chunk-KBOQQEVC.js.map → chunk-XAFSZ4DP.js.map} +0 -0
  361. /package/dist/{chunk-2S6JADBB.js.map → chunk-XICJL56Z.js.map} +0 -0
  362. /package/dist/{chunk-Y5KESB7T.js.map → chunk-XJDSZFBZ.js.map} +0 -0
  363. /package/dist/{chunk-24SIB3EW.js.map → chunk-XWE3EOWX.js.map} +0 -0
  364. /package/dist/{chunk-Y77FXULH.js.map → chunk-XWXBXBOX.js.map} +0 -0
  365. /package/dist/{chunk-VKQI47DJ.js.map → chunk-Y7427SL7.js.map} +0 -0
  366. /package/dist/{chunk-TEH5MDX5.js.map → chunk-YH7HJNWV.js.map} +0 -0
  367. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  368. /package/dist/{chunk-2M36PR7R.js.map → chunk-Z2T5BPOZ.js.map} +0 -0
  369. /package/dist/{entity-canonical-id-migration-F3JVG6K6.js.map → corpus-scan-worker-host.js.map} +0 -0
  370. /package/dist/{graph-edge-decay-IU75NV42.js.map → corpus-scan.js.map} +0 -0
@@ -13,6 +13,7 @@ import {
13
13
  import path from "node:path";
14
14
  import { lstatSync, readFileSync } from "node:fs";
15
15
  import { z } from "zod";
16
+ import { corpusScanWorker } from "../corpus-scan-worker-host.js";
16
17
  import { computeSupersessionKey, normalizeSupersessionKey } from "../temporal-supersession.js";
17
18
  import type { EntityFile, MemoryFile } from "../types.js";
18
19
  import { log } from "../logger.js";
@@ -102,31 +103,6 @@ async function fingerprintPath(filePath: string): Promise<string> {
102
103
  : "missing";
103
104
  }
104
105
 
105
- async function fingerprintEntityEntries(entitiesDir: string): Promise<string> {
106
- let names: string[];
107
- try {
108
- names = (await readdir(entitiesDir))
109
- .filter((name) => path.extname(name) === ".md" && !isMacOsReplicationJunkBasename(name))
110
- .sort();
111
- } catch (error) {
112
- if (isErrnoCode(error, "ENOENT")) return "missing";
113
- throw error;
114
- }
115
- const hash = createHash("sha256");
116
- for (const name of names) {
117
- hash.update(`${name.length}:${name}:`);
118
- try {
119
- const entry = await lstat(path.join(entitiesDir, name), { bigint: true });
120
- hash.update(`${entry.dev}:${entry.ino}:${entry.size}:${entry.mtimeNs}:${entry.ctimeNs}`);
121
- } catch (error) {
122
- if (!isErrnoCode(error, "ENOENT")) throw error;
123
- hash.update("missing");
124
- }
125
- hash.update("\n");
126
- }
127
- return hash.digest("hex");
128
- }
129
-
130
106
  /**
131
107
  * Completion fingerprint for migration inputs only. Entity entry identities
132
108
  * catch same-path edits that do not change the directory inode; the cooperative
@@ -146,7 +122,9 @@ export async function getFingerprint(
146
122
  consumingFingerprint,
147
123
  ] = await Promise.all([
148
124
  fingerprintPath(entitiesDir),
149
- fingerprintEntityEntries(entitiesDir),
125
+ // The entry enumeration is one lstat per entity file — a corpus-sized
126
+ // syscall storm on the main thread. It runs in the corpus-scan worker.
127
+ corpusScanWorker.request({ kind: "entity-entries-fingerprint", entitiesDir }),
150
128
  fingerprintPath(path.join(baseDir, "config", "aliases.json")),
151
129
  fingerprintPath(path.join(baseDir, "state", ENTITY_CANONICAL_ID_RECONCILE_MARKER)),
152
130
  fingerprintPath(path.join(baseDir, "state", ENTITY_CANONICAL_ID_RECONCILE_CONSUMING_MARKER)),
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import type { Dirent, Stats } from "node:fs";
13
- import { lstat, readdir, realpath, stat } from "node:fs/promises";
13
+ import { lstat, readdir, stat } from "node:fs/promises";
14
14
  import path from "node:path";
15
15
  import { toMemoryPathRel } from "../memory-lifecycle-ledger-utils.js";
16
16
  import { SecureStoreLockedError, readMaybeEncryptedFile } from "../secure-store/secure-fs.js";
@@ -30,6 +30,7 @@ import {
30
30
  StorageManager,
31
31
  } from "../storage.js";
32
32
  import { rememberRawFrontmatter } from "./memory-frontmatter-metadata.js";
33
+ import { corpusScanWorker } from "../corpus-scan-worker-host.js";
33
34
 
34
35
  export interface MemoryReadStoreDeps {
35
36
  /** Live class object of the host instance — shared static caches (see storage.ts storageManagerClass). */
@@ -85,19 +86,6 @@ export interface MemoryReadStoreDeps {
85
86
  readonly wearablesDir: string;
86
87
  }
87
88
 
88
- /**
89
- * A backend READ failure worth propagating from a strict (census) scan: an
90
- * errno-coded fs error that is NOT `ENOENT`. `ENOENT` (an absent dir) and
91
- * code-less rejections are expected and skipped; `EACCES`/`EIO`/… mean the
92
- * corpus is unreadable and a divergence census must fail loud rather than
93
- * silently publish a partial count (issue #2156 round-5). Non-strict (recall)
94
- * callers ignore this and degrade to a best-effort partial scan.
95
- */
96
- function isPropagatableReadError(err: unknown): boolean {
97
- const code = (err as NodeJS.ErrnoException).code;
98
- return typeof code === "string" && code !== "ENOENT";
99
- }
100
-
101
89
  /**
102
90
  * Markdown under this store's `entities/` directory. The first relative
103
91
  * segment must be `entities`; a memory root whose absolute path contains
@@ -233,15 +221,11 @@ export class MemoryReadStore {
233
221
  * escape: a category dir symlinked outside memoryDir (e.g. decisions/ -> an
234
222
  * external dir) must NOT pull out-of-store files into a scan (info leak).
235
223
  *
236
- * Containment is established once, not per file: the memory root is resolved
237
- * with a single `realpath`, every directory the walk enters is `lstat`ed (a
238
- * symlinked or non-directory entry is never followed), and the entry TYPE
239
- * comes from `readdir(withFileTypes)` — so a symlinked entry, file or
240
- * directory, is skipped without a per-entry `realpath`. The old per-entry
241
- * `realpath` cost one syscall per markdown file (hundreds of thousands per
242
- * corpus scan) to re-derive a fact the directory-level checks already
243
- * establish; reads refuse symlinked files at open time with `O_NOFOLLOW`, so
244
- * a path swapped to a symlink mid-scan is refused rather than followed.
224
+ * The walk runs in the corpus-scan worker: it is one `readdir` + `lstat` per
225
+ * directory over the whole corpus, and on the main event loop that starves
226
+ * observe, recall and the extraction queue behind it. The implementation is
227
+ * shared (src/corpus-scan.ts) and the host runs it inline when no worker
228
+ * can start, so the collected path set is the same either way.
245
229
  * Paths only — no frontmatter parse.
246
230
  */
247
231
  private async collectContainedMarkdownPaths(
@@ -249,82 +233,16 @@ export class MemoryReadStore {
249
233
  propagateReadErrors = false,
250
234
  options?: CorpusReadOptions,
251
235
  ): Promise<string[]> {
252
- const filePaths: string[] = [];
253
-
254
- // Resolve the memory root once: a missing root is an empty corpus and an
255
- // unreadable root is a backend failure the strict census must surface.
256
- try {
257
- await realpath(this.deps.baseDir);
258
- } catch (err) {
259
- // ENOENT: a not-yet-created root ⇒ empty. Any other errno is a backend
260
- // read failure — propagate for strict census callers (never publish an
261
- // unreadable corpus as empty); non-strict (recall) callers degrade.
262
- if (propagateReadErrors && isPropagatableReadError(err)) throw err;
263
- return filePaths;
264
- }
265
-
266
- const collectPaths = async (dir: string): Promise<void> => {
267
- checkCorpusReadAbort(options);
268
- // Directory-level guard, isolated from per-entry handling: skip symlinked
269
- // or non-directory category dirs. A failure here means the whole subtree
270
- // does not exist or escaped the store — fail closed by skipping it.
271
- let dirStat: Stats;
272
- try {
273
- dirStat = await lstat(dir);
274
- } catch (err) {
275
- // ENOENT (absent category dir) is expected; a backend read error
276
- // (EACCES/EIO/…) propagates in strict census mode.
277
- if (propagateReadErrors && isPropagatableReadError(err)) throw err;
278
- return;
279
- }
280
- if (dirStat.isSymbolicLink()) return; // never follow symlinks out of the store (both modes)
281
- if (!dirStat.isDirectory()) {
282
- // A category root that EXISTS but is not a directory (e.g. `facts/`
283
- // replaced by a regular file) is a layout/backend failure: a strict
284
- // census must not silently publish the remaining categories as healthy.
285
- // Non-strict (recall) stays best-effort and skips it (issue #2156 round-10).
286
- if (propagateReadErrors) {
287
- throw new Error(`corpus scan: expected a directory but found a non-directory at ${dir}`);
288
- }
289
- return;
290
- }
291
- let entries: Dirent[];
292
- try {
293
- entries = await readdir(dir, { withFileTypes: true });
294
- } catch (err) {
295
- // A backend read error (EACCES …) propagates in strict census mode so a
296
- // partial subtree is not silently counted. ENOENT (vanished mid-scan)
297
- // and other non-propagatable failures skip the directory.
298
- if (propagateReadErrors && isPropagatableReadError(err)) throw err;
299
- return;
300
- }
301
-
302
- const subdirs: string[] = [];
303
- for (const entry of entries) {
304
- // Outside the per-entry handling below, which deliberately swallows
305
- // non-propagatable errors — a cancellation must never be swallowed with
306
- // them (issue #2307).
307
- checkCorpusReadAbort(options);
308
- // Never follow symlinked entries out of the store.
309
- if (entry.isSymbolicLink()) continue;
310
- if (isMacOsReplicationJunkBasename(entry.name)) continue;
311
- const fullPath = path.join(dir, entry.name);
312
- if (entry.isDirectory()) {
313
- subdirs.push(fullPath);
314
- } else if (entry.name.endsWith(".md")) {
315
- filePaths.push(fullPath);
316
- }
317
- }
318
- // Recurse into real subdirectories regardless of any single poisoned entry
319
- // above, so valid nested in-store memories are never dropped.
320
- for (const subdir of subdirs) {
321
- await collectPaths(subdir);
322
- }
323
- };
324
-
325
- for (const dir of startDirs) {
326
- await collectPaths(dir);
327
- }
236
+ checkCorpusReadAbort(options);
237
+ const filePaths = await corpusScanWorker.request(
238
+ {
239
+ kind: "walk",
240
+ baseDir: this.deps.baseDir,
241
+ startDirs: [...startDirs],
242
+ propagateReadErrors,
243
+ },
244
+ options?.abortSignal,
245
+ );
328
246
  // A signal that fired during the last directory read would otherwise return a
329
247
  // truncated path list as if it were the whole corpus (issue #2307 review).
330
248
  checkCorpusReadAbort(options);
package/src/storage.ts CHANGED
@@ -144,6 +144,7 @@ import {
144
144
  } from "./lifecycle/tombstones.js";
145
145
  import { supersessionKeysForFact } from "./temporal-supersession.js";
146
146
  import { BufferSessionFiles } from "./storage/buffer-session-files.js";
147
+ import { BufferDrainClaims, type BufferSessionSaveOutcome } from "./storage/buffer-drain-claims.js";
147
148
  import { runSupersessionSideEffects, type SupersessionAuditOptions } from "./storage/supersession-side-effects.js";
148
149
  import { saveDroppedExtractionChunk as saveDroppedChunk } from "./storage/dropped-extraction-chunk.js";
149
150
  import type {
@@ -5144,18 +5145,10 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5144
5145
  );
5145
5146
  } catch (err) {
5146
5147
  if (priorDest === null) {
5147
- await recordArchiveDelete(this.baseDir, destPath, () =>
5148
- unlink(destPath).then(
5149
- () => true,
5150
- () => false
5151
- )
5152
- );
5148
+ await recordArchiveDelete(this.baseDir, destPath, () => unlink(destPath).then(() => true, () => false));
5153
5149
  } else {
5154
5150
  await recordArchiveDelete(this.baseDir, destPath, () =>
5155
- this.writeStorageSecureFile(destPath, priorDest).then(
5156
- () => true,
5157
- () => false
5158
- )
5151
+ this.writeStorageSecureFile(destPath, priorDest).then(() => true, () => false)
5159
5152
  );
5160
5153
  }
5161
5154
  throw err;
@@ -5524,8 +5517,12 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
5524
5517
  }
5525
5518
  async loadBuffer(): Promise<BufferState> { return this.bufferSessionFiles().load(); }
5526
5519
  async saveBuffer(state: BufferState): Promise<void> { await this.bufferSessionFiles().reconcile(state); }
5527
- async saveBufferSession(key: string, entry: BufferEntryState): Promise<void> { await this.bufferSessionFiles().save(key, entry); }
5520
+ async saveBufferSession(key: string, entry: BufferEntryState): Promise<BufferSessionSaveOutcome> { return await this.bufferSessionFiles().save(key, entry); }
5528
5521
  async deleteBufferSession(key: string): Promise<void> { await this.bufferSessionFiles().remove(key); }
5522
+ /** Sync gate check for the extraction queue: is this session claimed by a buffer drain? */
5523
+ isBufferSessionClaimed(key: string): boolean { return this.bufferSessionFiles().isClaimed(key); }
5524
+ /** The drain-claim store for this memory root (CLI drain + worker). */
5525
+ bufferDrainClaims(): BufferDrainClaims { return this.bufferSessionFiles().claims; }
5529
5526
  saveDroppedExtractionChunk(bufferKey: string, reason: string, turns: readonly import("./types.js").BufferTurn[]): Promise<string> { // storage/dropped-extraction-chunk.ts
5530
5527
  return saveDroppedChunk(this.stateDir, (file, content) => this.writeStorageSecureFile(file, content), bufferKey, reason, turns);
5531
5528
  }
@@ -17,6 +17,7 @@ import assert from "node:assert/strict";
17
17
  import path from "node:path";
18
18
 
19
19
  import { Orchestrator } from "../../orchestrator.js";
20
+ import { BufferDrainRunner } from "../../orchestration/buffer-drain-runner.js";
20
21
  import { resolveNamespaceStorageRoot } from "../../namespaces/storage.js";
21
22
  import type { BufferTurn, PluginConfig } from "../../types.js";
22
23
  import {
@@ -135,6 +136,37 @@ async function assertHarmonicEpisode(memoryDir: string, sessionKey?: string): Pr
135
136
  if (sessionKey) assert.equal(status.latestNode?.sessionKey, sessionKey);
136
137
  }
137
138
 
139
+
140
+ /**
141
+ * The out-of-process drain path: a buffered session is claimed into a drain
142
+ * claim, the drain extracts it through the same pipeline, and the claim ends
143
+ * empty. The live buffer keeps its in-memory copy; the drain tombstone makes
144
+ * the owner subtract the drained turn instead of writing it back.
145
+ */
146
+ async function exerciseBufferDrain(state: ExtractionLifecycleState): Promise<void> {
147
+ // Its own memory root and orchestrator: the drain must not perturb the
148
+ // row's own extraction calls or fact counts.
149
+ const memoryDir = await mkTempMemoryDir("extraction-drain-row");
150
+ const cfg = makeHarmonicLifecycleConfig(memoryDir, { extraction: { spanMode: "on" } });
151
+ const orchestrator = new Orchestrator(cfg);
152
+ state.orchestrators.push(orchestrator);
153
+ stubExtraction(orchestrator, (turns) => spanBearingResult(turns));
154
+ const sessionKey = "drain-row-session";
155
+ const content = "The drain row retains the canary gate detail for the teal dashboard.";
156
+ await orchestrator.buffer.addTurn(sessionKey, {
157
+ role: "user",
158
+ content,
159
+ timestamp: new Date().toISOString(),
160
+ sessionKey,
161
+ });
162
+ await orchestrator.buffer.save();
163
+ const runner = new BufferDrainRunner(orchestrator);
164
+ assert.equal(await runner.claim(sessionKey, "subject-drain"), true, "the drain claims the buffered session");
165
+ const outcome = await runner.drainSession(sessionKey, { ownerId: "subject-drain" });
166
+ assert.equal(outcome.status, "drained", "the drain empties the claimed session");
167
+ assert.equal(outcome.turnsRemaining, 0, "no turn is left claimed");
168
+ }
169
+
138
170
  const subject: LifecycleSubject<ExtractionLifecycleState> = {
139
171
  async setup(row: MatrixRow): Promise<ExtractionLifecycleState> {
140
172
  const memoryDir = await mkTempMemoryDir(`extraction-${row.id}`);
@@ -254,6 +286,7 @@ const subject: LifecycleSubject<ExtractionLifecycleState> = {
254
286
  return;
255
287
  }
256
288
  case "before-reset": {
289
+ await exerciseBufferDrain(state);
257
290
  // Buffer a low-signal turn, then fire a before_reset flush whose abort
258
291
  // trips mid-extraction. The abort wiring (the signal threaded from
259
292
  // flushSession into runExtraction, guarding `before_persist` and
@@ -419,6 +452,7 @@ const subject: LifecycleSubject<ExtractionLifecycleState> = {
419
452
  return;
420
453
  }
421
454
  case "before-reset": {
455
+ await exerciseBufferDrain(state);
422
456
  assert.equal(
423
457
  state.abortFlushRejected,
424
458
  true,