@remnic/core 9.3.659 → 9.3.661

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 (234) hide show
  1. package/dist/access-cli.js +22 -22
  2. package/dist/access-http.d.ts +5 -5
  3. package/dist/access-http.js +15 -14
  4. package/dist/access-mcp.d.ts +5 -5
  5. package/dist/access-mcp.js +14 -13
  6. package/dist/{access-service-D_nbpexW.d.ts → access-service-D0SLB4MH.d.ts} +2 -2
  7. package/dist/access-service.d.ts +5 -5
  8. package/dist/access-service.js +13 -12
  9. package/dist/action-confidence.d.ts +1 -1
  10. package/dist/active-memory-bridge.d.ts +1 -1
  11. package/dist/active-recall.d.ts +1 -1
  12. package/dist/behavior-learner.d.ts +1 -1
  13. package/dist/behavior-signals.d.ts +1 -1
  14. package/dist/bootstrap.d.ts +3 -3
  15. package/dist/briefing.d.ts +1 -1
  16. package/dist/briefing.js +4 -3
  17. package/dist/buffer-surprise-report.d.ts +1 -1
  18. package/dist/buffer.d.ts +1 -1
  19. package/dist/calibration.d.ts +1 -1
  20. package/dist/causal-behavior.d.ts +1 -1
  21. package/dist/causal-consolidation.d.ts +1 -1
  22. package/dist/causal-consolidation.js +5 -4
  23. package/dist/causal-consolidation.js.map +1 -1
  24. package/dist/{chunk-QRSKPI62.js → chunk-34NSUPWS.js} +110 -25
  25. package/dist/chunk-34NSUPWS.js.map +1 -0
  26. package/dist/{chunk-SCPFRKIT.js → chunk-42JKGUFJ.js} +6 -2
  27. package/dist/{chunk-SCPFRKIT.js.map → chunk-42JKGUFJ.js.map} +1 -1
  28. package/dist/{chunk-FWIROLS6.js → chunk-44VFF3BB.js} +18 -16
  29. package/dist/chunk-44VFF3BB.js.map +1 -0
  30. package/dist/{chunk-5PFIMBJJ.js → chunk-4SYURHI6.js} +12 -12
  31. package/dist/{chunk-2VCTTEJM.js → chunk-5G2DNO54.js} +3 -3
  32. package/dist/{chunk-3R6OP33G.js → chunk-7F7LC6HW.js} +3 -3
  33. package/dist/{chunk-ZCMO46YY.js → chunk-A7EF2XRO.js} +2 -2
  34. package/dist/{chunk-BNUAOLDK.js → chunk-ANJOULTP.js} +2 -2
  35. package/dist/{chunk-CPPS65WS.js → chunk-AWJ2FHCF.js} +84 -17
  36. package/dist/chunk-AWJ2FHCF.js.map +1 -0
  37. package/dist/{chunk-4PLOQDBB.js → chunk-AX5O25EF.js} +7 -5
  38. package/dist/chunk-AX5O25EF.js.map +1 -0
  39. package/dist/{chunk-QFKRE7AU.js → chunk-BP5O3GYD.js} +4 -4
  40. package/dist/{chunk-BKRIAXTU.js → chunk-D2EFNQMY.js} +2 -2
  41. package/dist/{chunk-6M4LYWA2.js → chunk-D44FQVCU.js} +5 -5
  42. package/dist/{chunk-SSSXWIBP.js → chunk-EMSC4P66.js} +5 -5
  43. package/dist/{chunk-MBZAESQ3.js → chunk-F6O7IOS3.js} +2 -2
  44. package/dist/{chunk-6G5JEN55.js → chunk-FZC2WSDB.js} +2 -2
  45. package/dist/{chunk-KI6QM5AV.js → chunk-GY3V3SUI.js} +2 -2
  46. package/dist/{chunk-EKQMQQ3U.js → chunk-LFZUFZQR.js} +10 -2
  47. package/dist/chunk-LFZUFZQR.js.map +1 -0
  48. package/dist/{chunk-7VWDC7AD.js → chunk-MHYRRV43.js} +122 -29
  49. package/dist/chunk-MHYRRV43.js.map +1 -0
  50. package/dist/{chunk-VJYFXDCZ.js → chunk-NMPEJV5M.js} +3 -3
  51. package/dist/{chunk-7KSPKZIQ.js → chunk-PXVFMQLD.js} +3 -3
  52. package/dist/{chunk-FIS5RT6K.js → chunk-QXHBWFR3.js} +2 -2
  53. package/dist/{chunk-G2VVBWFU.js → chunk-RQGR3ETH.js} +2 -2
  54. package/dist/{chunk-GGL7R2L2.js → chunk-RQRKQJYM.js} +4 -4
  55. package/dist/{chunk-JI3LQFJH.js → chunk-TBLGI2LT.js} +2 -2
  56. package/dist/{chunk-RVT6U6PV.js → chunk-TWAJICBN.js} +2 -2
  57. package/dist/{chunk-46RXRASB.js → chunk-TYIXG4VR.js} +3 -3
  58. package/dist/{chunk-5PLUC5OB.js → chunk-WSQG37DV.js} +2 -2
  59. package/dist/{chunk-M3VYPE2H.js → chunk-YNQ6DFSV.js} +1 -1
  60. package/dist/chunk-YNQ6DFSV.js.map +1 -0
  61. package/dist/{chunk-GRYAECRV.js → chunk-ZJH723NM.js} +2 -2
  62. package/dist/{cli-aYxSuPvP.d.ts → cli-C6twwe84.d.ts} +3 -3
  63. package/dist/cli.d.ts +5 -5
  64. package/dist/cli.js +24 -23
  65. package/dist/compounding/engine.d.ts +1 -1
  66. package/dist/compounding/engine.js +4 -3
  67. package/dist/compounding/preference-consolidator.d.ts +1 -1
  68. package/dist/compression-optimizer.d.ts +1 -1
  69. package/dist/config.d.ts +1 -1
  70. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  71. package/dist/connectors/codex-materialize-runner.js +4 -3
  72. package/dist/connectors/codex-materialize.d.ts +1 -1
  73. package/dist/connectors/index.d.ts +1 -1
  74. package/dist/connectors/index.js +4 -3
  75. package/dist/consolidation-provenance-check.d.ts +1 -1
  76. package/dist/consolidation-undo.d.ts +1 -1
  77. package/dist/contradiction/index.d.ts +1 -1
  78. package/dist/conversation-index/backend.d.ts +1 -1
  79. package/dist/conversation-index/chunker.d.ts +1 -1
  80. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  81. package/dist/conversation-index/indexer.d.ts +1 -1
  82. package/dist/conversation-index/search.d.ts +1 -1
  83. package/dist/day-summary.d.ts +1 -1
  84. package/dist/delinearize.d.ts +1 -1
  85. package/dist/direct-answer-wiring.d.ts +1 -1
  86. package/dist/direct-answer.d.ts +1 -1
  87. package/dist/embedding-fallback.d.ts +1 -1
  88. package/dist/enrichment/index.d.ts +1 -1
  89. package/dist/entity-retrieval.d.ts +1 -1
  90. package/dist/entity-retrieval.js +4 -3
  91. package/dist/entity-schema.d.ts +1 -1
  92. package/dist/explicit-capture.d.ts +3 -3
  93. package/dist/extraction-judge-telemetry.d.ts +1 -1
  94. package/dist/extraction-judge-training.d.ts +1 -1
  95. package/dist/extraction-judge.d.ts +1 -1
  96. package/dist/extraction.d.ts +1 -1
  97. package/dist/fallback-llm.d.ts +1 -1
  98. package/dist/identity-continuity.d.ts +1 -1
  99. package/dist/importance.d.ts +1 -1
  100. package/dist/index.d.ts +8 -8
  101. package/dist/index.js +30 -30
  102. package/dist/intent.d.ts +1 -1
  103. package/dist/lcm/engine.d.ts +1 -1
  104. package/dist/lcm/index.d.ts +1 -1
  105. package/dist/lcm/tools.d.ts +1 -1
  106. package/dist/lifecycle.d.ts +1 -1
  107. package/dist/live-connectors-runner.d.ts +1 -1
  108. package/dist/local-llm.d.ts +1 -1
  109. package/dist/maintenance/memory-governance.d.ts +1 -1
  110. package/dist/maintenance/memory-governance.js +4 -3
  111. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -3
  112. package/dist/maintenance/rebuild-memory-projection.js +5 -4
  113. package/dist/mcp-memory-inspector-app.d.ts +5 -5
  114. package/dist/memory-action-policy.d.ts +1 -1
  115. package/dist/memory-cache.d.ts +44 -2
  116. package/dist/memory-cache.js +6 -1
  117. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  118. package/dist/memory-projection-store.d.ts +1 -1
  119. package/dist/memory-provenance.d.ts +1 -1
  120. package/dist/memory-worth-outcomes.d.ts +1 -1
  121. package/dist/models-json.d.ts +1 -1
  122. package/dist/namespaces/migrate.d.ts +1 -1
  123. package/dist/namespaces/migrate.js +12 -11
  124. package/dist/namespaces/principal.d.ts +1 -1
  125. package/dist/namespaces/search.d.ts +1 -1
  126. package/dist/namespaces/search.js +9 -8
  127. package/dist/namespaces/storage.d.ts +1 -1
  128. package/dist/namespaces/storage.js +4 -3
  129. package/dist/native-knowledge.d.ts +1 -1
  130. package/dist/operator-toolkit.d.ts +1 -1
  131. package/dist/operator-toolkit.js +14 -13
  132. package/dist/{orchestrator-D1wcmPNj.d.ts → orchestrator-Cg1UkvmO.d.ts} +2 -2
  133. package/dist/orchestrator.d.ts +3 -3
  134. package/dist/orchestrator.js +20 -20
  135. package/dist/patterns-cli.d.ts +1 -1
  136. package/dist/policy-runtime.d.ts +1 -1
  137. package/dist/qmd-recall-cache.d.ts +5 -2
  138. package/dist/qmd-recall-cache.js +3 -1
  139. package/dist/qmd.d.ts +17 -1
  140. package/dist/qmd.js +4 -3
  141. package/dist/recall-disclosure-escalation.d.ts +1 -1
  142. package/dist/recall-explain-renderer.d.ts +2 -1
  143. package/dist/recall-planner-llm.d.ts +1 -1
  144. package/dist/recall-state.d.ts +17 -1
  145. package/dist/recall-state.js +1 -1
  146. package/dist/recall-tag-filter.d.ts +1 -1
  147. package/dist/recall-xray-cli.d.ts +1 -1
  148. package/dist/recall-xray-renderer.d.ts +1 -1
  149. package/dist/recall-xray.d.ts +1 -1
  150. package/dist/resolve-auth-token.d.ts +1 -1
  151. package/dist/retrieval-agents.d.ts +1 -1
  152. package/dist/retrieval-tiers.d.ts +1 -1
  153. package/dist/routing/engine.d.ts +1 -1
  154. package/dist/routing/store.d.ts +1 -1
  155. package/dist/schemas.d.ts +24 -24
  156. package/dist/search/embed-helper.d.ts +1 -1
  157. package/dist/search/factory.d.ts +1 -1
  158. package/dist/search/factory.js +8 -7
  159. package/dist/search/index.d.ts +1 -1
  160. package/dist/search/index.js +8 -7
  161. package/dist/search/lancedb-backend.d.ts +1 -1
  162. package/dist/search/lancedb-backend.js +2 -2
  163. package/dist/search/meilisearch-backend.d.ts +1 -1
  164. package/dist/search/meilisearch-backend.js +2 -2
  165. package/dist/search/noop-backend.d.ts +1 -1
  166. package/dist/search/orama-backend.d.ts +1 -1
  167. package/dist/search/orama-backend.js +2 -2
  168. package/dist/search/port.d.ts +21 -2
  169. package/dist/search/port.js +1 -1
  170. package/dist/search/remote-backend.d.ts +1 -1
  171. package/dist/{semantic-consolidation-MWOdNtSE.d.ts → semantic-consolidation-BICZvQ3C.d.ts} +1 -1
  172. package/dist/semantic-consolidation.d.ts +2 -2
  173. package/dist/semantic-consolidation.js +5 -4
  174. package/dist/semantic-rule-promotion.js +4 -3
  175. package/dist/semantic-rule-verifier.d.ts +1 -1
  176. package/dist/semantic-rule-verifier.js +4 -3
  177. package/dist/session-observer-bands.d.ts +1 -1
  178. package/dist/session-observer-state.d.ts +1 -1
  179. package/dist/shared-context/manager.d.ts +1 -1
  180. package/dist/signal.d.ts +1 -1
  181. package/dist/storage.d.ts +1 -1
  182. package/dist/storage.js +3 -2
  183. package/dist/summarizer.d.ts +1 -1
  184. package/dist/summary-snapshot.d.ts +1 -1
  185. package/dist/temporal-supersession.d.ts +1 -1
  186. package/dist/temporal-validity.d.ts +1 -1
  187. package/dist/threading.d.ts +1 -1
  188. package/dist/tier-migration.d.ts +1 -1
  189. package/dist/tier-routing.d.ts +1 -1
  190. package/dist/topics.d.ts +1 -1
  191. package/dist/transcript.d.ts +1 -1
  192. package/dist/{types-CgcCpUrf.d.ts → types-D96bCB3C.d.ts} +1 -1
  193. package/dist/types.d.ts +1 -1
  194. package/dist/utility-runtime.d.ts +1 -1
  195. package/dist/verified-recall.js +4 -3
  196. package/package.json +1 -1
  197. package/src/memory-cache.test.ts +30 -0
  198. package/src/memory-cache.ts +129 -16
  199. package/src/namespaces/search.ts +16 -0
  200. package/src/orchestrator.ts +144 -3
  201. package/src/qmd-recall-cache.ts +6 -0
  202. package/src/qmd.ts +131 -18
  203. package/src/recall-state.ts +47 -21
  204. package/src/search/port.ts +25 -0
  205. package/src/storage.ts +27 -3
  206. package/dist/chunk-4PLOQDBB.js.map +0 -1
  207. package/dist/chunk-7VWDC7AD.js.map +0 -1
  208. package/dist/chunk-CPPS65WS.js.map +0 -1
  209. package/dist/chunk-EKQMQQ3U.js.map +0 -1
  210. package/dist/chunk-FWIROLS6.js.map +0 -1
  211. package/dist/chunk-M3VYPE2H.js.map +0 -1
  212. package/dist/chunk-QRSKPI62.js.map +0 -1
  213. /package/dist/{chunk-5PFIMBJJ.js.map → chunk-4SYURHI6.js.map} +0 -0
  214. /package/dist/{chunk-2VCTTEJM.js.map → chunk-5G2DNO54.js.map} +0 -0
  215. /package/dist/{chunk-3R6OP33G.js.map → chunk-7F7LC6HW.js.map} +0 -0
  216. /package/dist/{chunk-ZCMO46YY.js.map → chunk-A7EF2XRO.js.map} +0 -0
  217. /package/dist/{chunk-BNUAOLDK.js.map → chunk-ANJOULTP.js.map} +0 -0
  218. /package/dist/{chunk-QFKRE7AU.js.map → chunk-BP5O3GYD.js.map} +0 -0
  219. /package/dist/{chunk-BKRIAXTU.js.map → chunk-D2EFNQMY.js.map} +0 -0
  220. /package/dist/{chunk-6M4LYWA2.js.map → chunk-D44FQVCU.js.map} +0 -0
  221. /package/dist/{chunk-SSSXWIBP.js.map → chunk-EMSC4P66.js.map} +0 -0
  222. /package/dist/{chunk-MBZAESQ3.js.map → chunk-F6O7IOS3.js.map} +0 -0
  223. /package/dist/{chunk-6G5JEN55.js.map → chunk-FZC2WSDB.js.map} +0 -0
  224. /package/dist/{chunk-KI6QM5AV.js.map → chunk-GY3V3SUI.js.map} +0 -0
  225. /package/dist/{chunk-VJYFXDCZ.js.map → chunk-NMPEJV5M.js.map} +0 -0
  226. /package/dist/{chunk-7KSPKZIQ.js.map → chunk-PXVFMQLD.js.map} +0 -0
  227. /package/dist/{chunk-FIS5RT6K.js.map → chunk-QXHBWFR3.js.map} +0 -0
  228. /package/dist/{chunk-G2VVBWFU.js.map → chunk-RQGR3ETH.js.map} +0 -0
  229. /package/dist/{chunk-GGL7R2L2.js.map → chunk-RQRKQJYM.js.map} +0 -0
  230. /package/dist/{chunk-JI3LQFJH.js.map → chunk-TBLGI2LT.js.map} +0 -0
  231. /package/dist/{chunk-RVT6U6PV.js.map → chunk-TWAJICBN.js.map} +0 -0
  232. /package/dist/{chunk-46RXRASB.js.map → chunk-TYIXG4VR.js.map} +0 -0
  233. /package/dist/{chunk-5PLUC5OB.js.map → chunk-WSQG37DV.js.map} +0 -0
  234. /package/dist/{chunk-GRYAECRV.js.map → chunk-ZJH723NM.js.map} +0 -0
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  NamespaceStorageRouter
3
- } from "./chunk-JI3LQFJH.js";
3
+ } from "./chunk-TBLGI2LT.js";
4
4
  import {
5
5
  namespaceCollectionName
6
- } from "./chunk-EKQMQQ3U.js";
6
+ } from "./chunk-LFZUFZQR.js";
7
7
  import {
8
8
  namespaceIdentityFromToken,
9
9
  namespaceIdentityToken
10
10
  } from "./chunk-ZFXCQPNO.js";
