feat(core): Unified Context Management and Tool Distillation. (#24157)

This commit is contained in:
joshualitt
2026-03-30 15:29:59 -07:00
committed by GitHub
parent 117a2d3844
commit dfba0e91e2
22 changed files with 1717 additions and 314 deletions

View File

@@ -11,6 +11,7 @@ import { inspect } from 'node:util';
import process from 'node:process';
import { z } from 'zod';
import type { ConversationRecord } from '../services/chatRecordingService.js';
import type { AgentHistoryProviderConfig } from '../services/types.js';
export type { ConversationRecord };
import {
AuthType,
@@ -204,6 +205,23 @@ export interface OutputSettings {
format?: OutputFormat;
}
export interface ContextManagementConfig {
enabled: boolean;
historyWindow: {
maxTokens: number;
retainedTokens: number;
};
messageLimits: {
normalMaxTokens: number;
retainedMaxTokens: number;
normalizationHeadRatio: number;
};
toolDistillation: {
maxOutputTokens: number;
summarizationThresholdTokens: number;
};
}
export interface ToolOutputMaskingConfig {
enabled: boolean;
toolProtectionThreshold: number;
@@ -674,6 +692,7 @@ export interface ConfigParameters {
enableHooks?: boolean;
enableHooksUI?: boolean;
experiments?: Experiments;
contextManagement?: Partial<ContextManagementConfig>;
hooks?: { [K in HookEventName]?: HookDefinition[] };
disabledHooks?: string[];
projectHooks?: { [K in HookEventName]?: HookDefinition[] };
@@ -683,6 +702,7 @@ export interface ConfigParameters {
disabledSkills?: string[];
adminSkillsEnabled?: boolean;
experimentalJitContext?: boolean;
autoDistillation?: boolean;
experimentalMemoryManager?: boolean;
experimentalAgentHistoryTruncation?: boolean;
experimentalAgentHistoryTruncationThreshold?: number;
@@ -919,13 +939,8 @@ export class Config implements McpContext, AgentLoopContext {
private readonly skillsSupport: boolean;
private disabledSkills: string[];
private readonly adminSkillsEnabled: boolean;
private readonly experimentalJitContext: boolean;
private readonly experimentalMemoryManager: boolean;
private readonly experimentalAgentHistoryTruncation: boolean;
private readonly experimentalAgentHistoryTruncationThreshold: number;
private readonly experimentalAgentHistoryRetainedMessages: number;
private readonly experimentalAgentHistorySummarization: boolean;
private readonly memoryBoundaryMarkers: readonly string[];
private readonly topicUpdateNarration: boolean;
private readonly disableLLMCorrection: boolean;
@@ -934,6 +949,7 @@ export class Config implements McpContext, AgentLoopContext {
private readonly planModeRoutingEnabled: boolean;
private readonly modelSteering: boolean;
private contextManager?: ContextManager;
private readonly contextManagement: ContextManagementConfig;
private terminalBackground: string | undefined = undefined;
private remoteAdminSettings: AdminControlsSettings | undefined;
private latestApiRequest: GenerateContentParameters | undefined;
@@ -1136,15 +1152,31 @@ export class Config implements McpContext, AgentLoopContext {
this.experimentalJitContext = params.experimentalJitContext ?? true;
this.experimentalMemoryManager = params.experimentalMemoryManager ?? false;
this.experimentalAgentHistoryTruncation =
params.experimentalAgentHistoryTruncation ?? false;
this.experimentalAgentHistoryTruncationThreshold =
params.experimentalAgentHistoryTruncationThreshold ?? 30;
this.experimentalAgentHistoryRetainedMessages =
params.experimentalAgentHistoryRetainedMessages ?? 15;
this.experimentalAgentHistorySummarization =
params.experimentalAgentHistorySummarization ?? false;
this.memoryBoundaryMarkers = params.memoryBoundaryMarkers ?? ['.git'];
this.contextManagement = {
enabled: params.contextManagement?.enabled ?? false,
historyWindow: {
maxTokens: params.contextManagement?.historyWindow?.maxTokens ?? 150000,
retainedTokens:
params.contextManagement?.historyWindow?.retainedTokens ?? 40000,
},
messageLimits: {
normalMaxTokens:
params.contextManagement?.messageLimits?.normalMaxTokens ?? 2500,
retainedMaxTokens:
params.contextManagement?.messageLimits?.retainedMaxTokens ?? 12000,
normalizationHeadRatio:
params.contextManagement?.messageLimits?.normalizationHeadRatio ??
0.25,
},
toolDistillation: {
maxOutputTokens:
params.contextManagement?.toolDistillation?.maxOutputTokens ?? 10000,
summarizationThresholdTokens:
params.contextManagement?.toolDistillation
?.summarizationThresholdTokens ?? 20000,
},
};
this.topicUpdateNarration = params.topicUpdateNarration ?? false;
this.modelSteering = params.modelSteering ?? false;
this.injectionService = new InjectionService(() =>
@@ -2330,6 +2362,10 @@ export class Config implements McpContext, AgentLoopContext {
return this.experimentalJitContext;
}
isAutoDistillationEnabled(): boolean {
return this.contextManagement.enabled;
}
getMemoryBoundaryMarkers(): readonly string[] {
return this.memoryBoundaryMarkers;
}
@@ -2338,20 +2374,22 @@ export class Config implements McpContext, AgentLoopContext {
return this.experimentalMemoryManager;
}
isExperimentalAgentHistoryTruncationEnabled(): boolean {
return this.experimentalAgentHistoryTruncation;
getContextManagementConfig(): ContextManagementConfig {
return this.contextManagement;
}
getExperimentalAgentHistoryTruncationThreshold(): number {
return this.experimentalAgentHistoryTruncationThreshold;
}
getExperimentalAgentHistoryRetainedMessages(): number {
return this.experimentalAgentHistoryRetainedMessages;
}
isExperimentalAgentHistorySummarizationEnabled(): boolean {
return this.experimentalAgentHistorySummarization;
get agentHistoryProviderConfig(): AgentHistoryProviderConfig {
return {
isTruncationEnabled: this.contextManagement.enabled,
isSummarizationEnabled: this.contextManagement.enabled,
maxTokens: this.contextManagement.historyWindow.maxTokens,
retainedTokens: this.contextManagement.historyWindow.retainedTokens,
normalMessageTokens: this.contextManagement.messageLimits.normalMaxTokens,
maximumMessageTokens:
this.contextManagement.messageLimits.retainedMaxTokens,
normalizationHeadRatio:
this.contextManagement.messageLimits.normalizationHeadRatio,
};
}
isTopicUpdateNarrationEnabled(): boolean {
@@ -3241,6 +3279,14 @@ export class Config implements McpContext, AgentLoopContext {
);
}
getToolMaxOutputTokens(): number {
return this.contextManagement.toolDistillation.maxOutputTokens;
}
getToolSummarizationThresholdTokens(): number {
return this.contextManagement.toolDistillation.summarizationThresholdTokens;
}
getNextCompressionTruncationId(): number {
return ++this.compressionTruncationCounter;
}