@remnic/core 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/abort-error.d.ts +32 -0
  2. package/dist/abort-error.js +11 -0
  3. package/dist/access-cli.js +41 -40
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +3 -2
  6. package/dist/access-http.js +11 -11
  7. package/dist/access-mcp.d.ts +3 -2
  8. package/dist/access-mcp.js +7 -7
  9. package/dist/access-schema.d.ts +16 -16
  10. package/dist/access-service-HmO1Trrx.d.ts +732 -0
  11. package/dist/access-service.d.ts +11 -658
  12. package/dist/access-service.js +9 -9
  13. package/dist/bootstrap.d.ts +1 -1
  14. package/dist/briefing.js +6 -6
  15. package/dist/calibration.js +3 -3
  16. package/dist/causal-consolidation.js +10 -10
  17. package/dist/{chunk-PMB3WGDL.js → chunk-37UIFYWO.js} +64 -3
  18. package/dist/chunk-37UIFYWO.js.map +1 -0
  19. package/dist/{chunk-X4WESCKA.js → chunk-3QHL5ABG.js} +5 -5
  20. package/dist/{chunk-2VFW5K5U.js → chunk-3SV6CQHO.js} +10 -8
  21. package/dist/chunk-3SV6CQHO.js.map +1 -0
  22. package/dist/{chunk-U2IQTSBY.js → chunk-3WHVNEN7.js} +1 -1
  23. package/dist/chunk-3WHVNEN7.js.map +1 -0
  24. package/dist/{chunk-QKAH5B6E.js → chunk-44ICJRF3.js} +97 -9
  25. package/dist/chunk-44ICJRF3.js.map +1 -0
  26. package/dist/{chunk-S4LX5EBI.js → chunk-47UU5PU2.js} +48 -9
  27. package/dist/chunk-47UU5PU2.js.map +1 -0
  28. package/dist/{chunk-ECKDIK5F.js → chunk-4LACOVZX.js} +2 -2
  29. package/dist/{chunk-AYPYCLR7.js → chunk-6LX5ORAS.js} +2 -2
  30. package/dist/{chunk-GJQPH5G3.js → chunk-6UJ47TVX.js} +2 -2
  31. package/dist/{chunk-KWP7T3DP.js → chunk-7ECD5ATE.js} +2 -2
  32. package/dist/{chunk-74JR4N5J.js → chunk-7WQ6SLIE.js} +2 -2
  33. package/dist/{chunk-7PA4OZEU.js → chunk-BLKTA7MM.js} +6 -14
  34. package/dist/chunk-BLKTA7MM.js.map +1 -0
  35. package/dist/{chunk-XMGSSBFX.js → chunk-DEPL3635.js} +172 -100
  36. package/dist/chunk-DEPL3635.js.map +1 -0
  37. package/dist/{chunk-JROGC36Y.js → chunk-DHHP2Z4X.js} +2 -2
  38. package/dist/{chunk-BKQJBXXX.js → chunk-GGD5W7TB.js} +2 -2
  39. package/dist/chunk-GGD5W7TB.js.map +1 -0
  40. package/dist/{chunk-POMSFKTB.js → chunk-GV6NLQ4X.js} +14 -14
  41. package/dist/{chunk-AAI7JARD.js → chunk-HMDCOMYU.js} +8 -11
  42. package/dist/chunk-HMDCOMYU.js.map +1 -0
  43. package/dist/{chunk-POBPGDWI.js → chunk-ITRLGI2T.js} +2 -2
  44. package/dist/{chunk-MYQWXITD.js → chunk-JIU55F3X.js} +2 -2
  45. package/dist/{chunk-UPMD5XND.js → chunk-JL2PU6AI.js} +16 -5
  46. package/dist/chunk-JL2PU6AI.js.map +1 -0
  47. package/dist/{chunk-OJFGVJS6.js → chunk-MBJHSA7F.js} +65 -9
  48. package/dist/chunk-MBJHSA7F.js.map +1 -0
  49. package/dist/{chunk-V7XCAHIB.js → chunk-MVTHXUBX.js} +46 -23
  50. package/dist/chunk-MVTHXUBX.js.map +1 -0
  51. package/dist/{chunk-BTY5RRRF.js → chunk-N42IWANG.js} +5 -5
  52. package/dist/{chunk-NSB3WSYS.js → chunk-NQEVYWX6.js} +74 -3
  53. package/dist/chunk-NQEVYWX6.js.map +1 -0
  54. package/dist/chunk-OIT5QGG4.js +80 -0
  55. package/dist/chunk-OIT5QGG4.js.map +1 -0
  56. package/dist/chunk-PVGDJXVK.js +21 -0
  57. package/dist/chunk-PVGDJXVK.js.map +1 -0
  58. package/dist/{chunk-RCICHSHL.js → chunk-SYUK3VLY.js} +2 -2
  59. package/dist/{chunk-YFYL2SIJ.js → chunk-WBSAYXVI.js} +127 -39
  60. package/dist/chunk-WBSAYXVI.js.map +1 -0
  61. package/dist/{chunk-KEG4GNGI.js → chunk-XZ2TIKGC.js} +38 -8
  62. package/dist/chunk-XZ2TIKGC.js.map +1 -0
  63. package/dist/chunk-Y4FHOFJ2.js +140 -0
  64. package/dist/chunk-Y4FHOFJ2.js.map +1 -0
  65. package/dist/chunk-YNB73F22.js +137 -0
  66. package/dist/chunk-YNB73F22.js.map +1 -0
  67. package/dist/{chunk-HITJFT7E.js → chunk-ZVBB3T7V.js} +10 -5
  68. package/dist/chunk-ZVBB3T7V.js.map +1 -0
  69. package/dist/{cli-DwIBnp2g.d.ts → cli-BneVIEvh.d.ts} +2 -2
  70. package/dist/cli.d.ts +4 -3
  71. package/dist/cli.js +25 -24
  72. package/dist/config.js +1 -1
  73. package/dist/contradiction-review-WIUBAR52.js +21 -0
  74. package/dist/contradiction-review-WIUBAR52.js.map +1 -0
  75. package/dist/contradiction-scan-GR33PONM.js +376 -0
  76. package/dist/contradiction-scan-GR33PONM.js.map +1 -0
  77. package/dist/direct-answer-wiring.d.ts +77 -0
  78. package/dist/direct-answer-wiring.js +75 -0
  79. package/dist/direct-answer-wiring.js.map +1 -0
  80. package/dist/direct-answer.d.ts +106 -0
  81. package/dist/direct-answer.js +10 -0
  82. package/dist/direct-answer.js.map +1 -0
  83. package/dist/{engine-X7X3AAG3.js → engine-5TIQBYZR.js} +7 -7
  84. package/dist/engine-5TIQBYZR.js.map +1 -0
  85. package/dist/entity-retrieval.js +6 -6
  86. package/dist/explicit-capture.d.ts +1 -1
  87. package/dist/extraction.js +6 -6
  88. package/dist/fallback-llm.d.ts +11 -2
  89. package/dist/fallback-llm.js +3 -3
  90. package/dist/harmonic-retrieval.js +2 -1
  91. package/dist/index.d.ts +10 -124
  92. package/dist/index.js +74 -137
  93. package/dist/index.js.map +1 -1
  94. package/dist/intent.js +1 -1
  95. package/dist/local-llm.d.ts +10 -3
  96. package/dist/local-llm.js +1 -1
  97. package/dist/operator-toolkit.js +12 -11
  98. package/dist/{orchestrator-B9kwlCep.d.ts → orchestrator-DRYA6_lW.d.ts} +21 -2
  99. package/dist/orchestrator.d.ts +1 -1
  100. package/dist/orchestrator.js +36 -35
  101. package/dist/qmd.js +2 -1
  102. package/dist/recall-state.d.ts +28 -1
  103. package/dist/recall-state.js +1 -1
  104. package/dist/resolution-QBTDHTG7.js +100 -0
  105. package/dist/resolution-QBTDHTG7.js.map +1 -0
  106. package/dist/resolve-provider-secret.d.ts +24 -1
  107. package/dist/resolve-provider-secret.js +3 -1
  108. package/dist/resume-bundles.js +3 -3
  109. package/dist/schemas.d.ts +14 -14
  110. package/dist/semantic-consolidation.js +6 -6
  111. package/dist/semantic-rule-promotion.js +6 -6
  112. package/dist/semantic-rule-verifier.js +6 -6
  113. package/dist/storage.js +5 -5
  114. package/dist/summarizer.js +5 -5
  115. package/dist/types-DJhqDJUV.d.ts +50 -0
  116. package/dist/types.d.ts +34 -2
  117. package/dist/types.js +1 -1
  118. package/dist/verified-recall.js +6 -6
  119. package/package.json +1 -1
  120. package/dist/chunk-2VFW5K5U.js.map +0 -1
  121. package/dist/chunk-7PA4OZEU.js.map +0 -1
  122. package/dist/chunk-AAI7JARD.js.map +0 -1
  123. package/dist/chunk-BKQJBXXX.js.map +0 -1
  124. package/dist/chunk-HITJFT7E.js.map +0 -1
  125. package/dist/chunk-KEG4GNGI.js.map +0 -1
  126. package/dist/chunk-NSB3WSYS.js.map +0 -1
  127. package/dist/chunk-OJFGVJS6.js.map +0 -1
  128. package/dist/chunk-PMB3WGDL.js.map +0 -1
  129. package/dist/chunk-QKAH5B6E.js.map +0 -1
  130. package/dist/chunk-S4LX5EBI.js.map +0 -1
  131. package/dist/chunk-U2IQTSBY.js.map +0 -1
  132. package/dist/chunk-UPMD5XND.js.map +0 -1
  133. package/dist/chunk-V7XCAHIB.js.map +0 -1
  134. package/dist/chunk-XMGSSBFX.js.map +0 -1
  135. package/dist/chunk-YFYL2SIJ.js.map +0 -1
  136. /package/dist/{engine-X7X3AAG3.js.map → abort-error.js.map} +0 -0
  137. /package/dist/{chunk-X4WESCKA.js.map → chunk-3QHL5ABG.js.map} +0 -0
  138. /package/dist/{chunk-ECKDIK5F.js.map → chunk-4LACOVZX.js.map} +0 -0
  139. /package/dist/{chunk-AYPYCLR7.js.map → chunk-6LX5ORAS.js.map} +0 -0
  140. /package/dist/{chunk-GJQPH5G3.js.map → chunk-6UJ47TVX.js.map} +0 -0
  141. /package/dist/{chunk-KWP7T3DP.js.map → chunk-7ECD5ATE.js.map} +0 -0
  142. /package/dist/{chunk-74JR4N5J.js.map → chunk-7WQ6SLIE.js.map} +0 -0
  143. /package/dist/{chunk-JROGC36Y.js.map → chunk-DHHP2Z4X.js.map} +0 -0
  144. /package/dist/{chunk-POMSFKTB.js.map → chunk-GV6NLQ4X.js.map} +0 -0
  145. /package/dist/{chunk-POBPGDWI.js.map → chunk-ITRLGI2T.js.map} +0 -0
  146. /package/dist/{chunk-MYQWXITD.js.map → chunk-JIU55F3X.js.map} +0 -0
  147. /package/dist/{chunk-BTY5RRRF.js.map → chunk-N42IWANG.js.map} +0 -0
  148. /package/dist/{chunk-RCICHSHL.js.map → chunk-SYUK3VLY.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config.ts","../src/connectors/coerce.ts"],"sourcesContent":["import path from \"node:path\";\nimport type {\n CodexCompactionFlushMode,\n CodexCompatConfig,\n DreamingConfig,\n ProceduralConfig,\n HeartbeatConfig,\n IdentityInjectionMode,\n MemoryOsPresetName,\n PluginConfig,\n PrincipalRule,\n RecallPipelineConfig,\n RecallSectionConfig,\n ReasoningEffort,\n SemanticChunkingConfigShape,\n SessionObserverBandConfig,\n SlotBehaviorConfig,\n SlotMismatchMode,\n TriggerMode,\n} from \"./types.js\";\nimport { log } from \"./logger.js\";\nimport { cloneDefaultSessionObserverBands } from \"./session-observer-bands.js\";\nimport { readEnvVar, resolveHomeDir } from \"./runtime/env.js\";\nimport { normalizeEntitySchemas } from \"./entity-schema.js\";\n// Finding 4 (#394): use the shared coerce helper instead of inlining the same\n// boolean-coercion logic that connectors/index.ts already exports. The helper\n// lives in connectors/coerce.ts (a tiny, dependency-free module) so neither\n// config.ts → connectors/index.ts nor the reverse circular import arises.\nimport { coerceBool, coerceInstallExtension, coerceNumber } from \"./connectors/coerce.js\";\n\nconst DEFAULT_MEMORY_DIR = path.join(\n resolveHomeDir(),\n \".openclaw\",\n \"workspace\",\n \"memory\",\n \"local\",\n);\n\nconst DEFAULT_WORKSPACE_DIR = path.join(\n resolveHomeDir(),\n \".openclaw\",\n \"workspace\",\n);\n\nfunction resolveEnvVars(value: string): string {\n const resolved = value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (_, envVar: string) => {\n const envValue = readEnvVar(envVar);\n if (!envValue) {\n throw new Error(`Environment variable ${envVar} is not set`);\n }\n return envValue;\n });\n const remaining = resolved.match(/\\$\\{[^}]*\\}/);\n if (remaining) {\n throw new Error(`Malformed environment variable placeholder: ${remaining[0]}`);\n }\n return resolved;\n}\n\nfunction normalizeOpenaiBaseUrl(value: string | undefined, source: \"config\" | \"env\"): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n log.warn(`ignoring invalid openaiBaseUrl from ${source}: not a valid URL`);\n return undefined;\n }\n\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n log.warn(\n `ignoring openaiBaseUrl from ${source}: unsupported URL scheme (${parsed.protocol.replace(\":\", \"\")})`,\n );\n return undefined;\n }\n\n if (parsed.protocol === \"http:\") {\n log.warn(`openaiBaseUrl from ${source} is using insecure http; prefer https`);\n }\n\n // Avoid duplicate slash behavior in downstream baseURL path joins.\n let url = parsed.toString();\n while (url.endsWith(\"/\")) url = url.slice(0, -1);\n return url;\n}\n\nfunction normalizeMemoryRelativeDir(raw: unknown, fallback: string): string {\n if (typeof raw !== \"string\") return fallback;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return fallback;\n\n const normalized = trimmed\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\")\n .join(\"/\");\n return normalized.length > 0 ? normalized : fallback;\n}\n\n/**\n * Parse and validate the semanticChunkingConfig sub-object.\n * Returns only recognized numeric/boolean fields with their correct types.\n */\nfunction parseSemanticChunkingConfig(\n raw: unknown,\n): Partial<SemanticChunkingConfigShape> {\n if (!raw || typeof raw !== \"object\") return {};\n const src = raw as Record<string, unknown>;\n const out: Partial<SemanticChunkingConfigShape> = {};\n\n if (typeof src.targetTokens === \"number\") out.targetTokens = src.targetTokens;\n if (typeof src.minTokens === \"number\") out.minTokens = src.minTokens;\n if (typeof src.maxTokens === \"number\") out.maxTokens = src.maxTokens;\n if (typeof src.smoothingWindowSize === \"number\") out.smoothingWindowSize = src.smoothingWindowSize;\n if (typeof src.boundaryThresholdStdDevs === \"number\") out.boundaryThresholdStdDevs = src.boundaryThresholdStdDevs;\n if (typeof src.embeddingBatchSize === \"number\") out.embeddingBatchSize = src.embeddingBatchSize;\n if (typeof src.fallbackToRecursive === \"boolean\") out.fallbackToRecursive = src.fallbackToRecursive;\n\n return out;\n}\n\nconst VALID_EFFORTS: ReasoningEffort[] = [\"none\", \"low\", \"medium\", \"high\"];\nconst VALID_TRIGGERS: TriggerMode[] = [\"smart\", \"every_n\", \"time_based\"];\nconst VALID_IDENTITY_INJECTION_MODES: IdentityInjectionMode[] = [\"recovery_only\", \"minimal\", \"full\"];\nconst VALID_MEMORY_OS_PRESETS: MemoryOsPresetName[] = [\n \"conservative\",\n \"balanced\",\n \"research-max\",\n \"local-llm-heavy\",\n];\nconst VALID_SLOT_MISMATCH_MODES: SlotMismatchMode[] = [\"error\", \"warn\", \"silent\"];\nconst VALID_CODEX_COMPACTION_FLUSH_MODES: CodexCompactionFlushMode[] = [\"signal\", \"heuristic\", \"auto\"];\nexport const VALID_MEMORY_CATEGORIES = new Set([\n \"fact\",\n \"preference\",\n \"correction\",\n \"entity\",\n \"decision\",\n \"relationship\",\n \"principle\",\n \"commitment\",\n \"moment\",\n \"skill\",\n \"rule\",\n \"procedure\",\n]);\n\nconst DEFAULT_BEHAVIOR_LOOP_PROTECTED_PARAMS = [\n \"maxMemoryTokens\",\n \"qmdMaxResults\",\n \"qmdColdMaxResults\",\n \"recallPlannerMaxQmdResultsMinimal\",\n \"verbatimArtifactsMaxRecall\",\n];\n\nconst MEMORY_OS_PRESET_ALIASES: Record<string, MemoryOsPresetName> = {\n research: \"research-max\",\n};\n\nconst MEMORY_OS_PRESETS: Record<MemoryOsPresetName, Record<string, unknown>> = {\n conservative: {\n maxMemoryTokens: 1500,\n recallPlannerMaxQmdResultsMinimal: 2,\n recallPlannerMaxQmdResultsFull: 5,\n queryAwareIndexingEnabled: false,\n verbatimArtifactsEnabled: false,\n verbatimArtifactsMaxRecall: 2,\n rerankEnabled: false,\n localLlmEnabled: false,\n localLlmFastEnabled: false,\n multiGraphMemoryEnabled: false,\n graphRecallEnabled: false,\n graphAssistInFullModeEnabled: false,\n proactiveExtractionEnabled: false,\n contextCompressionActionsEnabled: false,\n compressionGuidelineLearningEnabled: false,\n compressionGuidelineSemanticRefinementEnabled: false,\n maxProactiveQuestionsPerExtraction: 0,\n maxCompressionTokensPerHour: 0,\n behaviorLoopAutoTuneEnabled: false,\n },\n balanced: {\n maxMemoryTokens: 2000,\n recallPlannerMaxQmdResultsMinimal: 4,\n recallPlannerMaxQmdResultsFull: 8,\n queryAwareIndexingEnabled: true,\n verbatimArtifactsEnabled: true,\n verbatimArtifactsMaxRecall: 4,\n rerankEnabled: true,\n rerankProvider: \"local\",\n localLlmEnabled: false,\n localLlmFastEnabled: false,\n multiGraphMemoryEnabled: false,\n graphRecallEnabled: false,\n graphAssistInFullModeEnabled: false,\n proactiveExtractionEnabled: false,\n contextCompressionActionsEnabled: false,\n compressionGuidelineLearningEnabled: false,\n compressionGuidelineSemanticRefinementEnabled: false,\n maxProactiveQuestionsPerExtraction: 2,\n maxCompressionTokensPerHour: 1500,\n behaviorLoopAutoTuneEnabled: false,\n },\n \"research-max\": {\n maxMemoryTokens: 3200,\n recallPlannerMaxQmdResultsMinimal: 6,\n recallPlannerMaxQmdResultsFull: 12,\n queryAwareIndexingEnabled: true,\n verbatimArtifactsEnabled: true,\n verbatimArtifactsMaxRecall: 6,\n rerankEnabled: true,\n rerankProvider: \"local\",\n localLlmEnabled: false,\n localLlmFastEnabled: false,\n multiGraphMemoryEnabled: true,\n graphRecallEnabled: true,\n graphAssistInFullModeEnabled: true,\n proactiveExtractionEnabled: true,\n contextCompressionActionsEnabled: true,\n compressionGuidelineLearningEnabled: true,\n compressionGuidelineSemanticRefinementEnabled: true,\n maxProactiveQuestionsPerExtraction: 4,\n maxCompressionTokensPerHour: 3000,\n behaviorLoopAutoTuneEnabled: true,\n },\n \"local-llm-heavy\": {\n maxMemoryTokens: 2400,\n recallPlannerMaxQmdResultsMinimal: 4,\n recallPlannerMaxQmdResultsFull: 8,\n queryAwareIndexingEnabled: true,\n verbatimArtifactsEnabled: true,\n verbatimArtifactsMaxRecall: 4,\n rerankEnabled: true,\n rerankProvider: \"local\",\n localLlmEnabled: true,\n localLlmFastEnabled: true,\n embeddingFallbackProvider: \"local\",\n localLlmFallback: true,\n multiGraphMemoryEnabled: false,\n graphRecallEnabled: false,\n graphAssistInFullModeEnabled: false,\n proactiveExtractionEnabled: true,\n contextCompressionActionsEnabled: true,\n compressionGuidelineLearningEnabled: true,\n compressionGuidelineSemanticRefinementEnabled: false,\n maxProactiveQuestionsPerExtraction: 2,\n maxCompressionTokensPerHour: 1500,\n behaviorLoopAutoTuneEnabled: false,\n },\n};\n\nfunction resolveMemoryOsPreset(value: unknown): MemoryOsPresetName | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n if (VALID_MEMORY_OS_PRESETS.includes(normalized as MemoryOsPresetName)) {\n return normalized as MemoryOsPresetName;\n }\n return MEMORY_OS_PRESET_ALIASES[normalized];\n}\n\nexport function parseConfig(raw: unknown): PluginConfig {\n const baseCfg =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n const memoryOsPreset = resolveMemoryOsPreset(baseCfg.memoryOsPreset);\n const cfg = memoryOsPreset\n ? {\n ...MEMORY_OS_PRESETS[memoryOsPreset],\n ...baseCfg,\n memoryOsPreset,\n }\n : baseCfg;\n\n let apiKey: string | undefined;\n if (typeof cfg.openaiApiKey === \"string\" && cfg.openaiApiKey.length > 0) {\n apiKey = resolveEnvVars(cfg.openaiApiKey);\n } else {\n apiKey = process.env.OPENAI_API_KEY;\n }\n\n // API key is optional at load time — retrieval works without it.\n // Extraction will log a warning if called without a key.\n\n const model =\n typeof cfg.model === \"string\" && cfg.model.length > 0\n ? cfg.model\n : \"gpt-5.2\";\n const captureMode =\n cfg.captureMode === \"explicit\" || cfg.captureMode === \"hybrid\"\n ? cfg.captureMode\n : \"implicit\";\n\n const rawEffort = cfg.reasoningEffort as string | undefined;\n const reasoningEffort: ReasoningEffort =\n rawEffort && VALID_EFFORTS.includes(rawEffort as ReasoningEffort)\n ? (rawEffort as ReasoningEffort)\n : \"low\";\n\n const rawTrigger = cfg.triggerMode as string | undefined;\n const triggerMode: TriggerMode =\n rawTrigger && VALID_TRIGGERS.includes(rawTrigger as TriggerMode)\n ? (rawTrigger as TriggerMode)\n : \"smart\";\n const rawSlotBehavior =\n cfg.slotBehavior && typeof cfg.slotBehavior === \"object\" && !Array.isArray(cfg.slotBehavior)\n ? (cfg.slotBehavior as Record<string, unknown>)\n : {};\n const slotBehavior: SlotBehaviorConfig = {\n requireExclusiveMemorySlot:\n rawSlotBehavior.requireExclusiveMemorySlot !== false,\n onSlotMismatch:\n typeof rawSlotBehavior.onSlotMismatch === \"string\" &&\n VALID_SLOT_MISMATCH_MODES.includes(\n rawSlotBehavior.onSlotMismatch as SlotMismatchMode,\n )\n ? (rawSlotBehavior.onSlotMismatch as SlotMismatchMode)\n : \"error\",\n };\n const rawDreaming =\n cfg.dreaming && typeof cfg.dreaming === \"object\" && !Array.isArray(cfg.dreaming)\n ? (cfg.dreaming as Record<string, unknown>)\n : {};\n const dreaming: DreamingConfig = {\n enabled: rawDreaming.enabled === true,\n journalPath:\n typeof rawDreaming.journalPath === \"string\" && rawDreaming.journalPath.trim().length > 0\n ? rawDreaming.journalPath.trim()\n : \"DREAMS.md\",\n maxEntries:\n typeof rawDreaming.maxEntries === \"number\"\n ? rawDreaming.maxEntries === 0\n ? 0\n : rawDreaming.maxEntries < 0\n ? 500\n : rawDreaming.maxEntries < 10\n ? 500\n : Math.min(10000, Math.floor(rawDreaming.maxEntries))\n : 500,\n injectRecentCount:\n typeof rawDreaming.injectRecentCount === \"number\"\n ? Math.min(20, Math.max(0, Math.floor(rawDreaming.injectRecentCount)))\n : 3,\n minIntervalMinutes:\n typeof rawDreaming.minIntervalMinutes === \"number\"\n ? Math.max(1, Math.floor(rawDreaming.minIntervalMinutes))\n : 120,\n narrativeModel:\n typeof rawDreaming.narrativeModel === \"string\" && rawDreaming.narrativeModel.trim().length > 0\n ? rawDreaming.narrativeModel.trim()\n : null,\n narrativePromptStyle:\n rawDreaming.narrativePromptStyle === \"diary\" ||\n rawDreaming.narrativePromptStyle === \"analytical\"\n ? rawDreaming.narrativePromptStyle\n : \"reflective\",\n watchFile: rawDreaming.watchFile !== false,\n };\n const rawHeartbeat =\n cfg.heartbeat && typeof cfg.heartbeat === \"object\" && !Array.isArray(cfg.heartbeat)\n ? (cfg.heartbeat as Record<string, unknown>)\n : {};\n const heartbeat: HeartbeatConfig = {\n enabled: rawHeartbeat.enabled === true,\n journalPath:\n typeof rawHeartbeat.journalPath === \"string\" && rawHeartbeat.journalPath.trim().length > 0\n ? rawHeartbeat.journalPath.trim()\n : \"HEARTBEAT.md\",\n maxPreviousRuns:\n typeof rawHeartbeat.maxPreviousRuns === \"number\"\n ? Math.min(20, Math.max(0, Math.floor(rawHeartbeat.maxPreviousRuns)))\n : 5,\n watchFile: rawHeartbeat.watchFile !== false,\n detectionMode:\n rawHeartbeat.detectionMode === \"runtime-signal\" ||\n rawHeartbeat.detectionMode === \"heuristic\"\n ? rawHeartbeat.detectionMode\n : \"auto\",\n gateExtractionDuringHeartbeat:\n rawHeartbeat.gateExtractionDuringHeartbeat !== false,\n };\n const rawCodexCompat =\n cfg.codexCompat && typeof cfg.codexCompat === \"object\" && !Array.isArray(cfg.codexCompat)\n ? (cfg.codexCompat as Record<string, unknown>)\n : {};\n const codexCompat: CodexCompatConfig = {\n enabled: rawCodexCompat.enabled === true,\n threadIdBufferKeying: rawCodexCompat.threadIdBufferKeying !== false,\n compactionFlushMode:\n typeof rawCodexCompat.compactionFlushMode === \"string\" &&\n VALID_CODEX_COMPACTION_FLUSH_MODES.includes(\n rawCodexCompat.compactionFlushMode as CodexCompactionFlushMode,\n )\n ? (rawCodexCompat.compactionFlushMode as CodexCompactionFlushMode)\n : \"auto\",\n fingerprintDedup: rawCodexCompat.fingerprintDedup !== false,\n };\n\n const rawProcedural =\n cfg.procedural && typeof cfg.procedural === \"object\" && !Array.isArray(cfg.procedural)\n ? (cfg.procedural as Record<string, unknown>)\n : {};\n const proceduralMinRaw =\n typeof rawProcedural.minOccurrences === \"number\" && Number.isFinite(rawProcedural.minOccurrences)\n ? Math.floor(rawProcedural.minOccurrences)\n : 3;\n const procedural: ProceduralConfig = {\n enabled: coerceBool(rawProcedural.enabled) === true,\n /** 0 disables miner emission threshold (no clusters qualify). */\n minOccurrences: Math.min(1000, Math.max(0, proceduralMinRaw)),\n successFloor:\n typeof rawProcedural.successFloor === \"number\" &&\n Number.isFinite(rawProcedural.successFloor) &&\n rawProcedural.successFloor >= 0 &&\n rawProcedural.successFloor <= 1\n ? rawProcedural.successFloor\n : 0.7,\n autoPromoteOccurrences:\n typeof rawProcedural.autoPromoteOccurrences === \"number\" &&\n Number.isFinite(rawProcedural.autoPromoteOccurrences)\n ? rawProcedural.autoPromoteOccurrences <= 0\n ? 0\n : Math.min(10_000, Math.max(1, Math.floor(rawProcedural.autoPromoteOccurrences)))\n : 8,\n autoPromoteEnabled: coerceBool(rawProcedural.autoPromoteEnabled) === true,\n lookbackDays:\n typeof rawProcedural.lookbackDays === \"number\" && Number.isFinite(rawProcedural.lookbackDays)\n ? Math.min(3650, Math.max(1, Math.floor(rawProcedural.lookbackDays)))\n : 30,\n proceduralMiningCronAutoRegister: coerceBool(rawProcedural.proceduralMiningCronAutoRegister) === true,\n recallMaxProcedures:\n typeof rawProcedural.recallMaxProcedures === \"number\" &&\n Number.isFinite(rawProcedural.recallMaxProcedures)\n ? Math.min(10, Math.max(1, Math.floor(rawProcedural.recallMaxProcedures)))\n : 3,\n };\n\n const memoryDir =\n typeof cfg.memoryDir === \"string\" && cfg.memoryDir.length > 0\n ? cfg.memoryDir\n : DEFAULT_MEMORY_DIR;\n const rawIdentityInjectionMode = cfg.identityInjectionMode as string | undefined;\n const identityInjectionMode: IdentityInjectionMode =\n rawIdentityInjectionMode\n && VALID_IDENTITY_INJECTION_MODES.includes(rawIdentityInjectionMode as IdentityInjectionMode)\n ? (rawIdentityInjectionMode as IdentityInjectionMode)\n : \"recovery_only\";\n const identityContinuityEnabled = cfg.identityContinuityEnabled === true;\n const sessionObserverBands: SessionObserverBandConfig[] = Array.isArray(cfg.sessionObserverBands)\n ? (cfg.sessionObserverBands as Array<Record<string, unknown>>)\n .map((band) => ({\n maxBytes:\n typeof band?.maxBytes === \"number\" ? Math.max(0, Math.floor(band.maxBytes)) : 0,\n triggerDeltaBytes:\n typeof band?.triggerDeltaBytes === \"number\"\n ? Math.max(0, Math.floor(band.triggerDeltaBytes))\n : 0,\n triggerDeltaTokens:\n typeof band?.triggerDeltaTokens === \"number\"\n ? Math.max(0, Math.floor(band.triggerDeltaTokens))\n : 0,\n }))\n .filter((band) => band.maxBytes > 0)\n : cloneDefaultSessionObserverBands();\n\n const principalRules: PrincipalRule[] = Array.isArray(cfg.principalFromSessionKeyRules)\n ? (cfg.principalFromSessionKeyRules as any[]).map((r) => ({\n match: typeof r?.match === \"string\" ? r.match : \"\",\n principal: typeof r?.principal === \"string\" ? r.principal : \"\",\n })).filter((r) => r.match.length > 0 && r.principal.length > 0)\n : [];\n const entitySchemas = normalizeEntitySchemas(cfg.entitySchemas);\n\n // Optional file hygiene (memory file limits / truncation risk mitigation)\n const rawHygiene =\n cfg.fileHygiene && typeof cfg.fileHygiene === \"object\" && !Array.isArray(cfg.fileHygiene)\n ? (cfg.fileHygiene as Record<string, unknown>)\n : undefined;\n const hygieneEnabled = rawHygiene?.enabled === true;\n const fileHygiene = hygieneEnabled\n ? {\n enabled: true,\n lintEnabled: rawHygiene?.lintEnabled !== false,\n lintBudgetBytes:\n typeof rawHygiene?.lintBudgetBytes === \"number\" ? rawHygiene.lintBudgetBytes : 20_000,\n lintWarnRatio:\n typeof rawHygiene?.lintWarnRatio === \"number\" ? rawHygiene.lintWarnRatio : 0.8,\n lintPaths: Array.isArray(rawHygiene?.lintPaths)\n ? (rawHygiene!.lintPaths as string[])\n : [\"IDENTITY.md\", \"MEMORY.md\"],\n rotateEnabled: rawHygiene?.rotateEnabled === true,\n rotateMaxBytes:\n typeof rawHygiene?.rotateMaxBytes === \"number\" ? rawHygiene.rotateMaxBytes : 18_000,\n rotateKeepTailChars:\n typeof rawHygiene?.rotateKeepTailChars === \"number\"\n ? rawHygiene.rotateKeepTailChars\n : 2000,\n rotatePaths: Array.isArray(rawHygiene?.rotatePaths)\n ? (rawHygiene!.rotatePaths as string[])\n : [\"IDENTITY.md\"],\n archiveDir:\n typeof rawHygiene?.archiveDir === \"string\" && rawHygiene.archiveDir.length > 0\n ? (rawHygiene.archiveDir as string)\n : \".engram-archive\",\n runMinIntervalMs:\n typeof rawHygiene?.runMinIntervalMs === \"number\" ? rawHygiene.runMinIntervalMs : 5 * 60 * 1000,\n warningsLogEnabled: rawHygiene?.warningsLogEnabled === true,\n warningsLogPath:\n typeof rawHygiene?.warningsLogPath === \"string\" && rawHygiene.warningsLogPath.length > 0\n ? (rawHygiene.warningsLogPath as string)\n : \"hygiene/warnings.md\",\n indexEnabled: rawHygiene?.indexEnabled === true,\n indexPath:\n typeof rawHygiene?.indexPath === \"string\" && rawHygiene.indexPath.length > 0\n ? (rawHygiene.indexPath as string)\n : \"ENGRAM_INDEX.md\",\n }\n : undefined;\n\n const rawNativeKnowledge =\n cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\" && !Array.isArray(cfg.nativeKnowledge)\n ? (cfg.nativeKnowledge as Record<string, unknown>)\n : undefined;\n const nativeKnowledge = rawNativeKnowledge?.enabled === true\n ? {\n enabled: true,\n includeFiles: Array.isArray(rawNativeKnowledge.includeFiles)\n ? (rawNativeKnowledge.includeFiles as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"IDENTITY.md\", \"MEMORY.md\"],\n maxChunkChars:\n typeof rawNativeKnowledge.maxChunkChars === \"number\"\n ? Math.max(200, Math.floor(rawNativeKnowledge.maxChunkChars))\n : 900,\n maxResults:\n typeof rawNativeKnowledge.maxResults === \"number\"\n ? Math.max(0, Math.floor(rawNativeKnowledge.maxResults))\n : 4,\n maxChars:\n typeof rawNativeKnowledge.maxChars === \"number\"\n ? Math.max(0, Math.floor(rawNativeKnowledge.maxChars))\n : 2400,\n stateDir:\n normalizeMemoryRelativeDir(rawNativeKnowledge.stateDir, \"state/native-knowledge\"),\n openclawWorkspace:\n rawNativeKnowledge.openclawWorkspace &&\n typeof rawNativeKnowledge.openclawWorkspace === \"object\" &&\n !Array.isArray(rawNativeKnowledge.openclawWorkspace) &&\n (rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).enabled === true\n ? {\n enabled: true,\n bootstrapFiles: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).bootstrapFiles)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).bootstrapFiles as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"IDENTITY.md\", \"MEMORY.md\", \"USER.md\"],\n handoffGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).handoffGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).handoffGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"**/*handoff*.md\", \"handoffs/**/*.md\"],\n dailySummaryGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).dailySummaryGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).dailySummaryGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"**/*daily*summary*.md\", \"summaries/**/*.md\"],\n automationNoteGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).automationNoteGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).automationNoteGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [],\n workspaceDocGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).workspaceDocGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).workspaceDocGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [],\n excludeGlobs: [\n \".git/**\",\n \"node_modules/**\",\n \"dist/**\",\n \"build/**\",\n \"coverage/**\",\n \"**/*.log\",\n \"**/.env*\",\n \"**/*.pem\",\n \"**/*.key\",\n ...(Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).excludeGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).excludeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : []),\n ].filter((value, index, array) => array.indexOf(value) === index),\n sharedSafeGlobs: Array.isArray((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).sharedSafeGlobs)\n ? ((rawNativeKnowledge.openclawWorkspace as Record<string, unknown>).sharedSafeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [],\n }\n : undefined,\n obsidianVaults: Array.isArray(rawNativeKnowledge.obsidianVaults)\n ? (rawNativeKnowledge.obsidianVaults as unknown[])\n .filter((value): value is Record<string, unknown> => !!value && typeof value === \"object\" && !Array.isArray(value))\n .map((vault, index) => {\n const defaultId = `vault-${index + 1}`;\n return {\n id:\n typeof vault.id === \"string\" && vault.id.trim().length > 0\n ? vault.id.trim()\n : defaultId,\n rootDir:\n typeof vault.rootDir === \"string\" && vault.rootDir.trim().length > 0\n ? vault.rootDir.trim()\n : \"\",\n includeGlobs: Array.isArray(vault.includeGlobs)\n ? (vault.includeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"**/*.md\"],\n excludeGlobs: Array.isArray(vault.excludeGlobs)\n ? (vault.excludeGlobs as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\".obsidian/**\", \"**/*.canvas\", \"**/*.png\", \"**/*.jpg\", \"**/*.jpeg\", \"**/*.gif\", \"**/*.pdf\"],\n namespace:\n typeof vault.namespace === \"string\" && vault.namespace.trim().length > 0\n ? vault.namespace.trim()\n : undefined,\n privacyClass:\n typeof vault.privacyClass === \"string\" && vault.privacyClass.trim().length > 0\n ? vault.privacyClass.trim()\n : undefined,\n folderRules: Array.isArray(vault.folderRules)\n ? (vault.folderRules as unknown[])\n .filter((value): value is Record<string, unknown> => !!value && typeof value === \"object\" && !Array.isArray(value))\n .map((rule) => ({\n pathPrefix:\n typeof rule.pathPrefix === \"string\" && rule.pathPrefix.trim().length > 0\n ? rule.pathPrefix.trim()\n : \"\",\n namespace:\n typeof rule.namespace === \"string\" && rule.namespace.trim().length > 0\n ? rule.namespace.trim()\n : undefined,\n privacyClass:\n typeof rule.privacyClass === \"string\" && rule.privacyClass.trim().length > 0\n ? rule.privacyClass.trim()\n : undefined,\n }))\n .filter((rule) => rule.pathPrefix.length > 0)\n : [],\n dailyNotePatterns: Array.isArray(vault.dailyNotePatterns)\n ? (vault.dailyNotePatterns as unknown[])\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [\"YYYY-MM-DD\"],\n materializeBacklinks: vault.materializeBacklinks === true,\n };\n })\n .filter((vault) => vault.rootDir.length > 0)\n : [],\n }\n : undefined;\n\n const rawAgentAccessHttp =\n cfg.agentAccessHttp && typeof cfg.agentAccessHttp === \"object\" && !Array.isArray(cfg.agentAccessHttp)\n ? (cfg.agentAccessHttp as Record<string, unknown>)\n : undefined;\n const agentAccessHttp = {\n enabled: rawAgentAccessHttp?.enabled === true,\n host:\n typeof rawAgentAccessHttp?.host === \"string\" && rawAgentAccessHttp.host.trim().length > 0\n ? rawAgentAccessHttp.host.trim()\n : \"127.0.0.1\",\n port:\n typeof rawAgentAccessHttp?.port === \"number\"\n ? Math.max(0, Math.floor(rawAgentAccessHttp.port))\n : 4318,\n authToken:\n typeof rawAgentAccessHttp?.authToken === \"string\" && rawAgentAccessHttp.authToken.trim().length > 0\n ? resolveEnvVars(rawAgentAccessHttp.authToken)\n : process.env.OPENCLAW_REMNIC_ACCESS_TOKEN ?? process.env.OPENCLAW_ENGRAM_ACCESS_TOKEN,\n principal:\n typeof rawAgentAccessHttp?.principal === \"string\" && rawAgentAccessHttp.principal.trim().length > 0\n ? resolveEnvVars(rawAgentAccessHttp.principal)\n : process.env.OPENCLAW_ENGRAM_ACCESS_PRINCIPAL?.trim() || undefined,\n maxBodyBytes:\n typeof rawAgentAccessHttp?.maxBodyBytes === \"number\"\n ? Math.max(1, Math.floor(rawAgentAccessHttp.maxBodyBytes))\n : 131072,\n };\n\n let baseUrl: string | undefined;\n if (typeof cfg.openaiBaseUrl === \"string\" && cfg.openaiBaseUrl.length > 0) {\n baseUrl = normalizeOpenaiBaseUrl(resolveEnvVars(cfg.openaiBaseUrl), \"config\");\n } else {\n baseUrl = normalizeOpenaiBaseUrl(process.env.OPENAI_BASE_URL, \"env\");\n }\n\n const sharedCrossSignalSemanticEnabled =\n cfg.sharedCrossSignalSemanticEnabled === true || cfg.crossSignalsSemanticEnabled === true;\n const sharedCrossSignalSemanticTimeoutMs =\n typeof cfg.sharedCrossSignalSemanticTimeoutMs === \"number\"\n ? Math.max(1, Math.floor(cfg.sharedCrossSignalSemanticTimeoutMs))\n : typeof cfg.crossSignalsSemanticTimeoutMs === \"number\"\n ? Math.max(1, Math.floor(cfg.crossSignalsSemanticTimeoutMs))\n : 4000;\n const recallPipelineConfig = buildRecallPipelineConfig(cfg);\n\n return {\n openaiApiKey: apiKey,\n openaiBaseUrl: baseUrl,\n model,\n reasoningEffort,\n triggerMode,\n bufferMaxTurns:\n typeof cfg.bufferMaxTurns === \"number\" ? cfg.bufferMaxTurns : 5,\n bufferMaxMinutes:\n typeof cfg.bufferMaxMinutes === \"number\" ? cfg.bufferMaxMinutes : 15,\n consolidateEveryN:\n typeof cfg.consolidateEveryN === \"number\" ? cfg.consolidateEveryN : 3,\n highSignalPatterns: Array.isArray(cfg.highSignalPatterns)\n ? (cfg.highSignalPatterns as string[])\n : [],\n maxMemoryTokens:\n typeof cfg.maxMemoryTokens === \"number\" ? cfg.maxMemoryTokens : 2000,\n memoryOsPreset,\n qmdEnabled: cfg.qmdEnabled !== false,\n qmdCollection:\n typeof cfg.qmdCollection === \"string\"\n ? cfg.qmdCollection\n // TODO(#403): Keep legacy collection name for backwards compat so existing\n // installs don't lose their QMD vector store data on upgrade. New installs\n // can override via qmdCollection config. Consider migrating in a future PR.\n : \"openclaw-engram\",\n qmdMaxResults:\n typeof cfg.qmdMaxResults === \"number\" ? cfg.qmdMaxResults : 8,\n qmdColdTierEnabled: cfg.qmdColdTierEnabled === true,\n qmdColdCollection:\n typeof cfg.qmdColdCollection === \"string\" && cfg.qmdColdCollection.length > 0\n ? cfg.qmdColdCollection\n // TODO(#403): Keep legacy collection name for backwards compat.\n : \"openclaw-engram-cold\",\n qmdColdMaxResults:\n typeof cfg.qmdColdMaxResults === \"number\" ? cfg.qmdColdMaxResults : 8,\n qmdTierMigrationEnabled: cfg.qmdTierMigrationEnabled === true,\n qmdTierDemotionMinAgeDays:\n typeof cfg.qmdTierDemotionMinAgeDays === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdTierDemotionMinAgeDays))\n : 14,\n qmdTierDemotionValueThreshold:\n typeof cfg.qmdTierDemotionValueThreshold === \"number\"\n ? Math.max(0, Math.min(1, cfg.qmdTierDemotionValueThreshold))\n : 0.35,\n qmdTierPromotionValueThreshold:\n typeof cfg.qmdTierPromotionValueThreshold === \"number\"\n ? Math.max(0, Math.min(1, cfg.qmdTierPromotionValueThreshold))\n : 0.7,\n qmdTierParityGraphEnabled: cfg.qmdTierParityGraphEnabled !== false,\n qmdTierParityHiMemEnabled: cfg.qmdTierParityHiMemEnabled !== false,\n qmdTierAutoBackfillEnabled: cfg.qmdTierAutoBackfillEnabled === true,\n embeddingFallbackEnabled: cfg.embeddingFallbackEnabled !== false,\n embeddingFallbackProvider:\n cfg.embeddingFallbackProvider === \"openai\"\n ? \"openai\"\n : cfg.embeddingFallbackProvider === \"local\"\n ? \"local\"\n : \"auto\",\n qmdPath:\n typeof cfg.qmdPath === \"string\" && cfg.qmdPath.length > 0\n ? cfg.qmdPath\n : undefined,\n memoryDir,\n debug: cfg.debug === true,\n identityEnabled: cfg.identityEnabled !== false,\n identityContinuityEnabled,\n identityInjectionMode,\n identityMaxInjectChars:\n typeof cfg.identityMaxInjectChars === \"number\"\n ? Math.max(0, Math.floor(cfg.identityMaxInjectChars))\n : 1200,\n continuityIncidentLoggingEnabled:\n typeof cfg.continuityIncidentLoggingEnabled === \"boolean\"\n ? cfg.continuityIncidentLoggingEnabled\n : identityContinuityEnabled,\n continuityAuditEnabled: cfg.continuityAuditEnabled === true,\n sessionObserverEnabled: cfg.sessionObserverEnabled === true,\n sessionObserverDebounceMs:\n typeof cfg.sessionObserverDebounceMs === \"number\"\n ? Math.max(0, Math.floor(cfg.sessionObserverDebounceMs))\n : 120_000,\n sessionObserverBands,\n injectQuestions: cfg.injectQuestions === true,\n commitmentDecayDays:\n typeof cfg.commitmentDecayDays === \"number\" ? cfg.commitmentDecayDays : 90,\n workspaceDir:\n typeof cfg.workspaceDir === \"string\" && cfg.workspaceDir.length > 0\n ? cfg.workspaceDir\n : DEFAULT_WORKSPACE_DIR,\n captureMode,\n fileHygiene,\n nativeKnowledge,\n agentAccessHttp,\n // Access tracking (Phase 1A)\n accessTrackingEnabled: cfg.accessTrackingEnabled !== false,\n accessTrackingBufferMaxSize:\n typeof cfg.accessTrackingBufferMaxSize === \"number\"\n ? cfg.accessTrackingBufferMaxSize\n : 100,\n // Retrieval options\n recencyWeight:\n typeof cfg.recencyWeight === \"number\" ? cfg.recencyWeight : 0.2,\n boostAccessCount: cfg.boostAccessCount !== false,\n recordEmptyRecallImpressions: cfg.recordEmptyRecallImpressions === true,\n // v2.2 Advanced Retrieval (safe defaults: off unless enabled)\n queryExpansionEnabled: cfg.queryExpansionEnabled === true,\n queryExpansionMaxQueries:\n typeof cfg.queryExpansionMaxQueries === \"number\"\n ? cfg.queryExpansionMaxQueries\n : 4,\n queryExpansionMinTokenLen:\n typeof cfg.queryExpansionMinTokenLen === \"number\"\n ? cfg.queryExpansionMinTokenLen\n : 3,\n rerankEnabled: cfg.rerankEnabled === true,\n rerankProvider:\n cfg.rerankProvider === \"cloud\" ? \"cloud\" : \"local\",\n rerankMaxCandidates:\n typeof cfg.rerankMaxCandidates === \"number\" ? cfg.rerankMaxCandidates : 20,\n rerankTimeoutMs:\n typeof cfg.rerankTimeoutMs === \"number\" ? cfg.rerankTimeoutMs : 8000,\n rerankCacheEnabled: cfg.rerankCacheEnabled !== false,\n rerankCacheTtlMs:\n typeof cfg.rerankCacheTtlMs === \"number\" ? cfg.rerankCacheTtlMs : 60 * 60 * 1000,\n feedbackEnabled: cfg.feedbackEnabled === true,\n // v2.2 Negative Examples (safe defaults: off unless enabled)\n negativeExamplesEnabled: cfg.negativeExamplesEnabled === true,\n negativeExamplesPenaltyPerHit:\n typeof cfg.negativeExamplesPenaltyPerHit === \"number\"\n ? cfg.negativeExamplesPenaltyPerHit\n : 0.05,\n negativeExamplesPenaltyCap:\n typeof cfg.negativeExamplesPenaltyCap === \"number\"\n ? cfg.negativeExamplesPenaltyCap\n : 0.25,\n // Chunking (Phase 2A)\n chunkingEnabled: cfg.chunkingEnabled === true, // Off by default initially\n chunkingTargetTokens:\n typeof cfg.chunkingTargetTokens === \"number\" ? cfg.chunkingTargetTokens : 200,\n chunkingMinTokens:\n typeof cfg.chunkingMinTokens === \"number\" ? cfg.chunkingMinTokens : 150,\n chunkingOverlapSentences:\n typeof cfg.chunkingOverlapSentences === \"number\" ? cfg.chunkingOverlapSentences : 2,\n // Semantic Chunking (Issue #368)\n semanticChunkingEnabled: cfg.semanticChunkingEnabled === true,\n semanticChunkingConfig: parseSemanticChunkingConfig(cfg.semanticChunkingConfig),\n // Contradiction Detection (Phase 2B)\n contradictionDetectionEnabled: cfg.contradictionDetectionEnabled === true, // Off by default initially\n contradictionSimilarityThreshold:\n typeof cfg.contradictionSimilarityThreshold === \"number\" ? cfg.contradictionSimilarityThreshold : 0.7,\n contradictionMinConfidence:\n typeof cfg.contradictionMinConfidence === \"number\" ? cfg.contradictionMinConfidence : 0.9,\n contradictionAutoResolve: cfg.contradictionAutoResolve !== false,\n // Temporal Supersession (issue #375)\n temporalSupersessionEnabled: cfg.temporalSupersessionEnabled !== false, // On by default\n temporalSupersessionIncludeInRecall:\n cfg.temporalSupersessionIncludeInRecall === true, // Off by default\n // Direct-answer retrieval tier (issue #518)\n recallDirectAnswerEnabled:\n coerceBool(cfg.recallDirectAnswerEnabled) ?? false,\n recallDirectAnswerTokenOverlapFloor: (() => {\n const n = coerceNumber(cfg.recallDirectAnswerTokenOverlapFloor);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.55;\n })(),\n recallDirectAnswerImportanceFloor: (() => {\n const n = coerceNumber(cfg.recallDirectAnswerImportanceFloor);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.7;\n })(),\n recallDirectAnswerAmbiguityMargin: (() => {\n const n = coerceNumber(cfg.recallDirectAnswerAmbiguityMargin);\n return n !== undefined && n >= 0 && n <= 1 ? n : 0.15;\n })(),\n recallDirectAnswerEligibleTaxonomyBuckets: Array.isArray(\n cfg.recallDirectAnswerEligibleTaxonomyBuckets,\n )\n ? (cfg.recallDirectAnswerEligibleTaxonomyBuckets as unknown[]).filter(\n (v): v is string => typeof v === \"string\" && v.length > 0,\n )\n : [\"decisions\", \"principles\", \"conventions\", \"runbooks\", \"entities\"],\n // Memory Linking (Phase 3A)\n memoryLinkingEnabled: cfg.memoryLinkingEnabled === true, // Off by default initially\n // Conversation Threading (Phase 3B)\n threadingEnabled: cfg.threadingEnabled === true, // Off by default initially\n threadingGapMinutes:\n typeof cfg.threadingGapMinutes === \"number\" ? cfg.threadingGapMinutes : 30,\n // Memory Summarization (Phase 4A)\n summarizationEnabled: cfg.summarizationEnabled === true, // Off by default\n summarizationTriggerCount:\n typeof cfg.summarizationTriggerCount === \"number\" ? cfg.summarizationTriggerCount : 1000,\n summarizationRecentToKeep:\n typeof cfg.summarizationRecentToKeep === \"number\" ? cfg.summarizationRecentToKeep : 300,\n summarizationImportanceThreshold:\n typeof cfg.summarizationImportanceThreshold === \"number\" ? cfg.summarizationImportanceThreshold : 0.3,\n summarizationProtectedTags: Array.isArray(cfg.summarizationProtectedTags)\n ? (cfg.summarizationProtectedTags as string[])\n : [\"commitment\", \"preference\", \"decision\", \"principle\"],\n // Topic Extraction (Phase 4B)\n topicExtractionEnabled: cfg.topicExtractionEnabled !== false, // On by default\n topicExtractionTopN:\n typeof cfg.topicExtractionTopN === \"number\" ? cfg.topicExtractionTopN : 50,\n // Transcript & Context Preservation (v2.0)\n // Transcript archive\n transcriptEnabled: cfg.transcriptEnabled !== false, // default: true\n transcriptRetentionDays:\n typeof cfg.transcriptRetentionDays === \"number\" ? cfg.transcriptRetentionDays : 7,\n transcriptSkipChannelTypes: Array.isArray(cfg.transcriptSkipChannelTypes)\n ? (cfg.transcriptSkipChannelTypes as string[])\n : [\"cron\"], // default: skip cron transcripts\n // Transcript injection\n transcriptRecallHours:\n typeof cfg.transcriptRecallHours === \"number\" ? cfg.transcriptRecallHours : 12,\n maxTranscriptTurns:\n typeof cfg.maxTranscriptTurns === \"number\" ? cfg.maxTranscriptTurns : 50,\n maxTranscriptTokens:\n typeof cfg.maxTranscriptTokens === \"number\" ? cfg.maxTranscriptTokens : 1000,\n // Checkpoint\n checkpointEnabled: cfg.checkpointEnabled !== false, // default: true\n checkpointTurns:\n typeof cfg.checkpointTurns === \"number\" ? cfg.checkpointTurns : 15,\n // Compaction reset (opt-in, default: false)\n compactionResetEnabled: cfg.compactionResetEnabled === true,\n beforeResetTimeoutMs:\n typeof cfg.beforeResetTimeoutMs === \"number\"\n ? Math.min(30_000, Math.max(100, Math.floor(cfg.beforeResetTimeoutMs)))\n : 2_000,\n flushOnResetEnabled: cfg.flushOnResetEnabled !== false,\n commandsListEnabled: cfg.commandsListEnabled !== false,\n openclawToolsEnabled: cfg.openclawToolsEnabled !== false,\n openclawToolSnippetMaxChars:\n typeof cfg.openclawToolSnippetMaxChars === \"number\"\n ? Math.min(4_000, Math.max(80, Math.floor(cfg.openclawToolSnippetMaxChars)))\n : 600,\n sessionTogglesEnabled: cfg.sessionTogglesEnabled !== false,\n verboseRecallVisibility: cfg.verboseRecallVisibility !== false,\n recallTranscriptsEnabled: cfg.recallTranscriptsEnabled === true,\n recallTranscriptRetentionDays:\n typeof cfg.recallTranscriptRetentionDays === \"number\"\n ? Math.min(365, Math.max(1, Math.floor(cfg.recallTranscriptRetentionDays)))\n : 30,\n respectBundledActiveMemoryToggle:\n cfg.respectBundledActiveMemoryToggle !== false,\n activeRecallEnabled: cfg.activeRecallEnabled === true,\n activeRecallAgents:\n Array.isArray(cfg.activeRecallAgents) && cfg.activeRecallAgents.length > 0\n ? cfg.activeRecallAgents\n .filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n .map((value) => value.trim())\n : null,\n activeRecallAllowedChatTypes:\n Array.isArray(cfg.activeRecallAllowedChatTypes) &&\n cfg.activeRecallAllowedChatTypes.length > 0\n ? cfg.activeRecallAllowedChatTypes.filter(\n (value): value is \"direct\" | \"group\" | \"channel\" =>\n value === \"direct\" || value === \"group\" || value === \"channel\",\n )\n : [\"direct\", \"group\", \"channel\"],\n activeRecallQueryMode:\n cfg.activeRecallQueryMode === \"message\" ||\n cfg.activeRecallQueryMode === \"full\"\n ? cfg.activeRecallQueryMode\n : \"recent\",\n activeRecallPromptStyle:\n cfg.activeRecallPromptStyle === \"strict\" ||\n cfg.activeRecallPromptStyle === \"contextual\" ||\n cfg.activeRecallPromptStyle === \"recall-heavy\" ||\n cfg.activeRecallPromptStyle === \"precision-heavy\" ||\n cfg.activeRecallPromptStyle === \"preference-only\"\n ? cfg.activeRecallPromptStyle\n : \"balanced\",\n activeRecallPromptOverride:\n typeof cfg.activeRecallPromptOverride === \"string\" &&\n cfg.activeRecallPromptOverride.trim().length > 0\n ? cfg.activeRecallPromptOverride.trim()\n : null,\n activeRecallPromptAppend:\n typeof cfg.activeRecallPromptAppend === \"string\" &&\n cfg.activeRecallPromptAppend.trim().length > 0\n ? cfg.activeRecallPromptAppend.trim()\n : null,\n activeRecallMaxSummaryChars:\n typeof cfg.activeRecallMaxSummaryChars === \"number\"\n ? Math.min(1000, Math.max(40, Math.floor(cfg.activeRecallMaxSummaryChars)))\n : 220,\n activeRecallRecentUserTurns:\n typeof cfg.activeRecallRecentUserTurns === \"number\"\n ? Math.min(4, Math.max(0, Math.floor(cfg.activeRecallRecentUserTurns)))\n : 2,\n activeRecallRecentAssistantTurns:\n typeof cfg.activeRecallRecentAssistantTurns === \"number\"\n ? Math.min(3, Math.max(0, Math.floor(cfg.activeRecallRecentAssistantTurns)))\n : 1,\n activeRecallRecentUserChars:\n typeof cfg.activeRecallRecentUserChars === \"number\"\n ? Math.min(1000, Math.max(40, Math.floor(cfg.activeRecallRecentUserChars)))\n : 600,\n activeRecallRecentAssistantChars:\n typeof cfg.activeRecallRecentAssistantChars === \"number\"\n ? Math.min(1000, Math.max(40, Math.floor(cfg.activeRecallRecentAssistantChars)))\n : 400,\n activeRecallThinking:\n cfg.activeRecallThinking === \"low\" ||\n cfg.activeRecallThinking === \"off\" ||\n cfg.activeRecallThinking === \"minimal\" ||\n cfg.activeRecallThinking === \"medium\" ||\n cfg.activeRecallThinking === \"high\" ||\n cfg.activeRecallThinking === \"xhigh\" ||\n cfg.activeRecallThinking === \"adaptive\"\n ? cfg.activeRecallThinking\n : \"low\",\n activeRecallTimeoutMs:\n typeof cfg.activeRecallTimeoutMs === \"number\"\n ? Math.max(250, Math.floor(cfg.activeRecallTimeoutMs))\n : 15_000,\n activeRecallCacheTtlMs:\n typeof cfg.activeRecallCacheTtlMs === \"number\"\n ? cfg.activeRecallCacheTtlMs === 0\n ? 0\n : cfg.activeRecallCacheTtlMs < 0\n ? 15_000\n : Math.min(\n 120_000,\n Math.max(1, Math.floor(cfg.activeRecallCacheTtlMs)),\n )\n : 15_000,\n activeRecallModel:\n typeof cfg.activeRecallModel === \"string\" && cfg.activeRecallModel.trim().length > 0\n ? cfg.activeRecallModel.trim()\n : null,\n activeRecallModelFallbackPolicy:\n cfg.activeRecallModelFallbackPolicy === \"resolved-only\"\n ? \"resolved-only\"\n : \"default-remote\",\n activeRecallPersistTranscripts: cfg.activeRecallPersistTranscripts === true,\n activeRecallTranscriptDir:\n typeof cfg.activeRecallTranscriptDir === \"string\" &&\n cfg.activeRecallTranscriptDir.trim().length > 0\n ? cfg.activeRecallTranscriptDir.trim()\n : \"active-recall\",\n activeRecallEntityGraphDepth:\n typeof cfg.activeRecallEntityGraphDepth === \"number\"\n ? Math.min(3, Math.max(0, Math.floor(cfg.activeRecallEntityGraphDepth)))\n : 1,\n activeRecallIncludeCausalTrajectories:\n cfg.activeRecallIncludeCausalTrajectories === true,\n activeRecallIncludeDaySummary: cfg.activeRecallIncludeDaySummary === true,\n activeRecallAttachRecallExplain: cfg.activeRecallAttachRecallExplain === true,\n activeRecallAllowChainedActiveMemory:\n cfg.activeRecallAllowChainedActiveMemory === true,\n dreaming,\n procedural,\n heartbeat,\n slotBehavior,\n codexCompat,\n // Hourly summaries\n hourlySummariesEnabled: cfg.hourlySummariesEnabled !== false, // default: true\n daySummaryEnabled: cfg.daySummaryEnabled !== false, // default: true\n hourlySummaryCronAutoRegister: cfg.hourlySummaryCronAutoRegister === true,\n nightlyGovernanceCronAutoRegister: cfg.nightlyGovernanceCronAutoRegister === true,\n summaryRecallHours:\n typeof cfg.summaryRecallHours === \"number\" ? cfg.summaryRecallHours : 24,\n maxSummaryCount:\n typeof cfg.maxSummaryCount === \"number\" ? cfg.maxSummaryCount : 6,\n summaryModel:\n typeof cfg.summaryModel === \"string\" && cfg.summaryModel.length > 0\n ? cfg.summaryModel\n : model, // default: same as extraction model\n // v2.4 Extended hourly summaries (default off)\n hourlySummariesExtendedEnabled: cfg.hourlySummariesExtendedEnabled === true,\n hourlySummariesIncludeToolStats: cfg.hourlySummariesIncludeToolStats === true,\n hourlySummariesIncludeSystemMessages: cfg.hourlySummariesIncludeSystemMessages === true,\n hourlySummariesMaxTurnsPerRun:\n typeof cfg.hourlySummariesMaxTurnsPerRun === \"number\" ? cfg.hourlySummariesMaxTurnsPerRun : 200,\n // v2.4 Conversation index (default off)\n conversationIndexEnabled: cfg.conversationIndexEnabled === true,\n conversationIndexBackend: cfg.conversationIndexBackend === \"faiss\" ? \"faiss\" : \"qmd\",\n conversationIndexQmdCollection:\n typeof cfg.conversationIndexQmdCollection === \"string\" && cfg.conversationIndexQmdCollection.length > 0\n ? cfg.conversationIndexQmdCollection\n // TODO(#403): Keep legacy collection name for backwards compat.\n : \"openclaw-engram-conversations\",\n conversationIndexRetentionDays:\n typeof cfg.conversationIndexRetentionDays === \"number\" ? cfg.conversationIndexRetentionDays : 30,\n conversationIndexMinUpdateIntervalMs:\n typeof cfg.conversationIndexMinUpdateIntervalMs === \"number\"\n ? cfg.conversationIndexMinUpdateIntervalMs\n : 15 * 60_000,\n conversationIndexEmbedOnUpdate: cfg.conversationIndexEmbedOnUpdate === true,\n conversationIndexFaissScriptPath:\n typeof cfg.conversationIndexFaissScriptPath === \"string\" && cfg.conversationIndexFaissScriptPath.trim().length > 0\n ? cfg.conversationIndexFaissScriptPath.trim()\n : undefined,\n conversationIndexFaissPythonBin:\n typeof cfg.conversationIndexFaissPythonBin === \"string\" && cfg.conversationIndexFaissPythonBin.trim().length > 0\n ? cfg.conversationIndexFaissPythonBin.trim()\n : undefined,\n conversationIndexFaissModelId:\n typeof cfg.conversationIndexFaissModelId === \"string\" && cfg.conversationIndexFaissModelId.trim().length > 0\n ? cfg.conversationIndexFaissModelId.trim()\n : \"text-embedding-3-small\",\n conversationIndexFaissIndexDir:\n typeof cfg.conversationIndexFaissIndexDir === \"string\" && cfg.conversationIndexFaissIndexDir.trim().length > 0\n ? cfg.conversationIndexFaissIndexDir.trim()\n : \"state/conversation-index/faiss\",\n conversationIndexFaissUpsertTimeoutMs:\n typeof cfg.conversationIndexFaissUpsertTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissUpsertTimeoutMs))\n : 30_000,\n conversationIndexFaissSearchTimeoutMs:\n typeof cfg.conversationIndexFaissSearchTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissSearchTimeoutMs))\n : 5_000,\n conversationIndexFaissHealthTimeoutMs:\n typeof cfg.conversationIndexFaissHealthTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissHealthTimeoutMs))\n : 2_000,\n conversationIndexFaissMaxBatchSize:\n typeof cfg.conversationIndexFaissMaxBatchSize === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissMaxBatchSize))\n : 512,\n conversationIndexFaissMaxSearchK:\n typeof cfg.conversationIndexFaissMaxSearchK === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationIndexFaissMaxSearchK))\n : 50,\n conversationRecallTopK:\n typeof cfg.conversationRecallTopK === \"number\" ? cfg.conversationRecallTopK : 3,\n conversationRecallMaxChars:\n typeof cfg.conversationRecallMaxChars === \"number\" ? cfg.conversationRecallMaxChars : 2500,\n conversationRecallTimeoutMs:\n typeof cfg.conversationRecallTimeoutMs === \"number\" ? cfg.conversationRecallTimeoutMs : 800,\n evalHarnessEnabled: cfg.evalHarnessEnabled === true,\n evalShadowModeEnabled: cfg.evalShadowModeEnabled === true,\n benchmarkBaselineSnapshotsEnabled: cfg.benchmarkBaselineSnapshotsEnabled === true,\n benchmarkDeltaReporterEnabled: cfg.benchmarkDeltaReporterEnabled === true,\n benchmarkStoredBaselineEnabled: cfg.benchmarkStoredBaselineEnabled === true,\n evalStoreDir:\n typeof cfg.evalStoreDir === \"string\" && cfg.evalStoreDir.trim().length > 0\n ? cfg.evalStoreDir.trim()\n : path.join(memoryDir, \"state\", \"evals\"),\n objectiveStateMemoryEnabled: cfg.objectiveStateMemoryEnabled === true,\n objectiveStateSnapshotWritesEnabled: cfg.objectiveStateSnapshotWritesEnabled === true,\n objectiveStateRecallEnabled: cfg.objectiveStateRecallEnabled === true,\n objectiveStateStoreDir:\n typeof cfg.objectiveStateStoreDir === \"string\" && cfg.objectiveStateStoreDir.trim().length > 0\n ? cfg.objectiveStateStoreDir.trim()\n : path.join(memoryDir, \"state\", \"objective-state\"),\n causalTrajectoryMemoryEnabled: cfg.causalTrajectoryMemoryEnabled === true,\n causalTrajectoryStoreDir:\n typeof cfg.causalTrajectoryStoreDir === \"string\" && cfg.causalTrajectoryStoreDir.trim().length > 0\n ? cfg.causalTrajectoryStoreDir.trim()\n : path.join(memoryDir, \"state\", \"causal-trajectories\"),\n causalTrajectoryRecallEnabled: cfg.causalTrajectoryRecallEnabled === true,\n actionGraphRecallEnabled: cfg.actionGraphRecallEnabled === true,\n trustZonesEnabled: cfg.trustZonesEnabled === true,\n quarantinePromotionEnabled: cfg.quarantinePromotionEnabled === true,\n trustZoneStoreDir:\n typeof cfg.trustZoneStoreDir === \"string\" && cfg.trustZoneStoreDir.trim().length > 0\n ? cfg.trustZoneStoreDir.trim()\n : path.join(memoryDir, \"state\", \"trust-zones\"),\n trustZoneRecallEnabled: cfg.trustZoneRecallEnabled === true,\n memoryPoisoningDefenseEnabled: cfg.memoryPoisoningDefenseEnabled === true,\n memoryRedTeamBenchEnabled: cfg.memoryRedTeamBenchEnabled === true,\n harmonicRetrievalEnabled: cfg.harmonicRetrievalEnabled === true,\n abstractionAnchorsEnabled: cfg.abstractionAnchorsEnabled === true,\n verifiedRecallEnabled: cfg.verifiedRecallEnabled === true,\n semanticRulePromotionEnabled: cfg.semanticRulePromotionEnabled === true,\n semanticRuleVerificationEnabled: cfg.semanticRuleVerificationEnabled === true,\n semanticConsolidationEnabled: cfg.semanticConsolidationEnabled === true,\n semanticConsolidationModel:\n typeof cfg.semanticConsolidationModel === \"string\" && cfg.semanticConsolidationModel.length > 0\n ? cfg.semanticConsolidationModel\n : \"auto\",\n semanticConsolidationThreshold:\n typeof cfg.semanticConsolidationThreshold === \"number\" ? cfg.semanticConsolidationThreshold : 0.8,\n semanticConsolidationMinClusterSize:\n typeof cfg.semanticConsolidationMinClusterSize === \"number\"\n ? Math.max(2, Math.floor(cfg.semanticConsolidationMinClusterSize))\n : 3,\n semanticConsolidationExcludeCategories: Array.isArray(cfg.semanticConsolidationExcludeCategories)\n ? (cfg.semanticConsolidationExcludeCategories as unknown[]).filter(\n (c): c is string => typeof c === \"string\" && c.length > 0,\n )\n : [\"correction\", \"commitment\", \"procedure\"],\n semanticConsolidationIntervalHours:\n typeof cfg.semanticConsolidationIntervalHours === \"number\"\n ? Math.max(1, Math.floor(cfg.semanticConsolidationIntervalHours))\n : 168,\n semanticConsolidationMaxPerRun:\n typeof cfg.semanticConsolidationMaxPerRun === \"number\"\n ? Math.max(0, Math.floor(cfg.semanticConsolidationMaxPerRun))\n : 100,\n creationMemoryEnabled: cfg.creationMemoryEnabled === true,\n memoryUtilityLearningEnabled: cfg.memoryUtilityLearningEnabled === true,\n promotionByOutcomeEnabled: cfg.promotionByOutcomeEnabled === true,\n commitmentLedgerEnabled: cfg.commitmentLedgerEnabled === true,\n commitmentLifecycleEnabled: cfg.commitmentLifecycleEnabled === true,\n commitmentStaleDays:\n typeof cfg.commitmentStaleDays === \"number\" ? cfg.commitmentStaleDays : 14,\n commitmentLedgerDir:\n typeof cfg.commitmentLedgerDir === \"string\" && cfg.commitmentLedgerDir.trim().length > 0\n ? cfg.commitmentLedgerDir.trim()\n : path.join(memoryDir, \"state\", \"commitment-ledger\"),\n resumeBundlesEnabled: cfg.resumeBundlesEnabled === true,\n resumeBundleDir:\n typeof cfg.resumeBundleDir === \"string\" && cfg.resumeBundleDir.trim().length > 0\n ? cfg.resumeBundleDir.trim()\n : path.join(memoryDir, \"state\", \"resume-bundles\"),\n workProductRecallEnabled: cfg.workProductRecallEnabled === true,\n workTasksEnabled: cfg.workTasksEnabled === true,\n workProjectsEnabled: cfg.workProjectsEnabled === true,\n workTasksDir:\n typeof cfg.workTasksDir === \"string\" && cfg.workTasksDir.trim().length > 0\n ? cfg.workTasksDir.trim()\n : path.join(memoryDir, \"work\", \"tasks\"),\n workProjectsDir:\n typeof cfg.workProjectsDir === \"string\" && cfg.workProjectsDir.trim().length > 0\n ? cfg.workProjectsDir.trim()\n : path.join(memoryDir, \"work\", \"projects\"),\n workIndexEnabled: cfg.workIndexEnabled === true,\n workIndexDir:\n typeof cfg.workIndexDir === \"string\" && cfg.workIndexDir.trim().length > 0\n ? cfg.workIndexDir.trim()\n : path.join(memoryDir, \"work\", \"index\"),\n workTaskIndexEnabled: cfg.workTaskIndexEnabled === true,\n workProjectIndexEnabled: cfg.workProjectIndexEnabled === true,\n workIndexAutoRebuildEnabled: cfg.workIndexAutoRebuildEnabled === true,\n workIndexAutoRebuildDebounceMs:\n typeof cfg.workIndexAutoRebuildDebounceMs === \"number\" ? cfg.workIndexAutoRebuildDebounceMs : 1000,\n workProductLedgerDir:\n typeof cfg.workProductLedgerDir === \"string\" && cfg.workProductLedgerDir.trim().length > 0\n ? cfg.workProductLedgerDir.trim()\n : path.join(memoryDir, \"state\", \"work-product-ledger\"),\n abstractionNodeStoreDir:\n typeof cfg.abstractionNodeStoreDir === \"string\" && cfg.abstractionNodeStoreDir.trim().length > 0\n ? cfg.abstractionNodeStoreDir.trim()\n : path.join(memoryDir, \"state\", \"abstraction-nodes\"),\n // Local LLM Provider (v2.1)\n localLlmEnabled: cfg.localLlmEnabled === true || cfg.localLlmEnabled === \"true\", // default: false\n localLlmUrl:\n typeof cfg.localLlmUrl === \"string\" && cfg.localLlmUrl.length > 0\n ? cfg.localLlmUrl\n : \"http://localhost:1234/v1\",\n localLlmModel:\n typeof cfg.localLlmModel === \"string\" && cfg.localLlmModel.length > 0\n ? cfg.localLlmModel\n : \"local-model\",\n localLlmApiKey:\n typeof cfg.localLlmApiKey === \"string\" && cfg.localLlmApiKey.length > 0\n ? resolveEnvVars(cfg.localLlmApiKey)\n : undefined,\n localLlmHeaders:\n cfg.localLlmHeaders && typeof cfg.localLlmHeaders === \"object\" && !Array.isArray(cfg.localLlmHeaders)\n ? Object.fromEntries(\n Object.entries(cfg.localLlmHeaders as Record<string, unknown>)\n .filter(([, value]) => typeof value === \"string\")\n .map(([key, value]) => [key, String(value)]),\n )\n : undefined,\n localLlmAuthHeader: cfg.localLlmAuthHeader !== false,\n localLlmFallback: cfg.localLlmFallback !== false, // default: true\n localLlmHomeDir:\n typeof cfg.localLlmHomeDir === \"string\" && cfg.localLlmHomeDir.length > 0\n ? cfg.localLlmHomeDir\n : undefined,\n localLmsCliPath:\n typeof cfg.localLmsCliPath === \"string\" && cfg.localLmsCliPath.length > 0\n ? cfg.localLmsCliPath\n : undefined,\n localLmsBinDir:\n typeof cfg.localLmsBinDir === \"string\" && cfg.localLmsBinDir.length > 0\n ? cfg.localLmsBinDir\n : undefined,\n localLlmTimeoutMs:\n typeof cfg.localLlmTimeoutMs === \"number\" ? cfg.localLlmTimeoutMs : 180_000,\n localLlmMaxContext:\n typeof cfg.localLlmMaxContext === \"number\" ? cfg.localLlmMaxContext : undefined,\n // Observability (disabled by default to avoid log spam)\n slowLogEnabled: cfg.slowLogEnabled === true,\n slowLogThresholdMs:\n typeof cfg.slowLogThresholdMs === \"number\" ? cfg.slowLogThresholdMs : 30_000,\n // Trace recall content — disabled by default; enable to send recalled memory text to trace subscribers\n traceRecallContent: cfg.traceRecallContent === true,\n // Performance profiling (opt-in, disabled by default)\n profilingEnabled: cfg.profilingEnabled === true,\n profilingStorageDir:\n typeof cfg.profilingStorageDir === \"string\" && cfg.profilingStorageDir.length > 0\n ? cfg.profilingStorageDir\n : path.join(memoryDir, \"profiling\"),\n profilingMaxTraces:\n typeof cfg.profilingMaxTraces === \"number\" && Number.isFinite(cfg.profilingMaxTraces)\n ? Math.max(0, cfg.profilingMaxTraces)\n : 100,\n // Extraction stability guards (P0/P1)\n extractionDedupeEnabled: cfg.extractionDedupeEnabled !== false,\n extractionDedupeWindowMs:\n typeof cfg.extractionDedupeWindowMs === \"number\" ? cfg.extractionDedupeWindowMs : 5 * 60_000,\n extractionMinChars:\n typeof cfg.extractionMinChars === \"number\" ? cfg.extractionMinChars : 40,\n extractionMinUserTurns:\n typeof cfg.extractionMinUserTurns === \"number\" ? cfg.extractionMinUserTurns : 1,\n extractionMaxTurnChars:\n typeof cfg.extractionMaxTurnChars === \"number\" ? cfg.extractionMaxTurnChars : 4000,\n extractionMaxFactsPerRun:\n typeof cfg.extractionMaxFactsPerRun === \"number\" ? cfg.extractionMaxFactsPerRun : 12,\n extractionMaxEntitiesPerRun:\n typeof cfg.extractionMaxEntitiesPerRun === \"number\" ? cfg.extractionMaxEntitiesPerRun : 6,\n extractionMaxQuestionsPerRun:\n typeof cfg.extractionMaxQuestionsPerRun === \"number\" ? cfg.extractionMaxQuestionsPerRun : 3,\n extractionMaxProfileUpdatesPerRun:\n typeof cfg.extractionMaxProfileUpdatesPerRun === \"number\" ? cfg.extractionMaxProfileUpdatesPerRun : 4,\n // Importance write-gate for trivial extracted content (issue #372).\n // Default \"low\" drops only \"trivial\" facts (greetings, single-word replies,\n // heartbeat pings); set to \"normal\" or higher to make the gate stricter.\n extractionMinImportanceLevel: ((): PluginConfig[\"extractionMinImportanceLevel\"] => {\n const raw = cfg.extractionMinImportanceLevel;\n if (\n raw === \"trivial\" ||\n raw === \"low\" ||\n raw === \"normal\" ||\n raw === \"high\" ||\n raw === \"critical\"\n ) {\n return raw;\n }\n return \"low\";\n })(),\n // Extraction judge (issue #376). Opt-in LLM-as-judge fact-worthiness gate.\n extractionJudgeEnabled: cfg.extractionJudgeEnabled === true,\n extractionJudgeModel:\n typeof cfg.extractionJudgeModel === \"string\" ? cfg.extractionJudgeModel : \"\",\n extractionJudgeBatchSize:\n typeof cfg.extractionJudgeBatchSize === \"number\" && Number.isFinite(cfg.extractionJudgeBatchSize)\n ? Math.max(1, Math.round(cfg.extractionJudgeBatchSize))\n : 20,\n extractionJudgeShadow: cfg.extractionJudgeShadow === true,\n // Inline source attribution (issue #369). Opt-in to preserve\n // backwards compatibility with existing downstream consumers.\n inlineSourceAttributionEnabled: cfg.inlineSourceAttributionEnabled === true,\n inlineSourceAttributionFormat:\n typeof cfg.inlineSourceAttributionFormat === \"string\" &&\n cfg.inlineSourceAttributionFormat.trim().length > 0\n ? cfg.inlineSourceAttributionFormat\n : \"[Source: agent={agent}, session={sessionId}, ts={ts}]\",\n consolidationRequireNonZeroExtraction: cfg.consolidationRequireNonZeroExtraction !== false,\n consolidationMinIntervalMs:\n typeof cfg.consolidationMinIntervalMs === \"number\" ? cfg.consolidationMinIntervalMs : 10 * 60_000,\n // QMD maintenance (debounced singleflight)\n qmdMaintenanceEnabled: cfg.qmdMaintenanceEnabled !== false,\n qmdMaintenanceDebounceMs:\n typeof cfg.qmdMaintenanceDebounceMs === \"number\" ? cfg.qmdMaintenanceDebounceMs : 30_000,\n qmdAutoEmbedEnabled: cfg.qmdAutoEmbedEnabled === true,\n qmdEmbedMinIntervalMs:\n typeof cfg.qmdEmbedMinIntervalMs === \"number\" ? cfg.qmdEmbedMinIntervalMs : 60 * 60_000,\n qmdUpdateTimeoutMs:\n typeof cfg.qmdUpdateTimeoutMs === \"number\" ? cfg.qmdUpdateTimeoutMs : 90_000,\n qmdUpdateMinIntervalMs:\n typeof cfg.qmdUpdateMinIntervalMs === \"number\" ? cfg.qmdUpdateMinIntervalMs : 15 * 60_000,\n // Local LLM resilience\n localLlmRetry5xxCount:\n typeof cfg.localLlmRetry5xxCount === \"number\" ? cfg.localLlmRetry5xxCount : 1,\n localLlmRetryBackoffMs:\n typeof cfg.localLlmRetryBackoffMs === \"number\" ? cfg.localLlmRetryBackoffMs : 400,\n localLlm400TripThreshold:\n typeof cfg.localLlm400TripThreshold === \"number\" ? cfg.localLlm400TripThreshold : 5,\n localLlm400CooldownMs:\n typeof cfg.localLlm400CooldownMs === \"number\" ? cfg.localLlm400CooldownMs : 120_000,\n // Local LLM fast tier (v9.1)\n localLlmFastEnabled: cfg.localLlmFastEnabled === true,\n localLlmFastModel:\n typeof cfg.localLlmFastModel === \"string\" && cfg.localLlmFastModel.length > 0\n ? cfg.localLlmFastModel\n : \"\",\n localLlmFastUrl:\n typeof cfg.localLlmFastUrl === \"string\" && cfg.localLlmFastUrl.length > 0\n ? cfg.localLlmFastUrl\n : typeof cfg.localLlmUrl === \"string\" && cfg.localLlmUrl.length > 0\n ? cfg.localLlmUrl\n : \"http://localhost:1234/v1\",\n localLlmFastTimeoutMs:\n typeof cfg.localLlmFastTimeoutMs === \"number\" ? cfg.localLlmFastTimeoutMs : 15_000,\n // Gateway config (passed from index.ts for fallback AI)\n gatewayConfig: cfg.gatewayConfig as PluginConfig[\"gatewayConfig\"],\n // Gateway model source (v9.2) — route LLM calls through gateway agent model chain\n modelSource:\n cfg.modelSource === \"gateway\" ? \"gateway\" : \"plugin\",\n gatewayAgentId:\n typeof cfg.gatewayAgentId === \"string\" && cfg.gatewayAgentId.length > 0\n ? cfg.gatewayAgentId\n : \"\",\n fastGatewayAgentId:\n typeof cfg.fastGatewayAgentId === \"string\" && cfg.fastGatewayAgentId.length > 0\n ? cfg.fastGatewayAgentId\n : \"\",\n\n // v3.0 namespaces (default off)\n namespacesEnabled: cfg.namespacesEnabled === true,\n defaultNamespace:\n typeof cfg.defaultNamespace === \"string\" && cfg.defaultNamespace.length > 0 ? cfg.defaultNamespace : \"default\",\n sharedNamespace:\n typeof cfg.sharedNamespace === \"string\" && cfg.sharedNamespace.length > 0 ? cfg.sharedNamespace : \"shared\",\n principalFromSessionKeyMode:\n cfg.principalFromSessionKeyMode === \"prefix\"\n ? \"prefix\"\n : cfg.principalFromSessionKeyMode === \"regex\"\n ? \"regex\"\n : \"map\",\n principalFromSessionKeyRules: principalRules,\n namespacePolicies: Array.isArray(cfg.namespacePolicies)\n ? (cfg.namespacePolicies as any[]).map((p) => ({\n name: typeof p?.name === \"string\" ? p.name : \"\",\n readPrincipals: Array.isArray(p?.readPrincipals) ? p.readPrincipals.filter((x: any) => typeof x === \"string\") : [],\n writePrincipals: Array.isArray(p?.writePrincipals) ? p.writePrincipals.filter((x: any) => typeof x === \"string\") : [],\n includeInRecallByDefault: p?.includeInRecallByDefault === true,\n })).filter((p) => p.name.length > 0)\n : [],\n defaultRecallNamespaces: Array.isArray(cfg.defaultRecallNamespaces) ? [\"self\", \"shared\"].filter((x) => (cfg.defaultRecallNamespaces as any[]).includes(x)) as any : [\"self\", \"shared\"],\n cronRecallMode:\n cfg.cronRecallMode === \"none\"\n ? \"none\"\n : cfg.cronRecallMode === \"allowlist\"\n ? \"allowlist\"\n : \"all\",\n cronRecallAllowlist: Array.isArray(cfg.cronRecallAllowlist)\n ? (cfg.cronRecallAllowlist as unknown[]).filter((v): v is string => typeof v === \"string\" && v.length > 0)\n : [],\n cronRecallPolicyEnabled: cfg.cronRecallPolicyEnabled !== false,\n cronRecallNormalizedQueryMaxChars:\n typeof cfg.cronRecallNormalizedQueryMaxChars === \"number\"\n ? cfg.cronRecallNormalizedQueryMaxChars\n : 480,\n cronRecallInstructionHeavyTokenCap:\n typeof cfg.cronRecallInstructionHeavyTokenCap === \"number\"\n ? cfg.cronRecallInstructionHeavyTokenCap\n : 36,\n cronConversationRecallMode:\n cfg.cronConversationRecallMode === \"always\"\n ? \"always\"\n : cfg.cronConversationRecallMode === \"never\"\n ? \"never\"\n : \"auto\",\n autoPromoteToSharedEnabled: cfg.autoPromoteToSharedEnabled === true,\n autoPromoteToSharedCategories: Array.isArray(cfg.autoPromoteToSharedCategories)\n ? (cfg.autoPromoteToSharedCategories as any[]).filter((c) => c === \"fact\" || c === \"correction\" || c === \"decision\" || c === \"preference\")\n : [\"fact\", \"correction\", \"decision\", \"preference\"],\n autoPromoteMinConfidenceTier:\n cfg.autoPromoteMinConfidenceTier === \"explicit\"\n ? \"explicit\"\n : cfg.autoPromoteMinConfidenceTier === \"implied\"\n ? \"implied\"\n : \"explicit\",\n routingRulesEnabled: cfg.routingRulesEnabled === true,\n routingRulesStateFile:\n typeof cfg.routingRulesStateFile === \"string\" && cfg.routingRulesStateFile.trim().length > 0\n ? cfg.routingRulesStateFile.trim()\n : \"state/routing-rules.json\",\n\n // v4.0 shared-context (default off)\n sharedContextEnabled: cfg.sharedContextEnabled === true,\n sharedContextDir:\n typeof cfg.sharedContextDir === \"string\" && cfg.sharedContextDir.length > 0 ? cfg.sharedContextDir : undefined,\n sharedContextMaxInjectChars:\n typeof cfg.sharedContextMaxInjectChars === \"number\" ? cfg.sharedContextMaxInjectChars : 4000,\n sharedCrossSignalSemanticEnabled,\n sharedCrossSignalSemanticTimeoutMs,\n sharedCrossSignalSemanticMaxCandidates:\n typeof cfg.sharedCrossSignalSemanticMaxCandidates === \"number\"\n ? Math.max(0, Math.floor(cfg.sharedCrossSignalSemanticMaxCandidates))\n : 120,\n // Backward-compatible aliases.\n crossSignalsSemanticEnabled: sharedCrossSignalSemanticEnabled,\n crossSignalsSemanticTimeoutMs: sharedCrossSignalSemanticTimeoutMs,\n\n // v5.0 compounding (default off)\n compoundingEnabled: cfg.compoundingEnabled === true,\n compoundingWeeklyCronEnabled: cfg.compoundingWeeklyCronEnabled === true,\n compoundingSemanticEnabled: cfg.compoundingSemanticEnabled === true,\n compoundingSynthesisTimeoutMs:\n typeof cfg.compoundingSynthesisTimeoutMs === \"number\" ? cfg.compoundingSynthesisTimeoutMs : 15_000,\n compoundingInjectEnabled: cfg.compoundingInjectEnabled !== false,\n\n // IRC (Inductive Rule Consolidation) — preference synthesis\n ircEnabled: cfg.ircEnabled !== false,\n ircMaxPreferences: typeof cfg.ircMaxPreferences === \"number\" ? cfg.ircMaxPreferences : 20,\n ircIncludeCorrections: cfg.ircIncludeCorrections !== false,\n ircMinConfidence: typeof cfg.ircMinConfidence === \"number\" ? cfg.ircMinConfidence : 0.3,\n\n // CMC (Causal Memory Consolidation) — cross-session causal reasoning\n cmcEnabled: cfg.cmcEnabled === true,\n cmcStitchLookbackDays: typeof cfg.cmcStitchLookbackDays === \"number\" ? cfg.cmcStitchLookbackDays : 7,\n cmcStitchMinScore: typeof cfg.cmcStitchMinScore === \"number\" ? cfg.cmcStitchMinScore : 2.5,\n cmcStitchMaxEdgesPerTrajectory: typeof cfg.cmcStitchMaxEdgesPerTrajectory === \"number\" ? cfg.cmcStitchMaxEdgesPerTrajectory : 3,\n cmcConsolidationEnabled: cfg.cmcConsolidationEnabled === true,\n cmcConsolidationMinRecurrence: typeof cfg.cmcConsolidationMinRecurrence === \"number\" ? cfg.cmcConsolidationMinRecurrence : 3,\n cmcConsolidationMinSessions: typeof cfg.cmcConsolidationMinSessions === \"number\" ? cfg.cmcConsolidationMinSessions : 2,\n cmcConsolidationSuccessThreshold: typeof cfg.cmcConsolidationSuccessThreshold === \"number\" ? cfg.cmcConsolidationSuccessThreshold : 0.7,\n cmcRetrievalEnabled: cfg.cmcRetrievalEnabled === true,\n cmcRetrievalMaxDepth: typeof cfg.cmcRetrievalMaxDepth === \"number\" ? cfg.cmcRetrievalMaxDepth : 3,\n cmcRetrievalMaxChars: typeof cfg.cmcRetrievalMaxChars === \"number\" ? cfg.cmcRetrievalMaxChars : 800,\n cmcRetrievalCounterfactualBoost: typeof cfg.cmcRetrievalCounterfactualBoost === \"number\" ? cfg.cmcRetrievalCounterfactualBoost : 0.4,\n cmcBehaviorLearningEnabled: cfg.cmcBehaviorLearningEnabled === true,\n cmcBehaviorMinFrequency: typeof cfg.cmcBehaviorMinFrequency === \"number\" ? cfg.cmcBehaviorMinFrequency : 3,\n cmcBehaviorMinSessions: typeof cfg.cmcBehaviorMinSessions === \"number\" ? cfg.cmcBehaviorMinSessions : 2,\n cmcBehaviorConfidenceThreshold: typeof cfg.cmcBehaviorConfidenceThreshold === \"number\" ? cfg.cmcBehaviorConfidenceThreshold : 0.6,\n cmcLifecycleCausalImpactWeight: typeof cfg.cmcLifecycleCausalImpactWeight === \"number\" ? cfg.cmcLifecycleCausalImpactWeight : 0.05,\n\n // PEDC (Prediction-Error-Driven Calibration) — model-user alignment\n calibrationEnabled: cfg.calibrationEnabled === true,\n calibrationMaxRulesPerRecall: typeof cfg.calibrationMaxRulesPerRecall === \"number\" ? cfg.calibrationMaxRulesPerRecall : 10,\n calibrationMaxChars: typeof cfg.calibrationMaxChars === \"number\" ? cfg.calibrationMaxChars : 1200,\n\n // v7.0 Knowledge Graph Enhancement\n knowledgeIndexEnabled: cfg.knowledgeIndexEnabled !== false,\n knowledgeIndexMaxEntities:\n typeof cfg.knowledgeIndexMaxEntities === \"number\" ? cfg.knowledgeIndexMaxEntities : 40,\n knowledgeIndexMaxChars:\n typeof cfg.knowledgeIndexMaxChars === \"number\" ? cfg.knowledgeIndexMaxChars : 4000,\n entityRetrievalEnabled: cfg.entityRetrievalEnabled !== false,\n entityRetrievalMaxChars:\n typeof cfg.entityRetrievalMaxChars === \"number\" ? cfg.entityRetrievalMaxChars : 2400,\n entityRetrievalMaxHints:\n typeof cfg.entityRetrievalMaxHints === \"number\" ? cfg.entityRetrievalMaxHints : 2,\n entityRetrievalMaxSupportingFacts:\n typeof cfg.entityRetrievalMaxSupportingFacts === \"number\" ? cfg.entityRetrievalMaxSupportingFacts : 6,\n entityRetrievalMaxRelatedEntities:\n typeof cfg.entityRetrievalMaxRelatedEntities === \"number\" ? cfg.entityRetrievalMaxRelatedEntities : 3,\n entityRetrievalRecentTurns:\n typeof cfg.entityRetrievalRecentTurns === \"number\" ? cfg.entityRetrievalRecentTurns : 6,\n entitySchemas,\n recallBudgetChars: recallPipelineConfig.recallBudgetChars,\n recallOuterTimeoutMs:\n typeof cfg.recallOuterTimeoutMs === \"number\" ? Math.max(0, Math.floor(cfg.recallOuterTimeoutMs)) : 75_000,\n recallCoreDeadlineMs:\n typeof cfg.recallCoreDeadlineMs === \"number\" ? Math.max(0, Math.floor(cfg.recallCoreDeadlineMs)) : 75_000,\n recallEnrichmentDeadlineMs:\n typeof cfg.recallEnrichmentDeadlineMs === \"number\"\n ? Math.max(0, Math.floor(cfg.recallEnrichmentDeadlineMs))\n : 25_000,\n recallPipeline: recallPipelineConfig.pipeline,\n recallMmrEnabled: cfg.recallMmrEnabled !== false,\n recallMmrLambda:\n typeof cfg.recallMmrLambda === \"number\" && Number.isFinite(cfg.recallMmrLambda)\n ? Math.min(1, Math.max(0, cfg.recallMmrLambda))\n : 0.7,\n recallMmrTopN:\n typeof cfg.recallMmrTopN === \"number\" && Number.isFinite(cfg.recallMmrTopN)\n ? Math.max(0, Math.floor(cfg.recallMmrTopN))\n : 40,\n qmdRecallCacheTtlMs:\n typeof cfg.qmdRecallCacheTtlMs === \"number\" ? Math.max(0, Math.floor(cfg.qmdRecallCacheTtlMs)) : 60_000,\n qmdRecallCacheStaleTtlMs:\n typeof cfg.qmdRecallCacheStaleTtlMs === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdRecallCacheStaleTtlMs))\n : 10 * 60_000,\n qmdRecallCacheMaxEntries:\n typeof cfg.qmdRecallCacheMaxEntries === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdRecallCacheMaxEntries))\n : 128,\n entityRelationshipsEnabled: cfg.entityRelationshipsEnabled !== false,\n entityActivityLogEnabled: cfg.entityActivityLogEnabled !== false,\n entityActivityLogMaxEntries:\n typeof cfg.entityActivityLogMaxEntries === \"number\" ? cfg.entityActivityLogMaxEntries : 20,\n entityAliasesEnabled: cfg.entityAliasesEnabled !== false,\n entitySummaryEnabled: cfg.entitySummaryEnabled !== false,\n entitySynthesisMaxTokens:\n typeof cfg.entitySynthesisMaxTokens === \"number\" && Number.isFinite(cfg.entitySynthesisMaxTokens)\n ? (() => {\n const tokens = Math.max(0, Math.floor(cfg.entitySynthesisMaxTokens));\n return tokens === 0 ? 0 : Math.max(10, tokens);\n })()\n : 500,\n\n // Search backend abstraction\n searchBackend: ([\"qmd\", \"remote\", \"noop\", \"lancedb\", \"meilisearch\", \"orama\"] as const).includes(cfg.searchBackend as any)\n ? (cfg.searchBackend as \"qmd\" | \"remote\" | \"noop\" | \"lancedb\" | \"meilisearch\" | \"orama\")\n : \"qmd\",\n remoteSearchBaseUrl: typeof cfg.remoteSearchBaseUrl === \"string\" ? cfg.remoteSearchBaseUrl : undefined,\n remoteSearchApiKey: typeof cfg.remoteSearchApiKey === \"string\" ? cfg.remoteSearchApiKey : undefined,\n remoteSearchTimeoutMs: typeof cfg.remoteSearchTimeoutMs === \"number\" ? cfg.remoteSearchTimeoutMs : 30_000,\n\n // LanceDB backend\n lancedbEnabled: cfg.lancedbEnabled === true,\n lanceDbPath: typeof cfg.lanceDbPath === \"string\" ? cfg.lanceDbPath : path.join(memoryDir, \"lancedb\"),\n lanceEmbeddingDimension: typeof cfg.lanceEmbeddingDimension === \"number\" ? cfg.lanceEmbeddingDimension : 1536,\n\n // Meilisearch backend\n meilisearchEnabled: cfg.meilisearchEnabled === true,\n meilisearchHost: typeof cfg.meilisearchHost === \"string\" ? cfg.meilisearchHost : \"http://localhost:7700\",\n meilisearchApiKey: typeof cfg.meilisearchApiKey === \"string\" ? cfg.meilisearchApiKey : undefined,\n meilisearchTimeoutMs: typeof cfg.meilisearchTimeoutMs === \"number\" ? cfg.meilisearchTimeoutMs : 30_000,\n meilisearchAutoIndex: cfg.meilisearchAutoIndex === true,\n\n // Orama backend\n oramaEnabled: cfg.oramaEnabled === true,\n oramaDbPath: typeof cfg.oramaDbPath === \"string\" ? cfg.oramaDbPath : path.join(memoryDir, \"orama\"),\n oramaEmbeddingDimension: typeof cfg.oramaEmbeddingDimension === \"number\" ? cfg.oramaEmbeddingDimension : 1536,\n\n // QMD daemon mode\n qmdDaemonEnabled: cfg.qmdDaemonEnabled !== false,\n qmdDaemonUrl:\n typeof cfg.qmdDaemonUrl === \"string\" && cfg.qmdDaemonUrl.length > 0\n ? cfg.qmdDaemonUrl\n : \"http://localhost:8181/mcp\",\n qmdDaemonRecheckIntervalMs:\n typeof cfg.qmdDaemonRecheckIntervalMs === \"number\" ? cfg.qmdDaemonRecheckIntervalMs : 15_000,\n qmdIntentHintsEnabled: cfg.qmdIntentHintsEnabled === true,\n qmdExplainEnabled: cfg.qmdExplainEnabled === true,\n\n // v6.0 Fact deduplication & archival\n factDeduplicationEnabled: cfg.factDeduplicationEnabled !== false,\n // Issue #373 — write-time semantic similarity guard\n semanticDedupEnabled: cfg.semanticDedupEnabled !== false,\n // Guard against NaN / Infinity — Number.isFinite rejects both and falls\n // back to the documented default so the semantic dedup guard cannot be\n // silently disabled by a malformed config value.\n semanticDedupThreshold:\n typeof cfg.semanticDedupThreshold === \"number\" &&\n Number.isFinite(cfg.semanticDedupThreshold)\n ? Math.min(1, Math.max(0, cfg.semanticDedupThreshold))\n : 0.92,\n // Zero is a valid \"disable candidate lookup\" signal and must be preserved.\n // Only negative or non-finite values fall back to the default of 5.\n // Fractional values in (0, 1) floor to 0, which would silently disable\n // semantic dedup despite a clearly non-zero operator intent — clamp to 1.\n semanticDedupCandidates: (() => {\n const raw = cfg.semanticDedupCandidates;\n if (typeof raw !== \"number\" || !Number.isFinite(raw) || raw < 0) return 5;\n const n = Math.floor(raw);\n // Positive fractional input (e.g. 0.5) should mean \"at least 1 candidate\",\n // not \"disabled\". Only explicit 0 is the operator's disable signal.\n return raw > 0 && n === 0 ? 1 : n;\n })(),\n factArchivalEnabled: cfg.factArchivalEnabled === true,\n factArchivalAgeDays:\n typeof cfg.factArchivalAgeDays === \"number\" ? cfg.factArchivalAgeDays : 90,\n factArchivalMaxImportance:\n typeof cfg.factArchivalMaxImportance === \"number\" ? cfg.factArchivalMaxImportance : 0.3,\n factArchivalMaxAccessCount:\n typeof cfg.factArchivalMaxAccessCount === \"number\" ? cfg.factArchivalMaxAccessCount : 2,\n factArchivalProtectedCategories: Array.isArray(cfg.factArchivalProtectedCategories)\n ? (cfg.factArchivalProtectedCategories as any[]).filter((c) => typeof c === \"string\")\n : [\"commitment\", \"preference\", \"decision\", \"principle\", \"procedure\"],\n // v8.3 lifecycle policy engine (default off)\n lifecyclePolicyEnabled: cfg.lifecyclePolicyEnabled === true,\n lifecycleFilterStaleEnabled: cfg.lifecycleFilterStaleEnabled === true,\n lifecyclePromoteHeatThreshold:\n typeof cfg.lifecyclePromoteHeatThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecyclePromoteHeatThreshold))\n : 0.55,\n lifecycleStaleDecayThreshold:\n typeof cfg.lifecycleStaleDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecycleStaleDecayThreshold))\n : 0.65,\n lifecycleArchiveDecayThreshold:\n typeof cfg.lifecycleArchiveDecayThreshold === \"number\"\n ? Math.min(1, Math.max(0, cfg.lifecycleArchiveDecayThreshold))\n : 0.85,\n lifecycleProtectedCategories: Array.isArray(cfg.lifecycleProtectedCategories)\n ? (cfg.lifecycleProtectedCategories as any[]).filter(\n (c): c is PluginConfig[\"lifecycleProtectedCategories\"][number] =>\n typeof c === \"string\" && VALID_MEMORY_CATEGORIES.has(c),\n )\n : [\"decision\", \"principle\", \"commitment\", \"preference\", \"procedure\"],\n lifecycleMetricsEnabled:\n typeof cfg.lifecycleMetricsEnabled === \"boolean\"\n ? cfg.lifecycleMetricsEnabled\n : cfg.lifecyclePolicyEnabled === true,\n // v8.3 proactive + policy learning (default off)\n proactiveExtractionEnabled: cfg.proactiveExtractionEnabled === true,\n contextCompressionActionsEnabled: cfg.contextCompressionActionsEnabled === true,\n compressionGuidelineLearningEnabled: cfg.compressionGuidelineLearningEnabled === true,\n compressionGuidelineSemanticRefinementEnabled:\n cfg.compressionGuidelineSemanticRefinementEnabled === true,\n compressionGuidelineSemanticTimeoutMs:\n typeof cfg.compressionGuidelineSemanticTimeoutMs === \"number\"\n ? Math.max(1, Math.floor(cfg.compressionGuidelineSemanticTimeoutMs))\n : 2500,\n maxProactiveQuestionsPerExtraction:\n typeof cfg.maxProactiveQuestionsPerExtraction === \"number\"\n ? Math.max(0, Math.floor(cfg.maxProactiveQuestionsPerExtraction))\n : 2,\n proactiveExtractionTimeoutMs:\n typeof cfg.proactiveExtractionTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.proactiveExtractionTimeoutMs))\n : 2500,\n proactiveExtractionMaxTokens:\n typeof cfg.proactiveExtractionMaxTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.proactiveExtractionMaxTokens))\n : 900,\n extractionMaxOutputTokens:\n typeof cfg.extractionMaxOutputTokens === \"number\"\n ? Math.max(1, Math.floor(cfg.extractionMaxOutputTokens))\n : 16384,\n proactiveExtractionCategoryAllowlist: Array.isArray(cfg.proactiveExtractionCategoryAllowlist)\n ? (cfg.proactiveExtractionCategoryAllowlist as unknown[]).filter(\n (category): category is PluginConfig[\"lifecycleProtectedCategories\"][number] =>\n typeof category === \"string\" && VALID_MEMORY_CATEGORIES.has(category),\n )\n : undefined,\n maxCompressionTokensPerHour:\n typeof cfg.maxCompressionTokensPerHour === \"number\"\n ? Math.max(0, Math.floor(cfg.maxCompressionTokensPerHour))\n : 1500,\n behaviorLoopAutoTuneEnabled: cfg.behaviorLoopAutoTuneEnabled === true,\n behaviorLoopLearningWindowDays:\n typeof cfg.behaviorLoopLearningWindowDays === \"number\"\n ? Math.max(0, Math.floor(cfg.behaviorLoopLearningWindowDays))\n : 14,\n behaviorLoopMinSignalCount:\n typeof cfg.behaviorLoopMinSignalCount === \"number\"\n ? Math.max(0, Math.floor(cfg.behaviorLoopMinSignalCount))\n : 10,\n behaviorLoopMaxDeltaPerCycle:\n typeof cfg.behaviorLoopMaxDeltaPerCycle === \"number\"\n ? Math.min(1, Math.max(0, cfg.behaviorLoopMaxDeltaPerCycle))\n : 0.1,\n behaviorLoopProtectedParams: Array.isArray(cfg.behaviorLoopProtectedParams)\n ? (cfg.behaviorLoopProtectedParams as unknown[])\n .filter((param): param is string => typeof param === \"string\" && param.trim().length > 0)\n : [...DEFAULT_BEHAVIOR_LOOP_PROTECTED_PARAMS],\n // v8.0 phase 1\n recallPlannerEnabled: cfg.recallPlannerEnabled !== false,\n recallPlannerModel:\n typeof cfg.recallPlannerModel === \"string\" && cfg.recallPlannerModel.trim().length > 0\n ? cfg.recallPlannerModel.trim()\n : \"gpt-5.2-mini\",\n recallPlannerTimeoutMs:\n typeof cfg.recallPlannerTimeoutMs === \"number\" ? cfg.recallPlannerTimeoutMs : 1500,\n recallPlannerUseResponsesApi: cfg.recallPlannerUseResponsesApi !== false,\n recallPlannerMaxPromptChars:\n typeof cfg.recallPlannerMaxPromptChars === \"number\" ? cfg.recallPlannerMaxPromptChars : 4000,\n recallPlannerMaxMemoryHints:\n typeof cfg.recallPlannerMaxMemoryHints === \"number\" ? cfg.recallPlannerMaxMemoryHints : 24,\n recallPlannerShadowMode: cfg.recallPlannerShadowMode === true,\n recallPlannerTelemetryEnabled: cfg.recallPlannerTelemetryEnabled !== false,\n recallPlannerMaxQmdResultsMinimal:\n typeof cfg.recallPlannerMaxQmdResultsMinimal === \"number\"\n ? cfg.recallPlannerMaxQmdResultsMinimal\n : 4,\n recallPlannerMaxQmdResultsFull:\n typeof cfg.recallPlannerMaxQmdResultsFull === \"number\" ? cfg.recallPlannerMaxQmdResultsFull : 8,\n intentRoutingEnabled: cfg.intentRoutingEnabled === true,\n intentRoutingBoost:\n typeof cfg.intentRoutingBoost === \"number\" ? cfg.intentRoutingBoost : 0.12,\n verbatimArtifactsEnabled: cfg.verbatimArtifactsEnabled === true,\n verbatimArtifactsMinConfidence:\n typeof cfg.verbatimArtifactsMinConfidence === \"number\"\n ? cfg.verbatimArtifactsMinConfidence\n : 0.8,\n verbatimArtifactsMaxRecall:\n typeof cfg.verbatimArtifactsMaxRecall === \"number\" ? cfg.verbatimArtifactsMaxRecall : 5,\n verbatimArtifactCategories: Array.isArray(cfg.verbatimArtifactCategories)\n ? (cfg.verbatimArtifactCategories as any[]).filter(\n (c): c is PluginConfig[\"verbatimArtifactCategories\"][number] =>\n typeof c === \"string\" && VALID_MEMORY_CATEGORIES.has(c),\n )\n : [\"decision\", \"correction\", \"principle\", \"commitment\"],\n // v8.0 Phase 2A: Memory Boxes + Trace Weaving\n memoryBoxesEnabled: cfg.memoryBoxesEnabled === true,\n boxTopicShiftThreshold:\n typeof cfg.boxTopicShiftThreshold === \"number\" ? cfg.boxTopicShiftThreshold : 0.35,\n boxTimeGapMs:\n typeof cfg.boxTimeGapMs === \"number\" ? cfg.boxTimeGapMs : 30 * 60 * 1000,\n boxMaxMemories:\n typeof cfg.boxMaxMemories === \"number\" ? cfg.boxMaxMemories : 50,\n traceWeaverEnabled: cfg.traceWeaverEnabled === true,\n traceWeaverLookbackDays:\n typeof cfg.traceWeaverLookbackDays === \"number\" ? cfg.traceWeaverLookbackDays : 7,\n traceWeaverOverlapThreshold:\n typeof cfg.traceWeaverOverlapThreshold === \"number\" ? cfg.traceWeaverOverlapThreshold : 0.4,\n boxRecallDays:\n typeof cfg.boxRecallDays === \"number\" ? cfg.boxRecallDays : 3,\n // v8.0 Phase 2B: Episode/Note dual store (HiMem)\n episodeNoteModeEnabled: cfg.episodeNoteModeEnabled === true,\n // v8.1: Temporal + Tag Indexes (SwiftMem-inspired)\n queryAwareIndexingEnabled: cfg.queryAwareIndexingEnabled === true,\n queryAwareIndexingMaxCandidates:\n typeof cfg.queryAwareIndexingMaxCandidates === \"number\"\n ? Math.max(0, cfg.queryAwareIndexingMaxCandidates) // clamp: negative treated as 0 (no cap)\n : 200,\n temporalIndexWindowDays:\n typeof cfg.temporalIndexWindowDays === \"number\" ? cfg.temporalIndexWindowDays : 30,\n temporalIndexMaxEntries:\n typeof cfg.temporalIndexMaxEntries === \"number\" ? cfg.temporalIndexMaxEntries : 5000,\n temporalBoostRecentDays:\n typeof cfg.temporalBoostRecentDays === \"number\" ? cfg.temporalBoostRecentDays : 7,\n temporalBoostScore: typeof cfg.temporalBoostScore === \"number\" ? cfg.temporalBoostScore : 0.15,\n temporalDecayEnabled: cfg.temporalDecayEnabled !== false,\n tagMemoryEnabled: cfg.tagMemoryEnabled === true,\n tagMaxPerMemory: typeof cfg.tagMaxPerMemory === \"number\" ? cfg.tagMaxPerMemory : 5,\n tagIndexMaxEntries:\n typeof cfg.tagIndexMaxEntries === \"number\" ? cfg.tagIndexMaxEntries : 10000,\n tagRecallBoost: typeof cfg.tagRecallBoost === \"number\" ? cfg.tagRecallBoost : 0.15,\n tagRecallMaxMatches: typeof cfg.tagRecallMaxMatches === \"number\" ? cfg.tagRecallMaxMatches : 10,\n // v8.2: Multi-graph memory (PR 18)\n multiGraphMemoryEnabled: cfg.multiGraphMemoryEnabled === true,\n graphRecallEnabled: cfg.graphRecallEnabled === true,\n graphRecallMaxExpansions:\n typeof cfg.graphRecallMaxExpansions === \"number\" ? cfg.graphRecallMaxExpansions : 3,\n graphRecallMaxPerSeed:\n typeof cfg.graphRecallMaxPerSeed === \"number\" ? cfg.graphRecallMaxPerSeed : 5,\n graphRecallMinEdgeWeight:\n typeof cfg.graphRecallMinEdgeWeight === \"number\" ? cfg.graphRecallMinEdgeWeight : 0.1,\n graphRecallShadowEnabled: cfg.graphRecallShadowEnabled === true,\n graphRecallSnapshotEnabled: cfg.graphRecallSnapshotEnabled === true,\n graphRecallShadowSampleRate:\n typeof cfg.graphRecallShadowSampleRate === \"number\" ? cfg.graphRecallShadowSampleRate : 0.1,\n graphRecallExplainToolEnabled: cfg.graphRecallExplainToolEnabled === true,\n graphRecallStoreColdMirror: cfg.graphRecallStoreColdMirror === true,\n graphRecallColdMirrorCollection:\n typeof cfg.graphRecallColdMirrorCollection === \"string\" &&\n cfg.graphRecallColdMirrorCollection.trim().length > 0\n ? cfg.graphRecallColdMirrorCollection.trim()\n : undefined,\n graphRecallColdMirrorMinAgeDays:\n typeof cfg.graphRecallColdMirrorMinAgeDays === \"number\" ? cfg.graphRecallColdMirrorMinAgeDays : 7,\n graphRecallUseEntityPriors: cfg.graphRecallUseEntityPriors === true,\n graphRecallEntityPriorBoost:\n typeof cfg.graphRecallEntityPriorBoost === \"number\" ? cfg.graphRecallEntityPriorBoost : 0.2,\n graphRecallPreferHubSeeds: cfg.graphRecallPreferHubSeeds === true,\n graphRecallHubBias:\n typeof cfg.graphRecallHubBias === \"number\" ? cfg.graphRecallHubBias : 0.3,\n graphRecallRecencyHalfLifeDays:\n typeof cfg.graphRecallRecencyHalfLifeDays === \"number\" ? cfg.graphRecallRecencyHalfLifeDays : 30,\n graphRecallDampingFactor:\n typeof cfg.graphRecallDampingFactor === \"number\" ? cfg.graphRecallDampingFactor : 0.85,\n graphRecallMaxSeedNodes:\n typeof cfg.graphRecallMaxSeedNodes === \"number\" ? cfg.graphRecallMaxSeedNodes : 10,\n graphRecallMaxExpandedNodes:\n typeof cfg.graphRecallMaxExpandedNodes === \"number\" ? cfg.graphRecallMaxExpandedNodes : 30,\n graphRecallMaxTrailPerNode:\n typeof cfg.graphRecallMaxTrailPerNode === \"number\" ? cfg.graphRecallMaxTrailPerNode : 5,\n graphRecallMinSeedScore:\n typeof cfg.graphRecallMinSeedScore === \"number\" ? cfg.graphRecallMinSeedScore : 0.3,\n graphRecallExpansionScoreThreshold:\n typeof cfg.graphRecallExpansionScoreThreshold === \"number\"\n ? cfg.graphRecallExpansionScoreThreshold\n : 0.2,\n graphRecallExplainMaxPaths:\n typeof cfg.graphRecallExplainMaxPaths === \"number\" ? cfg.graphRecallExplainMaxPaths : 3,\n graphRecallExplainMaxChars:\n typeof cfg.graphRecallExplainMaxChars === \"number\" ? cfg.graphRecallExplainMaxChars : 500,\n graphRecallExplainEdgeLimit:\n typeof cfg.graphRecallExplainEdgeLimit === \"number\" ? cfg.graphRecallExplainEdgeLimit : 5,\n graphRecallExplainEnabled: cfg.graphRecallExplainEnabled === true,\n graphRecallEntityHintsEnabled: cfg.graphRecallEntityHintsEnabled === true,\n graphRecallEntityHintMax:\n typeof cfg.graphRecallEntityHintMax === \"number\" ? cfg.graphRecallEntityHintMax : 3,\n graphRecallEntityHintMaxChars:\n typeof cfg.graphRecallEntityHintMaxChars === \"number\" ? cfg.graphRecallEntityHintMaxChars : 200,\n graphRecallSnapshotDir:\n typeof cfg.graphRecallSnapshotDir === \"string\" && cfg.graphRecallSnapshotDir.trim().length > 0\n ? cfg.graphRecallSnapshotDir.trim()\n : path.join(memoryDir, \"state\", \"graph\"),\n graphRecallEnableTrace: cfg.graphRecallEnableTrace === true,\n graphRecallEnableDebug: cfg.graphRecallEnableDebug === true,\n graphExpandedIntentEnabled: cfg.graphExpandedIntentEnabled !== false,\n graphAssistInFullModeEnabled: cfg.graphAssistInFullModeEnabled !== false,\n graphAssistShadowEvalEnabled: cfg.graphAssistShadowEvalEnabled === true,\n graphAssistMinSeedResults:\n typeof cfg.graphAssistMinSeedResults === \"number\"\n ? Math.max(1, Math.floor(cfg.graphAssistMinSeedResults))\n : 3,\n entityGraphEnabled: cfg.entityGraphEnabled !== false,\n timeGraphEnabled: cfg.timeGraphEnabled !== false,\n graphWriteSessionAdjacencyEnabled: cfg.graphWriteSessionAdjacencyEnabled !== false,\n causalGraphEnabled: cfg.causalGraphEnabled !== false,\n maxGraphTraversalSteps:\n typeof cfg.maxGraphTraversalSteps === \"number\" ? Math.max(0, cfg.maxGraphTraversalSteps) : 3,\n graphActivationDecay:\n typeof cfg.graphActivationDecay === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphActivationDecay))\n : 0.7,\n graphExpansionActivationWeight:\n typeof cfg.graphExpansionActivationWeight === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphExpansionActivationWeight))\n : 0.65,\n graphExpansionBlendMin:\n typeof cfg.graphExpansionBlendMin === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphExpansionBlendMin))\n : 0.05,\n graphExpansionBlendMax:\n typeof cfg.graphExpansionBlendMax === \"number\"\n ? Math.min(1, Math.max(0, cfg.graphExpansionBlendMax))\n : 0.95,\n maxEntityGraphEdgesPerMemory:\n typeof cfg.maxEntityGraphEdgesPerMemory === \"number\"\n ? Math.max(0, cfg.maxEntityGraphEdgesPerMemory)\n : 10,\n delinearizeEnabled: cfg.delinearizeEnabled !== false,\n recallConfidenceGateEnabled: cfg.recallConfidenceGateEnabled === true,\n recallConfidenceGateThreshold:\n typeof cfg.recallConfidenceGateThreshold === \"number\"\n ? Math.max(0, Math.min(1, cfg.recallConfidenceGateThreshold))\n : 0.12,\n causalRuleExtractionEnabled: cfg.causalRuleExtractionEnabled === true,\n memoryReconstructionEnabled: cfg.memoryReconstructionEnabled === true,\n memoryReconstructionMaxExpansions:\n typeof cfg.memoryReconstructionMaxExpansions === \"number\" ? Math.max(0, Math.round(cfg.memoryReconstructionMaxExpansions)) : 3,\n graphLateralInhibitionEnabled: cfg.graphLateralInhibitionEnabled !== false,\n graphLateralInhibitionBeta:\n typeof cfg.graphLateralInhibitionBeta === \"number\"\n ? Math.max(0, Math.min(1, cfg.graphLateralInhibitionBeta))\n : 0.15,\n graphLateralInhibitionTopM:\n typeof cfg.graphLateralInhibitionTopM === \"number\"\n ? Math.max(0, Math.round(cfg.graphLateralInhibitionTopM))\n : 7,\n // v8.2: Temporal Memory Tree\n temporalMemoryTreeEnabled: cfg.temporalMemoryTreeEnabled === true,\n tmtHourlyMinMemories:\n typeof cfg.tmtHourlyMinMemories === \"number\" ? cfg.tmtHourlyMinMemories : 3,\n tmtSummaryMaxTokens:\n typeof cfg.tmtSummaryMaxTokens === \"number\" ? cfg.tmtSummaryMaxTokens : 300,\n // Lossless Context Management (LCM)\n lcmEnabled: cfg.lcmEnabled === true,\n lcmLeafBatchSize:\n typeof cfg.lcmLeafBatchSize === \"number\" ? Math.max(2, Math.floor(cfg.lcmLeafBatchSize)) : 8,\n lcmRollupFanIn:\n typeof cfg.lcmRollupFanIn === \"number\" ? Math.max(2, Math.floor(cfg.lcmRollupFanIn)) : 4,\n lcmFreshTailTurns:\n typeof cfg.lcmFreshTailTurns === \"number\" ? Math.max(1, Math.floor(cfg.lcmFreshTailTurns)) : 16,\n lcmMaxDepth:\n typeof cfg.lcmMaxDepth === \"number\" ? Math.max(1, Math.floor(cfg.lcmMaxDepth)) : 5,\n lcmRecallBudgetShare:\n typeof cfg.lcmRecallBudgetShare === \"number\"\n ? Math.max(0, Math.min(1, cfg.lcmRecallBudgetShare))\n : 0.15,\n lcmDeterministicMaxTokens:\n typeof cfg.lcmDeterministicMaxTokens === \"number\"\n ? Math.max(64, Math.floor(cfg.lcmDeterministicMaxTokens))\n : 512,\n lcmArchiveRetentionDays:\n typeof cfg.lcmArchiveRetentionDays === \"number\"\n ? Math.max(1, Math.floor(cfg.lcmArchiveRetentionDays))\n : 90,\n\n // v9.1 Parallel Specialized Retrieval\n parallelRetrievalEnabled: cfg.parallelRetrievalEnabled === true,\n parallelAgentWeights: (() => {\n const w = cfg.parallelAgentWeights as Record<string, unknown> | undefined;\n return {\n direct: typeof w?.direct === \"number\" ? Math.max(0, w.direct) : 1.0,\n contextual: typeof w?.contextual === \"number\" ? Math.max(0, w.contextual) : 0.7,\n temporal: typeof w?.temporal === \"number\" ? Math.max(0, w.temporal) : 0.85,\n };\n })(),\n parallelMaxResultsPerAgent:\n typeof cfg.parallelMaxResultsPerAgent === \"number\"\n ? Math.max(0, Math.floor(cfg.parallelMaxResultsPerAgent))\n : 20,\n\n briefing: parseBriefingConfig(cfg.briefing),\n\n // Codex CLI connector settings (install-time)\n codex: (() => {\n const raw =\n cfg.codex && typeof cfg.codex === \"object\" && !Array.isArray(cfg.codex)\n ? (cfg.codex as Record<string, unknown>)\n : {};\n // Coerce string \"false\"/\"0\"/\"no\" → false and \"true\"/\"1\"/\"yes\" → true so\n // that CLI inputs like --config installExtension=false are handled correctly.\n // Missing / undefined defaults to true (coerceInstallExtension returns\n // undefined for unknown values, so ?? true applies the default).\n const installExtension = coerceInstallExtension(raw.installExtension) ?? true;\n const codexHome =\n typeof raw.codexHome === \"string\" && raw.codexHome.trim().length > 0\n ? raw.codexHome.trim()\n : null;\n return { installExtension, codexHome };\n })(),\n\n // MECE Taxonomy (#366)\n // Coerce string booleans from CLI (e.g. --config taxonomyEnabled=true) — gotcha #36\n taxonomyEnabled: coerceBool(cfg.taxonomyEnabled) ?? false,\n taxonomyAutoGenResolver: coerceBool(cfg.taxonomyAutoGenResolver) ?? true,\n\n // Codex CLI — native memory materialization (#378)\n codexMaterializeMemories: cfg.codexMaterializeMemories !== false,\n codexMaterializeNamespace:\n typeof cfg.codexMaterializeNamespace === \"string\" && cfg.codexMaterializeNamespace.trim().length > 0\n ? cfg.codexMaterializeNamespace.trim()\n : \"auto\",\n codexMaterializeMaxSummaryTokens:\n typeof cfg.codexMaterializeMaxSummaryTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.codexMaterializeMaxSummaryTokens))\n : 4500,\n codexMaterializeRolloutRetentionDays:\n typeof cfg.codexMaterializeRolloutRetentionDays === \"number\"\n ? Math.max(0, Math.floor(cfg.codexMaterializeRolloutRetentionDays))\n : 30,\n codexMaterializeOnConsolidation: cfg.codexMaterializeOnConsolidation !== false,\n codexMaterializeOnSessionEnd: cfg.codexMaterializeOnSessionEnd !== false,\n // Codex CLI — marketplace integration (#418)\n codexMarketplaceEnabled: cfg.codexMarketplaceEnabled !== false, // default: true\n\n // Page-level versioning (issue #371)\n versioningEnabled: cfg.versioningEnabled === true,\n versioningMaxPerPage:\n typeof cfg.versioningMaxPerPage === \"number\"\n ? Math.max(0, Math.floor(cfg.versioningMaxPerPage))\n : 50,\n versioningSidecarDir:\n typeof cfg.versioningSidecarDir === \"string\" && cfg.versioningSidecarDir.trim().length > 0\n ? cfg.versioningSidecarDir.trim()\n : \".versions\",\n\n // Binary file lifecycle management (#367)\n binaryLifecycleEnabled: cfg.binaryLifecycleEnabled === true,\n binaryLifecycleGracePeriodDays:\n typeof cfg.binaryLifecycleGracePeriodDays === \"number\"\n ? Math.max(0, Math.floor(cfg.binaryLifecycleGracePeriodDays))\n : 7,\n binaryLifecycleBackendType: (() => {\n const valid = [\"filesystem\", \"s3\", \"none\"] as const;\n const raw = cfg.binaryLifecycleBackendType;\n if (typeof raw === \"string\" && (valid as readonly string[]).includes(raw)) {\n return raw as \"filesystem\" | \"s3\" | \"none\";\n }\n return \"none\" as const;\n })(),\n binaryLifecycleBackendPath:\n typeof cfg.binaryLifecycleBackendPath === \"string\"\n ? cfg.binaryLifecycleBackendPath.trim()\n : \"\",\n\n // Codex citation parity (issue #379)\n citationsEnabled: cfg.citationsEnabled === true,\n citationsAutoDetect: cfg.citationsAutoDetect !== false,\n\n // External enrichment pipeline (issue #365)\n enrichmentEnabled: cfg.enrichmentEnabled === true,\n enrichmentAutoOnCreate: cfg.enrichmentAutoOnCreate === true,\n enrichmentMaxCandidatesPerEntity:\n typeof cfg.enrichmentMaxCandidatesPerEntity === \"number\"\n ? Math.max(0, Math.floor(cfg.enrichmentMaxCandidatesPerEntity))\n : 20,\n\n // Memory extensions discovery (#382)\n memoryExtensionsEnabled: cfg.memoryExtensionsEnabled !== false,\n memoryExtensionsRoot:\n typeof cfg.memoryExtensionsRoot === \"string\" && cfg.memoryExtensionsRoot.trim().length > 0\n ? cfg.memoryExtensionsRoot.trim()\n : \"\",\n };\n}\n\nfunction parseBriefingConfig(raw: unknown): import(\"./types.js\").BriefingConfig {\n const entry =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n const defaultFormat =\n entry.defaultFormat === \"json\" || entry.defaultFormat === \"markdown\"\n ? (entry.defaultFormat as \"markdown\" | \"json\")\n : \"markdown\";\n const maxFollowupsRaw =\n typeof entry.maxFollowups === \"number\" && Number.isFinite(entry.maxFollowups)\n ? Math.floor(entry.maxFollowups)\n : 5;\n const maxFollowups = Math.max(0, Math.min(10, maxFollowupsRaw));\n return {\n enabled: entry.enabled !== false,\n defaultWindow:\n typeof entry.defaultWindow === \"string\" && entry.defaultWindow.trim().length > 0\n ? entry.defaultWindow.trim()\n : \"yesterday\",\n defaultFormat,\n maxFollowups,\n calendarSource:\n typeof entry.calendarSource === \"string\" && entry.calendarSource.trim().length > 0\n ? entry.calendarSource.trim()\n : null,\n saveByDefault: entry.saveByDefault === true,\n saveDir:\n typeof entry.saveDir === \"string\" && entry.saveDir.trim().length > 0\n ? entry.saveDir.trim()\n : null,\n llmFollowups: entry.llmFollowups !== false,\n };\n}\n\nfunction clampNonNegativeNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return Math.max(0, Math.floor(value));\n}\n\nfunction parseRecallSectionEntry(raw: unknown): RecallSectionConfig {\n const entry =\n raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {};\n return {\n id: typeof entry.id === \"string\" ? entry.id.trim() : \"\",\n enabled: entry.enabled !== false,\n maxChars:\n entry.maxChars === null\n ? null\n : clampNonNegativeNumber(entry.maxChars),\n maxHints: clampNonNegativeNumber(entry.maxHints),\n maxSupportingFacts: clampNonNegativeNumber(entry.maxSupportingFacts),\n maxRelatedEntities: clampNonNegativeNumber(entry.maxRelatedEntities),\n consolidateTriggerLines: clampNonNegativeNumber(entry.consolidateTriggerLines),\n consolidateTargetLines: clampNonNegativeNumber(entry.consolidateTargetLines),\n maxEntities: clampNonNegativeNumber(entry.maxEntities),\n maxResults: clampNonNegativeNumber(entry.maxResults),\n recentTurns: clampNonNegativeNumber(entry.recentTurns),\n maxTurns: clampNonNegativeNumber(entry.maxTurns),\n maxTokens: clampNonNegativeNumber(entry.maxTokens),\n lookbackHours: clampNonNegativeNumber(entry.lookbackHours),\n maxCount: clampNonNegativeNumber(entry.maxCount),\n topK: clampNonNegativeNumber(entry.topK),\n timeoutMs: clampNonNegativeNumber(entry.timeoutMs),\n maxPatterns: clampNonNegativeNumber(entry.maxPatterns),\n maxRubrics: clampNonNegativeNumber(entry.maxRubrics),\n };\n}\n\nfunction buildDefaultRecallPipeline(cfg: Record<string, unknown>): RecallSectionConfig[] {\n return [\n {\n id: \"shared-context\",\n enabled: cfg.sharedContextEnabled === true,\n maxChars:\n typeof cfg.sharedContextMaxInjectChars === \"number\"\n ? Math.max(0, Math.floor(cfg.sharedContextMaxInjectChars))\n : 4000,\n },\n {\n id: \"profile\",\n enabled: true,\n consolidateTriggerLines: 100,\n consolidateTargetLines: 50,\n },\n {\n id: \"identity-continuity\",\n enabled: cfg.identityContinuityEnabled === true,\n },\n {\n id: \"entity-retrieval\",\n enabled: cfg.entityRetrievalEnabled !== false,\n maxChars:\n typeof cfg.entityRetrievalMaxChars === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxChars))\n : 2400,\n maxHints:\n typeof cfg.entityRetrievalMaxHints === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxHints))\n : 2,\n maxSupportingFacts:\n typeof cfg.entityRetrievalMaxSupportingFacts === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxSupportingFacts))\n : 6,\n maxRelatedEntities:\n typeof cfg.entityRetrievalMaxRelatedEntities === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalMaxRelatedEntities))\n : 3,\n recentTurns:\n typeof cfg.entityRetrievalRecentTurns === \"number\"\n ? Math.max(0, Math.floor(cfg.entityRetrievalRecentTurns))\n : 6,\n },\n {\n id: \"knowledge-index\",\n enabled: cfg.knowledgeIndexEnabled !== false,\n maxChars:\n typeof cfg.knowledgeIndexMaxChars === \"number\"\n ? Math.max(0, Math.floor(cfg.knowledgeIndexMaxChars))\n : 4000,\n maxEntities:\n typeof cfg.knowledgeIndexMaxEntities === \"number\"\n ? Math.max(0, Math.floor(cfg.knowledgeIndexMaxEntities))\n : 40,\n },\n { id: \"verbatim-artifacts\", enabled: cfg.verbatimArtifactsEnabled === true },\n {\n id: \"procedure-recall\",\n enabled:\n typeof cfg.procedural === \"object\" &&\n cfg.procedural !== null &&\n !Array.isArray(cfg.procedural) &&\n (cfg.procedural as { enabled?: unknown }).enabled === true,\n maxChars: 2400,\n },\n { id: \"memory-boxes\", enabled: cfg.memoryBoxesEnabled === true },\n { id: \"temporal-memory-tree\", enabled: cfg.temporalMemoryTreeEnabled === true },\n { id: \"lcm-compressed-history\", enabled: cfg.lcmEnabled === true },\n {\n id: \"objective-state\",\n enabled: cfg.objectiveStateRecallEnabled === true,\n maxResults: 4,\n maxChars: 1800,\n },\n {\n id: \"causal-trajectories\",\n enabled: cfg.causalTrajectoryRecallEnabled === true,\n maxResults: 3,\n maxChars: 2200,\n },\n {\n id: \"trust-zones\",\n enabled: cfg.trustZoneRecallEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"harmonic-retrieval\",\n enabled: cfg.harmonicRetrievalEnabled === true,\n maxResults: 3,\n maxChars: 2200,\n },\n {\n id: \"verified-episodes\",\n enabled: cfg.verifiedRecallEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"verified-rules\",\n enabled: cfg.semanticRuleVerificationEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"work-products\",\n enabled: cfg.workProductRecallEnabled === true,\n maxResults: 3,\n maxChars: 1800,\n },\n {\n id: \"memories\",\n enabled: true,\n maxResults:\n typeof cfg.qmdMaxResults === \"number\"\n ? Math.max(0, Math.floor(cfg.qmdMaxResults))\n : 8,\n },\n {\n id: \"compression-guidelines\",\n enabled: cfg.compressionGuidelineLearningEnabled === true,\n },\n {\n id: \"native-knowledge\",\n enabled: cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\"\n ? (cfg.nativeKnowledge as Record<string, unknown>).enabled === true\n : false,\n maxResults:\n cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\" &&\n typeof (cfg.nativeKnowledge as Record<string, unknown>).maxResults === \"number\"\n ? Math.max(0, Math.floor((cfg.nativeKnowledge as Record<string, unknown>).maxResults as number))\n : 4,\n maxChars:\n cfg.nativeKnowledge && typeof cfg.nativeKnowledge === \"object\" &&\n typeof (cfg.nativeKnowledge as Record<string, unknown>).maxChars === \"number\"\n ? Math.max(0, Math.floor((cfg.nativeKnowledge as Record<string, unknown>).maxChars as number))\n : 2400,\n },\n {\n id: \"transcript\",\n enabled: cfg.transcriptEnabled !== false,\n maxTurns:\n typeof cfg.maxTranscriptTurns === \"number\"\n ? Math.max(0, Math.floor(cfg.maxTranscriptTurns))\n : 50,\n maxTokens:\n typeof cfg.maxTranscriptTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.maxTranscriptTokens))\n : 1000,\n lookbackHours:\n typeof cfg.transcriptRecallHours === \"number\"\n ? Math.max(0, Math.floor(cfg.transcriptRecallHours))\n : 12,\n },\n {\n id: \"summaries\",\n enabled: cfg.hourlySummariesEnabled !== false,\n maxCount:\n typeof cfg.maxSummaryCount === \"number\"\n ? Math.max(0, Math.floor(cfg.maxSummaryCount))\n : 6,\n lookbackHours:\n typeof cfg.summaryRecallHours === \"number\"\n ? Math.max(0, Math.floor(cfg.summaryRecallHours))\n : 24,\n },\n {\n id: \"conversation-recall\",\n enabled: cfg.conversationIndexEnabled === true,\n topK:\n typeof cfg.conversationRecallTopK === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationRecallTopK))\n : 3,\n maxChars:\n typeof cfg.conversationRecallMaxChars === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationRecallMaxChars))\n : 2500,\n timeoutMs:\n typeof cfg.conversationRecallTimeoutMs === \"number\"\n ? Math.max(0, Math.floor(cfg.conversationRecallTimeoutMs))\n : 800,\n },\n {\n id: \"compounding\",\n enabled: cfg.compoundingEnabled === true && cfg.compoundingInjectEnabled !== false,\n maxPatterns: 40,\n maxRubrics: 4,\n },\n { id: \"questions\", enabled: cfg.injectQuestions === true },\n ];\n}\n\nfunction buildRecallPipelineConfig(cfg: Record<string, unknown>): RecallPipelineConfig {\n const maxMemoryTokens =\n typeof cfg.maxMemoryTokens === \"number\"\n ? Math.max(0, Math.floor(cfg.maxMemoryTokens))\n : 2000;\n const recallBudgetCharsRaw = clampNonNegativeNumber(cfg.recallBudgetChars);\n const recallBudgetChars = recallBudgetCharsRaw ?? maxMemoryTokens * 4;\n\n const rawPipeline = cfg.recallPipeline;\n const pipeline = Array.isArray(rawPipeline)\n ? rawPipeline.map(parseRecallSectionEntry).filter((entry) => entry.id.length > 0)\n : buildDefaultRecallPipeline(cfg);\n\n return { recallBudgetChars, pipeline };\n}\n","/**\n * Shared boolean coercion helpers.\n *\n * Extracted from connectors/index.ts so that both config.ts and\n * connectors/index.ts can import them without creating a circular dependency.\n */\n\n/**\n * Generic boolean coercion: converts string representations of booleans\n * (e.g. from CLI `--config someFlag=false`) to proper boolean values.\n * Accepts the same truthy/falsy strings that common shells and env vars use.\n *\n * Returns `undefined` when the value is neither a boolean nor a recognised\n * string, so callers can fall back to a default.\n *\n * CLAUDE.md gotcha #36: String \"false\" is truthy in JavaScript.\n * CLAUDE.md gotcha #28: Coerce CLI values to expected types at input boundaries.\n */\nexport function coerceBool(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const v = value.trim().toLowerCase();\n if ([\"false\", \"0\", \"no\", \"off\"].includes(v)) return false;\n if ([\"true\", \"1\", \"yes\", \"on\"].includes(v)) return true;\n }\n return undefined;\n}\n\n/**\n * Coerce the `installExtension` config value from a string (e.g. from CLI\n * `--config installExtension=false`) to a proper boolean.\n *\n * Delegates to the generic `coerceBool` helper. Kept for backward compatibility.\n */\nexport function coerceInstallExtension(value: unknown): boolean | undefined {\n return coerceBool(value);\n}\n\n/**\n * Generic numeric coercion: accepts a finite number or a string that\n * parses cleanly to one. Returns `undefined` otherwise so callers can\n * fall back to a default.\n *\n * Rules:\n * - number: returned as-is only if finite (NaN / ±Infinity → undefined).\n * - string: trimmed, parsed with `Number()`. Returns `undefined` on\n * empty, NaN, or Infinity.\n *\n * CLAUDE.md gotcha #28: Coerce CLI values to expected types at input boundaries.\n */\nexport function coerceNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n"],"mappings":"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","names":["raw"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-http.ts","../src/adapters/types.ts","../src/adapters/claude-code.ts","../src/adapters/codex.ts","../src/adapters/replit.ts","../src/adapters/hermes.ts","../src/adapters/registry.ts"],"sourcesContent":["import { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport { randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath, URL } from \"node:url\";\nimport { log } from \"./logger.js\";\nimport { EngramAccessInputError, type EngramAccessService } from \"./access-service.js\";\nimport { EngramMcpServer } from \"./access-mcp.js\";\nimport { validateRequest, type SchemaName, type SchemaTypeFor } from \"./access-schema.js\";\nimport type { RecallPlanMode } from \"./types.js\";\nimport { isTrustZoneName, type TrustZoneName, type TrustZoneRecordKind, type TrustZoneSourceClass } from \"./trust-zones.js\";\nimport { AdapterRegistry, type ResolvedIdentity } from \"./adapters/index.js\";\nimport type { CitationEntry } from \"./citations.js\";\n\nexport interface EngramAccessHttpServerOptions {\n service: EngramAccessService;\n host?: string;\n port?: number;\n authToken?: string;\n /** Additional valid tokens (for multi-connector auth). Checked alongside authToken. */\n authTokens?: string[];\n /** Dynamic token loader — called on each auth check so new/revoked tokens take effect without restart. */\n authTokensGetter?: () => string[];\n principal?: string;\n maxBodyBytes?: number;\n adminConsoleEnabled?: boolean;\n adminConsolePublicDir?: string;\n trustPrincipalHeader?: boolean;\n /** Enable adapter-based identity resolution from request headers */\n enableAdapters?: boolean;\n /** Custom adapter registry (defaults to built-in adapters) */\n adapterRegistry?: AdapterRegistry;\n /** Enable oai-mem-citation blocks in recall responses (issue #379). */\n citationsEnabled?: boolean;\n /** Auto-enable citations for Codex adapter connections (issue #379). */\n citationsAutoDetect?: boolean;\n}\n\nexport interface EngramAccessHttpServerStatus {\n running: boolean;\n host: string;\n port: number;\n maxBodyBytes: number;\n}\n\nfunction resolveDefaultAdminConsolePublicDir(): string {\n const candidates = [\n fileURLToPath(new URL(\"../admin-console/public\", import.meta.url)),\n fileURLToPath(new URL(\"./admin-console/public\", import.meta.url)),\n ];\n return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];\n}\n\nconst defaultAdminConsolePublicDir = resolveDefaultAdminConsolePublicDir();\nconst correlationIdStore = new AsyncLocalStorage<string>();\n\nconst WRITE_RATE_LIMIT_WINDOW_MS = 60_000;\nconst WRITE_RATE_LIMIT_MAX_REQUESTS = 30;\nconst TRUST_ZONE_RECORD_KINDS = [\"memory\", \"artifact\", \"state\", \"trajectory\", \"external\"] as const;\nconst TRUST_ZONE_SOURCE_CLASSES = [\"tool_output\", \"web_content\", \"subagent_trace\", \"system_memory\", \"user_input\", \"manual\"] as const;\n\nclass HttpError extends Error {\n readonly code: string;\n readonly details?: unknown;\n constructor(readonly status: number, message: string, code?: string, details?: unknown) {\n super(message);\n this.code = code ?? `http_${status}`;\n this.details = details;\n }\n}\n\nfunction hostToUrlAuthority(host: string): string {\n if (host.includes(\":\") && !host.startsWith(\"[\") && !host.endsWith(\"]\")) {\n return `[${host}]`;\n }\n return host;\n}\n\nfunction parseTrustZoneKindFilter(raw: string | null): TrustZoneRecordKind | undefined {\n if (raw === null) return undefined;\n if ((TRUST_ZONE_RECORD_KINDS as readonly string[]).includes(raw)) {\n return raw as TrustZoneRecordKind;\n }\n throw new HttpError(400, `kind must be one of ${TRUST_ZONE_RECORD_KINDS.join(\"|\")}`, \"invalid_kind_filter\");\n}\n\nfunction parseTrustZoneSourceClassFilter(raw: string | null): TrustZoneSourceClass | undefined {\n if (raw === null) return undefined;\n if ((TRUST_ZONE_SOURCE_CLASSES as readonly string[]).includes(raw)) {\n return raw as TrustZoneSourceClass;\n }\n throw new HttpError(400, `sourceClass must be one of ${TRUST_ZONE_SOURCE_CLASSES.join(\"|\")}`, \"invalid_source_class_filter\");\n}\n\nfunction parseTrustZoneFilter(raw: string | null): TrustZoneName | undefined {\n if (raw === null) return undefined;\n if (isTrustZoneName(raw)) {\n return raw;\n }\n throw new HttpError(400, \"zone must be one of quarantine|working|trusted\", \"invalid_zone_filter\");\n}\n\nexport class EngramAccessHttpServer {\n private readonly service: EngramAccessService;\n private readonly host: string;\n private readonly requestedPort: number;\n private readonly authToken?: string;\n private readonly authTokens: string[];\n private readonly authTokensGetter?: () => string[];\n private readonly authenticatedPrincipal?: string;\n private readonly maxBodyBytes: number;\n private readonly adminConsoleEnabled: boolean;\n private readonly adminConsolePublicDir: string;\n private readonly trustPrincipalHeader: boolean;\n private readonly adapterRegistry: AdapterRegistry | null;\n private readonly writeRequestTimestamps: number[] = [];\n private readonly mcpServer: EngramMcpServer;\n private server: Server | null = null;\n private boundPort = 0;\n\n constructor(options: EngramAccessHttpServerOptions) {\n this.service = options.service;\n this.host = options.host?.trim() || \"127.0.0.1\";\n this.requestedPort = Number.isFinite(options.port) ? Math.max(0, Math.floor(options.port ?? 0)) : 0;\n this.authToken = options.authToken?.trim() || undefined;\n this.authTokens = (options.authTokens ?? []).map((t) => t.trim()).filter(Boolean);\n this.authTokensGetter = options.authTokensGetter;\n this.authenticatedPrincipal = options.principal?.trim() || undefined;\n this.maxBodyBytes = Number.isFinite(options.maxBodyBytes)\n ? Math.max(1, Math.floor(options.maxBodyBytes ?? 131072))\n : 131072;\n this.adminConsoleEnabled = options.adminConsoleEnabled !== false;\n this.adminConsolePublicDir = options.adminConsolePublicDir ?? defaultAdminConsolePublicDir;\n this.trustPrincipalHeader = options.trustPrincipalHeader === true;\n this.adapterRegistry = options.enableAdapters !== false\n ? (options.adapterRegistry ?? new AdapterRegistry())\n : null;\n this.mcpServer = new EngramMcpServer(this.service, {\n principal: options.principal,\n citationsEnabled: options.citationsEnabled,\n citationsAutoDetect: options.citationsAutoDetect,\n });\n }\n\n async start(): Promise<EngramAccessHttpServerStatus> {\n if (!this.authToken && this.authTokens.length === 0 && !this.authTokensGetter) {\n throw new Error(\"engram access HTTP requires authToken or authTokens\");\n }\n if (this.server) return this.status();\n\n const server = createServer((req, res) => {\n const correlationId = randomUUID();\n correlationIdStore.run(correlationId, () => {\n void this.handle(req, res, correlationId).catch((err) => {\n log.debug(`engram access HTTP request failed [${correlationId}]: ${err}`);\n if (err instanceof HttpError) {\n const payload: Record<string, unknown> = { error: err.message, code: err.code };\n if (err.details) payload.details = err.details;\n this.respondJson(res, err.status, payload);\n return;\n }\n if (err instanceof EngramAccessInputError) {\n this.respondJson(res, 400, { error: err.message, code: \"input_error\" });\n return;\n }\n if (res.headersSent) {\n res.destroy(err as Error);\n return;\n }\n this.respondJson(res, 500, { error: \"internal_error\", code: \"internal_error\" });\n });\n });\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(this.requestedPort, this.host);\n });\n } catch (err) {\n server.close();\n throw err;\n }\n\n this.server = server;\n const address = server.address();\n this.boundPort = typeof address === \"object\" && address ? address.port : this.requestedPort;\n return this.status();\n }\n\n async stop(): Promise<void> {\n if (!this.server) return;\n const server = this.server;\n this.server = null;\n this.boundPort = 0;\n await new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n }\n\n status(): EngramAccessHttpServerStatus {\n return {\n running: this.server !== null,\n host: this.host,\n port: this.boundPort,\n maxBodyBytes: this.maxBodyBytes,\n };\n }\n\n /**\n * Resolve the adapter identity for the incoming request.\n * Includes MCP clientInfo from the last initialize handshake if available.\n * Returns null if no adapter matches or adapters are disabled.\n */\n resolveAdapterIdentity(req: IncomingMessage): ResolvedIdentity | null {\n if (!this.adapterRegistry) return null;\n // Look up clientInfo for this specific MCP session to avoid cross-session leaks.\n // Non-MCP requests (no mcp-session-id header) get undefined clientInfo and\n // rely on HTTP headers for adapter matching.\n const sessionId = (() => {\n const raw = req.headers[\"mcp-session-id\"];\n return typeof raw === \"string\" ? raw.trim() : undefined;\n })();\n return this.adapterRegistry.resolve({\n headers: req.headers as Record<string, string | string[] | undefined>,\n clientInfo: this.mcpServer.getClientInfo(sessionId),\n });\n }\n\n /** Cache for per-request identity resolution (avoids double adapter resolution) */\n private identityCache = new WeakMap<IncomingMessage, { principal?: string; namespace?: string }>();\n\n /** Resolve principal and namespace from request headers and adapter identity */\n private resolveRequestIdentity(req: IncomingMessage): { principal?: string; namespace?: string } {\n const cached = this.identityCache.get(req);\n if (cached) return cached;\n let principal: string | undefined;\n let namespace: string | undefined;\n\n // Explicit header override takes priority for principal\n if (this.trustPrincipalHeader) {\n const headerVal = req.headers[\"x-engram-principal\"];\n const raw = Array.isArray(headerVal) ? headerVal[0] : headerVal;\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n if (trimmed.length > 0) {\n principal = trimmed;\n }\n }\n }\n\n // Try adapter-based identity resolution for both principal and namespace\n const adapterIdentity = this.resolveAdapterIdentity(req);\n if (adapterIdentity) {\n if (!principal) {\n principal = adapterIdentity.principal;\n }\n namespace = adapterIdentity.namespace;\n }\n\n if (!principal) {\n principal = this.authenticatedPrincipal;\n }\n\n const result = { principal, namespace };\n this.identityCache.set(req, result);\n return result;\n }\n\n private resolveRequestPrincipal(req: IncomingMessage): string | undefined {\n return this.resolveRequestIdentity(req).principal;\n }\n\n /** Resolve namespace: only use the explicit body value. Adapter-inferred namespace\n * is intentionally NOT used as a fallback for REST requests — omitting namespace\n * should default to the server's global namespace, not silently scope to an adapter. */\n private resolveNamespace(_req: IncomingMessage, bodyNamespace?: string): string | undefined {\n return bodyNamespace || undefined;\n }\n\n private async handle(req: IncomingMessage, res: ServerResponse, correlationId: string): Promise<void> {\n const parsed = new URL(req.url ?? \"/\", `http://${hostToUrlAuthority(this.host)}`);\n const pathname = parsed.pathname;\n\n if (this.adminConsoleEnabled && await this.handleAdminConsole(req, res, pathname)) {\n return;\n }\n\n if (!this.isAuthorized(req)) {\n const body = JSON.stringify({ error: \"unauthorized\", code: \"unauthorized\" });\n res.writeHead(401, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"www-authenticate\": \"Bearer\",\n \"x-request-id\": correlationId,\n });\n res.end(body);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/mcp\") {\n await this.handleMcpRequest(req, res);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/health\") {\n this.respondJson(res, 200, await this.service.health());\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/adapters\") {\n const identity = this.resolveAdapterIdentity(req);\n this.respondJson(res, 200, {\n adaptersEnabled: this.adapterRegistry !== null,\n registered: this.adapterRegistry?.list() ?? [],\n resolved: identity,\n });\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/recall\") {\n const body = await this.readValidatedBody(req, \"recall\");\n const response = await this.service.recall({\n query: body.query ?? \"\",\n sessionKey: body.sessionKey,\n namespace: this.resolveNamespace(req, body.namespace),\n topK: body.topK,\n mode: body.mode as RecallPlanMode | \"auto\" | undefined,\n includeDebug: body.includeDebug === true,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/recall/explain\") {\n const body = await this.readValidatedBody(req, \"recallExplain\");\n const response = await this.service.recallExplain({\n sessionKey: body.sessionKey,\n namespace: this.resolveNamespace(req, body.namespace),\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/observe\") {\n const body = await this.readValidatedBody(req, \"observe\");\n this.ensureWriteRateLimitAvailable();\n const response = await this.service.observe({\n sessionKey: body.sessionKey,\n messages: body.messages,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n skipExtraction: body.skipExtraction === true,\n });\n this.recordWriteRateLimitHit();\n this.respondJson(res, 202, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/lcm/search\") {\n const body = await this.readValidatedBody(req, \"lcmSearch\");\n const response = await this.service.lcmSearch({\n query: body.query,\n sessionKey: body.sessionKey,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n limit: body.limit,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/lcm/status\") {\n this.respondJson(res, 200, await this.service.lcmStatus());\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/memories\") {\n const body = await this.readValidatedBody(req, \"memoryStore\");\n const request = {\n schemaVersion: body.schemaVersion,\n idempotencyKey: body.idempotencyKey,\n dryRun: body.dryRun === true,\n sessionKey: body.sessionKey,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n content: body.content,\n category: body.category,\n confidence: body.confidence,\n namespace: this.resolveNamespace(req, body.namespace),\n tags: body.tags,\n entityRef: body.entityRef,\n ttl: body.ttl,\n sourceReason: body.sourceReason,\n };\n const idempotencyStatus = await this.service.peekMemoryStoreIdempotency(request);\n if (idempotencyStatus === \"miss\" && request.dryRun !== true) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.memoryStore(request);\n if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, this.writeResponseStatus(response), response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/suggestions\") {\n const body = await this.readValidatedBody(req, \"suggestionSubmit\");\n const request = {\n schemaVersion: body.schemaVersion,\n idempotencyKey: body.idempotencyKey,\n dryRun: body.dryRun === true,\n sessionKey: body.sessionKey,\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n content: body.content,\n category: body.category,\n confidence: body.confidence,\n namespace: this.resolveNamespace(req, body.namespace),\n tags: body.tags,\n entityRef: body.entityRef,\n ttl: body.ttl,\n sourceReason: body.sourceReason,\n };\n const idempotencyStatus = await this.service.peekSuggestionSubmitIdempotency(request);\n if (idempotencyStatus === \"miss\" && request.dryRun !== true) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.suggestionSubmit(request);\n if (this.shouldCountWriteRateLimit(response as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, this.writeResponseStatus(response), response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/memories\") {\n const limitRaw = parseInt(parsed.searchParams.get(\"limit\") ?? \"50\", 10);\n const offsetRaw = parseInt(parsed.searchParams.get(\"offset\") ?? \"0\", 10);\n const sortParam = parsed.searchParams.get(\"sort\") ?? undefined;\n const sort = sortParam === \"updated_desc\"\n || sortParam === \"updated_asc\"\n || sortParam === \"created_desc\"\n || sortParam === \"created_asc\"\n ? sortParam\n : undefined;\n const response = await this.service.memoryBrowse({\n query: parsed.searchParams.get(\"q\") ?? undefined,\n status: parsed.searchParams.get(\"status\") ?? undefined,\n category: parsed.searchParams.get(\"category\") ?? undefined,\n namespace: parsed.searchParams.get(\"namespace\") ?? undefined,\n sort,\n limit: Number.isFinite(limitRaw) ? limitRaw : 50,\n offset: Number.isFinite(offsetRaw) ? offsetRaw : 0,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n const memoryMatch = pathname.match(/^\\/engram\\/v1\\/memories\\/([^/]+)$/);\n if (req.method === \"GET\" && memoryMatch) {\n const memoryId = decodeURIComponent(memoryMatch[1] ?? \"\");\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const response = await this.service.memoryGet(memoryId, namespace, this.resolveRequestPrincipal(req));\n this.respondJson(res, response.found ? 200 : 404, response);\n return;\n }\n\n const timelineMatch = pathname.match(/^\\/engram\\/v1\\/memories\\/([^/]+)\\/timeline$/);\n if (req.method === \"GET\" && timelineMatch) {\n const memoryId = decodeURIComponent(timelineMatch[1] ?? \"\");\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const limitRaw = parseInt(parsed.searchParams.get(\"limit\") ?? \"200\", 10);\n const limit = Number.isFinite(limitRaw) ? limitRaw : 200;\n const response = await this.service.memoryTimeline(memoryId, namespace, limit, this.resolveRequestPrincipal(req));\n this.respondJson(res, response.found ? 200 : 404, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/entities\") {\n const limitRaw = parseInt(parsed.searchParams.get(\"limit\") ?? \"50\", 10);\n const offsetRaw = parseInt(parsed.searchParams.get(\"offset\") ?? \"0\", 10);\n const response = await this.service.entityList({\n namespace: parsed.searchParams.get(\"namespace\") ?? undefined,\n query: parsed.searchParams.get(\"q\") ?? undefined,\n limit: Number.isFinite(limitRaw) ? limitRaw : 50,\n offset: Number.isFinite(offsetRaw) ? offsetRaw : 0,\n });\n this.respondJson(res, 200, response);\n return;\n }\n\n const entityMatch = pathname.match(/^\\/engram\\/v1\\/entities\\/([^/]+)$/);\n if (req.method === \"GET\" && entityMatch) {\n const entityName = decodeURIComponent(entityMatch[1] ?? \"\");\n const namespace = parsed.searchParams.get(\"namespace\") ?? undefined;\n const response = await this.service.entityGet(entityName, namespace);\n this.respondJson(res, response.found ? 200 : 404, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/review-queue\") {\n const response = await this.service.reviewQueue(\n parsed.searchParams.get(\"runId\") ?? undefined,\n parsed.searchParams.get(\"namespace\") ?? undefined,\n this.resolveRequestPrincipal(req),\n );\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/maintenance\") {\n this.respondJson(res, 200, await this.service.maintenance(parsed.searchParams.get(\"namespace\") ?? undefined, this.resolveRequestPrincipal(req)));\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/quality\") {\n this.respondJson(res, 200, await this.service.quality(parsed.searchParams.get(\"namespace\") ?? undefined, this.resolveRequestPrincipal(req)));\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/trust-zones/status\") {\n this.respondJson(\n res,\n 200,\n await this.service.trustZoneStatus(parsed.searchParams.get(\"namespace\") ?? undefined, this.resolveRequestPrincipal(req)),\n );\n return;\n }\n\n if (req.method === \"GET\" && pathname === \"/engram/v1/trust-zones/records\") {\n const limitRaw = parseInt(parsed.searchParams.get(\"limit\") ?? \"25\", 10);\n const offsetRaw = parseInt(parsed.searchParams.get(\"offset\") ?? \"0\", 10);\n const response = await this.service.trustZoneBrowse({\n query: parsed.searchParams.get(\"q\") ?? undefined,\n zone: parseTrustZoneFilter(parsed.searchParams.get(\"zone\")),\n kind: parseTrustZoneKindFilter(parsed.searchParams.get(\"kind\")),\n sourceClass: parseTrustZoneSourceClassFilter(parsed.searchParams.get(\"sourceClass\")),\n namespace: parsed.searchParams.get(\"namespace\") ?? undefined,\n limit: Number.isFinite(limitRaw) ? limitRaw : 25,\n offset: Number.isFinite(offsetRaw) ? offsetRaw : 0,\n }, this.resolveRequestPrincipal(req));\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/review-disposition\") {\n const body = await this.readValidatedBody(req, \"reviewDisposition\");\n this.ensureWriteRateLimitAvailable();\n const response = await this.service.reviewDisposition({\n memoryId: body.memoryId,\n status: body.status,\n reasonCode: body.reasonCode,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, 200, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/trust-zones/promote\") {\n const body = await this.readValidatedBody(req, \"trustZonePromote\");\n const dryRun = body.dryRun === true;\n if (!dryRun) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.trustZonePromote({\n recordId: body.recordId,\n targetZone: body.targetZone,\n promotionReason: body.promotionReason,\n recordedAt: body.recordedAt,\n summary: body.summary,\n dryRun,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, response.dryRun ? 200 : 201, response);\n return;\n }\n\n if (req.method === \"POST\" && pathname === \"/engram/v1/trust-zones/demo-seed\") {\n const body = await this.readValidatedBody(req, \"trustZoneDemoSeed\");\n const dryRun = body.dryRun === true;\n if (!dryRun) {\n this.ensureWriteRateLimitAvailable();\n }\n const response = await this.service.trustZoneDemoSeed({\n scenario: body.scenario,\n recordedAt: body.recordedAt,\n dryRun,\n namespace: this.resolveNamespace(req, body.namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n });\n if (this.shouldCountWriteRateLimit(response as unknown as { dryRun?: boolean; idempotencyReplay?: boolean })) {\n this.recordWriteRateLimitHit();\n }\n this.respondJson(res, response.dryRun ? 200 : 201, response);\n return;\n }\n\n // Citation usage tracking (issue #379)\n if (req.method === \"POST\" && pathname === \"/v1/citations/observed\") {\n const body = await this.readJsonBody(req);\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw new HttpError(400, \"request body must be a JSON object\", \"invalid_body\");\n }\n const payload = body as Record<string, unknown>;\n const sessionId = typeof payload.sessionId === \"string\" ? payload.sessionId : undefined;\n const namespace = typeof payload.namespace === \"string\" ? payload.namespace : undefined;\n const citationsRaw = payload.citations;\n if (!citationsRaw || typeof citationsRaw !== \"object\" || Array.isArray(citationsRaw)) {\n throw new HttpError(400, \"citations must be a JSON object with entries and rolloutIds\", \"invalid_citations\");\n }\n const citObj = citationsRaw as Record<string, unknown>;\n const entries: CitationEntry[] = [];\n if (Array.isArray(citObj.entries)) {\n for (const raw of citObj.entries) {\n if (raw && typeof raw === \"object\" && !Array.isArray(raw)) {\n const e = raw as Record<string, unknown>;\n if (\n typeof e.path === \"string\" &&\n typeof e.lineStart === \"number\" &&\n typeof e.lineEnd === \"number\"\n ) {\n entries.push({\n path: e.path,\n lineStart: e.lineStart,\n lineEnd: e.lineEnd,\n note: typeof e.note === \"string\" ? e.note : \"\",\n });\n }\n }\n }\n }\n const rolloutIds: string[] = [];\n if (Array.isArray(citObj.rolloutIds)) {\n for (const id of citObj.rolloutIds) {\n if (typeof id === \"string\" && id.length > 0) {\n rolloutIds.push(id);\n }\n }\n }\n\n // Record usage: for each citation entry, try to increment usage on the\n // matching memory. The service exposes recordAccess for this purpose.\n // Pass authenticatedPrincipal so namespace ACL checks use the same\n // identity resolution as other write endpoints (Finding #1, issue #379).\n let matched = 0;\n let submitted = 0;\n if (typeof this.service.recordCitationUsage === \"function\") {\n const result = await this.service.recordCitationUsage({\n sessionId,\n namespace: this.resolveNamespace(req, namespace),\n authenticatedPrincipal: this.resolveRequestPrincipal(req),\n entries,\n rolloutIds,\n });\n submitted = result.submitted;\n matched = result.matched;\n }\n\n this.respondJson(res, 200, {\n ok: true,\n submitted,\n matched,\n entriesReceived: entries.length,\n rolloutIdsReceived: rolloutIds.length,\n });\n return;\n }\n\n this.respondJson(res, 404, { error: \"not_found\", code: \"not_found\" });\n }\n\n private async handleMcpRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const body = await this.readJsonBody(req);\n const request = body as {\n jsonrpc?: string;\n id?: string | number | null;\n method?: string;\n params?: Record<string, unknown>;\n };\n\n // Enforce write rate limiting for MCP tool calls that mutate state,\n // matching the same protection applied to the REST write endpoints.\n // Pre-check ensures capacity; post-check skips counting dry runs and\n // idempotency replays, consistent with the REST handlers.\n const isMcpWrite =\n request.method === \"tools/call\" &&\n typeof request.params?.name === \"string\" &&\n (request.params.name === \"engram.memory_store\" || request.params.name === \"engram.suggestion_submit\" || request.params.name === \"engram.observe\");\n if (isMcpWrite) {\n this.ensureWriteRateLimitAvailable();\n }\n\n const sessionId = (() => {\n const raw = req.headers[\"mcp-session-id\"];\n return typeof raw === \"string\" ? raw.trim() : undefined;\n })();\n const mcpCorrelationId = correlationIdStore.getStore() ?? randomUUID();\n const response = await this.mcpServer.handleRequest(request, {\n principalOverride: this.resolveRequestPrincipal(req),\n sessionId,\n correlationId: mcpCorrelationId,\n });\n\n if (isMcpWrite && response !== null) {\n const result = (response as Record<string, unknown>).result as Record<string, unknown> | undefined;\n const isError = result?.isError === true;\n const structured = result?.structuredContent as { dryRun?: boolean; idempotencyReplay?: boolean } | undefined;\n if (!isError && structured && this.shouldCountWriteRateLimit(structured)) {\n this.recordWriteRateLimitHit();\n }\n }\n if (response === null) {\n res.statusCode = 202;\n res.end();\n return;\n }\n // If this was an initialize response, pop the session ID keyed by\n // correlation ID (unique per HTTP request, not client-chosen JSON-RPC id).\n const assignedSessionId = this.mcpServer.popInitSessionId(mcpCorrelationId);\n if (assignedSessionId) {\n res.setHeader(\"mcp-session-id\", assignedSessionId);\n }\n this.respondJson(res, 200, response);\n }\n\n private respondJson(res: ServerResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload, null, 2);\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n const cid = correlationIdStore.getStore();\n if (cid) {\n res.setHeader(\"x-request-id\", cid);\n }\n res.end(body);\n }\n\n private async handleAdminConsole(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n ): Promise<boolean> {\n if (req.method !== \"GET\") return false;\n if (pathname === \"/engram/ui\" || pathname === \"/engram/ui/\") {\n await this.respondStatic(res, path.join(this.adminConsolePublicDir, \"index.html\"), \"text/html; charset=utf-8\");\n return true;\n }\n if (pathname === \"/engram/ui/app.js\") {\n await this.respondStatic(res, path.join(this.adminConsolePublicDir, \"app.js\"), \"application/javascript; charset=utf-8\");\n return true;\n }\n return false;\n }\n\n private async respondStatic(res: ServerResponse, filePath: string, contentType: string): Promise<void> {\n try {\n const body = await readFile(filePath, \"utf-8\");\n res.statusCode = 200;\n res.setHeader(\"content-type\", contentType);\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n res.end(body);\n } catch {\n this.respondJson(res, 404, { error: \"not_found\" });\n }\n }\n\n private async readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n let total = 0;\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n total += buffer.length;\n if (total > this.maxBodyBytes) {\n throw new HttpError(413, \"request_body_too_large\", \"request_body_too_large\");\n }\n chunks.push(buffer);\n }\n if (chunks.length === 0) return {};\n const raw = Buffer.concat(chunks).toString(\"utf-8\").trim();\n if (raw.length === 0) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new HttpError(400, \"invalid_json\", \"invalid_json\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new HttpError(400, \"invalid_json_object\", \"invalid_json_object\");\n }\n return parsed as Record<string, unknown>;\n }\n\n private async readValidatedBody<S extends SchemaName>(req: IncomingMessage, schemaName: S): Promise<SchemaTypeFor<S>> {\n const raw = await this.readJsonBody(req);\n const result = validateRequest(schemaName, raw);\n if (!result.success) {\n throw new HttpError(400, result.error.error, \"validation_error\", result.error.details);\n }\n return result.data as SchemaTypeFor<S>;\n }\n\n private isAuthorized(req: IncomingMessage): boolean {\n if (!this.authToken && this.authTokens.length === 0 && !this.authTokensGetter) return false;\n const raw = req.headers.authorization;\n if (!raw) return false;\n const separator = raw.indexOf(\" \");\n if (separator <= 0) return false;\n const scheme = raw.slice(0, separator).toLowerCase();\n if (scheme !== \"bearer\") return false;\n const token = raw.slice(separator + 1).trim();\n // Check primary token\n if (this.authToken && this.timingSafeStringEqual(token, this.authToken)) return true;\n // Check static multi-connector tokens\n for (const valid of this.authTokens) {\n if (this.timingSafeStringEqual(token, valid)) return true;\n }\n // Check dynamic tokens (reloaded per request for generate/revoke without restart)\n if (this.authTokensGetter) {\n for (const valid of this.authTokensGetter()) {\n if (this.timingSafeStringEqual(token, valid)) return true;\n }\n }\n return false;\n }\n\n private timingSafeStringEqual(a: string, b: string): boolean {\n const left = this.encodeSecret(a);\n const right = this.encodeSecret(b);\n if (!left || !right) return false;\n return timingSafeEqual(left, right);\n }\n\n private encodeSecret(value: string): Buffer | null {\n const encoded = Buffer.from(value, \"utf-8\");\n if (encoded.length > 1024) return null;\n const out = Buffer.alloc(2 + 1024);\n out.writeUInt16BE(encoded.length, 0);\n encoded.copy(out, 2);\n return out;\n }\n\n private writeResponseStatus(response: { dryRun: boolean; status: string }): number {\n if (response.dryRun === true) return 200;\n if (response.status === \"stored\" || response.status === \"queued_for_review\") return 201;\n return 200;\n }\n\n private ensureWriteRateLimitAvailable(): void {\n const now = Date.now();\n while (\n this.writeRequestTimestamps.length > 0 &&\n now - (this.writeRequestTimestamps[0] ?? 0) > WRITE_RATE_LIMIT_WINDOW_MS\n ) {\n this.writeRequestTimestamps.shift();\n }\n if (this.writeRequestTimestamps.length >= WRITE_RATE_LIMIT_MAX_REQUESTS) {\n throw new HttpError(429, \"write_rate_limited\", \"write_rate_limited\");\n }\n }\n\n private recordWriteRateLimitHit(): void {\n this.writeRequestTimestamps.push(Date.now());\n }\n\n private shouldCountWriteRateLimit(response: { dryRun?: boolean; idempotencyReplay?: boolean }): boolean {\n return response.dryRun !== true && response.idempotencyReplay !== true;\n }\n}\n","/**\n * Adapter interface for external system identity resolution.\n *\n * Each adapter maps an external system's session/identity conventions\n * to Engram's namespace + principal model. Adapters are stateless and\n * lightweight — they don't manage lifecycles or load plugins.\n */\n\nexport interface AdapterContext {\n /** Raw HTTP headers from the incoming request */\n headers: Record<string, string | string[] | undefined>;\n /** MCP client info (from initialize handshake, if available) */\n clientInfo?: { name: string; version?: string };\n /** Explicit session key from request args */\n sessionKey?: string;\n}\n\nexport interface ResolvedIdentity {\n /** Engram namespace (scopes memory access) */\n namespace: string;\n /** Engram principal (authorization subject) */\n principal: string;\n /** Session key for continuity tracking */\n sessionKey?: string;\n /** Which adapter resolved this identity */\n adapterId: string;\n}\n\nexport interface EngramAdapter {\n /** Adapter identifier (e.g., \"claude-code\", \"codex\", \"hermes\", \"replit\") */\n readonly id: string;\n\n /** Whether this adapter recognizes the given request context */\n matches(context: AdapterContext): boolean;\n\n /** Map external session/identity to Engram namespace + principal */\n resolveIdentity(context: AdapterContext): ResolvedIdentity;\n}\n\n/**\n * Extract and trim a single header value from a headers record.\n * Returns undefined if the header is missing, empty, or all whitespace.\n */\nexport function headerValue(\n headers: Record<string, string | string[] | undefined>,\n key: string,\n): string | undefined {\n const raw = headers[key];\n const value = Array.isArray(raw) ? raw[0] : raw;\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n","import { headerValue, type AdapterContext, type EngramAdapter, type ResolvedIdentity } from \"./types.js\";\n\n/**\n * Claude Code adapter.\n *\n * Detection: Claude Code sends clientInfo.name = \"claude-code\" in the\n * MCP initialize handshake, and User-Agent: claude-code/<version> in\n * HTTP requests. Project path is available via MCP ListRoots capability\n * (server receives the cwd as a file:// URI root), not via headers.\n *\n * For HTTP REST (non-MCP) requests, detection relies on User-Agent or\n * user-configured X-Engram-Client-Id header in .claude.json headers.\n *\n * Namespace/principal can be set by configuring custom headers in\n * .claude.json or .mcp.json:\n * \"headers\": { \"X-Engram-Namespace\": \"my-project\", \"X-Engram-Principal\": \"my-team\" }\n */\nexport class ClaudeCodeAdapter implements EngramAdapter {\n readonly id = \"claude-code\";\n\n matches(context: AdapterContext): boolean {\n // Primary: MCP clientInfo from initialize handshake (exact match)\n if (context.clientInfo?.name === \"claude-code\") return true;\n\n // Fallback: User-Agent header (Claude Code sends \"claude-code/<version>\")\n const ua = headerValue(context.headers, \"user-agent\");\n if (ua && ua.toLowerCase().startsWith(\"claude-code/\")) return true;\n\n // Fallback: user-configured client identifier header\n const clientId = headerValue(context.headers, \"x-engram-client-id\");\n if (clientId?.toLowerCase() === \"claude-code\") return true;\n\n return false;\n }\n\n resolveIdentity(context: AdapterContext): ResolvedIdentity {\n // MCP session ID (standard MCP header, server-assigned)\n const mcpSessionId = headerValue(context.headers, \"mcp-session-id\");\n\n // Principal: explicit header > default\n const principal = headerValue(context.headers, \"x-engram-principal\")\n || \"claude-code\";\n\n // Namespace: explicit header > default\n const namespace = headerValue(context.headers, \"x-engram-namespace\")\n || \"claude-code\";\n\n return {\n namespace,\n principal,\n sessionKey: mcpSessionId ?? context.sessionKey,\n adapterId: this.id,\n };\n }\n}\n\n","import { headerValue, type AdapterContext, type EngramAdapter, type ResolvedIdentity } from \"./types.js\";\n\n/**\n * Codex CLI adapter.\n *\n * Detection: Codex CLI sends clientInfo.name = \"codex-mcp-client\" and\n * clientInfo.title = \"Codex\" in the MCP initialize handshake. It does\n * NOT send agent names, session IDs, or project context automatically.\n *\n * For Streamable HTTP transport, Codex supports custom headers via\n * http_headers in ~/.codex/config.toml:\n * [mcp_servers.engram]\n * url = \"http://localhost:4318/mcp\"\n * http_headers = { \"X-Engram-Namespace\" = \"my-project\", \"X-Engram-Principal\" = \"codex-agent\" }\n *\n * Codex also sends a custom \"sandbox_state\" RPC notification after\n * init with sandbox policy info (read-only/writable paths).\n */\nexport class CodexAdapter implements EngramAdapter {\n readonly id = \"codex\";\n\n matches(context: AdapterContext): boolean {\n // Primary: MCP clientInfo from initialize handshake (exact match)\n if (context.clientInfo?.name === \"codex-mcp-client\") return true;\n\n // Also match on clientInfo name containing \"codex\" for forward compat\n const clientName = context.clientInfo?.name?.toLowerCase() ?? \"\";\n if (clientName.includes(\"codex\") && clientName !== \"codex-mcp-client\") return true;\n\n // Fallback: user-configured client identifier header\n const clientId = headerValue(context.headers, \"x-engram-client-id\");\n if (clientId?.toLowerCase() === \"codex\") return true;\n\n return false;\n }\n\n resolveIdentity(context: AdapterContext): ResolvedIdentity {\n // MCP session ID (standard MCP header, server-assigned)\n const mcpSessionId = headerValue(context.headers, \"mcp-session-id\");\n\n // Principal: explicit header > default\n const principal = headerValue(context.headers, \"x-engram-principal\")\n || \"codex\";\n\n // Namespace: explicit header > default\n const namespace = headerValue(context.headers, \"x-engram-namespace\")\n || \"codex\";\n\n return {\n namespace,\n principal,\n sessionKey: mcpSessionId ?? context.sessionKey,\n adapterId: this.id,\n };\n }\n}\n\n","import { headerValue, type AdapterContext, type EngramAdapter, type ResolvedIdentity } from \"./types.js\";\n\n/**\n * Replit Agent adapter.\n *\n * Detection: Replit Agent supports MCP natively (HTTP-only, configured\n * via the Integrations pane). It does NOT send identifying headers\n * automatically — detection relies on user-configured custom headers\n * in Replit's MCP Integrations UI.\n *\n * Replit provides env vars to running code (REPL_ID, REPL_OWNER,\n * REPL_SLUG) but these are NOT sent as HTTP headers to MCP servers.\n *\n * To identify Replit connections, users should configure a custom header\n * in the Replit Integrations pane when adding the Engram MCP server:\n * Header Name: X-Engram-Client-Id\n * Header Value: replit\n *\n * Optionally also set X-Engram-Namespace and X-Engram-Principal for\n * project/user scoping.\n */\nexport class ReplitAdapter implements EngramAdapter {\n readonly id = \"replit\";\n\n matches(context: AdapterContext): boolean {\n // Primary: user-configured client identifier header\n const clientId = headerValue(context.headers, \"x-engram-client-id\");\n if (clientId?.toLowerCase() === \"replit\") return true;\n\n // MCP clientInfo (Replit's MCP client name is not publicly documented,\n // but check for it in case it becomes available)\n const clientName = context.clientInfo?.name?.toLowerCase() ?? \"\";\n if (clientName.includes(\"replit\")) return true;\n\n return false;\n }\n\n resolveIdentity(context: AdapterContext): ResolvedIdentity {\n const mcpSessionId = headerValue(context.headers, \"mcp-session-id\");\n\n const principal = headerValue(context.headers, \"x-engram-principal\")\n || \"replit-agent\";\n\n const namespace = headerValue(context.headers, \"x-engram-namespace\")\n || \"replit\";\n\n return {\n namespace,\n principal,\n sessionKey: mcpSessionId ?? context.sessionKey,\n adapterId: this.id,\n };\n }\n}\n\n","import { headerValue, type AdapterContext, type EngramAdapter, type ResolvedIdentity } from \"./types.js\";\n\n/**\n * Hermes Agent adapter.\n *\n * Detection: Hermes supports both MCP (via config.yaml mcp_servers)\n * and a dedicated MemoryProvider plugin protocol (Python). The MCP\n * client name is not yet publicly documented, so detection uses:\n *\n * 1. X-Hermes-Session-Id header — confirmed in v0.7.0 API server\n * 2. User-configured headers in Hermes MCP config:\n * mcp_servers:\n * engram:\n * url: \"http://localhost:4318/mcp\"\n * headers:\n * X-Engram-Client-Id: \"hermes\"\n * X-Engram-Namespace: \"my-profile\"\n * 3. MCP clientInfo name containing \"hermes\" (for forward compat)\n *\n * Hermes profiles isolate agent state under ~/.hermes/profiles/<name>/.\n * Each profile can map to a separate Engram namespace via the\n * X-Engram-Namespace header.\n *\n * For deeper integration, Hermes v0.7.0+ supports MemoryProvider\n * plugins (Python protocol with initialize/enrich_turn/sync_turn/\n * shutdown). A Python Engram MemoryProvider plugin would be the\n * optimal integration path — see docs/integration/hermes-setup.md.\n */\nexport class HermesAdapter implements EngramAdapter {\n readonly id = \"hermes\";\n\n matches(context: AdapterContext): boolean {\n // Confirmed header from Hermes v0.7.0 API server\n if (headerValue(context.headers, \"x-hermes-session-id\")) return true;\n\n // User-configured client identifier header\n const clientId = headerValue(context.headers, \"x-engram-client-id\");\n if (clientId?.toLowerCase() === \"hermes\") return true;\n\n // MCP clientInfo (for forward compat when Hermes documents its name)\n const clientName = context.clientInfo?.name?.toLowerCase() ?? \"\";\n if (clientName.includes(\"hermes\")) return true;\n\n return false;\n }\n\n resolveIdentity(context: AdapterContext): ResolvedIdentity {\n const sessionId = headerValue(context.headers, \"x-hermes-session-id\");\n\n const principal = headerValue(context.headers, \"x-engram-principal\")\n || \"hermes-agent\";\n\n const namespace = headerValue(context.headers, \"x-engram-namespace\")\n || \"hermes\";\n\n return {\n namespace,\n principal,\n sessionKey: sessionId ?? context.sessionKey,\n adapterId: this.id,\n };\n }\n}\n\n","import type { AdapterContext, EngramAdapter, ResolvedIdentity } from \"./types.js\";\nimport { ClaudeCodeAdapter } from \"./claude-code.js\";\nimport { CodexAdapter } from \"./codex.js\";\nimport { ReplitAdapter } from \"./replit.js\";\nimport { HermesAdapter } from \"./hermes.js\";\n\n/**\n * Adapter registry. Attempts to identify which external system is\n * connecting by checking each registered adapter in order. Falls back\n * to explicit namespace/principal from the request args.\n */\nexport class AdapterRegistry {\n private readonly adapters: EngramAdapter[];\n\n constructor(adapters?: EngramAdapter[]) {\n this.adapters = adapters ?? [\n new HermesAdapter(),\n new ReplitAdapter(),\n new CodexAdapter(),\n new ClaudeCodeAdapter(),\n ];\n }\n\n /**\n * Try each adapter in order. Return the first match, or null if\n * no adapter recognizes the request context.\n */\n resolve(context: AdapterContext): ResolvedIdentity | null {\n for (const adapter of this.adapters) {\n if (adapter.matches(context)) {\n return adapter.resolveIdentity(context);\n }\n }\n return null;\n }\n\n /** List registered adapter IDs */\n list(): string[] {\n return this.adapters.map((a) => a.id);\n }\n}\n"],"mappings":"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","names":[]}