11
11
  import {
12
12
  ALL_CATEGORY_DIRS
13
- } from "./chunk-4PLOQDBB.js";
13
+ } from "./chunk-AX5O25EF.js";
14
14
  import {
15
15
  isSafeRouteNamespace
16
16
  } from "./chunk-U3PN77QT.js";
@@ -204,4 +204,4 @@ export {
204
204
  verifyNamespaces,
205
205
  runNamespaceMigration
206
206
  };
207
- //# sourceMappingURL=chunk-QFKRE7AU.js.map
207
+ //# sourceMappingURL=chunk-BP5O3GYD.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPostConsolidationMaterialize
3
- } from "./chunk-BNUAOLDK.js";
3
+ } from "./chunk-ANJOULTP.js";
4
4
  import {
5
5
  discoverMemoryExtensions,
6
6
  renderExtensionsBlock,
@@ -217,4 +217,4 @@ export {
217
217
  buildExtensionsBlockForConsolidation,
218
218
  materializeAfterSemanticConsolidation
219
219
  };
220
- //# sourceMappingURL=chunk-BKRIAXTU.js.map
220
+ //# sourceMappingURL=chunk-D2EFNQMY.js.map
@@ -27,7 +27,7 @@ import {
27
27
  listMemoryGovernanceRuns,
28
28
  readMemoryGovernanceRunArtifact,
29
29
  runMemoryGovernance
30
- } from "./chunk-ZCMO46YY.js";
30
+ } from "./chunk-A7EF2XRO.js";
31
31
  import {
32
32
  clusterByKey,
33
33
  combineNamespaces,
@@ -55,7 +55,7 @@ import {
55
55
  } from "./chunk-2MXEVL75.js";
56
56
  import {
57
57
  namespaceCollectionName
58
- } from "./chunk-EKQMQQ3U.js";
58
+ } from "./chunk-LFZUFZQR.js";
59
59
  import {
60
60
  namespaceIdentityFromToken
61
61
  } from "./chunk-ZFXCQPNO.js";
