@remnic/core 10.0.51 → 10.0.53

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 (266) hide show
  1. package/dist/access-admin-ops-surface.js +24 -24
  2. package/dist/access-authorization-probe.js +25 -25
  3. package/dist/access-boundary.js +24 -24
  4. package/dist/access-cli.js +65 -65
  5. package/dist/access-extraction-force-flush.js +24 -24
  6. package/dist/access-http-briefing.js +25 -25
  7. package/dist/access-http-query.js +26 -26
  8. package/dist/access-http.js +40 -40
  9. package/dist/access-identity-continuity-surface.js +24 -24
  10. package/dist/access-lcm-surface.js +24 -24
  11. package/dist/access-mcp.js +33 -33
  12. package/dist/access-namespace-preflight.js +24 -24
  13. package/dist/access-observe-write-surface.js +24 -24
  14. package/dist/access-operations-batch.js +25 -25
  15. package/dist/access-operations.js +32 -32
  16. package/dist/access-recall-concurrency.js +24 -24
  17. package/dist/access-recall-response.js +24 -24
  18. package/dist/access-recall-surface.js +24 -24
  19. package/dist/access-service.js +24 -24
  20. package/dist/access-surface-catalog.js +26 -26
  21. package/dist/active-recall.js +9 -9
  22. package/dist/briefing.js +10 -10
  23. package/dist/buffer.js +5 -5
  24. package/dist/causal-consolidation.js +11 -11
  25. package/dist/{chunk-3NL4ALUP.js → chunk-24SIB3EW.js} +3 -3
  26. package/dist/{chunk-Y3T5KQCR.js → chunk-2EYCW2ET.js} +2 -2
  27. package/dist/{chunk-AHGOOZUC.js → chunk-34UVJNSG.js} +2 -2
  28. package/dist/{chunk-2EXF6IIB.js → chunk-3632XJMR.js} +2 -2
  29. package/dist/{chunk-KETS5A62.js → chunk-3H3PNQEF.js} +2 -2
  30. package/dist/{chunk-SFRBUBUZ.js → chunk-3LNAQLW4.js} +3 -3
  31. package/dist/{chunk-75BK4XGV.js → chunk-4BUJICMI.js} +10 -10
  32. package/dist/{chunk-KIWO4327.js → chunk-4W5B5Z6P.js} +2 -2
  33. package/dist/{chunk-B35EQQ7L.js → chunk-53OFDW3P.js} +3 -3
  34. package/dist/{chunk-2ONKXEC7.js → chunk-5LBBXI2A.js} +2 -2
  35. package/dist/{chunk-UCLJTGP3.js → chunk-65B5RFKQ.js} +2 -2
  36. package/dist/{chunk-KAJYSO3U.js → chunk-6CDNOREO.js} +2 -2
  37. package/dist/{chunk-POJRFSJM.js → chunk-7XGNGLAN.js} +2 -2
  38. package/dist/{chunk-A6JDT6QF.js → chunk-AO5ZOD32.js} +2 -2
  39. package/dist/{chunk-RA7YRL6H.js → chunk-AOSCGNIC.js} +3 -3
  40. package/dist/{chunk-LWMLBVGB.js → chunk-B43P3DTC.js} +2 -2
  41. package/dist/{chunk-SJD334AG.js → chunk-CA6X37OB.js} +217 -173
  42. package/dist/chunk-CA6X37OB.js.map +1 -0
  43. package/dist/{chunk-VUMWVYMR.js → chunk-CIMD2MUR.js} +3 -3
  44. package/dist/{chunk-XRFLR3XF.js → chunk-DLZGSZVC.js} +22 -9
  45. package/dist/chunk-DLZGSZVC.js.map +1 -0
  46. package/dist/{chunk-5CWH2LKL.js → chunk-DOJBV6WR.js} +29 -14
  47. package/dist/chunk-DOJBV6WR.js.map +1 -0
  48. package/dist/{chunk-44EUCSG4.js → chunk-FFQNNFHX.js} +2 -2
  49. package/dist/{chunk-HEF4BRMT.js → chunk-FZLZUDJJ.js} +2 -2
  50. package/dist/{chunk-L3EFYRYK.js → chunk-GGFQAGOT.js} +7 -7
  51. package/dist/{chunk-ZLCBLDJO.js → chunk-GIRWNTMV.js} +2 -2
  52. package/dist/{chunk-EC2KVA27.js → chunk-H4DWSOBQ.js} +169 -105
  53. package/dist/chunk-H4DWSOBQ.js.map +1 -0
  54. package/dist/{chunk-SHNM7RIT.js → chunk-HJ4X4BGS.js} +2 -2
  55. package/dist/{chunk-MUNYUSBU.js → chunk-HJQ4NKKO.js} +2 -2
  56. package/dist/{chunk-V6Z4NAJZ.js → chunk-HM3ZTDAX.js} +2 -2
  57. package/dist/{chunk-EZS6QJNC.js → chunk-IFOCK3OJ.js} +2 -2
  58. package/dist/{chunk-LXXIV7Y2.js → chunk-JEX2JL3U.js} +7 -2
  59. package/dist/{chunk-LXXIV7Y2.js.map → chunk-JEX2JL3U.js.map} +1 -1
  60. package/dist/{chunk-DF6ZF2BN.js → chunk-LIVNX7WK.js} +2 -2
  61. package/dist/{chunk-WY66J4PI.js → chunk-LRVFS4KA.js} +2 -2
  62. package/dist/{chunk-LMB47UM6.js → chunk-LTDK6HBV.js} +2 -2
  63. package/dist/{chunk-HCIRR3BA.js → chunk-M4U25HLR.js} +2 -2
  64. package/dist/{chunk-YK7ZJPQM.js → chunk-MGN2RQRG.js} +2 -2
  65. package/dist/{chunk-G26YNEOC.js → chunk-NWA6IXR3.js} +1 -1
  66. package/dist/{chunk-G26YNEOC.js.map → chunk-NWA6IXR3.js.map} +1 -1
  67. package/dist/{chunk-JIJAWTRK.js → chunk-OCXDZJL4.js} +264 -194
  68. package/dist/chunk-OCXDZJL4.js.map +1 -0
  69. package/dist/{chunk-IUQXRRJB.js → chunk-OMWQO7H6.js} +2 -2
  70. package/dist/{chunk-7VO6E5UD.js → chunk-OVZIYLBZ.js} +6 -2
  71. package/dist/chunk-OVZIYLBZ.js.map +1 -0
  72. package/dist/{chunk-SPTPBKZX.js → chunk-OWNAWY6D.js} +2 -2
  73. package/dist/{chunk-XKDQTDXN.js → chunk-PFUXPTBT.js} +36 -15
  74. package/dist/chunk-PFUXPTBT.js.map +1 -0
  75. package/dist/{chunk-DQOGZZJA.js → chunk-QAHP5SBG.js} +3 -3
  76. package/dist/{chunk-GBGU5OZP.js → chunk-QF5EJ5VP.js} +13 -13
  77. package/dist/{chunk-FT75AQ74.js → chunk-QS5DUSBM.js} +2 -2
  78. package/dist/{chunk-72CBJ5VP.js → chunk-R3WZ74B2.js} +3 -3
  79. package/dist/{chunk-PDTNQLPC.js → chunk-RG3I2663.js} +2 -2
  80. package/dist/{chunk-CK6GCGMX.js → chunk-RTJJPW3C.js} +2 -2
  81. package/dist/{chunk-RJDYDF5K.js → chunk-TRAOZ2WP.js} +2 -2
  82. package/dist/{chunk-6ZAU7LAR.js → chunk-TTTPTQ6S.js} +2 -2
  83. package/dist/{chunk-JS44PBCM.js → chunk-U2A56LLF.js} +6 -6
  84. package/dist/{chunk-MC7PXJDP.js → chunk-UBOWDOL5.js} +5 -5
  85. package/dist/{chunk-4FM35YIA.js → chunk-UQYBPPVC.js} +2 -2
  86. package/dist/{chunk-OCRLJJOV.js → chunk-V4VCBFAL.js} +3 -3
  87. package/dist/{chunk-FNNGWN3O.js → chunk-VGE4PUY6.js} +2 -2
  88. package/dist/{chunk-5DVOBBTV.js → chunk-VV73XT3A.js} +2 -2
  89. package/dist/{chunk-GE3ZX6YK.js → chunk-W7NKMRAF.js} +2 -2
  90. package/dist/{chunk-AJJPXUE6.js → chunk-WBN66HPI.js} +2 -2
  91. package/dist/{chunk-XWJUFER3.js → chunk-WGFEGBFB.js} +2 -2
  92. package/dist/{chunk-43TUWQNR.js → chunk-XDKEHZUC.js} +2 -2
  93. package/dist/{chunk-ROAKLYOL.js → chunk-XHEKS4UN.js} +2 -2
  94. package/dist/{chunk-ZKK3VMWU.js → chunk-XVTB6BZS.js} +2 -2
  95. package/dist/{chunk-AZLD4CKG.js → chunk-Y56D5FSD.js} +17 -17
  96. package/dist/{chunk-MPWOAIIH.js → chunk-YDT3OEYF.js} +2 -2
  97. package/dist/{chunk-IN6U2BS5.js → chunk-YJHOVA42.js} +2 -2
  98. package/dist/{chunk-TC55M5PO.js → chunk-YLN4ZQV4.js} +2 -2
  99. package/dist/cli.js +50 -50
  100. package/dist/coding/export-okf-codegraph.js +9 -9
  101. package/dist/compounding/engine.js +11 -11
  102. package/dist/config.js +9 -9
  103. package/dist/connectors/codex-materialize-runner.js +10 -10
  104. package/dist/connectors/index.js +10 -10
  105. package/dist/convergence-refresh.js +12 -12
  106. package/dist/corpus-watermark.js +12 -12
  107. package/dist/entity-retrieval.js +10 -10
  108. package/dist/external-wiki-access.js +25 -25
  109. package/dist/extraction.js +14 -14
  110. package/dist/harmonic-retrieval.js +10 -10
  111. package/dist/index.js +65 -65
  112. package/dist/location/index.js +12 -12
  113. package/dist/maintenance/memory-governance.js +10 -10
  114. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
  115. package/dist/maintenance/rebuild-memory-projection-runner.js +12 -12
  116. package/dist/maintenance/rebuild-memory-projection.js +11 -11
  117. package/dist/memory-browse-operations.js +25 -25
  118. package/dist/memory-browse.js +5 -5
  119. package/dist/namespaces/migrate.js +11 -11
  120. package/dist/namespaces/search.d.ts.map +1 -1
  121. package/dist/namespaces/search.js +8 -8
  122. package/dist/namespaces/storage.js +10 -10
  123. package/dist/operator-doctor-corpus.js +13 -13
  124. package/dist/operator-toolkit.js +18 -18
  125. package/dist/orchestration/extraction-persist-deps.d.ts +2 -0
  126. package/dist/orchestration/extraction-persist-deps.d.ts.map +1 -1
  127. package/dist/orchestration/extraction-persist-promotion.d.ts +40 -10
  128. package/dist/orchestration/extraction-persist-promotion.d.ts.map +1 -1
  129. package/dist/orchestration/extraction-persist.d.ts.map +1 -1
  130. package/dist/orchestration/lifecycle-pending-fallback-drain.d.ts +18 -0
  131. package/dist/orchestration/lifecycle-pending-fallback-drain.d.ts.map +1 -0
  132. package/dist/orchestration/maintenance.d.ts +11 -13
  133. package/dist/orchestration/maintenance.d.ts.map +1 -1
  134. package/dist/orchestration/maintenance.js +20 -20
  135. package/dist/orchestration/qmd-maintenance-completion.d.ts +20 -0
  136. package/dist/orchestration/qmd-maintenance-completion.d.ts.map +1 -0
  137. package/dist/orchestrator.d.ts.map +1 -1
  138. package/dist/orchestrator.js +65 -65
  139. package/dist/qmd.js +2 -2
  140. package/dist/recall-composition-decision.js +2 -2
  141. package/dist/recall-navigation-operations.js +25 -25
  142. package/dist/recall-navigation.js +24 -24
  143. package/dist/recall-state-view-admission.js +5 -5
  144. package/dist/recall-why-service.js +5 -5
  145. package/dist/resume-bundles.js +9 -9
  146. package/dist/search/factory.js +7 -7
  147. package/dist/search/index.js +7 -7
  148. package/dist/search/lancedb-backend.d.ts +3 -0
  149. package/dist/search/lancedb-backend.d.ts.map +1 -1
  150. package/dist/search/lancedb-backend.js +2 -2
  151. package/dist/search/meilisearch-backend.d.ts +3 -0
  152. package/dist/search/meilisearch-backend.d.ts.map +1 -1
  153. package/dist/search/meilisearch-backend.js +2 -2
  154. package/dist/search/orama-backend.d.ts +3 -0
  155. package/dist/search/orama-backend.d.ts.map +1 -1
  156. package/dist/search/orama-backend.js +2 -2
  157. package/dist/search/port.d.ts +7 -0
  158. package/dist/search/port.d.ts.map +1 -1
  159. package/dist/search/port.js +1 -1
  160. package/dist/search/remote-backend.d.ts +2 -0
  161. package/dist/search/remote-backend.d.ts.map +1 -1
  162. package/dist/search/remote-backend.js +2 -2
  163. package/dist/semantic-consolidation.js +11 -11
  164. package/dist/semantic-rule-promotion.js +10 -10
  165. package/dist/semantic-rule-verifier.js +10 -10
  166. package/dist/source-agent-qualifier.js +13 -13
  167. package/dist/standup/build.js +10 -10
  168. package/dist/storage/entity-canonical-id-migration-adapter.d.ts +7 -1
  169. package/dist/storage/entity-canonical-id-migration-adapter.d.ts.map +1 -1
  170. package/dist/storage/entity-migration-maintenance-pending.d.ts +31 -0
  171. package/dist/storage/entity-migration-maintenance-pending.d.ts.map +1 -0
  172. package/dist/storage.d.ts +2 -2
  173. package/dist/storage.d.ts.map +1 -1
  174. package/dist/storage.js +9 -9
  175. package/dist/support-passport/index.js +27 -27
  176. package/dist/transfer/export-okf.js +10 -10
  177. package/dist/verified-recall.js +10 -10
  178. package/dist/who-knows-cli.js +11 -11
  179. package/dist/who-knows.js +10 -10
  180. package/package.json +2 -2
  181. package/src/namespaces/search.test.ts +121 -0
  182. package/src/namespaces/search.ts +8 -0
  183. package/src/orchestration/extraction-persist-deps.ts +3 -0
  184. package/src/orchestration/extraction-persist-promotion.ts +104 -16
  185. package/src/orchestration/extraction-persist.ts +66 -77
  186. package/src/orchestration/lifecycle-pending-fallback-drain.ts +97 -0
  187. package/src/orchestration/maintenance.test.ts +443 -1
  188. package/src/orchestration/maintenance.ts +73 -95
  189. package/src/orchestration/qmd-maintenance-completion.ts +32 -0
  190. package/src/orchestrator-entity-write-failure.test.ts +370 -0
  191. package/src/orchestrator.ts +9 -1
  192. package/src/search/lancedb-backend.ts +29 -12
  193. package/src/search/meilisearch-backend.test.ts +148 -0
  194. package/src/search/meilisearch-backend.ts +41 -14
  195. package/src/search/orama-backend.test.ts +75 -1
  196. package/src/search/orama-backend.ts +22 -7
  197. package/src/search/port.ts +7 -0
  198. package/src/search/remote-backend.ts +4 -0
  199. package/src/storage/entity-canonical-id-migration-adapter.ts +44 -9
  200. package/src/storage/entity-migration-maintenance-pending-helpers.test.ts +87 -0
  201. package/src/storage/entity-migration-maintenance-pending.test.ts +242 -0
  202. package/src/storage/entity-migration-maintenance-pending.ts +89 -0
  203. package/src/storage.ts +2 -2
  204. package/dist/chunk-5CWH2LKL.js.map +0 -1
  205. package/dist/chunk-7VO6E5UD.js.map +0 -1
  206. package/dist/chunk-EC2KVA27.js.map +0 -1
  207. package/dist/chunk-JIJAWTRK.js.map +0 -1
  208. package/dist/chunk-SJD334AG.js.map +0 -1
  209. package/dist/chunk-XKDQTDXN.js.map +0 -1
  210. package/dist/chunk-XRFLR3XF.js.map +0 -1
  211. /package/dist/{chunk-3NL4ALUP.js.map → chunk-24SIB3EW.js.map} +0 -0
  212. /package/dist/{chunk-Y3T5KQCR.js.map → chunk-2EYCW2ET.js.map} +0 -0
  213. /package/dist/{chunk-AHGOOZUC.js.map → chunk-34UVJNSG.js.map} +0 -0
  214. /package/dist/{chunk-2EXF6IIB.js.map → chunk-3632XJMR.js.map} +0 -0
  215. /package/dist/{chunk-KETS5A62.js.map → chunk-3H3PNQEF.js.map} +0 -0
  216. /package/dist/{chunk-SFRBUBUZ.js.map → chunk-3LNAQLW4.js.map} +0 -0
  217. /package/dist/{chunk-75BK4XGV.js.map → chunk-4BUJICMI.js.map} +0 -0
  218. /package/dist/{chunk-KIWO4327.js.map → chunk-4W5B5Z6P.js.map} +0 -0
  219. /package/dist/{chunk-B35EQQ7L.js.map → chunk-53OFDW3P.js.map} +0 -0
  220. /package/dist/{chunk-2ONKXEC7.js.map → chunk-5LBBXI2A.js.map} +0 -0
  221. /package/dist/{chunk-UCLJTGP3.js.map → chunk-65B5RFKQ.js.map} +0 -0
  222. /package/dist/{chunk-KAJYSO3U.js.map → chunk-6CDNOREO.js.map} +0 -0
  223. /package/dist/{chunk-POJRFSJM.js.map → chunk-7XGNGLAN.js.map} +0 -0
  224. /package/dist/{chunk-A6JDT6QF.js.map → chunk-AO5ZOD32.js.map} +0 -0
  225. /package/dist/{chunk-RA7YRL6H.js.map → chunk-AOSCGNIC.js.map} +0 -0
  226. /package/dist/{chunk-LWMLBVGB.js.map → chunk-B43P3DTC.js.map} +0 -0
  227. /package/dist/{chunk-VUMWVYMR.js.map → chunk-CIMD2MUR.js.map} +0 -0
  228. /package/dist/{chunk-44EUCSG4.js.map → chunk-FFQNNFHX.js.map} +0 -0
  229. /package/dist/{chunk-HEF4BRMT.js.map → chunk-FZLZUDJJ.js.map} +0 -0
  230. /package/dist/{chunk-L3EFYRYK.js.map → chunk-GGFQAGOT.js.map} +0 -0
  231. /package/dist/{chunk-ZLCBLDJO.js.map → chunk-GIRWNTMV.js.map} +0 -0
  232. /package/dist/{chunk-SHNM7RIT.js.map → chunk-HJ4X4BGS.js.map} +0 -0
  233. /package/dist/{chunk-MUNYUSBU.js.map → chunk-HJQ4NKKO.js.map} +0 -0
  234. /package/dist/{chunk-V6Z4NAJZ.js.map → chunk-HM3ZTDAX.js.map} +0 -0
  235. /package/dist/{chunk-EZS6QJNC.js.map → chunk-IFOCK3OJ.js.map} +0 -0
  236. /package/dist/{chunk-DF6ZF2BN.js.map → chunk-LIVNX7WK.js.map} +0 -0
  237. /package/dist/{chunk-WY66J4PI.js.map → chunk-LRVFS4KA.js.map} +0 -0
  238. /package/dist/{chunk-LMB47UM6.js.map → chunk-LTDK6HBV.js.map} +0 -0
  239. /package/dist/{chunk-HCIRR3BA.js.map → chunk-M4U25HLR.js.map} +0 -0
  240. /package/dist/{chunk-YK7ZJPQM.js.map → chunk-MGN2RQRG.js.map} +0 -0
  241. /package/dist/{chunk-IUQXRRJB.js.map → chunk-OMWQO7H6.js.map} +0 -0
  242. /package/dist/{chunk-SPTPBKZX.js.map → chunk-OWNAWY6D.js.map} +0 -0
  243. /package/dist/{chunk-DQOGZZJA.js.map → chunk-QAHP5SBG.js.map} +0 -0
  244. /package/dist/{chunk-GBGU5OZP.js.map → chunk-QF5EJ5VP.js.map} +0 -0
  245. /package/dist/{chunk-FT75AQ74.js.map → chunk-QS5DUSBM.js.map} +0 -0
  246. /package/dist/{chunk-72CBJ5VP.js.map → chunk-R3WZ74B2.js.map} +0 -0
  247. /package/dist/{chunk-PDTNQLPC.js.map → chunk-RG3I2663.js.map} +0 -0
  248. /package/dist/{chunk-CK6GCGMX.js.map → chunk-RTJJPW3C.js.map} +0 -0
  249. /package/dist/{chunk-RJDYDF5K.js.map → chunk-TRAOZ2WP.js.map} +0 -0
  250. /package/dist/{chunk-6ZAU7LAR.js.map → chunk-TTTPTQ6S.js.map} +0 -0
  251. /package/dist/{chunk-JS44PBCM.js.map → chunk-U2A56LLF.js.map} +0 -0
  252. /package/dist/{chunk-MC7PXJDP.js.map → chunk-UBOWDOL5.js.map} +0 -0
  253. /package/dist/{chunk-4FM35YIA.js.map → chunk-UQYBPPVC.js.map} +0 -0
  254. /package/dist/{chunk-OCRLJJOV.js.map → chunk-V4VCBFAL.js.map} +0 -0
  255. /package/dist/{chunk-FNNGWN3O.js.map → chunk-VGE4PUY6.js.map} +0 -0
  256. /package/dist/{chunk-5DVOBBTV.js.map → chunk-VV73XT3A.js.map} +0 -0
  257. /package/dist/{chunk-GE3ZX6YK.js.map → chunk-W7NKMRAF.js.map} +0 -0
  258. /package/dist/{chunk-AJJPXUE6.js.map → chunk-WBN66HPI.js.map} +0 -0
  259. /package/dist/{chunk-XWJUFER3.js.map → chunk-WGFEGBFB.js.map} +0 -0
  260. /package/dist/{chunk-43TUWQNR.js.map → chunk-XDKEHZUC.js.map} +0 -0
  261. /package/dist/{chunk-ROAKLYOL.js.map → chunk-XHEKS4UN.js.map} +0 -0
  262. /package/dist/{chunk-ZKK3VMWU.js.map → chunk-XVTB6BZS.js.map} +0 -0
  263. /package/dist/{chunk-AZLD4CKG.js.map → chunk-Y56D5FSD.js.map} +0 -0
  264. /package/dist/{chunk-MPWOAIIH.js.map → chunk-YDT3OEYF.js.map} +0 -0
  265. /package/dist/{chunk-IN6U2BS5.js.map → chunk-YJHOVA42.js.map} +0 -0
  266. /package/dist/{chunk-TC55M5PO.js.map → chunk-YLN4ZQV4.js.map} +0 -0
