@remnic/core 9.39.0 → 9.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/dist/access-admin-ops-surface.d.ts +10 -10
  2. package/dist/access-admin-ops-surface.js +13 -12
  3. package/dist/access-authorization-probe.d.ts +10 -10
  4. package/dist/access-authorization-probe.js +14 -13
  5. package/dist/access-boundary.d.ts +10 -10
  6. package/dist/access-boundary.js +13 -12
  7. package/dist/access-cli.js +35 -34
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +10 -10
  10. package/dist/access-extraction-force-flush.js +13 -12
  11. package/dist/access-health-types.d.ts +1 -1
  12. package/dist/access-http-lcm-compaction.d.ts +10 -10
  13. package/dist/access-http-lifecycle-flush.d.ts +10 -10
  14. package/dist/access-http.d.ts +10 -10
  15. package/dist/access-http.js +18 -17
  16. package/dist/access-identity-continuity-surface.d.ts +8 -8
  17. package/dist/access-identity-continuity-surface.js +13 -12
  18. package/dist/access-lcm-surface.d.ts +10 -10
  19. package/dist/access-lcm-surface.js +13 -12
  20. package/dist/access-mcp.d.ts +10 -10
  21. package/dist/access-mcp.js +16 -15
  22. package/dist/access-memory-search-fanout.d.ts +2 -2
  23. package/dist/{access-namespace-preflight-CWyL4Zai.d.ts → access-namespace-preflight-47dOyty9.d.ts} +1 -1
  24. package/dist/access-namespace-preflight.d.ts +3 -3
  25. package/dist/access-namespace-preflight.js +13 -12
  26. package/dist/access-observe-write-surface.d.ts +10 -10
  27. package/dist/access-observe-write-surface.js +13 -12
  28. package/dist/access-operations-batch.js +14 -13
  29. package/dist/access-operations.d.ts +13 -13
  30. package/dist/access-operations.js +15 -14
  31. package/dist/access-recall-concurrency.d.ts +10 -10
  32. package/dist/access-recall-concurrency.js +13 -12
  33. package/dist/access-recall-response.d.ts +10 -10
  34. package/dist/access-recall-response.js +13 -12
  35. package/dist/access-recall-surface.d.ts +10 -10
  36. package/dist/access-recall-surface.js +13 -12
  37. package/dist/access-schema.d.ts +84 -84
  38. package/dist/{access-service-C6QuKBCG.d.ts → access-service-D1BkxwSf.d.ts} +7 -7
  39. package/dist/access-service-helpers.d.ts +10 -10
  40. package/dist/access-service.d.ts +10 -10
  41. package/dist/access-service.js +13 -12
  42. package/dist/access-surface-catalog.d.ts +10 -10
  43. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  44. package/dist/action-confidence.d.ts +1 -1
  45. package/dist/active-memory-bridge.d.ts +1 -1
  46. package/dist/active-recall.d.ts +1 -1
  47. package/dist/active-recall.js +2 -2
  48. package/dist/behavior-learner.d.ts +1 -1
  49. package/dist/behavior-signals.d.ts +1 -1
  50. package/dist/bootstrap.d.ts +8 -8
  51. package/dist/briefing.d.ts +2 -2
  52. package/dist/briefing.js +3 -3
  53. package/dist/buffer-surprise-report.d.ts +1 -1
  54. package/dist/buffer-turn-helpers.d.ts +1 -1
  55. package/dist/buffer.d.ts +2 -2
  56. package/dist/bulk-import/index.d.ts +3 -3
  57. package/dist/calibration.d.ts +1 -1
  58. package/dist/capabilities.d.ts +1 -1
  59. package/dist/{catalog-Du4bpZWM.d.ts → catalog-DPQynQZG.d.ts} +1 -1
  60. package/dist/causal-behavior.d.ts +1 -1
  61. package/dist/causal-consolidation.d.ts +1 -1
  62. package/dist/causal-consolidation.js +4 -4
  63. package/dist/causal-trajectory-graph.d.ts +1 -1
  64. package/dist/{chunk-AVGTOOYP.js → chunk-3C2TGBDB.js} +2 -2
  65. package/dist/{chunk-443XCR34.js → chunk-3SG4FGDV.js} +53 -41
  66. package/dist/chunk-3SG4FGDV.js.map +1 -0
  67. package/dist/{chunk-MHCRASVK.js → chunk-5N26WBPQ.js} +2 -2
  68. package/dist/{chunk-CMFUYOYB.js → chunk-5TOV3D6U.js} +2 -2
  69. package/dist/{chunk-SHTPVI47.js → chunk-6GIMMNVK.js} +3 -3
  70. package/dist/{chunk-5JUYBWJD.js → chunk-6I2C3EOH.js} +18 -18
  71. package/dist/chunk-7VIB7PAE.js +142 -0
  72. package/dist/chunk-7VIB7PAE.js.map +1 -0
  73. package/dist/{chunk-CNZLKQEL.js → chunk-AXUU7SG3.js} +2 -2
  74. package/dist/{chunk-7ERHAARG.js → chunk-BI6RE2ZS.js} +2 -2
  75. package/dist/{chunk-GYGXKATH.js → chunk-CQ5MR2HQ.js} +16 -12
  76. package/dist/chunk-CQ5MR2HQ.js.map +1 -0
  77. package/dist/{chunk-CYM2PHLB.js → chunk-CWPDM66T.js} +8 -7
  78. package/dist/chunk-CWPDM66T.js.map +1 -0
  79. package/dist/{chunk-UGAZILZG.js → chunk-F2KMAFEB.js} +2 -2
  80. package/dist/{chunk-G57BGHQ2.js → chunk-FHEJ22B7.js} +11 -5
  81. package/dist/chunk-FHEJ22B7.js.map +1 -0
  82. package/dist/{chunk-DMT2RGAZ.js → chunk-FXGLFGIG.js} +3 -3
  83. package/dist/{chunk-6BNE62PM.js → chunk-GDC4INBF.js} +2 -2
  84. package/dist/{chunk-HXDWZFNP.js → chunk-GSL47NPM.js} +1 -1
  85. package/dist/chunk-GSL47NPM.js.map +1 -0
  86. package/dist/{chunk-DJH35IVS.js → chunk-JDXDA5OO.js} +2 -2
  87. package/dist/{chunk-ZBDORYWM.js → chunk-KPJQTSRJ.js} +2 -2
  88. package/dist/{chunk-CPD6C6K6.js → chunk-KXGN6G2Y.js} +3 -3
  89. package/dist/chunk-KXGN6G2Y.js.map +1 -0
  90. package/dist/{chunk-F5EVTFQK.js → chunk-MSXWUXFE.js} +2 -2
  91. package/dist/{chunk-XSPD6KQL.js → chunk-MVW234LO.js} +2 -2
  92. package/dist/{chunk-5TRIAPT4.js → chunk-NHRNYJPJ.js} +4 -4
  93. package/dist/{chunk-VGK33D3K.js → chunk-OEXKYYVH.js} +2 -2
  94. package/dist/{chunk-VK33JSBR.js → chunk-OYFDEJZB.js} +23 -6
  95. package/dist/chunk-OYFDEJZB.js.map +1 -0
  96. package/dist/{chunk-JKTHT4KX.js → chunk-PWKZV4A3.js} +3 -3
  97. package/dist/{chunk-BVJIAIB3.js → chunk-Q4XL7LJW.js} +32 -11
  98. package/dist/chunk-Q4XL7LJW.js.map +1 -0
  99. package/dist/{chunk-AL73FWSS.js → chunk-QY66HJ4X.js} +2 -2
  100. package/dist/{chunk-KWU6MAD4.js → chunk-R4Q7CQGZ.js} +2 -2
  101. package/dist/{chunk-IB26HVAJ.js → chunk-TM72UOX2.js} +3 -3
  102. package/dist/chunk-TM72UOX2.js.map +1 -0
  103. package/dist/{chunk-MYXWPG5O.js → chunk-TXBU7YDV.js} +2 -2
  104. package/dist/{chunk-KJP2R5MJ.js → chunk-UGCUVLOL.js} +25 -21
  105. package/dist/chunk-UGCUVLOL.js.map +1 -0
  106. package/dist/{chunk-7OCTH7AJ.js → chunk-UQVGDEAJ.js} +2 -2
  107. package/dist/{chunk-VQTRSX4R.js → chunk-WGCTFGLW.js} +2 -2
  108. package/dist/{chunk-4CSTEPFA.js → chunk-XRWVXPEM.js} +2 -2
  109. package/dist/{chunk-ENLZOWYK.js → chunk-ZERSIPFC.js} +2 -2
  110. package/dist/{cli-ClXRCu08.d.ts → cli-IUhV-lmk.d.ts} +5 -5
  111. package/dist/cli.d.ts +12 -12
  112. package/dist/cli.js +30 -29
  113. package/dist/compounding/engine.d.ts +2 -2
  114. package/dist/compounding/engine.js +3 -3
  115. package/dist/compounding/preference-consolidator.d.ts +1 -1
  116. package/dist/compression-optimizer.d.ts +1 -1
  117. package/dist/config.d.ts +1 -1
  118. package/dist/config.js +2 -2
  119. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  120. package/dist/connectors/codex-materialize-runner.js +3 -3
  121. package/dist/connectors/codex-materialize.d.ts +1 -1
  122. package/dist/connectors/index.d.ts +1 -1
  123. package/dist/connectors/index.js +3 -3
  124. package/dist/consolidation-provenance-check.d.ts +2 -2
  125. package/dist/consolidation-undo.d.ts +2 -2
  126. package/dist/contradiction/index.d.ts +2 -2
  127. package/dist/conversation-index/backend.d.ts +1 -1
  128. package/dist/conversation-index/chunker.d.ts +1 -1
  129. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  130. package/dist/conversation-index/indexer.d.ts +1 -1
  131. package/dist/conversation-index/search.d.ts +1 -1
  132. package/dist/corpus-watermark.d.ts +7 -1
  133. package/dist/corpus-watermark.js +5 -5
  134. package/dist/day-summary.d.ts +1 -1
  135. package/dist/delinearize.d.ts +1 -1
  136. package/dist/direct-answer-wiring.d.ts +1 -1
  137. package/dist/direct-answer.d.ts +1 -1
  138. package/dist/embedding-fallback.d.ts +1 -1
  139. package/dist/enrichment/index.d.ts +1 -1
  140. package/dist/entity-retrieval.d.ts +2 -2
  141. package/dist/entity-retrieval.js +3 -3
  142. package/dist/entity-schema.d.ts +1 -1
  143. package/dist/explicit-capture.d.ts +8 -8
  144. package/dist/extraction-error-classification.d.ts +1 -1
  145. package/dist/extraction-faithfulness.d.ts +1 -1
  146. package/dist/extraction-judge-telemetry.d.ts +1 -1
  147. package/dist/extraction-judge-training.d.ts +1 -1
  148. package/dist/extraction-judge.d.ts +1 -1
  149. package/dist/extraction-liveness.d.ts +1 -1
  150. package/dist/extraction-liveness.js +3 -1
  151. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  152. package/dist/extraction-source-grounding.d.ts +1 -1
  153. package/dist/extraction.d.ts +1 -1
  154. package/dist/extraction.js +3 -3
  155. package/dist/fallback-llm.d.ts +1 -1
  156. package/dist/graph-dashboard-diff.d.ts +1 -1
  157. package/dist/graph-dashboard-key.d.ts +1 -1
  158. package/dist/graph-dashboard-parser.d.ts +1 -1
  159. package/dist/graph-edge-reinforcement.d.ts +1 -1
  160. package/dist/graph-snapshot.d.ts +1 -1
  161. package/dist/graph.d.ts +1 -1
  162. package/dist/importance.d.ts +1 -1
  163. package/dist/importers/index.d.ts +1 -1
  164. package/dist/in-flight-reads.d.ts +1 -1
  165. package/dist/index.d.ts +407 -407
  166. package/dist/index.js +35 -34
  167. package/dist/intent.d.ts +1 -1
  168. package/dist/lcm/engine.d.ts +1 -1
  169. package/dist/lcm/index.d.ts +1 -1
  170. package/dist/lcm/tools.d.ts +1 -1
  171. package/dist/lifecycle.d.ts +1 -1
  172. package/dist/live-connectors-runner.d.ts +1 -1
  173. package/dist/local-llm.d.ts +1 -1
  174. package/dist/local-model-endpoint.d.ts +1 -1
  175. package/dist/maintenance/memory-governance.d.ts +1 -1
  176. package/dist/maintenance/memory-governance.js +3 -3
  177. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  178. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  179. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  180. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  181. package/dist/{maintenance-Dsvprbod.d.ts → maintenance-DVBLXkFw.d.ts} +3 -3
  182. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  183. package/dist/memory-action-policy.d.ts +1 -1
  184. package/dist/memory-cache.d.ts +1 -1
  185. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  186. package/dist/memory-projection-store.d.ts +1 -1
  187. package/dist/memory-provenance.d.ts +1 -1
  188. package/dist/memory-worth-outcomes.d.ts +2 -2
  189. package/dist/models-json.d.ts +1 -1
  190. package/dist/namespaces/migrate.d.ts +4 -3
  191. package/dist/namespaces/migrate.js +4 -4
  192. package/dist/namespaces/principal.d.ts +1 -1
  193. package/dist/namespaces/search.d.ts +1 -1
  194. package/dist/namespaces/storage.d.ts +3 -3
  195. package/dist/namespaces/storage.js +3 -3
  196. package/dist/native-knowledge.d.ts +1 -1
  197. package/dist/offline-sync-impression-drain.d.ts +1 -1
  198. package/dist/operator-doctor-corpus.d.ts +1 -1
  199. package/dist/operator-doctor-corpus.js +6 -6
  200. package/dist/operator-doctor-replica.d.ts +1 -1
  201. package/dist/operator-toolkit.d.ts +5 -4
  202. package/dist/operator-toolkit.js +12 -11
  203. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  204. package/dist/orchestration/maintenance.d.ts +4 -4
  205. package/dist/orchestration/maintenance.js +8 -8
  206. package/dist/{orchestrator-CEhod0MJ.d.ts → orchestrator-fYTncnLy.d.ts} +7 -7
  207. package/dist/orchestrator.d.ts +8 -8
  208. package/dist/orchestrator.js +35 -34
  209. package/dist/patterns-cli.d.ts +1 -1
  210. package/dist/{pipeline-DSLWFeHz.d.ts → pipeline-Cs76XC-p.d.ts} +1 -1
  211. package/dist/policy-runtime.d.ts +1 -1
  212. package/dist/proactive-contention.d.ts +1 -1
  213. package/dist/provenance.d.ts +1 -1
  214. package/dist/{qmd-BSDGyr0H.d.ts → qmd-WJwvBgiF.d.ts} +1 -1
  215. package/dist/qmd-preflight.d.ts +2 -2
  216. package/dist/qmd-recall-cache.d.ts +1 -1
  217. package/dist/qmd.d.ts +2 -2
  218. package/dist/recall-concurrency-config.d.ts +1 -1
  219. package/dist/recall-disclosure-escalation.d.ts +1 -1
  220. package/dist/recall-explain-renderer.d.ts +1 -1
  221. package/dist/recall-explain-renderer.js +3 -3
  222. package/dist/recall-memory-map.d.ts +1 -1
  223. package/dist/recall-planner-llm.d.ts +1 -1
  224. package/dist/recall-state.d.ts +1 -1
  225. package/dist/recall-tag-filter.d.ts +1 -1
  226. package/dist/recall-timings.d.ts +1 -1
  227. package/dist/recall-xray-cli.d.ts +1 -1
  228. package/dist/recall-xray-cli.js +4 -4
  229. package/dist/recall-xray-renderer.d.ts +1 -1
  230. package/dist/recall-xray-renderer.js +3 -3
  231. package/dist/recall-xray.d.ts +1 -1
  232. package/dist/recall-xray.js +2 -2
  233. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  234. package/dist/replay/normalizers/claude.d.ts +1 -1
  235. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  236. package/dist/replay/normalizers/shared.d.ts +1 -1
  237. package/dist/replay/runner.d.ts +1 -1
  238. package/dist/replay/types.d.ts +1 -1
  239. package/dist/replica-divergence.d.ts +1 -1
  240. package/dist/replica-peers-config.d.ts +1 -1
  241. package/dist/resolve-auth-token.d.ts +1 -1
  242. package/dist/resume-bundles.js +3 -3
  243. package/dist/retrieval-agents.d.ts +2 -2
  244. package/dist/retrieval-tiers.d.ts +1 -1
  245. package/dist/routing/engine.d.ts +1 -1
  246. package/dist/routing/store.d.ts +1 -1
  247. package/dist/salvage-envelope.d.ts +1 -1
  248. package/dist/schemas.d.ts +76 -76
  249. package/dist/{scope-profiles-C4zY-a2K.d.ts → scope-profiles-CQ0NAleS.d.ts} +1 -1
  250. package/dist/search/embed-helper.d.ts +1 -1
  251. package/dist/search/factory.d.ts +1 -1
  252. package/dist/search/index.d.ts +1 -1
  253. package/dist/search/lancedb-backend.d.ts +1 -1
  254. package/dist/search/meilisearch-backend.d.ts +1 -1
  255. package/dist/search/noop-backend.d.ts +1 -1
  256. package/dist/search/orama-backend.d.ts +1 -1
  257. package/dist/search/port.d.ts +1 -1
  258. package/dist/search/remote-backend.d.ts +1 -1
  259. package/dist/{semantic-consolidation-ChKRYpRO.d.ts → semantic-consolidation-BWxOBMtz.d.ts} +1 -1
  260. package/dist/semantic-consolidation.d.ts +2 -2
  261. package/dist/semantic-consolidation.js +4 -4
  262. package/dist/semantic-rule-promotion.js +3 -3
  263. package/dist/semantic-rule-verifier.d.ts +1 -1
  264. package/dist/semantic-rule-verifier.js +3 -3
  265. package/dist/{service-BlOfGid8.d.ts → service-CLuMO-pa.d.ts} +2 -2
  266. package/dist/session-observer-bands.d.ts +1 -1
  267. package/dist/session-observer-state.d.ts +1 -1
  268. package/dist/shared-context/manager.d.ts +9 -9
  269. package/dist/signal.d.ts +1 -1
  270. package/dist/source-agent-qualifier.d.ts +1 -1
  271. package/dist/source-agent-qualifier.js +3 -3
  272. package/dist/{storage-CNKZocJF.d.ts → storage-Blr71GpS.d.ts} +1 -1
  273. package/dist/storage.d.ts +2 -2
  274. package/dist/storage.js +2 -2
  275. package/dist/summarizer.d.ts +1 -1
  276. package/dist/summary-snapshot.d.ts +1 -1
  277. package/dist/temporal-supersession.d.ts +2 -2
  278. package/dist/temporal-timeline-recall.d.ts +1 -1
  279. package/dist/temporal-validity.d.ts +1 -1
  280. package/dist/threading.d.ts +1 -1
  281. package/dist/tier-migration.d.ts +2 -2
  282. package/dist/tier-routing.d.ts +1 -1
  283. package/dist/topics.d.ts +1 -1
  284. package/dist/transcript.d.ts +1 -1
  285. package/dist/transfer/types.d.ts +66 -66
  286. package/dist/trust-score-stage.d.ts +1 -1
  287. package/dist/trust-score.d.ts +1 -1
  288. package/dist/{types-5398p7Zm.d.ts → types-CqWwMPr_.d.ts} +42 -66
  289. package/dist/types.d.ts +1 -1
  290. package/dist/types.js +1 -1
  291. package/dist/utility-runtime.d.ts +1 -1
  292. package/dist/verified-recall.js +3 -3
  293. package/dist/write-envelope.d.ts +1 -1
  294. package/package.json +2 -2
  295. package/src/access-http.test.ts +62 -2
  296. package/src/access-http.ts +2 -1
  297. package/src/access-service-health.test.ts +39 -17
  298. package/src/access-service.ts +25 -3
  299. package/src/access-surface-catalog.test.ts +1 -0
  300. package/src/cli.ts +3 -3
  301. package/src/config.test.ts +4 -0
  302. package/src/config.ts +1 -5
  303. package/src/corpus-watermark.test.ts +16 -0
  304. package/src/corpus-watermark.ts +28 -5
  305. package/src/extraction-liveness.test.ts +81 -19
  306. package/src/extraction-liveness.ts +96 -98
  307. package/src/extraction-watermark.test.ts +290 -0
  308. package/src/namespaces/migrate.ts +10 -2
  309. package/src/operator-doctor-corpus.test.ts +7 -0
  310. package/src/operator-doctor-corpus.ts +1 -1
  311. package/src/operator-toolkit.ts +8 -8
  312. package/src/orchestration/extraction-watermark.ts +188 -0
  313. package/src/types.ts +1 -7
  314. package/dist/chunk-443XCR34.js.map +0 -1
  315. package/dist/chunk-BVJIAIB3.js.map +0 -1
  316. package/dist/chunk-CPD6C6K6.js.map +0 -1
  317. package/dist/chunk-CYM2PHLB.js.map +0 -1
  318. package/dist/chunk-G57BGHQ2.js.map +0 -1
  319. package/dist/chunk-GYGXKATH.js.map +0 -1
  320. package/dist/chunk-HXDWZFNP.js.map +0 -1
  321. package/dist/chunk-IB26HVAJ.js.map +0 -1
  322. package/dist/chunk-KJP2R5MJ.js.map +0 -1
  323. package/dist/chunk-VK33JSBR.js.map +0 -1
  324. /package/dist/{chunk-AVGTOOYP.js.map → chunk-3C2TGBDB.js.map} +0 -0
  325. /package/dist/{chunk-MHCRASVK.js.map → chunk-5N26WBPQ.js.map} +0 -0
  326. /package/dist/{chunk-CMFUYOYB.js.map → chunk-5TOV3D6U.js.map} +0 -0
  327. /package/dist/{chunk-SHTPVI47.js.map → chunk-6GIMMNVK.js.map} +0 -0
  328. /package/dist/{chunk-5JUYBWJD.js.map → chunk-6I2C3EOH.js.map} +0 -0
  329. /package/dist/{chunk-CNZLKQEL.js.map → chunk-AXUU7SG3.js.map} +0 -0
  330. /package/dist/{chunk-7ERHAARG.js.map → chunk-BI6RE2ZS.js.map} +0 -0
  331. /package/dist/{chunk-UGAZILZG.js.map → chunk-F2KMAFEB.js.map} +0 -0
  332. /package/dist/{chunk-DMT2RGAZ.js.map → chunk-FXGLFGIG.js.map} +0 -0
  333. /package/dist/{chunk-6BNE62PM.js.map → chunk-GDC4INBF.js.map} +0 -0
  334. /package/dist/{chunk-DJH35IVS.js.map → chunk-JDXDA5OO.js.map} +0 -0
  335. /package/dist/{chunk-ZBDORYWM.js.map → chunk-KPJQTSRJ.js.map} +0 -0
  336. /package/dist/{chunk-F5EVTFQK.js.map → chunk-MSXWUXFE.js.map} +0 -0
  337. /package/dist/{chunk-XSPD6KQL.js.map → chunk-MVW234LO.js.map} +0 -0
  338. /package/dist/{chunk-5TRIAPT4.js.map → chunk-NHRNYJPJ.js.map} +0 -0
  339. /package/dist/{chunk-VGK33D3K.js.map → chunk-OEXKYYVH.js.map} +0 -0
  340. /package/dist/{chunk-JKTHT4KX.js.map → chunk-PWKZV4A3.js.map} +0 -0
  341. /package/dist/{chunk-AL73FWSS.js.map → chunk-QY66HJ4X.js.map} +0 -0
  342. /package/dist/{chunk-KWU6MAD4.js.map → chunk-R4Q7CQGZ.js.map} +0 -0
  343. /package/dist/{chunk-MYXWPG5O.js.map → chunk-TXBU7YDV.js.map} +0 -0
  344. /package/dist/{chunk-7OCTH7AJ.js.map → chunk-UQVGDEAJ.js.map} +0 -0
  345. /package/dist/{chunk-VQTRSX4R.js.map → chunk-WGCTFGLW.js.map} +0 -0
  346. /package/dist/{chunk-4CSTEPFA.js.map → chunk-XRWVXPEM.js.map} +0 -0
  347. /package/dist/{chunk-ENLZOWYK.js.map → chunk-ZERSIPFC.js.map} +0 -0
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { aS as AccessTrackingEntry, a1 as ActiveRecallChatType, a5 as ActiveRecallModelFallbackPolicy, a3 as ActiveRecallPromptStyle, a2 as ActiveRecallQueryMode, a4 as ActiveRecallThinking, t as AgentAccessAuthToken, ck as AgentAccessHttpConfig, cl as AgentDefaultsConfig, cm as AgentPersona, A as AgentPersonaModelConfig, cn as BehaviorLoopAdjustment, r as BehaviorLoopPolicyState, co as BehaviorSignalDirection, a6 as BehaviorSignalEvent, cp as BehaviorSignalType, bb as BootstrapOptions, bc as BootstrapResult, g as BriefingActiveThread, cq as BriefingCalendarSourceError, bw as BriefingConfig, e as BriefingFocus, d as BriefingFollowup, bx as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, by as BriefingWindow, cr as BufferEntryState, aN as BufferState, a7 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, C as CalendarSource, w as CaptureMode, cs as ChatConfig, m as Checkpoint, ct as CodexCliReasoningEffort, cu as CodexCompactionFlushMode, bB as CodexCompatConfig, cv as CodexConnectorConfig, b8 as CodingContext, cw as CodingGraphLspConfig, bk as CodingKnowledgeConfig, be as CodingModeConfig, cx as CompressionGuidelineActivationState, ad as CompressionGuidelineOptimizerActionSummary, ac as CompressionGuidelineOptimizerEventCounts, ae as CompressionGuidelineOptimizerRuleUpdate, cy as CompressionGuidelineOptimizerSourceWindow, ah as CompressionGuidelineOptimizerState, cz as ConfidenceTier, cA as ConsolidationAction, cB as ConsolidationItem, bd as ConsolidationObservation, K as ConsolidationResult, cC as ContradictionScanConfig, V as ConversationThread, cD as CronConversationRecallMode, cE as CronRecallMode, bC as DEFAULT_RECALL_DISCLOSURE, N as DaySummaryResult, cF as DreamingConfig, cG as DreamingNarrativePromptStyle, cH as DreamsDeepSleepConfig, cI as DreamsLightSleepConfig, D as DreamsPhase, cJ as DreamsPhaseStatus, cK as DreamsPhasesConfig, cL as DreamsRemConfig, a as DreamsRunResult, b9 as DreamsStatusResult, cM as EngramTraceEvent, aR as EntityActivityEntry, E as EntityFile, ai as EntityMention, aQ as EntityRelationship, aj as EntitySchemaDefinition, ak as EntitySchemaSectionDefinition, al as EntityStructuredSection, aL as EntityTimelineEntry, bE as ExtractedFact, cN as ExtractedProcedureStep, cO as ExtractedQuestion, cP as ExtractedReasoningTrace, cQ as ExtractedReasoningTraceStep, cR as ExtractedRelationship, $ as ExtractionFailureClass, cS as ExtractionPassSource, J as ExtractionResult, F as FaithfulnessFrontmatter, aP as FileHygieneConfig, G as GatewayConfig, cT as GitHubLiveConnectorConfig, cU as GmailLiveConnectorConfig, cV as GoogleDriveLiveConnectorConfig, cW as HeartbeatConfig, cX as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, a0 as ImportanceLevel, an as ImportanceScore, W as LifecycleState, L as LiveConnectorsConfig, cY as LlmTraceCallback, cZ as LlmTraceEvent, ap as MemoryActionEligibilityContext, bN as MemoryActionEligibilitySource, ag as MemoryActionEvent, c_ as MemoryActionOutcome, c$ as MemoryActionPolicyDecision, aq as MemoryActionPolicyResult, d0 as MemoryActionStatus, af as MemoryActionType, v as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, ao as MemoryIntent, z as MemoryLifecycleEvent, ar as MemoryLifecycleEventType, as as MemoryLifecycleStateSummary, aM as MemoryLink, d1 as MemoryLinkType, bO as MemoryObservation, d2 as MemoryOsPresetName, y as MemoryProjectionCurrentState, bP as MemoryScope, x as MemoryStatus, aT as MemorySummary, aO as MetaState, d3 as ModelApi, d4 as ModelDefinitionConfig, d5 as ModelProviderAuthMode, at as ModelProviderConfig, d6 as NamespacePolicy, au as NativeKnowledgeConfig, d7 as NativeKnowledgeFolderRuleConfig, d8 as NativeKnowledgeObsidianVaultConfig, d9 as NativeKnowledgeOpenClawWorkspaceConfig, da as NotionLiveConnectorConfig, P as PluginConfig, Y as PolicyClass, db as PrincipalFromSessionKeyMode, dc as PrincipalRule, dd as ProceduralConfig, am as ProvenanceConfig, O as ProvenanceSource, aA as QmdSearchExplain, Q as QmdSearchResult, de as QuestionEntry, bQ as RECALL_DISCLOSURE_LEVELS, df as ReasoningEffort, b as RecallDisclosure, dg as RecallPipelineConfig, R as RecallPlanMode, ba as RecallSectionConfig, c as RecallTierExplain, dh as RecallTraceEvent, di as RelevanceFeedback, ax as RetrievalTier, dj as SPECULATIVE_TTL_DAYS, dk as ScopeProfileAutoPromoteConfig, o as ScopeProfileConfig, p as ScopeProfileLayerId, q as ScopeProfilePromotionTarget, dl as ScopeProfileTeamProjectConfig, dm as ScopeTeamConfig, dn as ScoredEntity, s as SecretRef, dp as SemanticChunkingConfigShape, S as SessionObserverBandConfig, dq as SignalLevel, ay as SignalScanResult, dr as SlotBehaviorConfig, ds as SlotMismatchMode, n as SourceConnectorProvenance, az as TopicScore, T as TranscriptEntry, dt as TriggerMode, U as TrustWeights, X as VerificationState, du as confidenceTier, bY as isRecallDisclosure } from './types-5398p7Zm.js';
1
+ export { aS as AccessTrackingEntry, a1 as ActiveRecallChatType, a5 as ActiveRecallModelFallbackPolicy, a3 as ActiveRecallPromptStyle, a2 as ActiveRecallQueryMode, a4 as ActiveRecallThinking, t as AgentAccessAuthToken, co as AgentAccessHttpConfig, cp as AgentDefaultsConfig, cq as AgentPersona, A as AgentPersonaModelConfig, cr as BehaviorLoopAdjustment, r as BehaviorLoopPolicyState, cs as BehaviorSignalDirection, a6 as BehaviorSignalEvent, ct as BehaviorSignalType, bb as BootstrapOptions, bc as BootstrapResult, g as BriefingActiveThread, cu as BriefingCalendarSourceError, bw as BriefingConfig, e as BriefingFocus, d as BriefingFollowup, bx as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, by as BriefingWindow, cv as BufferEntryState, aO as BufferState, a7 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, C as CalendarSource, w as CaptureMode, cw as ChatConfig, m as Checkpoint, cx as CodexCliReasoningEffort, cy as CodexCompactionFlushMode, bB as CodexCompatConfig, cz as CodexConnectorConfig, b8 as CodingContext, cA as CodingGraphLspConfig, bk as CodingKnowledgeConfig, be as CodingModeConfig, cB as CompressionGuidelineActivationState, ad as CompressionGuidelineOptimizerActionSummary, ac as CompressionGuidelineOptimizerEventCounts, ae as CompressionGuidelineOptimizerRuleUpdate, cC as CompressionGuidelineOptimizerSourceWindow, ah as CompressionGuidelineOptimizerState, cD as ConfidenceTier, cE as ConsolidationAction, cF as ConsolidationItem, bd as ConsolidationObservation, K as ConsolidationResult, cG as ContradictionScanConfig, V as ConversationThread, cH as CronConversationRecallMode, cI as CronRecallMode, bC as DEFAULT_RECALL_DISCLOSURE, N as DaySummaryResult, cJ as DreamingConfig, cK as DreamingNarrativePromptStyle, cL as DreamsDeepSleepConfig, cM as DreamsLightSleepConfig, D as DreamsPhase, cN as DreamsPhaseStatus, cO as DreamsPhasesConfig, cP as DreamsRemConfig, a as DreamsRunResult, b9 as DreamsStatusResult, cQ as EngramTraceEvent, aR as EntityActivityEntry, E as EntityFile, ai as EntityMention, aQ as EntityRelationship, aj as EntitySchemaDefinition, ak as EntitySchemaSectionDefinition, al as EntityStructuredSection, aM as EntityTimelineEntry, bE as ExtractedFact, cR as ExtractedProcedureStep, cS as ExtractedQuestion, cT as ExtractedReasoningTrace, cU as ExtractedReasoningTraceStep, cV as ExtractedRelationship, $ as ExtractionFailureClass, cW as ExtractionPassSource, J as ExtractionResult, F as FaithfulnessFrontmatter, aP as FileHygieneConfig, G as GatewayConfig, cX as GitHubLiveConnectorConfig, cY as GmailLiveConnectorConfig, cZ as GoogleDriveLiveConnectorConfig, c_ as HeartbeatConfig, c$ as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, a0 as ImportanceLevel, an as ImportanceScore, W as LifecycleState, L as LiveConnectorsConfig, d0 as LlmTraceCallback, d1 as LlmTraceEvent, ap as MemoryActionEligibilityContext, bN as MemoryActionEligibilitySource, ag as MemoryActionEvent, d2 as MemoryActionOutcome, d3 as MemoryActionPolicyDecision, aq as MemoryActionPolicyResult, d4 as MemoryActionStatus, af as MemoryActionType, v as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, ao as MemoryIntent, z as MemoryLifecycleEvent, ar as MemoryLifecycleEventType, as as MemoryLifecycleStateSummary, aN as MemoryLink, d5 as MemoryLinkType, bO as MemoryObservation, d6 as MemoryOsPresetName, y as MemoryProjectionCurrentState, bP as MemoryScope, x as MemoryStatus, aT as MemorySummary, aw as MetaState, d7 as ModelApi, d8 as ModelDefinitionConfig, d9 as ModelProviderAuthMode, at as ModelProviderConfig, da as NamespacePolicy, au as NativeKnowledgeConfig, db as NativeKnowledgeFolderRuleConfig, dc as NativeKnowledgeObsidianVaultConfig, dd as NativeKnowledgeOpenClawWorkspaceConfig, de as NotionLiveConnectorConfig, P as PluginConfig, Y as PolicyClass, df as PrincipalFromSessionKeyMode, dg as PrincipalRule, dh as ProceduralConfig, am as ProvenanceConfig, O as ProvenanceSource, aB as QmdSearchExplain, Q as QmdSearchResult, di as QuestionEntry, bQ as RECALL_DISCLOSURE_LEVELS, dj as ReasoningEffort, b as RecallDisclosure, dk as RecallPipelineConfig, R as RecallPlanMode, ba as RecallSectionConfig, c as RecallTierExplain, dl as RecallTraceEvent, dm as RelevanceFeedback, ay as RetrievalTier, dn as SPECULATIVE_TTL_DAYS, dp as ScopeProfileAutoPromoteConfig, o as ScopeProfileConfig, p as ScopeProfileLayerId, q as ScopeProfilePromotionTarget, dq as ScopeProfileTeamProjectConfig, dr as ScopeTeamConfig, ds as ScoredEntity, s as SecretRef, dt as SemanticChunkingConfigShape, S as SessionObserverBandConfig, du as SignalLevel, az as SignalScanResult, dv as SlotBehaviorConfig, dw as SlotMismatchMode, n as SourceConnectorProvenance, aA as TopicScore, T as TranscriptEntry, dx as TriggerMode, U as TrustWeights, X as VerificationState, dy as confidenceTier, bY as isRecallDisclosure } from './types-CqWwMPr_.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  export { ContinuityImprovementLoop, ContinuityIncidentCloseInput, ContinuityIncidentOpenInput, ContinuityIncidentRecord, ContinuityIncidentState, ContinuityLoopCadence, ContinuityLoopReviewInput, ContinuityLoopStatus, ContinuityLoopUpsertInput } from './types-continuity.js';
package/dist/types.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  SPECULATIVE_TTL_DAYS,
5
5
  confidenceTier,