@@ -94,10 +94,10 @@ import {
94
94
  buildBriefing,
95
95
  parseBriefingFocus,
96
96
  parseBriefingWindow
97
- } from "./chunk-KI6QM5AV.js";
97
+ } from "./chunk-GY3V3SUI.js";
98
98
  import {
99
99
  parseEntityFile
100
- } from "./chunk-4PLOQDBB.js";
100
+ } from "./chunk-AX5O25EF.js";
101
101
  import {
102
102
  DEFAULT_RECALL_DISCLOSURE,
103
103
  isRecallDisclosure
@@ -5579,4 +5579,4 @@ export {
5579
5579
  shapeMemorySummary,
5580
5580
  EngramAccessService
5581
5581
  };
5582
- //# sourceMappingURL=chunk-6M4LYWA2.js.map
5582
+ //# sourceMappingURL=chunk-D44FQVCU.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  MeilisearchBackend
3
- } from "./chunk-6G5JEN55.js";
3
+ } from "./chunk-FZC2WSDB.js";
4
4
  import {
5
5
  NoopSearchBackend
6
6
  } from "./chunk-CYEPCZN5.js";
7
7
  import {
8
8
  OramaBackend
9
- } from "./chunk-GRYAECRV.js";
9
+ } from "./chunk-ZJH723NM.js";
10
10
  import {
11
11
  RemoteSearchBackend
12
12
  } from "./chunk-JOASJWQR.js";
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-RN7MUWON.js";
16
16
  import {
17
17
  LanceDbBackend
18
- } from "./chunk-5PLUC5OB.js";
18
+ } from "./chunk-WSQG37DV.js";
19
19
  import {
20
20
  createConversationIndexBackend
21
21
  } from "./chunk-7OGJQP7T.js";
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-E6ZDCOHM.js";
25
25
  import {
26
26
  QmdClient
27
- } from "./chunk-QRSKPI62.js";
27
+ } from "./chunk-34NSUPWS.js";
28
28
  import {
29
29
  log
30
30
  } from "./chunk-2ODBA7MQ.js";
@@ -170,4 +170,4 @@ export {
170
170
  createConversationSearchBackend,
171
171
  createConversationIndexRuntime
172
172
  };
173
- //# sourceMappingURL=chunk-SSSXWIBP.js.map
173
+ //# sourceMappingURL=chunk-EMSC4P66.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-SFQ6QNL7.js";
7
7
  import {
8
8
  StorageManager
9
- } from "./chunk-4PLOQDBB.js";
9
+ } from "./chunk-AX5O25EF.js";
10
10
  import {
11
11
  buildLifecycleEventsForMemory,
12
12
  sortMemoryLifecycleEvents
@@ -74,4 +74,4 @@ export {
74
74
  backupExistingLedger,
75
75
  rebuildMemoryLifecycleLedger
76
76
  };
77
- //# sourceMappingURL=chunk-MBZAESQ3.js.map
77
+ //# sourceMappingURL=chunk-F6O7IOS3.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-CINZGPSJ.js";
8
8
  import {
9
9
  resolveEnsureCollectionArgs
10
- } from "./chunk-M3VYPE2H.js";
10
+ } from "./chunk-YNQ6DFSV.js";
11
11
  import {
12
12
  log
13
13
  } from "./chunk-2ODBA7MQ.js";
@@ -245,4 +245,4 @@ function isMeilisearchIndexNotFoundError(err) {
245
245
  export {
246
246
  MeilisearchBackend
247
247
  };
248
- //# sourceMappingURL=chunk-6G5JEN55.js.map
248
+ //# sourceMappingURL=chunk-FZC2WSDB.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  StorageManager,
3
3
  normalizeEntityName
4
- } from "./chunk-4PLOQDBB.js";
4
+ } from "./chunk-AX5O25EF.js";
5
5
  import {
6
6
  extractJsonCandidates
7
7
  } from "./chunk-RGMVMVMF.js";
@@ -870,4 +870,4 @@ export {
870
870
  resolveBriefingSaveDir,
871
871
  briefingFilename
872
872
  };
