@remnic/core 9.3.739 → 9.3.741

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 (183) hide show
  1. package/dist/access-boundary.js +13 -13
  2. package/dist/access-cli.js +35 -35
  3. package/dist/access-http.js +18 -18
  4. package/dist/access-mcp.js +17 -17
  5. package/dist/access-operations-batch.js +15 -15
  6. package/dist/access-operations.js +16 -16
  7. package/dist/access-service.js +12 -12
  8. package/dist/active-memory-bridge.js +3 -3
  9. package/dist/briefing.js +2 -2
  10. package/dist/buffer.js +2 -2
  11. package/dist/capabilities.d.ts +97 -1
  12. package/dist/capabilities.js +7 -1
  13. package/dist/causal-consolidation.js +4 -3
  14. package/dist/causal-consolidation.js.map +1 -1
  15. package/dist/{chunk-IFCM6OLK.js → chunk-3TUDKDTQ.js} +7 -7
  16. package/dist/{chunk-A7INTIC5.js → chunk-4J53ZVPQ.js} +3 -3
  17. package/dist/{chunk-XYUFGHUW.js → chunk-56F6EAQ6.js} +2 -2
  18. package/dist/{chunk-F6OEXJQQ.js → chunk-6XG3NQRC.js} +2 -2
  19. package/dist/{chunk-24ZLC5QN.js → chunk-7N7S2RKF.js} +2 -2
  20. package/dist/{chunk-Y5OOHER4.js → chunk-7Y5KKMIP.js} +12 -11
  21. package/dist/chunk-7Y5KKMIP.js.map +1 -0
  22. package/dist/{chunk-VRBBZH4U.js → chunk-AX4TRSRE.js} +3 -3
  23. package/dist/{chunk-66RZ4EIT.js → chunk-BE6NEQLF.js} +3 -3
  24. package/dist/{chunk-YF2MMBKA.js → chunk-BJPL5WAL.js} +3 -3
  25. package/dist/{chunk-EO5QWINU.js → chunk-C3Z5YJSM.js} +5 -2
  26. package/dist/chunk-C3Z5YJSM.js.map +1 -0
  27. package/dist/{chunk-GEXI357K.js → chunk-C7C5WIIF.js} +2 -2
  28. package/dist/{chunk-L3TYGUTH.js → chunk-CMPXLMC3.js} +3 -3
  29. package/dist/{chunk-W2FBVBQ4.js → chunk-DBVBV2RF.js} +4 -4
  30. package/dist/{chunk-JQSP7YBJ.js → chunk-ELL5VYXC.js} +5 -4
  31. package/dist/chunk-ELL5VYXC.js.map +1 -0
  32. package/dist/{chunk-IQOEW5YV.js → chunk-FCQ7ZYCQ.js} +2 -2
  33. package/dist/{chunk-IIBFCZA7.js → chunk-FWXLKH2H.js} +3 -3
  34. package/dist/{chunk-RJBW4EOU.js → chunk-G7Q4D2G3.js} +74 -2
  35. package/dist/{chunk-RJBW4EOU.js.map → chunk-G7Q4D2G3.js.map} +1 -1
  36. package/dist/{chunk-WVAEIKUY.js → chunk-GPX5E36D.js} +5 -4
  37. package/dist/chunk-GPX5E36D.js.map +1 -0
  38. package/dist/{chunk-23PLOBWT.js → chunk-H3WSZWHK.js} +22 -20
  39. package/dist/chunk-H3WSZWHK.js.map +1 -0
  40. package/dist/{chunk-Q6BAA57B.js → chunk-JFCS6PQU.js} +2 -2
  41. package/dist/chunk-JFCS6PQU.js.map +1 -0
  42. package/dist/{chunk-CKHPUOAP.js → chunk-K2N6WIZM.js} +3 -3
  43. package/dist/{chunk-BHJAMSVC.js → chunk-LD6A7XG5.js} +7 -7
  44. package/dist/{chunk-AKKFHN3I.js → chunk-M4WI23X3.js} +2 -2
  45. package/dist/{chunk-N2O23WYA.js → chunk-M5KLYHHI.js} +2 -2
  46. package/dist/{chunk-TNLXCSXV.js → chunk-O4IWVWSW.js} +5 -4
  47. package/dist/chunk-O4IWVWSW.js.map +1 -0
  48. package/dist/{chunk-OQQRWPFZ.js → chunk-OS5RKJOH.js} +2 -2
  49. package/dist/{chunk-MAU7DFCJ.js → chunk-OT5K26NG.js} +5 -4
  50. package/dist/chunk-OT5K26NG.js.map +1 -0
  51. package/dist/{chunk-DS3FZ7GS.js → chunk-OUSOMUFV.js} +2 -2
  52. package/dist/{chunk-7B7IPPN5.js → chunk-OVYBENIJ.js} +3 -3
  53. package/dist/{chunk-5RZOFIDL.js → chunk-PI4JHLDD.js} +6 -3
  54. package/dist/chunk-PI4JHLDD.js.map +1 -0
  55. package/dist/{chunk-EU543UDC.js → chunk-QCO2QFLZ.js} +7 -7
  56. package/dist/chunk-QCO2QFLZ.js.map +1 -0
  57. package/dist/{chunk-YXOXAQ5Y.js → chunk-TQQN64J2.js} +5 -4
  58. package/dist/chunk-TQQN64J2.js.map +1 -0
  59. package/dist/{chunk-WDJCZQB4.js → chunk-UGFPGWJB.js} +2 -2
  60. package/dist/{chunk-75PDC7VT.js → chunk-UOVDO6TC.js} +6 -5
  61. package/dist/chunk-UOVDO6TC.js.map +1 -0
  62. package/dist/{chunk-BVG2IZOB.js → chunk-USHVHI6J.js} +7 -6
  63. package/dist/chunk-USHVHI6J.js.map +1 -0
  64. package/dist/{chunk-56LP72AD.js → chunk-UYYSOMS2.js} +4 -4
  65. package/dist/{chunk-IEWUPZ75.js → chunk-VC7QELR6.js} +77 -74
  66. package/dist/chunk-VC7QELR6.js.map +1 -0
  67. package/dist/{chunk-XIQAOGAA.js → chunk-WGDE2TJP.js} +7 -6
  68. package/dist/chunk-WGDE2TJP.js.map +1 -0
  69. package/dist/{chunk-UFS7OXGL.js → chunk-WHEF76BQ.js} +5 -2
  70. package/dist/chunk-WHEF76BQ.js.map +1 -0
  71. package/dist/{chunk-QTJOORGN.js → chunk-WIMKOTNY.js} +2 -2
  72. package/dist/{chunk-GXTYEG7Q.js → chunk-WO22UEM3.js} +2 -2
  73. package/dist/{chunk-BHQQVUEQ.js → chunk-X5PMDVY4.js} +6 -5
  74. package/dist/{chunk-BHQQVUEQ.js.map → chunk-X5PMDVY4.js.map} +1 -1
  75. package/dist/{chunk-C53JDEH3.js → chunk-Y62QPRKV.js} +2 -2
  76. package/dist/{chunk-WFNH4UDF.js → chunk-Y6PNYJVO.js} +3 -3
  77. package/dist/{chunk-6YKIYQU7.js → chunk-YNHRWFAP.js} +5 -2
  78. package/dist/{chunk-6YKIYQU7.js.map → chunk-YNHRWFAP.js.map} +1 -1
  79. package/dist/cli.js +29 -29
  80. package/dist/compounding/engine.js +4 -4
  81. package/dist/connectors/codex-materialize-runner.js +2 -2
  82. package/dist/connectors/index.js +4 -3
  83. package/dist/contradiction/index.js +2 -2
  84. package/dist/{contradiction-scan-CWO3LIWV.js → contradiction-scan-UERKJESC.js} +3 -3
  85. package/dist/day-summary.js +2 -1
  86. package/dist/embedding-fallback.js +2 -2
  87. package/dist/entity-retrieval.js +3 -3
  88. package/dist/explicit-capture.js +2 -2
  89. package/dist/extraction.js +4 -4
  90. package/dist/{first-start-migration-5DXD3TF2.js → first-start-migration-GQ3UQNIL.js} +2 -2
  91. package/dist/index.js +45 -45
  92. package/dist/local-llm.js +2 -2
  93. package/dist/maintenance/memory-governance.js +2 -2
  94. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +2 -2
  95. package/dist/maintenance/rebuild-memory-projection.js +3 -3
  96. package/dist/namespaces/migrate.js +7 -7
  97. package/dist/namespaces/principal.js +2 -2
  98. package/dist/namespaces/search.js +4 -4
  99. package/dist/namespaces/storage.js +3 -3
  100. package/dist/operator-toolkit.js +13 -13
  101. package/dist/orchestration/compression-guideline-coordinator.js +2 -2
  102. package/dist/orchestration/maintenance.js +7 -7
  103. package/dist/orchestrator.js +29 -29
  104. package/dist/search/embed-helper.js +2 -2
  105. package/dist/search/factory.js +3 -3
  106. package/dist/search/index.js +3 -3
  107. package/dist/semantic-consolidation.js +4 -3
  108. package/dist/semantic-rule-promotion.js +2 -2
  109. package/dist/semantic-rule-verifier.js +2 -2
  110. package/dist/shared-context/manager.js +2 -1
  111. package/dist/storage.d.ts +1 -1
  112. package/dist/storage.js +1 -1
  113. package/dist/summarizer.js +3 -3
  114. package/dist/{tier-stats-QID73BBB.js → tier-stats-CSKL7BDG.js} +2 -2
  115. package/dist/verified-recall.js +2 -2
  116. package/package.json +2 -2
  117. package/src/access-service.ts +2 -1
  118. package/src/capabilities.test.ts +166 -0
  119. package/src/capabilities.ts +267 -0
  120. package/src/cli/research-status-commands.ts +2 -1
  121. package/src/cli.ts +3 -2
  122. package/src/compounding/engine.ts +2 -1
  123. package/src/connectors/codex-marketplace.ts +2 -1
  124. package/src/day-summary.ts +2 -1
  125. package/src/embedding-fallback.ts +2 -1
  126. package/src/extraction.ts +3 -2
  127. package/src/local-llm.ts +2 -1
  128. package/src/maintenance/namespace-maintenance-fanout.ts +2 -1
  129. package/src/maintenance/namespace-planner.ts +2 -1
  130. package/src/operator-toolkit.ts +1 -0
  131. package/src/orchestration/semantic-consolidation-coordinator.ts +3 -2
  132. package/src/orchestrator.ts +50 -46
  133. package/src/search/embed-helper.ts +2 -1
  134. package/src/search/factory.ts +2 -1
  135. package/src/semantic-consolidation.ts +2 -1
  136. package/src/shared-context/manager.ts +3 -2
  137. package/src/storage.ts +1 -1
  138. package/src/summarizer.ts +3 -2
  139. package/dist/chunk-23PLOBWT.js.map +0 -1
  140. package/dist/chunk-5RZOFIDL.js.map +0 -1
  141. package/dist/chunk-75PDC7VT.js.map +0 -1
  142. package/dist/chunk-BVG2IZOB.js.map +0 -1
  143. package/dist/chunk-EO5QWINU.js.map +0 -1
  144. package/dist/chunk-EU543UDC.js.map +0 -1
  145. package/dist/chunk-IEWUPZ75.js.map +0 -1
  146. package/dist/chunk-JQSP7YBJ.js.map +0 -1
  147. package/dist/chunk-MAU7DFCJ.js.map +0 -1
  148. package/dist/chunk-Q6BAA57B.js.map +0 -1
  149. package/dist/chunk-TNLXCSXV.js.map +0 -1
  150. package/dist/chunk-UFS7OXGL.js.map +0 -1
  151. package/dist/chunk-WVAEIKUY.js.map +0 -1
  152. package/dist/chunk-XIQAOGAA.js.map +0 -1
  153. package/dist/chunk-Y5OOHER4.js.map +0 -1
  154. package/dist/chunk-YXOXAQ5Y.js.map +0 -1
  155. /package/dist/{chunk-IFCM6OLK.js.map → chunk-3TUDKDTQ.js.map} +0 -0
  156. /package/dist/{chunk-A7INTIC5.js.map → chunk-4J53ZVPQ.js.map} +0 -0
  157. /package/dist/{chunk-XYUFGHUW.js.map → chunk-56F6EAQ6.js.map} +0 -0
  158. /package/dist/{chunk-F6OEXJQQ.js.map → chunk-6XG3NQRC.js.map} +0 -0
  159. /package/dist/{chunk-24ZLC5QN.js.map → chunk-7N7S2RKF.js.map} +0 -0
  160. /package/dist/{chunk-VRBBZH4U.js.map → chunk-AX4TRSRE.js.map} +0 -0
  161. /package/dist/{chunk-66RZ4EIT.js.map → chunk-BE6NEQLF.js.map} +0 -0
  162. /package/dist/{chunk-YF2MMBKA.js.map → chunk-BJPL5WAL.js.map} +0 -0
  163. /package/dist/{chunk-GEXI357K.js.map → chunk-C7C5WIIF.js.map} +0 -0
  164. /package/dist/{chunk-L3TYGUTH.js.map → chunk-CMPXLMC3.js.map} +0 -0
  165. /package/dist/{chunk-W2FBVBQ4.js.map → chunk-DBVBV2RF.js.map} +0 -0
  166. /package/dist/{chunk-IQOEW5YV.js.map → chunk-FCQ7ZYCQ.js.map} +0 -0
  167. /package/dist/{chunk-IIBFCZA7.js.map → chunk-FWXLKH2H.js.map} +0 -0
  168. /package/dist/{chunk-CKHPUOAP.js.map → chunk-K2N6WIZM.js.map} +0 -0
  169. /package/dist/{chunk-BHJAMSVC.js.map → chunk-LD6A7XG5.js.map} +0 -0
  170. /package/dist/{chunk-AKKFHN3I.js.map → chunk-M4WI23X3.js.map} +0 -0
  171. /package/dist/{chunk-N2O23WYA.js.map → chunk-M5KLYHHI.js.map} +0 -0
  172. /package/dist/{chunk-OQQRWPFZ.js.map → chunk-OS5RKJOH.js.map} +0 -0
  173. /package/dist/{chunk-DS3FZ7GS.js.map → chunk-OUSOMUFV.js.map} +0 -0
  174. /package/dist/{chunk-7B7IPPN5.js.map → chunk-OVYBENIJ.js.map} +0 -0
  175. /package/dist/{chunk-WDJCZQB4.js.map → chunk-UGFPGWJB.js.map} +0 -0
  176. /package/dist/{chunk-56LP72AD.js.map → chunk-UYYSOMS2.js.map} +0 -0
  177. /package/dist/{chunk-QTJOORGN.js.map → chunk-WIMKOTNY.js.map} +0 -0
  178. /package/dist/{chunk-GXTYEG7Q.js.map → chunk-WO22UEM3.js.map} +0 -0
  179. /package/dist/{chunk-C53JDEH3.js.map → chunk-Y62QPRKV.js.map} +0 -0
  180. /package/dist/{chunk-WFNH4UDF.js.map → chunk-Y6PNYJVO.js.map} +0 -0
  181. /package/dist/{contradiction-scan-CWO3LIWV.js.map → contradiction-scan-UERKJESC.js.map} +0 -0
  182. /package/dist/{first-start-migration-5DXD3TF2.js.map → first-start-migration-GQ3UQNIL.js.map} +0 -0
  183. /package/dist/{tier-stats-QID73BBB.js.map → tier-stats-CSKL7BDG.js.map} +0 -0
