feat(ipuaro): add context configuration

- Add ContextConfigSchema with systemPromptTokens, maxContextUsage, autoCompressAt, compressionMethod
- Update ContextManager to read compression threshold from config
- Update HandleMessage and useSession to pass context config
- Add 40 unit tests (32 schema + 8 integration)
- Coverage: 97.63% lines, 91.34% branches
This commit is contained in:
imfozilbek
2025-12-02 02:02:34 +05:00
parent 98b365bd94
commit fa647c41aa
8 changed files with 371 additions and 9 deletions

View File

@@ -2,6 +2,7 @@ import type { ContextState, Session } from "../../domain/entities/Session.js"
import type { ILLMClient } from "../../domain/services/ILLMClient.js"
import { type ChatMessage, createSystemMessage } from "../../domain/value-objects/ChatMessage.js"
import { CONTEXT_COMPRESSION_THRESHOLD, CONTEXT_WINDOW_SIZE } from "../../domain/constants/index.js"
import type { ContextConfig } from "../../shared/constants/config.js"
/**
* File in context with token count.
@@ -39,9 +40,13 @@ export class ContextManager {
private readonly filesInContext = new Map<string, FileContext>()
private currentTokens = 0
private readonly contextWindowSize: number
private readonly compressionThreshold: number
private readonly compressionMethod: "llm-summary" | "truncate"
constructor(contextWindowSize: number = CONTEXT_WINDOW_SIZE) {
constructor(contextWindowSize: number = CONTEXT_WINDOW_SIZE, config?: ContextConfig) {
this.contextWindowSize = contextWindowSize
this.compressionThreshold = config?.autoCompressAt ?? CONTEXT_COMPRESSION_THRESHOLD
this.compressionMethod = config?.compressionMethod ?? "llm-summary"
}
/**
@@ -97,7 +102,7 @@ export class ContextManager {
* Check if compression is needed.
*/
needsCompression(): boolean {
return this.getUsage() > CONTEXT_COMPRESSION_THRESHOLD
return this.getUsage() > this.compressionThreshold
}
/**