873
- //# sourceMappingURL=chunk-KI6QM5AV.js.map
873
+ //# sourceMappingURL=chunk-GY3V3SUI.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSearchBackend
3
- } from "./chunk-SSSXWIBP.js";
3
+ } from "./chunk-EMSC4P66.js";
4
4
  import {
5
5
  namespaceIdentityToken,
6
6
  normalizeNamespaceIdentity
@@ -43,6 +43,14 @@ var NamespaceSearchRouter = class {
43
43
  namespaces.map(async (namespace) => {
44
44
  const record = await this.backendRecordFor(namespace);
45
45
  if (!record.available || record.collectionState === "missing") {
46
+ try {
47
+ options.execution?.onDegradation?.({
48
+ backend: "qmd",
49
+ code: "backend_unavailable",
50
+ detail: record.collectionState === "missing" ? `namespace collection missing: ${namespace}` : `namespace backend unavailable: ${namespace}`
51
+ });
52
+ } catch {
53
+ }
46
54
  return { namespace, results: [] };
47
55
  }
48
56
  const backendLimit = backendSearchLimit(record, maxResults);
@@ -393,4 +401,4 @@ export {
393
401
  namespaceCollectionName,
394
402
  NamespaceSearchRouter
395
403
  };
396
- //# sourceMappingURL=chunk-EKQMQQ3U.js.map
404
+ //# sourceMappingURL=chunk-LFZUFZQR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/namespaces/search.ts"],"sourcesContent":["import path from \"node:path\";\nimport type { PluginConfig, QmdSearchResult } from \"../types.js\";\nimport type {\n SearchBackend,\n SearchExecutionOptions,\n SearchQueryOptions,\n} from \"../search/port.js\";\nimport { createSearchBackend } from \"../search/factory.js\";\nimport { namespaceIdentityToken, normalizeNamespaceIdentity } from \"./identity.js\";\n\nconst NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR = 4;\nconst NESTED_NAMESPACE_FILTER_OVERFETCH_MIN = 50;\n\nexport function namespaceCollectionName(\n baseCollection: string,\n namespace: string,\n options?: {\n defaultNamespace?: string;\n useLegacyDefaultCollection?: boolean;\n },\n): string {\n const trimmed = normalizeNamespaceIdentity(namespace);\n const defaultNamespace = normalizeNamespaceIdentity(options?.defaultNamespace ?? \"\") || \"default\";\n if (\n options?.useLegacyDefaultCollection === true &&\n trimmed === defaultNamespace\n ) {\n return baseCollection;\n }\n\n return `${baseCollection}--${namespaceIdentityToken(trimmed || defaultNamespace)}`;\n}\n\ntype StorageRouterLike = {\n storageFor(namespace: string): Promise<{ dir: string }>;\n};\n\ntype NamespaceBackendRecord = {\n backend: SearchBackend;\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: CollectionState;\n filtersNestedNamespaces: boolean;\n};\n\nexport interface NamespaceUpdateResult {\n backendCount: number;\n eligibleNamespaces: string[];\n}\n\nexport type CollectionState = \"present\" | \"missing\" | \"unknown\" | \"skipped\";\n\nexport interface NamespaceSearchHealth {\n collection: string;\n memoryDir: string;\n available: boolean;\n collectionState: CollectionState;\n debugStatus: string;\n installedVersion: string | null;\n supportedVersion: string | null;\n supported: boolean | null;\n upgradeAvailable: boolean | null;\n doctorAvailable: boolean | null;\n daemonMode: boolean | null;\n}\n\ntype NamespaceScopedSearchConfig = PluginConfig & {\n hostEmbeddingProviderScope?: string;\n};\n\ntype BackendRecordOptions = {\n autoCreateCollection: boolean;\n abortAsUnavailable: boolean;\n failOpenMissingGuardedCollection: boolean;\n};\n\nexport class NamespaceSearchRouter {\n private readonly cache = new Map<string, Promise<NamespaceBackendRecord>>();\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storageRouter: StorageRouterLike,\n private readonly createBackend: (config: PluginConfig) => SearchBackend = createSearchBackend,\n ) {}\n\n async collectionForNamespace(namespace: string): Promise<string> {\n return (await this.backendRecordFor(namespace)).collection;\n }\n\n async searchAcrossNamespaces(options: {\n query: string;\n namespaces: string[];\n maxResults?: number;\n mode?: \"search\" | \"hybrid\" | \"bm25\" | \"vector\";\n searchOptions?: SearchQueryOptions;\n execution?: SearchExecutionOptions;\n }): Promise<QmdSearchResult[]> {\n const query = options.query.trim();\n if (!query) return [];\n const maxResults = Math.max(0, Math.floor(options.maxResults ?? this.config.qmdMaxResults));\n if (maxResults === 0) return [];\n\n const method = options.mode ?? \"search\";\n const namespaces = Array.from(new Set(options.namespaces.map((value) => value.trim()).filter(Boolean)));\n if (namespaces.length === 0) return [];\n\n const resultsByNamespace = await Promise.all(\n namespaces.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") {\n // A per-namespace backend that is unavailable (or missing its\n // collection) must report like any other QMD skip (#1536): its\n // empty contribution is otherwise indistinguishable from a true\n // no-matches for that namespace (codex round-5 review on #1544).\n try {\n options.execution?.onDegradation?.({\n backend: \"qmd\",\n code: \"backend_unavailable\",\n detail:\n record.collectionState === \"missing\"\n ? `namespace collection missing: ${namespace}`\n : `namespace backend unavailable: ${namespace}`,\n });\n } catch {\n // Observers must never break search.\n }\n return { namespace, results: [] as QmdSearchResult[] };\n }\n const backendLimit = backendSearchLimit(record, maxResults);\n let results: QmdSearchResult[];\n switch (method) {\n case \"hybrid\":\n results = await record.backend.hybridSearch(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n case \"bm25\":\n results = await record.backend.bm25Search(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n case \"vector\":\n results = await record.backend.vectorSearch(\n query,\n record.collection,\n backendLimit,\n options.execution,\n );\n break;\n default:\n results = await record.backend.search(\n query,\n record.collection,\n backendLimit,\n options.searchOptions,\n options.execution,\n );\n break;\n }\n results = filterNamespaceSubtreeResults(record, results);\n return { namespace, results };\n }),\n );\n\n return mergeNamespaceSearchResults(resultsByNamespace, maxResults);\n }\n\n /**\n * Update all namespace backends.\n * Returns the number of backends for which an update was attempted\n * (i.e., available and collection present). Callers can treat 0 as a\n * signal that no backend was eligible — useful for success-verification in\n * startup-sync when namespacesEnabled is true.\n */\n async updateNamespaces(\n namespaces: string[],\n execution?: SearchExecutionOptions,\n options?: { strict?: boolean },\n ): Promise<number> {\n return (await this.updateNamespacesDetailed(namespaces, execution, options)).backendCount;\n }\n\n async updateNamespacesDetailed(\n namespaces: string[],\n execution?: SearchExecutionOptions,\n options?: { strict?: boolean },\n ): Promise<NamespaceUpdateResult> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n const eligible = (await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n return record.available && record.collectionState !== \"missing\"\n ? { namespace, record }\n : null;\n }),\n )).filter((entry): entry is { namespace: string; record: NamespaceBackendRecord } => entry !== null);\n\n const globalEntry = eligible.find(({ record }) => record.backend.updatesAllCollections?.() === true);\n const scopedEntries = globalEntry\n ? eligible.filter(({ record }) => record.backend.updatesAllCollections?.() !== true)\n : eligible;\n\n await Promise.all([\n globalEntry\n ? updateBackendRecord(globalEntry.record, execution, options)\n : Promise.resolve(),\n ...scopedEntries.map(({ record }) => updateBackendRecord(record, execution, options)),\n ]);\n\n return {\n backendCount: (globalEntry ? 1 : 0) + scopedEntries.length,\n eligibleNamespaces: eligible.map(({ namespace }) => namespace),\n };\n }\n\n async embedNamespaces(namespaces: string[], options?: { strict?: boolean }): Promise<void> {\n const unique = Array.from(new Set(namespaces.map((value) => value.trim()).filter(Boolean)));\n await Promise.all(\n unique.map(async (namespace) => {\n const record = await this.backendRecordFor(namespace);\n if (!record.available || record.collectionState === \"missing\") return;\n await embedBackendRecord(record, options);\n }),\n );\n }\n\n async ensureNamespaceCollection(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\"> {\n const record = await this.backendRecordFor(namespace, execution);\n return record.collectionState;\n }\n\n async healthForNamespace(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceSearchHealth> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const record = await this.createBackendRecordFor(\n key,\n execution,\n {\n autoCreateCollection: false,\n abortAsUnavailable: true,\n failOpenMissingGuardedCollection: false,\n },\n );\n try {\n const liveRecord = await this.liveCachedRecordForHealth(key, record, execution);\n const diagnosticBackend = liveRecord?.backend ?? record.backend;\n const versionStatus =\n \"getVersionStatus\" in diagnosticBackend &&\n typeof diagnosticBackend.getVersionStatus === \"function\"\n ? diagnosticBackend.getVersionStatus()\n : null;\n const daemonMode = daemonModeForBackend(diagnosticBackend);\n const collectionState =\n liveRecord?.collectionState === \"missing\"\n ? \"missing\"\n : record.collectionState;\n\n return {\n collection: record.collection,\n memoryDir: record.memoryDir,\n available: liveRecord?.available ?? record.available,\n collectionState,\n debugStatus: diagnosticBackend.debugStatus(),\n installedVersion: versionStatus?.installedVersion ?? null,\n supportedVersion: versionStatus?.supportedVersion ?? null,\n supported: versionStatus?.supported ?? null,\n upgradeAvailable: versionStatus?.upgradeAvailable ?? null,\n doctorAvailable: versionStatus?.capabilities?.doctor ?? null,\n daemonMode,\n };\n } finally {\n const dispose = (record.backend as { dispose?: () => void | Promise<void> }).dispose;\n await dispose?.call(record.backend);\n }\n }\n\n private async liveCachedRecordForHealth(\n key: string,\n disposableRecord: NamespaceBackendRecord,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceBackendRecord | null> {\n const pending = this.cache.get(key);\n if (!pending) return null;\n const cachedRecord = await awaitWithAbort(pending, execution?.signal).catch(() => null);\n if (!cachedRecord) return null;\n if (cachedRecord.collection !== disposableRecord.collection) return null;\n if (cachedRecord.memoryDir !== disposableRecord.memoryDir) return null;\n return cachedRecord;\n }\n\n /** Clear cached backend records so the next access re-probes availability. */\n clearCache(): void {\n this.cache.clear();\n }\n\n /** Release any per-namespace backend handles held by cached records. */\n async dispose(): Promise<void> {\n const pendingRecords = Array.from(this.cache.values());\n this.cache.clear();\n const settled = await Promise.allSettled(pendingRecords);\n await Promise.allSettled(\n settled.flatMap((entry) => {\n if (entry.status !== \"fulfilled\") return [];\n const dispose = (entry.value.backend as { dispose?: () => void | Promise<void> }).dispose;\n return dispose ? [dispose.call(entry.value.backend)] : [];\n }),\n );\n }\n\n private async backendRecordFor(\n namespace: string,\n execution?: SearchExecutionOptions,\n ): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const existing = this.cache.get(key);\n if (existing) return await existing;\n\n const pending = this.createBackendRecordFor(key, execution, {\n autoCreateCollection: true,\n abortAsUnavailable: false,\n failOpenMissingGuardedCollection: true,\n }).catch((error) => {\n this.cache.delete(key);\n throw error;\n });\n\n this.cache.set(key, pending);\n return await pending;\n }\n\n private async createBackendRecordFor(\n namespace: string,\n execution: SearchExecutionOptions | undefined,\n options: BackendRecordOptions,\n ): Promise<NamespaceBackendRecord> {\n const key = namespace.trim() || this.config.defaultNamespace;\n const storage = await this.storageRouter.storageFor(key);\n const useLegacyDefaultCollection =\n key === this.config.defaultNamespace && storage.dir === this.config.memoryDir;\n const filtersNestedNamespaces =\n this.config.namespacesEnabled === true && useLegacyDefaultCollection;\n const rootHostEmbeddingScope =\n (this.config as NamespaceScopedSearchConfig).hostEmbeddingProviderScope ??\n this.config.memoryDir;\n const scopedConfig: NamespaceScopedSearchConfig = {\n ...this.config,\n memoryDir: storage.dir,\n hostEmbeddingProviderScope: rootHostEmbeddingScope,\n qmdCollection: namespaceCollectionName(this.config.qmdCollection, key, {\n defaultNamespace: this.config.defaultNamespace,\n useLegacyDefaultCollection,\n }),\n };\n\n const backend = this.createBackend(scopedConfig);\n try {\n const availabilityProbe =\n options.autoCreateCollection || typeof backend.checkAvailability !== \"function\"\n ? backend.probe()\n : backend.checkAvailability({ signal: execution?.signal });\n const available = await awaitWithAbort(availabilityProbe, execution?.signal).catch((error) => {\n if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {\n throw error;\n }\n return false;\n });\n const collectionState = available\n ? await awaitWithAbort(\n this.collectionStateForBackend(backend, storage.dir, scopedConfig.qmdCollection, {\n autoCreate: options.autoCreateCollection,\n failOpenMissingGuardedCollection: options.failOpenMissingGuardedCollection,\n skipAutoCreate: filtersNestedNamespaces,\n execution,\n }),\n execution?.signal,\n ).catch((error) => {\n if (error instanceof NamespaceSearchAbortError && !options.abortAsUnavailable) {\n throw error;\n }\n return \"unknown\" as const;\n })\n : \"unknown\";\n return {\n backend,\n collection: scopedConfig.qmdCollection,\n memoryDir: storage.dir,\n available,\n collectionState,\n filtersNestedNamespaces,\n };\n } catch (error) {\n const dispose = (backend as { dispose?: () => void | Promise<void> }).dispose;\n if (dispose) {\n await Promise.resolve(dispose.call(backend)).catch(() => {});\n }\n throw error;\n }\n }\n\n private async collectionStateForBackend(\n backend: SearchBackend,\n memoryDir: string,\n collection: string,\n options: {\n autoCreate: boolean;\n failOpenMissingGuardedCollection: boolean;\n skipAutoCreate: boolean;\n execution?: SearchExecutionOptions;\n },\n ): Promise<CollectionState> {\n if (!options.autoCreate || options.skipAutoCreate) {\n if (!backend.checkCollection) return \"unknown\";\n const collectionState = await backend\n .checkCollection(collection, options.execution)\n .catch(() => \"unknown\" as const);\n return options.failOpenMissingGuardedCollection && collectionState === \"missing\"\n ? \"unknown\"\n : collectionState;\n }\n return await backend.ensureCollection(memoryDir, collection, options.execution).catch(() => \"unknown\" as const);\n }\n}\n\nclass NamespaceSearchAbortError extends Error {\n constructor() {\n super(\"operation aborted\");\n }\n}\n\nfunction awaitWithAbort<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return operation;\n if (signal.aborted) return Promise.reject(new NamespaceSearchAbortError());\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(new NamespaceSearchAbortError());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nfunction filterNamespaceSubtreeResults(\n record: NamespaceBackendRecord,\n results: QmdSearchResult[],\n): QmdSearchResult[] {\n if (!record.filtersNestedNamespaces) return results;\n return results.filter((result) =>\n !pathIsInsideNamespaceSubtree(record.memoryDir, record.collection, result.path)\n );\n}\n\nfunction backendSearchLimit(\n record: NamespaceBackendRecord,\n maxResults: number,\n): number {\n if (!record.filtersNestedNamespaces) return maxResults;\n return Math.max(\n maxResults,\n maxResults * NESTED_NAMESPACE_FILTER_OVERFETCH_FACTOR,\n NESTED_NAMESPACE_FILTER_OVERFETCH_MIN,\n );\n}\n\nasync function updateBackendRecord(\n record: NamespaceBackendRecord,\n execution?: SearchExecutionOptions,\n options?: { strict?: boolean },\n): Promise<void> {\n if (options?.strict === true) {\n if (\n record.backend.updatesAllCollections?.() === true &&\n typeof record.backend.updateStrict === \"function\"\n ) {\n await record.backend.updateStrict(execution);\n return;\n }\n if (typeof record.backend.updateCollectionStrict === \"function\") {\n await record.backend.updateCollectionStrict(record.collection, execution);\n return;\n }\n }\n await record.backend.update(execution);\n}\n\nasync function embedBackendRecord(\n record: NamespaceBackendRecord,\n options?: { strict?: boolean },\n): Promise<void> {\n if (options?.strict === true) {\n if (typeof record.backend.embedCollectionStrict === \"function\") {\n await record.backend.embedCollectionStrict(record.collection);\n return;\n }\n if (typeof record.backend.embedStrict === \"function\") {\n await record.backend.embedStrict();\n return;\n }\n }\n if (typeof record.backend.embedCollection === \"function\") {\n await record.backend.embedCollection(record.collection);\n return;\n }\n await record.backend.embed();\n}\n\nfunction daemonModeForBackend(backend: SearchBackend): boolean | null {\n return \"isDaemonMode\" in backend && typeof backend.isDaemonMode === \"function\"\n ? backend.isDaemonMode() === true\n : null;\n}\n\nfunction pathIsInsideNamespaceSubtree(\n memoryDir: string,\n collection: string,\n resultPath: string | undefined,\n): boolean {\n if (!resultPath) return false;\n const normalizedResultPath = normalizeQmdResultPath(resultPath, collection);\n const memoryRoot = path.resolve(memoryDir);\n const namespacesRoot = path.join(memoryRoot, \"namespaces\");\n const candidate = path.isAbsolute(normalizedResultPath)\n ? path.normalize(normalizedResultPath)\n : path.resolve(memoryRoot, normalizedResultPath);\n const relative = path.relative(namespacesRoot, candidate);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction normalizeQmdResultPath(resultPath: string, collection: string): string {\n let value = resultPath.trim();\n if (value.startsWith(\"qmd://\")) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol === \"qmd:\" && parsed.hostname === collection) {\n value = decodeURIComponent(parsed.pathname.replace(/^\\/+/, \"\"));\n }\n } catch {\n const remainder = value.slice(\"qmd://\".length);\n const slashIndex = remainder.indexOf(\"/\");\n if (slashIndex !== -1) {\n value = remainder.slice(slashIndex + 1);\n }\n }\n }\n\n const collectionPrefix = `${collection}/`;\n if (value.startsWith(collectionPrefix)) {\n value = value.slice(collectionPrefix.length);\n }\n return value;\n}\n\nfunction mergeNamespaceSearchResults(\n lists: Array<{ namespace: string; results: QmdSearchResult[] }>,\n maxResults: number,\n): QmdSearchResult[] {\n const merged = new Map<string, QmdSearchResult>();\n\n for (const { namespace, results } of lists) {\n for (const result of results) {\n const key = `${namespace}\\0${result.path || result.docid}`;\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, result);\n continue;\n }\n if (result.score > existing.score) {\n merged.set(key, {\n ...result,\n snippet: existing.snippet || result.snippet || \"\",\n });\n }\n }\n }\n\n return [...merged.values()]\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n}\n"],"mappings":"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","names":[]}
@@ -29,7 +29,7 @@ import {
29
29
  import {
30
30
  CompoundingEngine,
31
31
  defaultTierMigrationCycleBudget
32
- } from "./chunk-RVT6U6PV.js";
32
+ } from "./chunk-TWAJICBN.js";
33
33
  import {
34
34
  SharedContextManager
35
35
  } from "./chunk-DRD2Q7HQ.js";
@@ -113,12 +113,7 @@ import {
113
113
  LastRecallStore,
114
114
  TierMigrationStatusStore,
115
115
  clampGraphRecallExpandedEntries
116
- } from "./chunk-FWIROLS6.js";
117
- import {
118
- buildQmdRecallCacheKey,
119
- getCachedQmdRecall,
120
- setCachedQmdRecall
121
- } from "./chunk-SCPFRKIT.js";
116
+ } from "./chunk-44VFF3BB.js";
122
117
  import {
123
118
  applyReasoningTraceBoost
124
119
  } from "./chunk-ZZTOURJI.js";
@@ -175,7 +170,7 @@ import {
175
170
  buildEntityRecallSection,
176
171
  entityRecentTranscriptLookbackHours,
177
172
  readRecentEntityTranscriptEntries
178
- } from "./chunk-G2VVBWFU.js";
173
+ } from "./chunk-RQGR3ETH.js";
179
174
  import {
180
175
  buildEventOrderRecallSection,
181
176
  shouldRecallEventOrderEvidence
@@ -210,7 +205,7 @@ import {
210
205
  materializeAfterSemanticConsolidation,
211
206
  parseConsolidationResponse,
212
207
  parseOperatorAwareConsolidationResponse
213
- } from "./chunk-BKRIAXTU.js";
208
+ } from "./chunk-D2EFNQMY.js";
214
209
  import {
215
210
  normalizeReplaySessionKey
216
211
  } from "./chunk-2PRQG7PV.js";
@@ -220,14 +215,14 @@ import {
220
215
  import {
221
216
  compareVerifiedEpisodeResults,
222
217
  searchVerifiedEpisodes
223
- } from "./chunk-46RXRASB.js";
218
+ } from "./chunk-TYIXG4VR.js";
224
219
  import {
225
220
  ThreadingManager
226
221
  } from "./chunk-W4RVMTHR.js";
227
222
  import {
228
223
  compareVerifiedSemanticRuleResults,
229
224
  searchVerifiedSemanticRules
230
- } from "./chunk-VJYFXDCZ.js";
225
+ } from "./chunk-NMPEJV5M.js";
231
226
  import {
232
227
  searchWorkProductLedgerEntries
233
228
  } from "./chunk-ZRWB5D4H.js";
@@ -241,7 +236,7 @@ import {
241
236
  NamespaceStorageRouter,
242
237
  resolveDefaultNamespaceRoot,
243
238
  resolveNamespaceStorageRoot
244
- } from "./chunk-JI3LQFJH.js";
239
+ } from "./chunk-TBLGI2LT.js";
245
240
  import {
246
241
  isAboveImportanceThreshold,
247
242
  scoreImportance
@@ -324,11 +319,11 @@ import {
324
319
  } from "./chunk-2MXEVL75.js";
325
320
  import {
326
321
  NamespaceSearchRouter
327
- } from "./chunk-EKQMQQ3U.js";
322
+ } from "./chunk-LFZUFZQR.js";
328
323
  import {
329
324
  createConversationIndexRuntime,
330
325
  createSearchBackend
331
- } from "./chunk-SSSXWIBP.js";
326
+ } from "./chunk-EMSC4P66.js";
332
327
  import {
333
328
  NoopSearchBackend
334
329
  } from "./chunk-CYEPCZN5.js";