6
6
  isRecallDisclosure
7
- } from "./chunk-HXDWZFNP.js";
7
+ } from "./chunk-GSL47NPM.js";
8
8
  import "./chunk-PZ5AY32C.js";
9
9
  export {
10
10
  DEFAULT_RECALL_DISCLOSURE,
@@ -1,5 +1,5 @@
1
1
  import { TierRoutingPolicy } from './tier-routing.js';
2
- import './types-5398p7Zm.js';
2
+ import './types-CqWwMPr_.js';
3
3
  import './message-parts/index.js';
4
4
  import './bounded-jsonl-state.js';
5
5
  import './operator-doctor-types.js';
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-VGK33D3K.js";
4
+ } from "./chunk-OEXKYYVH.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-ENLZOWYK.js";
6
+ import "./chunk-ZERSIPFC.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-ENTCVTQR.js";
9
9
  import "./chunk-WIPEXG6R.js";
10
10
  import "./chunk-J6A3CX5N.js";
11
- import "./chunk-HXDWZFNP.js";
11
+ import "./chunk-GSL47NPM.js";
12
12
  import "./chunk-4VXGRIH6.js";
13
13
  import "./chunk-EGGE52UU.js";
14
14
  import "./chunk-ZA53AZND.js";
@@ -1,4 +1,4 @@
1
- import { v as MemoryCategory } from './types-5398p7Zm.js';
1
+ import { v as MemoryCategory } from './types-CqWwMPr_.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './operator-doctor-types.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.39.0",
3
+ "version": "9.41.0",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3086,7 +3086,7 @@
3086
3086
  "core"