@@ -4,24 +4,24 @@ import {
4
4
  exportOkfBundle,
5
5
  firstHeading,
6
6
  parseIncludeStatus
7
- } from "../chunk-2EXF6IIB.js";
7
+ } from "../chunk-3632XJMR.js";
8
8
  import {
9
9
  OKF_EXPORT_VERSION
10
10
  } from "../chunk-I7TR2OCU.js";
11
11
  import "../chunk-D24OXEPB.js";
12
12
  import "../chunk-3UXOZBHV.js";
13
- import "../chunk-JIJAWTRK.js";
13
+ import "../chunk-OCXDZJL4.js";
14
14
  import "../chunk-UHVXE24Y.js";
15
15
  import "../chunk-DM5QZ3YU.js";
16
16
  import "../chunk-G6A3SGCE.js";
17
17
  import "../chunk-G6OFEGUR.js";
18
- import "../chunk-LXXIV7Y2.js";
19
- import "../chunk-JS44PBCM.js";
20
- import "../chunk-5CWH2LKL.js";
21
- import "../chunk-XKDQTDXN.js";
18
+ import "../chunk-JEX2JL3U.js";
19
+ import "../chunk-U2A56LLF.js";
20
+ import "../chunk-DOJBV6WR.js";
21
+ import "../chunk-PFUXPTBT.js";
22
22
  import "../chunk-CYEPCZN5.js";