@@ -4,10 +4,10 @@ import {
4
4
  import {
5
5
  compareEntityTimestamps,
6
6
  normalizeEntityName
7
- } from "./chunk-Q6BAA57B.js";
7
+ } from "./chunk-JFCS6PQU.js";
8
8
  import {
9
9
  resolveNamespaceCapabilities
10
- } from "./chunk-RJBW4EOU.js";
10
+ } from "./chunk-G7Q4D2G3.js";
11
11
  import {
12
12
  sanitizeMemoryContent
13
13
  } from "./chunk-5GKPFL3S.js";
@@ -682,4 +682,4 @@ export {
682
682
  entityIndexVersion,
683
683
  entityRecentTranscriptLookbackHours
684
684
  };
685
- //# sourceMappingURL=chunk-CKHPUOAP.js.map
685
+ //# sourceMappingURL=chunk-K2N6WIZM.js.map
@@ -11,25 +11,25 @@ import {
11
11
  processChatMessage,
12
12
  sessionBelongsToPrincipal,
13
13
  subscribeChatTranscript
14
- } from "./chunk-A7INTIC5.js";
14
+ } from "./chunk-4J53ZVPQ.js";
15
15
  import {
16
16
  validateRequest
17
17
  } from "./chunk-FVZ2ISIX.js";
18
18
  import {
19
19
  getOperation
20
- } from "./chunk-N2O23WYA.js";
20
+ } from "./chunk-M5KLYHHI.js";
21
21
  import {
22
22
  EngramAccessInputError
23
- } from "./chunk-Y5OOHER4.js";
23
+ } from "./chunk-7Y5KKMIP.js";
24
24
  import {
25
25
  CorrectionContractError
26
- } from "./chunk-WFNH4UDF.js";
26
+ } from "./chunk-Y6PNYJVO.js";
27
27
  import {
28
28
  isTrustZoneName
29
29
  } from "./chunk-JGSKJHF7.js";
30
30
  import {
31
31
  projectTagProjectId
32
- } from "./chunk-7B7IPPN5.js";
32
+ } from "./chunk-OVYBENIJ.js";
33
33
  import {
34
34
  subscribeGraphEvents
35
35
  } from "./chunk-DEUNUKTD.js";
