@remnic/core 9.3.739 → 9.3.740

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 (185) 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/schemas.d.ts +22 -22
  105. package/dist/search/embed-helper.js +2 -2
  106. package/dist/search/factory.js +3 -3
  107. package/dist/search/index.js +3 -3
  108. package/dist/semantic-consolidation.js +4 -3
  109. package/dist/semantic-rule-promotion.js +2 -2
  110. package/dist/semantic-rule-verifier.js +2 -2
  111. package/dist/shared-context/manager.js +2 -1
  112. package/dist/storage.d.ts +1 -1
  113. package/dist/storage.js +1 -1
  114. package/dist/summarizer.js +3 -3
  115. package/dist/{tier-stats-QID73BBB.js → tier-stats-CSKL7BDG.js} +2 -2
  116. package/dist/transfer/types.d.ts +12 -12
  117. package/dist/verified-recall.js +2 -2
  118. package/package.json +2 -2
  119. package/src/access-service.ts +2 -1
  120. package/src/capabilities.test.ts +166 -0
  121. package/src/capabilities.ts +267 -0
  122. package/src/cli/research-status-commands.ts +2 -1
  123. package/src/cli.ts +3 -2
  124. package/src/compounding/engine.ts +2 -1
  125. package/src/connectors/codex-marketplace.ts +2 -1
  126. package/src/day-summary.ts +2 -1
  127. package/src/embedding-fallback.ts +2 -1
  128. package/src/extraction.ts +3 -2
  129. package/src/local-llm.ts +2 -1
  130. package/src/maintenance/namespace-maintenance-fanout.ts +2 -1
  131. package/src/maintenance/namespace-planner.ts +2 -1
  132. package/src/operator-toolkit.ts +1 -0
  133. package/src/orchestration/semantic-consolidation-coordinator.ts +3 -2
  134. package/src/orchestrator.ts +50 -46
  135. package/src/search/embed-helper.ts +2 -1
  136. package/src/search/factory.ts +2 -1
  137. package/src/semantic-consolidation.ts +2 -1
  138. package/src/shared-context/manager.ts +3 -2
  139. package/src/storage.ts +1 -1
  140. package/src/summarizer.ts +3 -2
  141. package/dist/chunk-23PLOBWT.js.map +0 -1
  142. package/dist/chunk-5RZOFIDL.js.map +0 -1
  143. package/dist/chunk-75PDC7VT.js.map +0 -1
  144. package/dist/chunk-BVG2IZOB.js.map +0 -1
  145. package/dist/chunk-EO5QWINU.js.map +0 -1
  146. package/dist/chunk-EU543UDC.js.map +0 -1
  147. package/dist/chunk-IEWUPZ75.js.map +0 -1
  148. package/dist/chunk-JQSP7YBJ.js.map +0 -1
  149. package/dist/chunk-MAU7DFCJ.js.map +0 -1
  150. package/dist/chunk-Q6BAA57B.js.map +0 -1
  151. package/dist/chunk-TNLXCSXV.js.map +0 -1
  152. package/dist/chunk-UFS7OXGL.js.map +0 -1
  153. package/dist/chunk-WVAEIKUY.js.map +0 -1
  154. package/dist/chunk-XIQAOGAA.js.map +0 -1
  155. package/dist/chunk-Y5OOHER4.js.map +0 -1
  156. package/dist/chunk-YXOXAQ5Y.js.map +0 -1
  157. /package/dist/{chunk-IFCM6OLK.js.map → chunk-3TUDKDTQ.js.map} +0 -0
  158. /package/dist/{chunk-A7INTIC5.js.map → chunk-4J53ZVPQ.js.map} +0 -0
  159. /package/dist/{chunk-XYUFGHUW.js.map → chunk-56F6EAQ6.js.map} +0 -0
  160. /package/dist/{chunk-F6OEXJQQ.js.map → chunk-6XG3NQRC.js.map} +0 -0
  161. /package/dist/{chunk-24ZLC5QN.js.map → chunk-7N7S2RKF.js.map} +0 -0
  162. /package/dist/{chunk-VRBBZH4U.js.map → chunk-AX4TRSRE.js.map} +0 -0
  163. /package/dist/{chunk-66RZ4EIT.js.map → chunk-BE6NEQLF.js.map} +0 -0
  164. /package/dist/{chunk-YF2MMBKA.js.map → chunk-BJPL5WAL.js.map} +0 -0
  165. /package/dist/{chunk-GEXI357K.js.map → chunk-C7C5WIIF.js.map} +0 -0
  166. /package/dist/{chunk-L3TYGUTH.js.map → chunk-CMPXLMC3.js.map} +0 -0
  167. /package/dist/{chunk-W2FBVBQ4.js.map → chunk-DBVBV2RF.js.map} +0 -0
  168. /package/dist/{chunk-IQOEW5YV.js.map → chunk-FCQ7ZYCQ.js.map} +0 -0
  169. /package/dist/{chunk-IIBFCZA7.js.map → chunk-FWXLKH2H.js.map} +0 -0
  170. /package/dist/{chunk-CKHPUOAP.js.map → chunk-K2N6WIZM.js.map} +0 -0
  171. /package/dist/{chunk-BHJAMSVC.js.map → chunk-LD6A7XG5.js.map} +0 -0
  172. /package/dist/{chunk-AKKFHN3I.js.map → chunk-M4WI23X3.js.map} +0 -0
  173. /package/dist/{chunk-N2O23WYA.js.map → chunk-M5KLYHHI.js.map} +0 -0
  174. /package/dist/{chunk-OQQRWPFZ.js.map → chunk-OS5RKJOH.js.map} +0 -0
  175. /package/dist/{chunk-DS3FZ7GS.js.map → chunk-OUSOMUFV.js.map} +0 -0
  176. /package/dist/{chunk-7B7IPPN5.js.map → chunk-OVYBENIJ.js.map} +0 -0
  177. /package/dist/{chunk-WDJCZQB4.js.map → chunk-UGFPGWJB.js.map} +0 -0
  178. /package/dist/{chunk-56LP72AD.js.map → chunk-UYYSOMS2.js.map} +0 -0
  179. /package/dist/{chunk-QTJOORGN.js.map → chunk-WIMKOTNY.js.map} +0 -0
  180. /package/dist/{chunk-GXTYEG7Q.js.map → chunk-WO22UEM3.js.map} +0 -0
  181. /package/dist/{chunk-C53JDEH3.js.map → chunk-Y62QPRKV.js.map} +0 -0
  182. /package/dist/{chunk-WFNH4UDF.js.map → chunk-Y6PNYJVO.js.map} +0 -0
  183. /package/dist/{contradiction-scan-CWO3LIWV.js.map → contradiction-scan-UERKJESC.js.map} +0 -0
  184. /package/dist/{first-start-migration-5DXD3TF2.js.map → first-start-migration-GQ3UQNIL.js.map} +0 -0
  185. /package/dist/{tier-stats-QID73BBB.js.map → tier-stats-CSKL7BDG.js.map} +0 -0