@@ -342,7 +337,7 @@ import {
342
337
  } from "./chunk-OIF36KGD.js";
343
338
  import {
344
339
  parseQmdExplain
345
- } from "./chunk-QRSKPI62.js";
340
+ } from "./chunk-34NSUPWS.js";
346
341
  import {
347
342
  objectiveStateStoreOverrideForNamespace,
348
343
  searchObjectiveStateSnapshots
@@ -361,7 +356,7 @@ import {
361
356
  } from "./chunk-Y56J7CXW.js";
362
357
  import {
363
358
  buildChainFollowupGenerator
364
- } from "./chunk-KI6QM5AV.js";
359
+ } from "./chunk-GY3V3SUI.js";
365
360
  import {
366
361
  ALL_CATEGORY_DIRS,
367
362
  ContentHashIndex,
@@ -371,7 +366,7 @@ import {
371
366
  normalizeAttributePairs,
372
367
  parseEntityFile,
373
368
  stripAttributesSuffix
374
- } from "./chunk-4PLOQDBB.js";
369
+ } from "./chunk-AX5O25EF.js";
375
370
  import {
376
371
  isValidTranscriptDate,
377
372
  loadSpeakerRegistry,
@@ -387,6 +382,11 @@ import {
387
382
  import {
388
383
  confidenceTier
389
384
  } from "./chunk-AZBV4RRY.js";
385
+ import {
386
+ buildQmdRecallCacheKey,
387
+ getCachedQmdRecall,
388
+ setCachedQmdRecall
389
+ } from "./chunk-42JKGUFJ.js";
390
390
  import {
391
391
  inferMemoryStatus,
392
392
  isActiveMemoryStatus
@@ -7619,20 +7619,25 @@ ${r.snippet.trim()}
7619
7619
  fetchLimit,
7620
7620
  primarySearchOptions,
7621
7621
  {
7622
- signal: options.abortSignal
7622
+ signal: options.abortSignal,
7623
+ onDegradation: options.onDegradation
7623
7624
  }
7624
7625
  ) : await this.qmd.search(
7625
7626
  prompt,
7626
7627
  options.collection,
7627
7628
  fetchLimit,
7628
- primarySearchOptions
7629
+ primarySearchOptions,
7630
+ { onDegradation: options.onDegradation }
7629
7631
  ) : await this.searchAcrossNamespaces({
7630
7632
  query: prompt,
7631
7633
  namespaces: options.namespacesEnabled ? options.recallNamespaces : void 0,
7632
7634
  maxResults: fetchLimit,
7633
7635
  mode: "search",
7634
7636
  searchOptions: primarySearchOptions,
7635
- execution: { signal: options.abortSignal }
7637
+ execution: {
7638
+ signal: options.abortSignal,
7639
+ onDegradation: options.onDegradation
7640
+ }
7636
7641
  });
7637
7642
  lastPrimaryResultCount = primaryResults.length;
7638
7643
  lastHybridResultCount = 0;
@@ -7650,14 +7655,18 @@ ${r.snippet.trim()}
7650
7655
  options.collection,
7651
7656
  fetchLimit,
7652
7657
  {
7653
- signal: options.abortSignal
7658
+ signal: options.abortSignal,
7659
+ onDegradation: options.onDegradation
7654
7660
  }
7655
7661
  ) : await this.searchAcrossNamespaces({
7656
7662
  query: prompt,
7657
7663
  namespaces: options.namespacesEnabled ? options.recallNamespaces : void 0,
7658
7664
  maxResults: fetchLimit,
7659
7665
  mode: "hybrid",
7660
- execution: { signal: options.abortSignal }
7666
+ execution: {
7667
+ signal: options.abortSignal,
7668
+ onDegradation: options.onDegradation
7669
+ }
7661
7670
  });
7662
7671
  lastHybridResultCount = hybridResults.length;
7663
7672
  lastHybridTopUpUsed = hybridResults.length > 0;
@@ -8174,6 +8183,7 @@ ${r.snippet.trim()}
8174
8183
  }