@@ -1769,7 +1769,7 @@ var EngramAccessHttpServer = class {
1769
1769
  if (req.method === "POST" && pathname === "/engram/v1/contradiction-scan") {
1770
1770
  void getOperation("contradiction_scan_run");
1771
1771
  const body = await this.readJsonBody(req);
1772
- const { runContradictionScan } = await import("./contradiction-scan-CWO3LIWV.js");
1772
+ const { runContradictionScan } = await import("./contradiction-scan-UERKJESC.js");
1773
1773
  const principal = this.resolveRequestPrincipal(req);
1774
1774
  const result = await runContradictionScan({
1775
1775
  storage: this.service.storageRef,
@@ -2629,4 +2629,4 @@ function positiveIntQueryParam(value, label) {
2629
2629
  export {
2630
2630
  EngramAccessHttpServer
2631
2631
  };
2632
- //# sourceMappingURL=chunk-BHJAMSVC.js.map
2632
+ //# sourceMappingURL=chunk-LD6A7XG5.js.map
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-RGMVMVMF.js";
13
13
  import {
14
14
  resolveNamespaceCapabilities
15
- } from "./chunk-RJBW4EOU.js";
15
+ } from "./chunk-G7Q4D2G3.js";
16
16
  import {
17
17
  log
18
18
  } from "./chunk-NU3CSQ4H.js";
@@ -546,4 +546,4 @@ export {
546
546
  ACTIVE_STATUSES,
547
547
  runContradictionScan
548
548
  };
549
- //# sourceMappingURL=chunk-AKKFHN3I.js.map
549
+ //# sourceMappingURL=chunk-M4WI23X3.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EngramAccessInputError
3
- } from "./chunk-Y5OOHER4.js";
3
+ } from "./chunk-7Y5KKMIP.js";
4
4
  import {
5
5
  expandTildePath
6
6
  } from "./chunk-EYIEWJNI.js";
@@ -130,4 +130,4 @@ export {
130
130
  listRegisteredOperations,
131
131
  __resetRegistryForTest
132
132
  };
133
- //# sourceMappingURL=chunk-N2O23WYA.js.map
133
+ //# sourceMappingURL=chunk-M5KLYHHI.js.map
@@ -3,10 +3,11 @@ import {
3
3
  readNamespaceMaintenanceLastRanStatuses,
4
4
  readNamespaceMaintenanceStatuses,
5
5
  runNamespaceMaintenancePlan
6
- } from "./chunk-BHQQVUEQ.js";
6
+ } from "./chunk-X5PMDVY4.js";
7
7
  import {
8
+ resolveConversationContextCapabilities,
8
9
  resolveNamespaceCapabilities
9
- } from "./chunk-RJBW4EOU.js";
10
+ } from "./chunk-G7Q4D2G3.js";
10
11
 
11
12
  // src/maintenance/namespace-maintenance-fanout.ts
