@remnic/core 9.3.737 → 9.3.738

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 (129) hide show
  1. package/dist/access-boundary.js +10 -10
  2. package/dist/access-cli.js +26 -26
  3. package/dist/access-http.js +15 -15
  4. package/dist/access-mcp.js +14 -14
  5. package/dist/access-operations-batch.js +12 -12
  6. package/dist/access-operations.js +13 -13
  7. package/dist/access-service.js +9 -9
  8. package/dist/active-memory-bridge.js +3 -3
  9. package/dist/buffer.js +2 -1
  10. package/dist/capabilities.d.ts +98 -1
  11. package/dist/capabilities.js +7 -1
  12. package/dist/{chunk-G54IDCD3.js → chunk-23PLOBWT.js} +30 -27
  13. package/dist/chunk-23PLOBWT.js.map +1 -0
  14. package/dist/{chunk-K3Y2SJTN.js → chunk-56LP72AD.js} +6 -6
  15. package/dist/{chunk-ZBZ4XULO.js → chunk-66RZ4EIT.js} +3 -3
  16. package/dist/{chunk-IPI45Q4S.js → chunk-75PDC7VT.js} +9 -8
  17. package/dist/chunk-75PDC7VT.js.map +1 -0
  18. package/dist/{chunk-GB2FZOWB.js → chunk-7B7IPPN5.js} +5 -5
  19. package/dist/{chunk-QNTLWH3T.js → chunk-A7INTIC5.js} +3 -3
  20. package/dist/{chunk-FLPKEMSO.js → chunk-AKKFHN3I.js} +2 -2
  21. package/dist/{chunk-AAIHDIMD.js → chunk-BHJAMSVC.js} +7 -7
  22. package/dist/{chunk-BXPG5AVX.js → chunk-BHQQVUEQ.js} +6 -6
  23. package/dist/{chunk-HFXZIF3V.js → chunk-BVG2IZOB.js} +3 -3
  24. package/dist/{chunk-NDKW67ER.js → chunk-C53JDEH3.js} +4 -4
  25. package/dist/{chunk-AESC5OQJ.js → chunk-CKHPUOAP.js} +2 -2
  26. package/dist/{chunk-OYHYBHHI.js → chunk-DS3FZ7GS.js} +4 -4
  27. package/dist/{chunk-PB5YON2G.js → chunk-EKQ3LWBM.js} +77 -74
  28. package/dist/chunk-EKQ3LWBM.js.map +1 -0
  29. package/dist/{chunk-UO6MPN77.js → chunk-EU543UDC.js} +10 -9
  30. package/dist/chunk-EU543UDC.js.map +1 -0
  31. package/dist/{chunk-E4LYJ7PY.js → chunk-IFCM6OLK.js} +6 -6
  32. package/dist/{chunk-5BOQNB2K.js → chunk-JQSP7YBJ.js} +3 -3
  33. package/dist/{chunk-2T2N7ISV.js → chunk-L3TYGUTH.js} +3 -3
  34. package/dist/{chunk-AB2E5DCN.js → chunk-MAU7DFCJ.js} +2 -2
  35. package/dist/{chunk-P6VLG7KE.js → chunk-N2O23WYA.js} +2 -2
  36. package/dist/{chunk-HYNHLBKA.js → chunk-OQQRWPFZ.js} +5 -2
  37. package/dist/chunk-OQQRWPFZ.js.map +1 -0
  38. package/dist/{chunk-IXGXALRV.js → chunk-QTJOORGN.js} +2 -2
  39. package/dist/{chunk-JWDE7OVJ.js → chunk-RJBW4EOU.js} +46 -2
  40. package/dist/{chunk-JWDE7OVJ.js.map → chunk-RJBW4EOU.js.map} +1 -1
  41. package/dist/{chunk-AE7NTZ75.js → chunk-TNLXCSXV.js} +3 -3
  42. package/dist/{chunk-NNJKEAP2.js → chunk-VRBBZH4U.js} +4 -4
  43. package/dist/{chunk-VOEVVIP3.js → chunk-W2FBVBQ4.js} +4 -4
  44. package/dist/{chunk-WNGXQMRI.js → chunk-WFNH4UDF.js} +5 -2
  45. package/dist/chunk-WFNH4UDF.js.map +1 -0
  46. package/dist/{chunk-CHJIWG2H.js → chunk-WVAEIKUY.js} +2 -2
  47. package/dist/{chunk-FF36YNKY.js → chunk-XIQAOGAA.js} +11 -10
  48. package/dist/chunk-XIQAOGAA.js.map +1 -0
  49. package/dist/{chunk-HLPYL6LC.js → chunk-Y5OOHER4.js} +14 -12
  50. package/dist/chunk-Y5OOHER4.js.map +1 -0
  51. package/dist/{chunk-GYICIICQ.js → chunk-YF2MMBKA.js} +9 -7
  52. package/dist/chunk-YF2MMBKA.js.map +1 -0
  53. package/dist/{chunk-IX4L7E5G.js → chunk-YXOXAQ5Y.js} +2 -2
  54. package/dist/cli.js +21 -21
  55. package/dist/compounding/engine.js +2 -2
  56. package/dist/contradiction/index.js +2 -2
  57. package/dist/{contradiction-scan-2B4AE4TI.js → contradiction-scan-CWO3LIWV.js} +3 -3
  58. package/dist/embedding-fallback.js +2 -2
  59. package/dist/entity-retrieval.js +2 -2
  60. package/dist/explicit-capture.js +2 -2
  61. package/dist/extraction.js +3 -3
  62. package/dist/{first-start-migration-2RQYDIZ7.js → first-start-migration-5DXD3TF2.js} +2 -2
  63. package/dist/index.js +32 -32
  64. package/dist/local-llm.js +2 -2
  65. package/dist/namespaces/migrate.js +6 -6
  66. package/dist/namespaces/principal.js +2 -2
  67. package/dist/namespaces/search.js +4 -4
  68. package/dist/namespaces/storage.js +2 -2
  69. package/dist/operator-toolkit.js +11 -11
  70. package/dist/orchestration/compression-guideline-coordinator.js +2 -2
  71. package/dist/orchestration/maintenance.js +6 -6
  72. package/dist/orchestrator.js +21 -21
  73. package/dist/schemas.d.ts +22 -22
  74. package/dist/search/embed-helper.js +2 -2
  75. package/dist/search/factory.js +3 -3
  76. package/dist/search/index.js +3 -3
  77. package/dist/summarizer.js +3 -3
  78. package/dist/{tier-stats-KPDIISG7.js → tier-stats-QID73BBB.js} +2 -2
  79. package/dist/transfer/types.d.ts +12 -12
  80. package/package.json +2 -2
  81. package/src/access-service.ts +7 -8
  82. package/src/buffer.ts +2 -1
  83. package/src/capabilities.test.ts +137 -0
  84. package/src/capabilities.ts +209 -0
  85. package/src/cli/creation-ledger-commands.ts +3 -3
  86. package/src/cli/research-status-commands.ts +4 -4
  87. package/src/cli.ts +9 -10
  88. package/src/compounding/engine.ts +7 -7
  89. package/src/correction/correction-access-wiring.ts +3 -2
  90. package/src/extraction.ts +8 -10
  91. package/src/operator-toolkit.ts +6 -7
  92. package/src/orchestration/entity-synthesis-coordinator.ts +2 -1
  93. package/src/orchestration/maintenance.ts +5 -7
  94. package/src/orchestration/semantic-consolidation-coordinator.ts +2 -2
  95. package/src/orchestrator.ts +49 -50
  96. package/dist/chunk-FF36YNKY.js.map +0 -1
  97. package/dist/chunk-G54IDCD3.js.map +0 -1
  98. package/dist/chunk-GYICIICQ.js.map +0 -1
  99. package/dist/chunk-HLPYL6LC.js.map +0 -1
  100. package/dist/chunk-HYNHLBKA.js.map +0 -1
  101. package/dist/chunk-IPI45Q4S.js.map +0 -1
  102. package/dist/chunk-PB5YON2G.js.map +0 -1
  103. package/dist/chunk-UO6MPN77.js.map +0 -1
  104. package/dist/chunk-WNGXQMRI.js.map +0 -1
  105. /package/dist/{chunk-K3Y2SJTN.js.map → chunk-56LP72AD.js.map} +0 -0
  106. /package/dist/{chunk-ZBZ4XULO.js.map → chunk-66RZ4EIT.js.map} +0 -0
  107. /package/dist/{chunk-GB2FZOWB.js.map → chunk-7B7IPPN5.js.map} +0 -0
  108. /package/dist/{chunk-QNTLWH3T.js.map → chunk-A7INTIC5.js.map} +0 -0
  109. /package/dist/{chunk-FLPKEMSO.js.map → chunk-AKKFHN3I.js.map} +0 -0
  110. /package/dist/{chunk-AAIHDIMD.js.map → chunk-BHJAMSVC.js.map} +0 -0
  111. /package/dist/{chunk-BXPG5AVX.js.map → chunk-BHQQVUEQ.js.map} +0 -0
  112. /package/dist/{chunk-HFXZIF3V.js.map → chunk-BVG2IZOB.js.map} +0 -0
  113. /package/dist/{chunk-NDKW67ER.js.map → chunk-C53JDEH3.js.map} +0 -0
  114. /package/dist/{chunk-AESC5OQJ.js.map → chunk-CKHPUOAP.js.map} +0 -0
  115. /package/dist/{chunk-OYHYBHHI.js.map → chunk-DS3FZ7GS.js.map} +0 -0
  116. /package/dist/{chunk-E4LYJ7PY.js.map → chunk-IFCM6OLK.js.map} +0 -0
  117. /package/dist/{chunk-5BOQNB2K.js.map → chunk-JQSP7YBJ.js.map} +0 -0
  118. /package/dist/{chunk-2T2N7ISV.js.map → chunk-L3TYGUTH.js.map} +0 -0
  119. /package/dist/{chunk-AB2E5DCN.js.map → chunk-MAU7DFCJ.js.map} +0 -0
  120. /package/dist/{chunk-P6VLG7KE.js.map → chunk-N2O23WYA.js.map} +0 -0
  121. /package/dist/{chunk-IXGXALRV.js.map → chunk-QTJOORGN.js.map} +0 -0
  122. /package/dist/{chunk-AE7NTZ75.js.map → chunk-TNLXCSXV.js.map} +0 -0
  123. /package/dist/{chunk-NNJKEAP2.js.map → chunk-VRBBZH4U.js.map} +0 -0
  124. /package/dist/{chunk-VOEVVIP3.js.map → chunk-W2FBVBQ4.js.map} +0 -0
  125. /package/dist/{chunk-CHJIWG2H.js.map → chunk-WVAEIKUY.js.map} +0 -0
  126. /package/dist/{chunk-IX4L7E5G.js.map → chunk-YXOXAQ5Y.js.map} +0 -0
  127. /package/dist/{contradiction-scan-2B4AE4TI.js.map → contradiction-scan-CWO3LIWV.js.map} +0 -0
  128. /package/dist/{first-start-migration-2RQYDIZ7.js.map → first-start-migration-5DXD3TF2.js.map} +0 -0
  129. /package/dist/{tier-stats-KPDIISG7.js.map → tier-stats-QID73BBB.js.map} +0 -0