23
- import "../chunk-XRFLR3XF.js";
24
- import "../chunk-7VO6E5UD.js";
23
+ import "../chunk-DLZGSZVC.js";
24
+ import "../chunk-OVZIYLBZ.js";
25
25
  import "../chunk-WNEVEMJ3.js";
26
26
  import "../chunk-EXYT52NR.js";
27
27
  import "../chunk-Y5NLBXPV.js";
@@ -57,8 +57,8 @@ import "../chunk-7CT3AI52.js";
57
57
  import "../chunk-G7D6GZ5J.js";
58
58
  import "../chunk-7VLBZKNB.js";
59
59
  import "../chunk-UUZ7KZAO.js";
60
- import "../chunk-AJJPXUE6.js";
61
- import "../chunk-G26YNEOC.js";
60
+ import "../chunk-WBN66HPI.js";
61
+ import "../chunk-NWA6IXR3.js";
62
62
  import "../chunk-VILPVT4S.js";
63
63
  import "../chunk-AF2XMJKD.js";
64
64
  import "../chunk-OR42ZI54.js";
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-ROAKLYOL.js";
4
+ } from "./chunk-XHEKS4UN.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-JIJAWTRK.js";
6
+ import "./chunk-OCXDZJL4.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-DM5QZ3YU.js";
9
9
  import "./chunk-G6A3SGCE.js";