8175
8184
  async recallInternal(prompt, sessionKey, options = {}) {
8176
8185
  const recallStart = Date.now();
8186
+ const backendDegradations = [];
8177
8187
  let asOfMs;
8178
8188
  if (typeof options.asOf === "string" && options.asOf.length > 0) {
8179
8189
  const parsed = Date.parse(options.asOf);
@@ -9655,6 +9665,19 @@ ${rows.join("\n")}
9655
9665
  const qmdPromise = observeEnrichmentPromise(
9656
9666
  (async () => {
9657
9667
  const t0 = Date.now();
9668
+ const phaseDegradationsStart = backendDegradations.length;
9669
+ const replayCachedDegradations = (value) => {
9670
+ for (const degradation of value.degradations ?? []) {
9671
+ backendDegradations.push(degradation);
9672
+ }
9673
+ };
9674
+ const reportRecallQmdUnavailable = (detail) => {
9675
+ backendDegradations.push({
9676
+ backend: "qmd",
9677
+ code: "backend_unavailable",
9678
+ detail
9679
+ });
9680
+ };
9658
9681
  if (recallResultLimit <= 0) {
9659
9682
  recordRecallSectionMetric({
9660
9683
  section: "qmd",
@@ -9703,6 +9726,7 @@ ${rows.join("\n")}
9703
9726
  success: true,
9704
9727
  timing: `${Math.max(0, Math.round(cachedQmd.ageMs))}ms-cache`
9705
9728
  });
9729
+ replayCachedDegradations(cachedQmd.value);
9706
9730
  if (queryAwarePrefilterIsEmpty) {
9707
9731
  return emptyQueryAwareQmdResult;
9708
9732
  }
@@ -9722,6 +9746,8 @@ ${rows.join("\n")}
9722
9746
  success: true,
9723
9747
  timing: `stale-cache(reprobe-cooldown:${Math.max(0, Math.round(staleQmdFallback.ageMs))}ms)`
9724
9748
  });
9749
+ reportRecallQmdUnavailable("served stale recall cache (reprobe cooldown)");
9750
+ replayCachedDegradations(staleQmdFallback.value);
9725
9751
  if (queryAwarePrefilterIsEmpty) {
9726
9752
  return emptyQueryAwareQmdResult;
9727
9753
  }
@@ -9736,6 +9762,7 @@ ${rows.join("\n")}
9736
9762
  success: true,
9737
9763
  timing: "skip(reprobe-cooldown)"
9738
9764
  });
9765
+ reportRecallQmdUnavailable("recall skipped QMD (reprobe cooldown)");
9739
9766
  return null;
9740
9767
  }
9741
9768
  this.lastQmdReprobeAtMs = now;
@@ -9751,6 +9778,8 @@ ${rows.join("\n")}
9751
9778
  success: true,
9752
9779
  timing: `stale-cache(reprobe-failed:${Math.max(0, Math.round(staleQmdFallback.ageMs))}ms)`
9753
9780
  });