@@ -267,8 +267,7 @@ import {
267
267
  type TrustZoneSearchResult,
268
268
  } from "./trust-zones.js";
269
269
  import { tryDirectAnswer, type DirectAnswerSources } from "./direct-answer-wiring.js";
270
- import {
271
- resolveNamespaceCapabilities,
270
+ import { resolveNamespaceCapabilities,
272
271
  resolveCapabilities,
273
272
  resolveGraphConstructionCapabilities,
274
273
  resolveMemoryLifecycleCapabilities,
@@ -282,7 +281,7 @@ import {
282
281
  resolveQmdCapabilities,
283
282
  resolveIdentityContinuityCapabilities,
284
283
  resolveLocalLlmCapabilities,
285
- resolveSecurityCapabilities, resolveEvalCapabilities, resolveUtilityLearningCapabilities, resolveObjectiveStateCapabilities, resolveCompressionCapabilities} from "./capabilities.js";
284
+ resolveSecurityCapabilities, resolveEvalCapabilities, resolveUtilityLearningCapabilities, resolveObjectiveStateCapabilities, resolveCompressionCapabilities, resolvePresentationCapabilities, resolveConsolidationCapabilities, resolveRecallAuxiliaryCapabilities } from "./capabilities.js";
286
285
  import { DEFAULT_TAXONOMY } from "./taxonomy/index.js";
287
286
  import {
288
287
  searchHarmonicRetrieval,
@@ -2565,7 +2564,7 @@ export class Orchestrator {
2565
2564
  private async contentHashIndexForStorage(
2566
2565
  targetStorage: StorageManager,
2567
2566
  ): Promise<ContentHashIndex | null> {
2568
- if (!this.config.factDeduplicationEnabled) return null;
2567
+ if (!resolveRecallAuxiliaryCapabilities(this.config).factDeduplication) return null;
2569
2568
 
2570
2569
  if (targetStorage.dir === this.storage.dir) {
2571
2570
  if (!this.contentHashIndex) {
@@ -2828,7 +2827,7 @@ export class Orchestrator {
2828
2827
  if (config.defaultNamespace) this.storageRouter.bindCatalogWriteHook(this.storage, config.defaultNamespace);
2829
2828
  // Wire page-level versioning (issue #371)
2830
2829
  this.storage.setVersioningConfig({
2831
- enabled: config.versioningEnabled,
2830
+ enabled: resolveRecallAuxiliaryCapabilities(config).versioning,
2832
2831
  maxVersionsPerPage: config.versioningMaxPerPage,
2833
2832
  sidecarDir: config.versioningSidecarDir,
2834
2833
  });
@@ -2851,7 +2850,7 @@ export class Orchestrator {
2851
2850
  // Wire at-rest encryption (issue #690 PR 3/4).
2852
2851
  // If secureStoreEnabled, check whether the keyring already holds a key
2853
2852
  // for this memory dir (e.g. operator unlocked before daemon restart).
2854
- if (config.secureStoreEnabled) {
2853
+ if (resolveRecallAuxiliaryCapabilities(config).secureStore) {
2855
2854
  // Mark the store as required so writes throw SecureStoreLockedError
2856
2855
  // instead of silently falling back to plaintext when locked (P1 finding
2857
2856
  // from Cursor review of PR #767).
@@ -2889,7 +2888,7 @@ export class Orchestrator {
2889
2888
  this.sharedContext = config.sharedContextEnabled
2890
2889
  ? new SharedContextManager(config)
2891
2890
  : undefined;
2892
- this.compounding = config.compoundingEnabled
2891
+ this.compounding = resolveConsolidationCapabilities(config).compounding
2893
2892
  ? new CompoundingEngine(config, this.storage)
2894
2893
  : undefined;
2895
2894
  this.buffer = new SmartBuffer(config, this.storage);
@@ -3081,7 +3080,7 @@ export class Orchestrator {
3081
3080
  this.boxBuilders.set(
3082
3081
  dir,
3083
3082
  new BoxBuilder(dir, {
3084
- memoryBoxesEnabled: this.config.memoryBoxesEnabled,
3083
+ memoryBoxesEnabled: resolvePresentationCapabilities(this.config).memoryBoxes,
3085
3084
  traceWeaverEnabled: this.config.traceWeaverEnabled,
3086
3085
  boxTopicShiftThreshold: this.config.boxTopicShiftThreshold,
3087
3086
  boxTimeGapMs: this.config.boxTimeGapMs,
@@ -3427,7 +3426,7 @@ export class Orchestrator {
3427
3426
  });
3428
3427
 
3429
3428
  // Initialize content-hash dedup index
3430
- if (this.config.factDeduplicationEnabled) {
3429
+ if (resolveRecallAuxiliaryCapabilities(this.config).factDeduplication) {
3431
3430
  this.contentHashIndex = this.storage.createContentHashIndex();
3432
3431
  await this.contentHashIndex.load();
3433
3432
  log.info(
@@ -3453,7 +3452,7 @@ export class Orchestrator {
3453
3452
  );
3454
3453
  this.buffer.resetToEmpty();
3455
3454
  }
3456
- if (this.config.compactionResetEnabled) {
3455
+ if (resolveRecallAuxiliaryCapabilities(this.config).compactionReset) {
3457
3456
  try {
3458
3457
  const wsDir = this.config.workspaceDir || defaultWorkspaceDir();
3459
3458
  const files = await readdir(wsDir).catch(() => [] as string[]);
@@ -3677,7 +3676,7 @@ export class Orchestrator {
3677
3676
  // Awaited so callers of `deferredReady` can rely on warmups being complete
3678
3677
  // and shutdown sequencing does not race with in-flight cache builds.
3679
3678
  const cacheWarmups: Promise<void>[] = [];
3680
- if (this.config.knowledgeIndexEnabled) {
3679
+ if (resolveRecallAuxiliaryCapabilities(this.config).knowledgeIndex) {
3681
3680
  cacheWarmups.push(
3682
3681
  (async () => {
3683
3682
  try {
@@ -3996,7 +3995,7 @@ export class Orchestrator {
3996
3995
  const cadenceKey = options.namespace ?? "";
3997
3996
  // Master switch: a disabled feature is never bypassed, even with
3998
3997
  // force=true. `force` only relaxes the cadence floor below.
3999
- if (!this.config.patternReinforcementEnabled) {
3998
+ if (!resolveConsolidationCapabilities(this.config).patternReinforcement) {
4000
3999
  return { ran: false, skippedReason: "disabled", namespace: cadenceKey };
4001
4000
  }
4002
4001
  const cadence = this.config.patternReinforcementCadenceMs;
@@ -4055,7 +4054,7 @@ export class Orchestrator {
4055
4054
  ? { itemCount: result.result.clustersFound }
4056
4055
  : { itemCount: 0 };
4057
4056
  },
4058
- { enabled: this.config.patternReinforcementEnabled },
4057
+ { enabled: resolveConsolidationCapabilities(this.config).patternReinforcement },
4059
4058
  );
4060
4059
  }
4061
4060
 
@@ -4099,7 +4098,7 @@ export class Orchestrator {
4099
4098
  });
4100
4099
  return { itemCount: result.clustersFound };
4101
4100
  },
4102
- { enabled: this.config.semanticConsolidationEnabled },
4101
+ { enabled: resolveConsolidationCapabilities(this.config).semanticConsolidation },
4103
4102
  );
4104
4103
  }
4105
4104
 
@@ -5430,7 +5429,7 @@ export class Orchestrator {
5430
5429
  // memory directory, reject recall with a clear human-readable error
5431
5430
  // rather than surfacing a cryptic SecureStoreLockedError from deep
5432
5431
  // inside the storage layer.
5433
- if (this.config.secureStoreEnabled && !this.storage.isSecureStoreUnlocked()) {
5432
+ if (resolveRecallAuxiliaryCapabilities(this.config).secureStore && !this.storage.isSecureStoreUnlocked()) {
5434
5433
  const lockedMsg =
5435
5434
  "[secure-store locked] Memory store is encrypted and locked. " +
5436
5435
  "Unlock the secure-store inside this daemon process, or restart the daemon through a secure-store aware launcher that installs the key.";
@@ -5568,7 +5567,7 @@ export class Orchestrator {
5568
5567
  });
5569
5568
  const observationNamespaces = observationScopePlan.readNamespaces;
5570
5569
  const observationQueryPolicy = buildRecallQueryPolicy(prompt, sessionKey, {
5571
- cronRecallPolicyEnabled: this.config.cronRecallPolicyEnabled,
5570
+ cronRecallPolicyEnabled: resolveRecallAuxiliaryCapabilities(this.config).cronRecallPolicy,
5572
5571
  cronRecallNormalizedQueryMaxChars:
5573
5572
  this.config.cronRecallNormalizedQueryMaxChars,
5574
5573
  cronRecallInstructionHeavyTokenCap:
@@ -6994,7 +6993,7 @@ export class Orchestrator {
6994
6993
  // recall searches, incl. coding `readFallbacks`). See the
6995
6994
  // `lcmReadSessionIds` derivation after `recallNamespaces` is built.
6996
6995
  const queryPolicy = buildRecallQueryPolicy(prompt, sessionKey, {
6997
- cronRecallPolicyEnabled: this.config.cronRecallPolicyEnabled,
6996
+ cronRecallPolicyEnabled: resolveRecallAuxiliaryCapabilities(this.config).cronRecallPolicy,
6998
6997
  cronRecallNormalizedQueryMaxChars:
6999
6998
  this.config.cronRecallNormalizedQueryMaxChars,
7000
6999
  cronRecallInstructionHeavyTokenCap:
@@ -7157,7 +7156,7 @@ export class Orchestrator {
7157
7156
  return limit;
7158
7157
  })()
7159
7158
  : 0;
7160
- const recallHeadroom = this.config.verbatimArtifactsEnabled
7159
+ const recallHeadroom = resolvePresentationCapabilities(this.config).verbatimArtifacts
7161
7160
  ? Math.max(12, this.config.verbatimArtifactsMaxRecall * 4)
7162
7161
  : 12;
7163
7162
  const computedFetchLimit =
@@ -7170,7 +7169,7 @@ export class Orchestrator {
7170
7169
  const qmdFetchLimit = computedFetchLimit;
7171
7170
  const qmdHybridFetchLimit = computeQmdHybridFetchLimit(
7172
7171
  qmdFetchLimit,
7173
- this.config.verbatimArtifactsEnabled,
7172
+ resolvePresentationCapabilities(this.config).verbatimArtifacts,
7174
7173
  this.config.verbatimArtifactsMaxRecall,
7175
7174
  );
7176
7175
  const embeddingFetchLimit = computedFetchLimit;
@@ -7862,11 +7861,11 @@ export class Orchestrator {
7862
7861
  if (
7863
7862
  !this.isRecallSectionEnabled(
7864
7863
  "entity-retrieval",
7865
- this.config.entityRetrievalEnabled,
7864
+ resolveRecallAuxiliaryCapabilities(this.config).entityRetrieval,
7866
7865
  )
7867
7866
  )
7868
7867
  return null;
7869
- if (!this.config.entityRetrievalEnabled) return null;
7868
+ if (!resolveRecallAuxiliaryCapabilities(this.config).entityRetrieval) return null;
7870
7869
  const maxChars =
7871
7870
  this.getRecallSectionMaxChars("entity-retrieval") ??
7872
7871
  this.config.entityRetrievalMaxChars;
@@ -7939,11 +7938,11 @@ export class Orchestrator {
7939
7938
  if (
7940
7939
  !this.isRecallSectionEnabled(
7941
7940
  "knowledge-index",
7942
- this.config.knowledgeIndexEnabled,
7941
+ resolveRecallAuxiliaryCapabilities(this.config).knowledgeIndex,
7943
7942
  )
7944
7943
  )
7945
7944
  return null;
7946
- if (!this.config.knowledgeIndexEnabled) return null;
7945
+ if (!resolveRecallAuxiliaryCapabilities(this.config).knowledgeIndex) return null;
7947
7946
  const t0 = Date.now();
7948
7947
  try {
7949
7948
  const knowledgeIndexMaxChars =
@@ -8034,11 +8033,11 @@ export class Orchestrator {
8034
8033
  if (
8035
8034
  !this.isRecallSectionEnabled(
8036
8035
  "verbatim-artifacts",
8037
- this.config.verbatimArtifactsEnabled === true,
8036
+ resolvePresentationCapabilities(this.config).verbatimArtifacts === true,
8038
8037
  )
8039
8038
  )
8040
8039
  return [];
8041
- if (!this.config.verbatimArtifactsEnabled) return [];
8040
+ if (!resolvePresentationCapabilities(this.config).verbatimArtifacts) return [];
8042
8041
  const t0 = Date.now();
8043
8042
  const targetCount = computeArtifactRecallLimit(
8044
8043
  recallMode,
@@ -8269,10 +8268,10 @@ export class Orchestrator {
8269
8268
  const calibrationPromise = (async (): Promise<string | null> => {
8270
8269
  const t0 = Date.now();
8271
8270
  if (
8272
- !this.config.calibrationEnabled ||
8271
+ !resolveConsolidationCapabilities(this.config).calibration ||
8273
8272
  !this.isRecallSectionEnabled(
8274
8273
  "calibration-rules",
8275
- this.config.calibrationEnabled === true,
8274
+ resolveConsolidationCapabilities(this.config).calibration === true,
8276
8275
  )
8277
8276
  ) {
8278
8277
  recordRecallSectionMetric({
@@ -8434,7 +8433,7 @@ export class Orchestrator {
8434
8433
  query: retrievalQuery,
8435
8434
  maxResults,
8436
8435
  sessionKey,
8437
- anchorsEnabled: this.config.abstractionAnchorsEnabled,
8436
+ anchorsEnabled: resolveConsolidationCapabilities(this.config).abstractionAnchors,
8438
8437
  abortSignal: harmonicRetrievalAbort.signal,
8439
8438
  }),
8440
8439
  ),
@@ -8481,10 +8480,10 @@ export class Orchestrator {
8481
8480
  const verifiedRecallPromise = (async (): Promise<string | null> => {
8482
8481
  const t0 = Date.now();
8483
8482
  if (
8484
- !this.config.verifiedRecallEnabled ||
8483
+ !resolveRecallAuxiliaryCapabilities(this.config).verifiedRecall ||
8485
8484
  !this.isRecallSectionEnabled(
8486
8485
  "verified-episodes",
8487
- this.config.verifiedRecallEnabled === true,
8486
+ resolveRecallAuxiliaryCapabilities(this.config).verifiedRecall === true,
8488
8487
  )
8489
8488
  ) {
8490
8489
  recordRecallSectionMetric({
@@ -8570,10 +8569,10 @@ export class Orchestrator {
8570
8569
  const verifiedRulesPromise = (async (): Promise<string | null> => {
8571
8570
  const t0 = Date.now();
8572
8571
  if (
8573
- !this.config.semanticRuleVerificationEnabled ||
8572
+ !resolveRecallAuxiliaryCapabilities(this.config).semanticRuleVerification ||
8574
8573
  !this.isRecallSectionEnabled(
8575
8574
  "verified-rules",
8576
- this.config.semanticRuleVerificationEnabled === true,
8575
+ resolveRecallAuxiliaryCapabilities(this.config).semanticRuleVerification === true,
8577
8576
  )
8578
8577
  ) {
8579
8578
  recordRecallSectionMetric({
@@ -8659,10 +8658,10 @@ export class Orchestrator {
8659
8658
  const t0 = Date.now();
8660
8659
  if (
8661
8660
  !resolveCreationMemoryCapabilities(this.config).creationMemory ||
8662
- !this.config.workProductRecallEnabled ||
8661
+ !resolveRecallAuxiliaryCapabilities(this.config).workProductRecall ||
8663
8662
  !this.isRecallSectionEnabled(
8664
8663
  "work-products",
8665
- this.config.workProductRecallEnabled === true,
8664
+ resolveRecallAuxiliaryCapabilities(this.config).workProductRecall === true,
8666
8665
  )
8667
8666
  ) {
8668
8667
  recordRecallSectionMetric({
@@ -9170,7 +9169,7 @@ export class Orchestrator {
9170
9169
  const transcriptPromise = (async (): Promise<string | null> => {
9171
9170
  const t0 = Date.now();
9172
9171
  if (
9173
- !this.config.transcriptEnabled ||
9172
+ !resolvePresentationCapabilities(this.config).transcript ||
9174
9173
  !this.isRecallSectionEnabled("transcript", true)
9175
9174
  ) {
9176
9175
  recordRecallSectionMetric({
@@ -9276,7 +9275,7 @@ export class Orchestrator {
9276
9275
  this._recallWorkspaceOverrides.get(effectiveSessionKey);
9277
9276
  this._recallWorkspaceOverrides.delete(effectiveSessionKey);
9278
9277
 
9279
- if (!this.config.compactionResetEnabled) return null;
9278
+ if (!resolveRecallAuxiliaryCapabilities(this.config).compactionReset) return null;
9280
9279
 
9281
9280
  const workspaceDir =
9282
9281
  compactionWorkspaceDir ||
@@ -9629,9 +9628,9 @@ export class Orchestrator {
9629
9628
  const recentBoxesPromise = observeEnrichmentPromise(
9630
9629
  this.isRecallSectionEnabled(
9631
9630
  "memory-boxes",
9632
- this.config.memoryBoxesEnabled === true,
9631
+ resolvePresentationCapabilities(this.config).memoryBoxes === true,
9633
9632
  ) &&
9634
- this.config.memoryBoxesEnabled &&
9633
+ resolvePresentationCapabilities(this.config).memoryBoxes &&
9635
9634
  this.config.boxRecallDays > 0
9636
9635
  ? Promise.all(
9637
9636
  profileStorages.map((storage) =>
@@ -12734,7 +12733,7 @@ export class Orchestrator {
12734
12733
  ): Promise<void> {
12735
12734
  const mode = this.config.correctionCaptureMode;
12736
12735
  if (mode === "off") return;
12737
- if (!this.config.correctionEnabled) return;
12736
+ if (!resolveRecallAuxiliaryCapabilities(this.config).correction) return;
12738
12737
 
12739
12738
  try {
12740
12739
  const corrections = detectPassiveCorrections(
@@ -12754,7 +12753,7 @@ export class Orchestrator {
12754
12753
  const result = await capturePassiveCorrections(
12755
12754
  corrections,
12756
12755
  {
12757
- correctionEnabled: this.config.correctionEnabled,
12756
+ correctionEnabled: resolveRecallAuxiliaryCapabilities(this.config).correction,
12758
12757
  isLiveSession: opts.isLiveSession,
12759
12758
  bufferKey: opts.bufferKey,
12760
12759
  sessionKey: opts.sessionKey,
@@ -13188,7 +13187,7 @@ export class Orchestrator {
13188
13187
  }
13189
13188
 
13190
13189
  let threadIdForExtraction: string | null = null;
13191
- if (this.config.threadingEnabled && turns.length > 0) {
13190
+ if (resolvePresentationCapabilities(this.config).threading && turns.length > 0) {
13192
13191
  const lastTurn = turns[turns.length - 1];
13193
13192
  try {
13194
13193
  threadIdForExtraction = await this.threading.processTurn(lastTurn, []);
@@ -13318,7 +13317,7 @@ export class Orchestrator {
13318
13317
  // Topics are derived from the current extraction's facts and entities only —
13319
13318
  // not from readAllMemories() — so box topics accurately reflect the current
13320
13319
  // session window and the call is free of expensive full-corpus I/O.
13321
- if (this.config.memoryBoxesEnabled && persistedIds.length > 0) {
13320
+ if (resolvePresentationCapabilities(this.config).memoryBoxes && persistedIds.length > 0) {
13322
13321
  const extractionTopics = deriveTopicsFromExtraction(result);
13323
13322
  // Derive episodic metadata from buffer turns (REMem-inspired)
13324
13323
  const firstUserTurn = turns.find((t) => t.role === "user");
@@ -13339,7 +13338,7 @@ export class Orchestrator {
13339
13338
  // Batch-append persisted IDs so non-fact memories (entities/questions) are
13340
13339
  // always attached to the thread. The helper excludes pending_review ids (#1635).
13341
13340
  if (
13342
- this.config.threadingEnabled &&
13341
+ resolvePresentationCapabilities(this.config).threading &&
13343
13342
  threadIdForExtraction &&
13344
13343
  persistedIds.length > 0
13345
13344
  ) {
@@ -13350,7 +13349,7 @@ export class Orchestrator {
13350
13349
  }
13351
13350
 
13352
13351
  // Thread title update for the already-established thread context.
13353
- if (this.config.threadingEnabled && threadIdForExtraction) {
13352
+ if (resolvePresentationCapabilities(this.config).threading && threadIdForExtraction) {
13354
13353
  const conversationContent = turns.map((t) => t.content).join(" ");
13355
13354
  try {
13356
13355
  await this.threading.updateThreadTitle(
@@ -15251,7 +15250,7 @@ export class Orchestrator {
15251
15250
 
15252
15251
  if (chunkResult.chunked && chunkResult.chunks.length > 1) {
15253
15252
  // Classify memory kind (v8.0 Phase 2B: HiMem episode/note dual store)
15254
- const memoryKind = this.config.episodeNoteModeEnabled
15253
+ const memoryKind = resolvePresentationCapabilities(this.config).episodeNoteMode
15255
15254
  ? classifyMemoryKind(fact.content, fact.tags ?? [], writeCategory)
15256
15255
  : undefined;
15257
15256
 
@@ -15508,7 +15507,7 @@ export class Orchestrator {
15508
15507
  }
15509
15508
  try {
15510
15509
  if (
15511
- this.config.verbatimArtifactsEnabled &&
15510
+ resolvePresentationCapabilities(this.config).verbatimArtifacts &&
15512
15511
  this.config.verbatimArtifactCategories.includes(writeCategory) &&
15513
15512
  fact.confidence >= this.config.verbatimArtifactsMinConfidence &&
15514
15513
  !postWriteGuard
@@ -15605,7 +15604,7 @@ export class Orchestrator {
15605
15604
  const memoryKind =
15606
15605
  writeCategory === "procedure"
15607
15606
  ? undefined
15608
- : this.config.episodeNoteModeEnabled
15607
+ : resolvePresentationCapabilities(this.config).episodeNoteMode
15609
15608
  ? classifyMemoryKind(fact.content, fact.tags ?? [], writeCategory)
15610
15609
  : undefined;
15611
15610
 
@@ -15805,7 +15804,7 @@ export class Orchestrator {
15805
15804
  }
15806
15805
  }
15807
15806
  if (
15808
- this.config.verbatimArtifactsEnabled &&
15807
+ resolvePresentationCapabilities(this.config).verbatimArtifacts &&
15809
15808
  this.config.verbatimArtifactCategories.includes(writeCategory) &&
15810
15809
  fact.confidence >= this.config.verbatimArtifactsMinConfidence &&
15811
15810
  !postWriteGuard
@@ -16421,7 +16420,7 @@ export class Orchestrator {
16421
16420
  log.info(`merged ${entitiesMerged} fragmented entity files`);
16422
16421
  }
16423
16422
 
16424
- if (this.config.entitySummaryEnabled) {
16423
+ if (resolvePresentationCapabilities(this.config).entitySummary) {
16425
16424
  try {
16426
16425
  const synthesized = await this.processEntitySynthesisQueue(
16427
16426
  this.config.defaultNamespace,
@@ -16565,7 +16564,7 @@ export class Orchestrator {
16565
16564
  }
16566
16565
 
16567
16566
  // Semantic consolidation pass — find similar memories, synthesize canonical versions
16568
- if (this.config.semanticConsolidationEnabled) {
16567
+ if (resolveConsolidationCapabilities(this.config).semanticConsolidation) {
16569
16568
  try {
16570
16569
  const stateFilePath = path.join(
16571
16570
  this.config.memoryDir,