10
10
  import "./chunk-G6OFEGUR.js";
11
- import "./chunk-LXXIV7Y2.js";
12
- import "./chunk-JS44PBCM.js";
13
- import "./chunk-5CWH2LKL.js";
14
- import "./chunk-XKDQTDXN.js";
11
+ import "./chunk-JEX2JL3U.js";
12
+ import "./chunk-U2A56LLF.js";
13
+ import "./chunk-DOJBV6WR.js";
14
+ import "./chunk-PFUXPTBT.js";
15
15
  import "./chunk-CYEPCZN5.js";
16
- import "./chunk-XRFLR3XF.js";
17
- import "./chunk-7VO6E5UD.js";
16
+ import "./chunk-DLZGSZVC.js";
17
+ import "./chunk-OVZIYLBZ.js";
18
18
  import "./chunk-WNEVEMJ3.js";
19
19
  import "./chunk-EXYT52NR.js";
20
20
  import "./chunk-Y5NLBXPV.js";
@@ -50,8 +50,8 @@ import "./chunk-7CT3AI52.js";
50
50
  import "./chunk-G7D6GZ5J.js";
51
51
  import "./chunk-7VLBZKNB.js";
52
52
  import "./chunk-UUZ7KZAO.js";
53
- import "./chunk-AJJPXUE6.js";
54
- import "./chunk-G26YNEOC.js";
53
+ import "./chunk-WBN66HPI.js";
54
+ import "./chunk-NWA6IXR3.js";
55
55
  import "./chunk-VILPVT4S.js";