9781
+ reportRecallQmdUnavailable("served stale recall cache (reprobe failed)");
9782
+ replayCachedDegradations(staleQmdFallback.value);
9754
9783
  if (queryAwarePrefilterIsEmpty) {
9755
9784
  return emptyQueryAwareQmdResult;
9756
9785
  }
@@ -9768,6 +9797,7 @@ ${rows.join("\n")}
9768
9797
  log.debug(
9769
9798
  `Search skip (re-probe failed): ${this.qmd.debugStatus()}`
9770
9799
  );
9800
+ reportRecallQmdUnavailable("recall skipped QMD (reprobe failed)");
9771
9801
  return null;
9772
9802
  }
9773
9803
  log.info(`QMD re-probe succeeded: ${this.qmd.debugStatus()}`);
@@ -9832,6 +9862,9 @@ ${rows.join("\n")}
9832
9862
  queryAwarePrefilter,
9833
9863
  searchOptions: qmdSearchOptions,
9834
9864
  abortSignal: qmdEnrichmentAbort.signal,
9865
+ onDegradation: (degradation) => {
9866
+ backendDegradations.push(degradation);
9867
+ },
9835
9868
  onDebugSnapshot: async (snapshot) => {
9836
9869
  await this.recordLastQmdRecallSnapshot({
9837
9870
  storage: profileStorage,
@@ -9871,11 +9904,15 @@ ${rows.join("\n")}
9871
9904
  maxSpecializedScore = 0;
9872
9905
  }
9873
9906
  }
9907
+ const phaseDegradations = backendDegradations.slice(
9908
+ phaseDegradationsStart
9909
+ );
9874
9910
  const result = {
9875
9911
  memoryResultsLists: [augmentedResults],
9876
9912
  globalResults: [],
9877
9913
  preAugmentTopScore,
9878
- maxSpecializedScore
9914
+ maxSpecializedScore,
9915
+ ...phaseDegradations.length > 0 ? { degradations: phaseDegradations } : {}
9879
9916
  };
9880
9917
  if (augmentedResults.length > 0 || result.globalResults.length > 0) {
9881
9918
  setCachedQmdRecall(qmdCacheKey, result, {
@@ -9902,6 +9939,8 @@ ${rows.join("\n")}
9902
9939
  success: true,
9903
9940
  timing: `stale-cache(${err instanceof Error ? err.message : String(err)})`
9904
9941
  });
9942
+ reportRecallQmdUnavailable("served stale recall cache (qmd phase error)");
9943
+ replayCachedDegradations(staleQmdFallback.value);
9905
9944
  if (queryAwarePrefilterIsEmpty) {
9906
9945
  return emptyQueryAwareQmdResult;
9907
9946
  }
@@ -9921,7 +9960,16 @@ ${rows.join("\n")}
9921
9960
  );
9922
9961
  return null;
9923
9962
  }).finally(() => qmdEnrichmentAbort.dispose()),