12
13
  var NAMESPACE_MAINTENANCE_JOBS = [
@@ -99,7 +100,7 @@ async function summarizeNamespaceMaintenanceHealth(config) {
99
100
  }
100
101
  return {
101
102
  generatedAt,
102
- fanoutEnabled: config.maintenanceNamespaceFanoutEnabled !== false,
103
+ fanoutEnabled: resolveConversationContextCapabilities(config).maintenanceNamespaceFanout !== false,
103
104
  namespacesEnabled: resolveNamespaceCapabilities(config).namespaces,
104
105
  maxNamespacesPerCycle: config.maintenanceMaxNamespacesPerCycle,
105
106
  jobs,
@@ -149,4 +150,4 @@ export {
149
150
  summarizeNamespaceMaintenanceHealth,
150
151
  formatNamespaceMaintenanceHealthText
151
152
  };
152
- //# sourceMappingURL=chunk-TNLXCSXV.js.map
153
+ //# sourceMappingURL=chunk-O4IWVWSW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/namespace-maintenance-fanout.ts"],"sourcesContent":["/**\n * Namespace maintenance fanout coordinator (issue #1500).\n *\n * Builds on the namespace-aware maintenance planner (#1499 / #1517) to fan out\n * the REMAINING background maintenance jobs — dreams, pattern reinforcement,\n * governance/lifecycle, contradiction scans, semantic/causal consolidation,\n * graph decay, fact archival, tier migration — across all maintained\n * namespaces.\n *\n * The planner (`namespace-planner.ts`) already handles namespace discovery\n * (configured + catalog), per-kind gating, cycle budgeting, per-job+namespace\n * locking, status recording, and catalog maintenance timestamps. QMD\n * maintenance was wired through it in #1517. This module standardizes the\n * per-job adapter pattern so every other maintenance job can be fanned out\n * with one call, and aggregates per-namespace health for doctor/dashboard.\n *\n * Design contract (issue #1500 compatibility requirements):\n * - Existing direct `runJob({ namespace })` calls continue to work unchanged.\n * - Namespaces disabled: fanout is a no-op (the planner returns only the\n * default namespace; jobs run exactly as before).\n * - `maintenanceNamespaceFanoutEnabled: false`: fanout is a no-op.\n * - A failure in one namespace must not abort other namespaces (the planner\n * already isolates per-namespace failures).\n * - Per-namespace locks prevent duplicate concurrent runs (planner-provided).\n */\n\nimport { resolveNamespaceCapabilities } from \"../capabilities.js\";\nimport type { NamespaceCatalog } from \"../namespaces/catalog.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { resolveConversationContextCapabilities } from \"../capabilities.js\";\nimport {\n planNamespaceMaintenance,\n readNamespaceMaintenanceLastRanStatuses,\n readNamespaceMaintenanceStatuses,\n runNamespaceMaintenancePlan,\n type NamespaceMaintenanceCandidate,\n type NamespaceMaintenanceRunStatus,\n type NamespaceMaintenanceSummary,\n} from \"./namespace-planner.js\";\n\n/**\n * Standard maintenance job names fanned out across namespaces.\n *\n * These strings are used as the `jobName` key in:\n * - per-namespace status files (`state/namespace-maintenance-status/<job>/...`)\n * - catalog `lastMaintenanceAt[jobName]` timestamps\n * - per-job+namespace lock files (`state/maintenance-locks/<job>/...`)\n *\n * Keeping them centralized ensures the doctor, CLI, and dashboard all report\n * against the same keys.\n */\nexport const NAMESPACE_MAINTENANCE_JOBS = [\n \"qmd\",\n \"pattern-reinforcement\",\n \"contradiction-scan\",\n \"semantic-consolidation\",\n \"governance\",\n \"lifecycle\",\n \"graph-decay\",\n \"fact-archival\",\n \"tier-migration\",\n] as const;\n\nexport type NamespaceMaintenanceStandardJob =\n (typeof NAMESPACE_MAINTENANCE_JOBS)[number];\n\n/**\n * Context passed to a fanout job runner. The runner receives the per-namespace\n * candidate (namespace name, kind, storage dir) and a storage resolver that\n * the orchestrator wires to `storageRouter.storageFor(namespace)`.\n *\n * The storage resolver is intentionally typed as `unknown` here so this module\n * does not depend on the `StorageManager` class — the orchestrator provides the\n * typed resolver. This keeps the fanout module free of orchestrator/storage\n * imports and unit-testable with a stub.\n */\nexport interface NamespaceMaintenanceFanoutRunnerContext {\n config: PluginConfig;\n candidate: NamespaceMaintenanceCandidate;\n resolveStorage: (namespace: string) => Promise<unknown>;\n}\n\n/**\n * Result returned by a fanout job runner. `itemCount` is optional and\n * domain-specific (e.g. memories scanned, edges decayed, embeddings updated).\n *\n * `skipped`/`skipReason`: when a runner performs no work for a namespace\n * (e.g. the job's own cadence gate throttled it), set `skipped: true`. The\n * planner records the namespace as `state: \"skipped\"` and does NOT touch\n * the catalog's `lastMaintenanceAt`, so a throttled namespace is not\n * falsely reported as maintained.\n */\nexport interface NamespaceMaintenanceFanoutRunnerResult {\n itemCount?: number;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport type NamespaceMaintenanceFanoutRunner = (\n ctx: NamespaceMaintenanceFanoutRunnerContext,\n) => Promise<NamespaceMaintenanceFanoutRunnerResult | undefined>;\n\nexport interface RunNamespaceMaintenanceFanoutOptions {\n config: PluginConfig;\n catalog?: NamespaceCatalog;\n jobName: string;\n runner: NamespaceMaintenanceFanoutRunner;\n resolveStorage: (namespace: string) => Promise<unknown>;\n /**\n * When `false`, skip fanout entirely and return a zero-summary without\n * touching the planner or locks. This lets callers gate fanout on\n * per-job config (e.g. `semanticConsolidationEnabled`) without repeating\n * the namespace-discovery logic.\n */\n enabled?: boolean;\n}\n\n/**\n * Fan out a single maintenance job across all maintained namespaces.\n *\n * This is the primary entry point for wiring a maintenance job through the\n * namespace-aware planner. It:\n * 1. Plans which namespaces should be maintained (configured + catalog,\n * budgeted, kind-gated).\n * 2. Runs the job per-namespace through `runNamespaceMaintenancePlan`, which\n * acquires per-job+namespace locks, records status files, and touches the\n * catalog's `lastMaintenanceAt`.\n *\n * When namespaces are disabled or fanout is off, the planner returns only the\n * default namespace, so the job runs exactly once against default storage —\n * preserving single-user behavior.\n */\nexport async function runNamespaceMaintenanceFanout(\n options: RunNamespaceMaintenanceFanoutOptions,\n): Promise<NamespaceMaintenanceSummary> {\n if (options.enabled === false) {\n return {\n jobName: options.jobName,\n generatedAt: new Date().toISOString(),\n ran: 0,\n skipped: 0,\n failed: 0,\n statuses: [],\n };\n }\n\n const plan = await planNamespaceMaintenance(options.config, {\n jobName: options.jobName,\n catalog: options.catalog,\n });\n\n return runNamespaceMaintenancePlan(\n options.config,\n plan,\n async (candidate) => {\n return options.runner({\n config: options.config,\n candidate,\n resolveStorage: options.resolveStorage,\n });\n },\n options.catalog,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Health summary for doctor / dashboard / CLI\n// ---------------------------------------------------------------------------\n\nexport interface NamespaceMaintenanceJobHealth {\n jobName: string;\n ran: number;\n skipped: number;\n failed: number;\n lastRunAt: string | null;\n namespaces: NamespaceMaintenanceRunStatus[];\n}\n\nexport interface NamespaceMaintenanceHealthSummary {\n generatedAt: string;\n fanoutEnabled: boolean;\n namespacesEnabled: boolean;\n maxNamespacesPerCycle: number;\n jobs: NamespaceMaintenanceJobHealth[];\n totalRan: number;\n totalSkipped: number;\n totalFailed: number;\n}\n\n/**\n * Read all per-namespace maintenance status files and aggregate them into a\n * health summary suitable for `remnic doctor` and the admin dashboard.\n *\n * This is a pure read operation — it never runs maintenance or acquires locks.\n */\nexport async function summarizeNamespaceMaintenanceHealth(\n config: PluginConfig,\n): Promise<NamespaceMaintenanceHealthSummary> {\n const generatedAt = new Date().toISOString();\n const statuses = await readNamespaceMaintenanceStatuses(config);\n // Merge last-successful-run records so lastRunAt reflects the most recent\n // successful maintenance, not just the latest (possibly skipped/failed)\n // outcome. The latest status file is overwritten on every run; without\n // this merge a namespace that ran then got budget-skipped shows ran=0 /\n // lastRunAt=null (review #1622: preserve last successful run).\n const lastRanStatuses = await readNamespaceMaintenanceLastRanStatuses(config);\n const lastRanByJobNs = new Map<string, NamespaceMaintenanceRunStatus>();\n for (const lr of lastRanStatuses) {\n lastRanByJobNs.set(`${lr.jobName}\\u0000${lr.namespace}`, lr);\n }\n\n const byJob = new Map<string, NamespaceMaintenanceRunStatus[]>();\n for (const status of statuses) {\n const bucket = byJob.get(status.jobName);\n if (bucket) {\n bucket.push(status);\n } else {\n byJob.set(status.jobName, [status]);\n }\n }\n\n const knownJobs = new Set<string>(NAMESPACE_MAINTENANCE_JOBS);\n // Include any job names seen in status files that are not in the standard\n // set (e.g. custom jobs registered by the orchestrator) so the doctor does\n // not silently hide them.\n for (const jobName of byJob.keys()) {\n knownJobs.add(jobName);\n }\n\n const jobs: NamespaceMaintenanceJobHealth[] = [];\n let totalRan = 0;\n let totalSkipped = 0;\n let totalFailed = 0;\n\n for (const jobName of [...knownJobs].sort()) {\n const jobStatuses = byJob.get(jobName) ?? [];\n const ran = jobStatuses.filter((s) => s.state === \"ran\").length;\n const skipped = jobStatuses.filter((s) => s.state === \"skipped\").length;\n const failed = jobStatuses.filter((s) => s.state === \"failed\").length;\n // Consider BOTH the latest outcome and the last successful run so a\n // namespace that ran then was later skipped still reports lastRunAt.\n const candidates: string[] = [];\n for (const st of jobStatuses) {\n if (typeof st.completedAt === \"string\") candidates.push(st.completedAt);\n const lr = lastRanByJobNs.get(`${jobName}\\u0000${st.namespace}`);\n if (lr && typeof lr.completedAt === \"string\") candidates.push(lr.completedAt);\n }\n const lastRunAt = candidates.sort().at(-1) ?? null;\n\n totalRan += ran;\n totalSkipped += skipped;\n totalFailed += failed;\n\n jobs.push({\n jobName,\n ran,\n skipped,\n failed,\n lastRunAt,\n namespaces: jobStatuses,\n });\n }\n\n return {\n generatedAt,\n fanoutEnabled: resolveConversationContextCapabilities(config).maintenanceNamespaceFanout !== false,\n namespacesEnabled: resolveNamespaceCapabilities(config).namespaces,\n maxNamespacesPerCycle: config.maintenanceMaxNamespacesPerCycle,\n jobs,\n totalRan,\n totalSkipped,\n totalFailed,\n };\n}\n\n/**\n * Format the health summary as human-readable text for the CLI.\n */\nexport function formatNamespaceMaintenanceHealthText(\n summary: NamespaceMaintenanceHealthSummary,\n): string {\n const lines: string[] = [\n \"=== Namespace Maintenance ===\",\n \"\",\n ` fanout: ${summary.fanoutEnabled ? \"enabled\" : \"disabled\"}`,\n ` namespaces: ${summary.namespacesEnabled ? \"enabled\" : \"disabled\"}`,\n ` max/cycle: ${summary.maxNamespacesPerCycle}`,\n ` total ran: ${summary.totalRan}`,\n ` total skipped: ${summary.totalSkipped}`,\n ` total failed: ${summary.totalFailed}`,\n \"\",\n ];\n\n if (summary.totalRan === 0 && summary.totalSkipped === 0 && summary.totalFailed === 0) {\n lines.push(\" (no maintenance status recorded yet)\");\n return lines.join(\"\\n\");\n }\n\n lines.push(\" Per-job breakdown:\");\n for (const job of summary.jobs) {\n const parts = [\n `ran=${job.ran}`,\n `skipped=${job.skipped}`,\n `failed=${job.failed}`,\n ];\n if (job.lastRunAt) {\n parts.push(`last=${job.lastRunAt}`);\n }\n lines.push(` ${job.jobName}: ${parts.join(\", \")}`);\n // Surface failed namespaces with their reason/error so operators know\n // WHAT to fix without rerunning with --json (review #1622).\n const failedNs = job.namespaces.filter((n) => n.state === \"failed\");\n for (const ns of failedNs) {\n const detail = ns.error ? `: ${ns.error}` : \"\";\n lines.push(` ! ${ns.namespace} failed (reason=${ns.reason ?? \"unknown\"})${detail}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-H3FZVNRN.js";
4
4
  import {
5
5
  resolvePresentationCapabilities
6
- } from "./chunk-RJBW4EOU.js";
6
+ } from "./chunk-G7Q4D2G3.js";
7
7
  import {
8
8
  log
9
9
  } from "./chunk-NU3CSQ4H.js";
@@ -609,4 +609,4 @@ function probeWithTimeout(inflight, timeoutMs) {
609
609
  export {
610
610
  SmartBuffer
611
611
  };
612
- //# sourceMappingURL=chunk-OQQRWPFZ.js.map
612
+ //# sourceMappingURL=chunk-OS5RKJOH.js.map
@@ -7,8 +7,9 @@ import {
7
7
  } from "./chunk-3ONXXHQO.js";
8
8
  import {
9
9
  resolveLocalLlmCapabilities,
10
- resolveMemoryLifecycleCapabilities
11
- } from "./chunk-RJBW4EOU.js";
10
+ resolveMemoryLifecycleCapabilities,
11
+ resolvePipelineProcessingCapabilities
12
+ } from "./chunk-G7Q4D2G3.js";
12
13
  import {
13
14
  log
14
15
  } from "./chunk-NU3CSQ4H.js";
@@ -134,7 +135,7 @@ var EmbedHelper = class {
134
135
  }
135
136
  resolveProvider(options = {}) {
136
137
  if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;
137
- if (options.includeHost !== false && this.config.hostEmbeddingProviderEnabled !== false) {
138
+ if (options.includeHost !== false && resolvePipelineProcessingCapabilities(this.config).hostEmbeddingProvider !== false) {
138
139
  const hostProvider = this.resolveHostEmbeddingProvider();
139
140
  if (hostProvider) {
140
141
  return {
@@ -309,4 +310,4 @@ function normalizeHttpEmbeddingVector(vector) {
309
310
  export {
310
311
  EmbedHelper
311
312
  };
312
- //# sourceMappingURL=chunk-MAU7DFCJ.js.map
313
+ //# sourceMappingURL=chunk-OT5K26NG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/search/embed-helper.ts"],"sourcesContent":["import { log } from \"../logger.js\";\nimport {\n resolveMemoryLifecycleCapabilities,\n resolveLocalLlmCapabilities,\n} from \"../capabilities.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { isAbortError } from \"../abort-error.js\";\nimport { withTimeoutSignal } from \"./abort.js\";\nimport { resolvePipelineProcessingCapabilities } from \"../capabilities.js\";\nimport {\n getHostEmbeddingProvider,\n type HostEmbeddingProvider,\n type HostEmbeddingInputType,\n normalizeHostEmbeddingVector,\n} from \"../host-embedding-provider.js\";\n\ntype ProviderConfig = {\n type: \"openai\" | \"local\" | \"host\";\n model: string;\n endpoint?: string;\n headers?: Record<string, string>;\n hostProvider?: HostEmbeddingProvider;\n};\n\ntype HostEmbeddingScopeConfig = PluginConfig & {\n /**\n * Internal namespace-router metadata. Host adapters register providers at\n * the root memoryDir while namespace backends operate under scoped dirs.\n */\n hostEmbeddingProviderScope?: string;\n};\n\ntype EmbedHelperOptions = {\n /** Backend-local vector schema dimension for host-provider validation. */\n hostEmbeddingExpectedDimension?: number;\n};\n\nexport type EmbedProviderIdentity = `${ProviderConfig[\"type\"]}:${string}`;\n\nexport type EmbedWithProviderResult = {\n vector: number[];\n providerIdentity: EmbedProviderIdentity;\n};\n\nexport type EmbedBatchWithProviderResult = {\n vectors: (number[] | null)[];\n providerIdentity: EmbedProviderIdentity;\n};\n\nconst DEFAULT_OPENAI_MODEL = \"text-embedding-3-small\";\nconst DEFAULT_PROVIDER_CACHE_TTL_MS = 250;\n\n/**\n * Standalone embedding helper for search backend adapters.\n *\n * NOTE: This intentionally duplicates provider resolution from EmbeddingFallback.\n * EmbeddingFallback is tightly integrated with the plugin lifecycle (telemetry,\n * rate-limit backoff, provider rotation). This class is a lightweight standalone\n * utility used by LanceDB/Orama backends which operate outside plugin context.\n * Merging them would break the port/adapter separation between search and plugin layers.\n */\nexport class EmbedHelper {\n private cachedProvider: ProviderConfig | null | undefined;\n private cachedProviderAt = 0;\n private providerCacheTtlMs = DEFAULT_PROVIDER_CACHE_TTL_MS;\n\n constructor(\n private readonly config: PluginConfig,\n private readonly options: EmbedHelperOptions = {},\n ) {}\n\n /**\n * Whether an embedding provider is available.\n * Re-resolves periodically so late host-provider registration is visible\n * without repeatedly probing provider state on every hot-path call.\n */\n isAvailable(): boolean {\n return this.getProvider() !== null;\n }\n\n /**\n * Embed a single text string. Returns null if no provider is available.\n */\n async embed(text: string, options: { signal?: AbortSignal } = {}): Promise<number[] | null> {\n return (await this.embedWithProvider(text, options))?.vector ?? null;\n }\n\n async embedWithProvider(\n text: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<EmbedWithProviderResult | null> {\n const provider = this.getProvider();\n if (!provider) return null;\n const result = await this.callEmbed(text, provider, options.signal, \"query\");\n if (result) {\n return {\n vector: result,\n providerIdentity: providerIdentity(provider),\n };\n }\n if (provider.type !== \"host\") return null;\n const fallbackProvider = this.resolveProvider({ includeHost: false });\n if (!fallbackProvider) return null;\n const fallbackResult = await this.callEmbed(text, fallbackProvider, options.signal, \"query\");\n return fallbackResult\n ? {\n vector: fallbackResult,\n providerIdentity: providerIdentity(fallbackProvider),\n }\n : null;\n }\n\n async embedWithFallbackProviderIdentity(\n text: string,\n identity: EmbedProviderIdentity,\n options: { signal?: AbortSignal } = {},\n ): Promise<EmbedWithProviderResult | null> {\n const provider = this.resolveFallbackProviderForIdentity(identity);\n if (!provider) return null;\n const result = await this.callEmbed(text, provider, options.signal, \"query\");\n return result\n ? {\n vector: result,\n providerIdentity: providerIdentity(provider),\n }\n : null;\n }\n\n /**\n * Embed a batch of texts. Returns an array parallel to input; entries are null on failure.\n */\n async embedBatch(\n texts: string[],\n batchSize = 32,\n options: { signal?: AbortSignal } = {},\n ): Promise<(number[] | null)[]> {\n return (await this.embedBatchWithProvider(texts, batchSize, options))?.vectors ?? texts.map(() => null);\n }\n\n async embedBatchWithProvider(\n texts: string[],\n batchSize = 32,\n options: { signal?: AbortSignal } = {},\n ): Promise<EmbedBatchWithProviderResult | null> {\n const provider = this.getProvider();\n if (!provider) return null;\n\n if (provider.type === \"host\") {\n const hostResults = await this.embedAllWithProvider(texts, batchSize, provider, options);\n if (!hostResults.some((result) => result === null)) {\n return {\n vectors: hostResults,\n providerIdentity: providerIdentity(provider),\n };\n }\n const fallbackProvider = this.resolveProvider({ includeHost: false });\n if (!fallbackProvider) {\n return {\n vectors: hostResults,\n providerIdentity: providerIdentity(provider),\n };\n }\n const fallbackResults = await this.embedAllWithProvider(texts, batchSize, fallbackProvider, options);\n return {\n vectors: fallbackResults,\n providerIdentity: providerIdentity(fallbackProvider),\n };\n }\n\n return {\n vectors: await this.embedAllWithProvider(texts, batchSize, provider, options),\n providerIdentity: providerIdentity(provider),\n };\n }\n\n getProviderIdentity(): EmbedProviderIdentity | null {\n const provider = this.getProvider();\n return provider ? providerIdentity(provider) : null;\n }\n\n private async embedAllWithProvider(\n texts: string[],\n batchSize: number,\n provider: ProviderConfig,\n options: { signal?: AbortSignal } = {},\n ): Promise<(number[] | null)[]> {\n const results: (number[] | null)[] = new Array(texts.length).fill(null);\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n const batchResults =\n provider.type === \"host\" && provider.hostProvider?.embedBatch\n ? await this.callHostEmbedBatch(batch, provider.hostProvider, options.signal)\n : await Promise.all(\n batch.map((t) => this.callEmbed(t, provider, options.signal, \"document\")),\n );\n for (let j = 0; j < batchResults.length; j++) {\n results[i + j] = batchResults[j];\n }\n }\n return results;\n }\n\n private getProvider(): ProviderConfig | null {\n const now = Date.now();\n if (\n this.cachedProvider !== undefined &&\n now - this.cachedProviderAt < this.providerCacheTtlMs\n ) {\n return this.cachedProvider;\n }\n this.cachedProvider = this.resolveProvider();\n this.cachedProviderAt = now;\n return this.cachedProvider;\n }\n\n private resolveProvider(options: { includeHost?: boolean } = {}): ProviderConfig | null {\n if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;\n\n if (\n options.includeHost !== false &&\n resolvePipelineProcessingCapabilities(this.config).hostEmbeddingProvider !== false\n ) {\n const hostProvider = this.resolveHostEmbeddingProvider();\n if (hostProvider) {\n return {\n type: \"host\",\n model: hostProvider.model || hostProvider.id,\n hostProvider,\n };\n }\n }\n\n const preferred = this.config.embeddingFallbackProvider;\n const providers = preferred === \"auto\" ? [\"openai\", \"local\"] : [preferred];\n\n for (const p of providers) {\n if (p === \"openai\") {\n const provider = this.createOpenAiProvider();\n if (provider) return provider;\n }\n\n if (p === \"local\") {\n const provider = this.createLocalProvider();\n if (provider) return provider;\n }\n }\n\n return null;\n }\n\n private resolveFallbackProviderForIdentity(identity: EmbedProviderIdentity): ProviderConfig | null {\n if (!resolveMemoryLifecycleCapabilities(this.config).embeddingFallback) return null;\n const separator = identity.indexOf(\":\");\n if (separator <= 0 || separator === identity.length - 1) return null;\n const type = identity.slice(0, separator);\n const model = identity.slice(separator + 1);\n\n if (type === \"openai\") {\n const provider = this.createOpenAiProvider();\n return provider && provider.model === model ? provider : null;\n }\n if (type === \"local\") {\n const provider = this.createLocalProvider();\n return provider && provider.model === model ? provider : null;\n }\n return null;\n }\n\n private createOpenAiProvider(): ProviderConfig | null {\n if (!this.config.openaiApiKey) return null;\n const baseUrl = this.config.openaiBaseUrl ?? \"https://api.openai.com/v1\";\n return {\n type: \"openai\",\n model: DEFAULT_OPENAI_MODEL,\n endpoint: `${baseUrl.replace(/\\/$/, \"\")}/embeddings`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.openaiApiKey}`,\n },\n };\n }\n\n private createLocalProvider(): ProviderConfig | null {\n if (!resolveLocalLlmCapabilities(this.config).localLlm || !this.config.localLlmUrl) return null;\n const base = this.config.localLlmUrl.replace(/\\/$/, \"\");\n const endpoint = /\\/v1$/i.test(base) ? `${base}/embeddings` : `${base}/v1/embeddings`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(this.config.localLlmHeaders ?? {}),\n };\n if (this.config.localLlmApiKey && this.config.localLlmAuthHeader !== false) {\n headers.Authorization = `Bearer ${this.config.localLlmApiKey}`;\n }\n return {\n type: \"local\",\n model:\n this.config.embeddingFallbackModel ||\n this.config.localLlmModel ||\n DEFAULT_OPENAI_MODEL,\n endpoint,\n headers,\n };\n }\n\n private resolveHostEmbeddingProvider(): HostEmbeddingProvider | undefined {\n const scopedConfig = this.config as HostEmbeddingScopeConfig;\n const scopes = [\n scopedConfig.memoryDir,\n scopedConfig.hostEmbeddingProviderScope,\n ].filter((scope): scope is string => typeof scope === \"string\" && scope.trim().length > 0);\n\n for (const scope of new Set(scopes)) {\n const provider = getHostEmbeddingProvider(scope);\n if (provider) return provider;\n }\n return undefined;\n }\n\n private async callEmbed(\n input: string,\n provider: ProviderConfig,\n signal?: AbortSignal,\n inputType: HostEmbeddingInputType = \"document\",\n ): Promise<number[] | null> {\n if (provider.type === \"host\") {\n return this.callHostEmbed(input, provider.hostProvider, signal, inputType);\n }\n if (!provider.endpoint || !provider.headers) return null;\n try {\n const res = await fetch(provider.endpoint, {\n method: \"POST\",\n headers: provider.headers,\n body: JSON.stringify({\n model: provider.model,\n input: input.slice(0, 8000),\n encoding_format: \"float\",\n }),\n signal: withTimeoutSignal(signal, 30_000),\n });\n if (!res.ok) {\n log.debug(`EmbedHelper request failed: ${provider.type} ${res.status}`);\n return null;\n }\n const payload = (await res.json()) as any;\n const vector = payload?.data?.[0]?.embedding;\n return normalizeHttpEmbeddingVector(vector);\n } catch (err) {\n if (isAbortError(err)) throw err;\n log.debug(`EmbedHelper error: ${err}`);\n return null;\n }\n }\n\n private async callHostEmbed(\n input: string,\n provider: HostEmbeddingProvider | undefined,\n signal?: AbortSignal,\n inputType: HostEmbeddingInputType = \"document\",\n ): Promise<number[] | null> {\n if (!provider) return null;\n try {\n const vector = await provider.embed(input.slice(0, 8000), {\n signal: withTimeoutSignal(signal, 30_000),\n inputType,\n });\n return this.normalizeHostEmbeddingVector(vector);\n } catch (err) {\n if (isAbortError(err)) throw err;\n log.debug(`EmbedHelper host provider error: ${err}`);\n return null;\n }\n }\n\n private async callHostEmbedBatch(\n inputs: string[],\n provider: HostEmbeddingProvider,\n signal?: AbortSignal,\n ): Promise<(number[] | null)[]> {\n try {\n const vectors = await provider.embedBatch?.(\n inputs.map((input) => input.slice(0, 8000)),\n {\n signal: withTimeoutSignal(signal, 30_000),\n inputType: \"document\",\n },\n );\n if (!Array.isArray(vectors)) return inputs.map(() => null);\n return inputs.map((_, index) => this.normalizeHostEmbeddingVector(vectors[index]));\n } catch (err) {\n if (isAbortError(err)) throw err;\n log.debug(`EmbedHelper host provider batch error: ${err}`);\n return inputs.map(() => null);\n }\n }\n\n private normalizeHostEmbeddingVector(value: unknown): number[] | null {\n const vector = normalizeHostEmbeddingVector(value);\n if (!vector) return null;\n const expectedDimension = this.resolveHostEmbeddingExpectedDimension();\n if (expectedDimension !== null && vector.length !== expectedDimension) {\n return null;\n }\n return vector;\n }\n\n private resolveHostEmbeddingExpectedDimension(): number | null {\n const value = this.options.hostEmbeddingExpectedDimension;\n return typeof value === \"number\" && Number.isInteger(value) && value > 0\n ? value\n : null;\n }\n}\n\nfunction providerIdentity(provider: ProviderConfig): EmbedProviderIdentity {\n return `${provider.type}:${provider.model}`;\n}\n\nfunction normalizeHttpEmbeddingVector(vector: unknown): number[] | null {\n if (!Array.isArray(vector)) return null;\n const normalized: number[] = [];\n for (const component of vector) {\n if (typeof component !== \"number\" || !Number.isFinite(component)) {\n return null;\n }\n normalized.push(component);\n }\n return normalized;\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-U3PN77QT.js";
4
4
  import {
5
5
  resolveNamespaceCapabilities
6
- } from "./chunk-RJBW4EOU.js";
6
+ } from "./chunk-G7Q4D2G3.js";
7
7
 
8
8
  // src/namespaces/principal.ts
9
9
  var MAX_REGEX_SESSION_KEY_LENGTH = 512;
@@ -92,4 +92,4 @@ export {
92
92
  defaultNamespaceForPrincipal,
93
93
  recallNamespacesForPrincipal
94
94
  };
95
- //# sourceMappingURL=chunk-DS3FZ7GS.js.map
95
+ //# sourceMappingURL=chunk-OUSOMUFV.js.map
@@ -11,13 +11,13 @@ import {
11
11
  defaultNamespaceForPrincipal,
12
12
  recallNamespacesForPrincipal,
13
13
  resolvePrincipal
14
- } from "./chunk-DS3FZ7GS.js";
14
+ } from "./chunk-OUSOMUFV.js";
15
15
  import {
16
16
  isSafeRouteNamespace
17
17
  } from "./chunk-U3PN77QT.js";
18
18
  import {
19
19
  resolveNamespaceCapabilities
20
- } from "./chunk-RJBW4EOU.js";
20
+ } from "./chunk-G7Q4D2G3.js";
21
21
  import {
22
22
  expandTildePath
23
23
  } from "./chunk-EYIEWJNI.js";
@@ -772,4 +772,4 @@ export {
772
772
  resolveNamespaceFromStorageDir,
773
773
  resolveWritableNamespaceValue
774
774
  };
775
- //# sourceMappingURL=chunk-7B7IPPN5.js.map
775
+ //# sourceMappingURL=chunk-OVYBENIJ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runPostConsolidationMaterialize
3
- } from "./chunk-GEXI357K.js";
3
+ } from "./chunk-C7C5WIIF.js";
4
4
  import {
5
5
  discoverMemoryExtensions,
6
6
  renderExtensionsBlock,
@@ -13,6 +13,9 @@ import {
13
13
  import {
14
14
  isSemanticConsolidationLlmOperator
15
15
  } from "./chunk-G7D6GZ5J.js";
16
+ import {
17
+ resolvePipelineProcessingCapabilities
18
+ } from "./chunk-G7Q4D2G3.js";
16
19
  import {
17
20
  log
18
21
  } from "./chunk-NU3CSQ4H.js";
@@ -197,7 +200,7 @@ function findLastJsonObjectWithOperator(text) {
197
200
  return last;
198
201
  }
199
202
  async function buildExtensionsBlockForConsolidation(config) {
200
- if (!config.memoryExtensionsEnabled) return "";
203
+ if (!resolvePipelineProcessingCapabilities(config).memoryExtensions) return "";
201
204
  const root = resolveExtensionsRoot(config);
202
205
  const extensions = await discoverMemoryExtensions(root, log);
203
206
  if (extensions.length === 0) return "";
@@ -217,4 +220,4 @@ export {
217
220
  buildExtensionsBlockForConsolidation,
218
221
  materializeAfterSemanticConsolidation
219
222
  };
220
- //# sourceMappingURL=chunk-5RZOFIDL.js.map
223
+ //# sourceMappingURL=chunk-PI4JHLDD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/semantic-consolidation.ts"],"sourcesContent":["/**\n * semantic-consolidation.ts — Semantic Consolidation Engine\n *\n * Finds clusters of semantically similar memories using token overlap,\n * synthesizes canonical versions via LLM, and archives the originals.\n * Reduces memory store bloat while preserving all unique information.\n */\n\nimport type { MemoryFile, PluginConfig } from \"./types.js\";\nimport { normalizeRecallTokens, countRecallTokenOverlap } from \"./recall-tokenization.js\";\nimport { runPostConsolidationMaterialize } from \"./connectors/codex-materialize-runner.js\";\nimport type { MaterializeResult, RolloutSummaryInput } from \"./connectors/codex-materialize.js\";\nimport { discoverMemoryExtensions, renderExtensionsBlock, resolveExtensionsRoot } from \"./memory-extension-host/index.js\";\nimport { log } from \"./logger.js\";\nimport { resolvePipelineProcessingCapabilities } from \"./capabilities.js\";\n\n// Re-export resolveExtensionsRoot for backward compatibility — existing\n// consumers that import from semantic-consolidation.ts continue to work.\nexport { resolveExtensionsRoot } from \"./memory-extension-host/index.js\";\n\n// Operator vocabulary (issue #561). The types and validators live in a\n// standalone `consolidation-operator.ts` module so `storage.ts` can import\n// them without creating a `storage → semantic-consolidation →\n// codex-materialize-runner → storage` cycle. Re-exported here so existing\n// consumers that reach for `./semantic-consolidation.js` keep working.\nexport {\n CONSOLIDATION_OPERATORS,\n isConsolidationOperator,\n isSemanticConsolidationLlmOperator,\n isValidDerivedFromEntry,\n type ConsolidationOperator,\n type SemanticConsolidationLlmOperator,\n} from \"./consolidation-operator.js\";\n\nimport {\n CONSOLIDATION_OPERATORS as _CONSOLIDATION_OPERATORS,\n isConsolidationOperator as _isConsolidationOperator,\n isSemanticConsolidationLlmOperator as _isSemanticConsolidationLlmOperator,\n type ConsolidationOperator as _ConsolidationOperator,\n type SemanticConsolidationLlmOperator as _SemanticConsolidationLlmOperator,\n} from \"./consolidation-operator.js\";\n\nexport interface ConsolidationCluster {\n category: string;\n memories: MemoryFile[];\n overlapScore: number;\n canonicalContent?: string;\n}\n\nexport interface SemanticConsolidationResult {\n clustersFound: number;\n memoriesConsolidated: number;\n memoriesArchived: number;\n errors: number;\n clusters: ConsolidationCluster[];\n}\n\n/**\n * Find clusters of semantically similar memories using token overlap.\n */\nexport function findSimilarClusters(\n memories: MemoryFile[],\n config: {\n threshold: number;\n minClusterSize: number;\n excludeCategories: string[];\n maxPerRun: number;\n },\n): ConsolidationCluster[] {\n const excluded = new Set(config.excludeCategories);\n\n // Group by category first\n const byCategory = new Map<string, MemoryFile[]>();\n for (const m of memories) {\n const cat = m.frontmatter.category;\n if (excluded.has(cat)) continue;\n if (m.frontmatter.status && m.frontmatter.status !== \"active\") continue;\n const list = byCategory.get(cat) ?? [];\n list.push(m);\n byCategory.set(cat, list);\n }\n\n const clusters: ConsolidationCluster[] = [];\n let totalCandidates = 0;\n\n for (const [category, mems] of byCategory) {\n if (totalCandidates >= config.maxPerRun) break;\n\n // Token-normalize all memories in this category\n const tokenized = mems.map((m) => ({\n memory: m,\n tokens: new Set(normalizeRecallTokens(m.content, [])),\n }));\n\n // Track which memories are already clustered\n const clustered = new Set<string>();\n\n for (let i = 0; i < tokenized.length && totalCandidates < config.maxPerRun; i++) {\n const remainingBudget = config.maxPerRun - totalCandidates;\n if (remainingBudget < config.minClusterSize) break;\n if (clustered.has(tokenized[i].memory.frontmatter.id)) continue;\n\n const cluster: MemoryFile[] = [tokenized[i].memory];\n let totalOverlap = 0;\n let comparisons = 0;\n\n for (let j = i + 1; j < tokenized.length && cluster.length < remainingBudget; j++) {\n if (clustered.has(tokenized[j].memory.frontmatter.id)) continue;\n\n const aTokens = tokenized[i].tokens;\n const bTokens = tokenized[j].tokens;\n if (aTokens.size === 0 || bTokens.size === 0) continue;\n\n // Bidirectional overlap: what fraction of tokens are shared\n const overlap = countRecallTokenOverlap(aTokens, [...bTokens].join(\" \"));\n const maxTokens = Math.max(aTokens.size, bTokens.size);\n const score = maxTokens > 0 ? overlap / maxTokens : 0;\n\n if (score >= config.threshold) {\n cluster.push(tokenized[j].memory);\n totalOverlap += score;\n comparisons++;\n }\n }\n\n if (cluster.length >= config.minClusterSize) {\n for (const m of cluster) clustered.add(m.frontmatter.id);\n clusters.push({\n category,\n memories: cluster,\n overlapScore: comparisons > 0 ? totalOverlap / comparisons : 0,\n });\n totalCandidates += cluster.length;\n }\n }\n }\n\n return clusters;\n}\n\n/**\n * Build the LLM prompt for synthesizing a canonical memory from a cluster.\n */\nexport function buildConsolidationPrompt(cluster: ConsolidationCluster): string {\n const memoryTexts = cluster.memories\n .map(\n (m, i) =>\n `Memory ${i + 1} (${m.frontmatter.id}, created ${m.frontmatter.created}):\\n${m.content}`,\n )\n .join(\"\\n\\n\");\n\n return `You are a memory consolidation system. The following ${cluster.memories.length} memories in the \"${cluster.category}\" category contain overlapping information.\n\nSynthesize them into ONE canonical memory that:\n1. Preserves ALL unique information from every source memory\n2. Removes redundancy and repetition\n3. Uses clear, concise language\n4. Maintains the same category and tone\n5. Does NOT add information that isn't in the sources\n\n${memoryTexts}\n\nWrite ONLY the consolidated memory content (no metadata, no explanation, no preamble):`;\n}\n\n/**\n * Parse the LLM response to extract the canonical content.\n */\nexport function parseConsolidationResponse(response: string): string {\n return response.trim();\n}\n\n// ─── Operator-aware prompt / parse (issue #561 PR 3) ─────────────────────────\n\n/**\n * Structured result from an operator-aware consolidation LLM call.\n *\n * - `operator` — the consolidation operator the LLM chose for this cluster.\n * Falls back to the heuristic default when the LLM omits or returns an\n * unknown value (the parser never surfaces an invalid operator; see\n * `parseOperatorAwareConsolidationResponse`).\n * - `output` — the canonical content (same format the legacy prompt\n * returns). Callers persist this as the body of the new memory.\n */\nexport interface OperatorAwareConsolidationResult {\n // Restricted to the LLM-allowed subset (Cursor Bugbot, PR #730):\n // `pattern-reinforcement` is reserved for the maintenance job and\n // must never reach this struct from a consolidation LLM response.\n operator: _SemanticConsolidationLlmOperator;\n output: string;\n}\n\n/**\n * Heuristic default operator for a cluster. Used as the fallback when the\n * LLM does not return a parseable operator, and as the \"floor\" decision in\n * `parseOperatorAwareConsolidationResponse`.\n *\n * Current heuristic (kept deliberately conservative — PR 3 only):\n *\n * - Two or more memories being collapsed into one canonical blob is a\n * MERGE by definition. This is the path the current clustering\n * pipeline exercises.\n * - A cluster of size 1 that still reaches consolidation (future path,\n * e.g. supersession of a single older memory by a newer value) is an\n * UPDATE.\n * - SPLIT is never selected by the heuristic because the current write\n * path emits exactly one canonical memory per cluster. The prompt\n * reserves SPLIT for future cluster shapes where the LLM decides one\n * logical source actually encodes several distinct facts — at which\n * point the orchestrator would need to write multiple outputs.\n */\nexport function chooseConsolidationOperator(\n cluster: ConsolidationCluster,\n): _SemanticConsolidationLlmOperator {\n if (cluster.memories.length <= 1) return \"update\";\n return \"merge\";\n}\n\n/**\n * Build the operator-aware LLM prompt. The LLM is asked to return a\n * JSON object `{ \"operator\": <split|merge|update>, \"output\": <content> }`.\n *\n * The prompt is additive: it still asks for a single canonical blob under\n * `output`, so the upstream write path does not change. Future expansions\n * (SPLIT emitting multiple outputs) are explicitly documented as\n * out-of-scope for the parser — `parseOperatorAwareConsolidationResponse`\n * collapses any SPLIT response into a single canonical output for now.\n */\nexport function buildOperatorAwareConsolidationPrompt(\n cluster: ConsolidationCluster,\n): string {\n const memoryTexts = cluster.memories\n .map(\n (m, i) =>\n `Memory ${i + 1} (${m.frontmatter.id}, created ${m.frontmatter.created}):\\n${m.content}`,\n )\n .join(\"\\n\\n\");\n\n return `You are a memory consolidation system. The following ${cluster.memories.length} memories in the \"${cluster.category}\" category contain overlapping information.\n\nPick exactly ONE consolidation operator for this cluster and return a JSON object.\n\nOperator vocabulary:\n - \"merge\" — multiple distinct source memories overlap and should be collapsed into one canonical memory (most common).\n - \"update\" — one source memory carries a stale value that a newer source supersedes within the same logical fact.\n - \"split\" — a single logical source really encodes multiple distinct facts that should be separated (rare; if you pick split, still emit ONE canonical body — the write path will chunk it later).\n\nOutput JSON ONLY, no prose before or after. The \"operator\" key MUST be set to exactly one of the three strings \"merge\", \"update\", or \"split\" — never a pipe-separated placeholder like \"merge|update|split\". Example shape:\n {\n \"operator\": \"merge\",\n \"output\": \"<the canonical memory text>\"\n }\n\nThe \"output\" value must:\n1. Preserve ALL unique information from every source memory\n2. Remove redundancy and repetition\n3. Use clear, concise language\n4. Match the \"${cluster.category}\" category and tone\n5. NOT add information that isn't in the sources\n\n${memoryTexts}\n\nReturn ONLY the JSON object:`;\n}\n\n/**\n * Parse an operator-aware consolidation response.\n *\n * Contract:\n * - Accepts strict JSON `{ \"operator\": \"...\", \"output\": \"...\" }`.\n * - Tolerates a JSON payload wrapped in a fenced code block (```json ...```).\n * - Falls back to the heuristic operator when the JSON is malformed,\n * the `operator` field is missing / unknown, or the raw response is\n * a plain blob with no JSON at all. This keeps PR 3 backwards\n * compatible with older models that ignore the JSON instruction.\n * - Never throws. A missing / empty `output` field falls back to the\n * trimmed raw response so the caller still writes something rather\n * than dropping the cluster.\n */\nexport function parseOperatorAwareConsolidationResponse(\n response: string,\n cluster: ConsolidationCluster,\n): OperatorAwareConsolidationResult {\n const fallback: OperatorAwareConsolidationResult = {\n operator: chooseConsolidationOperator(cluster),\n output: response.trim(),\n };\n\n const trimmed = response.trim();\n if (trimmed.length === 0) return fallback;\n\n // Strip a fenced code block if present.\n // Dropped the \\s* groups around the lazy body (they overlapped it and\n // backtracked polynomially — CodeQL js/polynomial-redos). Input is already\n // trimmed and fenced[1] is trimmed below, so matches are identical.\n const fenced = /^```(?:json)?([\\s\\S]*?)```$/u.exec(trimmed);\n const payload = fenced ? fenced[1].trim() : trimmed;\n\n // Find a balanced brace-delimited JSON object that has an `operator`\n // key (PR #632 round-4 review, codex P1). A first/last-brace slice\n // breaks when the model prepends an earlier brace block (e.g.\n // `Example: {\"note\":\"...\"} ... {\"operator\":\"merge\",...}`). Walk the\n // payload tracking nesting + string/escape state and skip past\n // objects that don't look like our target shape.\n const parsed = findLastJsonObjectWithOperator(payload);\n if (parsed === undefined) return fallback;\n if (typeof parsed !== \"object\" || parsed === null) return fallback;\n\n const obj = parsed as Record<string, unknown>;\n const rawOperator = typeof obj.operator === \"string\" ? obj.operator.trim().toLowerCase() : \"\";\n const rawOutput = typeof obj.output === \"string\" ? obj.output : \"\";\n\n // Narrow gate (Cursor Bugbot review on PR #730 head `aa1c2a8`):\n // accept ONLY the legacy split/merge/update LLM vocabulary here.\n // `pattern-reinforcement` joined the broader `ConsolidationOperator`\n // type in #687 PR 2/4 but is reserved for the maintenance job — if\n // an LLM hallucinates that operator we must NOT promote it onto\n // `derived_via`.\n const operator = _isSemanticConsolidationLlmOperator(rawOperator)\n ? rawOperator\n : chooseConsolidationOperator(cluster);\n const output = rawOutput.trim().length > 0 ? rawOutput.trim() : response.trim();\n\n return { operator, output };\n}\n\n/**\n * Walk `text`, find all balanced top-level `{ ... }` blocks whose\n * JSON.parse result is an object with an `operator` key, and return\n * the LAST one (function name reflects this — PR #632 review,\n * cursor Low). Returns `undefined` when nothing matches. Tracks\n * string state + escape sequences so braces inside string values\n * don't throw off the depth counter.\n *\n * Used by `parseOperatorAwareConsolidationResponse` to tolerate models\n * that prepend an explanatory JSON example block before the real\n * payload (PR #632 round-4 + round-5 review, codex P1). We take the\n * LAST candidate so that an instructional example with an `operator`\n * key ahead of the real answer doesn't steal precedence — models\n * typically write the example first and the real answer last.\n */\nfunction findLastJsonObjectWithOperator(text: string): unknown {\n let searchFrom = 0;\n let last: unknown = undefined;\n while (searchFrom < text.length) {\n const start = text.indexOf(\"{\", searchFrom);\n if (start < 0) return last;\n let depth = 0;\n let inString = false;\n let escape = false;\n let closed = false;\n let endIdx = -1;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === \"\\\\\") {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n if (ch === '\"') {\n inString = true;\n } else if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) {\n closed = true;\n endIdx = i;\n break;\n }\n }\n }\n if (!closed) return last;\n const slice = text.slice(start, endIdx + 1);\n try {\n const parsed = JSON.parse(slice);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"operator\" in (parsed as Record<string, unknown>)\n ) {\n last = parsed;\n }\n } catch {\n // Fall through to the next candidate.\n }\n searchFrom = endIdx + 1;\n }\n return last;\n}\n\n// Silence unused-import warnings when tsup tree-shakes: these are used\n// above in chooseConsolidationOperator + parse helpers.\nvoid _CONSOLIDATION_OPERATORS;\n\n/**\n * Discover extensions and build the block to append to a consolidation prompt.\n * Returns \"\" when extensions are disabled or none are found.\n */\nexport async function buildExtensionsBlockForConsolidation(\n config: PluginConfig,\n): Promise<string> {\n if (!resolvePipelineProcessingCapabilities(config).memoryExtensions) return \"\";\n const root = resolveExtensionsRoot(config);\n const extensions = await discoverMemoryExtensions(root, log);\n if (extensions.length === 0) return \"\";\n return renderExtensionsBlock(extensions);\n}\n\n/**\n * Optional post-consolidation hook — materializes the namespace into Codex's\n * native memory layout when the consolidation run finishes. Kept here (rather\n * than in orchestrator.ts) so #378 doesn't conflict with Wave 1 edits.\n *\n * Safe to call regardless of config state: honors `codexMaterializeMemories`\n * and `codexMaterializeOnConsolidation` and silently becomes a no-op when\n * either is disabled.\n */\nexport async function materializeAfterSemanticConsolidation(options: {\n config: PluginConfig;\n namespace?: string;\n memories?: MemoryFile[];\n memoryDir?: string;\n codexHome?: string;\n rolloutSummaries?: RolloutSummaryInput[];\n now?: Date;\n}): Promise<MaterializeResult | null> {\n // Delegates to the shared post-consolidation helper so semantic and causal\n // flows stay in lock-step — any guard/logging change happens in one place.\n return runPostConsolidationMaterialize(\"[semantic-consolidation]\", options);\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listNamespaces
3
- } from "./chunk-56LP72AD.js";
3
+ } from "./chunk-UYYSOMS2.js";
4
4
  import {
5
5
  runConsolidationProvenanceCheck
6
6
  } from "./chunk-7XH7VJN4.js";
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-CMTINOFS.js";
13
13
  import {
14
14
  summarizeNamespaceMaintenanceHealth
15
- } from "./chunk-TNLXCSXV.js";
15
+ } from "./chunk-O4IWVWSW.js";
16
16
  import {
17
17
  analyzeSessionIntegrity,
18
18
  applySessionRepair,
@@ -39,13 +39,13 @@ import {
39
39
  import {
40
40
  listMemoryGovernanceRuns,
41
41
  readMemoryGovernanceRunArtifact
42
- } from "./chunk-24ZLC5QN.js";
42
+ } from "./chunk-7N7S2RKF.js";
43
43
  import {
44
44
  analyzeGraphHealth
45
45
  } from "./chunk-EHQ5HO5T.js";
46
46
  import {
47
47
  StorageManager
48
- } from "./chunk-Q6BAA57B.js";
48
+ } from "./chunk-JFCS6PQU.js";
49
49
  import {
50
50
  lintWorkspaceFiles
51
51
  } from "./chunk-DM2T26WE.js";
@@ -57,7 +57,7 @@ import {
57
57
  resolveIndexingCapabilities,
58
58
  resolvePresentationCapabilities,
59
59
  resolveQmdCapabilities
60
- } from "./chunk-RJBW4EOU.js";
60
+ } from "./chunk-G7Q4D2G3.js";
61
61
  import {
62
62
  readEnvVar,
63
63
  resolveHomeDir
@@ -882,7 +882,7 @@ async function summarizeGraphEdgeDecayStatus(config) {
882
882
  }
883
883
  async function summarizeTierDistribution(storage) {
884
884
  try {
885
- const { summarizeTiers } = await import("./tier-stats-QID73BBB.js");
885
+ const { summarizeTiers } = await import("./tier-stats-CSKL7BDG.js");
886
886
  const summary = await summarizeTiers(storage);
887
887
  const storageDir = storage.dir ?? "";
888
888
  const journalPath = storageDir.length > 0 ? path.join(storageDir, "state", "tier-migration-journal.jsonl") : null;
@@ -1452,4 +1452,4 @@ export {
1452
1452
  runBenchmarkRecall,
1453
1453
  runOperatorRepair
1454
1454
  };
1455
- //# sourceMappingURL=chunk-EU543UDC.js.map
1455
+ //# sourceMappingURL=chunk-QCO2QFLZ.js.map