56
56
  import "./chunk-AF2XMJKD.js";
57
57
  import "./chunk-OR42ZI54.js";
@@ -4,20 +4,20 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-TC55M5PO.js";
8
- import "./chunk-2ONKXEC7.js";
9
- import "./chunk-JIJAWTRK.js";
7
+ } from "./chunk-YLN4ZQV4.js";
8
+ import "./chunk-5LBBXI2A.js";
9
+ import "./chunk-OCXDZJL4.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
11
  import "./chunk-DM5QZ3YU.js";
12
12
  import "./chunk-G6A3SGCE.js";
13
13
  import "./chunk-G6OFEGUR.js";
14
- import "./chunk-LXXIV7Y2.js";
15
- import "./chunk-JS44PBCM.js";
16
- import "./chunk-5CWH2LKL.js";
17
- import "./chunk-XKDQTDXN.js";
14
+ import "./chunk-JEX2JL3U.js";
15
+ import "./chunk-U2A56LLF.js";
16
+ import "./chunk-DOJBV6WR.js";
17
+ import "./chunk-PFUXPTBT.js";
18
18
  import "./chunk-CYEPCZN5.js";
19
- import "./chunk-XRFLR3XF.js";
20
- import "./chunk-7VO6E5UD.js";
19
+ import "./chunk-DLZGSZVC.js";
20
+ import "./chunk-OVZIYLBZ.js";
21
21
  import "./chunk-WNEVEMJ3.js";
22
22
  import "./chunk-EXYT52NR.js";
23
23
  import "./chunk-Y5NLBXPV.js";
