@remnic/core 10.0.6 → 10.0.8

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 (400) hide show
  1. package/dist/access-admin-ops-surface.js +66 -64
  2. package/dist/access-authorization-probe.js +67 -65
  3. package/dist/access-boundary.js +66 -64
  4. package/dist/access-cli.js +133 -131
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +66 -64
  7. package/dist/access-http-briefing.js +67 -65
  8. package/dist/access-http-query.js +68 -66
  9. package/dist/access-http.js +90 -88
  10. package/dist/access-idempotency.d.ts.map +1 -1
  11. package/dist/access-idempotency.js +2 -1
  12. package/dist/access-identity-continuity-surface.js +66 -64
  13. package/dist/access-lcm-surface.js +66 -64
  14. package/dist/access-mcp.js +79 -77
  15. package/dist/access-namespace-preflight.js +66 -64
  16. package/dist/access-observe-write-category.js +15 -14
  17. package/dist/access-observe-write-surface.js +66 -64
  18. package/dist/access-offline-manifest.js +12 -11
  19. package/dist/access-operations-batch.js +70 -68
  20. package/dist/access-operations.js +77 -75
  21. package/dist/access-recall-concurrency.js +66 -64
  22. package/dist/access-recall-response.js +66 -64
  23. package/dist/access-recall-surface.js +66 -64
  24. package/dist/access-schema.js +10 -9
  25. package/dist/access-service.js +66 -64
  26. package/dist/access-surface-catalog.js +68 -66
  27. package/dist/access-surface-catalog.js.map +1 -1
  28. package/dist/active-recall.js +28 -27
  29. package/dist/active-recall.js.map +1 -1
  30. package/dist/adapters/index.js +4 -4
  31. package/dist/adapters/registry.js +2 -2
  32. package/dist/{auto-sync-FN7E3OTO.js → auto-sync-WSJAOLOP.js} +8 -7
  33. package/dist/{auto-sync-FN7E3OTO.js.map → auto-sync-WSJAOLOP.js.map} +1 -1
  34. package/dist/briefing.js +20 -19
  35. package/dist/buffer.js +13 -12
  36. package/dist/{capsule-merge-42GJGDUC.js → capsule-merge-M4HETD27.js} +5 -4
  37. package/dist/{capsule-merge-42GJGDUC.js.map → capsule-merge-M4HETD27.js.map} +1 -1
  38. package/dist/causal-behavior.js +2 -2
  39. package/dist/causal-chain.js +2 -2
  40. package/dist/causal-consolidation.js +23 -22
  41. package/dist/causal-consolidation.js.map +1 -1
  42. package/dist/causal-retrieval.js +2 -2
  43. package/dist/causal-trajectory-graph.js +4 -3
  44. package/dist/causal-trajectory-graph.js.map +1 -1
  45. package/dist/causal-trajectory.js +1 -1
  46. package/dist/{chunk-OZABSIOV.js → chunk-2AFHZTPI.js} +2 -2
  47. package/dist/{chunk-UK5EH7AI.js → chunk-2CXQZXWM.js} +3 -3
  48. package/dist/{chunk-D6M3VKMY.js → chunk-2K7D6EFT.js} +3 -3
  49. package/dist/{chunk-RIEGCK2W.js → chunk-2KRNPFPK.js} +2 -2
  50. package/dist/{chunk-N7QV3CMX.js → chunk-2NCBDGND.js} +2 -2
  51. package/dist/{chunk-XQSJXNWC.js → chunk-3ENX2RB4.js} +2 -2
  52. package/dist/{chunk-CLCMDKTB.js → chunk-3I3U6FFT.js} +2 -2
  53. package/dist/{chunk-WWLAKRMX.js → chunk-3NFN4Y4P.js} +5 -5
  54. package/dist/{chunk-I56MTWE7.js → chunk-3R6SLDTH.js} +2 -2
  55. package/dist/{chunk-QEPL7KIZ.js → chunk-3VTNNO2B.js} +6 -6
  56. package/dist/{chunk-QWUJWBZ5.js → chunk-4G4B3Z2B.js} +2 -2
  57. package/dist/{chunk-R7QY5ZVB.js → chunk-4NDWE44P.js} +2 -2
  58. package/dist/{chunk-KCCZFDJD.js → chunk-4OKPH6FG.js} +2 -2
  59. package/dist/{chunk-I25RQA65.js → chunk-55ZVZBX4.js} +2 -2
  60. package/dist/{chunk-ENNC3RZ6.js → chunk-5EOV7ANU.js} +2 -2
  61. package/dist/{chunk-ANZXWOYD.js → chunk-5FNVK7MW.js} +2 -2
  62. package/dist/{chunk-VFUEZZBS.js → chunk-5JMI26Q7.js} +5 -4
  63. package/dist/chunk-5JMI26Q7.js.map +1 -0
  64. package/dist/{chunk-KSUOM3YU.js → chunk-5NOPZYNI.js} +11 -11
  65. package/dist/{chunk-7LYRFI5A.js → chunk-5Q4NQNW7.js} +2 -2
  66. package/dist/chunk-5VC7J76U.js +134 -0
  67. package/dist/chunk-5VC7J76U.js.map +1 -0
  68. package/dist/{chunk-L3PWXD73.js → chunk-6PHB45IU.js} +2 -2
  69. package/dist/{chunk-CHDGJJV6.js → chunk-6VAHJ2F6.js} +2 -2
  70. package/dist/{chunk-KQT4DRKF.js → chunk-76KHEHT2.js} +2 -2
  71. package/dist/chunk-7LEQREP2.js +9 -0
  72. package/dist/chunk-7LEQREP2.js.map +1 -0
  73. package/dist/{chunk-SWRN6U7Q.js → chunk-7O252IE6.js} +2 -2
  74. package/dist/{chunk-U6HWKOGD.js → chunk-7OAIOE5P.js} +2 -2
  75. package/dist/{chunk-RSMIRLKM.js → chunk-7UX44C4N.js} +2 -2
  76. package/dist/{chunk-DJMVSUPK.js → chunk-A6G7K273.js} +4 -4
  77. package/dist/{chunk-VC4J4UTI.js → chunk-AAM66QCP.js} +5 -5
  78. package/dist/{chunk-TZQOCQXB.js → chunk-AL6EHLB5.js} +2 -2
  79. package/dist/{chunk-IJ4FEGZR.js → chunk-AMFCRZYB.js} +2 -2
  80. package/dist/{chunk-4K2H4KTR.js → chunk-AV46CT77.js} +3 -3
  81. package/dist/{chunk-7PZHH4KC.js → chunk-AZEZSQ5R.js} +23 -2
  82. package/dist/chunk-AZEZSQ5R.js.map +1 -0
  83. package/dist/{chunk-VZBW6CDG.js → chunk-BOOFTFFE.js} +1 -1
  84. package/dist/{chunk-2UF42WXV.js → chunk-BPY4RRTF.js} +16 -16
  85. package/dist/{chunk-2U3R3DDH.js → chunk-BTJ6CAIA.js} +2 -2
  86. package/dist/{chunk-GF4H3B3R.js → chunk-C3WJNRGR.js} +3 -3
  87. package/dist/{chunk-SIYZDT2V.js → chunk-CBP4HWCL.js} +3 -3
  88. package/dist/{chunk-GEGUBU3D.js → chunk-CSUAHUOH.js} +3 -3
  89. package/dist/{chunk-AJ6ORARY.js → chunk-DGRMWDQY.js} +12 -12
  90. package/dist/chunk-DGRMWDQY.js.map +1 -0
  91. package/dist/{chunk-BNMI3JBV.js → chunk-DXHVD4DS.js} +3 -3
  92. package/dist/{chunk-GE6HETIF.js → chunk-E5274WUC.js} +2 -2
  93. package/dist/{chunk-2COXDQ6C.js → chunk-E6KXJSMA.js} +2 -2
  94. package/dist/{chunk-FFAZ2XFU.js → chunk-EHRE7ZG3.js} +5 -6
  95. package/dist/chunk-EHRE7ZG3.js.map +1 -0
  96. package/dist/{chunk-CCMXCZLT.js → chunk-FBVLTTVV.js} +7 -7
  97. package/dist/{chunk-XVC7JU2N.js → chunk-FQD2KPQH.js} +2 -2
  98. package/dist/{chunk-SNXBXYUE.js → chunk-GDI64ITR.js} +3 -3
  99. package/dist/{chunk-MH2DXDN6.js → chunk-GSAZBZMA.js} +2 -2
  100. package/dist/{chunk-MULNBSPP.js → chunk-HT2C4EXO.js} +2 -2
  101. package/dist/{chunk-EMVJU7WC.js → chunk-HZVYDWUP.js} +2 -2
  102. package/dist/{chunk-XPRAOTJY.js → chunk-IJWEXCWF.js} +2 -2
  103. package/dist/{chunk-L2VS27PZ.js → chunk-IOM5QSNR.js} +4 -4
  104. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  105. package/dist/{chunk-TDMNADPI.js → chunk-JK3DYMOC.js} +2 -2
  106. package/dist/{chunk-SZXPKUMN.js → chunk-JSIQSZXI.js} +4 -4
  107. package/dist/{chunk-KQI2PKYP.js → chunk-JTUKDLAD.js} +2 -2
  108. package/dist/{chunk-TL4PM7PC.js → chunk-K3DZ3G5I.js} +2 -2
  109. package/dist/{chunk-WG4TMZJ2.js → chunk-KDYQYMJZ.js} +2 -2
  110. package/dist/{chunk-N4PYB235.js → chunk-KI6UOSNR.js} +2 -2
  111. package/dist/{chunk-FC6RCOIU.js → chunk-KRIEQCKE.js} +2 -2
  112. package/dist/{chunk-EQUD7FP4.js → chunk-KYY4EACB.js} +2 -2
  113. package/dist/{chunk-QMFKW4OU.js → chunk-L3Z4NXDO.js} +3 -3
  114. package/dist/{chunk-KE5PWLI6.js → chunk-LOFVW6JA.js} +3 -3
  115. package/dist/{chunk-46WM6JX2.js → chunk-LZKOVXMX.js} +2 -2
  116. package/dist/{chunk-JMF5Q4JY.js → chunk-MAJ2OKE4.js} +9 -9
  117. package/dist/{chunk-U6OXJQEH.js → chunk-MB5EJ2CT.js} +5 -5
  118. package/dist/{chunk-VUEG3TZ4.js → chunk-MVRIW6MI.js} +2 -2
  119. package/dist/{chunk-TGF43K66.js → chunk-MZBWIJJN.js} +9 -9
  120. package/dist/{chunk-QGLEM46C.js → chunk-N44GZ73R.js} +8 -8
  121. package/dist/{chunk-63UNVGZW.js → chunk-N6UMXWBA.js} +4 -4
  122. package/dist/{chunk-FLV7M7CT.js → chunk-NAHUBSUF.js} +2 -2
  123. package/dist/{chunk-S5TGRZWY.js → chunk-NXLQQ6WI.js} +3 -3
  124. package/dist/{chunk-DTXN4NVD.js → chunk-NYVKLB2I.js} +46 -46
  125. package/dist/chunk-NYVKLB2I.js.map +1 -0
  126. package/dist/{chunk-YJAOYEWI.js → chunk-OC6JYPZX.js} +21 -44
  127. package/dist/chunk-OC6JYPZX.js.map +1 -0
  128. package/dist/{chunk-5AYUHSAU.js → chunk-OFCHT2TN.js} +2 -2
  129. package/dist/{chunk-HRZZJ4XB.js → chunk-P2S6P7X6.js} +2 -2
  130. package/dist/{chunk-OGVJXIHX.js → chunk-PBVNVKYN.js} +2 -2
  131. package/dist/{chunk-2CP577K6.js → chunk-PPIASWWR.js} +2 -2
  132. package/dist/{chunk-6C76FZRM.js → chunk-QFIPSKPC.js} +2 -2
  133. package/dist/{chunk-Q562GF7J.js → chunk-QN77HA6P.js} +2 -2
  134. package/dist/{chunk-MFZACYZ6.js → chunk-QUNDYIYZ.js} +3 -3
  135. package/dist/{chunk-L34W4W4I.js → chunk-QW7G7PWN.js} +2 -2
  136. package/dist/{chunk-W5XWHTDO.js → chunk-QZZPUREO.js} +3 -3
  137. package/dist/{chunk-JA72X46J.js → chunk-R2AWYR4Q.js} +2 -2
  138. package/dist/{chunk-YRULQW5J.js → chunk-RBJQYMMT.js} +4 -4
  139. package/dist/{chunk-6KHF6PAB.js → chunk-RH6QEGCT.js} +3 -3
  140. package/dist/{chunk-QRZMJ2WN.js → chunk-RNPJ4GQA.js} +2 -2
  141. package/dist/{chunk-TRBLJU6Y.js → chunk-S4GUMZRB.js} +40 -40
  142. package/dist/{chunk-MQNOIH2C.js → chunk-SQ2O52SU.js} +3 -3
  143. package/dist/{chunk-EP5WXE2G.js → chunk-TCYLCPC6.js} +2 -2
  144. package/dist/{chunk-7CZIKCJR.js → chunk-V4WSQYO6.js} +82 -82
  145. package/dist/{chunk-7CZIKCJR.js.map → chunk-V4WSQYO6.js.map} +1 -1
  146. package/dist/{chunk-PO7NXNGC.js → chunk-VFTK5WKI.js} +2 -2
  147. package/dist/{chunk-JA54KIYD.js → chunk-VSHRMIJH.js} +2 -2
  148. package/dist/{chunk-5BPXMAUP.js → chunk-VUQDJ3JB.js} +4 -4
  149. package/dist/{chunk-7CXL25AA.js → chunk-W4RLOZOG.js} +3 -3
  150. package/dist/{chunk-LHRQBMJN.js → chunk-WADSXS4K.js} +2 -2
  151. package/dist/{chunk-Y7427SL7.js → chunk-WCGJK4NQ.js} +4 -4
  152. package/dist/{chunk-37HCPM56.js → chunk-WJLGUY27.js} +18 -18
  153. package/dist/{chunk-YGPXV546.js → chunk-WPFSZZ35.js} +2 -2
  154. package/dist/{chunk-IM2GO42H.js → chunk-WVHRNAXL.js} +4 -4
  155. package/dist/chunk-WVHRNAXL.js.map +1 -0
  156. package/dist/{chunk-UXIZ5XN5.js → chunk-XLIK2VDE.js} +3 -3
  157. package/dist/{chunk-64S6X4IU.js → chunk-XTN54NML.js} +4 -4
  158. package/dist/{chunk-2UPTRDGM.js → chunk-Y6DZ33PA.js} +4 -4
  159. package/dist/{chunk-4JNTGPBR.js → chunk-YAF3NRNC.js} +2 -2
  160. package/dist/{chunk-IFCKHPY4.js → chunk-YDH2FSDI.js} +2 -2
  161. package/dist/{chunk-L6GNS5GB.js → chunk-YS7SA4HD.js} +2 -2
  162. package/dist/{chunk-EIFYYHAF.js → chunk-YYO447A7.js} +4 -4
  163. package/dist/{chunk-75PT4N7Q.js → chunk-ZI7LMSNI.js} +2 -2
  164. package/dist/{chunk-EUT2WCWS.js → chunk-ZQ3WU6JO.js} +2 -2
  165. package/dist/{chunk-YJEUHGZZ.js → chunk-ZQYAE2C5.js} +2 -2
  166. package/dist/{chunk-JYG2334B.js → chunk-ZSJGYC3C.js} +2 -2
  167. package/dist/cli.js +108 -106
  168. package/dist/coding/export-okf-codegraph.js +20 -19
  169. package/dist/coding/export-okf-codegraph.js.map +1 -1
  170. package/dist/coding/pre-action-gate.js +2 -2
  171. package/dist/compounding/engine.js +21 -20
  172. package/dist/config.js +28 -27
  173. package/dist/connectors/codex-materialize-runner.js +20 -19
  174. package/dist/connectors/index.js +20 -19
  175. package/dist/consolidation-provenance-check.js +5 -4
  176. package/dist/consolidation-undo.js +4 -3
  177. package/dist/consolidation-undo.js.map +1 -1
  178. package/dist/contradiction/index.js +6 -5
  179. package/dist/convergence-refresh.js +22 -21
  180. package/dist/corpus-watermark.js +22 -21
  181. package/dist/deep-recall-http-glue.js +11 -10
  182. package/dist/deep-recall.js +2 -2
  183. package/dist/embedding-fallback.js +4 -3
  184. package/dist/embedding-generation-lock.js +3 -2
  185. package/dist/entity-retrieval.js +20 -19
  186. package/dist/explicit-capture.js +8 -7
  187. package/dist/external-wiki-access.js +67 -65
  188. package/dist/extraction.js +25 -24
  189. package/dist/{forget-SZ2BXDGF.js → forget-OHAJ6PSU.js} +4 -3
  190. package/dist/{forget-SZ2BXDGF.js.map → forget-OHAJ6PSU.js.map} +1 -1
  191. package/dist/{graph-edge-decay-PVKDKLQK.js → graph-edge-decay-CZ3SYLM4.js} +7 -6
  192. package/dist/graph-jsonl.js +5 -4
  193. package/dist/graph-snapshot.js +5 -4
  194. package/dist/graph-write-lock.js +3 -2
  195. package/dist/graph.js +4 -3
  196. package/dist/harmonic-retrieval.d.ts.map +1 -1
  197. package/dist/harmonic-retrieval.js +22 -20
  198. package/dist/harmonic-source-lookup.d.ts +14 -0
  199. package/dist/harmonic-source-lookup.d.ts.map +1 -0
  200. package/dist/harmonic-source-lookup.js +22 -0
  201. package/dist/http-retry.d.ts.map +1 -1
  202. package/dist/http-retry.js +6 -8
  203. package/dist/http-retry.js.map +1 -1
  204. package/dist/index.js +144 -142
  205. package/dist/lcm/engine.js +2 -2
  206. package/dist/lcm/index.js +4 -4
  207. package/dist/location/index.js +23 -22
  208. package/dist/maintenance/memory-governance.js +20 -19
  209. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +20 -19
  210. package/dist/maintenance/rebuild-memory-projection-runner.js +22 -21
  211. package/dist/maintenance/rebuild-memory-projection.js +21 -20
  212. package/dist/memory-browse-operations.js +67 -65
  213. package/dist/memory-browse.js +8 -7
  214. package/dist/memory-projection-batch.d.ts +2 -0
  215. package/dist/memory-projection-batch.d.ts.map +1 -1
  216. package/dist/memory-projection-batch.js +4 -1
  217. package/dist/memory-subject.js +4 -3
  218. package/dist/namespaces/migrate.js +21 -20
  219. package/dist/namespaces/search.js +8 -7
  220. package/dist/namespaces/storage.js +20 -19
  221. package/dist/offline-sync-changeset-generations.js +6 -5
  222. package/dist/offline-sync-embedding-generation.js +5 -4
  223. package/dist/offline-sync-impression-drain.js +4 -3
  224. package/dist/offline-sync-snapshot-stream.js +8 -7
  225. package/dist/offline-sync.js +9 -8
  226. package/dist/operator-doctor-corpus.js +23 -22
  227. package/dist/operator-toolkit.js +40 -39
  228. package/dist/orchestration/maintenance.js +30 -29
  229. package/dist/orchestrator.js +133 -131
  230. package/dist/page-versioning.js +4 -3
  231. package/dist/procedural/procedure-miner.d.ts.map +1 -1
  232. package/dist/qmd-daemon-session.d.ts.map +1 -1
  233. package/dist/qmd-daemon-session.js +2 -1
  234. package/dist/qmd.d.ts.map +1 -1
  235. package/dist/qmd.js +7 -6
  236. package/dist/recall-navigation-operations.js +67 -65
  237. package/dist/recall-navigation.js +66 -64
  238. package/dist/recall-state-view-admission.js +8 -7
  239. package/dist/recall-state.js +3 -2
  240. package/dist/recall-why-service.js +8 -7
  241. package/dist/reconcile/manifest.js +4 -3
  242. package/dist/{resolution-TV3F7ZTH.js → resolution-E4GLHLY6.js} +7 -6
  243. package/dist/resolution-E4GLHLY6.js.map +1 -0
  244. package/dist/resume-bundles.js +29 -28
  245. package/dist/salvage-envelope.js +6 -5
  246. package/dist/search/factory.js +7 -6
  247. package/dist/search/index.js +9 -8
  248. package/dist/semantic-consolidation.js +21 -20
  249. package/dist/semantic-rule-promotion.js +20 -19
  250. package/dist/semantic-rule-verifier.js +20 -19
  251. package/dist/source-agent-qualifier.js +24 -23
  252. package/dist/standup/build.js +20 -19
  253. package/dist/storage.js +19 -18
  254. package/dist/subject-config.js +5 -4
  255. package/dist/summarizer.js +4 -3
  256. package/dist/summary-snapshot.js +3 -2
  257. package/dist/support-passport/index.js +69 -67
  258. package/dist/testing/orchestrator-lite.d.ts +1 -2
  259. package/dist/testing/orchestrator-lite.d.ts.map +1 -1
  260. package/dist/transfer/autodetect.js +1 -1
  261. package/dist/transfer/backup.js +1 -1
  262. package/dist/transfer/capsule-export.js +2 -2
  263. package/dist/transfer/capsule-import.js +5 -4
  264. package/dist/transfer/export-okf.js +20 -19
  265. package/dist/utils/serialize-mutations.d.ts.map +1 -1
  266. package/dist/utils/serialize-mutations.js +2 -1
  267. package/dist/utils/sleep.d.ts +3 -0
  268. package/dist/utils/sleep.d.ts.map +1 -0
  269. package/dist/verified-recall.js +20 -19
  270. package/dist/who-knows-cli.js +21 -20
  271. package/dist/who-knows.js +20 -19
  272. package/dist/write-envelope.js +5 -4
  273. package/package.json +2 -2
  274. package/src/access-idempotency.ts +1 -4
  275. package/src/harmonic-retrieval.ts +12 -64
  276. package/src/harmonic-source-lookup.test.ts +178 -0
  277. package/src/harmonic-source-lookup.ts +142 -0
  278. package/src/http-retry.ts +2 -6
  279. package/src/memory-projection-batch.test.ts +55 -0
  280. package/src/memory-projection-batch.ts +20 -0
  281. package/src/offline-sync-digest-cache.test.ts +45 -0
  282. package/src/orchestration/recall-internal.ts +12 -12
  283. package/src/procedural/procedure-miner.ts +1 -4
  284. package/src/qmd-daemon-session.ts +1 -4
  285. package/src/qmd.ts +0 -4
  286. package/src/recall-harmonic-qmd-ordering.test.ts +304 -0
  287. package/src/testing/orchestrator-lite.ts +2 -7
  288. package/src/utils/serialize-mutations.ts +1 -13
  289. package/src/utils/sleep.test.ts +32 -0
  290. package/src/utils/sleep.ts +5 -0
  291. package/dist/chunk-7PZHH4KC.js.map +0 -1
  292. package/dist/chunk-AJ6ORARY.js.map +0 -1
  293. package/dist/chunk-DTXN4NVD.js.map +0 -1
  294. package/dist/chunk-FFAZ2XFU.js.map +0 -1
  295. package/dist/chunk-IM2GO42H.js.map +0 -1
  296. package/dist/chunk-VFUEZZBS.js.map +0 -1
  297. package/dist/chunk-YJAOYEWI.js.map +0 -1
  298. /package/dist/{chunk-OZABSIOV.js.map → chunk-2AFHZTPI.js.map} +0 -0
  299. /package/dist/{chunk-UK5EH7AI.js.map → chunk-2CXQZXWM.js.map} +0 -0
  300. /package/dist/{chunk-D6M3VKMY.js.map → chunk-2K7D6EFT.js.map} +0 -0
  301. /package/dist/{chunk-RIEGCK2W.js.map → chunk-2KRNPFPK.js.map} +0 -0
  302. /package/dist/{chunk-N7QV3CMX.js.map → chunk-2NCBDGND.js.map} +0 -0
  303. /package/dist/{chunk-XQSJXNWC.js.map → chunk-3ENX2RB4.js.map} +0 -0
  304. /package/dist/{chunk-CLCMDKTB.js.map → chunk-3I3U6FFT.js.map} +0 -0
  305. /package/dist/{chunk-WWLAKRMX.js.map → chunk-3NFN4Y4P.js.map} +0 -0
  306. /package/dist/{chunk-I56MTWE7.js.map → chunk-3R6SLDTH.js.map} +0 -0
  307. /package/dist/{chunk-QEPL7KIZ.js.map → chunk-3VTNNO2B.js.map} +0 -0
  308. /package/dist/{chunk-QWUJWBZ5.js.map → chunk-4G4B3Z2B.js.map} +0 -0
  309. /package/dist/{chunk-R7QY5ZVB.js.map → chunk-4NDWE44P.js.map} +0 -0
  310. /package/dist/{chunk-KCCZFDJD.js.map → chunk-4OKPH6FG.js.map} +0 -0
  311. /package/dist/{chunk-I25RQA65.js.map → chunk-55ZVZBX4.js.map} +0 -0
  312. /package/dist/{chunk-ENNC3RZ6.js.map → chunk-5EOV7ANU.js.map} +0 -0
  313. /package/dist/{chunk-ANZXWOYD.js.map → chunk-5FNVK7MW.js.map} +0 -0
  314. /package/dist/{chunk-KSUOM3YU.js.map → chunk-5NOPZYNI.js.map} +0 -0
  315. /package/dist/{chunk-7LYRFI5A.js.map → chunk-5Q4NQNW7.js.map} +0 -0
  316. /package/dist/{chunk-L3PWXD73.js.map → chunk-6PHB45IU.js.map} +0 -0
  317. /package/dist/{chunk-CHDGJJV6.js.map → chunk-6VAHJ2F6.js.map} +0 -0
  318. /package/dist/{chunk-KQT4DRKF.js.map → chunk-76KHEHT2.js.map} +0 -0
  319. /package/dist/{chunk-SWRN6U7Q.js.map → chunk-7O252IE6.js.map} +0 -0
  320. /package/dist/{chunk-U6HWKOGD.js.map → chunk-7OAIOE5P.js.map} +0 -0
  321. /package/dist/{chunk-RSMIRLKM.js.map → chunk-7UX44C4N.js.map} +0 -0
  322. /package/dist/{chunk-DJMVSUPK.js.map → chunk-A6G7K273.js.map} +0 -0
  323. /package/dist/{chunk-VC4J4UTI.js.map → chunk-AAM66QCP.js.map} +0 -0
  324. /package/dist/{chunk-TZQOCQXB.js.map → chunk-AL6EHLB5.js.map} +0 -0
  325. /package/dist/{chunk-IJ4FEGZR.js.map → chunk-AMFCRZYB.js.map} +0 -0
  326. /package/dist/{chunk-4K2H4KTR.js.map → chunk-AV46CT77.js.map} +0 -0
  327. /package/dist/{chunk-VZBW6CDG.js.map → chunk-BOOFTFFE.js.map} +0 -0
  328. /package/dist/{chunk-2UF42WXV.js.map → chunk-BPY4RRTF.js.map} +0 -0
  329. /package/dist/{chunk-2U3R3DDH.js.map → chunk-BTJ6CAIA.js.map} +0 -0
  330. /package/dist/{chunk-GF4H3B3R.js.map → chunk-C3WJNRGR.js.map} +0 -0
  331. /package/dist/{chunk-SIYZDT2V.js.map → chunk-CBP4HWCL.js.map} +0 -0
  332. /package/dist/{chunk-GEGUBU3D.js.map → chunk-CSUAHUOH.js.map} +0 -0
  333. /package/dist/{chunk-BNMI3JBV.js.map → chunk-DXHVD4DS.js.map} +0 -0
  334. /package/dist/{chunk-GE6HETIF.js.map → chunk-E5274WUC.js.map} +0 -0
  335. /package/dist/{chunk-2COXDQ6C.js.map → chunk-E6KXJSMA.js.map} +0 -0
  336. /package/dist/{chunk-CCMXCZLT.js.map → chunk-FBVLTTVV.js.map} +0 -0
  337. /package/dist/{chunk-XVC7JU2N.js.map → chunk-FQD2KPQH.js.map} +0 -0
  338. /package/dist/{chunk-SNXBXYUE.js.map → chunk-GDI64ITR.js.map} +0 -0
  339. /package/dist/{chunk-MH2DXDN6.js.map → chunk-GSAZBZMA.js.map} +0 -0
  340. /package/dist/{chunk-MULNBSPP.js.map → chunk-HT2C4EXO.js.map} +0 -0
  341. /package/dist/{chunk-EMVJU7WC.js.map → chunk-HZVYDWUP.js.map} +0 -0
  342. /package/dist/{chunk-XPRAOTJY.js.map → chunk-IJWEXCWF.js.map} +0 -0
  343. /package/dist/{chunk-L2VS27PZ.js.map → chunk-IOM5QSNR.js.map} +0 -0
  344. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  345. /package/dist/{chunk-TDMNADPI.js.map → chunk-JK3DYMOC.js.map} +0 -0
  346. /package/dist/{chunk-SZXPKUMN.js.map → chunk-JSIQSZXI.js.map} +0 -0
  347. /package/dist/{chunk-KQI2PKYP.js.map → chunk-JTUKDLAD.js.map} +0 -0
  348. /package/dist/{chunk-TL4PM7PC.js.map → chunk-K3DZ3G5I.js.map} +0 -0
  349. /package/dist/{chunk-WG4TMZJ2.js.map → chunk-KDYQYMJZ.js.map} +0 -0
  350. /package/dist/{chunk-N4PYB235.js.map → chunk-KI6UOSNR.js.map} +0 -0
  351. /package/dist/{chunk-FC6RCOIU.js.map → chunk-KRIEQCKE.js.map} +0 -0
  352. /package/dist/{chunk-EQUD7FP4.js.map → chunk-KYY4EACB.js.map} +0 -0
  353. /package/dist/{chunk-QMFKW4OU.js.map → chunk-L3Z4NXDO.js.map} +0 -0
  354. /package/dist/{chunk-KE5PWLI6.js.map → chunk-LOFVW6JA.js.map} +0 -0
  355. /package/dist/{chunk-46WM6JX2.js.map → chunk-LZKOVXMX.js.map} +0 -0
  356. /package/dist/{chunk-JMF5Q4JY.js.map → chunk-MAJ2OKE4.js.map} +0 -0
  357. /package/dist/{chunk-U6OXJQEH.js.map → chunk-MB5EJ2CT.js.map} +0 -0
  358. /package/dist/{chunk-VUEG3TZ4.js.map → chunk-MVRIW6MI.js.map} +0 -0
  359. /package/dist/{chunk-TGF43K66.js.map → chunk-MZBWIJJN.js.map} +0 -0
  360. /package/dist/{chunk-QGLEM46C.js.map → chunk-N44GZ73R.js.map} +0 -0
  361. /package/dist/{chunk-63UNVGZW.js.map → chunk-N6UMXWBA.js.map} +0 -0
  362. /package/dist/{chunk-FLV7M7CT.js.map → chunk-NAHUBSUF.js.map} +0 -0
  363. /package/dist/{chunk-S5TGRZWY.js.map → chunk-NXLQQ6WI.js.map} +0 -0
  364. /package/dist/{chunk-5AYUHSAU.js.map → chunk-OFCHT2TN.js.map} +0 -0
  365. /package/dist/{chunk-HRZZJ4XB.js.map → chunk-P2S6P7X6.js.map} +0 -0
  366. /package/dist/{chunk-OGVJXIHX.js.map → chunk-PBVNVKYN.js.map} +0 -0
  367. /package/dist/{chunk-2CP577K6.js.map → chunk-PPIASWWR.js.map} +0 -0
  368. /package/dist/{chunk-6C76FZRM.js.map → chunk-QFIPSKPC.js.map} +0 -0
  369. /package/dist/{chunk-Q562GF7J.js.map → chunk-QN77HA6P.js.map} +0 -0
  370. /package/dist/{chunk-MFZACYZ6.js.map → chunk-QUNDYIYZ.js.map} +0 -0
  371. /package/dist/{chunk-L34W4W4I.js.map → chunk-QW7G7PWN.js.map} +0 -0
  372. /package/dist/{chunk-W5XWHTDO.js.map → chunk-QZZPUREO.js.map} +0 -0
  373. /package/dist/{chunk-JA72X46J.js.map → chunk-R2AWYR4Q.js.map} +0 -0
  374. /package/dist/{chunk-YRULQW5J.js.map → chunk-RBJQYMMT.js.map} +0 -0
  375. /package/dist/{chunk-6KHF6PAB.js.map → chunk-RH6QEGCT.js.map} +0 -0
  376. /package/dist/{chunk-QRZMJ2WN.js.map → chunk-RNPJ4GQA.js.map} +0 -0
  377. /package/dist/{chunk-TRBLJU6Y.js.map → chunk-S4GUMZRB.js.map} +0 -0
  378. /package/dist/{chunk-MQNOIH2C.js.map → chunk-SQ2O52SU.js.map} +0 -0
  379. /package/dist/{chunk-EP5WXE2G.js.map → chunk-TCYLCPC6.js.map} +0 -0
  380. /package/dist/{chunk-PO7NXNGC.js.map → chunk-VFTK5WKI.js.map} +0 -0
  381. /package/dist/{chunk-JA54KIYD.js.map → chunk-VSHRMIJH.js.map} +0 -0
  382. /package/dist/{chunk-5BPXMAUP.js.map → chunk-VUQDJ3JB.js.map} +0 -0
  383. /package/dist/{chunk-7CXL25AA.js.map → chunk-W4RLOZOG.js.map} +0 -0
  384. /package/dist/{chunk-LHRQBMJN.js.map → chunk-WADSXS4K.js.map} +0 -0
  385. /package/dist/{chunk-Y7427SL7.js.map → chunk-WCGJK4NQ.js.map} +0 -0
  386. /package/dist/{chunk-37HCPM56.js.map → chunk-WJLGUY27.js.map} +0 -0
  387. /package/dist/{chunk-YGPXV546.js.map → chunk-WPFSZZ35.js.map} +0 -0
  388. /package/dist/{chunk-UXIZ5XN5.js.map → chunk-XLIK2VDE.js.map} +0 -0
  389. /package/dist/{chunk-64S6X4IU.js.map → chunk-XTN54NML.js.map} +0 -0
  390. /package/dist/{chunk-2UPTRDGM.js.map → chunk-Y6DZ33PA.js.map} +0 -0
  391. /package/dist/{chunk-4JNTGPBR.js.map → chunk-YAF3NRNC.js.map} +0 -0
  392. /package/dist/{chunk-IFCKHPY4.js.map → chunk-YDH2FSDI.js.map} +0 -0
  393. /package/dist/{chunk-L6GNS5GB.js.map → chunk-YS7SA4HD.js.map} +0 -0
  394. /package/dist/{chunk-EIFYYHAF.js.map → chunk-YYO447A7.js.map} +0 -0
  395. /package/dist/{chunk-75PT4N7Q.js.map → chunk-ZI7LMSNI.js.map} +0 -0
  396. /package/dist/{chunk-EUT2WCWS.js.map → chunk-ZQ3WU6JO.js.map} +0 -0
  397. /package/dist/{chunk-YJEUHGZZ.js.map → chunk-ZQYAE2C5.js.map} +0 -0
  398. /package/dist/{chunk-JYG2334B.js.map → chunk-ZSJGYC3C.js.map} +0 -0
  399. /package/dist/{graph-edge-decay-PVKDKLQK.js.map → graph-edge-decay-CZ3SYLM4.js.map} +0 -0
  400. /package/dist/{resolution-TV3F7ZTH.js.map → harmonic-source-lookup.js.map} +0 -0