3087
3087
  ],
3088
3088
  "peerDependencies": {
3089
- "@remnic/coding-graph": "^9.39.0"
3089
+ "@remnic/coding-graph": "^9.41.0"
3090
3090
  },
3091
3091
  "peerDependenciesMeta": {
3092
3092
  "@remnic/coding-graph": {
@@ -61,6 +61,66 @@ test("parseConfig validates agentAccessHttp.port bounds and CLI strings", () =>
61
61
  }
62
62
  });
63
63
 
64
+ test("HTTP liveness is authenticated and does not run detailed health diagnostics", async () => {
65
+ let healthCalls = 0;
66
+ const service = {
67
+ health: async () => {
68
+ healthCalls += 1;
69
+ return new Promise<never>(() => {});
70
+ },
71
+ } as unknown as EngramAccessService;
72
+ const server = new EngramAccessHttpServer({
73
+ service,
74
+ port: 0,
75
+ authToken: "test-token",
76
+ adminConsoleEnabled: false,
77
+ });
78
+
79
+ const status = await server.start();
80
+ try {
81
+ const denied = await fetch(`http://127.0.0.1:${status.port}/engram/v1/live`);
82
+ assert.equal(denied.status, 401);
83
+
84
+ const response = await fetch(`http://127.0.0.1:${status.port}/engram/v1/live`, {
85
+ headers: { authorization: "Bearer test-token" },
86
+ signal: AbortSignal.timeout(500),
87
+ });
88
+ assert.equal(response.status, 200);
89
+ assert.deepEqual(await response.json(), { ok: true, ready: true });
90
+ assert.equal(healthCalls, 0);
91
+ } finally {
92
+ await server.stop();
93
+ }
94
+ });
95
+
96
+ test("HTTP detailed health route still runs service diagnostics", async () => {
97
+ let healthCalls = 0;
98
+ const service = {
99
+ health: async () => {
100
+ healthCalls += 1;
101
+ return { ok: true, diagnostics: "complete" };
102
+ },
103
+ } as unknown as EngramAccessService;
104
+ const server = new EngramAccessHttpServer({
105
+ service,
106
+ port: 0,
107
+ authToken: "test-token",
108
+ adminConsoleEnabled: false,
109
+ });
110
+
111
+ const status = await server.start();
112
+ try {
113
+ const response = await fetch(`http://127.0.0.1:${status.port}/engram/v1/health`, {
114
+ headers: { authorization: "Bearer test-token" },
115
+ });
116
+ assert.equal(response.status, 200);
117
+ assert.deepEqual(await response.json(), { ok: true, diagnostics: "complete" });
118
+ assert.equal(healthCalls, 1);
119
+ } finally {
120
+ await server.stop();
121
+ }
122
+ });
123
+
64
124
  test("HTTP memory browse rejects malformed pagination and sort query values", async () => {
65
125
  const calls: unknown[] = [];
66
126
  const service = {
@@ -1933,7 +1993,7 @@ test("HTTP externalRequestHandler runs pre-auth, can end responses, and falls th
1933
1993
  oldestBufferedTurnAgeMs: null,
1934
1994
  degraded: false,
1935
1995
  degradedReason: null,
1936
- watermarkScope: "root-store",
1996
+ watermarkScope: "aggregate",
1937
1997
  },
1938
1998
  corpus: [],
1939
1999
  corpusComplete: true,
@@ -2060,7 +2120,7 @@ test("HTTP authTokenEntriesGetter is authoritative: scope policy binds connector
2060
2120
  oldestBufferedTurnAgeMs: null,
2061
2121
  degraded: false,
2062
2122
  degradedReason: null,
2063
- watermarkScope: "root-store",
2123
+ watermarkScope: "aggregate",
2064
2124
  },
2065
2125
  corpus: [],
2066
2126
  corpusComplete: true,
@@ -806,7 +806,7 @@ export class EngramAccessHttpServer {
806
806
  return;
807
807
  }
808
808
 
809
- if (req.method === "GET" && pathname === "/engram/v1/health") {
809
+ if (req.method === "GET" && (pathname === "/engram/v1/live" || pathname === "/engram/v1/health")) {
810
810
  const { ready, warmupAttempts, lastError } = this.readiness();
811
811
  if (!ready) {
812
812
  this.respondJson(res, 503, {
@@ -888,6 +888,7 @@ export class EngramAccessHttpServer {
888
888
  return;
889
889
  }
890
890
 
891
+ if (req.method === "GET" && pathname === "/engram/v1/live") return this.respondJson(res, 200, { ok: true, ready: true });
891
892
  if (req.method === "GET" && pathname === "/engram/v1/health") {
892
893
  const { degraded, warmupAttempts, lastError } = this.readiness();
893
894
  const health = await this.service.health();
@@ -1,11 +1,12 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdtemp, rm } from "node:fs/promises";
2
+ import { mkdir, mkdtemp, rm } from "node:fs/promises";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
  import test from "node:test";
6
6
 
7
7
  import { EngramAccessService } from "./access-service.js";
8
8
  import { parseConfig } from "./config.js";
9
+ import { TOKEN_CAPABILITIES_VERSION, tokenCapabilityStore } from "./access-token-capabilities.js";
9
10
  import { namespaceCollectionName } from "./namespaces/search.js";
10
11
  import type { Orchestrator } from "./orchestrator.js";
11
12
  import type { SearchBackend } from "./search/port.js";
@@ -548,16 +549,27 @@ test("health reports extraction liveness ok when the buffer is empty (nothing to
548
549
  assert.equal(health.extraction.degraded, false);
549
550
  assert.equal(health.extraction.bufferedSessionCount, 0);
550
551
  assert.equal(health.extraction.lastExtractionAt, oldTs);
552
+ const scopedHealth = await tokenCapabilityStore.run(
553
+ { version: TOKEN_CAPABILITIES_VERSION, namespaces: ["default"] },
554
+ () => service.health(),
555
+ );
556
+ assert.equal(scopedHealth.extraction.degraded, health.extraction.degraded);
557
+ assert.equal(scopedHealth.extraction.lastExtractionAt, null);
551
558
  } finally {
552
559
  await rm(memoryDir, { recursive: true, force: true });
553
560
  }
554
561
  });
555
562
 
556
- test("health returns the same daemon-global extraction verdict for every namespace (issue #2151)", async () => {
563
+ test("health returns one daemon-global aggregate extraction verdict for every namespace", async () => {
557
564
  const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-health-liveness-ns-"));
558
565
  try {
559
- const rootTs = new Date().toISOString(); // fresh daemon-global watermark
560
- const staleTs = new Date(Date.now() - 7_200_000).toISOString(); // 2h old
566
+ const namespaceDirs: Record<string, string> = {
567
+ fresh: path.join(memoryDir, "namespaces", "fresh"),
568
+ stale: path.join(memoryDir, "namespaces", "stale"),
569
+ };
570
+ await Promise.all(Object.values(namespaceDirs).map((dir) => mkdir(dir, { recursive: true })));
571
+ const freshTs = new Date().toISOString();
572
+ const staleTs = new Date(Date.now() - 7_200_000).toISOString();
561
573
  const config = parseConfig({
562
574
  memoryDir,
563
575
  qmdEnabled: false,
@@ -565,20 +577,25 @@ test("health returns the same daemon-global extraction verdict for every namespa
565
577
  defaultNamespace: "default",
566
578
  extractionLiveness: { staleWindowMs: 3_600_000 },
567
579
  });
568
- // Per-namespace stores return DIVERGING watermarks (fresh vs 2h stale vs
569
- // never), but the global buffer is shared and the watermark must be sourced
570
- // from the root store. Pre-fix, the extraction verdict tracked the
571
- // namespace argument; post-fix it is identical for every namespace.
572
- const perNamespaceMeta: Record<string, string | null> = { fresh: rootTs, stale: staleTs };
580
+ const perNamespaceMeta: Record<string, string | null> = {
581
+ default: staleTs,
582
+ fresh: freshTs,
583
+ stale: staleTs,
584
+ };
573
585
  const service = new EngramAccessService({
574
586
  config,
575
587
  qmd: makeQmd({}),
576
588
  buffer: {
577
- getBufferSnapshot: async () => ({ bufferedSessionCount: 3, pendingTurnCount: 12, oldestTurnTimestamp: staleTs }),
589
+ getBufferSnapshot: async () => ({
590
+ bufferedSessionCount: 3,
591
+ pendingTurnCount: 12,
592
+ oldestTurnTimestamp: staleTs,
593
+ }),
578
594
  },
579
595
  storage: {
596
+ dir: memoryDir,
580
597
  loadMeta: async () => ({
581
- lastExtractionAt: rootTs,
598
+ lastExtractionAt: staleTs,
582
599
  extractionCount: 4,
583
600
  lastConsolidationAt: null,
584
601
  totalMemories: 0,
@@ -586,10 +603,11 @@ test("health returns the same daemon-global extraction verdict for every namespa
586
603
  }),
587
604
  },
588
605
  async getStorage(namespace?: string) {
606
+ const resolved = namespace ?? "default";
589
607
  return {
590
- dir: memoryDir,
608
+ dir: namespaceDirs[resolved] ?? memoryDir,
591
609
  loadMeta: async () => ({
592
- lastExtractionAt: namespace ? perNamespaceMeta[namespace] ?? null : staleTs,
610
+ lastExtractionAt: perNamespaceMeta[resolved] ?? null,
593
611
  extractionCount: 4,
594
612
  lastConsolidationAt: null,
595
613
  totalMemories: 0,
@@ -599,19 +617,23 @@ test("health returns the same daemon-global extraction verdict for every namespa
599
617
  },
600
618
  } as unknown as Orchestrator);
601
619
 
620
+ await service.health();
621
+ const serviceWithCache = service as unknown as {
622
+ corpusWatermarkCache: { whenIdle(): Promise<void> };
623
+ };
624
+ await serviceWithCache.corpusWatermarkCache.whenIdle();
625
+
602
626
  const fresh = (await service.health("fresh")).extraction;
603
627
  const stale = (await service.health("stale")).extraction;
604
628
  const def = (await service.health()).extraction;
605
- // The namespace-governed fields must not vary with the namespace argument
606
- // (oldestBufferedTurnAgeMs is time-derived and intentionally excluded).
607
629
  assert.equal(stale.degraded, fresh.degraded, "degraded must not vary by namespace");
608
630
  assert.equal(def.degraded, fresh.degraded, "default health matches namespaced health");
609
631
  assert.equal(stale.lastExtractionAt, fresh.lastExtractionAt, "watermark must not vary by namespace");
610
632
  assert.equal(def.lastExtractionAt, fresh.lastExtractionAt);
611
633
  assert.equal(stale.degradedReason, fresh.degradedReason);
612
- // Sourced from the fresh root watermark → healthy despite stale per-namespace stores.
613
634
  assert.equal(fresh.degraded, false);
614
- assert.equal(fresh.lastExtractionAt, rootTs);
635
+ assert.equal(fresh.lastExtractionAt, freshTs);
636
+ assert.equal(fresh.watermarkScope, "aggregate");
615
637
  } finally {
616
638
  await rm(memoryDir, { recursive: true, force: true });
617
639
  }
@@ -7,6 +7,7 @@ import { createHash } from "node:crypto";
7
7
  import { ZodError } from "zod";
8
8
  import { AccessIdempotencyStore, hashAccessIdempotencyPayload } from "./access-idempotency.js";
9
9
  import { computeExtractionLivenessStatus, ExtractionLivenessWarnThrottle } from "./extraction-liveness.js";
10
+ import { readAggregateExtractionWatermark } from "./orchestration/extraction-watermark.js";
10
11
  import { enforceNamespaceAllowList, tokenCapabilityStore } from "./access-token-capabilities.js";
11
12
  import {
12
13
  recordCitationUsage as recordCitationUsageForAccess,
@@ -2369,10 +2370,31 @@ export class EngramAccessService {
2369
2370
  const storage = await this.orchestrator.getStorage(resolvedNamespace);
2370
2371
  const searchBackend = this.orchestrator.config.searchBackend ?? "qmd";
2371
2372
  const qmdEnabled = resolveQmdCapabilities(this.orchestrator.config).qmd === true;
2372
- const extraction = await computeExtractionLivenessStatus(this.orchestrator, this.extractionLivenessWarn);
2373
+ const caps = tokenCapabilityStore.getStore();
2374
+ const extractionWatermark = await readAggregateExtractionWatermark({
2375
+ config: this.orchestrator.config,
2376
+ rootStorage: this.orchestrator.storage,
2377
+ storageForNamespace: (candidate) => this.orchestrator.getStorage(candidate),
2378
+ rootsCache: this.corpusWatermarkCache,
2379
+ });
2380
+ const extraction = await computeExtractionLivenessStatus(
2381
+ this.orchestrator,
2382
+ extractionWatermark,
2383
+ caps?.namespaces !== undefined ? undefined : this.extractionLivenessWarn,
2384
+ );
2385
+ const visibleExtraction =
2386
+ caps?.namespaces !== undefined
2387
+ ? {
2388
+ ...extraction,
2389
+ lastExtractionAt: null,
2390
+ bufferedSessionCount: 0,
2391
+ pendingTurnCount: 0,
2392
+ oldestBufferedTurnAgeMs: null,
2393
+ degradedReason: extraction.degraded ? "daemon extraction pipeline degraded" : null,
2394
+ }
2395
+ : extraction;
2373
2396
  // ONE call: the corpus array and the flag describing it must not come from
2374
2397
  // two independently-cached scans (round 8, codex P1).
2375
- const caps = tokenCapabilityStore.getStore();
2376
2398
  const corpusCensus = await computeServiceCorpusCensus(this.orchestrator, {
2377
2399
  cache: this.corpusWatermarkCache, caps });
2378
2400
  let projectionAvailable = false;
@@ -2398,7 +2420,7 @@ export class EngramAccessService {
2398
2420
  ),
2399
2421
  nativeKnowledgeEnabled: this.orchestrator.config.nativeKnowledge?.enabled === true,
2400
2422
  projectionAvailable,
2401
- extraction,
2423
+ extraction: visibleExtraction,
2402
2424
  corpus: corpusCensus.watermarks,
2403
2425
  // Describes THIS response's array (round 8): a separate scan could report
2404
2426
  // complete while the shipped corpus was partial, and peers trust it.
@@ -566,6 +566,7 @@ test("HTTP handler source routes match the catalog (static completeness)", () =>
566
566
 
567
567
  const INFRA = [
568
568
  /^\/engram\/v1\/health$/,
569
+ /^\/engram\/v1\/live$/,
569
570
  /^\/engram\/v1\/capabilities$/,
570
571
  /^\/engram\/v1\/authorization$/,
571
572
  /^\/engram\/v1\/admin\//,
package/src/cli.ts CHANGED
@@ -31,6 +31,7 @@ import { chunkContent } from "./chunking.js";
31
31
  import { rescoreMemoryImportance } from "./importance.js";
32
32
  import { renderQmdBacklogStatus } from "./qmd-status.js";
33
33
  import { renderExtractionLivenessStats } from "./extraction-liveness.js";
34
+ import { readAggregateExtractionWatermark } from "./orchestration/extraction-watermark.js";
34
35
  import { exportJsonBundle } from "./transfer/export-json.js";
35
36
  import { exportMarkdownBundle } from "./transfer/export-md.js";
36
37
  import { backupMemoryDir } from "./transfer/backup.js";
@@ -3653,9 +3654,7 @@ export function registerCli(
3653
3654
  .command("stats")
3654
3655
  .description("Show memory system statistics")
3655
3656
  .action(async () => {
3656
- // Ensure QMD is probed before checking availability
3657
3657
  await orchestrator.qmd.probe();
3658
-
3659
3658
  const memories = await orchestrator.storage.readAllMemories();
3660
3659
  const entities = await orchestrator.storage.readEntities();
3661
3660
  const profile = await orchestrator.storage.readProfile();
@@ -3664,7 +3663,8 @@ export function registerCli(
3664
3663
  console.log(`Total memories: ${memories.length}`);
3665
3664
  console.log(`Total entities: ${entities.length}`);
3666
3665
  console.log(`Profile size: ${profile.length} chars`);
3667
- for (const line of await renderExtractionLivenessStats(orchestrator)) console.log(line);
3666
+ const extractionWatermark = await readAggregateExtractionWatermark({ config: orchestrator.config, rootStorage: orchestrator.storage, storageForNamespace: (ns) => orchestrator.getStorage(ns) });
3667
+ for (const line of await renderExtractionLivenessStats(orchestrator, extractionWatermark)) console.log(line);
3668
3668
  console.log(`QMD: ${orchestrator.qmd.isAvailable() ? "available" : "not available"}`);
3669
3669
  for (const line of await renderQmdBacklogStatus(orchestrator.qmd, orchestrator.config.qmdEmbeddingBacklogThreshold)) console.log(line);
3670
3670
 
@@ -2412,3 +2412,7 @@ test("parseConfig forwards bridgeMode as a raw passthrough (validation is in res
2412
2412
  // silently defaulting to embedded.
2413
2413
  assert.equal(parseConfig({ bridgeMode: true }).bridgeMode, "true");
2414
2414
  });
2415
+
2416
+ test("parseConfig leaves the OpenClaw delegate timeout to the plugin parser", () => {
2417
+ assert.equal("bridgeHealthTimeoutMs" in parseConfig({ bridgeHealthTimeoutMs: 7_500 }), false);
2418
+ });
package/src/config.ts CHANGED
@@ -2318,11 +2318,7 @@ export function parseConfig(
2318
2318
  ? "resolved-only"
2319
2319
  : "default-remote",
2320
2320
  activeRecallPersistTranscripts: cfg.activeRecallPersistTranscripts === true,
2321
- activeRecallTranscriptDir:
2322
- typeof cfg.activeRecallTranscriptDir === "string" &&
2323
- cfg.activeRecallTranscriptDir.trim().length > 0
2324
- ? cfg.activeRecallTranscriptDir.trim()
2325
- : "active-recall",
2321
+ activeRecallTranscriptDir: parseOptionalNonEmptyString(cfg.activeRecallTranscriptDir) ?? "active-recall",
2326
2322
  activeRecallEntityGraphDepth:
2327
2323
  typeof cfg.activeRecallEntityGraphDepth === "number"
2328
2324
  ? Math.min(3, Math.max(0, Math.floor(cfg.activeRecallEntityGraphDepth)))
@@ -780,6 +780,22 @@ test("finding round-7: namespace enumeration is cached (resolved once per TTL, s
780
780
  assert.equal(resolveCalls, 2, "re-enumerated once the TTL elapsed");
781
781
  });
782
782
 
783
+ test("computeServiceCorpusCensus returns incomplete when roots refresh error is set in cache", async () => {
784
+ const cache = new CorpusWatermarkCache();
785
+ const host = {
786
+ config: parseConfig({ namespacesEnabled: true }),
787
+ getStorage: async () => ({ readAllMemories: async () => [] } as unknown as StorageManager),
788
+ };
789
+ const failingResolve = async (): Promise<CorpusNamespaceRoot[]> => {
790
+ throw new Error("disk unreadable");
791
+ };
792
+ cache.getResolvedRootsStatus(failingResolve);
793
+ await cache.whenIdle();
794
+ const census = await computeServiceCorpusCensus(host, { cache });
795
+ assert.equal(census.complete, false);
796
+ assert.deepEqual(census.watermarks, []);
797
+ });
798
+
783
799
  test("finding round-9: background refresh scans are bounded to maxConcurrentRefreshes", async () => {
784
800
  const cache = new CorpusWatermarkCache({ maxConcurrentRefreshes: 2 });
785
801
  let active = 0;
@@ -312,9 +312,13 @@ export interface CorpusNamespaceRoot {
312
312
  */
313
313
  export async function resolveCorpusNamespaceRoots(options: {
314
314
  config: PluginConfig;
315
+ propagateDiscoveryErrors?: boolean;
315
316
  }): Promise<CorpusNamespaceRoot[]> {
316
317
  const { config } = options;
317
- const configDriven = await listNamespaces({ config });
318
+ const configDriven = await listNamespaces({
319
+ config,
320
+ propagateDiscoveryErrors: options.propagateDiscoveryErrors,
321
+ });
318
322
  // Default namespace first so it wins the representative label when several
319
323
  // configured names collapse onto one root (namespaces disabled → memoryDir).
320
324
  const ordered = [
@@ -376,6 +380,7 @@ export class CorpusWatermarkCache {
376
380
  private readonly clock: () => number;
377
381
  private rootsEntry: { value: CorpusNamespaceRoot[]; expiresAt: number } | undefined;
378
382
  private rootsInFlight: Promise<void> | undefined;
383
+ private rootsRefreshError: unknown;
379
384
  private readonly queued = new Map<string, () => void>();
380
385
  private activeRefreshes = 0;
381
386
  private readonly maxConcurrentRefreshes: number;
@@ -444,9 +449,12 @@ export class CorpusWatermarkCache {
444
449
  this.rootsInFlight = compute()
445
450
  .then((value) => {
446
451
  this.rootsEntry = { value, expiresAt: this.clock() + this.ttlMs };
452
+ this.rootsRefreshError = undefined;
447
453
  })
448
- .catch(() => {
449
- // Enumeration failed: keep serving any stale roots; retry next probe.
454
+ .catch((error: unknown) => {
455
+ this.rootsRefreshError = error;
456
+ // Keep serving any stale roots; callers that require completeness
457
+ // inspect the refresh status before trusting them.
450
458
  })
451
459
  .finally(() => {
452
460
  this.rootsInFlight = undefined;
@@ -454,6 +462,14 @@ export class CorpusWatermarkCache {
454
462
  }
455
463
  return this.rootsEntry?.value;
456
464
  }
465
+
466
+ getResolvedRootsStatus(compute: () => Promise<CorpusNamespaceRoot[]>): {
467
+ roots: CorpusNamespaceRoot[] | undefined;
468
+ refreshError: unknown;
469
+ } {
470
+ const roots = this.getResolvedRoots(compute);
471
+ return { roots, refreshError: this.rootsRefreshError };
472
+ }
457
473
  /** Await every background refresh — in-flight AND queued (issue #2156 round-9) —
458
474
  * plus any roots refresh (shutdown / deterministic tests). */
459
475
  async whenIdle(): Promise<void> {
@@ -518,10 +534,17 @@ export async function computeServiceCorpusCensus(
518
534
  ): Promise<{ watermarks: CorpusWatermark[]; complete: boolean }> {
519
535
  let roots: CorpusNamespaceRoot[] | undefined;
520
536
  if (options.cache) {
521
- roots = options.cache.getResolvedRoots(() => resolveCorpusNamespaceRoots({ config: host.config }));
537
+ const { roots: cachedRoots, refreshError } = options.cache.getResolvedRootsStatus(() =>
538
+ resolveCorpusNamespaceRoots({ config: host.config, propagateDiscoveryErrors: true }),
539
+ );
540
+ if (refreshError !== undefined) return { watermarks: [], complete: false };
541
+ roots = cachedRoots;
522
542
  } else {
523
543
  try {
524
- roots = await resolveCorpusNamespaceRoots({ config: host.config });
544
+ roots = await resolveCorpusNamespaceRoots({
545
+ config: host.config,
546
+ propagateDiscoveryErrors: true,
547
+ });
525
548
  } catch {
526
549
  return { watermarks: [], complete: false }; // never enumerated — not an empty corpus
527
550
  }