@@ -53,8 +53,8 @@ import "./chunk-7CT3AI52.js";
53
53
  import "./chunk-G7D6GZ5J.js";
54
54
  import "./chunk-7VLBZKNB.js";
55
55
  import "./chunk-UUZ7KZAO.js";
56
- import "./chunk-AJJPXUE6.js";
57
- import "./chunk-G26YNEOC.js";
56
+ import "./chunk-WBN66HPI.js";
57
+ import "./chunk-NWA6IXR3.js";
58
58
  import "./chunk-VILPVT4S.js";
59
59
  import "./chunk-AF2XMJKD.js";
60
60
  import "./chunk-OR42ZI54.js";
package/dist/who-knows.js CHANGED
@@ -9,19 +9,19 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-2ONKXEC7.js";
13
- import "./chunk-JIJAWTRK.js";
12
+ } from "./chunk-5LBBXI2A.js";
13
+ import "./chunk-OCXDZJL4.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
15
  import "./chunk-DM5QZ3YU.js";
16
16
  import "./chunk-G6A3SGCE.js";
17
17
  import "./chunk-G6OFEGUR.js";
18
- import "./chunk-LXXIV7Y2.js";
19
- import "./chunk-JS44PBCM.js";
20
- import "./chunk-5CWH2LKL.js";
21
- import "./chunk-XKDQTDXN.js";
18
+ import "./chunk-JEX2JL3U.js";
19
+ import "./chunk-U2A56LLF.js";
20
+ import "./chunk-DOJBV6WR.js";
21
+ import "./chunk-PFUXPTBT.js";
22
22
  import "./chunk-CYEPCZN5.js";
23
- import "./chunk-XRFLR3XF.js";
24
- import "./chunk-7VO6E5UD.js";
23
+ import "./chunk-DLZGSZVC.js";
24
+ import "./chunk-OVZIYLBZ.js";
25
25
  import "./chunk-WNEVEMJ3.js";
26
26
  import "./chunk-EXYT52NR.js";
27
27
  import "./chunk-Y5NLBXPV.js";
@@ -57,8 +57,8 @@ import "./chunk-7CT3AI52.js";
57
57
  import "./chunk-G7D6GZ5J.js";
58
58
  import "./chunk-7VLBZKNB.js";
59
59
  import "./chunk-UUZ7KZAO.js";
60
- import "./chunk-AJJPXUE6.js";
61
- import "./chunk-G26YNEOC.js";
60
+ import "./chunk-WBN66HPI.js";
61
+ import "./chunk-NWA6IXR3.js";
62
62
  import "./chunk-VILPVT4S.js";
63
63
  import "./chunk-AF2XMJKD.js";
64
64
  import "./chunk-OR42ZI54.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "10.0.51",
3
+ "version": "10.0.53",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3346,7 +3346,7 @@
3346
3346
  "core"
3347
3347
  ],
3348
3348
  "peerDependencies": {
3349
- "@remnic/coding-graph": "^10.0.51"
3349
+ "@remnic/coding-graph": "^10.0.53"
3350
3350
  },