@@ -0,0 +1,304 @@
1
+ // #3188: park only harmonic's source read and observe real QMD publication.
2
+
3
+ import assert from "node:assert/strict";
4
+ import path from "node:path";
5
+ import type { TestContext } from "node:test";
6
+ import test from "node:test";
7
+
8
+ import { recordAbstractionNode } from "./abstraction-nodes.js";
9
+ import { parseConfig } from "./config.js";
10
+ import { rebuildMemoryProjection } from "./maintenance/rebuild-memory-projection.js";
11
+ import { Orchestrator } from "./orchestrator.js";
12
+ import {
13
+ RecallSectionCoordinator,
14
+ type RecallSectionAppendOptions,
15
+ type RecallSectionBuckets,
16
+ } from "./orchestration/recall-section-coordinator.js";
17
+ import { getRecallTimings } from "./recall-timings.js";
18
+ import type { RecallInternalCoordinator } from "./orchestration/recall-internal.js";
19
+ import { StorageManager } from "./storage.js";
20
+ import type { SearchBackend } from "./search/port.js";
21
+ import { cleanupDir, eventually, mkTempMemoryDir } from "./testing/orchestrator-lite.js";
22
+ import type { MemoryFile, PluginConfig, QmdSearchResult } from "./types.js";
23
+
24
+ const RECALL_PROMPT = "how does the atlas source lookup behave?";
25
+
26
+ /**
27
+ * Complete typed SearchBackend stub (no casts): answers availability and
28
+ * returns one settled QMD candidate from `search`; every other read surface
29
+ * is empty. Mirrors the recall-hardening backend-stub shape.
30
+ */
31
+ function settledQmdBackend(result: QmdSearchResult): SearchBackend {
32
+ return {
33
+ async probe() {
34
+ return true;
35
+ },
36
+ isAvailable() {
37
+ return true;
38
+ },
39
+ debugStatus() {
40
+ return "backend=settled-qmd-stub";
41
+ },
42
+ async search() {
43
+ return [result];
44
+ },
45
+ async searchGlobal() {
46
+ return [];
47
+ },
48
+ async bm25Search() {
49
+ return [];
50
+ },
51
+ async vectorSearch() {
52
+ return [];
53
+ },
54
+ async hybridSearch() {
55
+ return [];
56
+ },
57
+ async update() {},
58
+ async updateCollection() {},
59
+ async embed() {},
60
+ async embedCollection() {},
61
+ async ensureCollection() {
62
+ return "present";
63
+ },
64
+ };
65
+ }
66
+
67
+ interface OrderingHarness {
68
+ memoryDir: string;
69
+ orchestrator: Orchestrator;
70
+ config: PluginConfig;
71
+ qmdMemory: MemoryFile;
72
+ harmonicSource: MemoryFile;
73
+ /** Releases the parked harmonic source read (idempotent). */
74
+ releaseHarmonicRead: () => void;
75
+ /** Section ids in append order, via the section coordinator prototype. */
76
+ appendedSectionIds: string[];
77
+ /** How often the harmonic source read was asked for (and parked). */
78
+ harmonicReadCalls: { count: number };
79
+ recall: () => Promise<string>;
80
+ }
81
+
82
+ /**
83
+ * Seed two active memories — one returned as the settled QMD candidate, one
84
+ * projected into a real abstraction-node store row — then boot the real
85
+ * orchestrator over them. The projection rebuild keeps the harmonic read on
86
+ * the indexed exact-path branch, so intercepting that one
87
+ * `StorageManager.readMemoryByPath` call parks harmonic and nothing else.
88
+ */
89
+ async function makeOrderingHarness(
90
+ t: TestContext,
91
+ mode: "park" | "fail",
92
+ ): Promise<OrderingHarness> {
93
+ const memoryDir = await mkTempMemoryDir("recall-harmonic-order-");
94
+ const storage = new StorageManager(memoryDir);
95
+ await storage.ensureDirectories();
96
+
97
+ const { memory: qmdMemory } = await storage.writeMemory(
98
+ "fact",
99
+ "the atlas qmd sentinel confirms deployment cadence",
100
+ { source: "test" },
101
+ );
102
+ const { memory: harmonicSource } = await storage.writeMemory(
103
+ "fact",
104
+ "atlas harmonic source lookup body",
105
+ { source: "test" },
106
+ );
107
+ await recordAbstractionNode({
108
+ memoryDir,
109
+ node: {
110
+ schemaVersion: 1,
111
+ nodeId: "ordering-under-qmd",
112
+ recordedAt: new Date().toISOString(),
113
+ sessionKey: "agent:test",
114
+ kind: "topic",
115
+ abstractionLevel: "meso",
116
+ title: "atlas source lookup",
117
+ summary: "atlas source lookup",
118
+ sourceMemoryIds: [harmonicSource.frontmatter.id],
119
+ },
120
+ });
121
+ await rebuildMemoryProjection({ memoryDir, storage, dryRun: false });
122
+
123
+ // Defaults only — the ordering fix must not move any budget, and the
124
+ // default candidate/namespace sets stay untouched.
125
+ const config = parseConfig({
126
+ openaiApiKey: "sk-test",
127
+ memoryDir,
128
+ workspaceDir: path.join(memoryDir, "workspace"),
129
+ qmdEnabled: true,
130
+ embeddingFallbackEnabled: false,
131
+ recallPlannerEnabled: false,
132
+ sharedContextEnabled: false,
133
+ harmonicRetrievalEnabled: true,
134
+ queryAwareIndexingEnabled: false,
135
+ parallelRetrievalEnabled: false,
136
+ initGateTimeoutMs: 1000,
137
+ });
138
+
139
+ const orchestrator = new Orchestrator(config);
140
+ orchestrator.qmd = settledQmdBackend({
141
+ docid: qmdMemory.frontmatter.id,
142
+ path: qmdMemory.path,
143
+ score: 0.9,
144
+ snippet: qmdMemory.content,
145
+ });
146
+
147
+ const appendedSectionIds: string[] = [];
148
+ const originalAppend = RecallSectionCoordinator.prototype.appendRecallSection;
149
+ t.mock.method(
150
+ RecallSectionCoordinator.prototype,
151
+ "appendRecallSection",
152
+ function recordAppendedSection(
153
+ this: RecallSectionCoordinator,
154
+ sectionBuckets: RecallSectionBuckets,
155
+ sectionId: string,
156
+ content: string,
157
+ options?: RecallSectionAppendOptions,
158
+ ): boolean {
159
+ appendedSectionIds.push(sectionId);
160
+ return originalAppend.call(this, sectionBuckets, sectionId, content, options);
161
+ },
162
+ );
163
+
164
+ const harmonicGate = Promise.withResolvers<void>();
165
+ const harmonicReadCalls = { count: 0 };
166
+ const originalRead = StorageManager.prototype.readMemoryByPath;
167
+ const harmonicSourcePath = path.resolve(harmonicSource.path);
168
+ t.mock.method(
169
+ StorageManager.prototype,
170
+ "readMemoryByPath",
171
+ function interceptHarmonicSourceRead(
172
+ this: StorageManager,
173
+ filePath: string,
174
+ ): Promise<MemoryFile | null> {
175
+ if (path.resolve(filePath) !== harmonicSourcePath) {
176
+ return originalRead.call(this, filePath);
177
+ }
178
+ if (mode === "fail") {
179
+ return Promise.reject(new Error("synthetic harmonic source read failure"));
180
+ }
181
+ harmonicReadCalls.count += 1;
182
+ return harmonicGate.promise.then(() => originalRead.call(this, filePath));
183
+ },
184
+ );
185
+
186
+ // Invoke the existing private delegate without booting background services.
187
+ const recallSeam = orchestrator as unknown as Pick<RecallInternalCoordinator, "recallInternal">
188
+ & Pick<RecallSectionCoordinator, "isRecallSectionEnabled">;
189
+ t.mock.method(recallSeam, "isRecallSectionEnabled", (id: string) =>
190
+ id === "memories" || id === "harmonic-retrieval");
191
+
192
+ return {
193
+ memoryDir,
194
+ orchestrator,
195
+ config,
196
+ qmdMemory,
197
+ harmonicSource,
198
+ releaseHarmonicRead: () => harmonicGate.resolve(),
199
+ appendedSectionIds,
200
+ harmonicReadCalls,
201
+ recall: () => recallSeam.recallInternal(RECALL_PROMPT, "agent:test", { mode: "full" }),
202
+ };
203
+ }
204
+
205
+ test("settled QMD publishes while the harmonic read is still parked; harmonic renders after release", async (t) => {
206
+ const harness = await makeOrderingHarness(t, "park");
207
+ const { memoryDir, orchestrator, config, appendedSectionIds, harmonicReadCalls } =
208
+ harness;
209
+ let recallPromise: Promise<string> | undefined;
210
+ try {
211
+ // The move must not touch any deadline: pin the configured defaults.
212
+ assert.equal(config.recallOuterTimeoutMs, 75_000);
213
+ assert.equal(config.recallCoreDeadlineMs, 75_000);
214
+ assert.equal(config.recallEnrichmentDeadlineMs, 60_000);
215
+
216
+ recallPromise = harness.recall();
217
+
218
+ // The harmonic read starts during phase 1 and is now parked.
219
+ await eventually(
220
+ async () => (harmonicReadCalls.count > 0 ? true : null),
221
+ "harmonic source read reached the parked seam",
222
+ );
223
+
224
+ // The fix: the settled QMD candidate is formatted and published while
225
+ // harmonic is still parked. Under the pre-fix order the assembly blocked
226
+ // on harmonic first, so this probe could never succeed.
227
+ await eventually(
228
+ async () => (appendedSectionIds.includes("memories") ? true : null),
229
+ "QMD memories section published while harmonic is parked",
230
+ );
231
+ assert.equal(
232
+ appendedSectionIds.includes("harmonic-retrieval"),
233
+ false,
234
+ "harmonic must not append before its read is released",
235
+ );
236
+
237
+ harness.releaseHarmonicRead();
238
+ const context = await recallPromise;
239
+
240
+ // Harmonic still publishes afterward, with its candidate content, and
241
+ // QMD publication strictly precedes the harmonic append.
242
+ assert.ok(
243
+ appendedSectionIds.includes("harmonic-retrieval"),
244
+ "harmonic section must append after the read is released",
245
+ );
246
+ assert.ok(
247
+ appendedSectionIds.lastIndexOf("memories") <
248
+ appendedSectionIds.indexOf("harmonic-retrieval"),
249
+ `QMD publication must precede the harmonic append, got: ${appendedSectionIds.join(",")}`,
250
+ );
251
+ assert.ok(context.includes(harness.qmdMemory.content), "QMD candidate must render");
252
+ assert.ok(
253
+ context.includes("## Harmonic Retrieval"),
254
+ `harmonic section must render, got: ${context.slice(0, 600)}`,
255
+ );
256
+ assert.ok(
257
+ context.includes(harness.harmonicSource.content),
258
+ "harmonic candidate content must render",
259
+ );
260
+
261
+ // Budget parity: harmonic completed inside the untouched shared
262
+ // enrichment budget. A cancelled/timed-out harmonic drops its timing
263
+ // entry (timeout strings do not sanitize to numbers), so a numeric
264
+ // harmonicRetrieval timing proves the move neither shortened nor spent
265
+ // the budget ahead of QMD.
266
+ const record = getRecallTimings(config).find(
267
+ (candidate) => candidate.timingsMs.harmonicRetrieval !== undefined,
268
+ );
269
+ assert.ok(record, "harmonic must complete within the shared enrichment budget");
270
+ assert.ok(record.timingsMs.qmd !== undefined, "QMD timing must be recorded");
271
+ } finally {
272
+ harness.releaseHarmonicRead();
273
+ await recallPromise?.catch(() => undefined);
274
+ await orchestrator.destroy();
275
+ await cleanupDir(memoryDir);
276
+ }
277
+ });
278
+
279
+ test("a failed harmonic source read degrades without taking QMD publication down", async (t) => {
280
+ const harness = await makeOrderingHarness(t, "fail");
281
+ const { memoryDir, orchestrator, qmdMemory, appendedSectionIds } = harness;
282
+ try {
283
+ const context = await harness.recall();
284
+
285
+ assert.ok(
286
+ appendedSectionIds.includes("memories"),
287
+ "QMD must still publish when the harmonic read fails",
288
+ );
289
+ assert.equal(
290
+ appendedSectionIds.includes("harmonic-retrieval"),
291
+ false,
292
+ "a failed harmonic read must append no harmonic section",
293
+ );
294
+ assert.ok(context.includes(qmdMemory.content), "QMD candidate must render");
295
+ assert.ok(
296
+ !context.includes("## Harmonic Retrieval"),
297
+ "no harmonic section may render after a failed read",
298
+ );
299
+ } finally {
300
+ harness.releaseHarmonicRead();
301
+ await orchestrator.destroy();
302
+ await cleanupDir(memoryDir);
303
+ }
304
+ });
@@ -18,6 +18,8 @@ import { getAbstractionNodeStoreStatus, type AbstractionNodeStoreStatus } from "
18
18
  import type { Orchestrator } from "../orchestrator.js";