9924
- () => qmdEnrichmentAbort.cancel()
9963
+ () => {
9964
+ if (!options.abortSignal?.aborted) {
9965
+ backendDegradations.push({
9966
+ backend: "qmd",
9967
+ code: "deadline_exceeded",
9968
+ detail: "hot qmd enrichment abandoned (enrichment deadline)"
9969
+ });
9970
+ }
9971
+ qmdEnrichmentAbort.cancel();
9972
+ }
9925
9973
  );
9926
9974
  const transcriptPromise = (async () => {
9927
9975
  const t0 = Date.now();
@@ -11233,6 +11281,9 @@ ${tmtNode.summary}`
11233
11281
  recallMode,
11234
11282
  queryAwarePrefilter,
11235
11283
  abortSignal: options.abortSignal,
11284
+ onDegradation: (degradation) => {
11285
+ backendDegradations.push(degradation);
11286
+ },
11236
11287
  xrayPoolSizeSink: xrayColdPoolSink,
11237
11288
  deadlineAtMs: enrichmentAssemblyDeadlineAtMs,
11238
11289
  asOfMs,
@@ -11401,6 +11452,9 @@ ${tmtNode.summary}`
11401
11452
  recallMode,
11402
11453
  queryAwarePrefilter,
11403
11454
  abortSignal: options.abortSignal,
11455
+ onDegradation: (degradation) => {
11456
+ backendDegradations.push(degradation);
11457
+ },
11404
11458
  xrayPoolSizeSink: xrayColdPoolSink,
11405
11459
  deadlineAtMs: enrichmentAssemblyDeadlineAtMs,
11406
11460
  asOfMs,
@@ -11497,6 +11551,9 @@ ${tmtNode.summary}`
11497
11551
  recallMode,
11498
11552
  queryAwarePrefilter,
11499
11553
  abortSignal: options.abortSignal,
11554
+ onDegradation: (degradation) => {
11555
+ backendDegradations.push(degradation);
11556
+ },
11500
11557
  xrayPoolSizeSink: xrayColdPoolSink,
11501
11558
  deadlineAtMs: enrichmentAssemblyDeadlineAtMs,
11502
11559
  asOfMs,
@@ -11538,6 +11595,9 @@ ${tmtNode.summary}`
11538
11595
  recallMode,
11539
11596
  queryAwarePrefilter,
11540
11597
  abortSignal: options.abortSignal,
11598
+ onDegradation: (degradation) => {
11599
+ backendDegradations.push(degradation);
11600
+ },
11541
11601
  xrayPoolSizeSink: xrayColdPoolSink,
11542
11602
  deadlineAtMs: enrichmentAssemblyDeadlineAtMs,
11543
11603
  asOfMs,
@@ -11850,7 +11910,13 @@ _Context: ${topQuestion.context}_`
11850
11910
  mode: identityInjectionModeUsed,
11851
11911
  injectedChars: identityInjectedChars,
11852
11912
  truncated: identityInjectionTruncated
11853
- }
11913
+ },
11914
+ // Included at record time so the published snapshot is born
11915
+ // annotated — a post-record annotation leaves a window where
11916
+ // readers see the snapshot without degradations, and a concurrent
11917
+ // same-session recall could drop them entirely (codex + cursor
11918
+ // reviews on #1544).
11919
+ backendDegradations: backendDegradations.length > 0 ? backendDegradations : void 0
11854
11920
  }).catch((err) => log.debug(`last recall record failed: ${err}`));
11855
11921
  }
11856
11922
  if (sessionKey) {
@@ -16245,10 +16311,14 @@ ${lines.join("\n\n")}`;
16245
16311
  return [];
16246
16312
  }
16247
16313
  const deadlineRemainingMs = () => typeof options.deadlineAtMs === "number" ? Math.max(0, options.deadlineAtMs - Date.now()) : null;
16248
- const runColdStepWithinDeadline = async (label, fallback, task) => {
16314
+ const runColdStepWithinDeadline = async (label, fallback, task, onDeadline) => {
16249
16315
  throwIfRecallAborted(options.abortSignal);
16250
16316
  const remainingMs = deadlineRemainingMs();
16251
16317
  if (remainingMs === 0) {
16318
+ try {
16319
+ onDeadline?.();
16320
+ } catch {
16321
+ }
16252
16322
  log.debug(`cold-tier recall ${label} skipped: shared assembly deadline expired`);
16253
16323
  return fallback;
16254
16324
  }
@@ -16268,6 +16338,10 @@ ${lines.join("\n\n")}`;
16268
16338
  new Promise((resolve) => {
16269
16339
  timeoutHandle = setTimeout(() => {
16270
16340
  timedOut = true;
16341
+ try {
16342
+ onDeadline?.();
16343
+ } catch {
16344
+ }
16271
16345
  log.debug(
16272
16346
  `cold-tier recall ${label} skipped: shared assembly deadline expired`
16273
16347
  );
@@ -16294,6 +16368,18 @@ ${lines.join("\n\n")}`;
16294
16368
  false,
16295
16369
  0
16296
16370
  );
16371
+ let coldQmdObserverActive = true;
16372
+ const reportColdQmdDeadline = () => {
16373
+ coldQmdObserverActive = false;
16374
+ try {
16375
+ options.onDegradation?.({
16376
+ backend: "qmd",
16377
+ code: "deadline_exceeded",
16378
+ detail: "cold-tier qmd lookup abandoned (assembly deadline)"
16379
+ });
16380
+ } catch {
16381
+ }
16382
+ };
16297
16383
  longTerm = await runColdStepWithinDeadline(
16298
16384
  "qmd lookup",
16299
16385
  [],
@@ -16308,10 +16394,17 @@ ${lines.join("\n\n")}`;
16308
16394
  collection: coldCollection,
16309
16395
  queryAwarePrefilter: options.queryAwarePrefilter,
16310
16396
  searchOptions: this.buildConfiguredQmdSearchOptions(options.prompt),
16311
- abortSignal: options.abortSignal
16397
+ abortSignal: options.abortSignal,
16398
+ onDegradation: (degradation) => {
16399
+ if (coldQmdObserverActive) {
16400
+ options.onDegradation?.(degradation);
16401
+ }
16402
+ }
16312
16403
  }
16313
- )
16404
+ ),
16405
+ reportColdQmdDeadline
16314
16406
  );
16407
+ coldQmdObserverActive = false;
16315
16408
  if (longTerm.length > 0) {
16316
16409
  log.debug(
16317
16410
  `cold-tier recall source=cold-qmd collection=${coldCollection} hits=${longTerm.length}`
@@ -17242,4 +17335,4 @@ export {
17242
17335
  resolvePersistedMemoryRelativePath,
17243
17336
  Orchestrator
17244
17337
  };
17245
- //# sourceMappingURL=chunk-7VWDC7AD.js.map
17338
+ //# sourceMappingURL=chunk-MHYRRV43.js.map