3351
3351
  "peerDependenciesMeta": {
3352
3352
  "@remnic/coding-graph": {
@@ -1,6 +1,11 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { mkdtemp, rm } from "node:fs/promises";
3
6
  import { NamespaceSearchRouter, normalizeQmdResultPath } from "./search.js";
7
+ import { MaintenanceScheduler } from "../orchestration/maintenance.js";
8
+ import type { NamespaceCatalog } from "./catalog.js";
4
9
  import type {
5
10
  SearchBackend,
6
11
  SearchBackendStatus,
@@ -977,3 +982,119 @@ test("normalizeQmdResultPath strips a real collection prefix but not a category
977
982
  // A non-category collection prefix on a plain hit is still stripped.
978
983
  assert.equal(normalizeQmdResultPath("openclaw-engram/facts/a.md", "openclaw-engram"), "facts/a.md");
979
984
  });
985
+
986
+ /**
987
+ * Orama, LanceDB, Meilisearch and remote backends have no updateStrict or
988
+ * updateCollectionStrict; their plain update() is fail-open. They report whether
989
+ * an update ran through updateCompleted() (issue #3286).
990
+ */
991
+ class NonQmdBackend extends FakeBackend {
992
+ completedCalls = 0;
993
+
994
+ constructor(completed: boolean) {
995
+ super(false);
996
+ // Instance properties shadow the QMD-only strict methods FakeBackend defines.
997
+ Object.defineProperty(this, "updateStrict", { value: undefined });
998
+ Object.defineProperty(this, "updateCollectionStrict", { value: undefined });
999
+ Object.defineProperty(this, "updateCompleted", {
1000
+ value: async (): Promise<boolean> => {
1001
+ this.completedCalls += 1;
1002
+ return completed;
1003
+ },
1004
+ });
1005
+ }
1006
+ }
1007
+
1008
+ function nonQmdRouter(completed: boolean, created: NonQmdBackend[], cfg: PluginConfig = config()): NamespaceSearchRouter {
1009
+ return new NamespaceSearchRouter(
1010
+ cfg,
1011
+ { storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
1012
+ () => {
1013
+ const backend = new NonQmdBackend(completed);
1014
+ created.push(backend);
1015
+ return backend;
1016
+ },
1017
+ );
1018
+ }
1019
+
1020
+ test("strict updateNamespaces fails for a non-QMD backend whose refresh did not complete", async () => {
1021
+ const created: NonQmdBackend[] = [];
1022
+ const router = nonQmdRouter(false, created);
1023
+
1024
+ await assert.rejects(
1025
+ router.updateNamespaces(["main"], undefined, { strict: true }),
1026
+ /did not complete/,
1027
+ );
1028
+ assert.equal(created.reduce((sum, backend) => sum + backend.updates, 0), 0, "the fail-open update() is not what strict runs");
1029
+ });
1030
+
1031
+ test("strict updateNamespaces succeeds for a non-QMD backend whose refresh completed", async () => {
1032
+ const created: NonQmdBackend[] = [];
1033
+ const router = nonQmdRouter(true, created);
1034
+
1035
+ assert.equal(await router.updateNamespaces(["main", "shared"], undefined, { strict: true }), 2);
1036
+ assert.equal(created.reduce((sum, backend) => sum + backend.completedCalls, 0), 2);
1037
+ assert.equal(created.reduce((sum, backend) => sum + backend.updates, 0), 0);
1038
+ });
1039
+
1040
+ test("non-strict updateNamespaces keeps the fail-open update() for non-QMD backends", async () => {
1041
+ const created: NonQmdBackend[] = [];
1042
+ const router = nonQmdRouter(false, created);
1043
+
1044
+ assert.equal(await router.updateNamespaces(["main"]), 1);
1045
+ assert.equal(created.reduce((sum, backend) => sum + backend.updates, 0), 1);
1046
+ assert.equal(created.reduce((sum, backend) => sum + backend.completedCalls, 0), 0);
1047
+ });
1048
+
1049
+ test("strict updateNamespaces falls back to update() for a backend with no strict or completed variant", async () => {
1050
+ const created: FakeBackend[] = [];
1051
+ const router = new NamespaceSearchRouter(
1052
+ config(),
1053
+ { storageFor: async (namespace: string) => ({ dir: `/tmp/remnic/${namespace}` }) },
1054
+ () => {
1055
+ const backend = new FakeBackend(false);
1056
+ Object.defineProperty(backend, "updateCollectionStrict", { value: undefined });
1057
+ created.push(backend);
1058
+ return backend;
1059
+ },
1060
+ );
1061
+
1062
+ assert.equal(await router.updateNamespaces(["main"], undefined, { strict: true }), 1);
1063
+ assert.equal(created.reduce((sum, backend) => sum + backend.updates, 0), 1);
1064
+ });
1065
+
1066
+ test("namespace-mode maintenance is served only when a non-QMD backend's refresh completed", async () => {
1067
+ for (const completed of [true, false]) {
1068
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-3286-ns-completion-"));
1069
+ const cfg: PluginConfig = {
1070
+ ...config(),
1071
+ memoryDir,
1072
+ sharedNamespace: "shared",
1073
+ namespacePolicies: [],
1074
+ maintenanceNamespaceLockStaleMs: 100,
1075
+ qmdMaintenanceEnabled: true,
1076
+ qmdMaintenanceDebounceMs: 60_000,
1077
+ qmdAutoEmbedEnabled: false,
1078
+ };
1079
+ const created: NonQmdBackend[] = [];
1080
+ const router = nonQmdRouter(completed, created, cfg);
1081
+ const catalog: NamespaceCatalog = Object.assign(Object.create(null), {
1082
+ enabled: true,
1083
+ async listNamespaces() {
1084
+ return [{ namespace: "main" }];
1085
+ },
1086
+ async markMaintenance() {},
1087
+ });
1088
+ const qmd: SearchBackend = Object.assign(Object.create(null), { isAvailable: () => true });
1089
+ const scheduler = new MaintenanceScheduler({ config: cfg, getQmd: () => qmd, namespaceSearchRouter: router, namespaceCatalog: catalog });
1090
+ try {
1091
+ const served = scheduler.requestQmdMaintenanceCompletion();
1092
+ await scheduler.runQmdMaintenance();
1093
+ assert.equal(await served, completed, completed ? "a completed refresh serves the request" : "an incomplete refresh must keep the marker owed");
1094
+ assert.ok(created.some((backend) => backend.completedCalls > 0), "maintenance asked the backend whether it completed");
1095
+ } finally {
1096
+ await scheduler.dispose();
1097
+ await rm(memoryDir, { recursive: true, force: true });
1098
+ }
1099
+ }
1100
+ });
@@ -596,6 +596,14 @@ async function updateBackendRecord(
596
596
  await record.backend.updateCollectionStrict(record.collection, execution);
597
597
  return;
598
598
  }
599
+ // Backends with no strict variant (Orama, LanceDB, Meilisearch, remote) have a fail-open
600
+ // update(): it resolves when it returned early or failed. Their updateCompleted() says
601
+ // whether the refresh ran, so strict callers get a failure instead of a fake success.
602
+ const completed = await record.backend.updateCompleted?.(execution);
603
+ if (completed !== undefined) {
604
+ if (!completed) throw new Error("search backend update did not complete");
605
+ return;
606
+ }
599
607
  }
600
608
  await record.backend.update(execution);
601
609
  }
@@ -106,4 +106,7 @@ export interface ExtractionPersistDeps {
106
106
  */
107
107
  invalidateGraphEdgeCache?: (storage: StorageManager) => void;
108
108
  updateTemporalTagIndexes: (storage: StorageManager, persistedIds: string[]) => Promise<void>;
109
+ /** Schedule QMD reindex after partial durable writes that throw out of persist. */
110
+ requestQmdMaintenance: () => void;
111
+
109
112
  }
@@ -23,6 +23,11 @@ import {
23
23
  import type { MemoryFile, PluginConfig } from "../types.js";
24
24
  import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
25
25
  import { readDurableSemanticFingerprint, readPromotionReceiptStatus, type MergedTargetPromotionPayload } from "./semantic-merge-promotion-payload.js";
26
+ import type { BehaviorSignalEvent, ExtractionResult } from "../types.js";
27
+ import type { HarmonicConstructionInput } from "../harmonic-construction.js";
28
+ import { dedupeBehaviorSignalsByMemoryAndHash } from "../behavior-signals.js";
29
+ import { persistConstructedHarmonicRecords } from "./harmonic-construction-persist.js";
30
+
26
31
 
27
32
  export const confidenceTierOrder = [
28
33
  "explicit",
@@ -116,27 +121,110 @@ export async function readActiveMemoriesBothTiers(
116
121
  return coldMems.length === 0 ? hotMems : [...hotMems, ...coldMems];
117
122
  }
118
123
 
124
+
119
125
  /**
120
- * PR #2016: after `writeSealedMemory` has made a fact `.md` durable with its
121
- * fact-hash flush deferred (#1909 batching), a throw in the fallible post-write
122
- * work (contradiction resolve, indexing, shared promotion, artifact write)
123
- * would strand the deferred parent hash — the shared fact-hash index on disk
124
- * would be missing the parent until the next corpus rebuild, letting a peer
125
- * re-extract a duplicate. Flush the batch save before the error propagates so
126
- * the durable-hash invariant holds on every path. No-op when dedup is off
127
- * (`deferred=false` → the write already flushed and the batch saver is a no-op).
128
- * Best-effort: a flush failure is logged and never masks the original error.
126
+ * Batch-end finalization for facts already durable in this persist pass:
127
+ * content-hash save, behavior signals, harmonic construction, temporal/tag
128
+ * indexes. Shared by the success tail and every rethrow path so a partial
129
+ * batch (e.g. fact wrote, entity failed) still lands deferred side effects
130
+ * before the original error propagates (#3228 / #3231). Best-effort: each
131
+ * step logs and never masks `originalError` at the call site.
132
+ *
133
+ * `scheduleQmd` is failure-only. Success still schedules QMD from
134
+ * extraction-run after persist returns, so success passes false.
129
135
  */
130
- export async function flushDeferredFactHashOnFailure(
131
- saveContentHashIndexes: () => Promise<void>,
132
- deferred: boolean,
133
- ): Promise<void> {
134
- if (!deferred) return;
135
- await saveContentHashIndexes().catch((err) =>
136
- log.warn(`content-hash flush after post-write failure failed: ${err}`),
136
+ export async function finalizeExtractionCommittedWrites(options: {
137
+ saveContentHashIndexes: () => Promise<void>;
138
+ behaviorSignalsByStorage: Iterable<{
139
+ storage: StorageManager;
140
+ events: BehaviorSignalEvent[];
141
+ }>;
142
+ harmonic?: {
143
+ enabled: boolean;
144
+ entries: Iterable<{
145
+ storage: StorageManager;
146
+ facts: HarmonicConstructionInput["persistedFacts"];
147
+ }>;
148
+ baseStorageDir: string;
149
+ abstractionNodeStoreDir?: string;
150
+ sessionKey?: string;
151
+ validAt?: string;
152
+ episodeTitle?: string;
153
+ anchorsEnabled: boolean;
154
+ entityMentions: ExtractionResult["entities"];
155
+ };
156
+ updateTemporalTagIndexes: (
157
+ storage: StorageManager,
158
+ persistedIds: string[],
159
+ ) => Promise<void>;
160
+ fallbackStorage: StorageManager;
161
+ persistedIdsByStorage: Map<string, { storage: StorageManager; ids: string[] }>;
162
+ requestQmdMaintenance?: () => void;
163
+ scheduleQmd: boolean;
164
+ }): Promise<void> {
165
+ await options.saveContentHashIndexes().catch((err) => {
166
+ log.warn(`content-hash index save failed: ${err}`);
167
+ });
168
+
169
+ // Snapshot once — Map iterators are single-pass.
170
+ const behaviorEntries = [...options.behaviorSignalsByStorage];
171
+ for (const { storage: targetStorage, events } of behaviorEntries) {
172
+ const dedupedSignals = dedupeBehaviorSignalsByMemoryAndHash(events);
173
+ if (dedupedSignals.length === 0) continue;
174
+ await targetStorage
175
+ .appendBehaviorSignals(dedupedSignals)
176
+ .catch((err) =>
177
+ log.warn(`appendBehaviorSignals failed (non-fatal): ${err}`),
178
+ );
179
+ }
180
+
181
+ const harmonic = options.harmonic;
182
+ let harmonicEntryCount = 0;
183
+ if (harmonic?.enabled) {
184
+ const entries = [...harmonic.entries];
185
+ harmonicEntryCount = entries.length;
186
+ if (entries.length > 0) {
187
+ await persistConstructedHarmonicRecords({
188
+ entries,
189
+ baseStorageDir: harmonic.baseStorageDir,
190
+ abstractionNodeStoreDir: harmonic.abstractionNodeStoreDir,
191
+ sessionKey: harmonic.sessionKey,
192
+ validAt: harmonic.validAt,
193
+ episodeTitle: harmonic.episodeTitle,
194
+ anchorsEnabled: harmonic.anchorsEnabled,
195
+ entityMentions: harmonic.entityMentions,
196
+ });
197
+ }
198
+ }
199
+
200
+ void (async () => {
201
+ if (options.persistedIdsByStorage.size === 0) {
202
+ await options.updateTemporalTagIndexes(options.fallbackStorage, []);
203
+ return;
204
+ }
205
+ for (const entry of options.persistedIdsByStorage.values()) {
206
+ await options.updateTemporalTagIndexes(entry.storage, entry.ids);
207
+ }
208
+ })().catch((err) =>
209
+ log.debug(`temporal-index update error (non-fatal): ${err}`),
137
210
  );
211
+
212
+ if (!options.scheduleQmd || !options.requestQmdMaintenance) return;
213
+ const hasCommitted =
214
+ options.persistedIdsByStorage.size > 0 ||
215
+ behaviorEntries.length > 0 ||
216
+ harmonicEntryCount > 0;
217
+ if (!hasCommitted) return;
218
+ try {
219
+ options.requestQmdMaintenance();
220
+ } catch (err) {
221
+ log.warn(
222
+ `QMD maintenance schedule after partial persist failed (non-fatal): ${err}`,
223
+ );
224
+ }
138
225
  }
139
226
 
227
+
140
228
  /**
141
229
  * Merged-target promotion scope gate (PR #2771 finding A). A committed
142
230
  * record stamped `toolScoped: true` must keep its promoted copy withheld