19
19
  import type { ExtractionRunCoordinatorDeps } from "../orchestration/extraction-run.js";
20
20
  import type { BufferTurn, ExtractionResult, PluginConfig } from "../types.js";
21
+ import { sleep } from "../utils/sleep.js";
22
+ export { sleep } from "../utils/sleep.js";
21
23
 
22
24
  /**
23
25
  * Offline-safe config: QMD off, embedding fallback off, planner off (so the
@@ -76,13 +78,6 @@ export function pastIso(): string {
76
78
  return new Date(Date.now() - 3600_000).toISOString();
77
79
  }
78
80
 
79
- /** Linear async sleep (shared by the retrying cleanup and pollers). */
80
- export function sleep(ms: number): Promise<void> {
81
- const { promise, resolve } = Promise.withResolvers<void>();
82
- setTimeout(resolve, ms);
83
- return promise;
84
- }
85
-
86
81
  /**
87
82
  * Remove a temp memory dir, retrying transient ENOTEMPTY/EBUSY races: the
88
83
  * orchestrator keeps best-effort background writers that can still be running
@@ -22,6 +22,7 @@
22
22
  import { randomUUID } from "node:crypto";
23
23
  import { link, mkdir, open, readFile, rename, stat, unlink, utimes } from "node:fs/promises";
24
24
  import path from "node:path";
25
+ import { sleep } from "./sleep.js";
25
26
 
26
27
  // ─────────────────────────────────────────────────────────────────────────────
27
28
  // 1. serializeMutations — keyed async serialization with rejection recovery
@@ -732,16 +733,3 @@ async function refreshHeldLock(
732
733
  }
733
734
  return lockHeldBySelf(held);
734
735
  }
735
-
736
- function sleep(ms: number): Promise<void> {
737
- // Manual deferred instead of Promise.withResolvers (ES2024) — plugin-openclaw's
738
- // standalone tsconfig targets ES2022 lib and this module is reachable from its
739
- // type graph, so withResolvers would TS2550 there (same fix as
740
- // extraction-faithfulness.ts:467).
741
- return new Promise<void>((resolve) => {
742
- // NOT unref'd: this polls inside an awaited acquire loop, so the caller's
743
- // await chain keeps the loop alive; unref would let Node exit mid-poll when
744
- // nothing else is pending (the heartbeat interval IS unref'd separately).
745
- setTimeout(resolve, ms);
746
- });
747
- }
@@ -0,0 +1,32 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { sleep } from "./sleep.js";
4
+
5
+ test("sleep preserves delays, stays referenced, and settles only when its timer fires", async (t) => {
6
+ let fire: () => void = () => assert.fail("timer was not scheduled");
7
+ const delays: number[] = [];
8
+ const unref = t.mock.fn();
9
+ t.mock.method(globalThis, "setTimeout", (callback: () => void, ms: number) => {
10
+ delays.push(ms);
11
+ fire = callback;
12
+ return { unref };
13
+ });
14
+ const clear = t.mock.method(globalThis, "clearTimeout", () => {});
15
+
16
+ for (const ms of [0, 10, 25, 100, 250, 1_000]) {
17
+ let settled = false;
18
+ const waiting = sleep(ms).then((value) => {
19
+ settled = true;
20
+ assert.equal(value, undefined);
21
+ });
22
+ await Promise.resolve();
23
+ assert.equal(settled, false, "sleep must not resolve before its timer");
24
+ fire();
25
+ await waiting;
26
+ assert.equal(settled, true);
27
+ }
28
+
29
+ assert.deepEqual(delays, [0, 10, 25, 100, 250, 1_000]);
30
+ assert.equal(unref.mock.callCount(), 0, "awaited poll timers must keep the process alive");
31
+ assert.equal(clear.mock.callCount(), 0, "the non-cancellable helper must not cancel its timers");
32
+ });
@@ -0,0 +1,5 @@
1
+ /** Wait without cancellation; keep the timer referenced so awaited polling can finish. */
2
+ export function sleep(ms: number): Promise<void> {
3
+ // Constructor form keeps this reachable utility compatible with ES2022 adapter type graphs.
4
+ return new Promise((resolve) => setTimeout(resolve, ms));
5
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/memory-projection-batch.ts"],"sourcesContent":["import type { MemoryProjectionCurrentState } from \"./types.js\";\nimport {\n memoryCurrentSelectExpressions,\n openProjectionReadonly,\n parseCurrentRow,\n} from \"./memory-projection-store.js\";\n\nexport interface ProjectedMemoryStateBatch {\n states: Map<string, MemoryProjectionCurrentState>;\n /** Meta `rebuiltAt`; null when the projection never recorded one. */\n rebuiltAt: string | null;\n /**\n * True only when the writer recorded that `memory_current` covers every active\n * memory (an unscoped rebuild). Projections written before this flag existed,\n * and scoped rebuilds, read as false.\n */\n complete: boolean;\n}\n\n/**\n * Read many current-state rows over ONE readonly connection, plus the meta the\n * recall path needs to decide whether the index can be trusted. Ids absent from\n * `memory_current` are simply missing from the map. Null means the projection\n * could not be opened or read.\n */\nexport function readProjectedMemoryStates(\n memoryDir: string,\n memoryIds: Iterable<string>,\n): ProjectedMemoryStateBatch | null {\n const db = openProjectionReadonly(memoryDir);\n if (!db) return null;\n try {\n const currentSelect = memoryCurrentSelectExpressions(db);\n const select = db.prepare(\n `\n SELECT\n memory_id,\n category,\n status,\n lifecycle_state,\n path_rel,\n created_at,\n updated_at,\n archived_at,\n superseded_at,\n entity_ref,\n source,\n confidence,\n confidence_tier,\n memory_kind,\n access_count,\n last_accessed,\n ${currentSelect.tagsJson},\n ${currentSelect.previewText},\n ${currentSelect.privateRecord}\n FROM memory_current\n WHERE memory_id = ?\n `,\n );\n const states = new Map<string, MemoryProjectionCurrentState>();\n for (const memoryId of memoryIds) {\n const state = parseCurrentRow(memoryDir, select.get(memoryId) as Record<string, unknown> | undefined);\n if (state) states.set(memoryId, state);\n }\n const meta = new Map<string, unknown>(\n (db.prepare(\"SELECT key, value FROM meta WHERE key IN ('rebuiltAt', 'complete')\").all() as Array<{\n key: string;\n value: unknown;\n }>).map((row) => [row.key, row.value]),\n );\n const rebuiltAt = meta.get(\"rebuiltAt\");\n return {\n states,\n rebuiltAt: typeof rebuiltAt === \"string\" ? rebuiltAt : null,\n complete: meta.get(\"complete\") === \"true\",\n };\n } catch {\n return null;\n } finally {\n db.close();\n }\n}\n"],"mappings":";;;;;;;AAyBO,SAAS,0BACd,WACA,WACkC;AAClC,QAAM,KAAK,uBAAuB,SAAS;AAC3C,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI;AACF,UAAM,gBAAgB,+BAA+B,EAAE;AACvD,UAAM,SAAS,GAAG;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAkBM,cAAc,QAAQ;AAAA,YACtB,cAAc,WAAW;AAAA,YACzB,cAAc,aAAa;AAAA;AAAA;AAAA;AAAA,IAInC;AACA,UAAM,SAAS,oBAAI,IAA0C;AAC7D,eAAW,YAAY,WAAW;AAChC,YAAM,QAAQ,gBAAgB,WAAW,OAAO,IAAI,QAAQ,CAAwC;AACpG,UAAI,MAAO,QAAO,IAAI,UAAU,KAAK;AAAA,IACvC;AACA,UAAM,OAAO,IAAI;AAAA,MACd,GAAG,QAAQ,oEAAoE,EAAE,IAAI,EAGlF,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC;AAAA,IACvC;AACA,UAAM,YAAY,KAAK,IAAI,WAAW;AACtC,WAAO;AAAA,MACL;AAAA,MACA,WAAW,OAAO,cAAc,WAAW,YAAY;AAAA,MACvD,UAAU,KAAK,IAAI,UAAU,MAAM;AAAA,IACrC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;","names":[]}