@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
@@ -8,6 +8,32 @@ import {
8
8
 
9
9
  // src/extraction-liveness.ts
10
10
  var DEFAULT_STALE_WINDOW_MS = 864e5;
11
+ async function coerceExtractionWatermark(watermark) {
12
+ if (watermark && "readFailed" in watermark && typeof watermark.readFailed === "boolean") {
13
+ return watermark;
14
+ }
15
+ try {
16
+ let lastExtractionAt = null;
17
+ if ("loadMeta" in watermark && typeof watermark.loadMeta === "function") {
18
+ const meta = await watermark.loadMeta();
19
+ lastExtractionAt = meta?.lastExtractionAt ?? null;
20
+ } else if ("readMetadata" in watermark && typeof watermark.readMetadata === "function") {
21
+ const meta = await watermark.readMetadata();
22
+ lastExtractionAt = meta?.lastExtractionAt ?? null;
23
+ }
24
+ return {
25
+ lastExtractionAt,
26
+ readFailed: true,
27
+ readError: "aggregate watermark unavailable from legacy root-store-only storage argument"
28
+ };
29
+ } catch (error) {
30
+ return {
31
+ lastExtractionAt: null,
32
+ readFailed: true,
33
+ readError: error instanceof Error ? error.message : String(error)
34
+ };
35
+ }
36
+ }
11
37
  function parseExtractionLivenessConfig(cfg) {
12
38
  const raw = cfg.extractionLiveness;
13
39
  if (raw !== void 0 && (raw === null || typeof raw !== "object" || Array.isArray(raw))) {
@@ -52,8 +78,9 @@ function evaluateExtractionLiveness(input) {
52
78
  const stale = !hasWatermark || ageMs < 0 || ageMs >= config.staleWindowMs;
53
79
  const hasBacklog = snapshot.bufferedSessionCount > 0;
54
80
  const metaReadFailed = input.metaReadFailed === true;
81
+ const watermarkPending = input.watermarkPending === true;
55
82
  const readFailed = snapshot.readFailed === true;
56
- const degraded = config.enabled && (metaReadFailed || readFailed || hasBacklog && stale);
83
+ const degraded = config.enabled && (metaReadFailed || readFailed || !watermarkPending && hasBacklog && stale);
57
84
  let degradedReason = null;
58
85
  if (degraded) {
59
86
  if (metaReadFailed) {
@@ -72,7 +99,8 @@ function evaluateExtractionLiveness(input) {
72
99
  oldestBufferedTurnAgeMs: ageMsFrom(snapshot.oldestTurnTimestamp, nowMs),
73
100
  degraded,
74
101
  degradedReason,
75
- watermarkScope: input.watermarkScope ?? "root-store"
102
+ ...watermarkPending ? { watermarkPending: true } : {},
103
+ watermarkScope: "aggregate"
76
104
  };
77
105
  }
78
106
  var EMPTY_SNAPSHOT = {
@@ -93,27 +121,17 @@ async function readBufferSnapshot(buffer) {
93
121
  }
94
122
  }
95
123
  async function gatherExtractionLivenessStatus(input) {
96
- const { config, storage, buffer, nowMs } = input;
97
- let lastExtractionAt = null;
98
- let metaReadFailed = false;
99
- let metaReadError;
100
- try {
101
- lastExtractionAt = (await storage.loadMeta()).lastExtractionAt ?? null;
102
- } catch (err) {
103
- metaReadFailed = true;
104
- metaReadError = err instanceof Error ? err.message : String(err);
105
- }
124
+ const { config, buffer, nowMs } = input;
125
+ const watermarkRead = await coerceExtractionWatermark(input.watermark);
106
126
  const snapshot = await readBufferSnapshot(buffer);
107
127
  return evaluateExtractionLiveness({
108
128
  config,
109
- lastExtractionAt,
129
+ lastExtractionAt: watermarkRead.lastExtractionAt,
110
130
  snapshot,
111
131
  nowMs,
112
- metaReadFailed,
113
- metaReadError,
114
- // Today the watermark comes from the root store only; #2159 flips this to
115
- // "aggregate" when the resolver reads across every namespace store.
116
- watermarkScope: "root-store"
132
+ metaReadFailed: watermarkRead.readFailed,
133
+ metaReadError: watermarkRead.readError,
134
+ watermarkPending: watermarkRead.pending
117
135
  });
118
136
  }
119
137
  var ExtractionLivenessWarnThrottle = class {
@@ -139,26 +157,26 @@ function resolveExtractionLivenessConfig(block) {
139
157
  staleWindowMs: staleWindowMs !== void 0 && Number.isInteger(staleWindowMs) && staleWindowMs >= 1 ? staleWindowMs : DEFAULT_STALE_WINDOW_MS
140
158
  };
141
159
  }
142
- async function computeExtractionLivenessStatus(orchestrator, throttle, nowMs = Date.now()) {
160
+ async function computeExtractionLivenessStatus(orchestrator, watermark, throttle, nowMs = Date.now()) {
143
161
  const config = resolveExtractionLivenessConfig(orchestrator.config.extractionLiveness);
144
162
  const status = await gatherExtractionLivenessStatus({
145
163
  config,
146
- storage: orchestrator.storage,
164
+ watermark,
147
165
  buffer: orchestrator.buffer,
148
166
  nowMs
149
167
  });
150
168
  throttle?.maybeWarn(status, config.staleWindowMs, nowMs);
151
169
  return status;
152
170
  }
153
- async function summarizeExtractionLiveness(config, storage, buffer, nowMs = Date.now()) {
171
+ async function summarizeExtractionLiveness(config, watermark, buffer, nowMs = Date.now()) {
154
172
  const livenessConfig = resolveExtractionLivenessConfig(config.extractionLiveness);
155
173
  const status = await gatherExtractionLivenessStatus({
156
174
  config: livenessConfig,
157
- storage,
175
+ watermark,
158
176
  buffer,
159
177
  nowMs
160
178
  });
161
- const scopeNote = ` Watermark scope: ${status.watermarkScope}` + (status.watermarkScope === "root-store" ? " (default-namespace only; multi-namespace aggregation tracked in #2159)." : ".");
179
+ const scopeNote = ` Watermark scope: ${status.watermarkScope}.`;
162
180
  const summary = (status.degraded ? `Extraction pipeline degraded: ${status.degradedReason}.` : `Extraction pipeline healthy: last extraction ${status.lastExtractionAt ?? "never"}, ${status.bufferedSessionCount} buffered session(s), ${status.pendingTurnCount} turn(s) pending${livenessConfig.enabled ? "" : " (liveness check disabled)"}.`) + scopeNote;
163
181
  return {
164
182
  key: "extraction_liveness",
@@ -168,30 +186,23 @@ async function summarizeExtractionLiveness(config, storage, buffer, nowMs = Date
168
186
  details: { ...status, staleWindowMs: livenessConfig.staleWindowMs, enabled: livenessConfig.enabled }
169
187
  };
170
188
  }
171
- async function renderExtractionLivenessStats(orchestrator, nowMs = Date.now()) {
172
- let meta = null;
173
- let metaReadFailed = false;
174
- let metaReadError;
175
- try {
176
- meta = await orchestrator.storage.loadMeta();
177
- } catch (err) {
178
- metaReadFailed = true;
179
- metaReadError = err instanceof Error ? err.message : String(err);
180
- }
189
+ async function renderExtractionLivenessStats(orchestrator, watermark, nowMs = Date.now()) {
181
190
  const status = evaluateExtractionLiveness({
182
191
  config: resolveExtractionLivenessConfig(orchestrator.config.extractionLiveness),
183
- lastExtractionAt: meta?.lastExtractionAt ?? null,
192
+ lastExtractionAt: watermark.lastExtractionAt,
184
193
  snapshot: await readBufferSnapshot(orchestrator.buffer),
185
194
  nowMs,
186
- metaReadFailed,
187
- metaReadError
195
+ metaReadFailed: watermark.readFailed,
196
+ metaReadError: watermark.readError,
197
+ watermarkPending: watermark.pending
188
198
  });
189
199
  const oldestAge = status.oldestBufferedTurnAgeMs !== null ? formatAgeMs(status.oldestBufferedTurnAgeMs) : "n/a";
190
- const unavailable = metaReadFailed ? "unavailable" : "never";
200
+ const rootStats = watermark.rootStats;
201
+ const watermarkDisplay = watermark.readFailed ? "unavailable" : watermark.pending ? "pending" : status.lastExtractionAt ?? "never";
191
202
  return [
192
- `Extractions: ${meta?.extractionCount ?? unavailable}`,
193
- `Last extraction: ${meta?.lastExtractionAt ?? unavailable}`,
194
- `Last consolidation: ${meta?.lastConsolidationAt ?? unavailable}`,
203
+ `Extractions: ${rootStats?.extractionCount ?? "unavailable"}`,
204
+ `Last extraction: ${watermarkDisplay}`,
205
+ `Last consolidation: ${rootStats ? rootStats.lastConsolidationAt ?? "never" : "unavailable"}`,
195
206
  `Buffered sessions: ${status.bufferedSessionCount} (${status.pendingTurnCount} turns pending)`,
196
207
  `Oldest buffered turn age: ${oldestAge}`,
197
208
  `Extraction watermark scope: ${status.watermarkScope}`,
@@ -200,6 +211,7 @@ async function renderExtractionLivenessStats(orchestrator, nowMs = Date.now()) {
200
211
  }
201
212
 
202
213
  export {
214
+ coerceExtractionWatermark,
203
215
  parseExtractionLivenessConfig,
204
216
  formatAgeMs,
205
217
  evaluateExtractionLiveness,
@@ -210,4 +222,4 @@ export {
210
222
  summarizeExtractionLiveness,
211
223
  renderExtractionLivenessStats
212
224
  };
213
- //# sourceMappingURL=chunk-443XCR34.js.map
225
+ //# sourceMappingURL=chunk-3SG4FGDV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extraction-liveness.ts"],"sourcesContent":["/**\n * Extraction-pipeline liveness (issue #2151).\n *\n * A daemon's implicit extraction can fail continuously for months while\n * `/health` stays green and recall keeps serving: every individual failure is\n * logged (timeouts, fallback-no-parsed-output), but nothing aggregates them\n * into a checkable status. This module surfaces a liveness *watermark* — the\n * last successful extraction plus the current buffer backlog — and decides when\n * that watermark is stale enough to call the pipeline degraded.\n *\n * The §22 error-vs-empty principle applies at the pipeline level: \"no\n * extraction succeeded for 90 days\" (a non-empty buffer with a stale/absent\n * watermark) must be distinguishable from \"nothing to extract\" (an empty\n * buffer). Degradation therefore requires a NON-EMPTY buffer — an idle daemon\n * with nothing buffered is healthy, not degraded.\n *\n * The core decision (`evaluateExtractionLiveness`) is a pure function shared by\n * every surface (authenticated `/health`, `remnic doctor`, `remnic stats`) so\n * the verdict never diverges across code paths.\n */\nimport { coerceBool, coerceNumber } from \"./connectors/coerce.js\";\nimport { log } from \"./logger.js\";\nimport type { OperatorDoctorCheck } from \"./operator-doctor-types.js\";\nimport type { PluginConfig } from \"./types.js\";\n\n/** Default staleness window: 24h. A watermark older than this with a non-empty buffer is degraded. */\nconst DEFAULT_STALE_WINDOW_MS = 86_400_000;\n\nexport interface ExtractionLivenessConfig {\n /** Master gate. When false, liveness is never reported degraded. Default true. */\n enabled: boolean;\n /**\n * How stale the last-successful-extraction watermark may get (ms) before a\n * non-empty buffer flags the pipeline degraded. Default 24h.\n */\n staleWindowMs: number;\n}\n\n/**\n * A read-only snapshot of buffered, not-yet-extracted work. Structurally\n * satisfied by `SmartBuffer.getBufferSnapshot()` so callers can pass the live\n * buffer without this module depending on the buffer implementation.\n */\nexport interface ExtractionBufferSnapshot {\n bufferedSessionCount: number;\n pendingTurnCount: number;\n oldestTurnTimestamp: string | null;\n /**\n * Set by the liveness reader (never by `SmartBuffer`) when the buffer exists\n * but its snapshot read threw. An unreadable buffer is a pipeline fault, not\n * an empty queue (§22): it degrades the pipeline with a distinct reason\n * instead of masquerading as a zero-backlog (healthy) snapshot.\n */\n readFailed?: boolean;\n /** Read-failure detail, surfaced in the degraded reason when `readFailed`. */\n readError?: string;\n}\n\nexport interface ExtractionBufferSource {\n getBufferSnapshot(): Promise<ExtractionBufferSnapshot>;\n}\n\nexport interface ExtractionRootStats {\n extractionCount?: number;\n lastConsolidationAt?: string | null;\n}\n\nexport interface ExtractionWatermarkRead {\n lastExtractionAt: string | null;\n readFailed: boolean;\n readError?: string;\n pending?: boolean;\n rootStats?: ExtractionRootStats;\n}\n\nexport type ExtractionWatermarkOrStorage =\n | ExtractionWatermarkRead\n | { readMetadata(): Promise<{ lastExtractionAt?: string | null } | null> }\n | { loadMeta(): Promise<{ lastExtractionAt?: string | null }> };\n\nexport async function coerceExtractionWatermark(\n watermark: ExtractionWatermarkOrStorage,\n): Promise<ExtractionWatermarkRead> {\n if (watermark && \"readFailed\" in watermark && typeof watermark.readFailed === \"boolean\") {\n return watermark as ExtractionWatermarkRead;\n }\n try {\n let lastExtractionAt: string | null = null;\n if (\"loadMeta\" in watermark && typeof watermark.loadMeta === \"function\") {\n const meta = await watermark.loadMeta();\n lastExtractionAt = meta?.lastExtractionAt ?? null;\n } else if (\"readMetadata\" in watermark && typeof watermark.readMetadata === \"function\") {\n const meta = await watermark.readMetadata();\n lastExtractionAt = meta?.lastExtractionAt ?? null;\n }\n return {\n lastExtractionAt,\n readFailed: true,\n readError: \"aggregate watermark unavailable from legacy root-store-only storage argument\",\n };\n } catch (error) {\n return {\n lastExtractionAt: null,\n readFailed: true,\n readError: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * The daemon-scoped liveness payload surfaced on `/health.extraction` and in\n * doctor/stats details. Its watermark is the maximum successful extraction\n * across every distinct namespace store, matching the daemon-wide buffer scope.\n */\nexport interface ExtractionLivenessStatus {\n lastExtractionAt: string | null;\n bufferedSessionCount: number;\n pendingTurnCount: number;\n oldestBufferedTurnAgeMs: number | null;\n degraded: boolean;\n degradedReason: string | null;\n watermarkPending?: boolean;\n watermarkScope: \"aggregate\";\n}\n\ninterface ExtractionLivenessOrchestratorLike {\n config: Pick<PluginConfig, \"extractionLiveness\">;\n buffer?: ExtractionBufferSource;\n}\n\n/**\n * Parse the `extractionLiveness` config block. Follows the nested-block shape\n * validation used elsewhere in `config.ts` and coerces string booleans (§24:\n * CLI/JSON deliver `\"false\"`/`\"0\"` as strings, which must read as falsy).\n */\nexport function parseExtractionLivenessConfig(\n cfg: Record<string, unknown>,\n): ExtractionLivenessConfig {\n const raw = cfg.extractionLiveness;\n if (raw !== undefined && (raw === null || typeof raw !== \"object\" || Array.isArray(raw))) {\n throw new Error(`extractionLiveness must be a plain object (got ${JSON.stringify(raw)})`);\n }\n const block = (raw ?? {}) as Record<string, unknown>;\n return {\n // `?? true` keeps the default on when the key is absent while honoring\n // explicit \"false\"/\"0\"/false opt-outs (coerceBool handles the string forms).\n enabled: coerceBool(block.enabled) ?? true,\n staleWindowMs: parseStaleWindowMs(block.staleWindowMs),\n };\n}\n\n/**\n * Parse `extractionLiveness.staleWindowMs`. Absent (`undefined`) → the 24h\n * default; any PRESENT value (including an explicit `null`) must coerce to a\n * positive INTEGER of milliseconds, else THROW. A fractional or non-positive\n * value (\"0.5\" would floor to 0, making every backlog instantly stale; 1.9 would\n * floor to 1) is rejected, never floored/reinterpreted (§1/§17/§39). Mirrors\n * config.ts's `parseIntegerInClosedRange` (round 9 finding 1): only an absent key\n * falls back; an explicit `null` is invalid input, not \"use the default\".\n * Inlined rather than imported because config.ts already imports this module\n * (importing back would be circular), the same reason `recall-concurrency-config.ts`\n * inlines its numeric validation.\n */\nfunction parseStaleWindowMs(value: unknown): number {\n // Only an absent key (undefined) falls back to the default; an explicit `null`\n // is invalid input and proceeds to validation → throw (mirrors\n // parseIntegerInClosedRange, round 9 finding 1).\n if (value === undefined) return DEFAULT_STALE_WINDOW_MS;\n const coerced = coerceNumber(value);\n if (coerced === undefined || !Number.isFinite(coerced) || !Number.isInteger(coerced) || coerced < 1) {\n throw new Error(\n `extractionLiveness.staleWindowMs must be an integer greater than or equal to 1; got ${JSON.stringify(value)}`,\n );\n }\n return coerced;\n}\n\n/** Milliseconds between `timestamp` and `nowMs`, clamped at 0; null when unparsable/absent. */\nfunction ageMsFrom(timestamp: string | null, nowMs: number): number | null {\n if (typeof timestamp !== \"string\") return null;\n const parsed = Date.parse(timestamp);\n if (!Number.isFinite(parsed)) return null;\n return Math.max(0, nowMs - parsed);\n}\n\n/** Compact human-readable duration (\"3d\", \"5h\", \"12m\", \"45s\") for logs and CLI output. */\nexport function formatAgeMs(ms: number): string {\n const s = Math.max(0, Math.floor(ms / 1000));\n if (s >= 86_400) return `${Math.floor(s / 86_400)}d`;\n if (s >= 3_600) return `${Math.floor(s / 3_600)}h`;\n if (s >= 60) return `${Math.floor(s / 60)}m`;\n return `${s}s`;\n}\n\n/**\n * Pure liveness verdict. Degraded when the feature is enabled AND any of: the\n * last-extraction watermark could not be READ (a storage fault, §22), the buffer\n * read failed (a pipeline fault, §22), or the buffer is non-empty and the\n * watermark is absent or stale. Each cause yields a DISTINCT reason so an\n * operator can tell a meta-read failure from a buffer-read failure from a\n * pipeline that has genuinely never extracted.\n *\n * Staleness uses a half-open freshness window (§23): an extraction is fresh\n * while its age is in `[0, staleWindowMs)`, so an age of EXACTLY `staleWindowMs`\n * is stale (the upper bound on \"fresh\" is exclusive). A null/unparsable watermark\n * means \"never succeeded\" and is treated as stale — as is a FUTURE watermark (a\n * clock-skewed or corrupt timestamp ahead of now must not read as a fresh\n * extraction and hide a real backlog stall).\n */\nexport function evaluateExtractionLiveness(input: {\n config: ExtractionLivenessConfig;\n lastExtractionAt: string | null;\n snapshot: ExtractionBufferSnapshot;\n nowMs: number;\n metaReadFailed?: boolean;\n metaReadError?: string;\n watermarkPending?: boolean;\n}): ExtractionLivenessStatus {\n const { config, lastExtractionAt, snapshot, nowMs } = input;\n const lastMs = lastExtractionAt !== null ? Date.parse(lastExtractionAt) : Number.NaN;\n const hasWatermark = Number.isFinite(lastMs);\n const ageMs = nowMs - lastMs;\n // A future watermark (negative age) is clock-skewed or corrupt data, not a\n // fresh extraction: treat it as stale so a real backlog stall is not hidden.\n const stale = !hasWatermark || ageMs < 0 || ageMs >= config.staleWindowMs;\n const hasBacklog = snapshot.bufferedSessionCount > 0;\n // A watermark or buffer that cannot be READ is a fault, not an empty queue\n // (§22): a storage/pipeline outage must not read as healthy, and must stay\n // distinct from a pipeline that has genuinely never extracted.\n const metaReadFailed = input.metaReadFailed === true;\n const watermarkPending = input.watermarkPending === true;\n const readFailed = snapshot.readFailed === true;\n const degraded =\n config.enabled && (metaReadFailed || readFailed || (!watermarkPending && hasBacklog && stale));\n\n let degradedReason: string | null = null;\n if (degraded) {\n if (metaReadFailed) {\n degradedReason = `extraction watermark unreadable: ${input.metaReadError ?? \"meta read failed\"}`;\n } else if (readFailed) {\n degradedReason = `extraction buffer unreadable: ${snapshot.readError ?? \"buffer snapshot read failed\"}`;\n } else {\n const watermark = hasWatermark\n ? `last succeeded ${formatAgeMs(nowMs - lastMs)} ago`\n : \"no successful extraction on record\";\n degradedReason =\n `${watermark}; ${snapshot.bufferedSessionCount} buffered session(s), ` +\n `${snapshot.pendingTurnCount} turn(s) pending extraction`;\n }\n }\n\n return {\n lastExtractionAt,\n bufferedSessionCount: snapshot.bufferedSessionCount,\n pendingTurnCount: snapshot.pendingTurnCount,\n oldestBufferedTurnAgeMs: ageMsFrom(snapshot.oldestTurnTimestamp, nowMs),\n degraded,\n degradedReason,\n ...(watermarkPending ? { watermarkPending: true } : {}),\n watermarkScope: \"aggregate\",\n };\n}\n\nconst EMPTY_SNAPSHOT: ExtractionBufferSnapshot = {\n bufferedSessionCount: 0,\n pendingTurnCount: 0,\n oldestTurnTimestamp: null,\n};\n\n/**\n * Read a buffer snapshot without throwing. An ABSENT buffer degrades to an empty\n * (healthy) snapshot — some service constructions have no orchestrator buffer. A\n * buffer that EXISTS but whose read throws yields a `readFailed` snapshot so the\n * verdict can distinguish a pipeline fault from an empty queue (§22).\n */\nasync function readBufferSnapshot(\n buffer: ExtractionBufferSource | undefined,\n): Promise<ExtractionBufferSnapshot> {\n if (!buffer || typeof buffer.getBufferSnapshot !== \"function\") return EMPTY_SNAPSHOT;\n try {\n return await buffer.getBufferSnapshot();\n } catch (err) {\n return {\n ...EMPTY_SNAPSHOT,\n readFailed: true,\n readError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/**\n * Gather the liveness status from an aggregate watermark read and an optional\n * buffer. A read failure on either side is surfaced as a degraded status with a\n * distinct reason rather than swallowed into a healthy-looking verdict.\n */\nexport async function gatherExtractionLivenessStatus(input: {\n config: ExtractionLivenessConfig;\n watermark: ExtractionWatermarkOrStorage;\n buffer: ExtractionBufferSource | undefined;\n nowMs: number;\n}): Promise<ExtractionLivenessStatus> {\n const { config, buffer, nowMs } = input;\n const watermarkRead = await coerceExtractionWatermark(input.watermark);\n const snapshot = await readBufferSnapshot(buffer);\n return evaluateExtractionLiveness({\n config,\n lastExtractionAt: watermarkRead.lastExtractionAt,\n snapshot,\n nowMs,\n metaReadFailed: watermarkRead.readFailed,\n metaReadError: watermarkRead.readError,\n watermarkPending: watermarkRead.pending,\n });\n}\n\n/**\n * Aggregated-WARN throttle (issue #2151): emit at most ONE warning per\n * staleness window while degraded — not one line per failed extraction attempt.\n * State is instance-scoped (held by the owning service), never a module global\n * (§5), so multiple service instances throttle independently.\n */\nexport class ExtractionLivenessWarnThrottle {\n private lastWarnAtMs: number | null = null;\n\n /** Warn if degraded and outside the throttle window; returns whether a WARN was emitted. */\n maybeWarn(status: ExtractionLivenessStatus, staleWindowMs: number, nowMs: number): boolean {\n if (!status.degraded) {\n // Recovered (or never degraded): reset so a fresh episode warns at once.\n this.lastWarnAtMs = null;\n return false;\n }\n if (this.lastWarnAtMs !== null && nowMs - this.lastWarnAtMs < staleWindowMs) return false;\n this.lastWarnAtMs = nowMs;\n log.warn(\n `extraction pipeline liveness degraded: ${status.degradedReason ?? \"buffered turns are not being extracted\"}`,\n );\n return true;\n }\n}\n\n/**\n * Normalize the `extractionLiveness` block at the read boundary. `parseConfig`\n * always populates it, but a host adapter, an older persisted config, or a\n * hand-built `PluginConfig` can hand us an absent, partial, or loosely-typed\n * block - and every liveness surface (/health, doctor, stats) must degrade to\n * the documented default (enabled, 24h window) rather than throw. Both fields\n * are coerced with the same rules as `parseExtractionLivenessConfig` (§24:\n * `\"false\"`/`\"0\"` read as falsy; a numeric string like `\"5000\"` parses), except a\n * present but non-integer or non-positive `staleWindowMs` falls back to the\n * default here rather than throwing.\n */\nexport function resolveExtractionLivenessConfig(\n block: { enabled?: unknown; staleWindowMs?: unknown } | undefined,\n): ExtractionLivenessConfig {\n const staleWindowMs = coerceNumber(block?.staleWindowMs);\n return {\n enabled: coerceBool(block?.enabled) ?? true,\n staleWindowMs:\n staleWindowMs !== undefined && Number.isInteger(staleWindowMs) && staleWindowMs >= 1\n ? staleWindowMs\n : DEFAULT_STALE_WINDOW_MS,\n };\n}\n\n/**\n * Compute the daemon-wide liveness status for the authenticated `/health`\n * payload and emit the throttled aggregate warning.\n */\nexport async function computeExtractionLivenessStatus(\n orchestrator: ExtractionLivenessOrchestratorLike,\n watermark: ExtractionWatermarkOrStorage,\n throttle?: ExtractionLivenessWarnThrottle,\n nowMs: number = Date.now(),\n): Promise<ExtractionLivenessStatus> {\n const config = resolveExtractionLivenessConfig(orchestrator.config.extractionLiveness);\n const status = await gatherExtractionLivenessStatus({\n config,\n watermark,\n buffer: orchestrator.buffer,\n nowMs,\n });\n throttle?.maybeWarn(status, config.staleWindowMs, nowMs);\n return status;\n}\n\n/**\n * `remnic doctor` check for extraction-pipeline liveness. Status `warn` when\n * degraded (with a remediation hint), `ok` otherwise.\n */\nexport async function summarizeExtractionLiveness(\n config: Pick<PluginConfig, \"extractionLiveness\">,\n watermark: ExtractionWatermarkOrStorage,\n buffer?: ExtractionBufferSource,\n nowMs: number = Date.now(),\n): Promise<OperatorDoctorCheck> {\n const livenessConfig = resolveExtractionLivenessConfig(config.extractionLiveness);\n const status = await gatherExtractionLivenessStatus({\n config: livenessConfig,\n watermark,\n buffer,\n nowMs,\n });\n const scopeNote = ` Watermark scope: ${status.watermarkScope}.`;\n const summary =\n (status.degraded\n ? `Extraction pipeline degraded: ${status.degradedReason}.`\n : `Extraction pipeline healthy: last extraction ${status.lastExtractionAt ?? \"never\"}, ` +\n `${status.bufferedSessionCount} buffered session(s), ${status.pendingTurnCount} turn(s) pending` +\n `${livenessConfig.enabled ? \"\" : \" (liveness check disabled)\"}.`) + scopeNote;\n return {\n key: \"extraction_liveness\",\n status: status.degraded ? \"warn\" : \"ok\",\n summary,\n remediation: status.degraded\n ? \"Extraction has stalled while turns are buffered. Inspect daemon logs for extraction \" +\n \"timeouts or fallback-no-parsed-output errors, verify the extraction model/provider is \" +\n \"reachable, then force a flush (e.g. `remnic flush`).\"\n : undefined,\n details: { ...status, staleWindowMs: livenessConfig.staleWindowMs, enabled: livenessConfig.enabled },\n };\n}\n\n/**\n * Lines for `remnic stats`: the aggregate extraction watermark, root metadata\n * counters, buffer backlog, and liveness verdict. Root counter failures render\n * those counters unavailable; the injected aggregate read alone determines\n * watermark liveness so stats cannot diverge from health and doctor.\n */\nexport async function renderExtractionLivenessStats(\n orchestrator: ExtractionLivenessOrchestratorLike,\n watermark: ExtractionWatermarkRead,\n nowMs: number = Date.now(),\n): Promise<string[]> {\n const status = evaluateExtractionLiveness({\n config: resolveExtractionLivenessConfig(orchestrator.config.extractionLiveness),\n lastExtractionAt: watermark.lastExtractionAt,\n snapshot: await readBufferSnapshot(orchestrator.buffer),\n nowMs,\n metaReadFailed: watermark.readFailed,\n metaReadError: watermark.readError,\n watermarkPending: watermark.pending,\n });\n const oldestAge =\n status.oldestBufferedTurnAgeMs !== null ? formatAgeMs(status.oldestBufferedTurnAgeMs) : \"n/a\";\n const rootStats = watermark.rootStats;\n const watermarkDisplay = watermark.readFailed\n ? \"unavailable\"\n : watermark.pending\n ? \"pending\"\n : status.lastExtractionAt ?? \"never\";\n return [\n `Extractions: ${rootStats?.extractionCount ?? \"unavailable\"}`,\n `Last extraction: ${watermarkDisplay}`,\n `Last consolidation: ${rootStats ? rootStats.lastConsolidationAt ?? \"never\" : \"unavailable\"}`,\n `Buffered sessions: ${status.bufferedSessionCount} (${status.pendingTurnCount} turns pending)`,\n `Oldest buffered turn age: ${oldestAge}`,\n `Extraction watermark scope: ${status.watermarkScope}`,\n `Extraction liveness: ${status.degraded ? `DEGRADED — ${status.degradedReason}` : \"ok\"}`,\n ];\n}\n"],"mappings":";;;;;;;;;AA0BA,IAAM,0BAA0B;AAsDhC,eAAsB,0BACpB,WACkC;AAClC,MAAI,aAAa,gBAAgB,aAAa,OAAO,UAAU,eAAe,WAAW;AACvF,WAAO;AAAA,EACT;AACA,MAAI;AACF,QAAI,mBAAkC;AACtC,QAAI,cAAc,aAAa,OAAO,UAAU,aAAa,YAAY;AACvE,YAAM,OAAO,MAAM,UAAU,SAAS;AACtC,yBAAmB,MAAM,oBAAoB;AAAA,IAC/C,WAAW,kBAAkB,aAAa,OAAO,UAAU,iBAAiB,YAAY;AACtF,YAAM,OAAO,MAAM,UAAU,aAAa;AAC1C,yBAAmB,MAAM,oBAAoB;AAAA,IAC/C;AACA,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAClE;AAAA,EACF;AACF;AA4BO,SAAS,8BACd,KAC0B;AAC1B,QAAM,MAAM,IAAI;AAChB,MAAI,QAAQ,WAAc,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,IAAI;AACxF,UAAM,IAAI,MAAM,kDAAkD,KAAK,UAAU,GAAG,CAAC,GAAG;AAAA,EAC1F;AACA,QAAM,QAAS,OAAO,CAAC;AACvB,SAAO;AAAA;AAAA;AAAA,IAGL,SAAS,WAAW,MAAM,OAAO,KAAK;AAAA,IACtC,eAAe,mBAAmB,MAAM,aAAa;AAAA,EACvD;AACF;AAcA,SAAS,mBAAmB,OAAwB;AAIlD,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,YAAY,UAAa,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,GAAG;AACnG,UAAM,IAAI;AAAA,MACR,uFAAuF,KAAK,UAAU,KAAK,CAAC;AAAA,IAC9G;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,UAAU,WAA0B,OAA8B;AACzE,MAAI,OAAO,cAAc,SAAU,QAAO;AAC1C,QAAM,SAAS,KAAK,MAAM,SAAS;AACnC,MAAI,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO;AACrC,SAAO,KAAK,IAAI,GAAG,QAAQ,MAAM;AACnC;AAGO,SAAS,YAAY,IAAoB;AAC9C,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC;AAC3C,MAAI,KAAK,MAAQ,QAAO,GAAG,KAAK,MAAM,IAAI,KAAM,CAAC;AACjD,MAAI,KAAK,KAAO,QAAO,GAAG,KAAK,MAAM,IAAI,IAAK,CAAC;AAC/C,MAAI,KAAK,GAAI,QAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AACzC,SAAO,GAAG,CAAC;AACb;AAiBO,SAAS,2BAA2B,OAQd;AAC3B,QAAM,EAAE,QAAQ,kBAAkB,UAAU,MAAM,IAAI;AACtD,QAAM,SAAS,qBAAqB,OAAO,KAAK,MAAM,gBAAgB,IAAI,OAAO;AACjF,QAAM,eAAe,OAAO,SAAS,MAAM;AAC3C,QAAM,QAAQ,QAAQ;AAGtB,QAAM,QAAQ,CAAC,gBAAgB,QAAQ,KAAK,SAAS,OAAO;AAC5D,QAAM,aAAa,SAAS,uBAAuB;AAInD,QAAM,iBAAiB,MAAM,mBAAmB;AAChD,QAAM,mBAAmB,MAAM,qBAAqB;AACpD,QAAM,aAAa,SAAS,eAAe;AAC3C,QAAM,WACJ,OAAO,YAAY,kBAAkB,cAAe,CAAC,oBAAoB,cAAc;AAEzF,MAAI,iBAAgC;AACpC,MAAI,UAAU;AACZ,QAAI,gBAAgB;AAClB,uBAAiB,oCAAoC,MAAM,iBAAiB,kBAAkB;AAAA,IAChG,WAAW,YAAY;AACrB,uBAAiB,iCAAiC,SAAS,aAAa,6BAA6B;AAAA,IACvG,OAAO;AACL,YAAM,YAAY,eACd,kBAAkB,YAAY,QAAQ,MAAM,CAAC,SAC7C;AACJ,uBACE,GAAG,SAAS,KAAK,SAAS,oBAAoB,yBAC3C,SAAS,gBAAgB;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,sBAAsB,SAAS;AAAA,IAC/B,kBAAkB,SAAS;AAAA,IAC3B,yBAAyB,UAAU,SAAS,qBAAqB,KAAK;AAAA,IACtE;AAAA,IACA;AAAA,IACA,GAAI,mBAAmB,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAAA,IACrD,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAM,iBAA2C;AAAA,EAC/C,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,qBAAqB;AACvB;AAQA,eAAe,mBACb,QACmC;AACnC,MAAI,CAAC,UAAU,OAAO,OAAO,sBAAsB,WAAY,QAAO;AACtE,MAAI;AACF,WAAO,MAAM,OAAO,kBAAkB;AAAA,EACxC,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,MACZ,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC5D;AAAA,EACF;AACF;AAOA,eAAsB,+BAA+B,OAKf;AACpC,QAAM,EAAE,QAAQ,QAAQ,MAAM,IAAI;AAClC,QAAM,gBAAgB,MAAM,0BAA0B,MAAM,SAAS;AACrE,QAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,SAAO,2BAA2B;AAAA,IAChC;AAAA,IACA,kBAAkB,cAAc;AAAA,IAChC;AAAA,IACA;AAAA,IACA,gBAAgB,cAAc;AAAA,IAC9B,eAAe,cAAc;AAAA,IAC7B,kBAAkB,cAAc;AAAA,EAClC,CAAC;AACH;AAQO,IAAM,iCAAN,MAAqC;AAAA,EAClC,eAA8B;AAAA;AAAA,EAGtC,UAAU,QAAkC,eAAuB,OAAwB;AACzF,QAAI,CAAC,OAAO,UAAU;AAEpB,WAAK,eAAe;AACpB,aAAO;AAAA,IACT;AACA,QAAI,KAAK,iBAAiB,QAAQ,QAAQ,KAAK,eAAe,cAAe,QAAO;AACpF,SAAK,eAAe;AACpB,QAAI;AAAA,MACF,0CAA0C,OAAO,kBAAkB,wCAAwC;AAAA,IAC7G;AACA,WAAO;AAAA,EACT;AACF;AAaO,SAAS,gCACd,OAC0B;AAC1B,QAAM,gBAAgB,aAAa,OAAO,aAAa;AACvD,SAAO;AAAA,IACL,SAAS,WAAW,OAAO,OAAO,KAAK;AAAA,IACvC,eACE,kBAAkB,UAAa,OAAO,UAAU,aAAa,KAAK,iBAAiB,IAC/E,gBACA;AAAA,EACR;AACF;AAMA,eAAsB,gCACpB,cACA,WACA,UACA,QAAgB,KAAK,IAAI,GACU;AACnC,QAAM,SAAS,gCAAgC,aAAa,OAAO,kBAAkB;AACrF,QAAM,SAAS,MAAM,+BAA+B;AAAA,IAClD;AAAA,IACA;AAAA,IACA,QAAQ,aAAa;AAAA,IACrB;AAAA,EACF,CAAC;AACD,YAAU,UAAU,QAAQ,OAAO,eAAe,KAAK;AACvD,SAAO;AACT;AAMA,eAAsB,4BACpB,QACA,WACA,QACA,QAAgB,KAAK,IAAI,GACK;AAC9B,QAAM,iBAAiB,gCAAgC,OAAO,kBAAkB;AAChF,QAAM,SAAS,MAAM,+BAA+B;AAAA,IAClD,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,YAAY,qBAAqB,OAAO,cAAc;AAC5D,QAAM,WACH,OAAO,WACJ,iCAAiC,OAAO,cAAc,MACtD,gDAAgD,OAAO,oBAAoB,OAAO,KAC/E,OAAO,oBAAoB,yBAAyB,OAAO,gBAAgB,mBAC3E,eAAe,UAAU,KAAK,4BAA4B,OAAO;AAC1E,SAAO;AAAA,IACL,KAAK;AAAA,IACL,QAAQ,OAAO,WAAW,SAAS;AAAA,IACnC;AAAA,IACA,aAAa,OAAO,WAChB,mOAGA;AAAA,IACJ,SAAS,EAAE,GAAG,QAAQ,eAAe,eAAe,eAAe,SAAS,eAAe,QAAQ;AAAA,EACrG;AACF;AAQA,eAAsB,8BACpB,cACA,WACA,QAAgB,KAAK,IAAI,GACN;AACnB,QAAM,SAAS,2BAA2B;AAAA,IACxC,QAAQ,gCAAgC,aAAa,OAAO,kBAAkB;AAAA,IAC9E,kBAAkB,UAAU;AAAA,IAC5B,UAAU,MAAM,mBAAmB,aAAa,MAAM;AAAA,IACtD;AAAA,IACA,gBAAgB,UAAU;AAAA,IAC1B,eAAe,UAAU;AAAA,IACzB,kBAAkB,UAAU;AAAA,EAC9B,CAAC;AACD,QAAM,YACJ,OAAO,4BAA4B,OAAO,YAAY,OAAO,uBAAuB,IAAI;AAC1F,QAAM,YAAY,UAAU;AAC5B,QAAM,mBAAmB,UAAU,aAC/B,gBACA,UAAU,UACR,YACA,OAAO,oBAAoB;AACjC,SAAO;AAAA,IACL,gBAAgB,WAAW,mBAAmB,aAAa;AAAA,IAC3D,oBAAoB,gBAAgB;AAAA,IACpC,uBAAuB,YAAY,UAAU,uBAAuB,UAAU,aAAa;AAAA,IAC3F,sBAAsB,OAAO,oBAAoB,KAAK,OAAO,gBAAgB;AAAA,IAC7E,6BAA6B,SAAS;AAAA,IACtC,+BAA+B,OAAO,cAAc;AAAA,IACpD,wBAAwB,OAAO,WAAW,mBAAc,OAAO,cAAc,KAAK,IAAI;AAAA,EACxF;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-ENLZOWYK.js";
3
+ } from "./chunk-ZERSIPFC.js";
4
4
  import {
5
5
  assertPathInsideRoot
6
6
  } from "./chunk-GCASGYIO.js";
@@ -759,4 +759,4 @@ export {
759
759
  listMemoryGovernanceRuns,
760
760
  readMemoryGovernanceRunArtifact
761
761
  };
762
- //# sourceMappingURL=chunk-MHCRASVK.js.map
762
+ //# sourceMappingURL=chunk-5N26WBPQ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-ENLZOWYK.js";
3
+ } from "./chunk-ZERSIPFC.js";
4
4
  import {
5
5
  getCachedRuleMemories,
6
6
  setCachedRuleMemories
@@ -119,4 +119,4 @@ export {
119
119
  compareVerifiedSemanticRuleResults,
120
120
  searchVerifiedSemanticRules
121
121
  };
122
- //# sourceMappingURL=chunk-CMFUYOYB.js.map
122
+ //# sourceMappingURL=chunk-5TOV3D6U.js.map
@@ -7,13 +7,13 @@ import {
7
7
  import {
8
8
  listMemoryGovernanceRuns,
9
9
  readMemoryGovernanceRunArtifact
10
- } from "./chunk-MHCRASVK.js";
10
+ } from "./chunk-5N26WBPQ.js";
11
11
  import {
12
12
  commitPreparedFileAtomically
13
13
  } from "./chunk-R6YJI3HE.js";
14
14
  import {
15
15
  StorageManager
16
- } from "./chunk-ENLZOWYK.js";
16
+ } from "./chunk-ZERSIPFC.js";
17
17
  import {
18
18
  assertInjectedStorageRooted,
19
19
  readProjectedEntityMentionRows,
@@ -1001,4 +1001,4 @@ export {
1001
1001
  verifyMemoryProjection,
1002
1002
  repairMemoryProjection
1003
1003
  };
1004
- //# sourceMappingURL=chunk-SHTPVI47.js.map
1004
+ //# sourceMappingURL=chunk-6GIMMNVK.js.map
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  ActivityStore,
18
18
  MaintenanceScheduler
19
- } from "./chunk-5TRIAPT4.js";
19
+ } from "./chunk-NHRNYJPJ.js";
20
20
  import {
21
21
  migrateFromEngram
22
22
  } from "./chunk-7HYPN2GC.js";
@@ -32,7 +32,7 @@ import {
32
32
  import {
33
33
  CompoundingEngine,
34
34
  defaultTierMigrationCycleBudget
35
- } from "./chunk-F5EVTFQK.js";
35
+ } from "./chunk-MSXWUXFE.js";
36
36
  import {
37
37
  SharedContextManager
38
38
  } from "./chunk-AS7YMSL6.js";
@@ -198,7 +198,7 @@ import {
198
198
  buildEntityRecallSection,
199
199
  entityRecentTranscriptLookbackHours,
200
200
  readRecentEntityTranscriptEntries
201
- } from "./chunk-DJH35IVS.js";
201
+ } from "./chunk-JDXDA5OO.js";
202
202
  import {
203
203
  buildEventOrderRecallSection,
204
204
  shouldRecallEventOrderEvidence
@@ -214,7 +214,7 @@ import {
214
214
  ensureBuiltInWearableConnectors,
215
215
  getWearableConnector,
216
216
  listWearableConnectors
217
- } from "./chunk-KJP2R5MJ.js";
217
+ } from "./chunk-UGCUVLOL.js";
218
218
  import {
219
219
  normalizeReplaySessionKey
220
220
  } from "./chunk-AJVLDJU6.js";
@@ -224,14 +224,14 @@ import {
224
224
  import {
225
225
  compareVerifiedEpisodeResults,
226
226
  searchVerifiedEpisodes
227
- } from "./chunk-VGK33D3K.js";
227
+ } from "./chunk-OEXKYYVH.js";
228
228
  import {
229
229
  ThreadingManager
230
230
  } from "./chunk-OJP3N7UK.js";
231
231
  import {
232
232
  compareVerifiedSemanticRuleResults,
233
233
  searchVerifiedSemanticRules
234
- } from "./chunk-CMFUYOYB.js";
234
+ } from "./chunk-5TOV3D6U.js";
235
235
  import {
236
236
  searchWorkProductLedgerEntries
237
237
  } from "./chunk-ZRWB5D4H.js";
@@ -244,11 +244,11 @@ import {
244
244
  import {
245
245
  runNamespaceMaintenanceFanout,
246
246
  summarizeNamespaceMaintenanceHealth
247
- } from "./chunk-GYGXKATH.js";
247
+ } from "./chunk-CQ5MR2HQ.js";
248
248
  import {
249
249
  NamespaceCatalog,
250
250
  planNamespaceMaintenance
251
- } from "./chunk-7ERHAARG.js";
251
+ } from "./chunk-BI6RE2ZS.js";
252
252
  import {
253
253
  isAboveImportanceThreshold,
254
254
  scoreImportance
@@ -283,7 +283,7 @@ import {
283
283
  materializeAfterSemanticConsolidation,
284
284
  parseConsolidationResponse,
285
285
  parseOperatorAwareConsolidationResponse
286
- } from "./chunk-AL73FWSS.js";
286
+ } from "./chunk-QY66HJ4X.js";
287
287
  import {
288
288
  buildBehaviorSignalsForMemory,
289
289
  dedupeBehaviorSignalsByMemoryAndHash
@@ -305,7 +305,7 @@ import {
305
305
  } from "./chunk-UQ7RN5HK.js";
306
306
  import {
307
307
  detectMeetings
308
- } from "./chunk-IB26HVAJ.js";
308
+ } from "./chunk-TM72UOX2.js";
309
309
  import {
310
310
  compileCorrectionRule,
311
311
  correctionsFilePath,
@@ -322,7 +322,7 @@ import {
322
322
  } from "./chunk-LBJBNWS2.js";
323
323
  import {
324
324
  MeetingsInputError
325
- } from "./chunk-CYM2PHLB.js";
325
+ } from "./chunk-CWPDM66T.js";
326
326
  import {
327
327
  WearablesInputError,
328
328
  describeErrorForOperator
@@ -340,7 +340,7 @@ import {
340
340
  capturePassiveCorrections,
341
341
  clusterByKey,
342
342
  detectPassiveCorrections
343
- } from "./chunk-BVJIAIB3.js";
343
+ } from "./chunk-Q4XL7LJW.js";
344
344
  import {
345
345
  importCapsule
346
346
  } from "./chunk-3CE77VAP.js";
@@ -360,7 +360,7 @@ import {
360
360
  } from "./chunk-JGSKJHF7.js";
361
361
  import {
362
362
  buildXraySnapshot
363
- } from "./chunk-KWU6MAD4.js";
363
+ } from "./chunk-R4Q7CQGZ.js";
364
364
  import {
365
365
  boundRecallContextComposition,
366
366
  composeRecallContext,
@@ -399,7 +399,7 @@ import {
399
399
  } from "./chunk-CYEPCZN5.js";
400
400
  import {
401
401
  NamespaceStorageRouter
402
- } from "./chunk-UGAZILZG.js";
402
+ } from "./chunk-F2KMAFEB.js";
403
403
  import {
404
404
  writeConversationChunks
405
405
  } from "./chunk-72A4L5JJ.js";
@@ -462,7 +462,7 @@ import {
462
462
  } from "./chunk-NRV4Y3PM.js";
463
463
  import {
464
464
  buildChainFollowupGenerator
465
- } from "./chunk-AVGTOOYP.js";
465
+ } from "./chunk-3C2TGBDB.js";
466
466
  import {
467
467
  QmdResultResolver,
468
468
  StorageManager,
@@ -481,7 +481,7 @@ import {
481
481
  reconstructFusionInputs,
482
482
  selfDeps,
483
483
  serializeFusionDay
484
- } from "./chunk-ENLZOWYK.js";
484
+ } from "./chunk-ZERSIPFC.js";
485
485
  import {
486
486
  bodyIsEscaped,
487
487
  decodeTranscriptBody,
@@ -502,7 +502,7 @@ import {
502
502
  } from "./chunk-J6A3CX5N.js";
503
503
  import {
504
504
  confidenceTier
505
- } from "./chunk-HXDWZFNP.js";
505
+ } from "./chunk-GSL47NPM.js";
506
506
  import {
507
507
  namespaceIdentityFromToken,
508
508
  namespaceIdentityToken,
@@ -23923,4 +23923,4 @@ export {
23923
23923
  filterRecallCandidates,
23924
23924
  Orchestrator
23925
23925
  };
23926
- //# sourceMappingURL=chunk-5JUYBWJD.js.map
23926
+ //# sourceMappingURL=chunk-6I2C3EOH.js.map
@@ -0,0 +1,142 @@
1
+ import {
2
+ resolveCorpusNamespaceRoots
3
+ } from "./chunk-OYFDEJZB.js";
4
+ import {
5
+ normalizeNamespaceIdentity
6
+ } from "./chunk-EGGE52UU.js";
7
+ import {
8
+ capabilityAllowsNamespace
9
+ } from "./chunk-MZWSOLMT.js";
10
+ import {
11
+ resolveNamespaceCapabilities
12
+ } from "./chunk-2XRE6FLM.js";
13
+
14
+ // src/orchestration/extraction-watermark.ts
15
+ import path from "path";
16
+ function readFailure(reason, rootStats) {
17
+ return {
18
+ lastExtractionAt: null,
19
+ readFailed: true,
20
+ readError: reason,
21
+ ...rootStats ? { rootStats } : {}
22
+ };
23
+ }
24
+ function errorMessage(error) {
25
+ return error instanceof Error ? error.message : String(error);
26
+ }
27
+ function watermarkFromMeta(meta, name) {
28
+ if (meta.lastExtractionAt !== null && meta.lastExtractionAt !== void 0) {
29
+ const parsed = Date.parse(meta.lastExtractionAt);
30
+ if (!Number.isFinite(parsed)) {
31
+ return readFailure(`${name} watermark timestamp invalid`);
32
+ }
33
+ }
34
+ const hasRootStats = meta.extractionCount !== void 0 || meta.lastConsolidationAt !== void 0;
35
+ return {
36
+ lastExtractionAt: meta.lastExtractionAt ?? null,
37
+ readFailed: false,
38
+ ...hasRootStats ? {
39
+ rootStats: {
40
+ extractionCount: meta.extractionCount,
41
+ lastConsolidationAt: meta.lastConsolidationAt
42
+ }
43
+ } : {}
44
+ };
45
+ }
46
+ async function readWatermark(storage, name) {
47
+ try {
48
+ return watermarkFromMeta(await storage.loadMeta(), name);
49
+ } catch (error) {
50
+ return readFailure(`${name} watermark unreadable: ${errorMessage(error)}`);
51
+ }
52
+ }
53
+ async function resolveRoots(options) {
54
+ const compute = () => resolveCorpusNamespaceRoots({
55
+ config: options.config,
56
+ propagateDiscoveryErrors: true
57
+ });
58
+ if (options.rootsCache) {
59
+ const { roots, refreshError } = options.rootsCache.getResolvedRootsStatus(compute);
60
+ if (refreshError !== void 0) {
61
+ return readFailure(`namespace watermark enumeration failed: ${errorMessage(refreshError)}`);
62
+ }
63
+ return roots ?? { lastExtractionAt: null, readFailed: false, pending: true };
64
+ }
65
+ try {
66
+ return await compute();
67
+ } catch (error) {
68
+ return readFailure(`namespace watermark enumeration failed: ${errorMessage(error)}`);
69
+ }
70
+ }
71
+ function isReadFailure(value) {
72
+ return !Array.isArray(value);
73
+ }
74
+ function newerWatermark(current, candidate) {
75
+ if (candidate === null) return current;
76
+ const candidateMs = Date.parse(candidate);
77
+ if (!Number.isFinite(candidateMs)) return current;
78
+ if (current === null) return candidate;
79
+ const currentMs = Date.parse(current);
80
+ return !Number.isFinite(currentMs) || candidateMs > currentMs ? candidate : current;
81
+ }
82
+ async function readAggregateExtractionWatermark(options) {
83
+ if (!resolveNamespaceCapabilities(options.config).namespaces) {
84
+ return options.rootMeta ? watermarkFromMeta(options.rootMeta, "root store") : readWatermark(options.rootStorage, "root store");
85
+ }
86
+ const resolved = await resolveRoots(options);
87
+ if (isReadFailure(resolved)) return resolved;
88
+ const rootDir = path.resolve(options.rootStorage.dir);
89
+ const seenDirs = /* @__PURE__ */ new Set([rootDir]);
90
+ const targets = [];
91
+ for (const root of resolved) {
92
+ if (options.caps && !root.namespaces.some(
93
+ (ns) => capabilityAllowsNamespace(options.caps, normalizeNamespaceIdentity(ns))
94
+ )) {
95
+ continue;
96
+ }
97
+ const resolvedDir = path.resolve(root.rootDir);
98
+ if (seenDirs.has(resolvedDir)) continue;
99
+ seenDirs.add(resolvedDir);
100
+ targets.push(root);
101
+ }
102
+ const defaultNamespace = normalizeNamespaceIdentity(options.config.defaultNamespace);
103
+ const hasMigratedDefault = resolved.some(
104
+ (root) => path.resolve(root.rootDir) !== rootDir && root.namespaces.some((namespace) => normalizeNamespaceIdentity(namespace) === defaultNamespace)
105
+ );
106
+ const canAccessRoot = !hasMigratedDefault && (!options.caps || capabilityAllowsNamespace(options.caps, defaultNamespace));
107
+ let rootRead = { lastExtractionAt: null, readFailed: false };
108
+ if (canAccessRoot) {
109
+ rootRead = await readWatermark(options.rootStorage, "root store");
110
+ if (rootRead.readFailed) return rootRead;
111
+ }
112
+ let lastExtractionAt = rootRead.lastExtractionAt;
113
+ const reads = await Promise.all(
114
+ targets.map(async (target) => {
115
+ try {
116
+ const storage = await options.storageForNamespace(target.namespace, target.rootDir);
117
+ return await readWatermark(storage, "namespace");
118
+ } catch (error) {
119
+ return readFailure(`namespace watermark storage unavailable: ${errorMessage(error)}`);
120
+ }
121
+ })
122
+ );
123
+ for (const read of reads) {
124
+ if (read.readFailed) {
125
+ return readFailure(
126
+ read.readError ?? "namespace watermark unreadable",
127
+ rootRead.rootStats
128
+ );
129
+ }
130
+ lastExtractionAt = newerWatermark(lastExtractionAt, read.lastExtractionAt);
131
+ }
132
+ return {
133
+ lastExtractionAt,
134
+ readFailed: false,
135
+ ...rootRead.rootStats ? { rootStats: rootRead.rootStats } : {}
136
+ };
137
+ }
138
+
139
+ export {
140
+ readAggregateExtractionWatermark
141
+ };
142
+ //# sourceMappingURL=chunk-7VIB7PAE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orchestration/extraction-watermark.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { capabilityAllowsNamespace, type TokenCapabilities } from \"../access-token-capabilities.js\";\nimport { resolveNamespaceCapabilities } from \"../capabilities.js\";\nimport { resolveCorpusNamespaceRoots, type CorpusNamespaceRoot } from \"../corpus-watermark.js\";\nimport { normalizeNamespaceIdentity } from \"../namespaces/identity.js\";\nimport type { ExtractionRootStats, ExtractionWatermarkRead } from \"../extraction-liveness.js\";\nimport type { MetaState, PluginConfig } from \"../types.js\";\n\nexport interface ExtractionWatermarkMeta extends Pick<MetaState, \"lastExtractionAt\"> {\n extractionCount?: number;\n lastConsolidationAt?: string | null;\n}\n\nexport interface ExtractionWatermarkStorage {\n readonly dir: string;\n loadMeta(): Promise<ExtractionWatermarkMeta>;\n}\n\nexport interface ExtractionNamespaceRootCache {\n getResolvedRootsStatus(compute: () => Promise<CorpusNamespaceRoot[]>): {\n roots: CorpusNamespaceRoot[] | undefined;\n refreshError: unknown;\n };\n}\n\nexport interface AggregateExtractionWatermarkOptions {\n config: PluginConfig;\n rootStorage: ExtractionWatermarkStorage;\n rootMeta?: ExtractionWatermarkMeta;\n storageForNamespace(\n namespace: string,\n rootDir: string\n ): ExtractionWatermarkStorage | Promise<ExtractionWatermarkStorage>;\n rootsCache?: ExtractionNamespaceRootCache;\n caps?: TokenCapabilities;\n}\n\nfunction readFailure(reason: string, rootStats?: ExtractionRootStats): ExtractionWatermarkRead {\n return {\n lastExtractionAt: null,\n readFailed: true,\n readError: reason,\n ...(rootStats ? { rootStats } : {}),\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction watermarkFromMeta(meta: ExtractionWatermarkMeta, name: string): ExtractionWatermarkRead {\n if (meta.lastExtractionAt !== null && meta.lastExtractionAt !== undefined) {\n const parsed = Date.parse(meta.lastExtractionAt);\n if (!Number.isFinite(parsed)) {\n return readFailure(`${name} watermark timestamp invalid`);\n }\n }\n const hasRootStats = meta.extractionCount !== undefined || meta.lastConsolidationAt !== undefined;\n return {\n lastExtractionAt: meta.lastExtractionAt ?? null,\n readFailed: false,\n ...(hasRootStats\n ? {\n rootStats: {\n extractionCount: meta.extractionCount,\n lastConsolidationAt: meta.lastConsolidationAt,\n },\n }\n : {}),\n };\n}\n\nasync function readWatermark(storage: ExtractionWatermarkStorage, name: string): Promise<ExtractionWatermarkRead> {\n try {\n return watermarkFromMeta(await storage.loadMeta(), name);\n } catch (error) {\n return readFailure(`${name} watermark unreadable: ${errorMessage(error)}`);\n }\n}\n\nasync function resolveRoots(\n options: AggregateExtractionWatermarkOptions\n): Promise<CorpusNamespaceRoot[] | ExtractionWatermarkRead> {\n const compute = () =>\n resolveCorpusNamespaceRoots({\n config: options.config,\n propagateDiscoveryErrors: true,\n });\n if (options.rootsCache) {\n const { roots, refreshError } = options.rootsCache.getResolvedRootsStatus(compute);\n if (refreshError !== undefined) {\n return readFailure(`namespace watermark enumeration failed: ${errorMessage(refreshError)}`);\n }\n return roots ?? { lastExtractionAt: null, readFailed: false, pending: true };\n }\n try {\n return await compute();\n } catch (error) {\n return readFailure(`namespace watermark enumeration failed: ${errorMessage(error)}`);\n }\n}\n\nfunction isReadFailure(value: CorpusNamespaceRoot[] | ExtractionWatermarkRead): value is ExtractionWatermarkRead {\n return !Array.isArray(value);\n}\n\nfunction newerWatermark(current: string | null, candidate: string | null): string | null {\n if (candidate === null) return current;\n const candidateMs = Date.parse(candidate);\n if (!Number.isFinite(candidateMs)) return current;\n if (current === null) return candidate;\n const currentMs = Date.parse(current);\n return !Number.isFinite(currentMs) || candidateMs > currentMs ? candidate : current;\n}\n\nexport async function readAggregateExtractionWatermark(\n options: AggregateExtractionWatermarkOptions\n): Promise<ExtractionWatermarkRead> {\n if (!resolveNamespaceCapabilities(options.config).namespaces) {\n return options.rootMeta\n ? watermarkFromMeta(options.rootMeta, \"root store\")\n : readWatermark(options.rootStorage, \"root store\");\n }\n\n const resolved = await resolveRoots(options);\n if (isReadFailure(resolved)) return resolved;\n\n const rootDir = path.resolve(options.rootStorage.dir);\n const seenDirs = new Set<string>([rootDir]);\n const targets: CorpusNamespaceRoot[] = [];\n for (const root of resolved) {\n if (\n options.caps &&\n !root.namespaces.some((ns) =>\n capabilityAllowsNamespace(options.caps, normalizeNamespaceIdentity(ns)),\n )\n ) {\n continue;\n }\n const resolvedDir = path.resolve(root.rootDir);\n if (seenDirs.has(resolvedDir)) continue;\n seenDirs.add(resolvedDir);\n targets.push(root);\n }\n\n const defaultNamespace = normalizeNamespaceIdentity(options.config.defaultNamespace);\n const hasMigratedDefault = resolved.some(\n (root) =>\n path.resolve(root.rootDir) !== rootDir &&\n root.namespaces.some((namespace) => normalizeNamespaceIdentity(namespace) === defaultNamespace),\n );\n const canAccessRoot =\n !hasMigratedDefault &&\n (!options.caps || capabilityAllowsNamespace(options.caps, defaultNamespace));\n let rootRead: ExtractionWatermarkRead = { lastExtractionAt: null, readFailed: false };\n if (canAccessRoot) {\n rootRead = await readWatermark(options.rootStorage, \"root store\");\n if (rootRead.readFailed) return rootRead;\n }\n let lastExtractionAt = rootRead.lastExtractionAt;\n\n const reads = await Promise.all(\n targets.map(async (target) => {\n try {\n const storage = await options.storageForNamespace(target.namespace, target.rootDir);\n return await readWatermark(storage, \"namespace\");\n } catch (error) {\n return readFailure(`namespace watermark storage unavailable: ${errorMessage(error)}`);\n }\n })\n );\n\n for (const read of reads) {\n if (read.readFailed) {\n return readFailure(\n read.readError ?? \"namespace watermark unreadable\",\n rootRead.rootStats\n );\n }\n lastExtractionAt = newerWatermark(lastExtractionAt, read.lastExtractionAt);\n }\n return {\n lastExtractionAt,\n readFailed: false,\n ...(rootRead.rootStats ? { rootStats: rootRead.rootStats } : {}),\n };\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  OPERATION_NAMES,
3
3
  getOperation,
4
4
  operationRequiresAuthorizedNamespace
5
- } from "./chunk-BVJIAIB3.js";
5
+ } from "./chunk-Q4XL7LJW.js";
6
6
  import {
7
7
  assertOperationAuthorizationAllowed
8
8
  } from "./chunk-MZWSOLMT.js";
@@ -49,4 +49,4 @@ export {
49
49
  probeOperationAuthorization,
50
50
  authorizationProbeNamespaces
51
51
  };
52
- //# sourceMappingURL=chunk-CNZLKQEL.js.map
52
+ //# sourceMappingURL=chunk-AXUU7SG3.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  resolveDefaultNamespaceRoot,
6
6
  resolveNamespaceStorageRoot
7
- } from "./chunk-UGAZILZG.js";
7
+ } from "./chunk-F2KMAFEB.js";
8
8
  import {
9
9
  namespaceIdentityFromToken,
10
10
  namespaceIdentityToken,
@@ -2204,4 +2204,4 @@ export {
2204
2204
  runNamespaceMaintenancePlan,
2205
2205
  runNamespaceMaintenanceBatchPlan
2206
2206
  };
2207
- //# sourceMappingURL=chunk-7ERHAARG.js.map
2207
+ //# sourceMappingURL=chunk-BI6RE2ZS.js.map