@@ -275,7 +275,11 @@ import { resolveNamespaceCapabilities,
275
275
  resolveQmdCapabilities,
276
276
  resolveIdentityContinuityCapabilities,
277
277
  resolveLocalLlmCapabilities,
278
- resolveSecurityCapabilities, resolveEvalCapabilities, resolveUtilityLearningCapabilities, resolveObjectiveStateCapabilities, resolveCompressionCapabilities, resolvePresentationCapabilities, resolveConsolidationCapabilities, resolveRecallAuxiliaryCapabilities } from "./capabilities.js";
278
+ resolveSecurityCapabilities, resolveEvalCapabilities, resolveUtilityLearningCapabilities, resolveObjectiveStateCapabilities, resolveCompressionCapabilities, resolvePresentationCapabilities, resolveConsolidationCapabilities, resolveRecallAuxiliaryCapabilities ,
279
+ resolveRecallEnhancementCapabilities,
280
+ resolvePipelineProcessingCapabilities,
281
+ resolveConversationContextCapabilities,
282
+ } from "./capabilities.js";
279
283
  import { DEFAULT_TAXONOMY } from "./taxonomy/index.js";
280
284
  import {
281
285
  searchHarmonicRetrieval,
@@ -2767,7 +2771,7 @@ export class Orchestrator {
2767
2771
  constructor(config: PluginConfig) {
2768
2772
  this.config = config;
2769
2773
  this.profiler = new ProfilingCollector({
2770
- enabled: config.profilingEnabled,
2774
+ enabled: resolvePipelineProcessingCapabilities(this.config).profiling,
2771
2775
  storageDir: config.profilingStorageDir || path.join(config.memoryDir, "profiling"),
2772
2776
  maxTraces: config.profilingMaxTraces,
2773
2777
  });
@@ -2856,7 +2860,7 @@ export class Orchestrator {
2856
2860
  this.conversationQmd = conversationIndexRuntime.qmd;
2857
2861
  this.conversationFaiss = conversationIndexRuntime.faiss;
2858
2862
  this.conversationIndexBackend = conversationIndexRuntime.backend;
2859
- this.sharedContext = config.sharedContextEnabled
2863
+ this.sharedContext = resolveConversationContextCapabilities(this.config).sharedContext
2860
2864
  ? new SharedContextManager(config)
2861
2865
  : undefined;
2862
2866
  this.compounding = resolveConsolidationCapabilities(config).compounding
@@ -2934,7 +2938,7 @@ export class Orchestrator {
2934
2938
  // timeout. Operators can set `localLlmDisableThinking: false`
2935
2939
  // when they want thinking enabled for narrative paths.
2936
2940
  this.localLlm.disableThinking = config.localLlmDisableThinking;
2937
- this.fastLlm = config.localLlmFastEnabled
2941
+ this.fastLlm = resolvePipelineProcessingCapabilities(this.config).localLlmFast
2938
2942
  ? (() => {
2939
2943
  const client = new LocalLlmClient(
2940
2944
  {
@@ -3007,7 +3011,7 @@ export class Orchestrator {
3007
3011
  });
3008
3012
 
3009
3013
  // Lossless Context Management (LCM) — proactive session archive + DAG summarization
3010
- if (config.lcmEnabled) {
3014
+ if (resolvePipelineProcessingCapabilities(this.config).lcm) {
3011
3015
  const summarizeFn = async (
3012
3016
  text: string,
3013
3017
  targetTokens: number,
@@ -3064,7 +3068,7 @@ export class Orchestrator {
3064
3068
  dir,
3065
3069
  new BoxBuilder(dir, {
3066
3070
  memoryBoxesEnabled: resolvePresentationCapabilities(this.config).memoryBoxes,
3067
- traceWeaverEnabled: this.config.traceWeaverEnabled,
3071
+ traceWeaverEnabled: resolvePipelineProcessingCapabilities(this.config).traceWeaver,
3068
3072
  boxTopicShiftThreshold: this.config.boxTopicShiftThreshold,
3069
3073
  boxTimeGapMs: this.config.boxTimeGapMs,
3070
3074
  boxMaxMemories: this.config.boxMaxMemories,
@@ -3157,7 +3161,7 @@ export class Orchestrator {
3157
3161
  }
3158
3162
 
3159
3163
  private async loadRoutingRules(): Promise<RouteRule[]> {
3160
- if (!this.config.routingRulesEnabled) return [];
3164
+ if (!resolvePipelineProcessingCapabilities(this.config).routingRules) return [];
3161
3165
  try {
3162
3166
  return await this.getRoutingRulesStore().read(this.routeEngineOptions());
3163
3167
  } catch (err) {
@@ -6872,7 +6876,7 @@ export class Orchestrator {
6872
6876
  signal: options.abortSignal,
6873
6877
  });
6874
6878
  if (
6875
- this.config.recallPlannerTelemetryEnabled &&
6879
+ resolveRecallEnhancementCapabilities(this.config).recallPlannerTelemetry &&
6876
6880
  recallDecision.plannerSource &&
6877
6881
  recallDecision.plannerSource !== "heuristic"
6878
6882
  ) {
@@ -7406,7 +7410,7 @@ export class Orchestrator {
7406
7410
  if (
7407
7411
  !this.isRecallSectionEnabled(
7408
7412
  "shared-context",
7409
- this.config.sharedContextEnabled === true,
7413
+ resolveConversationContextCapabilities(this.config).sharedContext === true,
7410
7414
  )
7411
7415
  )
7412
7416
  return null;
@@ -7530,7 +7534,7 @@ export class Orchestrator {
7530
7534
  | null
7531
7535
  | undefined = undefined;
7532
7536
  const peerProfileRecallPromise = (async (): Promise<string | null> => {
7533
- if (!this.config.peerProfileRecallEnabled) return null;
7537
+ if (!resolveRecallEnhancementCapabilities(this.config).peerProfileRecall) return null;
7534
7538
  if (this.config.peerProfileRecallMaxFields <= 0) return null;
7535
7539
  const peerId = this.getPeerIdForSession(sessionKey);
7536
7540
  if (!peerId) return null;
@@ -7937,11 +7941,11 @@ export class Orchestrator {
7937
7941
  const causalTrajectoryPromise = (async (): Promise<string | null> => {
7938
7942
  const t0 = Date.now();
7939
7943
  if (
7940
- !this.config.causalTrajectoryMemoryEnabled ||
7941
- !this.config.causalTrajectoryRecallEnabled ||
7944
+ !resolveRecallEnhancementCapabilities(this.config).causalTrajectoryMemory ||
7945
+ !resolveRecallEnhancementCapabilities(this.config).causalTrajectoryRecall ||
7942
7946
  !this.isRecallSectionEnabled(
7943
7947
  "causal-trajectories",
7944
- this.config.causalTrajectoryRecallEnabled === true,
7948
+ resolveRecallEnhancementCapabilities(this.config).causalTrajectoryRecall === true,
7945
7949
  )
7946
7950
  ) {
7947
7951
  recordRecallSectionMetric({
@@ -7994,10 +7998,10 @@ export class Orchestrator {
7994
7998
  const cmcRetrievalPromise = (async (): Promise<string | null> => {
7995
7999
  const t0 = Date.now();
7996
8000
  if (
7997
- !this.config.cmcRetrievalEnabled ||
8001
+ !resolveRecallEnhancementCapabilities(this.config).cmcRetrieval ||
7998
8002
  !this.isRecallSectionEnabled(
7999
8003
  "cmc-causal-chains",
8000
- this.config.cmcRetrievalEnabled === true,
8004
+ resolveRecallEnhancementCapabilities(this.config).cmcRetrieval === true,
8001
8005
  )
8002
8006
  ) {
8003
8007
  recordRecallSectionMetric({
@@ -8995,7 +8999,7 @@ export class Orchestrator {
8995
8999
  let section: string | null = null;
8996
9000
  // Try checkpoint first (post-compaction recovery)
8997
9001
  let checkpointInjected = false;
8998
- if (this.config.checkpointEnabled) {
9002
+ if (resolvePipelineProcessingCapabilities(this.config).checkpoint) {
8999
9003
  const checkpoint = await this.transcript.loadCheckpoint(sessionKey);
9000
9004
  log.debug(
9001
9005
  `recall: checkpoint loaded, turns=${checkpoint?.turns?.length ?? 0}`,
@@ -9128,7 +9132,7 @@ export class Orchestrator {
9128
9132
  const summariesPromise = (async (): Promise<string | null> => {
9129
9133
  const t0 = Date.now();
9130
9134
  if (
9131
- !this.config.hourlySummariesEnabled ||
9135
+ !resolvePipelineProcessingCapabilities(this.config).hourlySummaries ||
9132
9136
  !sessionKey ||
9133
9137
  !this.isRecallSectionEnabled("summaries", true)
9134
9138
  ) {
@@ -9358,7 +9362,7 @@ export class Orchestrator {
9358
9362
  const t0 = Date.now();
9359
9363
  if (
9360
9364
  !this.compounding ||
9361
- !this.config.compoundingInjectEnabled ||
9365
+ !resolveRecallEnhancementCapabilities(this.config).compoundingInject ||
9362
9366
  !this.isRecallSectionEnabled("compounding", true)
9363
9367
  ) {
9364
9368
  recordRecallSectionMetric({
@@ -9699,7 +9703,7 @@ export class Orchestrator {
9699
9703
  this.getRecallSectionMaxChars("explicit-cue") ??
9700
9704
  this.config.explicitCueRecallMaxChars;
9701
9705
  if (
9702
- this.config.explicitCueRecallEnabled &&
9706
+ resolveRecallEnhancementCapabilities(this.config).explicitCueRecall &&
9703
9707
  this.isRecallSectionEnabled("explicit-cue") &&
9704
9708
  explicitCueMaxChars !== 0 &&
9705
9709
  this.lcmEngine?.enabled &&
@@ -9742,7 +9746,7 @@ export class Orchestrator {
9742
9746
  if (
9743
9747
  this.isSpecializedRecallSectionEnabled(
9744
9748
  "targeted-facts",
9745
- this.config.targetedFactRecallEnabled,
9749
+ resolveRecallEnhancementCapabilities(this.config).targetedFactRecall,
9746
9750
  ) &&
9747
9751
  targetedFactMaxChars !== 0 &&
9748
9752
  this.lcmEngine?.enabled &&
@@ -9791,7 +9795,7 @@ export class Orchestrator {
9791
9795
  if (
9792
9796
  this.isSpecializedRecallSectionEnabled(
9793
9797
  "focused-list",
9794
- this.config.focusedListRecallEnabled,
9798
+ resolveRecallEnhancementCapabilities(this.config).focusedListRecall,
9795
9799
  ) &&
9796
9800
  focusedListMaxChars !== 0 &&
9797
9801
  this.lcmEngine?.enabled &&
@@ -9845,7 +9849,7 @@ export class Orchestrator {
9845
9849
  if (
9846
9850
  this.isSpecializedRecallSectionEnabled(
9847
9851
  "response-guidance",
9848
- this.config.responseGuidanceRecallEnabled,
9852
+ resolveRecallEnhancementCapabilities(this.config).responseGuidanceRecall,
9849
9853
  ) &&
9850
9854
  responseGuidanceMaxChars !== 0 &&
9851
9855
  this.lcmEngine?.enabled &&
@@ -9894,7 +9898,7 @@ export class Orchestrator {
9894
9898
  if (
9895
9899
  this.isSpecializedRecallSectionEnabled(
9896
9900
  "event-order",
9897
- this.config.eventOrderRecallEnabled,
9901
+ resolveRecallEnhancementCapabilities(this.config).eventOrderRecall,
9898
9902
  ) &&
9899
9903
  eventOrderMaxChars !== 0 &&
9900
9904
  this.lcmEngine?.enabled &&
@@ -10320,7 +10324,7 @@ export class Orchestrator {
10320
10324
  recallMode === "graph_mode" || isFullModeGraphAssist;
10321
10325
  const graphShadowEvalEnabled =
10322
10326
  isFullModeGraphAssist &&
10323
- this.config.graphAssistShadowEvalEnabled === true;
10327
+ resolveRecallEnhancementCapabilities(this.config).graphAssistShadowEval === true;
10324
10328
  if (shouldRunGraphExpansion) {
10325
10329
  shouldPersistGraphSnapshot = true;
10326
10330
  graphDecisionShadowMode = graphShadowEvalEnabled;
@@ -10584,7 +10588,7 @@ export class Orchestrator {
10584
10588
  );
10585
10589
 
10586
10590
  // E-Mem-inspired memory reconstruction: fill gaps for referenced entities
10587
- if (this.config.memoryReconstructionEnabled && memoryResults.length > 0) {
10591
+ if (resolveRecallEnhancementCapabilities(this.config).memoryReconstruction && memoryResults.length > 0) {
10588
10592
  try {
10589
10593
  const snippets = memoryResults.map((r) => r.snippet);
10590
10594
  // Extract entity paths already present in recall results to avoid duplicates
@@ -12248,7 +12252,7 @@ export class Orchestrator {
12248
12252
  sessionKey: string,
12249
12253
  options: { bufferKey?: string } = {},
12250
12254
  ): Promise<void> {
12251
- if (this.config.sessionObserverEnabled !== true) return;
12255
+ if (resolvePipelineProcessingCapabilities(this.config).sessionObserver !== true) return;
12252
12256
  if (!sessionKey || sessionKey.length === 0) return;
12253
12257
 
12254
12258
  const bufferKey =
@@ -13272,7 +13276,7 @@ export class Orchestrator {
13272
13276
  // the citation survives hostile memory text, copy/paste, and LLM quoting.
13273
13277
  // The helper is a no-op when the feature flag is off, so legacy pipelines
13274
13278
  // see zero behavioral change.
13275
- const citationEnabled = this.config.inlineSourceAttributionEnabled === true;
13279
+ const citationEnabled = resolvePipelineProcessingCapabilities(this.config).inlineSourceAttribution === true;
13276
13280
  const citationTemplate = this.config.inlineSourceAttributionFormat;
13277
13281
  // The stable fields (agent, session) are computed once; `ts` is intentionally
13278
13282
  // omitted here and added fresh per invocation so each fact in a large batch
@@ -13431,7 +13435,7 @@ export class Orchestrator {
13431
13435
  const actualTier = confidenceTier(confidence);
13432
13436
  const actualRank = confidenceTierOrder.indexOf(actualTier);
13433
13437
  if (actualRank === -1) return false;
13434
- if (!this.config.autoPromoteToSharedEnabled) return false;
13438
+ if (!resolveRecallEnhancementCapabilities(this.config).autoPromoteToShared) return false;
13435
13439
  if (!this.config.autoPromoteToSharedCategories.includes(category as any))
13436
13440
  return false;
13437
13441
  const minimumRank = confidenceTierOrder.indexOf(
@@ -14831,7 +14835,7 @@ export class Orchestrator {
14831
14835
  // a high-similarity update/correction is linked as a superseding
14832
14836
  // contradiction rather than silently dropped.
14833
14837
  let pendingSemanticSkip: (SemanticDedupDecision & { action: "skip" }) | null = null;
14834
- if (this.config.semanticDedupEnabled) {
14838
+ if (resolvePipelineProcessingCapabilities(this.config).semanticDedup) {
14835
14839
  let semanticDecision: SemanticDedupDecision;
14836
14840
  // UUI2: skip embedding lookup for the rest of this batch once we know
14837
14841
  // the backend is unavailable. The flag is reset per-batch (set to false
@@ -14876,7 +14880,7 @@ export class Orchestrator {
14876
14880
  }
14877
14881
  }
14878
14882
 
14879
- const inferredIntent = this.config.intentRoutingEnabled
14883
+ const inferredIntent = resolveConversationContextCapabilities(this.config).intentRouting
14880
14884
  ? inferIntentFromText(
14881
14885
  `${writeCategory} ${fact.tags.join(" ")} ${fact.content}`,
14882
14886
  )
@@ -14916,7 +14920,7 @@ export class Orchestrator {
14916
14920
  // for a pending_review fact — an unfaithful extraction in the review queue
14917
14921
  // must not trigger auto-resolve and retire an existing active memory.
14918
14922
  if (
14919
- this.config.contradictionDetectionEnabled &&
14923
+ resolveRecallEnhancementCapabilities(this.config).contradictionDetection &&
14920
14924
  this.qmd.isAvailable() &&
14921
14925
  faithfulnessEnforceStatus !== "pending_review"
14922
14926
  ) {
@@ -15001,10 +15005,10 @@ export class Orchestrator {
15001
15005
  // When semanticChunkingEnabled is true, prefer the embedding-based
15002
15006
  // semantic chunker which produces more coherent topic-aligned segments.
15003
15007
  // Falls back to the recursive sentence-boundary chunker on failure.
15004
- if (this.config.chunkingEnabled && writeCategory !== "procedure") {
15008
+ if (resolvePipelineProcessingCapabilities(this.config).chunking && writeCategory !== "procedure") {
15005
15009
  let chunkResult: { chunked: boolean; chunks: { content: string; index: number; tokenCount: number }[] };
15006
15010
 
15007
- if (this.config.semanticChunkingEnabled) {
15011
+ if (resolvePipelineProcessingCapabilities(this.config).semanticChunking) {
15008
15012
  try {
15009
15013
  const embedFn = this.embeddingFallback.embedTexts.bind(this.embeddingFallback);
15010
15014
  const semanticResult: SemanticChunkResult = await semanticChunkContent(
@@ -15371,7 +15375,7 @@ export class Orchestrator {
15371
15375
  }
15372
15376
 
15373
15377
  // Suggest links for this memory (Phase 3A)
15374
- if (this.config.memoryLinkingEnabled && this.qmd.isAvailable()) {
15378
+ if (resolveRecallEnhancementCapabilities(this.config).memoryLinking && this.qmd.isAvailable()) {
15375
15379
  const targetNamespace = this.storageDirNamespace(targetStorage.dir);
15376
15380
  const suggestedLinks = await this.suggestLinksForMemory(
15377
15381
  fact.content,
@@ -15691,7 +15695,7 @@ export class Orchestrator {
15691
15695
 
15692
15696
  // Persist entity relationships (v7.0)
15693
15697
  if (
15694
- this.config.entityRelationshipsEnabled &&
15698
+ resolveRecallEnhancementCapabilities(this.config).entityRelationships &&
15695
15699
  Array.isArray(result.relationships)
15696
15700
  ) {
15697
15701
  for (const rel of result.relationships.slice(0, 5)) {
@@ -15715,7 +15719,7 @@ export class Orchestrator {
15715
15719
  }
15716
15720
 
15717
15721
  // Persist entity activity (v7.0)
15718
- if (this.config.entityActivityLogEnabled) {
15722
+ if (resolveRecallEnhancementCapabilities(this.config).entityActivityLog) {
15719
15723
  const today = new Date().toISOString().slice(0, 10);
15720
15724
  for (const entity of entities) {
15721
15725
  const name = (entity as any)?.name;
@@ -15753,7 +15757,7 @@ export class Orchestrator {
15753
15757
  // counts as a durable non-fact write for the catalog touch below (NIIly).
15754
15758
  // Only count it when the write actually succeeds (best-effort write); the
15755
15759
  // touch is recorded AFTER this so a rolled-back/failed write never touches.
15756
- if (this.config.identityEnabled && result.identityReflection) {
15760
+ if (resolveRecallEnhancementCapabilities(this.config).identity && result.identityReflection) {
15757
15761
  try {
15758
15762
  await storage.appendIdentityReflection(result.identityReflection);
15759
15763
  recordDurableNonFactWrite();
@@ -16320,7 +16324,7 @@ export class Orchestrator {
16320
16324
  allMemories = await this.storage.readAllMemories();
16321
16325
 
16322
16326
  // Fact archival pass (v6.0) — move old, low-importance, rarely-accessed facts to archive/
16323
- if (this.config.factArchivalEnabled) {
16327
+ if (resolveRecallEnhancementCapabilities(this.config).factArchival) {
16324
16328
  const archived = await this.runFactArchival(allMemories);
16325
16329
  if (archived > 0) {
16326
16330
  memoryItemMutated = true;
@@ -16418,7 +16422,7 @@ export class Orchestrator {
16418
16422
  }
16419
16423
 
16420
16424
  // Auto-consolidate IDENTITY.md if it's getting large
16421
- if (this.config.identityEnabled) {
16425
+ if (resolveRecallEnhancementCapabilities(this.config).identity) {
16422
16426
  await this.autoConsolidateIdentity();
16423
16427
  }
16424
16428
 
@@ -16458,12 +16462,12 @@ export class Orchestrator {
16458
16462
  }
16459
16463
 
16460
16464
  // Memory Summarization (Phase 4A)
16461
- if (this.config.summarizationEnabled) {
16465
+ if (resolvePipelineProcessingCapabilities(this.config).summarization) {
16462
16466
  await this.runSummarization(allMemories);
16463
16467
  }
16464
16468
 
16465
16469
  // Topic Extraction (Phase 4B)
16466
- if (this.config.topicExtractionEnabled) {
16470
+ if (resolvePipelineProcessingCapabilities(this.config).topicExtraction) {
16467
16471
  await this.runTopicExtraction(allMemories);
16468
16472
  }
16469
16473
 
@@ -17876,7 +17880,7 @@ export class Orchestrator {
17876
17880
  * Updates are batched in memory and flushed during consolidation.
17877
17881
  */
17878
17882
  trackMemoryAccess(memoryIds: string[]): void {
17879
- if (!this.config.accessTrackingEnabled) return;
17883
+ if (!resolveRecallEnhancementCapabilities(this.config).accessTracking) return;
17880
17884
 
17881
17885
  const now = new Date().toISOString();
17882
17886
  for (const id of memoryIds) {
@@ -18311,7 +18315,7 @@ export class Orchestrator {
18311
18315
  ]);
18312
18316
 
18313
18317
  const queryIntent =
18314
- this.config.intentRoutingEnabled && prompt
18318
+ resolveConversationContextCapabilities(this.config).intentRouting && prompt
18315
18319
  ? inferIntentFromText(prompt)
18316
18320
  : null;
18317
18321
 
@@ -18379,7 +18383,7 @@ export class Orchestrator {
18379
18383
  }
18380
18384
 
18381
18385
  // Feedback bias (v2.2): apply small user-provided up/down vote adjustments.
18382
- if (this.config.feedbackEnabled) {
18386
+ if (resolveRecallEnhancementCapabilities(this.config).feedback) {
18383
18387
  const match = memory.path.match(/([^/]+)\.md$/);
18384
18388
  const memoryId = match ? match[1] : null;
18385
18389
  if (memoryId) {
@@ -18393,7 +18397,7 @@ export class Orchestrator {
18393
18397
  }
18394
18398
 
18395
18399
  // Negative examples (v2.2): apply a small penalty for memories repeatedly marked "not useful".
18396
- if (this.config.negativeExamplesEnabled) {
18400
+ if (resolvePipelineProcessingCapabilities(this.config).negativeExamples) {
18397
18401
  const match = memory.path.match(/([^/]+)\.md$/);
18398
18402
  const memoryId = match ? match[1] : null;
18399
18403
  if (memoryId) {
@@ -18465,7 +18469,7 @@ export class Orchestrator {
18465
18469
  // Gated by reinforcementRecallBoostEnabled (default false).
18466
18470
  let reinforcementBoost = 0;
18467
18471
  if (
18468
- this.config.reinforcementRecallBoostEnabled &&
18472
+ resolveRecallEnhancementCapabilities(this.config).reinforcementRecallBoost &&
18469
18473
  typeof memory.frontmatter.reinforcement_count === "number" &&
18470
18474
  memory.frontmatter.reinforcement_count > 0
18471
18475
  ) {
@@ -6,6 +6,7 @@ import {
6
6
  import type { PluginConfig } from "../types.js";
7
7
  import { isAbortError } from "../abort-error.js";
8
8
  import { withTimeoutSignal } from "./abort.js";
9
+ import { resolvePipelineProcessingCapabilities } from "../capabilities.js";
9
10
  import {
10
11
  getHostEmbeddingProvider,
11
12
  type HostEmbeddingProvider,
@@ -217,7 +218,7 @@ export class EmbedHelper {
217
218
 
218
219
  if (
219
220
  options.includeHost !== false &&
220
- this.config.hostEmbeddingProviderEnabled !== false
221
+ resolvePipelineProcessingCapabilities(this.config).hostEmbeddingProvider !== false
221
222
  ) {
222
223
  const hostProvider = this.resolveHostEmbeddingProvider();
223
224
  if (hostProvider) {
@@ -10,6 +10,7 @@ import { EmbedHelper } from "./embed-helper.js";
10
10
  import { QmdClient, type QmdClientOptions } from "../qmd.js";
11
11
  import { log } from "../logger.js";
12
12
  import { FaissConversationIndexAdapter } from "../conversation-index/faiss-adapter.js";
13
+ import { resolvePipelineProcessingCapabilities } from "../capabilities.js";
13
14
  import {
14
15
  resolveIndexingCapabilities,
15
16
  resolveQmdCapabilities,
@@ -88,7 +89,7 @@ function resolveNonQmdBackend(config: PluginConfig): SearchBackend | undefined {
88
89
  function qmdOptions(config: PluginConfig): QmdClientOptions {
89
90
  return {
90
91
  slowLog: {
91
- enabled: config.slowLogEnabled,
92
+ enabled: resolvePipelineProcessingCapabilities(config).slowLog,
92
93
  thresholdMs: config.slowLogThresholdMs,
93
94
  },
94
95
  updateTimeoutMs: config.qmdUpdateTimeoutMs,
@@ -12,6 +12,7 @@ import { runPostConsolidationMaterialize } from "./connectors/codex-materialize-
12
12
  import type { MaterializeResult, RolloutSummaryInput } from "./connectors/codex-materialize.js";
13
13
  import { discoverMemoryExtensions, renderExtensionsBlock, resolveExtensionsRoot } from "./memory-extension-host/index.js";
14
14
  import { log } from "./logger.js";
15
+ import { resolvePipelineProcessingCapabilities } from "./capabilities.js";
15
16
 
16
17
  // Re-export resolveExtensionsRoot for backward compatibility — existing
17
18
  // consumers that import from semantic-consolidation.ts continue to work.
@@ -404,7 +405,7 @@ void _CONSOLIDATION_OPERATORS;
404
405
  export async function buildExtensionsBlockForConsolidation(
405
406
  config: PluginConfig,
406
407
  ): Promise<string> {
407
- if (!config.memoryExtensionsEnabled) return "";
408
+ if (!resolvePipelineProcessingCapabilities(config).memoryExtensions) return "";
408
409
  const root = resolveExtensionsRoot(config);
409
410
  const extensions = await discoverMemoryExtensions(root, log);
410
411
  if (extensions.length === 0) return "";
@@ -5,6 +5,7 @@ import { z } from "zod";
5
5
  import { log } from "../logger.js";
6
6
  import type { PluginConfig } from "../types.js";
7
7
  import { expandTildePath } from "../utils/path.js";
8
+ import { resolveConversationContextCapabilities } from "../capabilities.js";
8
9
 
9
10
  export const SharedFeedbackEntrySchema = z.object({
10
11
  agent: z.string().min(1),
@@ -713,8 +714,8 @@ export class SharedContextManager {
713
714
  .sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));
714
715
 
715
716
  const semanticEnabled =
716
- this.config.sharedCrossSignalSemanticEnabled === true
717
- || this.config.crossSignalsSemanticEnabled === true;
717
+ resolveConversationContextCapabilities(this.config).sharedCrossSignalSemantic === true
718
+ || resolveConversationContextCapabilities(this.config).crossSignalsSemantic === true;
718
719
  const semanticTimeoutMs =
719
720
  this.config.sharedCrossSignalSemanticTimeoutMs
720
721
  ?? this.config.crossSignalsSemanticTimeoutMs
package/src/storage.ts CHANGED
@@ -2373,7 +2373,7 @@ export class StorageManager {
2373
2373
  * When true, the secure-store is configured as required — writes
2374
2374
  * MUST be encrypted and a locked store MUST reject writes rather
2375
2375
  * than silently falling back to plaintext. Set by the orchestrator
2376
- * from `config.secureStoreEnabled`.
2376
+ * from `resolveRecallAuxiliaryCapabilities(config).secureStore`.
2377
2377
  */
2378
2378
  private _secureStoreRequired = false;
2379
2379
 
package/src/summarizer.ts CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  } from "./storage-paths.js";
16
16
  import { sessionStoragePaths } from "./session-identity.js";
17
17
  import { resolveLocalLlmCapabilities } from "./capabilities.js";
18
+ import { resolvePipelineProcessingCapabilities } from "./capabilities.js";
18
19
 
19
20
  // Schema for LLM summary output
20
21
  const HourlySummarySchema = z.object({
@@ -130,7 +131,7 @@ export class HourlySummarizer {
130
131
  .map((e) => `[${e.role}] ${e.content}`)
131
132
  .join("\n\n");
132
133
 
133
- if (this.config.hourlySummariesExtendedEnabled) {
134
+ if (resolvePipelineProcessingCapabilities(this.config).hourlySummariesExtended) {
134
135
  const extended = await this.generateExtended(sessionKey, hourStart, conversation, entries);
135
136
  if (!extended) return null;
136
137
  const meta: HourlySummaryExtendedMeta = {
@@ -468,7 +469,7 @@ Respond with valid JSON matching this schema:
468
469
  const meta = (summary as any)._extendedMeta as HourlySummaryExtendedMeta | undefined;
469
470
  const lines: string[] = [hourHeader, ""];
470
471
 
471
- if (this.config.hourlySummariesExtendedEnabled && ext) {
472
+ if (resolvePipelineProcessingCapabilities(this.config).hourlySummariesExtended && ext) {
472
473
  lines.push("### Topics Discussed");
473
474
  for (const t of ext.topics) lines.push(`- ${t}`);
474
475
  lines.push("");