lemura 1.5.2 → 1.5.4

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/errors.ts","../src/types/logger.ts","../src/adapters/OpenAICompatibleAdapter.ts","../src/context/ContextManager.ts","../src/context/SandwichCompressionStrategy.ts","../src/context/HistoryCompressionStrategy.ts","../src/context/SummaryInjectionStrategy.ts","../src/context/ShortTermMemoryRegistry.ts","../src/context/InMemoryStorageAdapter.ts","../src/context/InMemoryScratchpadAdapter.ts","../src/tools/SchemaValidator.ts","../src/tools/ToolRegistry.ts","../src/tools/ToolFirewall.ts","../src/media/MediaBridge.ts","../src/skills/SkillInjector.ts","../src/rag/InMemoryRAGAdapter.ts","../src/logger/DefaultLogger.ts","../src/tools/builtin/short_term_memory.ts","../src/tools/builtin/media.ts","../src/agent/execution/StepCounter.ts","../src/agent/execution/FinalResponseFormatter.ts","../src/agent/execution/ToolResponseProcessor.ts","../src/agent/execution/GoalInjector.ts","../src/agent/execution/ContinuationPlanner.ts","../src/mcp/MCPClient.ts","../src/mcp/MCPClientRegistry.ts","../src/agent/SessionManager.ts"],"names":["LogLevel","randomUUID","spawn","changed"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base class for all custom errors thrown by lemura.\n *\n * @example\n * throw new LemuraError('Something went wrong', 'UNKNOWN_ERROR');\n */\nexport class LemuraError extends Error {\n /**\n * @param message - The error message\n * @param code - The error code for programmatic handling\n * @param problem - A clear description of the problem for the end user\n * @param hints - A list of suggestions to resolve the issue\n */\n constructor(\n message: string,\n public readonly code: string,\n public readonly problem?: string,\n public readonly hints: string[] = []\n ) {\n super(message);\n this.name = 'LemuraError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Error thrown when context exceeds max tokens and cannot be compressed further */\nexport class LemuraContextOverflowError extends LemuraError {\n constructor(message: string) {\n super(message, 'CONTEXT_OVERFLOW');\n this.name = 'LemuraContextOverflowError';\n }\n}\n\n/** Error thrown when a requested tool is not found in the registry */\nexport class LemuraToolNotFoundError extends LemuraError {\n constructor(message: string) {\n super(message, 'TOOL_NOT_FOUND');\n this.name = 'LemuraToolNotFoundError';\n }\n}\n\n/** Error thrown when an adapter encounters an API or formatting issue */\nexport class LemuraAdapterError extends LemuraError {\n constructor(\n message: string,\n code = 'ADAPTER_ERROR',\n public cause?: any,\n problem?: string,\n hints: string[] = []\n ) {\n super(message, code, problem, hints);\n this.name = 'LemuraAdapterError';\n }\n}\n\n/** Error thrown when a skill cannot be parsed or injected */\nexport class LemuraSkillInjectionError extends LemuraError {\n constructor(message: string) {\n super(message, 'SKILL_INJECTION_FAILED');\n this.name = 'LemuraSkillInjectionError';\n }\n}\n\n/** Error thrown when the ReAct loop exceeds the configured max iterations */\nexport class LemuraMaxIterationsError extends LemuraError {\n constructor(message: string) {\n super(message, 'MAX_ITERATIONS_EXCEEDED');\n this.name = 'LemuraMaxIterationsError';\n }\n}\n\n/** Error thrown when tool parameters fail JSON schema validation */\nexport class LemuraToolValidationError extends LemuraError {\n constructor(message: string) {\n super(message, 'TOOL_VALIDATION_FAILED');\n this.name = 'LemuraToolValidationError';\n }\n}\n\n/** Error thrown when a tool execute function exceeds its timeout */\nexport class LemuraToolTimeoutError extends LemuraError {\n constructor(message: string) {\n super(message, 'TOOL_TIMEOUT');\n this.name = 'LemuraToolTimeoutError';\n }\n}\n\n/** Base error thrown for any MCP server communication failure */\nexport class LemuraMCPError extends LemuraError {\n constructor(message: string, code = 'MCP_ERROR', problem?: string, hints: string[] = []) {\n super(message, code, problem, hints);\n this.name = 'LemuraMCPError';\n }\n}\n\n/** Error thrown when an MCP server cannot be connected to (spawn failure, network error, init failure) */\nexport class LemuraMCPConnectionError extends LemuraMCPError {\n constructor(message: string, problem?: string, hints: string[] = []) {\n super(message, 'MCP_CONNECTION_FAILED', problem, hints);\n this.name = 'LemuraMCPConnectionError';\n }\n}\n\n/** Error thrown when a call to an MCP server tool exceeds the configured timeout */\nexport class LemuraMCPTimeoutError extends LemuraMCPError {\n constructor(message: string) {\n super(message, 'MCP_TOOL_TIMEOUT');\n this.name = 'LemuraMCPTimeoutError';\n }\n}\n","/** Log levels supported by lemura */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n FATAL = 4,\n}\n\n/** Severity levels for user-facing logs */\nexport type Severity = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'FATAL';\n\n/** Metadata for structured logging and error reporting */\nexport interface LogMetadata {\n problem?: string;\n hints?: string[];\n severity?: Severity;\n [key: string]: unknown;\n}\n\n/**\n * Enhanced logger interface for lemura.\n * Supports structured logging with problems and hints.\n */\nexport interface ILogger {\n /** Log a debug message (trace-level details) */\n debug(message: string, metadata?: LogMetadata): void;\n /** Log an informational message */\n info(message: string, metadata?: LogMetadata): void;\n /** Log a warning */\n warn(message: string, metadata?: LogMetadata): void;\n /** Log an error */\n error(message: string, metadata?: LogMetadata): void;\n /** Log a fatal error that prevents execution */\n fatal(message: string, metadata?: LogMetadata): void;\n\n /** Set the minimum log level to display */\n setLevel(level: LogLevel): void;\n}\n","import {\n IProviderAdapter,\n CompletionRequest,\n CompletionResponse,\n CompletionChunk,\n NormalizedMessage,\n TranscriptionRequest,\n TranscriptionResponse,\n SynthesisRequest,\n AudioChunk,\n VisionRequest,\n VisionResponse,\n ImageGenRequest,\n ImageGenResponse,\n ModelInfo,\n LemuraAdapterError,\n} from '../types/index.js';\n\nexport interface RetryConfig {\n maxRetries: number;\n baseDelayMs: number;\n}\n\nexport interface OpenAICompatibleAdapterConfig {\n baseUrl?: string;\n apiKey?: string;\n defaultModel?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n retry?: RetryConfig;\n}\n\n/**\n * Reference implementation of an OpenAI-compatible provider adapter.\n */\nexport class OpenAICompatibleAdapter implements IProviderAdapter {\n readonly name = 'openai_compatible';\n readonly version = '1.2.0';\n\n private baseUrl: string;\n private apiKey: string;\n private defaultModel: string;\n private defaultHeaders: Record<string, string>;\n private timeoutMs: number;\n private retryConfig: RetryConfig;\n\n constructor(config: OpenAICompatibleAdapterConfig = {}) {\n this.baseUrl = (\n config.baseUrl ??\n process.env.LEMURA_BASE_URL ??\n process.env.OPENAI_BASE_URL ??\n 'https://api.openai.com/v1'\n ).replace(/\\/$/, '');\n\n this.apiKey = config.apiKey ?? process.env.LEMURA_API_KEY ?? process.env.OPENAI_API_KEY ?? '';\n this.defaultModel = config.defaultModel ?? process.env.LEMURA_MODEL ?? process.env.OPENAI_MODEL ?? 'gpt-3.5-turbo';\n\n this.defaultHeaders = config.defaultHeaders || {};\n this.timeoutMs = config.timeout || 30000;\n this.retryConfig = config.retry || { maxRetries: 2, baseDelayMs: 1000 };\n }\n\n private async fetchWithRetry(url: string, init: RequestInit): Promise<Response> {\n let attempts = 0;\n while (attempts <= this.retryConfig.maxRetries) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.apiKey}`,\n ...this.defaultHeaders,\n };\n\n if (init.headers) {\n Object.assign(headers, init.headers);\n }\n\n // Don't set Content-Type if it's 'unset' (for FormData)\n if (headers['Content-Type'] === 'unset') {\n delete headers['Content-Type'];\n } else if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n ...init,\n signal: controller.signal,\n headers,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) return response;\n\n // Retry on 429 and 503\n if ((response.status === 429 || response.status === 503) && attempts < this.retryConfig.maxRetries) {\n attempts++;\n const delay = this.retryConfig.baseDelayMs * Math.pow(2, attempts - 1);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n const errorText = await response.text().catch(() => '');\n let problem = 'The server replied with an error during the API call.';\n let hints = ['Check the API documentation for the provider you are using.'];\n\n if (response.status === 401) {\n problem = 'Authentication failed. The API key is invalid or missing.';\n hints = [\n 'Ensure your API key is correctly configured in the adapter or environment variables.',\n 'Check if the API key has expired or been revoked.'\n ];\n } else if (response.status === 404) {\n problem = 'The requested resource or model was not found.';\n hints = [\n 'Verify that the baseUrl is correct (e.g., https://api.openai.com/v1).',\n 'Check if the model name is correct and available for your account.',\n 'Ensure you are not appending extra paths to the baseUrl.'\n ];\n } else if (response.status === 429) {\n problem = 'Rate limit exceeded.';\n hints = [\n 'Wait a few seconds before retrying.',\n 'Check your usage limits and billing status on the provider dashboard.'\n ];\n }\n\n throw new LemuraAdapterError(\n `HTTP ${response.status}: ${errorText}`,\n 'HTTP_ERROR',\n { status: response.status, body: errorText },\n problem,\n hints\n );\n } catch (err) {\n if (err instanceof LemuraAdapterError) throw err;\n\n if (attempts < this.retryConfig.maxRetries) {\n attempts++;\n const delay = this.retryConfig.baseDelayMs * Math.pow(2, attempts - 1);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n throw new LemuraAdapterError(\n `Network request failed: ${err instanceof Error ? err.message : String(err)}`,\n 'NETWORK_ERROR',\n err,\n 'A network error occurred while connecting to the provider.',\n [\n 'Check your internet connection.',\n 'Verify that the baseUrl is reachable from your network.',\n 'Check for proxy or firewall settings that might block the request.'\n ]\n );\n }\n }\n throw new LemuraAdapterError(\n 'Max retries exceeded',\n 'MAX_RETRIES',\n undefined,\n 'The request failed after multiple retry attempts.',\n ['Check if the provider service is down or experiencing high load.']\n );\n }\n\n private mapFinishReason(reason: string | null): CompletionResponse['finishReason'] {\n if (!reason) return 'stop';\n const r = reason.toLowerCase();\n if (r === 'tool_calls' || r === 'tool_call') return 'tool_call';\n if (r === 'length' || r === 'max_tokens') return 'max_tokens';\n if (r === 'content_filter' || r === 'error') return 'error';\n return 'stop';\n }\n\n private toOpenAIMessages(messages: NormalizedMessage[]): unknown[] {\n return messages.map(msg => {\n if (msg.role === 'assistant' && msg.toolCalls?.length) {\n return {\n role: 'assistant',\n content: msg.content || null,\n tool_calls: msg.toolCalls.map((tc: { id: string; name: string; arguments: string }) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments),\n },\n })),\n };\n }\n if (msg.role === 'tool') {\n // lemura's buildMessages() puts the toolCallId in msg.name\n return {\n role: 'tool',\n tool_call_id: msg.name,\n content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),\n };\n }\n return msg;\n });\n }\n\n /**\n * Returns true for reasoning/o-series models (o1, o3, o4, gpt-5, *-mini variants).\n * These models use `max_completion_tokens` instead of `max_tokens` and do not\n * support sampling hyperparameters (temperature, top_p, presence_penalty, frequency_penalty).\n */\n private isReasoningModel(model: string): boolean {\n return /\\bo[1-9]\\b|\\bo[1-9]-|\\bgpt-5\\b|(?:^|[-_])mini(?:$|[-_])/i.test(model);\n }\n\n private buildPayload(request: CompletionRequest): unknown {\n const model = request.model || this.defaultModel;\n const reasoning = this.isReasoningModel(model);\n\n const payload: Record<string, unknown> = {\n model,\n messages: this.toOpenAIMessages(request.messages),\n };\n\n if (request.maxTokens !== undefined) {\n // Reasoning models require max_completion_tokens; standard models use max_tokens\n payload[reasoning ? 'max_completion_tokens' : 'max_tokens'] = request.maxTokens;\n }\n\n if (!reasoning) {\n // Sampling params are unsupported on reasoning models — omit entirely to avoid API errors\n if (request.temperature !== undefined) payload.temperature = request.temperature;\n }\n\n if (request.stopSequences?.length) payload.stop = request.stopSequences;\n if (request.stream) payload.stream = true;\n\n if (request.tools && request.tools.length > 0) {\n payload.tools = request.tools.map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }\n }));\n }\n\n return payload;\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const payload = this.buildPayload(request);\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n\n const data = await response.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new LemuraAdapterError('Invalid response format: missing choices', 'INVALID_RESPONSE', data);\n }\n\n const message = choice.message;\n let toolCalls;\n\n if (message.tool_calls && message.tool_calls.length > 0) {\n toolCalls = message.tool_calls.map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n }));\n }\n\n return {\n content: message.content || '',\n toolCalls,\n finishReason: this.mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: data.usage?.prompt_tokens || 0,\n completionTokens: data.usage?.completion_tokens || 0,\n totalTokens: data.usage?.total_tokens || 0,\n },\n rawResponse: data\n };\n }\n\n async *stream(request: CompletionRequest): AsyncIterable<CompletionChunk> {\n const payload = this.buildPayload({ ...request, stream: true });\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n\n if (!response.body) {\n throw new LemuraAdapterError('Response body is null', 'STREAM_ERROR');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6);\n let data;\n try {\n data = JSON.parse(jsonStr);\n } catch (err) {\n continue;\n }\n\n const choice = data.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta?.content || '';\n const toolCallBlock = choice.delta?.tool_calls?.[0];\n let toolCallDelta;\n\n if (toolCallBlock) {\n toolCallDelta = {\n id: toolCallBlock.id,\n name: toolCallBlock.function?.name,\n arguments: toolCallBlock.function?.arguments,\n };\n }\n\n const isFinished = choice.finish_reason !== null && choice.finish_reason !== undefined;\n\n yield {\n delta,\n finished: isFinished,\n ...(toolCallDelta && { toolCallDelta }),\n ...(isFinished && { finishReason: this.mapFinishReason(choice.finish_reason) })\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n\n getModelInfo(): ModelInfo {\n return {\n supportsVision: true,\n supportsTools: true,\n contextWindow: 128000\n };\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const resp = await this.fetchWithRetry(`${this.baseUrl}/models`, { method: 'GET' });\n return resp.ok;\n } catch {\n return false;\n }\n }\n\n async transcribe(request: TranscriptionRequest): Promise<TranscriptionResponse> {\n const binaryString = atob(request.audioBase64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const blob = new Blob([bytes], { type: request.mimeType });\n const formData = new FormData();\n formData.append('file', blob, 'audio.webm');\n formData.append('model', request.model || 'whisper-1');\n if (request.language) formData.append('language', request.language);\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/audio/transcriptions`, {\n method: 'POST',\n body: formData,\n headers: {\n 'Content-Type': 'unset'\n }\n });\n\n const data = await response.json();\n return {\n transcript: data.text,\n confidence: 1.0, // OpenAI doesn't return confidence in standard response\n language: data.language || request.language || 'en'\n };\n }\n\n async *synthesize(request: SynthesisRequest): AsyncIterable<AudioChunk> {\n const response = await this.fetchWithRetry(`${this.baseUrl}/audio/speech`, {\n method: 'POST',\n body: JSON.stringify({\n model: request.model || 'tts-1',\n input: request.text,\n voice: request.voiceId || 'alloy',\n response_format: request.format || 'mp3'\n })\n });\n\n if (!response.body) throw new LemuraAdapterError('No response body for TTS', 'STREAM_ERROR');\n\n const reader = response.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n const binary = new TextDecoder('latin1').decode(value);\n yield { audioBase64: btoa(binary) };\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n async describeImage(request: VisionRequest): Promise<VisionResponse> {\n const payload = {\n model: request.model || this.defaultModel,\n messages: [\n {\n role: 'user',\n content: [\n { type: 'text', text: request.prompt || 'Describe this image' },\n {\n type: 'image_url',\n image_url: {\n url: `data:image/jpeg;base64,${request.imageBase64}`\n }\n }\n ]\n }\n ]\n };\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n\n const data = await response.json();\n return {\n description: data.choices[0].message.content,\n objects: [] // OpenAI doesn't return structured objects in standard vision call\n };\n }\n\n async generateImage(request: ImageGenRequest): Promise<ImageGenResponse> {\n const response = await this.fetchWithRetry(`${this.baseUrl}/images/generations`, {\n method: 'POST',\n body: JSON.stringify({\n prompt: request.prompt,\n model: request.model || 'dall-e-3',\n n: 1,\n size: request.dimensions || '1024x1024'\n })\n });\n\n const data = await response.json();\n if (data?.error) {\n throw new LemuraAdapterError(data.error.message || 'Image generation failed', 'IMAGE_GEN_ERROR');\n }\n const first = data?.data?.[0] || {};\n const imageUrl =\n first.url ||\n (first.b64_json ? `data:image/png;base64,${first.b64_json}` : null) ||\n (first.image_url?.url || null);\n if (!imageUrl) {\n throw new LemuraAdapterError('Image generation returned no image URL or base64 payload', 'IMAGE_GEN_EMPTY');\n }\n return {\n imageUrl,\n revisedPrompt: first.revised_prompt\n };\n }\n}\n","import { ContextWindow, IContextStrategy, LemuraContextOverflowError } from '../types/index.js';\n\n/**\n * Orchestrates a stack of IContextStrategy implementations to keep the\n * token count within the maxTokens limit.\n */\nexport class ContextManager {\n private strategies: IContextStrategy[] = [];\n\n /**\n * Registers a new compression or pre-turn strategy and sorts the stack by priority.\n *\n * @param strategy - The strategy implementation to register\n */\n registerStrategy(strategy: IContextStrategy): void {\n this.strategies.push(strategy);\n this.strategies.sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * Applies all registered strategies that return true for `shouldApply()`\n * until the context token count is safely below the maximum budget.\n *\n * @param context - The context window to prepare\n * @param safetyMargin - Modifier applied to maxTokens (default: 0.95 -> 95%)\n * @returns A new ContextWindow object potentially compressed\n * @throws {LemuraContextOverflowError} If the context is still over maxTokens after all strategies\n */\n async prepare(context: ContextWindow, safetyMargin = 0.95): Promise<ContextWindow> {\n let currentCtx = { ...context, turns: [...context.turns] };\n\n // Recalculate token count from actual turns + system prompt so compression\n // strategies always see an up-to-date figure regardless of how callers\n // track incremental additions (they often forget to update tokenCount).\n const systemTokens = currentCtx.systemPrompt\n ? Math.ceil(currentCtx.systemPrompt.length / 4)\n : 0;\n currentCtx.tokenCount =\n currentCtx.turns.reduce((sum, t) => sum + t.tokenCount, 0) + systemTokens;\n\n const targetTokenCount = currentCtx.maxTokens * safetyMargin;\n\n for (const strategy of this.strategies) {\n // If we are below the limit and it's not a pre-turn non-reducing strategy, skip it.\n // E.g., SummaryInjectionStrategy might still want to run.\n // But purely compression ones drop out early in our base architecture if they choose in `shouldApply`.\n if (strategy.shouldApply(currentCtx)) {\n currentCtx = await strategy.apply(currentCtx);\n }\n }\n\n if (currentCtx.tokenCount > currentCtx.maxTokens) {\n throw new LemuraContextOverflowError(\n `Context overflowed: ${currentCtx.tokenCount} tokens > ${currentCtx.maxTokens}`\n );\n }\n\n return currentCtx;\n }\n}\n","import { ContextWindow, IContextStrategy, IProviderAdapter, Turn } from '../types/index.js';\n\nexport interface SandwichCompressionConfig {\n preserveFirst: number;\n preserveLast: number;\n /** Fire when context reaches this fraction of maxTokens (e.g. 0.80 = 80%). Default: 0.80 */\n triggerThreshold?: number;\n /** Max tokens for the generated summary turn. Default: unlimited */\n summaryMaxTokens?: number;\n /** Strategy execution priority — lower number runs first. Default: 20 */\n priority?: number;\n}\n\n/**\n * Sandwich compression preserves the beginning and end of the conversation,\n * replacing the middle with a generated summary.\n *\n * Pair with `SummaryInjectionStrategy` to ensure the compression summary is\n * visible to the model on every subsequent call.\n */\nexport class SandwichCompressionStrategy implements IContextStrategy {\n readonly name = 'sandwich_compression';\n readonly priority: number;\n\n constructor(\n private adapter: IProviderAdapter,\n private config: SandwichCompressionConfig\n ) {\n this.priority = config.priority ?? 20;\n }\n\n shouldApply(ctx: ContextWindow): boolean {\n const threshold = this.config.triggerThreshold ?? 0.80;\n return (\n ctx.tokenCount >= ctx.maxTokens * threshold &&\n ctx.turns.length > this.config.preserveFirst + this.config.preserveLast\n );\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n const { preserveFirst, preserveLast } = this.config;\n\n const head = ctx.turns.slice(0, preserveFirst);\n const tail = ctx.turns.slice(ctx.turns.length - preserveLast);\n const middle = ctx.turns.slice(preserveFirst, ctx.turns.length - preserveLast);\n\n const middleText = middle.map(t => `${t.role}: ${JSON.stringify(t.content)}`).join('\\n');\n\n const summaryResponse = await this.adapter.complete({\n model: '',\n messages: [{\n role: 'user',\n content: `Summarize the following conversation history briefly:\\n${middleText}`\n }],\n ...(this.config.summaryMaxTokens ? { maxTokens: this.config.summaryMaxTokens } : {})\n });\n\n const summaryStr = summaryResponse.content;\n\n const newCompressionSummary = ctx.compressionSummary\n ? `${ctx.compressionSummary}\\n${summaryStr}`\n : summaryStr;\n\n const summaryTurn: Turn = {\n role: 'system',\n content: `[COMPRESSED HISTORY SUMMARY]\\n${newCompressionSummary}`,\n tokenCount: this.adapter.estimateTokens(newCompressionSummary),\n turnIndex: -1,\n compressed: true,\n };\n\n const newTurns = [...head, summaryTurn, ...tail];\n const newTokenCount = newTurns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(ctx.systemPrompt) +\n this.adapter.estimateTokens(ctx.scratchpad);\n\n return {\n ...ctx,\n turns: newTurns,\n tokenCount: newTokenCount,\n compressionSummary: newCompressionSummary,\n };\n }\n\n /**\n * Applies sandwich compression specifically to a Short Term Memory item's content.\n * Implements a 3-layer pipeline: Pre-Layer (encoding), Core Layer (dense summary), Post-Layer (refinement cues).\n * \n * @param content - The heavy text content to compress\n * @param instructions - Guiding instructions for the core layer summary\n * @returns The three-layer sandwich result\n */\n async compressMemoryItem(content: string, instructions: string = 'Extract the key information'): Promise<{\n preLayer: string;\n coreLayer: string;\n postLayer: string;\n }> {\n // Pre-Layer: Chunking and initial encoding\n // Here we do a naive encoding representation to signify the pre-processed chunks\n const estimatedChunks = Math.max(1, Math.ceil(this.adapter.estimateTokens(content) / 2000));\n const preLayer = `[PRE-LAYER ENCODED: ${estimatedChunks} internal chunks]`;\n\n // Core Layer: Dense summary sandwich with instructions\n // We sandwich the content between the instructions to guide extraction\n // If content is extremely large, we might trim it here, but ideally the provider streaming handles it.\n const summaryResponse = await this.adapter.complete({\n model: '',\n messages: [{\n role: 'user',\n content: `### INSTRUCTIONS ###\\n${instructions}\\n\\n### CONTENT ###\\n${content}\\n\\n### INSTRUCTIONS ###\\n${instructions}`\n }]\n });\n const coreLayer = summaryResponse.content;\n\n // Post-Layer: Decoding/Refinement hooks\n // Indicates that the LLM can use tools to drill down into specific chunks\n const postLayer = `[POST-LAYER DECODING: Use \\`refine_layer\\` or \\`read_chunk\\` tools to expand specific sections]`;\n\n return { preLayer, coreLayer, postLayer };\n }\n}\n","import { ContextWindow, IContextStrategy, IProviderAdapter, Turn } from '../types/index.js';\n\n/**\n * ScratchpadStrategy manages the thinking process separate from the turn history.\n * It is primarily a marker/pre-turn strategy that ensures scratchpad gets tokenized properly\n * but is not compressed.\n */\nexport class ScratchpadStrategy implements IContextStrategy {\n readonly name = 'scratchpad_strategy';\n readonly priority = 10;\n\n shouldApply(ctx: ContextWindow): boolean {\n // Only apply if there's actual scratchpad content to track\n return ctx.scratchpad.length > 0;\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n // Basic implementation: we don't compress the scratchpad, we just ensure its tokens are counted\n return ctx;\n }\n}\n\nexport interface HistoryCompressionConfig {\n /** Number of oldest turns to summarize in each compression pass */\n windowSize: number;\n /** Fire when context reaches this fraction of maxTokens (e.g. 0.8 = 80%) */\n triggerAtPercent: number;\n /** Strategy execution priority — lower number runs first. Default: 30 */\n priority?: number;\n}\n\n/**\n * Summarizes the oldest N uncompressed turns using a rolling-window approach.\n *\n * Pair with `SummaryInjectionStrategy` (priority < this one) to ensure the\n * accumulated summary is re-injected before each provider call.\n */\nexport class HistoryCompressionStrategy implements IContextStrategy {\n readonly name = 'history_compression';\n readonly priority: number;\n\n constructor(\n private adapter: IProviderAdapter,\n private config: HistoryCompressionConfig\n ) {\n this.priority = config.priority ?? 30;\n }\n\n shouldApply(ctx: ContextWindow): boolean {\n const triggerTokens = ctx.maxTokens * this.config.triggerAtPercent;\n // Apply if we are over the trigger threshold and have at least enough turns\n // Ignore system prompts and already compressed turns\n const uncompressedTurns = ctx.turns.filter(t => t.role !== 'system' && !t.compressed);\n return ctx.tokenCount >= triggerTokens && uncompressedTurns.length > this.config.windowSize;\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n // Find the oldest N uncompressed turns that aren't the system prompt\n const uncompressedIndices = ctx.turns\n .map((t, i) => ({ t, i }))\n .filter(({ t }) => t.role !== 'system' && !t.compressed)\n .slice(0, this.config.windowSize);\n\n const targetTurns = uncompressedIndices.map(u => u.t);\n const middleText = targetTurns.map(t => `${t.role}: ${JSON.stringify(t.content)}`).join('\\n');\n\n const summaryResponse = await this.adapter.complete({\n model: '',\n messages: [{\n role: 'user',\n content: `Summarize the oldest part of this conversation:\\n${middleText}`\n }]\n });\n\n const summaryStr = summaryResponse.content;\n const newCompressionSummary = ctx.compressionSummary\n ? `${ctx.compressionSummary}\\n${summaryStr}`\n : summaryStr;\n\n // Filter out the summarized turns\n const indicesToRemove = new Set(uncompressedIndices.map(u => u.i));\n const newTurns = ctx.turns.filter((_, i) => !indicesToRemove.has(i));\n\n const TokenCount = newTurns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(ctx.systemPrompt) +\n this.adapter.estimateTokens(ctx.scratchpad);\n\n return {\n ...ctx,\n turns: newTurns,\n tokenCount: TokenCount,\n compressionSummary: newCompressionSummary,\n };\n }\n}\n","import { ContextWindow, IContextStrategy, Turn } from '../types/index.js';\n\nexport interface SummaryInjectionConfig {\n /** Strategy priority — lower number runs first. Default: 1 (runs before compression). */\n priority?: number;\n /** Label prepended to the injected summary block. */\n label?: string;\n}\n\n/**\n * SummaryInjectionStrategy ensures that whenever a `compressionSummary` exists on\n * the context window, it is re-injected as a synthetic system turn at the beginning\n * of the turn list before each provider call.\n *\n * **Why this matters:** `HistoryCompressionStrategy` and `SandwichCompressionStrategy`\n * store compressed context in `ctx.compressionSummary`, but without this strategy the\n * summary never reaches the model — the pruned turns are simply gone.\n *\n * Pair this with any compression strategy:\n *\n * @example\n * ```typescript\n * compressionStrategies: [\n * new SummaryInjectionStrategy({ priority: 1 }), // always runs first\n * new SandwichCompressionStrategy(adapter, { priority: 2, triggerThreshold: 0.80 }),\n * ]\n * ```\n *\n * The strategy is idempotent: if a summary turn already exists it is updated in-place\n * rather than appended again.\n */\nexport class SummaryInjectionStrategy implements IContextStrategy {\n readonly name = 'summary_injection';\n readonly priority: number;\n\n private readonly label: string;\n\n constructor(config: SummaryInjectionConfig = {}) {\n this.priority = config.priority ?? 1;\n this.label = config.label ?? 'Earlier conversation summary';\n }\n\n shouldApply(ctx: ContextWindow): boolean {\n return !!ctx.compressionSummary && ctx.compressionSummary.trim().length > 0;\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n const summaryContent = `[${this.label}]\\n${ctx.compressionSummary}`;\n const summaryTokenCount = Math.ceil(summaryContent.length / 4);\n\n // Check if a summary turn already exists (role=system, compressed=true at turnIndex=-1)\n const existingIndex = ctx.turns.findIndex(t => t.compressed && t.role === 'system' && t.turnIndex === -1);\n\n let newTurns: Turn[];\n\n if (existingIndex !== -1) {\n // Update the existing summary turn in-place\n newTurns = ctx.turns.map((t, i) => {\n if (i !== existingIndex) return t;\n return {\n ...t,\n content: summaryContent,\n tokenCount: summaryTokenCount,\n };\n });\n } else {\n // Prepend a new summary turn\n const summaryTurn: Turn = {\n role: 'system',\n content: summaryContent,\n tokenCount: summaryTokenCount,\n turnIndex: -1,\n compressed: true,\n };\n newTurns = [summaryTurn, ...ctx.turns];\n }\n\n // Recalculate token count\n const newTokenCount = newTurns.reduce((sum, t) => sum + t.tokenCount, 0);\n\n return {\n ...ctx,\n turns: newTurns,\n tokenCount: newTokenCount,\n };\n }\n}\n","import { IStorageAdapter, STMItem } from '../types/index.js';\nimport { randomUUID } from 'crypto';\n\nexport interface STMRegistryConfig {\n /**\n * The storage backend to use for Short Term Memory items.\n */\n storage: IStorageAdapter;\n\n /**\n * The maximum number of tokens allowed for a 'text' type STM item.\n * If an item exceeds this, it may be rejected or truncated.\n * Default: 100000\n */\n maxTextTokens?: number;\n}\n\n/**\n * Registry for Short Term Memory (STM).\n * Manages the storage and retrieval of large context variables like long texts or blobs.\n * Generates '[STM:uuid]' references to be used within the ReAct agent context.\n */\nexport class ShortTermMemoryRegistry {\n private storage: IStorageAdapter;\n private maxTextTokens: number;\n\n constructor(config: STMRegistryConfig) {\n this.storage = config.storage;\n this.maxTextTokens = config.maxTextTokens ?? 100000;\n }\n\n /**\n * Registers a new memory item and returns its reference string.\n * \n * @param content - The raw content to store\n * @param type - The type of content ('text' or 'blob')\n * @param metadata - Optional metadata (e.g. sandwich layers, original filename)\n * @param estimateTokens - Optional function to estimate token count for 'text' type\n * @returns A reference string formatted as '[STM:uuid]'\n * @throws {Error} if a text item exceeds the maxTextTokens limit\n */\n async register(\n content: any,\n type: 'text' | 'blob',\n metadata?: Record<string, unknown>,\n estimateTokens?: (text: string) => number\n ): Promise<string> {\n if (type === 'text') {\n const tokenCount = estimateTokens ? estimateTokens(content) : Math.ceil(String(content).length / 4);\n if (tokenCount > this.maxTextTokens) {\n throw new Error(`Text content exceeds max tokens limit of ${this.maxTextTokens} (estimated ${tokenCount})`);\n }\n }\n\n const id = randomUUID();\n const item: STMItem = {\n id,\n content,\n type,\n ...(metadata !== undefined ? { metadata } : {})\n };\n\n await this.storage.set(id, item);\n return `[STM:${id}]`;\n }\n\n /**\n * Updates an existing STM item's content or metadata.\n * \n * @param id - The UUID of the item to update\n * @param updates - Partial updates to apply (content or metadata)\n */\n async update(id: string, updates: { content?: any; metadata?: Record<string, unknown> }): Promise<void> {\n const item = await this.storage.get(id);\n if (!item) throw new Error(`STM item not found for update: ${id}`);\n\n const updatedItem: STMItem = {\n ...item,\n ...(updates.content !== undefined ? { content: updates.content } : {}),\n ...(updates.metadata !== undefined ? { metadata: { ...item.metadata, ...updates.metadata } } : {})\n };\n\n await this.storage.set(id, updatedItem);\n }\n\n\n /**\n * Retrieves an STM item by its full reference string (e.g., '[STM:uuid]').\n * \n * @param ref - The full reference string\n * @returns The STMItem or undefined if not found\n */\n async getByRef(ref: string): Promise<STMItem | undefined> {\n const match = ref.match(/^\\[STM:(.+)\\]$/);\n if (!match || !match[1]) return undefined;\n return this.storage.get(match[1]);\n }\n\n /**\n * Deletes an STM item by its ID.\n * \n * @param id - The UUID of the item to delete\n */\n async delete(id: string): Promise<void> {\n await this.storage.delete(id);\n }\n}\n","import { IStorageAdapter } from '../types/index.js';\nimport { randomUUID } from 'crypto';\n\n/**\n * An in-memory implementation of IStorageAdapter for holding Short Term Memory.\n * Ideal for testing or single-process lightweight usage.\n *\n * @example\n * const storage = new InMemoryStorageAdapter();\n * const id = await storage.set(undefined, 'my content', { type: 'text' });\n * const retrieved = await storage.get(id);\n */\nexport class InMemoryStorageAdapter implements IStorageAdapter {\n private store = new Map<string, { content: any; metadata?: Record<string, unknown> }>();\n\n /**\n * Retrieves stored content by ID.\n *\n * @param id - The identifier of the stored item\n * @returns The stored content or undefined if not found\n */\n async get(id: string): Promise<any | undefined> {\n return this.store.get(id)?.content;\n }\n\n /**\n * Returns the full item including metadata.\n *\n * @param id - The identifier of the stored item\n * @returns The complete item with content and metadata\n * @internal\n */\n async getFull(id: string): Promise<{ content: any; metadata?: Record<string, unknown> } | undefined> {\n return this.store.get(id);\n }\n\n /**\n * Stores content, generating an ID if none is provided.\n *\n * @param id - Optional provided ID. If omitted, a UUID is generated.\n * @param content - The content to store\n * @param metadata - Optional metadata\n * @returns The ID under which the content is stored\n */\n async set(id: string | undefined, content: any, metadata?: Record<string, unknown>): Promise<string> {\n const resolvedId = id ?? randomUUID();\n this.store.set(resolvedId, metadata !== undefined ? { content, metadata } : { content });\n return resolvedId;\n }\n\n /**\n * Deletes the content for the given ID.\n *\n * @param id - The identifier of the item to delete\n */\n async delete(id: string): Promise<void> {\n this.store.delete(id);\n }\n\n /**\n * Synchronous health check, always true for in-memory.\n *\n * @returns true\n */\n async healthCheck(): Promise<boolean> {\n return true;\n }\n}\n","import { IScratchpadAdapter } from '../types/index.js';\n\n/**\n * In-memory scratchpad adapter, keyed by sessionId.\n * Ideal for testing or single-process usage.\n */\nexport class InMemoryScratchpadAdapter implements IScratchpadAdapter {\n private store = new Map<string, string>();\n\n async read(sessionId: string): Promise<string | undefined> {\n return this.store.get(sessionId);\n }\n\n async write(sessionId: string, content: string): Promise<void> {\n this.store.set(sessionId, content);\n }\n\n async clear(sessionId: string): Promise<void> {\n this.store.delete(sessionId);\n }\n\n async healthCheck(): Promise<boolean> {\n return true;\n }\n}\n","/**\n * Standalone JSON Schema validator for tool parameter validation.\n *\n * Supports a meaningful subset of JSON Schema Draft-07 sufficient for\n * all common tool parameter shapes — with zero external dependencies.\n *\n * Supported keywords:\n * - type (string, number, integer, boolean, object, array, null)\n * - required, properties, additionalProperties\n * - items (array element schema)\n * - enum\n * - minLength, maxLength (string)\n * - minimum, maximum, exclusiveMinimum, exclusiveMaximum (number)\n * - minItems, maxItems (array)\n * - minProperties, maxProperties (object)\n * - pattern (string regex)\n * - oneOf, anyOf, allOf\n *\n * @example\n * const errors = validateJsonSchema({ name: 'Alice', age: 30 }, schema);\n * if (errors.length > 0) throw new LemuraToolValidationError(errors.join('; '));\n */\n\nexport interface SchemaValidationError {\n path: string;\n message: string;\n}\n\n// Bare minimum JSON Schema shape we validate against\ntype JSONSchemaNode = Record<string, unknown>;\n\nfunction typeOf(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\nfunction matchesType(value: unknown, requiredType: string): boolean {\n const t = typeOf(value);\n if (requiredType === 'integer') return t === 'number' && Number.isInteger(value);\n return t === requiredType;\n}\n\n/**\n * Recursively validates a value against a JSON Schema node.\n *\n * @param value - The value to validate\n * @param schema - The JSON Schema node\n * @param path - Dotted path for error reporting (e.g. \"params.items[0].name\")\n * @returns Array of validation errors (empty = valid)\n */\nexport function validateJsonSchema(\n value: unknown,\n schema: JSONSchemaNode,\n path = ''\n): SchemaValidationError[] {\n const errors: SchemaValidationError[] = [];\n\n // --- type ---\n if (schema['type'] !== undefined) {\n const expectedType = schema['type'] as string | string[];\n const types = Array.isArray(expectedType) ? expectedType : [expectedType];\n if (!types.some(t => matchesType(value, t))) {\n errors.push({\n path,\n message: `Expected type '${types.join('|')}', got '${typeOf(value)}'`\n });\n // Stop further checks if type is wrong (most sub-checks are type-specific)\n return errors;\n }\n }\n\n // --- enum ---\n if (schema['enum'] !== undefined) {\n const allowed = schema['enum'] as unknown[];\n if (!allowed.some(a => JSON.stringify(a) === JSON.stringify(value))) {\n errors.push({ path, message: `Value must be one of: ${JSON.stringify(allowed)}` });\n }\n }\n\n // --- const ---\n if ('const' in schema) {\n if (JSON.stringify(schema['const']) !== JSON.stringify(value)) {\n errors.push({ path, message: `Value must equal ${JSON.stringify(schema['const'])}` });\n }\n }\n\n // --- string ---\n if (typeof value === 'string') {\n if (schema['minLength'] !== undefined && value.length < (schema['minLength'] as number)) {\n errors.push({ path, message: `String too short (min ${schema['minLength']}, got ${value.length})` });\n }\n if (schema['maxLength'] !== undefined && value.length > (schema['maxLength'] as number)) {\n errors.push({ path, message: `String too long (max ${schema['maxLength']}, got ${value.length})` });\n }\n if (schema['pattern'] !== undefined) {\n try {\n const re = new RegExp(schema['pattern'] as string);\n if (!re.test(value)) {\n errors.push({ path, message: `String does not match pattern /${schema['pattern']}/` });\n }\n } catch {\n // invalid pattern — skip\n }\n }\n }\n\n // --- number / integer ---\n if (typeof value === 'number') {\n if (schema['minimum'] !== undefined && value < (schema['minimum'] as number)) {\n errors.push({ path, message: `Value ${value} is less than minimum ${schema['minimum']}` });\n }\n if (schema['maximum'] !== undefined && value > (schema['maximum'] as number)) {\n errors.push({ path, message: `Value ${value} exceeds maximum ${schema['maximum']}` });\n }\n if (schema['exclusiveMinimum'] !== undefined && value <= (schema['exclusiveMinimum'] as number)) {\n errors.push({ path, message: `Value ${value} must be > ${schema['exclusiveMinimum']}` });\n }\n if (schema['exclusiveMaximum'] !== undefined && value >= (schema['exclusiveMaximum'] as number)) {\n errors.push({ path, message: `Value ${value} must be < ${schema['exclusiveMaximum']}` });\n }\n }\n\n // --- array ---\n if (Array.isArray(value)) {\n if (schema['minItems'] !== undefined && value.length < (schema['minItems'] as number)) {\n errors.push({ path, message: `Array too short (min ${schema['minItems']} items)` });\n }\n if (schema['maxItems'] !== undefined && value.length > (schema['maxItems'] as number)) {\n errors.push({ path, message: `Array too long (max ${schema['maxItems']} items)` });\n }\n if (schema['items'] !== undefined) {\n const itemSchema = schema['items'] as JSONSchemaNode;\n value.forEach((item, idx) => {\n const childErrors = validateJsonSchema(item, itemSchema, `${path}[${idx}]`);\n errors.push(...childErrors);\n });\n }\n }\n\n // --- object ---\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const props = (schema['properties'] as Record<string, JSONSchemaNode> | undefined) || {};\n const required = (schema['required'] as string[] | undefined) || [];\n\n // required\n for (const key of required) {\n if (!(key in obj)) {\n errors.push({ path: path ? `${path}.${key}` : key, message: `Required property '${key}' is missing` });\n }\n }\n\n // known properties\n for (const [key, propSchema] of Object.entries(props)) {\n if (key in obj) {\n const childErrors = validateJsonSchema(obj[key], propSchema, path ? `${path}.${key}` : key);\n errors.push(...childErrors);\n }\n }\n\n // additionalProperties = false\n if (schema['additionalProperties'] === false) {\n for (const key of Object.keys(obj)) {\n if (!(key in props)) {\n errors.push({ path: path ? `${path}.${key}` : key, message: `Additional property '${key}' is not allowed` });\n }\n }\n } else if (schema['additionalProperties'] !== undefined && typeof schema['additionalProperties'] === 'object') {\n const addlSchema = schema['additionalProperties'] as JSONSchemaNode;\n for (const [key, val] of Object.entries(obj)) {\n if (!(key in props)) {\n const childErrors = validateJsonSchema(val, addlSchema, path ? `${path}.${key}` : key);\n errors.push(...childErrors);\n }\n }\n }\n\n if (schema['minProperties'] !== undefined && Object.keys(obj).length < (schema['minProperties'] as number)) {\n errors.push({ path, message: `Object has fewer than ${schema['minProperties']} properties` });\n }\n if (schema['maxProperties'] !== undefined && Object.keys(obj).length > (schema['maxProperties'] as number)) {\n errors.push({ path, message: `Object has more than ${schema['maxProperties']} properties` });\n }\n }\n\n // --- composition keywords ---\n if (schema['allOf'] !== undefined) {\n for (const subSchema of schema['allOf'] as JSONSchemaNode[]) {\n errors.push(...validateJsonSchema(value, subSchema, path));\n }\n }\n\n if (schema['anyOf'] !== undefined) {\n const subSchemas = schema['anyOf'] as JSONSchemaNode[];\n const anyPassed = subSchemas.some(s => validateJsonSchema(value, s, path).length === 0);\n if (!anyPassed) {\n errors.push({ path, message: 'Value does not match any of the anyOf schemas' });\n }\n }\n\n if (schema['oneOf'] !== undefined) {\n const subSchemas = schema['oneOf'] as JSONSchemaNode[];\n const passing = subSchemas.filter(s => validateJsonSchema(value, s, path).length === 0);\n if (passing.length !== 1) {\n errors.push({\n path,\n message: `Value must match exactly one of the oneOf schemas (matched ${passing.length})`\n });\n }\n }\n\n if (schema['not'] !== undefined) {\n const subErrors = validateJsonSchema(value, schema['not'] as JSONSchemaNode, path);\n if (subErrors.length === 0) {\n errors.push({ path, message: 'Value must NOT match the not schema' });\n }\n }\n\n return errors;\n}\n","import {\n IToolDefinition,\n LemuraToolNotFoundError,\n LemuraToolValidationError,\n LemuraToolTimeoutError,\n ToolContext\n} from '../types/index.js';\nimport { validateJsonSchema } from './SchemaValidator.js';\n\n/** Options for ToolRegistry behaviour. */\nexport interface ToolRegistryOptions {\n /**\n * Default timeout in milliseconds for each tool execution.\n * Individual tools may override this (see `IToolDefinition.timeoutMs`).\n * @default 30000\n */\n defaultTimeoutMs?: number;\n}\n\n/**\n * Manages registered tools and their execution lifecycle.\n *\n * Features:\n * - Registers tools by name (snake_case)\n * - Validates params against the tool's JSON Schema before execution (standalone, no Ajv)\n * - Enforces per-call timeout via `defaultTimeoutMs` / per-tool timeout\n * - Throws typed `LemuraError` subclasses for all failure modes\n *\n * @example\n * const registry = new ToolRegistry([myTool], { defaultTimeoutMs: 15_000 });\n * const result = await registry.execute('my_tool', params, context);\n */\nexport class ToolRegistry {\n private tools: Map<string, IToolDefinition> = new Map();\n private defaultTimeoutMs: number;\n\n constructor(initialTools: IToolDefinition[] = [], options: ToolRegistryOptions = {}) {\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n for (const tool of initialTools) {\n this.register(tool);\n }\n }\n\n /**\n * Registers a tool. Throws if a tool with the same name is already registered.\n *\n * @param tool - The tool definition to register\n * @throws {LemuraError} If `tool.name` is already taken\n */\n register(tool: IToolDefinition): void {\n if (this.tools.has(tool.name)) {\n throw new LemuraToolNotFoundError(`Tool '${tool.name}' is already registered. Use a unique name.`);\n }\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Removes a registered tool by name.\n *\n * @param name - The tool name to unregister\n */\n unregister(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /**\n * Returns the tool definition for `name`, or `undefined` if not found.\n *\n * @param name - Tool name to look up\n */\n get(name: string): IToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Returns all registered tool definitions.\n */\n getAll(): IToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Executes a single tool call with schema validation and timeout enforcement.\n *\n * @param name - The tool name to execute\n * @param params - The raw parameter object (validated against the tool's JSON Schema)\n * @param context - Execution context (session, logger, adapters)\n * @returns The tool's result\n * @throws {LemuraToolNotFoundError} If the tool is not registered\n * @throws {LemuraToolValidationError} If params fail JSON Schema validation\n * @throws {LemuraToolTimeoutError} If execution exceeds the configured timeout\n */\n async execute(name: string, params: unknown, context: ToolContext): Promise<unknown> {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new LemuraToolNotFoundError(`Tool '${name}' not found in registry.`);\n }\n\n // --- JSON Schema validation (standalone, no external lib) ---\n if (tool.parameters && typeof tool.parameters === 'object') {\n const schemaErrors = validateJsonSchema(params, tool.parameters as Record<string, unknown>);\n if (schemaErrors.length > 0) {\n const msg = schemaErrors.map(e => (e.path ? `[${e.path}] ${e.message}` : e.message)).join('; ');\n throw new LemuraToolValidationError(\n `Tool '${name}' parameter validation failed: ${msg}`\n );\n }\n }\n\n // --- Timeout enforcement ---\n const timeoutMs: number = tool.timeoutMs ?? this.defaultTimeoutMs;\n\n const startMs = Date.now();\n const executionPromise = tool.execute(params, context);\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = setTimeout(() => {\n clearTimeout(id);\n reject(new LemuraToolTimeoutError(\n `Tool '${name}' timed out after ${timeoutMs}ms`\n ));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([executionPromise, timeoutPromise]);\n context.logger.debug(`Tool '${name}' completed in ${Date.now() - startMs}ms`);\n return result;\n } catch (err: unknown) {\n const elapsedMs = Date.now() - startMs;\n if (err instanceof LemuraToolTimeoutError) {\n context.logger.error(`Tool '${name}' timed out after ${elapsedMs}ms (limit: ${timeoutMs}ms)`, {\n problem: `Tool '${name}' did not respond within its timeout.`,\n hints: [\n `Increase the tool's timeoutMs (currently ${timeoutMs}ms) or optimise its implementation.`,\n `Check whether the external service the tool depends on is healthy.`\n ]\n });\n throw err;\n }\n if (err instanceof LemuraToolValidationError) {\n throw err;\n }\n const message = err instanceof Error ? err.message : String(err);\n context.logger.error(`Tool '${name}' failed after ${elapsedMs}ms: ${message}`);\n throw new LemuraToolValidationError(\n `Tool '${name}' execution failed: ${message}`\n );\n }\n }\n\n /**\n * Executes multiple tool calls in parallel.\n * All calls are issued simultaneously; results are returned in the same order as `calls`.\n * Individual errors are captured per-call without aborting the others.\n *\n * @param calls - Array of `{ name, params }` objects\n * @param context - Shared execution context\n * @returns Array of `{ toolCallId, result?, error? }` in input order\n *\n * @example\n * const results = await registry.executeParallel(\n * [{ name: 'search_web', params: { query: 'foo' } }],\n * context\n * );\n */\n async executeParallel(\n calls: Array<{ id: string; name: string; params: unknown }>,\n context: ToolContext\n ): Promise<Array<{ id: string; result?: unknown; error?: Error }>> {\n return Promise.all(\n calls.map(async call => {\n try {\n const result = await this.execute(call.name, call.params, context);\n return { id: call.id, result };\n } catch (err: unknown) {\n return { id: call.id, error: err instanceof Error ? err : new Error(String(err)) };\n }\n })\n );\n }\n}\n","import { ToolFirewallConfig, ToolDecision } from '../types/agent.js';\nimport { ILogger } from '../types/logger.js';\n\nexport interface ToolFirewallResult {\n decision: ToolDecision;\n reason: string;\n}\n\nfunction matchesRule(pattern: string | undefined, value: string, logger?: ILogger): boolean {\n if (!pattern) return true;\n try {\n const re = new RegExp(pattern);\n return re.test(value);\n } catch (err: any) {\n if (logger) logger.warn(`Invalid firewall regex: ${pattern}`, { error: err?.message });\n return false;\n }\n}\n\nexport function evaluateToolFirewall(\n config: ToolFirewallConfig | undefined,\n toolName: string,\n argsJson: string,\n logger?: ILogger\n): ToolFirewallResult {\n const defaultDecision: ToolDecision = config?.defaultDecision || 'ask';\n const rules = config?.rules || [];\n\n for (const rule of rules) {\n const nameOk = matchesRule(rule.name, toolName, logger);\n const argsOk = matchesRule(rule.arguments, argsJson, logger);\n if (nameOk && argsOk) {\n return {\n decision: rule.decision,\n reason: rule.reason || 'Matched firewall rule'\n };\n }\n }\n\n return {\n decision: defaultDecision,\n reason: 'Default firewall decision'\n };\n}\n","import {\n IProviderAdapter,\n TranscriptionRequest,\n TranscriptionResponse,\n SynthesisRequest,\n AudioChunk,\n VisionRequest,\n VisionResponse,\n ImageGenRequest,\n ImageGenResponse\n} from '../types/index.js';\n\n/**\n * MediaBridge provides a single, app-friendly entry point for audio/vision/image features.\n */\nexport class MediaBridge {\n private adapter: IProviderAdapter;\n\n constructor(adapter: IProviderAdapter) {\n this.adapter = adapter;\n }\n\n transcribe(request: TranscriptionRequest): Promise<TranscriptionResponse> {\n return this.adapter.transcribe(request);\n }\n\n synthesize(request: SynthesisRequest): AsyncIterable<AudioChunk> {\n return this.adapter.synthesize(request);\n }\n\n async synthesizeToArray(request: SynthesisRequest): Promise<AudioChunk[]> {\n const chunks: AudioChunk[] = [];\n for await (const chunk of this.adapter.synthesize(request)) {\n chunks.push(chunk);\n }\n return chunks;\n }\n\n describeImage(request: VisionRequest): Promise<VisionResponse> {\n return this.adapter.describeImage(request);\n }\n\n generateImage(request: ImageGenRequest): Promise<ImageGenResponse> {\n return this.adapter.generateImage(request);\n }\n\n getModelInfo() {\n return this.adapter.getModelInfo();\n }\n\n supportsVision(): boolean {\n return this.adapter.getModelInfo().supportsVision;\n }\n}\n","import { ISkill } from '../types/index.js';\n\n/**\n * Manages skill registration and injects skills into the system prompt at the\n * appropriate position (system_prompt | pre_turn | post_history).\n *\n * ## Fixed vs Dynamic skills\n *\n * Skills can declare a `strategy` field:\n *\n * - **`'fixed'`** (default) — Always active. Injected on every iteration.\n * All skills without a `strategy` field are treated as fixed for full\n * backward compatibility.\n *\n * - **`'dynamic'`** — Part of an opt-in pool. A dynamic skill is only injected\n * when its `enabled` flag is `true`. Enable skills at construction time via\n * `SessionConfig.activeDynamicSkills` / `SessionConfig.activeDynamicTags`, or\n * at runtime with `enableSkill()` / `enableByTags()`.\n *\n * ## Token budget\n *\n * Skills are sorted by `priority` (lower = higher priority). When a `tokenBudget`\n * is provided, skills are included in priority order until the budget is exhausted —\n * lower-tier content variants (`micro`, `nano`) are selected first so as many\n * skills as possible fit within the budget.\n *\n * ## Content resolution\n *\n * Content is resolved in this order (most compact first when budget-aware):\n * `nano` → `micro` → `standard` → `content` → `description`\n * (reversed for full output: `standard` → `content` → `micro` → `nano` → `description`)\n */\nexport class SkillInjector {\n private skills: ISkill[] = [];\n\n constructor(skills: ISkill[] = []) {\n this.skills = skills.map(s => this._normalise(s));\n this.sortSkills();\n }\n\n // -----------------------------------------------------------------------\n // Registration\n // -----------------------------------------------------------------------\n\n register(skill: ISkill): void {\n this.skills.push(this._normalise(skill));\n this.sortSkills();\n }\n\n private sortSkills(): void {\n this.skills.sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * Normalises a skill to ensure consistent defaults.\n * For dynamic skills, `enabled` defaults to `false` unless explicitly set.\n * For fixed skills (or those without a strategy), `enabled` is ignored.\n */\n private _normalise(skill: ISkill): ISkill {\n const strategy = skill.strategy ?? 'fixed';\n const enabled = strategy === 'dynamic'\n ? (skill.enabled ?? false)\n : true; // fixed skills are always conceptually enabled\n return { ...skill, strategy, enabled };\n }\n\n // -----------------------------------------------------------------------\n // Dynamic skill activation\n // -----------------------------------------------------------------------\n\n /**\n * Enable a dynamic skill by name.\n * Has no effect on fixed skills (they are always active).\n */\n enableSkill(name: string): void {\n const skill = this.skills.find(s => s.name === name);\n if (skill && skill.strategy === 'dynamic') {\n skill.enabled = true;\n }\n }\n\n /**\n * Disable a dynamic skill by name.\n * Has no effect on fixed skills.\n */\n disableSkill(name: string): void {\n const skill = this.skills.find(s => s.name === name);\n if (skill && skill.strategy === 'dynamic') {\n skill.enabled = false;\n }\n }\n\n /**\n * Enable all dynamic skills whose `tags` array intersects with `tags`.\n */\n enableByTags(tags: string[]): void {\n const tagSet = new Set(tags);\n for (const skill of this.skills) {\n if (skill.strategy === 'dynamic' && skill.tags?.some(t => tagSet.has(t))) {\n skill.enabled = true;\n }\n }\n }\n\n /**\n * Disable all dynamic skills whose `tags` array intersects with `tags`.\n */\n disableByTags(tags: string[]): void {\n const tagSet = new Set(tags);\n for (const skill of this.skills) {\n if (skill.strategy === 'dynamic' && skill.tags?.some(t => tagSet.has(t))) {\n skill.enabled = false;\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Queries\n // -----------------------------------------------------------------------\n\n /**\n * Returns all registered skills (fixed and dynamic, enabled or not).\n */\n getAll(): ISkill[] {\n return [...this.skills];\n }\n\n /**\n * Returns currently active skills — fixed skills always, dynamic skills\n * only when `enabled === true`.\n */\n getActiveSkills(): ISkill[] {\n return this.skills.filter(s => this._isActive(s));\n }\n\n /**\n * Returns skills at a given injection position, active only.\n */\n getSkillsForInjection(position: ISkill['inject']): ISkill[] {\n return this.skills.filter(s => s.inject === position && this._isActive(s));\n }\n\n /**\n * Returns the union of `requiredTools` from all currently active skills.\n * Use this to determine which tools the active skill set depends on.\n *\n * @since 1.4.0\n */\n getRequiredTools(): string[] {\n const tools = new Set<string>();\n for (const skill of this.getActiveSkills()) {\n for (const t of skill.requiredTools ?? []) {\n tools.add(t);\n }\n }\n return [...tools];\n }\n\n private _isActive(skill: ISkill): boolean {\n return skill.strategy !== 'dynamic' || skill.enabled === true;\n }\n\n // -----------------------------------------------------------------------\n // Injection block builder\n // -----------------------------------------------------------------------\n\n /**\n * Builds the combined injection block for all active skills at the given position.\n *\n * @param position - Which injection point to target.\n * @param tokenBudget - Optional maximum token budget. Skills are added in priority\n * order until the budget would be exceeded. When `undefined`, all active skills\n * at the position are included.\n */\n buildInjectionBlock(position: ISkill['inject'], tokenBudget?: number): string {\n const relevantSkills = this.getSkillsForInjection(position);\n if (relevantSkills.length === 0) return '';\n\n let block = '';\n let usedTokens = 0;\n\n for (const skill of relevantSkills) {\n // Choose the most compact variant that still carries useful information\n const content = this._pickContent(skill, tokenBudget !== undefined);\n if (!content) continue;\n\n const tierLabel = skill.tier ?? 'standard';\n const skillEntry = `\\n<lemura:skill name=\"${skill.name}\" tier=\"${tierLabel}\">\\n${content}\\n</lemura:skill>\\n`;\n\n // Approximate token count (4 chars ≈ 1 token)\n const skillTokens = Math.ceil(skillEntry.length / 4);\n\n if (tokenBudget !== undefined && usedTokens + skillTokens > tokenBudget) {\n // Skip this skill — would exceed budget\n continue;\n }\n\n block += skillEntry;\n usedTokens += skillTokens;\n }\n\n return block.trim();\n }\n\n // -----------------------------------------------------------------------\n // Content picking\n // -----------------------------------------------------------------------\n\n /**\n * Picks the content variant to use for a skill.\n *\n * Resolution order when budget-aware (compact first):\n * nano → micro → standard → content → description\n *\n * Resolution order when not budget-aware (richest first):\n * standard → content → micro → nano → description\n */\n private _pickContent(skill: ISkill, budgetAware: boolean): string {\n if (budgetAware) {\n return skill.nano\n || skill.micro\n || skill.standard\n || skill.content\n || skill.description\n || '';\n }\n return skill.standard\n || skill.content\n || skill.micro\n || skill.nano\n || skill.description\n || '';\n }\n}\n","import { IRAGAdapter, RAGDocument, RAGIngestRequest, RAGIngestResponse, RAGQueryRequest, RAGQueryResponse } from '../types/index.js';\n\nexport class InMemoryRAGAdapter implements IRAGAdapter {\n private documents: Map<string, RAGDocument> = new Map();\n\n async ingest(request: RAGIngestRequest): Promise<RAGIngestResponse> {\n for (const doc of request.documents) {\n this.documents.set(doc.id, doc);\n }\n return {\n ingestedCount: request.documents.length,\n failedCount: 0\n };\n }\n\n async query(request: RAGQueryRequest): Promise<RAGQueryResponse> {\n const queryStr = request.query.toLowerCase();\n const results = [];\n\n // Very basic keyword matching for testing\n for (const doc of this.documents.values()) {\n const content = doc.content.toLowerCase();\n let score = 0;\n if (content.includes(queryStr)) score += 0.8;\n\n const words = queryStr.split(' ');\n for (const word of words) {\n if (content.includes(word)) score += 0.1;\n }\n\n if (score > 0 && score >= (request.minScore || 0)) {\n results.push({ document: doc, score: Math.min(score, 1) });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n const topK = request.topK || 5;\n\n return {\n results: results.slice(0, topK)\n };\n }\n\n async healthCheck(): Promise<boolean> {\n return true;\n }\n}\n","import { ILogger, LogLevel, LogMetadata, Severity } from '../types/logger.js';\n\n/**\n * Default colorized logger for lemura.\n * Uses ANSI escape codes for beautiful colors without dependencies.\n */\nexport class DefaultLogger implements ILogger {\n private level: LogLevel = LogLevel.INFO;\n\n private readonly COLORS: Record<Severity | 'RESET', string> = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n FATAL: '\\x1b[41m\\x1b[37m', // White on Red background\n RESET: '\\x1b[0m',\n };\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.DEBUG) this.log('DEBUG', message, metadata);\n }\n\n info(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.INFO) this.log('INFO', message, metadata);\n }\n\n warn(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.WARN) this.log('WARN', message, metadata);\n }\n\n error(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.ERROR) this.log('ERROR', message, metadata);\n }\n\n fatal(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.FATAL) this.log('FATAL', message, metadata);\n }\n\n private log(severity: Severity, message: string, metadata?: LogMetadata): void {\n const timestamp = new Date().toISOString();\n const color = this.COLORS[severity] || this.COLORS.RESET;\n const reset = this.COLORS.RESET;\n\n console.log(`${timestamp} [${color}${severity}${reset}] ${message}`);\n\n if (metadata) {\n if (metadata.problem) {\n console.log(` ${color}PROBLEM:${reset} ${metadata.problem}`);\n }\n if (metadata.hints && metadata.hints.length > 0) {\n console.log(` ${color}HINTS:${reset}`);\n metadata.hints.forEach(hint => console.log(` - ${hint}`));\n }\n\n // Log other metadata fields if they are not system fields\n const otherKeys = Object.keys(metadata).filter(k => !['problem', 'hints', 'severity'].includes(k));\n if (otherKeys.length > 0) {\n otherKeys.forEach(key => {\n const value = metadata[key];\n if (typeof value === 'object') {\n console.log(` ${key}: ${JSON.stringify(value, null, 2).replace(/\\n/g, '\\n ')}`);\n } else {\n console.log(` ${key}: ${value}`);\n }\n });\n }\n }\n }\n}\n","import { IToolDefinition, ToolContext } from '../../types/index.js';\nimport { ShortTermMemoryRegistry } from '../../context/ShortTermMemoryRegistry.js';\nimport { SandwichCompressionStrategy } from '../../context/SandwichCompressionStrategy.js';\n\n/**\n * Tool to read a chunk from Short Term Memory.\n */\nexport const readChunkTool: IToolDefinition = {\n name: 'read_chunk',\n description: 'Reads a specific portion or chunk of memory from a Short Term Memory reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference (e.g., [STM:uuid])' },\n start: { type: 'number', description: 'Starting index or page' },\n end: { type: 'number', description: 'Ending index or page' }\n },\n required: ['ref']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n // Basic chunking logic for demo purposes\n const content = String(item.content);\n if (params.start !== undefined || params.end !== undefined) {\n return content.slice(params.start ?? 0, params.end ?? content.length);\n }\n return content;\n }\n};\n\n/**\n * Tool to search for content within chunks.\n */\nexport const searchChunkTool: IToolDefinition = {\n name: 'search_chunk',\n description: 'Searches for specific content or patterns within Short Term Memory chunks.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' },\n query: { type: 'string', description: 'The search query or keyword' }\n },\n required: ['ref', 'query']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n const content = String(item.content);\n const index = content.toLowerCase().indexOf(params.query.toLowerCase());\n if (index === -1) return 'No matches found.';\n\n // Return a snippet around the match\n const start = Math.max(0, index - 100);\n const end = Math.min(content.length, index + 100);\n return `Match found at index ${index}: ...${content.slice(start, end)}...`;\n }\n};\n\n/**\n * Tool to list chunks of an STM reference.\n */\nexport const listChunksTool: IToolDefinition = {\n name: 'list_chunks',\n description: 'Lists available chunks or structural breakdown of a Short Term Memory reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' }\n },\n required: ['ref']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n const size = String(item.content).length;\n const chunkSize = 2000;\n const totalChunks = Math.ceil(size / chunkSize);\n\n return {\n totalSize: size,\n chunkSize,\n totalChunks,\n chunks: Array.from({ length: totalChunks }, (_, i) => ({\n index: i,\n start: i * chunkSize,\n end: Math.min((i + 1) * chunkSize, size)\n }))\n };\n }\n};\n\n/**\n * Tool to update a chunk in STM.\n */\nexport const updateChunkTool: IToolDefinition = {\n name: 'update_chunk',\n description: 'Updates or appends content to a specific Short Term Memory reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' },\n content: { type: 'string', description: 'The new content or update' },\n mode: { type: 'string', enum: ['append', 'replace'], default: 'append' }\n },\n required: ['ref', 'content']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n let newContent = String(item.content);\n if (params.mode === 'replace') {\n newContent = params.content;\n } else {\n newContent += params.content;\n }\n\n const uuid = params.ref.match(/\\[STM:(.+)\\]/)?.[1];\n if (!uuid) throw new Error('Invalid STM reference');\n\n await context.stmRegistry.update(uuid, { content: newContent });\n return { status: 'success', ref: params.ref };\n }\n};\n\n/**\n * Tool to read the scratchpad.\n */\nexport const readScratchpadTool: IToolDefinition = {\n name: 'read_scratchpad',\n description: 'Reads the content from the current agent scratchpad.',\n parameters: { type: 'object', properties: {} },\n async execute(_params: any, context: ToolContext) {\n if (context.scratchpadAdapter) {\n const stored = await context.scratchpadAdapter.read(context.sessionId);\n return stored ?? '';\n }\n return context.scratchpad ?? '';\n }\n};\n\n/**\n * Tool to write to the scratchpad.\n */\nexport const writeScratchpadTool: IToolDefinition = {\n name: 'write_scratchpad',\n description: 'Writes content to the agent scratchpad for long-term reasoning steps.',\n parameters: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Content to write' },\n append: { type: 'boolean', default: true }\n },\n required: ['content']\n },\n async execute(params: any, context: ToolContext) {\n let current = context.scratchpad ?? '';\n if (context.scratchpadAdapter) {\n const stored = await context.scratchpadAdapter.read(context.sessionId);\n if (stored !== undefined) current = stored;\n }\n let newScratchpad = current;\n if (params.append) {\n newScratchpad += (newScratchpad ? '\\n' : '') + params.content;\n } else {\n newScratchpad = params.content;\n }\n if (context.scratchpadAdapter) {\n await context.scratchpadAdapter.write(context.sessionId, newScratchpad);\n }\n return { status: 'success', newScratchpad, note: 'Scratchpad updated' };\n }\n};\n\n/**\n * Tool to remove scratchpad content.\n */\nexport const removeScratchpadTool: IToolDefinition = {\n name: 'remove_scratchpad',\n description: 'Clears or removes content from the scratchpad.',\n parameters: { type: 'object', properties: {} },\n async execute(_params: any, context: ToolContext) {\n if (context.scratchpadAdapter) {\n await context.scratchpadAdapter.clear(context.sessionId);\n }\n return { status: 'success', newScratchpad: '', note: 'Scratchpad cleared' };\n }\n};\n\n/**\n * Tool to summarize via sandwich strategy.\n */\nexport const summarizeSandwichTool: IToolDefinition = {\n name: 'summarize_sandwich',\n description: 'Generated a layered sandwich summary of a large STM reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' },\n instructions: { type: 'string', description: 'Summarization instructions' }\n },\n required: ['ref']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n // This tool needs a provider adapter. In a real scenario, this might be passed in context or config.\n // For now, let's assume we can use a strategy if provided.\n // This highlights that some tools might need more context.\n return { status: 'pending', note: 'Summarization requires AI provider' };\n }\n};\n","import { IToolDefinition, ToolContext } from '../../types/index.js';\nimport { LemuraAdapterError } from '../../types/errors.js';\n\nconst defaultPrefix = 'media_';\n\nfunction requireAdapter(context: ToolContext) {\n if (!context.adapter) {\n throw new LemuraAdapterError('Provider adapter is missing from tool context', 'ADAPTER_MISSING');\n }\n return context.adapter;\n}\n\nexport function createMediaTools(prefix: string = defaultPrefix): IToolDefinition[] {\n const p = prefix || defaultPrefix;\n\n const transcribeTool: IToolDefinition = {\n name: `${p}transcribe`,\n description: 'Transcribe audio from base64 into text.',\n parameters: {\n type: 'object',\n properties: {\n audioBase64: { type: 'string', description: 'Base64-encoded audio payload.' },\n mimeType: { type: 'string', description: 'Audio MIME type like audio/wav or audio/mpeg.' },\n language: { type: 'string', description: 'Optional language hint like en, fr.' },\n model: { type: 'string', description: 'Optional model override for ASR.' }\n },\n required: ['audioBase64', 'mimeType']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const result = await adapter.transcribe({\n audioBase64: params.audioBase64,\n mimeType: params.mimeType,\n language: params.language,\n model: params.model\n });\n return result;\n }\n };\n\n const synthesizeTool: IToolDefinition = {\n name: `${p}synthesize`,\n description: 'Synthesize text to speech and return audio chunks (base64).',\n parameters: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to synthesize.' },\n voiceId: { type: 'string', description: 'Voice identifier.' },\n format: { type: 'string', enum: ['mp3', 'wav', 'pcm'] },\n model: { type: 'string', description: 'Optional model override for TTS.' }\n },\n required: ['text', 'voiceId', 'format']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const chunks = [] as { audioBase64: string }[];\n for await (const chunk of adapter.synthesize({\n text: params.text,\n voiceId: params.voiceId,\n format: params.format,\n model: params.model\n })) {\n chunks.push(chunk);\n }\n return { chunks };\n }\n };\n\n const visionTool: IToolDefinition = {\n name: `${p}describe_image`,\n description: 'Describe an image from base64 and optional prompt.',\n parameters: {\n type: 'object',\n properties: {\n imageBase64: { type: 'string', description: 'Base64-encoded image payload.' },\n prompt: { type: 'string', description: 'Optional instruction or focus for description.' },\n model: { type: 'string', description: 'Optional model override for vision.' }\n },\n required: ['imageBase64']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const result = await adapter.describeImage({\n imageBase64: params.imageBase64,\n prompt: params.prompt,\n model: params.model\n });\n return result;\n }\n };\n\n const imageGenTool: IToolDefinition = {\n name: `${p}generate_image`,\n description: 'Generate an image from a prompt.',\n parameters: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Text prompt for the image.' },\n dimensions: { type: 'string', description: 'Image size like 1024x1024.' },\n model: { type: 'string', description: 'Optional model override for image generation.' }\n },\n required: ['prompt', 'dimensions']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const result = await adapter.generateImage({\n prompt: params.prompt,\n dimensions: params.dimensions,\n model: params.model\n });\n return result;\n }\n };\n\n return [transcribeTool, synthesizeTool, visionTool, imageGenTool];\n}\n","export class StepCounter {\n private toolCallCount: number = 0;\n\n constructor(private maxSteps: number = 20) { }\n\n increment(count: number = 1): void {\n this.toolCallCount += count;\n }\n\n get count(): number {\n return this.toolCallCount;\n }\n\n isMaxReached(): boolean {\n return this.toolCallCount >= this.maxSteps;\n }\n\n getForcedConclusionPrompt(): string {\n return `You have used ${this.toolCallCount}/${this.maxSteps} steps. Provide your final response now.\\nDo not call any more tools. Use the required structure below.`;\n }\n}\n","export class FinalResponseFormatter {\n static getRequiredStructure(): string {\n return `## Goal Status: [ACHIEVED | PARTIALLY_ACHIEVED | FAILED]\n\n### What was accomplished\n[Summary of completed work]\n\n### Remaining tasks\n[Bulleted list, or \"None\"]\n\n### Failed steps\n[Tool/step name + error context, or \"None\"]\n\n### Result\n[The actual answer or deliverable]`;\n }\n\n static validateStructure(response: string): boolean {\n // Very basic validation heuristics\n if (!response.includes('## Goal Status:')) return false;\n if (!response.includes('### What was accomplished')) return false;\n if (!response.includes('### Remaining tasks')) return false;\n if (!response.includes('### Failed steps')) return false;\n if (!response.includes('### Result')) return false;\n return true;\n }\n}\n","import { IToolResponseProcessor, ToolResponseEvaluation, IToolDefinition } from '../../types/index.js';\n\n/**\n * Configuration for `ToolResponseProcessor`.\n *\n * Token thresholds define the boundaries between size classes.\n * `budgetPercent` caps the combined token spend of all tool results per iteration.\n */\nexport interface ToolResponseProcessorConfig {\n /** Max tokens for a `small` response. Responses at or below this are verbatim. Default: 200 */\n smallMaxTokens?: number;\n /** Max tokens for a `medium` response. Responses at or below this are verbatim. Default: 800 */\n mediumMaxTokens?: number;\n /** Max tokens for a `large` response. Above this threshold → `oversized`. Default: 2000 */\n largeMaxTokens?: number;\n /**\n * Cap total tool-response tokens per iteration as a fraction of session `maxTokens`.\n * E.g. `0.15` means all tool results combined must fit within 15% of the context window.\n * Not enforced by the processor itself — SessionManager uses this to decide when to\n * apply extra compression after all tool results are collected. Default: undefined (no cap).\n */\n budgetPercent?: number;\n}\n\n/**\n * Evaluates and compresses tool response strings before they are appended to the\n * context window, preventing large tool outputs from flooding the token budget.\n *\n * @example\n * ```typescript\n * toolResponseProcessor: new ToolResponseProcessor({\n * smallMaxTokens: 200,\n * mediumMaxTokens: 800,\n * largeMaxTokens: 2000,\n * budgetPercent: 0.15,\n * })\n * ```\n */\nexport class ToolResponseProcessor implements IToolResponseProcessor {\n private readonly smallMax: number;\n private readonly mediumMax: number;\n private readonly largeMax: number;\n readonly budgetPercent: number | undefined;\n\n constructor(config: ToolResponseProcessorConfig = {}) {\n this.smallMax = config.smallMaxTokens ?? 200;\n this.mediumMax = config.mediumMaxTokens ?? 800;\n this.largeMax = config.largeMaxTokens ?? 2000;\n this.budgetPercent = config.budgetPercent;\n }\n\n evaluate(response: string, tool: IToolDefinition, context: unknown): ToolResponseEvaluation {\n const estimatedTokens = response.length / 4;\n\n let sizeClass: ToolResponseEvaluation['sizeClass'] = 'small';\n if (estimatedTokens > this.largeMax) sizeClass = 'oversized';\n else if (estimatedTokens > this.mediumMax) sizeClass = 'large';\n else if (estimatedTokens > this.smallMax) sizeClass = 'medium';\n\n // Detect common soft-error patterns even when HTTP status is 200\n const lc = response.toLowerCase();\n const errorDetected =\n lc.includes('error:') ||\n lc.includes('exception:') ||\n lc.includes('\"error\"') ||\n lc.includes('\"status\":\"error\"') ||\n lc.includes('\"status\": \"error\"') ||\n lc.includes('failed:') ||\n lc.includes('connection refused') ||\n lc.includes('timed out');\n\n const suggestedAction: ToolResponseEvaluation['suggestedAction'] = errorDetected\n ? 'retry'\n : sizeClass === 'oversized' || sizeClass === 'large'\n ? 'continue'\n : 'continue';\n\n return {\n relevanceScore: 1.0,\n sizeClass,\n shouldCompress: sizeClass === 'large' || sizeClass === 'oversized',\n suggestedMaxTokens: this.mediumMax,\n answered: !errorDetected,\n answeredPartially: errorDetected,\n errorDetected,\n suggestedAction,\n };\n }\n\n compress(response: string, evaluation: ToolResponseEvaluation): string {\n if (!evaluation.shouldCompress || evaluation.errorDetected) {\n // Never drop error signals — the model must see them\n return response;\n }\n\n if (evaluation.sizeClass === 'oversized') {\n // Truncative: keep head (first ~4000 chars) + tail (last ~2000 chars)\n const headChars = this.largeMax * 4; // approx chars for largeMax tokens\n const tailChars = this.mediumMax * 2; // approx chars for half mediumMax tokens\n if (response.length > headChars + tailChars) {\n const skipped = response.length - headChars - tailChars;\n return (\n response.slice(0, headChars) +\n `\\n\\n...[${skipped} characters omitted — response too large]...\\n\\n` +\n response.slice(-tailChars)\n );\n }\n }\n\n if (evaluation.sizeClass === 'large') {\n // Extractive: keep first N + last M lines\n const lines = response.split('\\n');\n const keepLines = Math.ceil(this.mediumMax / 10); // heuristic\n if (lines.length > keepLines * 2) {\n const skipped = lines.length - keepLines * 2;\n return [\n ...lines.slice(0, keepLines),\n `... [${skipped} lines omitted] ...`,\n ...lines.slice(-keepLines),\n ].join('\\n');\n }\n }\n\n return response;\n }\n}\n","export interface Goal {\n id: string;\n statement: string;\n /** High-level sub-goals decomposed from the main statement */\n decomposition: string[];\n successCriteria: string[];\n injectionFrequency: 'always' | 'every_N_turns' | 'on_compression';\n injectionPosition: 'system_prompt' | 'pre_turn';\n /** Sub-goals already completed — updated via `markSubGoalDone()` */\n completedSubGoals?: string[];\n}\n\n/**\n * GoalInjector keeps the original task objective visible throughout the ReAct loop,\n * preventing goal drift after many tool calls and context compressions.\n *\n * Usage in SessionManager:\n * - For `system_prompt` position: call `injectInto(prompt)` which appends the goal block.\n * - For `pre_turn` position: call `getFormattedBlock()` and push as a system message.\n */\nexport class GoalInjector {\n private goal: Goal;\n private turnsSinceInjection: number = 0;\n\n constructor(goal: Goal) {\n this.goal = {\n ...goal,\n completedSubGoals: goal.completedSubGoals ?? [],\n };\n }\n\n /**\n * Returns the formatted `<lemura:goal>` block string — without caring about\n * where it will be placed. Callers decide whether to append to a system prompt\n * or push as a separate message.\n */\n getFormattedBlock(): string {\n const { statement, successCriteria, decomposition, completedSubGoals = [] } = this.goal;\n\n const pending = decomposition.filter(sg => !completedSubGoals.includes(sg));\n const completed = decomposition.filter(sg => completedSubGoals.includes(sg));\n\n let block = `<lemura:goal>\\n<lemura:statement>${statement}</lemura:statement>\\n`;\n\n if (successCriteria.length > 0) {\n block += `<lemura:criteria>\\n${successCriteria.map(c => `- ${c}`).join('\\n')}\\n</lemura:criteria>\\n`;\n }\n\n if (pending.length > 0) {\n block += `<lemura:subgoals status=\"pending\">\\n${pending.map(sg => `- ${sg}`).join('\\n')}\\n</lemura:subgoals>\\n`;\n }\n\n if (completed.length > 0) {\n block += `<lemura:subgoals status=\"done\">\\n${completed.map(sg => `- ✅ ${sg}`).join('\\n')}\\n</lemura:subgoals>\\n`;\n }\n\n block += '</lemura:goal>';\n return block;\n }\n\n /**\n * Appends the goal block to the given prompt string (for `system_prompt` position).\n * For `pre_turn` position, use `getFormattedBlock()` directly.\n *\n * @param prompt - The existing system prompt to append to.\n */\n injectInto(prompt: string): string {\n const block = this.getFormattedBlock();\n return prompt ? `${prompt}\\n\\n${block}` : block;\n }\n\n /**\n * Returns true when the goal should be re-injected this turn,\n * based on `injectionFrequency`.\n *\n * @param turnIndex - The current turn index in the ReAct loop (0-based)\n * @param compressionOccurred - Whether context was compressed this iteration\n * @param injectionN - The N for 'every_N_turns' frequency (default: 3)\n */\n shouldInjectThisTurn(\n turnIndex: number,\n compressionOccurred: boolean = false,\n injectionN: number = 3\n ): boolean {\n const { injectionFrequency } = this.goal;\n\n if (injectionFrequency === 'always') return true;\n\n if (injectionFrequency === 'every_N_turns') {\n return turnIndex % injectionN === 0;\n }\n\n if (injectionFrequency === 'on_compression') {\n return compressionOccurred;\n }\n\n return true;\n }\n\n /**\n * Updates the goal with new sub-goal decomposition and success criteria,\n * typically populated by the mini-planning LLM call.\n */\n updateDecomposition(decomposition: string[], successCriteria?: string[]): void {\n this.goal = {\n ...this.goal,\n decomposition,\n ...(successCriteria ? { successCriteria } : {}),\n };\n }\n\n /**\n * Marks a sub-goal as completed so it moves to the \"completed\" section\n * in subsequent injections.\n */\n markSubGoalDone(subGoal: string): void {\n const completed = this.goal.completedSubGoals ?? [];\n if (!completed.includes(subGoal)) {\n this.goal = {\n ...this.goal,\n completedSubGoals: [...completed, subGoal],\n };\n }\n }\n\n /** Returns a snapshot of the current goal state (safe to store in context.metadata). */\n getGoal(): Goal {\n return { ...this.goal, completedSubGoals: [...(this.goal.completedSubGoals ?? [])] };\n }\n\n /** Increments the internal turn counter (used for `every_N_turns` frequency). */\n incrementTurn(): void {\n this.turnsSinceInjection++;\n }\n}\n","/**\n * An optional condition that gates a step's execution on the output of a prior step.\n * When the condition is not met, the step is automatically marked `skipped`.\n */\nexport interface StepCondition {\n /** stepId whose output is inspected */\n step: string;\n /** Substring that must be present in the prior step's output to allow this step to run */\n outputContains: string;\n}\n\n/**\n * Result returned by a `StepVerifier.check` function.\n * - `pass` — the sub-goal is achieved; the step is marked `done`.\n * - `fail` — the sub-goal failed; the step is marked `failed` and BFS propagates to dependants.\n * - `retry` — the output is unsatisfactory but retriable; the step is reset to `pending`.\n */\nexport interface StepVerifierResult {\n status: 'pass' | 'fail' | 'retry';\n reason?: string;\n}\n\n/**\n * Optional semantic verifier attached to a `ContinuationStep`.\n * Called after the tool executes successfully to confirm the sub-goal is actually met.\n *\n * @example\n * verify: {\n * maxRetries: 2,\n * check: (output) => {\n * const data = JSON.parse(output);\n * return data.rows?.length > 0\n * ? { status: 'pass' }\n * : { status: 'retry', reason: 'Empty result set' };\n * }\n * }\n */\nexport interface StepVerifier {\n /**\n * Inspects the tool output and decides whether the sub-goal is satisfied.\n * @param output - Serialised tool result string\n * @param args - The resolved arguments that were passed to the tool\n */\n check: (output: string, args: Record<string, unknown>) => Promise<StepVerifierResult> | StepVerifierResult;\n /**\n * Maximum number of `retry` verdicts allowed before the step is forced to `failed`.\n * Defaults to 0 (no retries — a `retry` verdict immediately becomes `failed`).\n */\n maxRetries?: number;\n}\n\nexport interface ContinuationStep {\n stepId: string;\n toolName: string;\n description: string;\n /** stepIds that must be `done` before this step may run */\n dependsOn: string[];\n status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';\n /**\n * When provided, the step's output is stored under this key in\n * `context.metadata['toolOutputs']` for downstream steps to reference.\n */\n outputKey?: string;\n /**\n * Maps prior step `outputKey` values to this step's tool parameter names.\n * E.g. `{ data: 'rawData' }` means the tool's `data` param gets the value\n * stored under the `rawData` output key from an earlier step.\n */\n inputMapping?: Record<string, string>;\n /**\n * Optional condition: the step only runs if the referenced prior step's output\n * contains the given substring. When the condition is not met, the step is skipped.\n */\n condition?: StepCondition;\n /**\n * Optional semantic verifier: called after the tool executes to confirm the\n * sub-goal is actually satisfied. Supports `pass / fail / retry` verdicts\n * with a configurable `maxRetries` count.\n *\n * @since 1.4.4\n */\n verify?: StepVerifier;\n}\n\nexport interface ContinuationPlan {\n steps: ContinuationStep[];\n currentStepIndex: number;\n strategy: 'sequential' | 'parallel' | 'conditional';\n}\n\n/**\n * Manages a structured multi-step continuation plan for the ReAct loop.\n *\n * Steps are tracked by status (`pending`, `running`, `done`, `failed`, `skipped`).\n * Dependency failures automatically propagate `skipped` to all downstream steps.\n * Step outputs are stored by `outputKey` and made available for `inputMapping`.\n *\n * @example\n * ```typescript\n * const planner = new ContinuationPlanner({\n * steps: [\n * { stepId: 'fetch', toolName: 'fetch_data', description: 'Get raw data', dependsOn: [], outputKey: 'rawData' },\n * { stepId: 'analyze', toolName: 'analyze', description: 'Run analysis', dependsOn: ['fetch'], inputMapping: { data: 'rawData' } },\n * ],\n * currentStepIndex: 0,\n * strategy: 'sequential',\n * });\n * ```\n */\nexport class ContinuationPlanner {\n private plan: ContinuationPlan;\n private outputs: Map<string, string> = new Map();\n private retryCount: Map<string, number> = new Map();\n private onStepSkipped: ((stepId: string, reason: string) => void) | undefined;\n private onStepFailed: ((stepId: string, reason: string) => void) | undefined;\n\n constructor(\n plan: ContinuationPlan,\n callbacks?: {\n onStepSkipped?: (stepId: string, reason: string) => void;\n onStepFailed?: (stepId: string, reason: string) => void;\n }\n ) {\n this.plan = { ...plan, steps: plan.steps.map(s => ({ ...s })) };\n this.onStepSkipped = callbacks?.onStepSkipped;\n this.onStepFailed = callbacks?.onStepFailed;\n }\n\n // -------------------------------------------------------------------------\n // State queries\n // -------------------------------------------------------------------------\n\n /** Returns the current plan (deep copy) */\n getPlan(): ContinuationPlan {\n return { ...this.plan, steps: this.plan.steps.map(s => ({ ...s })) };\n }\n\n /** Returns a human-readable status string with icons (injected before each iteration) */\n getPlanStatusString(): string {\n const current = this.plan.currentStepIndex + 1;\n const total = this.plan.steps.length;\n let result = `<lemura:plan step=\"${current}\" total=\"${total}\">\\n`;\n for (const step of this.plan.steps) {\n const icon = this._icon(step.status);\n const statusText = step.status === 'pending' && step.dependsOn.length > 0\n ? `Waiting on Step ${step.dependsOn.join(', ')}`\n : step.status.charAt(0).toUpperCase() + step.status.slice(1);\n result += `<lemura:step id=\"${step.stepId}\" tool=\"${step.toolName}\" status=\"${step.status}\">${icon} ${statusText}</lemura:step>\\n`;\n }\n result += '</lemura:plan>';\n return result;\n }\n\n private _icon(status: ContinuationStep['status']): string {\n switch (status) {\n case 'done': return '✅';\n case 'running': return '▶';\n case 'failed': return '❌';\n case 'skipped': return '⏭';\n default: return '⏳';\n }\n }\n\n /** Returns all steps whose dependencies are satisfied and that are still pending */\n getReadySteps(): ContinuationStep[] {\n return this.plan.steps.filter(step => {\n if (step.status !== 'pending') return false;\n\n // All dependencies must be done\n const depsOk = step.dependsOn.every(depId => {\n const dep = this.plan.steps.find(s => s.stepId === depId);\n return dep?.status === 'done';\n });\n if (!depsOk) return false;\n\n // Evaluate optional condition\n if (step.condition) {\n const condDepOutput = this.outputs.get(step.condition.step) ?? '';\n if (!condDepOutput.includes(step.condition.outputContains)) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n /** Returns true when all steps have reached a terminal state */\n isComplete(): boolean {\n return this.plan.steps.every(\n s => s.status === 'done' || s.status === 'failed' || s.status === 'skipped'\n );\n }\n\n // -------------------------------------------------------------------------\n // State mutations\n // -------------------------------------------------------------------------\n\n /** Marks a step as running */\n markStepRunning(stepId: string): void {\n this._updateStep(stepId, { status: 'running' });\n }\n\n /**\n * Marks a step as done, stores its output under `outputKey` (if set),\n * and advances `currentStepIndex` to the next pending step.\n */\n markStepDone(stepId: string, output?: string): void {\n const step = this.plan.steps.find(s => s.stepId === stepId);\n if (step?.outputKey && output !== undefined) {\n this.outputs.set(step.outputKey, output);\n }\n this._updateStep(stepId, { status: 'done' });\n this._advanceIndex();\n }\n\n /**\n * Marks a step as failed and propagates `skipped` to all transitively dependent steps.\n */\n markStepFailed(stepId: string, reason = 'step failed'): void {\n this._updateStep(stepId, { status: 'failed' });\n this.onStepFailed?.(stepId, reason);\n this._skipDependants(stepId);\n }\n\n /**\n * Marks a step as skipped (e.g., condition not met) and propagates to its dependants.\n */\n markStepSkipped(stepId: string, reason = 'condition not met'): void {\n this._updateStep(stepId, { status: 'skipped' });\n this.onStepSkipped?.(stepId, reason);\n this._skipDependants(stepId);\n }\n\n /**\n * Resets a step back to `pending` for a retry attempt.\n * Increments the internal retry counter for the step.\n */\n markStepPending(stepId: string): void {\n this._updateStep(stepId, { status: 'pending' });\n this.retryCount.set(stepId, (this.retryCount.get(stepId) ?? 0) + 1);\n }\n\n /** Returns how many times a step has been retried. */\n getRetryCount(stepId: string): number {\n return this.retryCount.get(stepId) ?? 0;\n }\n\n // -------------------------------------------------------------------------\n // Output / input mapping helpers\n // -------------------------------------------------------------------------\n\n /** Retrieves an output stored by `outputKey` from a completed step */\n getOutput(key: string): string | undefined {\n return this.outputs.get(key);\n }\n\n /**\n * Resolves the `inputMapping` for a step into a concrete parameter map,\n * substituting `outputKey` values from prior steps. Static (non-key) values\n * in the mapping are passed through unchanged.\n */\n resolveInputs(step: ContinuationStep, baseArgs: Record<string, unknown> = {}): Record<string, unknown> {\n if (!step.inputMapping) return baseArgs;\n\n const resolved: Record<string, unknown> = { ...baseArgs };\n for (const [paramName, outputKey] of Object.entries(step.inputMapping)) {\n const value = this.outputs.get(outputKey);\n // Only substitute if we have a stored output for this key\n if (value !== undefined) {\n resolved[paramName] = value;\n } else {\n // Treat as a static value (e.g. quarter: 'Q4 2025')\n resolved[paramName] = outputKey;\n }\n }\n return resolved;\n }\n\n // -------------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------------\n\n private _updateStep(stepId: string, patch: Partial<ContinuationStep>): void {\n this.plan.steps = this.plan.steps.map(s =>\n s.stepId === stepId ? { ...s, ...patch } : s\n );\n }\n\n private _skipDependants(failedStepId: string): void {\n // BFS / iterative propagation of skipped status\n const toSkip = new Set<string>([failedStepId]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const step of this.plan.steps) {\n if (step.status === 'pending' && step.dependsOn.some(d => toSkip.has(d))) {\n this._updateStep(step.stepId, { status: 'skipped' });\n this.onStepSkipped?.(step.stepId, `dependency '${failedStepId}' failed or was skipped`);\n toSkip.add(step.stepId);\n changed = true;\n }\n }\n }\n }\n\n private _advanceIndex(): void {\n const nextPending = this.plan.steps.findIndex(\n (s, i) => i > this.plan.currentStepIndex && s.status === 'pending'\n );\n if (nextPending !== -1) {\n this.plan.currentStepIndex = nextPending;\n }\n }\n}\n","import { ChildProcess, spawn } from 'child_process';\nimport { ILogger } from '../types/index.js';\nimport {\n MCPServerConfig,\n MCPToolDefinition,\n MCPJsonRpcRequest,\n MCPJsonRpcResponse\n} from '../types/mcp.js';\nimport { LemuraMCPConnectionError, LemuraMCPTimeoutError } from '../types/errors.js';\n\n/**\n * Low-level MCP server client.\n *\n * Supports two transports:\n * - **stdio** — spawns a child process and communicates over stdin/stdout via newline-delimited JSON-RPC 2.0\n * - **http** — sends JSON-RPC 2.0 `POST` requests using native `fetch` (Node >= 18 required)\n *\n * Lifecycle:\n * 1. `connect()` — initialize the server and fetch its tool list\n * 2. `callTool()` — invoke a tool by name\n * 3. `disconnect()` — terminate the connection / child process\n *\n * @example\n * const client = new MCPClient('github', {\n * name: 'github',\n * transport: 'stdio',\n * command: 'npx',\n * args: ['@modelcontextprotocol/server-github'],\n * env: { GITHUB_TOKEN: '...' }\n * }, logger);\n *\n * await client.connect();\n * const result = await client.callTool('create_issue', { title: 'bug' });\n * await client.disconnect();\n */\nexport class MCPClient {\n private readonly config: MCPServerConfig;\n private readonly logger: ILogger;\n private readonly _serverName: string;\n private readonly timeoutMs: number;\n\n private _tools: MCPToolDefinition[] = [];\n private _connected: boolean = false;\n\n // stdio-specific state\n private process: ChildProcess | null = null;\n private pendingCallbacks: Map<number | string, {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n }> = new Map();\n private requestId: number = 1;\n private stdioBuffer: string = '';\n\n constructor(name: string, config: MCPServerConfig, logger: ILogger) {\n this._serverName = name;\n this.config = config;\n this.logger = logger;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n }\n\n get serverName(): string {\n return this._serverName;\n }\n\n get tools(): MCPToolDefinition[] {\n return this._tools;\n }\n\n get isConnected(): boolean {\n return this._connected;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /**\n * Connects to the MCP server: sends `initialize` + `notifications/initialized`,\n * then fetches the tool list via `tools/list`.\n */\n async connect(): Promise<void> {\n this.logger.debug(`[MCP:${this._serverName}] Connecting via ${this.config.transport}...`);\n\n if (this.config.transport === 'stdio') {\n await this._connectStdio();\n } else {\n // http / sse — validate url exists\n if (!this.config.url) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] 'url' is required for ${this.config.transport} transport`,\n `No URL provided for MCP server '${this._serverName}'`,\n [`Set 'url' in the MCPServerConfig for server '${this._serverName}'`]\n );\n }\n }\n\n await this._initialize();\n await this._discoverTools();\n this._connected = true;\n this.logger.info(`[MCP:${this._serverName}] Connected. ${this._tools.length} tool(s) available.`);\n }\n\n /**\n * Calls a tool on this MCP server.\n *\n * @param toolName - The tool name as declared by the server\n * @param args - Tool arguments (must match the tool's inputSchema)\n * @returns The serialised result from the server\n */\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\n this.logger.debug(`[MCP:${this._serverName}] Calling tool '${toolName}'`, { args });\n\n const request: MCPJsonRpcRequest = {\n jsonrpc: '2.0',\n id: this._nextId(),\n method: 'tools/call',\n params: { name: toolName, arguments: args }\n };\n\n const startMs = Date.now();\n let response: MCPJsonRpcResponse;\n try {\n response = await this._rpc(request);\n } catch (err: unknown) {\n const elapsedMs = Date.now() - startMs;\n if (err instanceof LemuraMCPTimeoutError) {\n this.logger.error(\n `[MCP:${this._serverName}] Tool '${toolName}' timed out after ${elapsedMs}ms (limit: ${this.timeoutMs}ms)`,\n {\n problem: `MCP server '${this._serverName}' did not respond to tool '${toolName}' in time.`,\n hints: [\n `Increase 'timeoutMs' in the MCPServerConfig for '${this._serverName}' (currently ${this.timeoutMs}ms).`,\n `Check whether the MCP server process is healthy and not blocked.`\n ]\n }\n );\n } else {\n this.logger.error(\n `[MCP:${this._serverName}] Tool '${toolName}' RPC failed after ${elapsedMs}ms: ${(err as Error).message}`\n );\n }\n throw err;\n }\n this.logger.debug(`[MCP:${this._serverName}] Tool '${toolName}' completed in ${Date.now() - startMs}ms`);\n this._assertNoError(response, `tool '${toolName}'`);\n\n // MCP spec: result.content is an array of content blocks\n const result = response.result as Record<string, unknown> | undefined;\n if (result && Array.isArray(result['content'])) {\n // Flatten text content blocks into a single string for convenience\n const texts = (result['content'] as Array<{ type: string; text?: string }>)\n .filter(b => b.type === 'text' && b.text)\n .map(b => b.text as string);\n return texts.length === 1 ? texts[0] : texts.length > 1 ? texts.join('\\n') : result;\n }\n return result;\n }\n\n /**\n * Disconnects from the MCP server.\n * For stdio: sends the `exit` notification then terminates the process.\n */\n async disconnect(): Promise<void> {\n if (!this._connected) return;\n\n this.logger.debug(`[MCP:${this._serverName}] Disconnecting...`);\n this._connected = false;\n\n if (this.process) {\n try {\n // Best-effort: send exit notification\n const exitNotif = JSON.stringify({\n jsonrpc: '2.0',\n method: 'notifications/exit'\n }) + '\\n';\n this.process.stdin?.write(exitNotif);\n } catch { /* ignore write errors on shutdown */ }\n\n this.process.kill();\n this.process = null;\n }\n\n // Reject any still-pending callbacks\n for (const [, cb] of this.pendingCallbacks) {\n cb.reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Connection closed before response received`\n ));\n }\n this.pendingCallbacks.clear();\n }\n\n // ---------------------------------------------------------------------------\n // Private: stdio transport\n // ---------------------------------------------------------------------------\n\n private async _connectStdio(): Promise<void> {\n const { command, args = [], env = {} = {} } = this.config as Required<Pick<MCPServerConfig, 'command'>> & MCPServerConfig;\n\n if (!command) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] 'command' is required for stdio transport`,\n `No command provided for stdio MCP server '${this._serverName}'`,\n [`Set the 'command' field in MCPServerConfig for server '${this._serverName}'`]\n );\n }\n\n return new Promise<void>((resolve, reject) => {\n let proc: ChildProcess;\n try {\n proc = spawn(command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env, ...env }\n });\n } catch (err: unknown) {\n return reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Failed to spawn '${command}': ${(err as Error).message}`,\n `Could not start MCP server process for '${this._serverName}'`,\n [\n `Ensure '${command}' is installed and available in PATH`,\n `Check the 'args' and 'env' configuration for server '${this._serverName}'`\n ]\n ));\n }\n\n this.process = proc;\n\n proc.on('error', (err) => {\n this.logger.error(`[MCP:${this._serverName}] Process error: ${err.message}`);\n // Reject any pending callbacks\n for (const [, cb] of this.pendingCallbacks) {\n cb.reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Process error: ${err.message}`\n ));\n }\n this.pendingCallbacks.clear();\n this._connected = false;\n });\n\n proc.on('exit', (code, signal) => {\n if (this._connected) {\n this.logger.warn(`[MCP:${this._serverName}] Process exited unexpectedly (code=${code}, signal=${signal})`);\n this._connected = false;\n }\n });\n\n proc.stdout?.on('data', (chunk: Buffer) => {\n this.stdioBuffer += chunk.toString('utf8');\n this._flushStdioBuffer();\n });\n\n proc.stderr?.on('data', (chunk: Buffer) => {\n // MCP servers may log to stderr; surface as debug\n this.logger.debug(`[MCP:${this._serverName}] stderr: ${chunk.toString('utf8').trim()}`);\n });\n\n resolve();\n });\n }\n\n /** Parses newline-delimited JSON messages from the stdio buffer */\n private _flushStdioBuffer(): void {\n const lines = this.stdioBuffer.split('\\n');\n // Keep the last (potentially incomplete) line in the buffer\n this.stdioBuffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: MCPJsonRpcResponse;\n try {\n msg = JSON.parse(trimmed) as MCPJsonRpcResponse;\n } catch {\n this.logger.debug(`[MCP:${this._serverName}] Ignoring non-JSON line: ${trimmed.slice(0, 120)}`);\n continue;\n }\n\n // Responses have an id; notifications do not — ignore notifications\n if (msg.id === undefined || msg.id === null) continue;\n\n const cb = this.pendingCallbacks.get(msg.id);\n if (cb) {\n this.pendingCallbacks.delete(msg.id);\n cb.resolve(msg);\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: JSON-RPC helpers\n // ---------------------------------------------------------------------------\n\n private _nextId(): number {\n return this.requestId++;\n }\n\n /** Sends a JSON-RPC request and returns the response, honouring the configured timeout. */\n private async _rpc(request: MCPJsonRpcRequest): Promise<MCPJsonRpcResponse> {\n if (this.config.transport === 'stdio') {\n return this._rpcStdio(request);\n }\n return this._rpcHttp(request);\n }\n\n private _rpcStdio(request: MCPJsonRpcRequest): Promise<MCPJsonRpcResponse> {\n return new Promise<MCPJsonRpcResponse>((resolve, reject) => {\n if (!this.process?.stdin) {\n return reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] stdin is not available`\n ));\n }\n\n const id = request.id;\n let timedOut = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n this.pendingCallbacks.delete(id);\n reject(new LemuraMCPTimeoutError(\n `[MCP:${this._serverName}] RPC call '${request.method}' timed out after ${this.timeoutMs}ms`\n ));\n }, this.timeoutMs);\n\n this.pendingCallbacks.set(id, {\n resolve: (value) => {\n if (timedOut) return;\n clearTimeout(timer);\n resolve(value as MCPJsonRpcResponse);\n },\n reject: (err) => {\n if (timedOut) return;\n clearTimeout(timer);\n reject(err);\n }\n });\n\n this.process.stdin.write(JSON.stringify(request) + '\\n', 'utf8');\n });\n }\n\n private async _rpcHttp(request: MCPJsonRpcRequest): Promise<MCPJsonRpcResponse> {\n const url = this.config.url!;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n ...this.config.headers\n },\n body: JSON.stringify(request),\n signal: controller.signal\n });\n\n if (!res.ok) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] HTTP ${res.status} from server: ${res.statusText}`,\n `MCP server '${this._serverName}' returned a non-2xx response`,\n [`Verify the server is running at '${url}' and accepting JSON-RPC requests`]\n );\n }\n\n return await res.json() as MCPJsonRpcResponse;\n } catch (err: unknown) {\n if ((err as Error).name === 'AbortError') {\n throw new LemuraMCPTimeoutError(\n `[MCP:${this._serverName}] HTTP RPC '${request.method}' timed out after ${this.timeoutMs}ms`\n );\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Sends `initialize` then `notifications/initialized` per MCP spec */\n private async _initialize(): Promise<void> {\n const initRequest: MCPJsonRpcRequest = {\n jsonrpc: '2.0',\n id: this._nextId(),\n method: 'initialize',\n params: {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n clientInfo: { name: 'lemura', version: '1.2.0' }\n }\n };\n\n let response: MCPJsonRpcResponse;\n try {\n response = await this._rpc(initRequest);\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Initialize failed: ${msg}`,\n `Failed to initialize MCP server '${this._serverName}'`,\n [\n `Ensure the server supports the MCP protocol`,\n `Verify the server is running and accepting connections`\n ]\n );\n }\n\n this._assertNoError(response, 'initialize');\n\n // Send the initialized notification (no id = notification, no response expected)\n const initializedNotif = JSON.stringify({\n jsonrpc: '2.0',\n method: 'notifications/initialized'\n }) + '\\n';\n\n if (this.config.transport === 'stdio' && this.process?.stdin) {\n this.process.stdin.write(initializedNotif, 'utf8');\n } else if (this.config.transport !== 'stdio') {\n // HTTP: fire-and-forget notify (some servers don't require it)\n fetch(this.config.url!, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers\n },\n body: initializedNotif\n }).catch(() => { /* optional notification — ignore errors */ });\n }\n }\n\n /** Fetches and caches the tool list from the server */\n private async _discoverTools(): Promise<void> {\n const request: MCPJsonRpcRequest = {\n jsonrpc: '2.0',\n id: this._nextId(),\n method: 'tools/list',\n params: {}\n };\n\n const response = await this._rpc(request);\n this._assertNoError(response, 'tools/list');\n\n const result = response.result as Record<string, unknown> | undefined;\n const tools = (result?.['tools'] ?? []) as MCPToolDefinition[];\n this._tools = tools;\n }\n\n private _assertNoError(response: MCPJsonRpcResponse, context: string): void {\n if (response.error) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] JSON-RPC error in ${context}: [${response.error.code}] ${response.error.message}`,\n `MCP server '${this._serverName}' returned a JSON-RPC error during ${context}`,\n ['Check the MCP server logs for more details']\n );\n }\n }\n}\n","import { ILogger, IToolDefinition, ToolContext } from '../types/index.js';\nimport { MCPServerConfig, MCPToolDefinition } from '../types/mcp.js';\nimport { LemuraMCPConnectionError } from '../types/errors.js';\nimport { MCPClient } from './MCPClient.js';\n\n/**\n * Manages the full lifecycle of multiple MCP server connections and routes\n * tool calls to the correct server.\n *\n * Typical usage is handled automatically by `SessionManager` when `mcpServers`\n * is set in `SessionConfig`. You can also use it standalone for advanced scenarios.\n *\n * @example\n * const registry = new MCPClientRegistry(logger);\n * await registry.register('github', { transport: 'stdio', command: 'npx', args: ['...'] });\n * const tools = await registry.discoverTools(); // IToolDefinition[] ready for ToolRegistry\n */\nexport class MCPClientRegistry {\n private readonly clients: Map<string, MCPClient> = new Map();\n /** toolName → serverName */\n private readonly toolRouter: Map<string, string> = new Map();\n private readonly logger: ILogger;\n\n constructor(logger: ILogger) {\n this.logger = logger;\n }\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n /**\n * Creates an `MCPClient` for the given config, connects to the server, and\n * registers the server by name.\n *\n * @throws {LemuraMCPConnectionError} if connection / initialization fails\n */\n async register(name: string, config: MCPServerConfig): Promise<void> {\n if (this.clients.has(name)) {\n this.logger.warn(`[MCPClientRegistry] Server '${name}' is already registered — skipping`);\n return;\n }\n\n const client = new MCPClient(name, config, this.logger);\n try {\n await client.connect();\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n throw new LemuraMCPConnectionError(\n `[MCPClientRegistry] Failed to connect to server '${name}': ${msg}`,\n `Could not establish connection to MCP server '${name}'`,\n [\n `Verify the server is reachable and the transport config is correct`,\n `Check the 'command', 'args', or 'url' for server '${name}'`\n ]\n );\n }\n\n this.clients.set(name, client);\n this.logger.info(`[MCPClientRegistry] Server '${name}' registered (${client.tools.length} tools)`);\n }\n\n // ---------------------------------------------------------------------------\n // Tool discovery\n // ---------------------------------------------------------------------------\n\n /**\n * Collects tools from all connected MCP servers and returns them as\n * `IToolDefinition` adapters ready to be registered in `ToolRegistry`.\n *\n * Tool names are **not** namespaced — if two servers expose a tool with the\n * same name, the last-registered server wins and a warning is emitted.\n */\n async discoverTools(): Promise<IToolDefinition[]> {\n const bridged: IToolDefinition[] = [];\n\n for (const [serverName, client] of this.clients) {\n for (const mcpTool of client.tools) {\n if (this.toolRouter.has(mcpTool.name)) {\n this.logger.warn(\n `[MCPClientRegistry] Tool '${mcpTool.name}' is already provided by '${this.toolRouter.get(mcpTool.name)}'; ` +\n `overriding with server '${serverName}'`\n );\n }\n this.toolRouter.set(mcpTool.name, serverName);\n bridged.push(this._bridge(mcpTool, serverName));\n }\n }\n\n this.logger.debug(`[MCPClientRegistry] Discovered ${bridged.length} total MCP tool(s)`);\n return bridged;\n }\n\n // ---------------------------------------------------------------------------\n // Routing\n // ---------------------------------------------------------------------------\n\n /**\n * Calls a tool on the correct MCP server.\n *\n * @param toolName - The tool name as registered via `discoverTools()`\n * @param args - Parsed arguments object\n * @throws {LemuraMCPConnectionError} if no server is registered for `toolName`\n */\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const serverName = this.toolRouter.get(toolName);\n if (!serverName) {\n throw new LemuraMCPConnectionError(\n `[MCPClientRegistry] No MCP server found for tool '${toolName}'`,\n `Tool '${toolName}' was not discovered from any connected MCP server`,\n ['Verify the MCP server that provides this tool is configured and connected']\n );\n }\n\n const client = this.clients.get(serverName)!;\n return client.callTool(toolName, args);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Disconnects all registered MCP servers gracefully.\n * Called automatically by `SessionManager.close()`.\n */\n async disconnectAll(): Promise<void> {\n const names = Array.from(this.clients.keys());\n this.logger.debug(`[MCPClientRegistry] Disconnecting ${names.length} MCP server(s)...`);\n\n await Promise.allSettled(\n names.map(async (name) => {\n try {\n await this.clients.get(name)!.disconnect();\n this.logger.debug(`[MCPClientRegistry] '${name}' disconnected`);\n } catch (err: unknown) {\n this.logger.warn(\n `[MCPClientRegistry] Error disconnecting '${name}': ${(err as Error).message}`\n );\n }\n })\n );\n\n this.clients.clear();\n this.toolRouter.clear();\n }\n\n /** Returns the names of all currently registered servers */\n getRegisteredServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Bridges an `MCPToolDefinition` from the protocol into an `IToolDefinition`\n * that the existing `ToolRegistry` can execute.\n */\n private _bridge(mcpTool: MCPToolDefinition, serverName: string): IToolDefinition {\n const self = this;\n return {\n name: mcpTool.name,\n description: `[MCP:${serverName}] ${mcpTool.description}`,\n parameters: mcpTool.inputSchema ?? { type: 'object', properties: {} },\n async execute(params: unknown, _context: ToolContext): Promise<unknown> {\n return self.callTool(mcpTool.name, (params ?? {}) as Record<string, unknown>);\n }\n };\n }\n}\n","import {\n SessionConfig,\n ContextWindow,\n IProviderAdapter,\n ContentBlock,\n Turn,\n ILogger,\n IToolDefinition,\n NormalizedMessage,\n ToolCall,\n TraceEvent,\n GoalVerifierResult\n} from '../types/index.js';\nimport { ContextManager } from '../context/ContextManager.js';\nimport { ToolRegistry } from '../tools/ToolRegistry.js';\nimport { SkillInjector } from '../skills/SkillInjector.js';\nimport { LemuraMaxIterationsError, LemuraToolTimeoutError } from '../types/index.js';\nimport { DefaultLogger } from '../logger/DefaultLogger.js';\nimport {\n readChunkTool,\n searchChunkTool,\n listChunksTool,\n updateChunkTool,\n readScratchpadTool,\n writeScratchpadTool,\n removeScratchpadTool,\n summarizeSandwichTool\n} from '../tools/builtin/short_term_memory.js';\nimport { createMediaTools } from '../tools/builtin/media.js';\nimport { MediaBridge } from '../media/MediaBridge.js';\nimport { evaluateToolFirewall } from '../tools/ToolFirewall.js';\nimport { StepCounter } from './execution/StepCounter.js';\nimport { FinalResponseFormatter } from './execution/FinalResponseFormatter.js';\nimport { ToolResponseProcessor } from './execution/ToolResponseProcessor.js';\nimport { Goal, GoalInjector } from './execution/GoalInjector.js';\nimport { ContinuationPlanner, ContinuationPlan, ContinuationStep } from './execution/ContinuationPlanner.js';\nimport { MCPClientRegistry } from '../mcp/MCPClientRegistry.js';\n\n/**\n * Core entry point for lemura agent sessions.\n *\n * `SessionManager` owns the full ReAct loop lifecycle:\n * - Context window management and compression\n * - Skill injection (with optional token budget)\n * - Tool firewall + schema validation + timeout enforcement\n * - Parallel tool execution (opt-in via `parallelToolCalls`)\n * - maxSteps guard → forced graceful conclusion\n * - Tool response compression (via `ToolResponseProcessor`)\n * - Goal injection + mini-planning step (via `enableGoalPlanning`)\n * - Continuation planning with dependency tracking (via `enableContinuationPlanning`)\n * - Streaming output (`stream()`)\n * - Session lifecycle: `reset()`, `close()`\n *\n * @example\n * ```typescript\n * const session = new SessionManager({ adapter, model: 'gpt-4o', maxTokens: 16_000 });\n * const answer = await session.run('What is the capital of France?');\n * ```\n */\nexport class SessionManager {\n private contextManager: ContextManager;\n private toolRegistry: ToolRegistry;\n private skillInjector: SkillInjector;\n private context: ContextWindow;\n private adapter: IProviderAdapter;\n private config: SessionConfig;\n private iterations: number = 0;\n private logger: ILogger;\n private media: MediaBridge;\n private sessionId: string;\n private scratchpadLoaded: boolean = false;\n private pendingScratchpadClear: boolean = false;\n\n // Advanced execution state\n private stepCounter: StepCounter;\n private toolResponseProcessor: ToolResponseProcessor;\n private goalInjector: GoalInjector | null = null;\n private continuationPlanner: ContinuationPlanner | null = null;\n /** Frozen goal/plan injection text keyed by turn index — used when staticSystemPrompt is on */\n private _turnInjections: Map<number, string> = new Map();\n\n // MCP\n private mcpRegistry: MCPClientRegistry | null = null;\n /** Resolves when all MCP servers are connected; awaited by run() and stream() */\n private mcpReady: Promise<void> | null = null;\n\n // Tool execution budget tracking\n private totalToolCallCount: number = 0;\n private perToolCallCount: Map<string, number> = new Map();\n private totalTokens: number = 0;\n\n constructor(config: SessionConfig) {\n this.config = config;\n this.adapter = config.adapter;\n this.logger = config.logger || new DefaultLogger();\n this.sessionId = config.sessionId || 'default';\n this.contextManager = new ContextManager();\n this.toolRegistry = new ToolRegistry(config.tools || [], {\n defaultTimeoutMs: config.toolRegistryTimeoutMs ?? 30_000\n });\n this.skillInjector = new SkillInjector(config.skills || []);\n\n // Apply dynamic skill selectors from config\n if (config.activeDynamicSkills && config.activeDynamicSkills.length > 0) {\n for (const name of config.activeDynamicSkills) {\n this.skillInjector.enableSkill(name);\n }\n }\n if (config.activeDynamicTags && config.activeDynamicTags.length > 0) {\n this.skillInjector.enableByTags(config.activeDynamicTags);\n }\n\n this.media = new MediaBridge(this.adapter);\n\n // maxSteps guard (default 20)\n this.stepCounter = new StepCounter(config.maxSteps ?? 20);\n\n // Warn when maxSteps is explicitly set but maxIterations is not —\n // the default maxIterations=10 will stop the loop before maxSteps is reached\n // if the agent averages more than 1 tool call per iteration.\n if (config.maxSteps !== undefined && config.maxIterations === undefined) {\n const defaultMaxIts = 10;\n if (config.maxSteps > defaultMaxIts) {\n this.logger.warn(\n `[Config] maxSteps=${config.maxSteps} is set but maxIterations is not. ` +\n `The default maxIterations=${defaultMaxIts} may stop the agent before maxSteps is reached. ` +\n `Consider setting maxIterations to at least Math.ceil(maxSteps / avgToolCallsPerTurn).`\n );\n }\n }\n\n // Warn when maxSteps is unreachably large compared to maxIterations\n if (config.maxSteps !== undefined && config.maxIterations !== undefined) {\n if (config.maxSteps > config.maxIterations * 10) {\n this.logger.warn(\n `[Config] maxSteps (${config.maxSteps}) is much larger than maxIterations (${config.maxIterations}). ` +\n `The agent will be stopped by maxIterations before maxSteps is ever reached.`\n );\n }\n }\n\n // Tool response processor — accept custom instance or build from config\n this.toolResponseProcessor = (config.toolResponseProcessor instanceof ToolResponseProcessor\n ? config.toolResponseProcessor\n : config.toolResponseProcessor\n ? config.toolResponseProcessor as unknown as ToolResponseProcessor\n : new ToolResponseProcessor()) as ToolResponseProcessor;\n\n for (const strategy of config.compressionStrategies || []) {\n this.contextManager.registerStrategy(strategy);\n }\n\n // Register STM and Scratchpad tools if registry is provided\n if (config.stmRegistry) {\n this.toolRegistry.register(readChunkTool);\n this.toolRegistry.register(searchChunkTool);\n this.toolRegistry.register(listChunksTool);\n this.toolRegistry.register(updateChunkTool);\n this.toolRegistry.register(readScratchpadTool);\n this.toolRegistry.register(writeScratchpadTool);\n this.toolRegistry.register(removeScratchpadTool);\n this.toolRegistry.register(summarizeSandwichTool);\n }\n\n if (config.media?.enableTools) {\n const prefix = config.media.toolPrefix || 'media_';\n for (const tool of createMediaTools(prefix)) {\n this.toolRegistry.register(tool);\n }\n }\n\n this.context = {\n systemPrompt: config.systemPrompt || '',\n scratchpad: '',\n turns: [],\n tokenCount: 0,\n maxTokens: config.maxTokens,\n metadata: {}\n };\n\n // MCP server setup (non-blocking — tools are registered before first run())\n if (config.mcpServers && config.mcpServers.length > 0) {\n this.mcpRegistry = new MCPClientRegistry(this.logger);\n this.mcpReady = this._initMCP(config.mcpServers);\n }\n\n // Emit initial system trace\n const activeSkills = this.skillInjector.getActiveSkills();\n this.emitTrace('system', 'session_init', {\n config: {\n model: this.config.model,\n maxIterations: this.config.maxIterations,\n maxSteps: this.config.maxSteps,\n parallelToolCalls: this.config.parallelToolCalls,\n enableGoalPlanning: this.config.enableGoalPlanning,\n enableContinuationPlanning: this.config.enableContinuationPlanning\n },\n skills: {\n total: (config.skills || []).length,\n active: activeSkills.length,\n fixed: activeSkills.filter(s => s.strategy !== 'dynamic').length,\n dynamic: activeSkills.filter(s => s.strategy === 'dynamic').length,\n }\n });\n\n // Emit per-skill load traces\n for (const skill of activeSkills) {\n this.emitTrace('skill', 'skill_load', {\n name: skill.name,\n version: skill.version,\n strategy: skill.strategy ?? 'fixed',\n inject: skill.inject,\n priority: skill.priority,\n tags: skill.tags ?? [],\n requiredTools: skill.requiredTools ?? [],\n });\n }\n }\n\n // -----------------------------------------------------------------------\n // Trace helper\n // -----------------------------------------------------------------------\n\n private emitTrace(\n type: TraceEvent['type'],\n name: string,\n metadata?: Record<string, any>,\n input?: any,\n output?: any,\n status: 'running' | 'done' | 'error' = 'done'\n ) {\n if (this.config.onTrace) {\n this.config.onTrace({\n type,\n name,\n metadata: metadata || {},\n input,\n output,\n status,\n startedAt: Date.now()\n });\n }\n }\n\n private async ensureScratchpadLoaded(): Promise<void> {\n if (!this.config.scratchpadAdapter) return;\n if (this.pendingScratchpadClear) {\n await this.config.scratchpadAdapter.clear(this.sessionId);\n this.context.scratchpad = '';\n this.pendingScratchpadClear = false;\n this.scratchpadLoaded = true;\n return;\n }\n if (this.scratchpadLoaded) return;\n const stored = await this.config.scratchpadAdapter.read(this.sessionId);\n this.context.scratchpad = stored ?? '';\n this.scratchpadLoaded = true;\n }\n\n // -----------------------------------------------------------------------\n // Public accessors\n // -----------------------------------------------------------------------\n\n /** Returns a shallow copy of the current context window. */\n getContext(): ContextWindow {\n return { ...this.context };\n }\n\n /** Returns the current conversation history. */\n getHistory() {\n return [...this.context.turns];\n }\n\n /**\n * Populates the session context with a pre-existing conversation history.\n *\n * Turns are assigned sequential `turnIndex` values starting from 0 and the\n * context `tokenCount` is recalculated automatically. Call this immediately\n * after construction and before the first `run()` / `stream()`.\n *\n * @param history - Raw history entries (role + content, optional toolCalls/toolResults).\n *\n * @example\n * ```typescript\n * const session = new SessionManager(config);\n * session.loadHistory(savedMessages);\n * const answer = await session.run('Continue where we left off.');\n * ```\n */\n loadHistory(history: Array<{\n role: Turn['role'];\n content: Turn['content'];\n toolCalls?: Turn['toolCalls'];\n toolResults?: Turn['toolResults'];\n }>): void {\n this.context.turns = history.map((m, i) => ({\n role: m.role,\n content: m.content ?? '',\n tokenCount: this.adapter.estimateTokens(\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content)\n ),\n turnIndex: i,\n compressed: false,\n ...(m.toolCalls ? { toolCalls: m.toolCalls } : {}),\n ...(m.toolResults ? { toolResults: m.toolResults } : {}),\n }));\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.emitTrace('system', 'history_loaded', { turnCount: this.context.turns.length });\n }\n\n /** Returns the `MediaBridge` for direct ASR / TTS / Vision / Image-gen calls. */\n getMedia() {\n return this.media;\n }\n\n /**\n * Returns the `ToolRegistry` for runtime tool management.\n *\n * Use this to register or unregister tools after session construction:\n *\n * ```typescript\n * // Add a tool after the user authenticates\n * session.tools.register(paymentTool);\n *\n * // Remove a tool when no longer needed\n * session.tools.unregister('send_payment');\n *\n * // Inspect what's registered\n * const active = session.tools.getAll();\n * console.log(active.map(t => t.name));\n * ```\n *\n * @since 1.4.0\n */\n get tools(): ToolRegistry {\n return this.toolRegistry;\n }\n\n /**\n * Returns the `SkillInjector` for runtime skill management.\n *\n * Use this to enable or disable dynamic skills after session construction:\n *\n * ```typescript\n * session.skills.enableSkill('code-review');\n * session.skills.enableByTags(['debugging']);\n * session.skills.disableSkill('verbose-mode');\n * const requiredTools = session.skills.getRequiredTools();\n * ```\n *\n * @since 1.4.0\n */\n get skills(): SkillInjector {\n return this.skillInjector;\n }\n\n // -----------------------------------------------------------------------\n // Continuation planning API\n // -----------------------------------------------------------------------\n\n /**\n * Sets an explicit multi-step continuation plan that will be tracked and\n * injected as a status block before each ReAct iteration.\n *\n * Dependency tracking, condition evaluation, `outputKey` storage, and\n * `inputMapping` resolution are all handled automatically by the planner.\n *\n * @param steps - The ordered list of continuation steps.\n * @param strategy - Execution strategy ('sequential' | 'parallel' | 'conditional'). Default: 'sequential'.\n *\n * @example\n * ```typescript\n * await session.setPlan([\n * { stepId: 'fetch', toolName: 'fetch_data', description: 'Get data', dependsOn: [], outputKey: 'rawData' },\n * { stepId: 'analyze', toolName: 'analyze', description: 'Analyze', dependsOn: ['fetch'], inputMapping: { data: 'rawData' } },\n * ]);\n * const result = await session.run('Run the data pipeline.');\n * ```\n */\n setPlan(\n steps: ContinuationStep[],\n strategy: ContinuationPlan['strategy'] = 'sequential'\n ): void {\n this.continuationPlanner = new ContinuationPlanner(\n { steps, currentStepIndex: 0, strategy },\n {\n onStepFailed: (stepId, reason) => this.emitTrace('planning', 'step_failed', { stepId, reason }),\n onStepSkipped: (stepId, reason) => this.emitTrace('planning', 'step_skipped', { stepId, reason }),\n }\n );\n // Store plan in metadata so it survives context compression\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.logger.debug(`[ContinuationPlanner] Plan set with ${steps.length} steps (strategy: ${strategy})`);\n this.emitTrace('planning', 'plan_set', { stepCount: steps.length, strategy });\n }\n\n // -----------------------------------------------------------------------\n // Plan inspection API\n // -----------------------------------------------------------------------\n\n /**\n * Returns a snapshot of the current continuation plan, or `null` if no plan\n * has been set via `setPlan()`.\n *\n * Use this after `run()` to inspect which steps completed, failed, or were skipped.\n *\n * @since 1.4.4\n *\n * @example\n * ```typescript\n * await session.run('Run the pipeline');\n * const plan = session.getPlan();\n * const failed = plan?.steps.filter(s => s.status === 'failed');\n * ```\n */\n getPlan(): import('./execution/ContinuationPlanner.js').ContinuationPlan | null {\n return this.continuationPlanner ? this.continuationPlanner.getPlan() : null;\n }\n\n // -----------------------------------------------------------------------\n // Goal planning API\n // -----------------------------------------------------------------------\n\n /**\n * Manually sets the agent's goal, bypassing the automatic mini-planning LLM call.\n *\n * Use this when you already know the goal structure upfront.\n *\n * @example\n * ```typescript\n * await session.setGoal({\n * statement: 'Audit the authentication module',\n * decomposition: ['Read src/auth/', 'Identify SQL injection risks', 'Write report'],\n * successCriteria: ['Report covers all audit areas', 'Each finding has a severity rating'],\n * });\n * const result = await session.run('Begin the security audit.');\n * ```\n */\n setGoal(goal: Omit<Goal, 'id' | 'injectionFrequency' | 'injectionPosition'>): void {\n this.goalInjector = new GoalInjector({\n id: 'manual',\n statement: goal.statement,\n decomposition: goal.decomposition ?? [],\n successCriteria: goal.successCriteria ?? [],\n injectionFrequency: this.config.goalInjectionFrequency ?? 'always',\n injectionPosition: this.config.goalInjectionPosition ?? 'system_prompt',\n completedSubGoals: goal.completedSubGoals ?? [],\n });\n // Store in context metadata so it persists across compression\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n this.logger.debug('[GoalInjector] Goal set manually');\n this.emitTrace('planning', 'goal_set_manual', {\n statement: goal.statement,\n subGoals: goal.decomposition?.length ?? 0\n });\n }\n\n // -----------------------------------------------------------------------\n // MCP initialisation\n // -----------------------------------------------------------------------\n\n /**\n * Connects all configured MCP servers and registers their bridged tools.\n * Called from the constructor as a fire-and-start async task; `run()` and\n * `stream()` await `this.mcpReady` before executing.\n */\n private async _initMCP(\n mcpServers: NonNullable<import('../types/agent.js').SessionConfig['mcpServers']>\n ): Promise<void> {\n if (!this.mcpRegistry) return;\n\n this.emitTrace('system', 'mcp_init_start', { serverCount: mcpServers.length });\n this.logger.info(`[MCP] Connecting to ${mcpServers.length} server(s)...`);\n\n for (const serverConfig of mcpServers) {\n try {\n await this.mcpRegistry.register(serverConfig.name, serverConfig);\n this.emitTrace('system', 'mcp_server_connected', { server: serverConfig.name });\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n this.logger.error(`[MCP] Failed to connect '${serverConfig.name}': ${msg}`);\n this.emitTrace('error', 'mcp_server_failed', { server: serverConfig.name, error: msg });\n // Non-fatal: continue connecting remaining servers\n }\n }\n\n // Discover and register bridged tools into the shared ToolRegistry\n const bridgedTools = await this.mcpRegistry.discoverTools();\n for (const tool of bridgedTools) {\n try {\n this.toolRegistry.register(tool);\n } catch {\n // Already registered (name collision with native tool) — skip\n this.logger.warn(`[MCP] Tool '${tool.name}' conflicts with an existing tool — skipping`);\n }\n }\n\n this.logger.info(`[MCP] ${bridgedTools.length} MCP tool(s) registered`);\n this.emitTrace('system', 'mcp_init_done', {\n servers: this.mcpRegistry.getRegisteredServers(),\n toolCount: bridgedTools.length\n });\n }\n\n // -----------------------------------------------------------------------\n // Goal mini-planning step (one extra LLM call, gated by enableGoalPlanning)\n // -----------------------------------------------------------------------\n\n /**\n * Runs a dedicated planning prompt against the LLM to decompose the user's\n * message into sub-goals and success criteria. Called once at the start of\n * the first `run()` when `enableGoalPlanning` is true and no goal has been\n * manually set via `setGoal()`.\n */\n private async _runMiniPlanningStep(userMessage: string): Promise<void> {\n const planningPrompt = `Given this goal: \"${userMessage}\"\n\n1. List the sub-goals needed to achieve this (max 5, be specific)\n2. List success criteria — what does \"done\" look like? (max 3, binary, measurable)\n\nRespond ONLY with valid JSON (no markdown, no explanations):\n{ \"subGoals\": string[], \"successCriteria\": string[] }`;\n\n try {\n const response = await this.adapter.complete({\n model: this.config.model,\n messages: [{ role: 'user', content: planningPrompt }],\n maxTokens: this.config.maxCompletionTokens ?? 4_000,\n });\n\n // Parse JSON — strip code fences first, then fall back to regex extraction\n // in case the model wraps the object in prose\n const stripped = response.content.replace(/```json|```/g, '').trim();\n const jsonMatch = stripped.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(`No JSON object found in mini-planning response: \"${stripped.slice(0, 200)}\"`);\n }\n const parsed = JSON.parse(jsonMatch[0]) as { subGoals?: string[]; successCriteria?: string[] };\n\n if (this.goalInjector && Array.isArray(parsed.subGoals)) {\n this.goalInjector.updateDecomposition(\n parsed.subGoals,\n Array.isArray(parsed.successCriteria) ? parsed.successCriteria : undefined\n );\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n this.emitTrace('planning', 'mini_plan_done', {\n subGoals: parsed.subGoals,\n successCriteria: parsed.successCriteria\n });\n this.logger.debug(`[GoalInjector] Mini-plan: ${parsed.subGoals.length} sub-goals`);\n }\n } catch (err: unknown) {\n // Non-fatal: continue without decomposition\n this.logger.warn(`[GoalInjector] Mini-planning step failed: ${(err as Error).message ?? String(err)}`);\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /** Builds the system prompt, injecting skills and goal if configured. */\n private buildSystemPrompt(userMessage?: string, iteration: number = 0): string {\n let prompt = this.context.systemPrompt || '';\n\n // When staticSystemPrompt is enabled the system prompt must never vary between\n // iterations — this keeps the KV-cache prefix 100% stable and avoids costly\n // re-computation on every turn. Continuation plan status is therefore injected\n // into the *last user message* by buildMessages instead.\n const isStatic = this.config.staticSystemPrompt === true;\n\n // Inject goal into system prompt (when position === 'system_prompt')\n if (!isStatic && this.goalInjector && this.config.goalInjectionPosition !== 'pre_turn') {\n const shouldInject = this.goalInjector.shouldInjectThisTurn(\n iteration,\n false,\n this.config.goalInjectionN ?? 3\n );\n if (shouldInject) {\n prompt = this.goalInjector.injectInto(prompt);\n this.emitTrace('planning', 'goal_injected', {\n position: 'system_prompt',\n iteration\n });\n }\n }\n\n // Inject continuation plan status block (skipped when staticSystemPrompt is on)\n if (!isStatic && this.continuationPlanner && this.config.enableContinuationPlanning) {\n const planStatus = this.continuationPlanner.getPlanStatusString();\n prompt += `\\n\\n${planStatus}`;\n }\n\n const injectedSkills = this.skillInjector.buildInjectionBlock(\n 'system_prompt',\n this.config.skillTokenBudget\n );\n if (injectedSkills) {\n prompt += '\\n\\n' + injectedSkills;\n }\n\n return prompt.trim();\n }\n\n /** Builds the messages array for the provider from the current context. */\n private buildMessages(systemPrompt: string, iteration: number = 0): NormalizedMessage[] {\n const messages: NormalizedMessage[] = this.context.turns.map(t => ({\n role: t.role,\n content: t.content,\n ...(t.role === 'tool' && t.toolResults?.[0] ? { name: t.toolResults[0].toolCallId } : {}),\n ...(t.role === 'assistant' && t.toolCalls ? { toolCalls: t.toolCalls } : {})\n })) as NormalizedMessage[];\n\n if (systemPrompt) {\n messages.unshift({ role: 'system', content: systemPrompt });\n }\n\n // pre_turn goal injection — injects as a system message just before the last user turn\n if (!this.config.staticSystemPrompt && this.goalInjector && this.config.goalInjectionPosition === 'pre_turn') {\n const shouldInject = this.goalInjector.shouldInjectThisTurn(\n iteration,\n false,\n this.config.goalInjectionN ?? 3\n );\n if (shouldInject) {\n const goalBlock = this.goalInjector.getFormattedBlock();\n messages.push({ role: 'system', content: goalBlock });\n this.emitTrace('planning', 'goal_injected', { position: 'pre_turn', iteration });\n }\n }\n\n // KV-cache frozen turn injections — only active when staticSystemPrompt is on.\n // Dynamic content (goal state, continuation plan) is appended exclusively to the\n // *latest* user/tool message so older turns are never mutated between iterations,\n // keeping their token prefix identical and allowing the provider to reuse cached KV.\n if (this.config.staticSystemPrompt) {\n const totalTurns = this.context.turns.length;\n for (let i = 0; i < totalTurns; i++) {\n const msgIndex = i + 1; // messages[0] is the system prompt\n if (msgIndex >= messages.length) continue;\n const msg = messages[msgIndex]!;\n if (msg.role !== 'user' && msg.role !== 'tool') continue;\n\n let injectionBlock: string;\n\n if (i === totalTurns - 1) {\n // Latest turn — generate fresh dynamic content\n const blocks: string[] = [];\n if (this.goalInjector) {\n const shouldInject = this.goalInjector.shouldInjectThisTurn(\n iteration, false, this.config.goalInjectionN ?? 3\n );\n if (shouldInject) blocks.push(this.goalInjector.getFormattedBlock());\n }\n if (this.continuationPlanner && this.config.enableContinuationPlanning) {\n blocks.push(this.continuationPlanner.getPlanStatusString());\n }\n injectionBlock = blocks.length > 0\n ? `\\n\\n<lemura:agent-state>\\n${blocks.join('\\n\\n')}\\n</lemura:agent-state>`\n : '';\n this._turnInjections.set(i, injectionBlock);\n if (injectionBlock) {\n this.emitTrace('planning', 'goal_injected', { position: 'frozen_turn', turnIndex: i, iteration });\n }\n } else {\n // Past turn — replay the frozen block so token prefix never changes\n injectionBlock = this._turnInjections.get(i) ?? '';\n }\n\n if (!injectionBlock) continue;\n\n // Shallow-copy the message to avoid mutating context turns\n if (Array.isArray(msg.content)) {\n messages[msgIndex] = {\n ...msg,\n content: msg.content.map(item =>\n (item as { type?: string; text?: string }).type === 'text'\n ? { ...(item as object), text: (item as { text: string }).text + injectionBlock }\n : item\n )\n } as NormalizedMessage;\n } else {\n messages[msgIndex] = { ...msg, content: ((msg.content as string) ?? '') + injectionBlock } as NormalizedMessage;\n }\n }\n }\n\n return messages;\n }\n\n /** Checks the tool execution budget and throws descriptively if exceeded. */\n private checkExecutionBudget(toolName: string): void {\n const budget = this.config.toolExecutionBudget;\n if (!budget) return;\n\n if (budget.maxCallsPerSession !== undefined && this.totalToolCallCount >= budget.maxCallsPerSession) {\n const err = new LemuraMaxIterationsError(\n `Tool execution budget exceeded: session limit of ${budget.maxCallsPerSession} tool calls reached`\n );\n this.logger.warn(err.message);\n throw err;\n }\n\n if (budget.maxCallsPerTool?.[toolName] !== undefined) {\n const current = this.perToolCallCount.get(toolName) ?? 0;\n if (current >= (budget.maxCallsPerTool[toolName] ?? Infinity)) {\n const err = new LemuraMaxIterationsError(\n `Tool execution budget exceeded: '${toolName}' has reached its per-tool limit of ${budget.maxCallsPerTool[toolName]}`\n );\n this.logger.warn(err.message);\n this.emitTrace('budget', 'tool_limit_exceeded', {\n toolName,\n limit: budget.maxCallsPerTool[toolName],\n totalTokens: this.totalTokens\n });\n throw err;\n }\n }\n\n this.emitTrace('budget', 'check_passed', {\n toolName,\n totalCalls: this.totalToolCallCount,\n totalTokens: this.totalTokens,\n tokenBudgetRemaining: this.config.maxTokens - this.totalTokens\n });\n }\n\n /** Records a tool call in budget counters. */\n private recordToolCall(toolName: string): void {\n this.totalToolCallCount++;\n this.perToolCallCount.set(toolName, (this.perToolCallCount.get(toolName) ?? 0) + 1);\n }\n\n // -----------------------------------------------------------------------\n // Blob detection helpers\n // -----------------------------------------------------------------------\n\n private isProbablyBase64(value: string): boolean {\n const v = value.trim();\n if (v.startsWith('data:') && v.includes(';base64,')) return true;\n if (v.length < 4096) return false;\n if (/[^A-Za-z0-9+/=]/.test(v)) return false;\n return true;\n }\n\n private isBinaryLike(value: unknown): boolean {\n if (!value) return false;\n if (typeof ArrayBuffer !== 'undefined') {\n if (value instanceof ArrayBuffer) return true;\n if (ArrayBuffer.isView(value)) return true;\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) return true;\n return false;\n }\n\n private async storeBlob(content: any, metadata: Record<string, unknown>): Promise<string | null> {\n if (!this.config.stmRegistry) return null;\n return this.config.stmRegistry.register(content, 'blob', metadata);\n }\n\n private async scrubBlobFields(\n value: any,\n toolName: string,\n depth: number = 0\n ): Promise<{ value: any; changed: boolean }> {\n if (!value || typeof value !== 'object') return { value, changed: false };\n if (depth > 2) return { value, changed: false };\n\n if (Array.isArray(value)) {\n let changed = false;\n const out = [];\n for (const item of value) {\n const res = await this.scrubBlobFields(item, toolName, depth + 1);\n out.push(res.value);\n if (res.changed) changed = true;\n }\n return { value: out, changed };\n }\n\n const obj: Record<string, any> = { ...value };\n let changed = false;\n for (const [key, v] of Object.entries(obj)) {\n if (typeof v === 'string' && this.isProbablyBase64(v)) {\n const ref = await this.storeBlob(v, {\n toolName,\n key,\n encoding: v.startsWith('data:') ? 'data_url' : 'base64'\n });\n if (ref) {\n obj[key] = ref;\n obj[`${key}Note`] = 'Stored in STM';\n changed = true;\n }\n continue;\n }\n\n if (this.isBinaryLike(v)) {\n const ref = await this.storeBlob(v, { toolName, key });\n if (ref) {\n obj[key] = ref;\n obj[`${key}Note`] = 'Stored in STM';\n changed = true;\n }\n continue;\n }\n\n if (typeof v === 'object' && v !== null) {\n const nested = await this.scrubBlobFields(v, toolName, depth + 1);\n obj[key] = nested.value;\n if (nested.changed) changed = true;\n }\n }\n\n return { value: obj, changed };\n }\n\n /**\n * Processes a firewall decision for a tool call.\n * Returns true to proceed, false to block.\n */\n private async passesFirewall(\n toolName: string,\n argsJson: string,\n toolCallId: string,\n toolResults: Array<{ toolCallId: string; content: string }>\n ): Promise<boolean> {\n const firewall = evaluateToolFirewall(\n this.config.toolFirewall,\n toolName,\n argsJson,\n this.logger\n );\n\n if (firewall.decision === 'deny') {\n this.logger.warn(`Tool blocked by firewall: ${toolName}`, { reason: firewall.reason });\n toolResults.push({ toolCallId, content: `Blocked by tool firewall: ${firewall.reason}` });\n return false;\n }\n\n if (firewall.decision === 'ask') {\n if (this.config.toolFirewall?.onAsk) {\n const userDecision = await this.config.toolFirewall.onAsk(toolName, argsJson);\n if (userDecision === 'deny') {\n this.logger.warn(`Tool blocked by firewall (ask → deny): ${toolName}`, { reason: firewall.reason });\n toolResults.push({ toolCallId, content: `Blocked by tool firewall: ${firewall.reason}` });\n return false;\n }\n // accept falls through\n } else {\n this.logger.warn(`Tool blocked by firewall (ask without handler): ${toolName}`, { reason: firewall.reason });\n toolResults.push({ toolCallId, content: `Blocked by tool firewall: ${firewall.reason}` });\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Executes a single parsed tool call and returns the serialised result string.\n * Also handles continuation plan tracking (step status + output storage).\n */\n private async executeSingleToolCall(\n tc: { id: string; name: string; arguments: string }\n ): Promise<string> {\n // Budget check\n this.checkExecutionBudget(tc.name);\n\n let args: Record<string, unknown> = JSON.parse(tc.arguments);\n\n // Continuation planner: resolve inputMapping if a matching step exists\n if (this.continuationPlanner) {\n const plan = this.continuationPlanner.getPlan();\n const matchingStep = plan.steps.find(\n s => s.toolName === tc.name && s.status === 'pending'\n );\n if (matchingStep) {\n this.continuationPlanner.markStepRunning(matchingStep.stepId);\n args = this.continuationPlanner.resolveInputs(matchingStep, args);\n }\n }\n\n const executeContext: Record<string, unknown> = {\n sessionId: this.sessionId,\n turnIndex: this.context.turns.length,\n logger: this.logger,\n adapter: this.adapter,\n stmRegistry: this.config.stmRegistry,\n scratchpad: this.context.scratchpad,\n scratchpadAdapter: this.config.scratchpadAdapter\n };\n if (this.config.ragAdapter) {\n executeContext['ragAdapter'] = this.config.ragAdapter;\n }\n\n this.logger.debug(`Executing tool: ${tc.name}`, { args: JSON.stringify(args) });\n this.emitTrace('tool_call', tc.name, { id: tc.id }, JSON.stringify(args), null, 'running');\n\n let result: unknown;\n let executionError: Error | null = null;\n\n try {\n result = await this.toolRegistry.execute(tc.name, args, executeContext as never);\n } catch (err: unknown) {\n executionError = err as Error;\n // Mark continuation step as failed\n if (this.continuationPlanner) {\n const plan = this.continuationPlanner.getPlan();\n const runningStep = plan.steps.find(\n s => s.toolName === tc.name && s.status === 'running'\n );\n if (runningStep) {\n this.continuationPlanner.markStepFailed(runningStep.stepId);\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n }\n }\n throw executionError;\n }\n\n this.recordToolCall(tc.name);\n this.logger.debug(`Tool ${tc.name} returned successfully`);\n\n // Scratchpad update\n let finalResult = result;\n if (typeof result === 'object' && result !== null) {\n const resObj = result as Record<string, unknown>;\n if (resObj['status'] === 'success' && resObj['newScratchpad'] !== undefined) {\n this.context.scratchpad = resObj['newScratchpad'] as string;\n finalResult = resObj['note'] || 'Scratchpad updated';\n this.emitTrace('planning', 'scratchpad_update', { note: resObj['note'] });\n }\n }\n\n // Blob/binary guard: stash in STM and return refs\n if (this.config.stmRegistry) {\n if (typeof finalResult === 'string' && this.isProbablyBase64(finalResult)) {\n const ref = await this.storeBlob(finalResult, { toolName: tc.name, encoding: 'base64' });\n if (ref) {\n finalResult = { blobRef: ref, note: 'Binary content stored in STM' };\n }\n } else if (this.isBinaryLike(finalResult)) {\n const ref = await this.storeBlob(finalResult, { toolName: tc.name });\n if (ref) {\n finalResult = { blobRef: ref, note: 'Binary content stored in STM' };\n }\n } else if (typeof finalResult === 'object' && finalResult !== null) {\n const scrubbed = await this.scrubBlobFields(finalResult, tc.name);\n if (scrubbed.changed) finalResult = scrubbed.value;\n }\n }\n\n // Serialise + token cap\n let content = JSON.stringify(finalResult);\n const tokenCount = this.adapter.estimateTokens(content);\n if (this.config.maxTokensPerTool && tokenCount > this.config.maxTokensPerTool) {\n content = content.slice(0, this.config.maxTokensPerTool * 4) + '... [TRUNCATED DUE TO TOOL TOKEN LIMIT]';\n }\n\n // Tool response compression\n const toolDef: IToolDefinition = this.toolRegistry.get(tc.name) || {\n name: tc.name,\n description: '',\n parameters: {},\n execute: async () => undefined\n };\n const evaluation = this.toolResponseProcessor.evaluate(content, toolDef, this.context);\n if (evaluation.shouldCompress && !evaluation.errorDetected) {\n content = this.toolResponseProcessor.compress(content, evaluation);\n this.emitTrace('compression', tc.name, { originalSize: evaluation.sizeClass }, null, content);\n }\n\n // Continuation planner: mark step done, store output\n if (this.continuationPlanner) {\n const plan = this.continuationPlanner.getPlan();\n const runningStep = plan.steps.find(\n s => s.toolName === tc.name && s.status === 'running'\n );\n if (runningStep) {\n // Run semantic verifier if provided\n if (runningStep.verify) {\n const maxRetries = runningStep.verify.maxRetries ?? 0;\n const retryCount = this.continuationPlanner.getRetryCount(runningStep.stepId);\n let verdict: import('./execution/ContinuationPlanner.js').StepVerifierResult;\n try {\n verdict = await runningStep.verify.check(content, args);\n } catch (verifyErr: unknown) {\n verdict = { status: 'fail', reason: `Verifier threw: ${(verifyErr as Error).message}` };\n }\n\n if (verdict.status === 'fail' || (verdict.status === 'retry' && retryCount >= maxRetries)) {\n this.continuationPlanner.markStepFailed(runningStep.stepId);\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.emitTrace('planning', 'step_failed', {\n stepId: runningStep.stepId,\n reason: verdict.reason ?? 'verifier returned fail',\n retryCount\n });\n return content;\n }\n\n if (verdict.status === 'retry') {\n this.continuationPlanner.markStepPending(runningStep.stepId);\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.emitTrace('planning', 'step_retry', {\n stepId: runningStep.stepId,\n reason: verdict.reason,\n retryCount: this.continuationPlanner.getRetryCount(runningStep.stepId)\n });\n return content;\n }\n // verdict === 'pass' — fall through to markStepDone\n }\n\n this.continuationPlanner.markStepDone(runningStep.stepId, content);\n // Store in context.metadata['toolOutputs']\n if (runningStep.outputKey) {\n const outputs = (this.context.metadata['toolOutputs'] as Record<string, string>) ?? {};\n outputs[runningStep.outputKey] = content;\n this.context.metadata['toolOutputs'] = outputs;\n }\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.emitTrace('planning', 'step_done', {\n stepId: runningStep.stepId,\n outputKey: runningStep.outputKey\n });\n }\n }\n\n if (evaluation.suggestedAction === 'continue' && this.config.enableContinuationPlanning) {\n this.emitTrace('planning', 'continuation_detected', {\n toolName: tc.name,\n action: evaluation.suggestedAction\n });\n }\n\n this.emitTrace('tool_result', tc.name, { id: tc.id }, JSON.stringify(args), content, 'done');\n return content;\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Runs the full ReAct loop for a user message and returns the final assistant response.\n *\n * @param userMessage - The user's message (string or multimodal content blocks)\n * @returns The assistant's final response string\n * @throws {LemuraMaxIterationsError} When the loop exceeds `maxIterations`\n */\n async run(userMessage: string | ContentBlock[]): Promise<string> {\n if (this.mcpReady) await this.mcpReady;\n await this.ensureScratchpadLoaded();\n return this._executeLoop(userMessage, { label: 'run' });\n }\n\n /**\n * Runs the ReAct loop and streams the final assistant response token-by-token.\n *\n * All tool calls, goal verification, and corrections complete before any token\n * is yielded — the stream delivers only the clean final response.\n *\n * @param userMessage - The user's message (string or multimodal content blocks)\n * @returns An `AsyncIterable<string>` of delta tokens from the final response\n *\n * @example\n * ```typescript\n * for await (const token of session.stream('Tell me a story')) {\n * process.stdout.write(token);\n * }\n * ```\n */\n async *stream(userMessage: string | ContentBlock[]): AsyncIterable<string> {\n if (this.mcpReady) await this.mcpReady;\n await this.ensureScratchpadLoaded();\n\n const userMessageStr = Array.isArray(userMessage) ? '[Multimodal Content]' : userMessage;\n this.logger.info(`Starting streaming session run`, { model: this.config.model, message: userMessageStr });\n\n // Goal injector init\n if (this.config.enableGoalPlanning && !this.goalInjector) {\n this.goalInjector = new GoalInjector({\n id: 'auto',\n statement: typeof userMessage === 'string' ? userMessage : '[multimodal]',\n decomposition: [],\n successCriteria: ['The user request is fully answered'],\n injectionFrequency: this.config.goalInjectionFrequency ?? 'always',\n injectionPosition: this.config.goalInjectionPosition ?? 'system_prompt',\n });\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n await this._runMiniPlanningStep(userMessageStr);\n }\n\n this.context.turns.push({\n role: 'user',\n content: userMessage,\n tokenCount: Array.isArray(userMessage) ? userMessage.length * 50 : this.adapter.estimateTokens(userMessage),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n\n const maxIts = this.config.maxIterations || 10;\n this.iterations = 0;\n this.stepCounter = new StepCounter(this.config.maxSteps ?? 20);\n const maxCompletionTokens = this.config.maxCompletionTokens ?? 4_000;\n\n while (this.iterations < maxIts) {\n this.iterations++;\n this.logger.debug(`[stream] ReAct Iteration ${this.iterations}/${maxIts}`);\n\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.context = await this.contextManager.prepare(this.context);\n const systemPrompt = this.buildSystemPrompt(userMessageStr, this.iterations);\n const messages = this.buildMessages(systemPrompt, this.iterations);\n\n if (this.stepCounter.isMaxReached()) {\n messages.push({\n role: 'system',\n content: this.stepCounter.getForcedConclusionPrompt() + '\\n\\n' + FinalResponseFormatter.getRequiredStructure()\n });\n }\n\n // Use complete() for tool-call detection on non-final iterations\n let response;\n try {\n response = await this.adapter.complete({\n model: this.config.model,\n messages,\n tools: this.stepCounter.isMaxReached() ? [] : this.toolRegistry.getAll(),\n maxTokens: maxCompletionTokens\n });\n } catch (err: unknown) {\n this.logger.fatal(`Provider call failed: ${(err as Error).message}`);\n throw err;\n }\n\n // Tool calls — execute silently, no yielding\n if (response.finishReason === 'tool_call' && response.toolCalls) {\n this.logger.info(`[stream] Tool calls: ${response.toolCalls.map(tc => tc.name).join(', ')}`);\n this.stepCounter.increment(response.toolCalls.length);\n\n const toolResults: Array<{ toolCallId: string; content: string }> = [];\n for (const tc of response.toolCalls) {\n const ok = await this.passesFirewall(tc.name, tc.arguments, tc.id, toolResults);\n if (!ok) continue;\n try {\n toolResults.push({ toolCallId: tc.id, content: await this.executeSingleToolCall(tc) });\n } catch (e: unknown) {\n toolResults.push({ toolCallId: tc.id, content: `Error: ${e instanceof Error ? e.message : String(e)}` });\n }\n }\n\n const assistantTurn: Turn = {\n role: 'assistant', content: response.content || '',\n tokenCount: this.adapter.estimateTokens(response.content || '') + 50,\n turnIndex: this.context.turns.length, compressed: false, toolCalls: response.toolCalls\n };\n this.context.turns.push(assistantTurn);\n if (this.config.onTurn) this.config.onTurn(assistantTurn);\n\n for (const res of toolResults) {\n const toolTurn: Turn = {\n role: 'tool', content: res.content,\n tokenCount: this.adapter.estimateTokens(res.content),\n turnIndex: this.context.turns.length, compressed: false, toolResults: [res]\n };\n this.context.turns.push(toolTurn);\n if (this.config.onTurn) this.config.onTurn(toolTurn);\n }\n\n if (this.goalInjector) this.goalInjector.incrementTurn();\n continue;\n }\n\n // Final response — re-prepare context then stream it\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.context = await this.contextManager.prepare(this.context);\n const finalSystemPrompt = this.buildSystemPrompt(userMessageStr, this.iterations);\n const finalMessages = this.buildMessages(finalSystemPrompt, this.iterations);\n\n let accumulated = '';\n let finalTokenCount = 0;\n let finalFinishReason: string | undefined;\n\n for await (const chunk of this.adapter.stream({\n model: this.config.model, messages: finalMessages,\n maxTokens: maxCompletionTokens, stream: true\n })) {\n if (chunk.delta) {\n accumulated += chunk.delta;\n finalTokenCount += Math.ceil(chunk.delta.length / 4);\n yield chunk.delta;\n }\n if (chunk.finished) {\n finalFinishReason = chunk.finishReason;\n if (chunk.usage) this.totalTokens += chunk.usage.totalTokens;\n this.emitTrace('thinking', 'llm_stream_finished', {\n usage: chunk.usage, totalTokens: this.totalTokens, finishReason: chunk.finishReason\n });\n }\n }\n\n const finalTurn: Turn = {\n role: 'assistant', content: accumulated,\n tokenCount: finalTokenCount,\n turnIndex: this.context.turns.length, compressed: false\n };\n this.context.turns.push(finalTurn);\n if (this.config.onTurn) this.config.onTurn(finalTurn);\n\n // Goal verification — runs AFTER yielding, never causes a second stream\n if (finalFinishReason === 'stop') {\n const verdict = await this._verifyGoal(this.context.turns);\n if (verdict && !verdict.achieved && verdict.missing) {\n this.logger.info(`[GoalVerifier] Incomplete — running silent correction: \"${verdict.missing}\"`);\n this.emitTrace('verification', 'goal_correction_start', {\n missing: verdict.missing,\n reason: verdict.reason\n });\n try {\n const corrMsgs = this.buildMessages(this.buildSystemPrompt(verdict.missing, this.iterations), this.iterations);\n corrMsgs.push({ role: 'user', content: verdict.missing });\n const correction = await this.adapter.complete({\n model: this.config.model, messages: corrMsgs, maxTokens: maxCompletionTokens\n });\n if (correction.content) {\n this.context.turns.push({\n role: 'assistant', content: correction.content,\n tokenCount: correction.usage?.completionTokens ?? this.adapter.estimateTokens(correction.content),\n turnIndex: this.context.turns.length, compressed: false\n });\n this.emitTrace('verification', 'goal_correction_done', {\n missing: verdict.missing,\n correctionTokens: correction.usage?.completionTokens\n });\n }\n } catch (err: unknown) {\n const errMsg = (err as Error).message;\n this.logger.warn(`[GoalVerifier] Correction failed (non-fatal): ${errMsg}`);\n this.emitTrace('error', 'goal_correction_failed', { error: errMsg }, null, null, 'error');\n }\n\n // Final check after correction — surface a visible warning in the stream if still unmet\n const finalVerdict = await this._verifyGoal(this.context.turns);\n if (finalVerdict && !finalVerdict.achieved) {\n this.logger.warn(`[GoalVerifier] Final verification failed: ${finalVerdict.reason}`);\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: false, reason: finalVerdict.reason, missing: finalVerdict.missing\n }, null, null, 'error');\n const warningBlock = `\\n\\n---\\n\\n⚠️ **Goal Verification Warning**\\n* **Status:** Success criteria not fully met.\\n* **Reason:** ${finalVerdict.reason ?? 'Unknown'}\\n* **Missing:** ${finalVerdict.missing ?? 'Not specified'}\\n\\n`;\n yield warningBlock;\n const lastTurn = [...this.context.turns].reverse().find(t => t.role === 'assistant');\n if (lastTurn) lastTurn.content = (lastTurn.content as string) + warningBlock;\n }\n }\n }\n\n this.logger.info(`[stream] Streaming run completed`);\n return;\n }\n\n throw new LemuraMaxIterationsError(`Exceeded max iterations of ${maxIts}`);\n }\n\n /**\n * Core ReAct execution loop shared by `run()` and `stream()`.\n *\n * Uses `adapter.complete()` exclusively — no streaming occurs here.\n * Goal verification and silent corrections run inside this method,\n * fully isolated from the caller's delivery path.\n *\n * @returns The final assistant response string\n * @throws {LemuraMaxIterationsError} When the loop exceeds `maxIterations`\n */\n private async _executeLoop(\n userMessage: string | ContentBlock[],\n opts: { label: string }\n ): Promise<string> {\n const userMessageStr = Array.isArray(userMessage) ? '[Multimodal Content]' : userMessage;\n this.logger.info(`Starting new session run`, {\n model: this.config.model,\n message: userMessageStr\n });\n\n // Goal injector: initialise on first run if enableGoalPlanning and no manual goal set\n if (this.config.enableGoalPlanning && !this.goalInjector) {\n this.goalInjector = new GoalInjector({\n id: 'auto',\n statement: typeof userMessage === 'string' ? userMessage : '[multimodal]',\n decomposition: [],\n successCriteria: ['The user request is fully answered'],\n injectionFrequency: this.config.goalInjectionFrequency ?? 'always',\n injectionPosition: this.config.goalInjectionPosition ?? 'system_prompt',\n });\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n this.logger.debug('Goal injector initialised (auto)');\n this.emitTrace('planning', 'goal_init', {\n statement: this.goalInjector.getGoal().statement,\n criteria: this.goalInjector.getGoal().successCriteria\n });\n await this._runMiniPlanningStep(userMessageStr);\n }\n\n // Push user turn\n this.context.turns.push({\n role: 'user',\n content: userMessage,\n tokenCount: Array.isArray(userMessage)\n ? userMessage.length * 50\n : this.adapter.estimateTokens(userMessage),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n\n const maxIts = this.config.maxIterations || 10;\n this.iterations = 0;\n this.stepCounter = new StepCounter(this.config.maxSteps ?? 20);\n const maxCompletionTokens = this.config.maxCompletionTokens ?? 4_000;\n let goalVerificationDone = false;\n\n while (this.iterations < maxIts) {\n this.iterations++;\n this.logger.debug(`[${opts.label}] ReAct Iteration ${this.iterations}/${maxIts}`);\n\n // Sync token count and compress if needed\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.context = await this.contextManager.prepare(this.context);\n\n const systemPrompt = this.buildSystemPrompt(userMessageStr, this.iterations);\n const messages = this.buildMessages(systemPrompt, this.iterations);\n\n // maxSteps guard — inject forced-conclusion prompt\n if (this.stepCounter.isMaxReached()) {\n this.logger.warn(`maxSteps (${this.config.maxSteps ?? 20}) reached — forcing final response`);\n messages.push({\n role: 'system',\n content: this.stepCounter.getForcedConclusionPrompt() + '\\n\\n' + FinalResponseFormatter.getRequiredStructure()\n });\n this.emitTrace('planning', 'max_steps_reached', {\n maxSteps: this.config.maxSteps,\n currentSteps: this.stepCounter.count\n });\n }\n\n // Call provider\n this.logger.debug(`Calling provider adapter (${this.adapter.name})...`);\n this.emitTrace('thinking', 'llm_call', {\n model: this.config.model,\n iteration: this.iterations,\n totalTokens: this.totalTokens\n }, null, null, 'running');\n\n let response;\n try {\n response = await this.adapter.complete({\n model: this.config.model,\n messages,\n tools: this.stepCounter.isMaxReached() ? [] : this.toolRegistry.getAll(),\n maxTokens: maxCompletionTokens\n });\n } catch (err: unknown) {\n const e = err as { problem?: string; hints?: string[]; message?: string };\n const metadata = e.problem ? { problem: e.problem, hints: e.hints ?? [] } : {};\n this.logger.fatal(`Provider call failed: ${e.message ?? String(err)}`, metadata);\n this.emitTrace('error', 'llm_call_failed', { error: e.message ?? String(err) });\n throw err;\n }\n\n if (response.usage) this.totalTokens += response.usage.totalTokens;\n this.emitTrace('thinking', 'llm_call', {\n model: this.config.model,\n usage: response.usage,\n totalTokens: this.totalTokens\n }, null, response.content, 'done');\n\n // Tool calls\n if (response.finishReason === 'tool_call' && response.toolCalls) {\n this.logger.info(`Assistant requested ${response.toolCalls.length} tool calls`, {\n tools: response.toolCalls.map(tc => tc.name)\n });\n this.stepCounter.increment(response.toolCalls.length);\n\n const toolResults: Array<{ toolCallId: string; content: string }> = [];\n\n if (this.config.parallelToolCalls) {\n const budget = this.config.toolExecutionBudget;\n const maxConcurrent = budget?.maxConcurrentCalls ?? response.toolCalls.length;\n\n for (let i = 0; i < response.toolCalls.length; i += maxConcurrent) {\n const batch: ToolCall[] = response.toolCalls.slice(i, i + maxConcurrent);\n\n const allowed: ToolCall[] = [];\n for (const tc of batch) {\n const ok = await this.passesFirewall(tc.name, tc.arguments, tc.id, toolResults);\n if (ok) allowed.push(tc);\n else this.emitTrace('budget', 'firewall_blocked', { toolName: tc.name });\n }\n\n this.emitTrace('planning', 'parallel_execution', {\n batchSize: allowed.length,\n totalInResponse: response.toolCalls.length\n });\n\n const batchResults = await Promise.all(\n allowed.map(async (tc: ToolCall) => {\n try {\n const content = await this.executeSingleToolCall(tc);\n return { toolCallId: tc.id, content };\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n const isTimeout = e instanceof LemuraToolTimeoutError;\n this.logger.error(`Tool ${tc.name} ${isTimeout ? 'timed out' : 'failed'}: ${msg}`);\n this.emitTrace('error', isTimeout ? 'tool_timeout' : 'tool_error', {\n toolName: tc.name, id: tc.id, error: msg,\n timeoutMs: isTimeout ? (this.config.toolRegistryTimeoutMs ?? 30_000) : undefined\n }, null, null, 'error');\n return { toolCallId: tc.id, content: `Error: ${msg}` };\n }\n })\n );\n toolResults.push(...batchResults);\n }\n } else {\n for (const tc of response.toolCalls) {\n const ok = await this.passesFirewall(tc.name, tc.arguments, tc.id, toolResults);\n if (!ok) continue;\n\n try {\n const content = await this.executeSingleToolCall(tc);\n toolResults.push({ toolCallId: tc.id, content });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n const isTimeout = e instanceof LemuraToolTimeoutError;\n this.logger.error(`Tool ${tc.name} ${isTimeout ? 'timed out' : 'failed'}: ${msg}`, {\n problem: `Tool ${tc.name} ${isTimeout ? 'timed out' : 'failed to execute'}.`,\n hints: isTimeout\n ? ['Increase toolRegistryTimeoutMs or optimise the tool implementation.']\n : ['Check the tool parameters and ensure required services are running.']\n });\n this.emitTrace('error', isTimeout ? 'tool_timeout' : 'tool_error', {\n toolName: tc.name, id: tc.id, error: msg,\n timeoutMs: isTimeout ? (this.config.toolRegistryTimeoutMs ?? 30_000) : undefined\n }, null, null, 'error');\n toolResults.push({ toolCallId: tc.id, content: `Error: ${msg}` });\n }\n }\n }\n\n const assistantTurn: Turn = {\n role: 'assistant',\n content: response.content || '',\n tokenCount: this.adapter.estimateTokens(response.content || '') + 50,\n turnIndex: this.context.turns.length,\n compressed: false,\n toolCalls: response.toolCalls\n };\n this.context.turns.push(assistantTurn);\n if (this.config.onTurn) this.config.onTurn(assistantTurn);\n\n for (const res of toolResults) {\n const toolTurn: Turn = {\n role: 'tool',\n content: res.content,\n tokenCount: this.adapter.estimateTokens(res.content),\n turnIndex: this.context.turns.length,\n compressed: false,\n toolResults: [res]\n };\n this.context.turns.push(toolTurn);\n if (this.config.onTurn) this.config.onTurn(toolTurn);\n }\n\n if (this.goalInjector) this.goalInjector.incrementTurn();\n continue;\n }\n\n // Final / stop response\n if (\n response.finishReason === 'stop' ||\n response.finishReason === 'max_tokens' ||\n response.finishReason === 'error'\n ) {\n const finalTurn: Turn = {\n role: 'assistant',\n content: response.content,\n tokenCount: response.usage?.completionTokens ?? this.adapter.estimateTokens(response.content),\n turnIndex: this.context.turns.length,\n compressed: false\n };\n this.context.turns.push(finalTurn);\n if (this.config.onTurn) this.config.onTurn(finalTurn);\n\n // Goal verification — runs silently, result stored in context only\n if (response.finishReason === 'stop' && !goalVerificationDone) {\n goalVerificationDone = true;\n const verdict = await this._verifyGoal(this.context.turns);\n if (verdict && !verdict.achieved && verdict.missing) {\n this.logger.info(`[GoalVerifier] Incomplete — running silent correction: \"${verdict.missing}\"`);\n this.emitTrace('verification', 'goal_correction_start', {\n missing: verdict.missing,\n reason: verdict.reason\n });\n try {\n const correctionMessages = this.buildMessages(\n this.buildSystemPrompt(verdict.missing, this.iterations),\n this.iterations\n );\n correctionMessages.push({ role: 'user', content: verdict.missing });\n const correction = await this.adapter.complete({\n model: this.config.model,\n messages: correctionMessages,\n maxTokens: maxCompletionTokens\n });\n if (correction.content) {\n this.context.turns.push({\n role: 'assistant',\n content: correction.content,\n tokenCount: correction.usage?.completionTokens ?? this.adapter.estimateTokens(correction.content),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n this.emitTrace('verification', 'goal_correction_done', {\n missing: verdict.missing,\n correctionTokens: correction.usage?.completionTokens\n });\n }\n } catch (err: unknown) {\n const errMsg = (err as Error).message;\n this.logger.warn(`[GoalVerifier] Correction failed (non-fatal): ${errMsg}`);\n this.emitTrace('error', 'goal_correction_failed', { error: errMsg }, null, null, 'error');\n }\n }\n\n // Final check after correction — append warning block to content if goal still unmet\n const finalVerdict = await this._verifyGoal(this.context.turns);\n if (finalVerdict && !finalVerdict.achieved) {\n this.logger.warn(`[GoalVerifier] Final verification failed: ${finalVerdict.reason}`);\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: false, reason: finalVerdict.reason, missing: finalVerdict.missing\n }, null, null, 'error');\n const warningBlock = `\\n\\n---\\n\\n⚠️ **Goal Verification Warning**\\n* **Status:** Success criteria not fully met.\\n* **Reason:** ${finalVerdict.reason ?? 'Unknown'}\\n* **Missing:** ${finalVerdict.missing ?? 'Not specified'}\\n\\n`;\n const lastTurn = [...this.context.turns].reverse().find(t => t.role === 'assistant');\n if (lastTurn) lastTurn.content = (lastTurn.content as string) + warningBlock;\n this.logger.info(`[${opts.label}] Run completed with goal warning`);\n return (lastTurn?.content as string) ?? response.content;\n }\n }\n\n this.logger.info(`[${opts.label}] Run completed successfully`);\n return response.content;\n }\n }\n\n const maxItsErr = new LemuraMaxIterationsError(`Exceeded max iterations of ${maxIts}`);\n this.logger.fatal(maxItsErr.message, {\n problem: 'The agent entered an infinite loop or took too many steps to resolve the task.',\n hints: [\n 'Increase maxIterations if the task is complex.',\n 'Check if tools are returning consistent results.'\n ]\n });\n throw maxItsErr;\n }\n\n /**\n * Verifies whether the goal was achieved after a `stop` finish.\n *\n * Priority:\n * 1. `config.goalVerifier` callback (Option A — user-supplied)\n * 2. Built-in LLM check against `successCriteria` (Option C — fallback)\n *\n * Returns `null` when verification is skipped (no goal, planning disabled, etc.).\n *\n * @since 1.5.0\n */\n private async _verifyGoal(turns: Turn[]): Promise<GoalVerifierResult | null> {\n if (!this.config.enableGoalPlanning || !this.goalInjector) return null;\n if (this.config.enableGoalVerification === false) return null;\n\n const goal = this.goalInjector.getGoal();\n if (!goal.statement) return null;\n\n this.emitTrace('verification', 'goal_verification_start', { goalStatement: goal.statement });\n\n try {\n // Option A — user-supplied verifier takes priority\n if (this.config.goalVerifier) {\n const result = await this.config.goalVerifier(goal, turns);\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: result.achieved,\n reason: result.reason,\n missing: result.missing,\n source: 'custom'\n });\n return result;\n }\n\n // Option C — built-in LLM check only when successCriteria contains\n // real user-defined criteria (not the generic auto-populated fallback)\n const GENERIC_CRITERION = 'The user request is fully answered';\n const meaningfulCriteria = goal.successCriteria?.filter(c => c !== GENERIC_CRITERION) ?? [];\n if (meaningfulCriteria.length > 0) {\n const recentTurns = turns.slice(-6).map(t => {\n const text = typeof t.content === 'string'\n ? t.content\n : JSON.stringify(t.content);\n return `[${t.role}]: ${text.slice(0, 400)}`;\n }).join('\\n\\n');\n\n const criteriaList = meaningfulCriteria.map((c, i) => `${i + 1}. ${c}`).join('\\n');\n\n const response = await this.adapter.complete({\n model: this.config.model,\n temperature: 0,\n maxTokens: 256,\n messages: [\n {\n role: 'system',\n content: 'You are a strict goal-completion verifier. Respond ONLY with a valid JSON object — no markdown, no prose:\\n{\"achieved\": true|false, \"reason\": \"<short explanation>\", \"missing\": \"<what is still needed, or empty string>\"}'\n },\n {\n role: 'user',\n content: `Goal: ${goal.statement}\\n\\nSuccess criteria:\\n${criteriaList}\\n\\nRecent conversation:\\n${recentTurns}\\n\\nWere ALL success criteria met?`\n }\n ]\n });\n\n let verdict: GoalVerifierResult | null = null;\n try {\n const jsonMatch = response.content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as { achieved?: unknown; reason?: unknown; missing?: unknown };\n verdict = {\n achieved: parsed.achieved === true,\n ...(typeof parsed.reason === 'string' && { reason: parsed.reason }),\n ...(typeof parsed.missing === 'string' && { missing: parsed.missing })\n };\n }\n } catch {\n this.logger.warn('[GoalVerifier] Failed to parse built-in verifier response — skipping');\n }\n\n if (verdict) {\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: verdict.achieved,\n reason: verdict.reason,\n missing: verdict.missing,\n source: 'built_in'\n });\n return verdict;\n }\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n this.logger.warn(`[GoalVerifier] Verification step failed (non-fatal): ${msg}`);\n }\n\n return null;\n }\n\n /**\n * Resets the session: clears conversation history, resets iteration counters,\n * tool execution budget tallies, and goal/plan state.\n * The adapter, config, compression strategies, and tools are retained.\n */\n reset(): void {\n this.context = {\n systemPrompt: this.config.systemPrompt || '',\n scratchpad: '',\n turns: [],\n tokenCount: 0,\n maxTokens: this.config.maxTokens,\n metadata: {}\n };\n this.iterations = 0;\n this.totalToolCallCount = 0;\n this.totalTokens = 0;\n this.perToolCallCount.clear();\n this.stepCounter = new StepCounter(this.config.maxSteps ?? 20);\n this.goalInjector = null;\n this.continuationPlanner = null;\n this.scratchpadLoaded = false;\n this.pendingScratchpadClear = !!this.config.scratchpadAdapter;\n this.logger.debug('Session reset');\n }\n\n /**\n * Closes the session and disconnects all MCP servers.\n *\n * Call this when you are done with the session to ensure child processes are\n * terminated and HTTP connections are released.\n *\n * @example\n * ```typescript\n * const session = new SessionManager({ ..., mcpServers: [...] });\n * try {\n * await session.run('Hello');\n * } finally {\n * await session.close();\n * }\n * ```\n */\n async close(): Promise<void> {\n if (this.mcpRegistry) {\n await this.mcpRegistry.disconnectAll();\n this.emitTrace('system', 'mcp_disconnected', {});\n this.logger.debug('All MCP servers disconnected');\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/types/errors.ts","../src/types/logger.ts","../src/adapters/OpenAICompatibleAdapter.ts","../src/context/ContextManager.ts","../src/context/SandwichCompressionStrategy.ts","../src/context/HistoryCompressionStrategy.ts","../src/context/SummaryInjectionStrategy.ts","../src/context/ShortTermMemoryRegistry.ts","../src/context/InMemoryStorageAdapter.ts","../src/context/InMemoryScratchpadAdapter.ts","../src/tools/SchemaValidator.ts","../src/tools/ToolRegistry.ts","../src/tools/ToolFirewall.ts","../src/media/MediaBridge.ts","../src/skills/SkillInjector.ts","../src/rag/InMemoryRAGAdapter.ts","../src/logger/DefaultLogger.ts","../src/tools/builtin/short_term_memory.ts","../src/tools/builtin/media.ts","../src/agent/execution/StepCounter.ts","../src/agent/execution/FinalResponseFormatter.ts","../src/agent/execution/ToolResponseProcessor.ts","../src/agent/execution/GoalInjector.ts","../src/agent/execution/ContinuationPlanner.ts","../src/mcp/MCPClient.ts","../src/mcp/MCPClientRegistry.ts","../src/agent/SessionManager.ts"],"names":["LogLevel","randomUUID","spawn","changed"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base class for all custom errors thrown by lemura.\n *\n * @example\n * throw new LemuraError('Something went wrong', 'UNKNOWN_ERROR');\n */\nexport class LemuraError extends Error {\n /**\n * @param message - The error message\n * @param code - The error code for programmatic handling\n * @param problem - A clear description of the problem for the end user\n * @param hints - A list of suggestions to resolve the issue\n */\n constructor(\n message: string,\n public readonly code: string,\n public readonly problem?: string,\n public readonly hints: string[] = []\n ) {\n super(message);\n this.name = 'LemuraError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Error thrown when context exceeds max tokens and cannot be compressed further */\nexport class LemuraContextOverflowError extends LemuraError {\n constructor(message: string) {\n super(message, 'CONTEXT_OVERFLOW');\n this.name = 'LemuraContextOverflowError';\n }\n}\n\n/** Error thrown when a requested tool is not found in the registry */\nexport class LemuraToolNotFoundError extends LemuraError {\n constructor(message: string) {\n super(message, 'TOOL_NOT_FOUND');\n this.name = 'LemuraToolNotFoundError';\n }\n}\n\n/** Error thrown when an adapter encounters an API or formatting issue */\nexport class LemuraAdapterError extends LemuraError {\n constructor(\n message: string,\n code = 'ADAPTER_ERROR',\n public cause?: any,\n problem?: string,\n hints: string[] = []\n ) {\n super(message, code, problem, hints);\n this.name = 'LemuraAdapterError';\n }\n}\n\n/** Error thrown when a skill cannot be parsed or injected */\nexport class LemuraSkillInjectionError extends LemuraError {\n constructor(message: string) {\n super(message, 'SKILL_INJECTION_FAILED');\n this.name = 'LemuraSkillInjectionError';\n }\n}\n\n/** Error thrown when the ReAct loop exceeds the configured max iterations */\nexport class LemuraMaxIterationsError extends LemuraError {\n constructor(message: string) {\n super(message, 'MAX_ITERATIONS_EXCEEDED');\n this.name = 'LemuraMaxIterationsError';\n }\n}\n\n/** Error thrown when tool parameters fail JSON schema validation */\nexport class LemuraToolValidationError extends LemuraError {\n constructor(message: string) {\n super(message, 'TOOL_VALIDATION_FAILED');\n this.name = 'LemuraToolValidationError';\n }\n}\n\n/** Error thrown when a tool execute function exceeds its timeout */\nexport class LemuraToolTimeoutError extends LemuraError {\n constructor(message: string) {\n super(message, 'TOOL_TIMEOUT');\n this.name = 'LemuraToolTimeoutError';\n }\n}\n\n/** Base error thrown for any MCP server communication failure */\nexport class LemuraMCPError extends LemuraError {\n constructor(message: string, code = 'MCP_ERROR', problem?: string, hints: string[] = []) {\n super(message, code, problem, hints);\n this.name = 'LemuraMCPError';\n }\n}\n\n/** Error thrown when an MCP server cannot be connected to (spawn failure, network error, init failure) */\nexport class LemuraMCPConnectionError extends LemuraMCPError {\n constructor(message: string, problem?: string, hints: string[] = []) {\n super(message, 'MCP_CONNECTION_FAILED', problem, hints);\n this.name = 'LemuraMCPConnectionError';\n }\n}\n\n/** Error thrown when a call to an MCP server tool exceeds the configured timeout */\nexport class LemuraMCPTimeoutError extends LemuraMCPError {\n constructor(message: string) {\n super(message, 'MCP_TOOL_TIMEOUT');\n this.name = 'LemuraMCPTimeoutError';\n }\n}\n","/** Log levels supported by lemura */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n FATAL = 4,\n}\n\n/** Severity levels for user-facing logs */\nexport type Severity = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'FATAL';\n\n/** Metadata for structured logging and error reporting */\nexport interface LogMetadata {\n problem?: string;\n hints?: string[];\n severity?: Severity;\n [key: string]: unknown;\n}\n\n/**\n * Enhanced logger interface for lemura.\n * Supports structured logging with problems and hints.\n */\nexport interface ILogger {\n /** Log a debug message (trace-level details) */\n debug(message: string, metadata?: LogMetadata): void;\n /** Log an informational message */\n info(message: string, metadata?: LogMetadata): void;\n /** Log a warning */\n warn(message: string, metadata?: LogMetadata): void;\n /** Log an error */\n error(message: string, metadata?: LogMetadata): void;\n /** Log a fatal error that prevents execution */\n fatal(message: string, metadata?: LogMetadata): void;\n\n /** Set the minimum log level to display */\n setLevel(level: LogLevel): void;\n}\n","import {\n IProviderAdapter,\n CompletionRequest,\n CompletionResponse,\n CompletionChunk,\n NormalizedMessage,\n TranscriptionRequest,\n TranscriptionResponse,\n SynthesisRequest,\n AudioChunk,\n VisionRequest,\n VisionResponse,\n ImageGenRequest,\n ImageGenResponse,\n ModelInfo,\n LemuraAdapterError,\n} from '../types/index.js';\n\nexport interface RetryConfig {\n maxRetries: number;\n baseDelayMs: number;\n}\n\nexport interface OpenAICompatibleAdapterConfig {\n baseUrl?: string;\n apiKey?: string;\n defaultModel?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n retry?: RetryConfig;\n}\n\n/**\n * Reference implementation of an OpenAI-compatible provider adapter.\n */\nexport class OpenAICompatibleAdapter implements IProviderAdapter {\n readonly name = 'openai_compatible';\n readonly version = '1.2.0';\n\n private baseUrl: string;\n private apiKey: string;\n private defaultModel: string;\n private defaultHeaders: Record<string, string>;\n private timeoutMs: number;\n private retryConfig: RetryConfig;\n\n constructor(config: OpenAICompatibleAdapterConfig = {}) {\n this.baseUrl = (\n config.baseUrl ??\n process.env.LEMURA_BASE_URL ??\n process.env.OPENAI_BASE_URL ??\n 'https://api.openai.com/v1'\n ).replace(/\\/$/, '');\n\n this.apiKey = config.apiKey ?? process.env.LEMURA_API_KEY ?? process.env.OPENAI_API_KEY ?? '';\n this.defaultModel = config.defaultModel ?? process.env.LEMURA_MODEL ?? process.env.OPENAI_MODEL ?? 'gpt-3.5-turbo';\n\n this.defaultHeaders = config.defaultHeaders || {};\n this.timeoutMs = config.timeout || 30000;\n this.retryConfig = config.retry || { maxRetries: 2, baseDelayMs: 1000 };\n }\n\n private async fetchWithRetry(url: string, init: RequestInit): Promise<Response> {\n let attempts = 0;\n while (attempts <= this.retryConfig.maxRetries) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.apiKey}`,\n ...this.defaultHeaders,\n };\n\n if (init.headers) {\n Object.assign(headers, init.headers);\n }\n\n // Don't set Content-Type if it's 'unset' (for FormData)\n if (headers['Content-Type'] === 'unset') {\n delete headers['Content-Type'];\n } else if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n ...init,\n signal: controller.signal,\n headers,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) return response;\n\n // Retry on 429 and 503\n if ((response.status === 429 || response.status === 503) && attempts < this.retryConfig.maxRetries) {\n attempts++;\n const delay = this.retryConfig.baseDelayMs * Math.pow(2, attempts - 1);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n const errorText = await response.text().catch(() => '');\n let problem = 'The server replied with an error during the API call.';\n let hints = ['Check the API documentation for the provider you are using.'];\n\n if (response.status === 401) {\n problem = 'Authentication failed. The API key is invalid or missing.';\n hints = [\n 'Ensure your API key is correctly configured in the adapter or environment variables.',\n 'Check if the API key has expired or been revoked.'\n ];\n } else if (response.status === 404) {\n problem = 'The requested resource or model was not found.';\n hints = [\n 'Verify that the baseUrl is correct (e.g., https://api.openai.com/v1).',\n 'Check if the model name is correct and available for your account.',\n 'Ensure you are not appending extra paths to the baseUrl.'\n ];\n } else if (response.status === 429) {\n problem = 'Rate limit exceeded.';\n hints = [\n 'Wait a few seconds before retrying.',\n 'Check your usage limits and billing status on the provider dashboard.'\n ];\n }\n\n throw new LemuraAdapterError(\n `HTTP ${response.status}: ${errorText}`,\n 'HTTP_ERROR',\n { status: response.status, body: errorText },\n problem,\n hints\n );\n } catch (err) {\n if (err instanceof LemuraAdapterError) throw err;\n\n if (attempts < this.retryConfig.maxRetries) {\n attempts++;\n const delay = this.retryConfig.baseDelayMs * Math.pow(2, attempts - 1);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n throw new LemuraAdapterError(\n `Network request failed: ${err instanceof Error ? err.message : String(err)}`,\n 'NETWORK_ERROR',\n err,\n 'A network error occurred while connecting to the provider.',\n [\n 'Check your internet connection.',\n 'Verify that the baseUrl is reachable from your network.',\n 'Check for proxy or firewall settings that might block the request.'\n ]\n );\n }\n }\n throw new LemuraAdapterError(\n 'Max retries exceeded',\n 'MAX_RETRIES',\n undefined,\n 'The request failed after multiple retry attempts.',\n ['Check if the provider service is down or experiencing high load.']\n );\n }\n\n private mapFinishReason(reason: string | null): CompletionResponse['finishReason'] {\n if (!reason) return 'stop';\n const r = reason.toLowerCase();\n if (r === 'tool_calls' || r === 'tool_call') return 'tool_call';\n if (r === 'length' || r === 'max_tokens') return 'max_tokens';\n if (r === 'content_filter' || r === 'error') return 'error';\n return 'stop';\n }\n\n private toOpenAIMessages(messages: NormalizedMessage[]): unknown[] {\n return messages.map(msg => {\n if (msg.role === 'assistant' && msg.toolCalls?.length) {\n return {\n role: 'assistant',\n content: msg.content || null,\n tool_calls: msg.toolCalls.map((tc: { id: string; name: string; arguments: string }) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments),\n },\n })),\n };\n }\n if (msg.role === 'tool') {\n // lemura's buildMessages() puts the toolCallId in msg.name\n return {\n role: 'tool',\n tool_call_id: msg.name,\n content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),\n };\n }\n return msg;\n });\n }\n\n /**\n * Returns true for reasoning/o-series models (o1, o3, o4, gpt-5, *-mini variants).\n * These models use `max_completion_tokens` instead of `max_tokens` and do not\n * support sampling hyperparameters (temperature, top_p, presence_penalty, frequency_penalty).\n */\n private isReasoningModel(model: string): boolean {\n return /\\bo[1-9]\\b|\\bo[1-9]-|\\bgpt-5\\b|(?:^|[-_])mini(?:$|[-_])/i.test(model);\n }\n\n private buildPayload(request: CompletionRequest): unknown {\n const model = request.model || this.defaultModel;\n const reasoning = this.isReasoningModel(model);\n\n const payload: Record<string, unknown> = {\n model,\n messages: this.toOpenAIMessages(request.messages),\n };\n\n if (request.maxTokens !== undefined) {\n // Reasoning models require max_completion_tokens; standard models use max_tokens\n payload[reasoning ? 'max_completion_tokens' : 'max_tokens'] = request.maxTokens;\n }\n\n if (!reasoning) {\n // Sampling params are unsupported on reasoning models — omit entirely to avoid API errors\n if (request.temperature !== undefined) payload.temperature = request.temperature;\n }\n\n if (request.stopSequences?.length) payload.stop = request.stopSequences;\n if (request.stream) payload.stream = true;\n\n if (request.tools && request.tools.length > 0) {\n payload.tools = request.tools.map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }\n }));\n }\n\n return payload;\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const payload = this.buildPayload(request);\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n\n const data = await response.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new LemuraAdapterError('Invalid response format: missing choices', 'INVALID_RESPONSE', data);\n }\n\n const message = choice.message;\n let toolCalls;\n\n if (message.tool_calls && message.tool_calls.length > 0) {\n toolCalls = message.tool_calls.map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n }));\n }\n\n return {\n content: message.content || '',\n toolCalls,\n finishReason: this.mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: data.usage?.prompt_tokens || 0,\n completionTokens: data.usage?.completion_tokens || 0,\n totalTokens: data.usage?.total_tokens || 0,\n },\n rawResponse: data\n };\n }\n\n async *stream(request: CompletionRequest): AsyncIterable<CompletionChunk> {\n const payload = this.buildPayload({ ...request, stream: true });\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n\n if (!response.body) {\n throw new LemuraAdapterError('Response body is null', 'STREAM_ERROR');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6);\n let data;\n try {\n data = JSON.parse(jsonStr);\n } catch (err) {\n continue;\n }\n\n const choice = data.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta?.content || '';\n const toolCallBlock = choice.delta?.tool_calls?.[0];\n let toolCallDelta;\n\n if (toolCallBlock) {\n toolCallDelta = {\n id: toolCallBlock.id,\n name: toolCallBlock.function?.name,\n arguments: toolCallBlock.function?.arguments,\n };\n }\n\n const isFinished = choice.finish_reason !== null && choice.finish_reason !== undefined;\n\n yield {\n delta,\n finished: isFinished,\n ...(toolCallDelta && { toolCallDelta }),\n ...(isFinished && { finishReason: this.mapFinishReason(choice.finish_reason) })\n };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n }\n\n getModelInfo(): ModelInfo {\n return {\n supportsVision: true,\n supportsTools: true,\n contextWindow: 128000\n };\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const resp = await this.fetchWithRetry(`${this.baseUrl}/models`, { method: 'GET' });\n return resp.ok;\n } catch {\n return false;\n }\n }\n\n async transcribe(request: TranscriptionRequest): Promise<TranscriptionResponse> {\n const binaryString = atob(request.audioBase64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n const blob = new Blob([bytes], { type: request.mimeType });\n const formData = new FormData();\n formData.append('file', blob, 'audio.webm');\n formData.append('model', request.model || 'whisper-1');\n if (request.language) formData.append('language', request.language);\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/audio/transcriptions`, {\n method: 'POST',\n body: formData,\n headers: {\n 'Content-Type': 'unset'\n }\n });\n\n const data = await response.json();\n return {\n transcript: data.text,\n confidence: 1.0, // OpenAI doesn't return confidence in standard response\n language: data.language || request.language || 'en'\n };\n }\n\n async *synthesize(request: SynthesisRequest): AsyncIterable<AudioChunk> {\n const response = await this.fetchWithRetry(`${this.baseUrl}/audio/speech`, {\n method: 'POST',\n body: JSON.stringify({\n model: request.model || 'tts-1',\n input: request.text,\n voice: request.voiceId || 'alloy',\n response_format: request.format || 'mp3'\n })\n });\n\n if (!response.body) throw new LemuraAdapterError('No response body for TTS', 'STREAM_ERROR');\n\n const reader = response.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n const binary = new TextDecoder('latin1').decode(value);\n yield { audioBase64: btoa(binary) };\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n async describeImage(request: VisionRequest): Promise<VisionResponse> {\n const payload = {\n model: request.model || this.defaultModel,\n messages: [\n {\n role: 'user',\n content: [\n { type: 'text', text: request.prompt || 'Describe this image' },\n {\n type: 'image_url',\n image_url: {\n url: `data:image/jpeg;base64,${request.imageBase64}`\n }\n }\n ]\n }\n ]\n };\n\n const response = await this.fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n\n const data = await response.json();\n return {\n description: data.choices[0].message.content,\n objects: [] // OpenAI doesn't return structured objects in standard vision call\n };\n }\n\n async generateImage(request: ImageGenRequest): Promise<ImageGenResponse> {\n const response = await this.fetchWithRetry(`${this.baseUrl}/images/generations`, {\n method: 'POST',\n body: JSON.stringify({\n prompt: request.prompt,\n model: request.model || 'dall-e-3',\n n: 1,\n size: request.dimensions || '1024x1024'\n })\n });\n\n const data = await response.json();\n if (data?.error) {\n throw new LemuraAdapterError(data.error.message || 'Image generation failed', 'IMAGE_GEN_ERROR');\n }\n const first = data?.data?.[0] || {};\n const imageUrl =\n first.url ||\n (first.b64_json ? `data:image/png;base64,${first.b64_json}` : null) ||\n (first.image_url?.url || null);\n if (!imageUrl) {\n throw new LemuraAdapterError('Image generation returned no image URL or base64 payload', 'IMAGE_GEN_EMPTY');\n }\n return {\n imageUrl,\n revisedPrompt: first.revised_prompt\n };\n }\n}\n","import { ContextWindow, IContextStrategy, LemuraContextOverflowError } from '../types/index.js';\n\n/**\n * Orchestrates a stack of IContextStrategy implementations to keep the\n * token count within the maxTokens limit.\n */\nexport class ContextManager {\n private strategies: IContextStrategy[] = [];\n\n /**\n * Registers a new compression or pre-turn strategy and sorts the stack by priority.\n *\n * @param strategy - The strategy implementation to register\n */\n registerStrategy(strategy: IContextStrategy): void {\n this.strategies.push(strategy);\n this.strategies.sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * Applies all registered strategies that return true for `shouldApply()`\n * until the context token count is safely below the maximum budget.\n *\n * @param context - The context window to prepare\n * @param safetyMargin - Modifier applied to maxTokens (default: 0.95 -> 95%)\n * @returns A new ContextWindow object potentially compressed\n * @throws {LemuraContextOverflowError} If the context is still over maxTokens after all strategies\n */\n async prepare(context: ContextWindow, safetyMargin = 0.95): Promise<ContextWindow> {\n let currentCtx = { ...context, turns: [...context.turns] };\n\n // Recalculate token count from actual turns + system prompt so compression\n // strategies always see an up-to-date figure regardless of how callers\n // track incremental additions (they often forget to update tokenCount).\n const systemTokens = currentCtx.systemPrompt\n ? Math.ceil(currentCtx.systemPrompt.length / 4)\n : 0;\n currentCtx.tokenCount =\n currentCtx.turns.reduce((sum, t) => sum + t.tokenCount, 0) + systemTokens;\n\n const targetTokenCount = currentCtx.maxTokens * safetyMargin;\n\n for (const strategy of this.strategies) {\n // If we are below the limit and it's not a pre-turn non-reducing strategy, skip it.\n // E.g., SummaryInjectionStrategy might still want to run.\n // But purely compression ones drop out early in our base architecture if they choose in `shouldApply`.\n if (strategy.shouldApply(currentCtx)) {\n currentCtx = await strategy.apply(currentCtx);\n }\n }\n\n if (currentCtx.tokenCount > currentCtx.maxTokens) {\n throw new LemuraContextOverflowError(\n `Context overflowed: ${currentCtx.tokenCount} tokens > ${currentCtx.maxTokens}`\n );\n }\n\n return currentCtx;\n }\n}\n","import { ContextWindow, IContextStrategy, IProviderAdapter, Turn } from '../types/index.js';\n\nexport interface SandwichCompressionConfig {\n preserveFirst: number;\n preserveLast: number;\n /** Fire when context reaches this fraction of maxTokens (e.g. 0.80 = 80%). Default: 0.80 */\n triggerThreshold?: number;\n /** Max tokens for the generated summary turn. Default: unlimited */\n summaryMaxTokens?: number;\n /** Strategy execution priority — lower number runs first. Default: 20 */\n priority?: number;\n}\n\n/**\n * Sandwich compression preserves the beginning and end of the conversation,\n * replacing the middle with a generated summary.\n *\n * Pair with `SummaryInjectionStrategy` to ensure the compression summary is\n * visible to the model on every subsequent call.\n */\nexport class SandwichCompressionStrategy implements IContextStrategy {\n readonly name = 'sandwich_compression';\n readonly priority: number;\n\n constructor(\n private adapter: IProviderAdapter,\n private config: SandwichCompressionConfig\n ) {\n this.priority = config.priority ?? 20;\n }\n\n shouldApply(ctx: ContextWindow): boolean {\n const threshold = this.config.triggerThreshold ?? 0.80;\n return (\n ctx.tokenCount >= ctx.maxTokens * threshold &&\n ctx.turns.length > this.config.preserveFirst + this.config.preserveLast\n );\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n const { preserveFirst, preserveLast } = this.config;\n\n const head = ctx.turns.slice(0, preserveFirst);\n const tail = ctx.turns.slice(ctx.turns.length - preserveLast);\n const middle = ctx.turns.slice(preserveFirst, ctx.turns.length - preserveLast);\n\n const middleText = middle.map(t => `${t.role}: ${JSON.stringify(t.content)}`).join('\\n');\n\n const summaryResponse = await this.adapter.complete({\n model: '',\n messages: [{\n role: 'user',\n content: `Summarize the following conversation history briefly:\\n${middleText}`\n }],\n ...(this.config.summaryMaxTokens ? { maxTokens: this.config.summaryMaxTokens } : {})\n });\n\n const summaryStr = summaryResponse.content;\n\n const newCompressionSummary = ctx.compressionSummary\n ? `${ctx.compressionSummary}\\n${summaryStr}`\n : summaryStr;\n\n const summaryTurn: Turn = {\n role: 'system',\n content: `[COMPRESSED HISTORY SUMMARY]\\n${newCompressionSummary}`,\n tokenCount: this.adapter.estimateTokens(newCompressionSummary),\n turnIndex: -1,\n compressed: true,\n };\n\n const newTurns = [...head, summaryTurn, ...tail];\n const newTokenCount = newTurns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(ctx.systemPrompt) +\n this.adapter.estimateTokens(ctx.scratchpad);\n\n return {\n ...ctx,\n turns: newTurns,\n tokenCount: newTokenCount,\n compressionSummary: newCompressionSummary,\n };\n }\n\n /**\n * Applies sandwich compression specifically to a Short Term Memory item's content.\n * Implements a 3-layer pipeline: Pre-Layer (encoding), Core Layer (dense summary), Post-Layer (refinement cues).\n * \n * @param content - The heavy text content to compress\n * @param instructions - Guiding instructions for the core layer summary\n * @returns The three-layer sandwich result\n */\n async compressMemoryItem(content: string, instructions: string = 'Extract the key information'): Promise<{\n preLayer: string;\n coreLayer: string;\n postLayer: string;\n }> {\n // Pre-Layer: Chunking and initial encoding\n // Here we do a naive encoding representation to signify the pre-processed chunks\n const estimatedChunks = Math.max(1, Math.ceil(this.adapter.estimateTokens(content) / 2000));\n const preLayer = `[PRE-LAYER ENCODED: ${estimatedChunks} internal chunks]`;\n\n // Core Layer: Dense summary sandwich with instructions\n // We sandwich the content between the instructions to guide extraction\n // If content is extremely large, we might trim it here, but ideally the provider streaming handles it.\n const summaryResponse = await this.adapter.complete({\n model: '',\n messages: [{\n role: 'user',\n content: `### INSTRUCTIONS ###\\n${instructions}\\n\\n### CONTENT ###\\n${content}\\n\\n### INSTRUCTIONS ###\\n${instructions}`\n }]\n });\n const coreLayer = summaryResponse.content;\n\n // Post-Layer: Decoding/Refinement hooks\n // Indicates that the LLM can use tools to drill down into specific chunks\n const postLayer = `[POST-LAYER DECODING: Use \\`refine_layer\\` or \\`read_chunk\\` tools to expand specific sections]`;\n\n return { preLayer, coreLayer, postLayer };\n }\n}\n","import { ContextWindow, IContextStrategy, IProviderAdapter, Turn } from '../types/index.js';\n\n/**\n * ScratchpadStrategy manages the thinking process separate from the turn history.\n * It is primarily a marker/pre-turn strategy that ensures scratchpad gets tokenized properly\n * but is not compressed.\n */\nexport class ScratchpadStrategy implements IContextStrategy {\n readonly name = 'scratchpad_strategy';\n readonly priority = 10;\n\n shouldApply(ctx: ContextWindow): boolean {\n // Only apply if there's actual scratchpad content to track\n return ctx.scratchpad.length > 0;\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n // Basic implementation: we don't compress the scratchpad, we just ensure its tokens are counted\n return ctx;\n }\n}\n\nexport interface HistoryCompressionConfig {\n /** Number of oldest turns to summarize in each compression pass */\n windowSize: number;\n /** Fire when context reaches this fraction of maxTokens (e.g. 0.8 = 80%) */\n triggerAtPercent: number;\n /** Strategy execution priority — lower number runs first. Default: 30 */\n priority?: number;\n}\n\n/**\n * Summarizes the oldest N uncompressed turns using a rolling-window approach.\n *\n * Pair with `SummaryInjectionStrategy` (priority < this one) to ensure the\n * accumulated summary is re-injected before each provider call.\n */\nexport class HistoryCompressionStrategy implements IContextStrategy {\n readonly name = 'history_compression';\n readonly priority: number;\n\n constructor(\n private adapter: IProviderAdapter,\n private config: HistoryCompressionConfig\n ) {\n this.priority = config.priority ?? 30;\n }\n\n shouldApply(ctx: ContextWindow): boolean {\n const triggerTokens = ctx.maxTokens * this.config.triggerAtPercent;\n // Apply if we are over the trigger threshold and have at least enough turns\n // Ignore system prompts and already compressed turns\n const uncompressedTurns = ctx.turns.filter(t => t.role !== 'system' && !t.compressed);\n return ctx.tokenCount >= triggerTokens && uncompressedTurns.length > this.config.windowSize;\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n // Find the oldest N uncompressed turns that aren't the system prompt\n const uncompressedIndices = ctx.turns\n .map((t, i) => ({ t, i }))\n .filter(({ t }) => t.role !== 'system' && !t.compressed)\n .slice(0, this.config.windowSize);\n\n const targetTurns = uncompressedIndices.map(u => u.t);\n const middleText = targetTurns.map(t => `${t.role}: ${JSON.stringify(t.content)}`).join('\\n');\n\n const summaryResponse = await this.adapter.complete({\n model: '',\n messages: [{\n role: 'user',\n content: `Summarize the oldest part of this conversation:\\n${middleText}`\n }]\n });\n\n const summaryStr = summaryResponse.content;\n const newCompressionSummary = ctx.compressionSummary\n ? `${ctx.compressionSummary}\\n${summaryStr}`\n : summaryStr;\n\n // Filter out the summarized turns\n const indicesToRemove = new Set(uncompressedIndices.map(u => u.i));\n const newTurns = ctx.turns.filter((_, i) => !indicesToRemove.has(i));\n\n const TokenCount = newTurns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(ctx.systemPrompt) +\n this.adapter.estimateTokens(ctx.scratchpad);\n\n return {\n ...ctx,\n turns: newTurns,\n tokenCount: TokenCount,\n compressionSummary: newCompressionSummary,\n };\n }\n}\n","import { ContextWindow, IContextStrategy, Turn } from '../types/index.js';\n\nexport interface SummaryInjectionConfig {\n /** Strategy priority — lower number runs first. Default: 1 (runs before compression). */\n priority?: number;\n /** Label prepended to the injected summary block. */\n label?: string;\n}\n\n/**\n * SummaryInjectionStrategy ensures that whenever a `compressionSummary` exists on\n * the context window, it is re-injected as a synthetic system turn at the beginning\n * of the turn list before each provider call.\n *\n * **Why this matters:** `HistoryCompressionStrategy` and `SandwichCompressionStrategy`\n * store compressed context in `ctx.compressionSummary`, but without this strategy the\n * summary never reaches the model — the pruned turns are simply gone.\n *\n * Pair this with any compression strategy:\n *\n * @example\n * ```typescript\n * compressionStrategies: [\n * new SummaryInjectionStrategy({ priority: 1 }), // always runs first\n * new SandwichCompressionStrategy(adapter, { priority: 2, triggerThreshold: 0.80 }),\n * ]\n * ```\n *\n * The strategy is idempotent: if a summary turn already exists it is updated in-place\n * rather than appended again.\n */\nexport class SummaryInjectionStrategy implements IContextStrategy {\n readonly name = 'summary_injection';\n readonly priority: number;\n\n private readonly label: string;\n\n constructor(config: SummaryInjectionConfig = {}) {\n this.priority = config.priority ?? 1;\n this.label = config.label ?? 'Earlier conversation summary';\n }\n\n shouldApply(ctx: ContextWindow): boolean {\n return !!ctx.compressionSummary && ctx.compressionSummary.trim().length > 0;\n }\n\n async apply(ctx: ContextWindow): Promise<ContextWindow> {\n const summaryContent = `[${this.label}]\\n${ctx.compressionSummary}`;\n const summaryTokenCount = Math.ceil(summaryContent.length / 4);\n\n // Check if a summary turn already exists (role=system, compressed=true at turnIndex=-1)\n const existingIndex = ctx.turns.findIndex(t => t.compressed && t.role === 'system' && t.turnIndex === -1);\n\n let newTurns: Turn[];\n\n if (existingIndex !== -1) {\n // Update the existing summary turn in-place\n newTurns = ctx.turns.map((t, i) => {\n if (i !== existingIndex) return t;\n return {\n ...t,\n content: summaryContent,\n tokenCount: summaryTokenCount,\n };\n });\n } else {\n // Prepend a new summary turn\n const summaryTurn: Turn = {\n role: 'system',\n content: summaryContent,\n tokenCount: summaryTokenCount,\n turnIndex: -1,\n compressed: true,\n };\n newTurns = [summaryTurn, ...ctx.turns];\n }\n\n // Recalculate token count\n const newTokenCount = newTurns.reduce((sum, t) => sum + t.tokenCount, 0);\n\n return {\n ...ctx,\n turns: newTurns,\n tokenCount: newTokenCount,\n };\n }\n}\n","import { IStorageAdapter, STMItem } from '../types/index.js';\nimport { randomUUID } from 'crypto';\n\nexport interface STMRegistryConfig {\n /**\n * The storage backend to use for Short Term Memory items.\n */\n storage: IStorageAdapter;\n\n /**\n * The maximum number of tokens allowed for a 'text' type STM item.\n * If an item exceeds this, it may be rejected or truncated.\n * Default: 100000\n */\n maxTextTokens?: number;\n}\n\n/**\n * Registry for Short Term Memory (STM).\n * Manages the storage and retrieval of large context variables like long texts or blobs.\n * Generates '[STM:uuid]' references to be used within the ReAct agent context.\n */\nexport class ShortTermMemoryRegistry {\n private storage: IStorageAdapter;\n private maxTextTokens: number;\n\n constructor(config: STMRegistryConfig) {\n this.storage = config.storage;\n this.maxTextTokens = config.maxTextTokens ?? 100000;\n }\n\n /**\n * Registers a new memory item and returns its reference string.\n * \n * @param content - The raw content to store\n * @param type - The type of content ('text' or 'blob')\n * @param metadata - Optional metadata (e.g. sandwich layers, original filename)\n * @param estimateTokens - Optional function to estimate token count for 'text' type\n * @returns A reference string formatted as '[STM:uuid]'\n * @throws {Error} if a text item exceeds the maxTextTokens limit\n */\n async register(\n content: any,\n type: 'text' | 'blob',\n metadata?: Record<string, unknown>,\n estimateTokens?: (text: string) => number\n ): Promise<string> {\n if (type === 'text') {\n const tokenCount = estimateTokens ? estimateTokens(content) : Math.ceil(String(content).length / 4);\n if (tokenCount > this.maxTextTokens) {\n throw new Error(`Text content exceeds max tokens limit of ${this.maxTextTokens} (estimated ${tokenCount})`);\n }\n }\n\n const id = randomUUID();\n const item: STMItem = {\n id,\n content,\n type,\n ...(metadata !== undefined ? { metadata } : {})\n };\n\n await this.storage.set(id, item);\n return `[STM:${id}]`;\n }\n\n /**\n * Updates an existing STM item's content or metadata.\n * \n * @param id - The UUID of the item to update\n * @param updates - Partial updates to apply (content or metadata)\n */\n async update(id: string, updates: { content?: any; metadata?: Record<string, unknown> }): Promise<void> {\n const item = await this.storage.get(id);\n if (!item) throw new Error(`STM item not found for update: ${id}`);\n\n const updatedItem: STMItem = {\n ...item,\n ...(updates.content !== undefined ? { content: updates.content } : {}),\n ...(updates.metadata !== undefined ? { metadata: { ...item.metadata, ...updates.metadata } } : {})\n };\n\n await this.storage.set(id, updatedItem);\n }\n\n\n /**\n * Retrieves an STM item by its full reference string (e.g., '[STM:uuid]').\n * \n * @param ref - The full reference string\n * @returns The STMItem or undefined if not found\n */\n async getByRef(ref: string): Promise<STMItem | undefined> {\n const match = ref.match(/^\\[STM:(.+)\\]$/);\n if (!match || !match[1]) return undefined;\n return this.storage.get(match[1]);\n }\n\n /**\n * Deletes an STM item by its ID.\n * \n * @param id - The UUID of the item to delete\n */\n async delete(id: string): Promise<void> {\n await this.storage.delete(id);\n }\n}\n","import { IStorageAdapter } from '../types/index.js';\nimport { randomUUID } from 'crypto';\n\n/**\n * An in-memory implementation of IStorageAdapter for holding Short Term Memory.\n * Ideal for testing or single-process lightweight usage.\n *\n * @example\n * const storage = new InMemoryStorageAdapter();\n * const id = await storage.set(undefined, 'my content', { type: 'text' });\n * const retrieved = await storage.get(id);\n */\nexport class InMemoryStorageAdapter implements IStorageAdapter {\n private store = new Map<string, { content: any; metadata?: Record<string, unknown> }>();\n\n /**\n * Retrieves stored content by ID.\n *\n * @param id - The identifier of the stored item\n * @returns The stored content or undefined if not found\n */\n async get(id: string): Promise<any | undefined> {\n return this.store.get(id)?.content;\n }\n\n /**\n * Returns the full item including metadata.\n *\n * @param id - The identifier of the stored item\n * @returns The complete item with content and metadata\n * @internal\n */\n async getFull(id: string): Promise<{ content: any; metadata?: Record<string, unknown> } | undefined> {\n return this.store.get(id);\n }\n\n /**\n * Stores content, generating an ID if none is provided.\n *\n * @param id - Optional provided ID. If omitted, a UUID is generated.\n * @param content - The content to store\n * @param metadata - Optional metadata\n * @returns The ID under which the content is stored\n */\n async set(id: string | undefined, content: any, metadata?: Record<string, unknown>): Promise<string> {\n const resolvedId = id ?? randomUUID();\n this.store.set(resolvedId, metadata !== undefined ? { content, metadata } : { content });\n return resolvedId;\n }\n\n /**\n * Deletes the content for the given ID.\n *\n * @param id - The identifier of the item to delete\n */\n async delete(id: string): Promise<void> {\n this.store.delete(id);\n }\n\n /**\n * Synchronous health check, always true for in-memory.\n *\n * @returns true\n */\n async healthCheck(): Promise<boolean> {\n return true;\n }\n}\n","import { IScratchpadAdapter } from '../types/index.js';\n\n/**\n * In-memory scratchpad adapter, keyed by sessionId.\n * Ideal for testing or single-process usage.\n */\nexport class InMemoryScratchpadAdapter implements IScratchpadAdapter {\n private store = new Map<string, string>();\n\n async read(sessionId: string): Promise<string | undefined> {\n return this.store.get(sessionId);\n }\n\n async write(sessionId: string, content: string): Promise<void> {\n this.store.set(sessionId, content);\n }\n\n async clear(sessionId: string): Promise<void> {\n this.store.delete(sessionId);\n }\n\n async healthCheck(): Promise<boolean> {\n return true;\n }\n}\n","/**\n * Standalone JSON Schema validator for tool parameter validation.\n *\n * Supports a meaningful subset of JSON Schema Draft-07 sufficient for\n * all common tool parameter shapes — with zero external dependencies.\n *\n * Supported keywords:\n * - type (string, number, integer, boolean, object, array, null)\n * - required, properties, additionalProperties\n * - items (array element schema)\n * - enum\n * - minLength, maxLength (string)\n * - minimum, maximum, exclusiveMinimum, exclusiveMaximum (number)\n * - minItems, maxItems (array)\n * - minProperties, maxProperties (object)\n * - pattern (string regex)\n * - oneOf, anyOf, allOf\n *\n * @example\n * const errors = validateJsonSchema({ name: 'Alice', age: 30 }, schema);\n * if (errors.length > 0) throw new LemuraToolValidationError(errors.join('; '));\n */\n\nexport interface SchemaValidationError {\n path: string;\n message: string;\n}\n\n// Bare minimum JSON Schema shape we validate against\ntype JSONSchemaNode = Record<string, unknown>;\n\nfunction typeOf(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\nfunction matchesType(value: unknown, requiredType: string): boolean {\n const t = typeOf(value);\n if (requiredType === 'integer') return t === 'number' && Number.isInteger(value);\n return t === requiredType;\n}\n\n/**\n * Recursively validates a value against a JSON Schema node.\n *\n * @param value - The value to validate\n * @param schema - The JSON Schema node\n * @param path - Dotted path for error reporting (e.g. \"params.items[0].name\")\n * @returns Array of validation errors (empty = valid)\n */\nexport function validateJsonSchema(\n value: unknown,\n schema: JSONSchemaNode,\n path = ''\n): SchemaValidationError[] {\n const errors: SchemaValidationError[] = [];\n\n // --- type ---\n if (schema['type'] !== undefined) {\n const expectedType = schema['type'] as string | string[];\n const types = Array.isArray(expectedType) ? expectedType : [expectedType];\n if (!types.some(t => matchesType(value, t))) {\n errors.push({\n path,\n message: `Expected type '${types.join('|')}', got '${typeOf(value)}'`\n });\n // Stop further checks if type is wrong (most sub-checks are type-specific)\n return errors;\n }\n }\n\n // --- enum ---\n if (schema['enum'] !== undefined) {\n const allowed = schema['enum'] as unknown[];\n if (!allowed.some(a => JSON.stringify(a) === JSON.stringify(value))) {\n errors.push({ path, message: `Value must be one of: ${JSON.stringify(allowed)}` });\n }\n }\n\n // --- const ---\n if ('const' in schema) {\n if (JSON.stringify(schema['const']) !== JSON.stringify(value)) {\n errors.push({ path, message: `Value must equal ${JSON.stringify(schema['const'])}` });\n }\n }\n\n // --- string ---\n if (typeof value === 'string') {\n if (schema['minLength'] !== undefined && value.length < (schema['minLength'] as number)) {\n errors.push({ path, message: `String too short (min ${schema['minLength']}, got ${value.length})` });\n }\n if (schema['maxLength'] !== undefined && value.length > (schema['maxLength'] as number)) {\n errors.push({ path, message: `String too long (max ${schema['maxLength']}, got ${value.length})` });\n }\n if (schema['pattern'] !== undefined) {\n try {\n const re = new RegExp(schema['pattern'] as string);\n if (!re.test(value)) {\n errors.push({ path, message: `String does not match pattern /${schema['pattern']}/` });\n }\n } catch {\n // invalid pattern — skip\n }\n }\n }\n\n // --- number / integer ---\n if (typeof value === 'number') {\n if (schema['minimum'] !== undefined && value < (schema['minimum'] as number)) {\n errors.push({ path, message: `Value ${value} is less than minimum ${schema['minimum']}` });\n }\n if (schema['maximum'] !== undefined && value > (schema['maximum'] as number)) {\n errors.push({ path, message: `Value ${value} exceeds maximum ${schema['maximum']}` });\n }\n if (schema['exclusiveMinimum'] !== undefined && value <= (schema['exclusiveMinimum'] as number)) {\n errors.push({ path, message: `Value ${value} must be > ${schema['exclusiveMinimum']}` });\n }\n if (schema['exclusiveMaximum'] !== undefined && value >= (schema['exclusiveMaximum'] as number)) {\n errors.push({ path, message: `Value ${value} must be < ${schema['exclusiveMaximum']}` });\n }\n }\n\n // --- array ---\n if (Array.isArray(value)) {\n if (schema['minItems'] !== undefined && value.length < (schema['minItems'] as number)) {\n errors.push({ path, message: `Array too short (min ${schema['minItems']} items)` });\n }\n if (schema['maxItems'] !== undefined && value.length > (schema['maxItems'] as number)) {\n errors.push({ path, message: `Array too long (max ${schema['maxItems']} items)` });\n }\n if (schema['items'] !== undefined) {\n const itemSchema = schema['items'] as JSONSchemaNode;\n value.forEach((item, idx) => {\n const childErrors = validateJsonSchema(item, itemSchema, `${path}[${idx}]`);\n errors.push(...childErrors);\n });\n }\n }\n\n // --- object ---\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n const props = (schema['properties'] as Record<string, JSONSchemaNode> | undefined) || {};\n const required = (schema['required'] as string[] | undefined) || [];\n\n // required\n for (const key of required) {\n if (!(key in obj)) {\n errors.push({ path: path ? `${path}.${key}` : key, message: `Required property '${key}' is missing` });\n }\n }\n\n // known properties\n for (const [key, propSchema] of Object.entries(props)) {\n if (key in obj) {\n const childErrors = validateJsonSchema(obj[key], propSchema, path ? `${path}.${key}` : key);\n errors.push(...childErrors);\n }\n }\n\n // additionalProperties = false\n if (schema['additionalProperties'] === false) {\n for (const key of Object.keys(obj)) {\n if (!(key in props)) {\n errors.push({ path: path ? `${path}.${key}` : key, message: `Additional property '${key}' is not allowed` });\n }\n }\n } else if (schema['additionalProperties'] !== undefined && typeof schema['additionalProperties'] === 'object') {\n const addlSchema = schema['additionalProperties'] as JSONSchemaNode;\n for (const [key, val] of Object.entries(obj)) {\n if (!(key in props)) {\n const childErrors = validateJsonSchema(val, addlSchema, path ? `${path}.${key}` : key);\n errors.push(...childErrors);\n }\n }\n }\n\n if (schema['minProperties'] !== undefined && Object.keys(obj).length < (schema['minProperties'] as number)) {\n errors.push({ path, message: `Object has fewer than ${schema['minProperties']} properties` });\n }\n if (schema['maxProperties'] !== undefined && Object.keys(obj).length > (schema['maxProperties'] as number)) {\n errors.push({ path, message: `Object has more than ${schema['maxProperties']} properties` });\n }\n }\n\n // --- composition keywords ---\n if (schema['allOf'] !== undefined) {\n for (const subSchema of schema['allOf'] as JSONSchemaNode[]) {\n errors.push(...validateJsonSchema(value, subSchema, path));\n }\n }\n\n if (schema['anyOf'] !== undefined) {\n const subSchemas = schema['anyOf'] as JSONSchemaNode[];\n const anyPassed = subSchemas.some(s => validateJsonSchema(value, s, path).length === 0);\n if (!anyPassed) {\n errors.push({ path, message: 'Value does not match any of the anyOf schemas' });\n }\n }\n\n if (schema['oneOf'] !== undefined) {\n const subSchemas = schema['oneOf'] as JSONSchemaNode[];\n const passing = subSchemas.filter(s => validateJsonSchema(value, s, path).length === 0);\n if (passing.length !== 1) {\n errors.push({\n path,\n message: `Value must match exactly one of the oneOf schemas (matched ${passing.length})`\n });\n }\n }\n\n if (schema['not'] !== undefined) {\n const subErrors = validateJsonSchema(value, schema['not'] as JSONSchemaNode, path);\n if (subErrors.length === 0) {\n errors.push({ path, message: 'Value must NOT match the not schema' });\n }\n }\n\n return errors;\n}\n","import {\n IToolDefinition,\n LemuraToolNotFoundError,\n LemuraToolValidationError,\n LemuraToolTimeoutError,\n ToolContext\n} from '../types/index.js';\nimport { validateJsonSchema } from './SchemaValidator.js';\n\n/** Options for ToolRegistry behaviour. */\nexport interface ToolRegistryOptions {\n /**\n * Default timeout in milliseconds for each tool execution.\n * Individual tools may override this (see `IToolDefinition.timeoutMs`).\n * @default 30000\n */\n defaultTimeoutMs?: number;\n}\n\n/**\n * Manages registered tools and their execution lifecycle.\n *\n * Features:\n * - Registers tools by name (snake_case)\n * - Validates params against the tool's JSON Schema before execution (standalone, no Ajv)\n * - Enforces per-call timeout via `defaultTimeoutMs` / per-tool timeout\n * - Throws typed `LemuraError` subclasses for all failure modes\n *\n * @example\n * const registry = new ToolRegistry([myTool], { defaultTimeoutMs: 15_000 });\n * const result = await registry.execute('my_tool', params, context);\n */\nexport class ToolRegistry {\n private tools: Map<string, IToolDefinition> = new Map();\n private defaultTimeoutMs: number;\n\n constructor(initialTools: IToolDefinition[] = [], options: ToolRegistryOptions = {}) {\n this.defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;\n for (const tool of initialTools) {\n this.register(tool);\n }\n }\n\n /**\n * Registers a tool. Throws if a tool with the same name is already registered.\n *\n * @param tool - The tool definition to register\n * @throws {LemuraError} If `tool.name` is already taken\n */\n register(tool: IToolDefinition): void {\n if (this.tools.has(tool.name)) {\n throw new LemuraToolNotFoundError(`Tool '${tool.name}' is already registered. Use a unique name.`);\n }\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Removes a registered tool by name.\n *\n * @param name - The tool name to unregister\n */\n unregister(name: string): boolean {\n return this.tools.delete(name);\n }\n\n /**\n * Returns the tool definition for `name`, or `undefined` if not found.\n *\n * @param name - Tool name to look up\n */\n get(name: string): IToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Returns all registered tool definitions.\n */\n getAll(): IToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Executes a single tool call with schema validation and timeout enforcement.\n *\n * @param name - The tool name to execute\n * @param params - The raw parameter object (validated against the tool's JSON Schema)\n * @param context - Execution context (session, logger, adapters)\n * @returns The tool's result\n * @throws {LemuraToolNotFoundError} If the tool is not registered\n * @throws {LemuraToolValidationError} If params fail JSON Schema validation\n * @throws {LemuraToolTimeoutError} If execution exceeds the configured timeout\n */\n async execute(name: string, params: unknown, context: ToolContext): Promise<unknown> {\n const tool = this.tools.get(name);\n if (!tool) {\n throw new LemuraToolNotFoundError(`Tool '${name}' not found in registry.`);\n }\n\n // --- JSON Schema validation (standalone, no external lib) ---\n if (tool.parameters && typeof tool.parameters === 'object') {\n const schemaErrors = validateJsonSchema(params, tool.parameters as Record<string, unknown>);\n if (schemaErrors.length > 0) {\n const msg = schemaErrors.map(e => (e.path ? `[${e.path}] ${e.message}` : e.message)).join('; ');\n throw new LemuraToolValidationError(\n `Tool '${name}' parameter validation failed: ${msg}`\n );\n }\n }\n\n // --- Timeout enforcement ---\n const timeoutMs: number = tool.timeoutMs ?? this.defaultTimeoutMs;\n\n const startMs = Date.now();\n const executionPromise = tool.execute(params, context);\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n const id = setTimeout(() => {\n clearTimeout(id);\n reject(new LemuraToolTimeoutError(\n `Tool '${name}' timed out after ${timeoutMs}ms`\n ));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([executionPromise, timeoutPromise]);\n context.logger.debug(`Tool '${name}' completed in ${Date.now() - startMs}ms`);\n return result;\n } catch (err: unknown) {\n const elapsedMs = Date.now() - startMs;\n if (err instanceof LemuraToolTimeoutError) {\n context.logger.error(`Tool '${name}' timed out after ${elapsedMs}ms (limit: ${timeoutMs}ms)`, {\n problem: `Tool '${name}' did not respond within its timeout.`,\n hints: [\n `Increase the tool's timeoutMs (currently ${timeoutMs}ms) or optimise its implementation.`,\n `Check whether the external service the tool depends on is healthy.`\n ]\n });\n throw err;\n }\n if (err instanceof LemuraToolValidationError) {\n throw err;\n }\n const message = err instanceof Error ? err.message : String(err);\n context.logger.error(`Tool '${name}' failed after ${elapsedMs}ms: ${message}`);\n throw new LemuraToolValidationError(\n `Tool '${name}' execution failed: ${message}`\n );\n }\n }\n\n /**\n * Executes multiple tool calls in parallel.\n * All calls are issued simultaneously; results are returned in the same order as `calls`.\n * Individual errors are captured per-call without aborting the others.\n *\n * @param calls - Array of `{ name, params }` objects\n * @param context - Shared execution context\n * @returns Array of `{ toolCallId, result?, error? }` in input order\n *\n * @example\n * const results = await registry.executeParallel(\n * [{ name: 'search_web', params: { query: 'foo' } }],\n * context\n * );\n */\n async executeParallel(\n calls: Array<{ id: string; name: string; params: unknown }>,\n context: ToolContext\n ): Promise<Array<{ id: string; result?: unknown; error?: Error }>> {\n return Promise.all(\n calls.map(async call => {\n try {\n const result = await this.execute(call.name, call.params, context);\n return { id: call.id, result };\n } catch (err: unknown) {\n return { id: call.id, error: err instanceof Error ? err : new Error(String(err)) };\n }\n })\n );\n }\n}\n","import { ToolFirewallConfig, ToolDecision } from '../types/agent.js';\nimport { ILogger } from '../types/logger.js';\n\nexport interface ToolFirewallResult {\n decision: ToolDecision;\n reason: string;\n}\n\nfunction matchesRule(pattern: string | undefined, value: string, logger?: ILogger): boolean {\n if (!pattern) return true;\n try {\n const re = new RegExp(pattern);\n return re.test(value);\n } catch (err: any) {\n if (logger) logger.warn(`Invalid firewall regex: ${pattern}`, { error: err?.message });\n return false;\n }\n}\n\nexport function evaluateToolFirewall(\n config: ToolFirewallConfig | undefined,\n toolName: string,\n argsJson: string,\n logger?: ILogger\n): ToolFirewallResult {\n const defaultDecision: ToolDecision = config?.defaultDecision || 'ask';\n const rules = config?.rules || [];\n\n for (const rule of rules) {\n const nameOk = matchesRule(rule.name, toolName, logger);\n const argsOk = matchesRule(rule.arguments, argsJson, logger);\n if (nameOk && argsOk) {\n return {\n decision: rule.decision,\n reason: rule.reason || 'Matched firewall rule'\n };\n }\n }\n\n return {\n decision: defaultDecision,\n reason: 'Default firewall decision'\n };\n}\n","import {\n IProviderAdapter,\n TranscriptionRequest,\n TranscriptionResponse,\n SynthesisRequest,\n AudioChunk,\n VisionRequest,\n VisionResponse,\n ImageGenRequest,\n ImageGenResponse\n} from '../types/index.js';\n\n/**\n * MediaBridge provides a single, app-friendly entry point for audio/vision/image features.\n */\nexport class MediaBridge {\n private adapter: IProviderAdapter;\n\n constructor(adapter: IProviderAdapter) {\n this.adapter = adapter;\n }\n\n transcribe(request: TranscriptionRequest): Promise<TranscriptionResponse> {\n return this.adapter.transcribe(request);\n }\n\n synthesize(request: SynthesisRequest): AsyncIterable<AudioChunk> {\n return this.adapter.synthesize(request);\n }\n\n async synthesizeToArray(request: SynthesisRequest): Promise<AudioChunk[]> {\n const chunks: AudioChunk[] = [];\n for await (const chunk of this.adapter.synthesize(request)) {\n chunks.push(chunk);\n }\n return chunks;\n }\n\n describeImage(request: VisionRequest): Promise<VisionResponse> {\n return this.adapter.describeImage(request);\n }\n\n generateImage(request: ImageGenRequest): Promise<ImageGenResponse> {\n return this.adapter.generateImage(request);\n }\n\n getModelInfo() {\n return this.adapter.getModelInfo();\n }\n\n supportsVision(): boolean {\n return this.adapter.getModelInfo().supportsVision;\n }\n}\n","import { ISkill } from '../types/index.js';\n\n/**\n * Manages skill registration and injects skills into the system prompt at the\n * appropriate position (system_prompt | pre_turn | post_history).\n *\n * ## Fixed vs Dynamic skills\n *\n * Skills can declare a `strategy` field:\n *\n * - **`'fixed'`** (default) — Always active. Injected on every iteration.\n * All skills without a `strategy` field are treated as fixed for full\n * backward compatibility.\n *\n * - **`'dynamic'`** — Part of an opt-in pool. A dynamic skill is only injected\n * when its `enabled` flag is `true`. Enable skills at construction time via\n * `SessionConfig.activeDynamicSkills` / `SessionConfig.activeDynamicTags`, or\n * at runtime with `enableSkill()` / `enableByTags()`.\n *\n * ## Token budget\n *\n * Skills are sorted by `priority` (lower = higher priority). When a `tokenBudget`\n * is provided, skills are included in priority order until the budget is exhausted —\n * lower-tier content variants (`micro`, `nano`) are selected first so as many\n * skills as possible fit within the budget.\n *\n * ## Content resolution\n *\n * Content is resolved in this order (most compact first when budget-aware):\n * `nano` → `micro` → `standard` → `content` → `description`\n * (reversed for full output: `standard` → `content` → `micro` → `nano` → `description`)\n */\nexport class SkillInjector {\n private skills: ISkill[] = [];\n\n constructor(skills: ISkill[] = []) {\n this.skills = skills.map(s => this._normalise(s));\n this.sortSkills();\n }\n\n // -----------------------------------------------------------------------\n // Registration\n // -----------------------------------------------------------------------\n\n register(skill: ISkill): void {\n this.skills.push(this._normalise(skill));\n this.sortSkills();\n }\n\n private sortSkills(): void {\n this.skills.sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * Normalises a skill to ensure consistent defaults.\n * For dynamic skills, `enabled` defaults to `false` unless explicitly set.\n * For fixed skills (or those without a strategy), `enabled` is ignored.\n */\n private _normalise(skill: ISkill): ISkill {\n const strategy = skill.strategy ?? 'fixed';\n const enabled = strategy === 'dynamic'\n ? (skill.enabled ?? false)\n : true; // fixed skills are always conceptually enabled\n return { ...skill, strategy, enabled };\n }\n\n // -----------------------------------------------------------------------\n // Dynamic skill activation\n // -----------------------------------------------------------------------\n\n /**\n * Enable a dynamic skill by name.\n * Has no effect on fixed skills (they are always active).\n */\n enableSkill(name: string): void {\n const skill = this.skills.find(s => s.name === name);\n if (skill && skill.strategy === 'dynamic') {\n skill.enabled = true;\n }\n }\n\n /**\n * Disable a dynamic skill by name.\n * Has no effect on fixed skills.\n */\n disableSkill(name: string): void {\n const skill = this.skills.find(s => s.name === name);\n if (skill && skill.strategy === 'dynamic') {\n skill.enabled = false;\n }\n }\n\n /**\n * Enable all dynamic skills whose `tags` array intersects with `tags`.\n */\n enableByTags(tags: string[]): void {\n const tagSet = new Set(tags);\n for (const skill of this.skills) {\n if (skill.strategy === 'dynamic' && skill.tags?.some(t => tagSet.has(t))) {\n skill.enabled = true;\n }\n }\n }\n\n /**\n * Disable all dynamic skills whose `tags` array intersects with `tags`.\n */\n disableByTags(tags: string[]): void {\n const tagSet = new Set(tags);\n for (const skill of this.skills) {\n if (skill.strategy === 'dynamic' && skill.tags?.some(t => tagSet.has(t))) {\n skill.enabled = false;\n }\n }\n }\n\n // -----------------------------------------------------------------------\n // Queries\n // -----------------------------------------------------------------------\n\n /**\n * Returns all registered skills (fixed and dynamic, enabled or not).\n */\n getAll(): ISkill[] {\n return [...this.skills];\n }\n\n /**\n * Returns currently active skills — fixed skills always, dynamic skills\n * only when `enabled === true`.\n */\n getActiveSkills(): ISkill[] {\n return this.skills.filter(s => this._isActive(s));\n }\n\n /**\n * Returns skills at a given injection position, active only.\n */\n getSkillsForInjection(position: ISkill['inject']): ISkill[] {\n return this.skills.filter(s => s.inject === position && this._isActive(s));\n }\n\n /**\n * Returns the union of `requiredTools` from all currently active skills.\n * Use this to determine which tools the active skill set depends on.\n *\n * @since 1.4.0\n */\n getRequiredTools(): string[] {\n const tools = new Set<string>();\n for (const skill of this.getActiveSkills()) {\n for (const t of skill.requiredTools ?? []) {\n tools.add(t);\n }\n }\n return [...tools];\n }\n\n private _isActive(skill: ISkill): boolean {\n return skill.strategy !== 'dynamic' || skill.enabled === true;\n }\n\n // -----------------------------------------------------------------------\n // Injection block builder\n // -----------------------------------------------------------------------\n\n /**\n * Builds the combined injection block for all active skills at the given position.\n *\n * @param position - Which injection point to target.\n * @param tokenBudget - Optional maximum token budget. Skills are added in priority\n * order until the budget would be exceeded. When `undefined`, all active skills\n * at the position are included.\n */\n buildInjectionBlock(position: ISkill['inject'], tokenBudget?: number): string {\n const relevantSkills = this.getSkillsForInjection(position);\n if (relevantSkills.length === 0) return '';\n\n let block = '';\n let usedTokens = 0;\n\n for (const skill of relevantSkills) {\n // Choose the most compact variant that still carries useful information\n const content = this._pickContent(skill, tokenBudget !== undefined);\n if (!content) continue;\n\n const tierLabel = skill.tier ?? 'standard';\n const skillEntry = `\\n<lemura:skill name=\"${skill.name}\" tier=\"${tierLabel}\">\\n${content}\\n</lemura:skill>\\n`;\n\n // Approximate token count (4 chars ≈ 1 token)\n const skillTokens = Math.ceil(skillEntry.length / 4);\n\n if (tokenBudget !== undefined && usedTokens + skillTokens > tokenBudget) {\n // Skip this skill — would exceed budget\n continue;\n }\n\n block += skillEntry;\n usedTokens += skillTokens;\n }\n\n return block.trim();\n }\n\n // -----------------------------------------------------------------------\n // Content picking\n // -----------------------------------------------------------------------\n\n /**\n * Picks the content variant to use for a skill.\n *\n * Resolution order when budget-aware (compact first):\n * nano → micro → standard → content → description\n *\n * Resolution order when not budget-aware (richest first):\n * standard → content → micro → nano → description\n */\n private _pickContent(skill: ISkill, budgetAware: boolean): string {\n if (budgetAware) {\n return skill.nano\n || skill.micro\n || skill.standard\n || skill.content\n || skill.description\n || '';\n }\n return skill.standard\n || skill.content\n || skill.micro\n || skill.nano\n || skill.description\n || '';\n }\n}\n","import { IRAGAdapter, RAGDocument, RAGIngestRequest, RAGIngestResponse, RAGQueryRequest, RAGQueryResponse } from '../types/index.js';\n\nexport class InMemoryRAGAdapter implements IRAGAdapter {\n private documents: Map<string, RAGDocument> = new Map();\n\n async ingest(request: RAGIngestRequest): Promise<RAGIngestResponse> {\n for (const doc of request.documents) {\n this.documents.set(doc.id, doc);\n }\n return {\n ingestedCount: request.documents.length,\n failedCount: 0\n };\n }\n\n async query(request: RAGQueryRequest): Promise<RAGQueryResponse> {\n const queryStr = request.query.toLowerCase();\n const results = [];\n\n // Very basic keyword matching for testing\n for (const doc of this.documents.values()) {\n const content = doc.content.toLowerCase();\n let score = 0;\n if (content.includes(queryStr)) score += 0.8;\n\n const words = queryStr.split(' ');\n for (const word of words) {\n if (content.includes(word)) score += 0.1;\n }\n\n if (score > 0 && score >= (request.minScore || 0)) {\n results.push({ document: doc, score: Math.min(score, 1) });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n const topK = request.topK || 5;\n\n return {\n results: results.slice(0, topK)\n };\n }\n\n async healthCheck(): Promise<boolean> {\n return true;\n }\n}\n","import { ILogger, LogLevel, LogMetadata, Severity } from '../types/logger.js';\n\n/**\n * Default colorized logger for lemura.\n * Uses ANSI escape codes for beautiful colors without dependencies.\n */\nexport class DefaultLogger implements ILogger {\n private level: LogLevel = LogLevel.INFO;\n\n private readonly COLORS: Record<Severity | 'RESET', string> = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n FATAL: '\\x1b[41m\\x1b[37m', // White on Red background\n RESET: '\\x1b[0m',\n };\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.DEBUG) this.log('DEBUG', message, metadata);\n }\n\n info(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.INFO) this.log('INFO', message, metadata);\n }\n\n warn(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.WARN) this.log('WARN', message, metadata);\n }\n\n error(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.ERROR) this.log('ERROR', message, metadata);\n }\n\n fatal(message: string, metadata?: LogMetadata): void {\n if (this.level <= LogLevel.FATAL) this.log('FATAL', message, metadata);\n }\n\n private log(severity: Severity, message: string, metadata?: LogMetadata): void {\n const timestamp = new Date().toISOString();\n const color = this.COLORS[severity] || this.COLORS.RESET;\n const reset = this.COLORS.RESET;\n\n console.log(`${timestamp} [${color}${severity}${reset}] ${message}`);\n\n if (metadata) {\n if (metadata.problem) {\n console.log(` ${color}PROBLEM:${reset} ${metadata.problem}`);\n }\n if (metadata.hints && metadata.hints.length > 0) {\n console.log(` ${color}HINTS:${reset}`);\n metadata.hints.forEach(hint => console.log(` - ${hint}`));\n }\n\n // Log other metadata fields if they are not system fields\n const otherKeys = Object.keys(metadata).filter(k => !['problem', 'hints', 'severity'].includes(k));\n if (otherKeys.length > 0) {\n otherKeys.forEach(key => {\n const value = metadata[key];\n if (typeof value === 'object') {\n console.log(` ${key}: ${JSON.stringify(value, null, 2).replace(/\\n/g, '\\n ')}`);\n } else {\n console.log(` ${key}: ${value}`);\n }\n });\n }\n }\n }\n}\n","import { IToolDefinition, ToolContext } from '../../types/index.js';\nimport { ShortTermMemoryRegistry } from '../../context/ShortTermMemoryRegistry.js';\nimport { SandwichCompressionStrategy } from '../../context/SandwichCompressionStrategy.js';\n\n/**\n * Tool to read a chunk from Short Term Memory.\n */\nexport const readChunkTool: IToolDefinition = {\n name: 'read_chunk',\n description: 'Reads a specific portion or chunk of memory from a Short Term Memory reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference (e.g., [STM:uuid])' },\n start: { type: 'number', description: 'Starting index or page' },\n end: { type: 'number', description: 'Ending index or page' }\n },\n required: ['ref']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n // Basic chunking logic for demo purposes\n const content = String(item.content);\n if (params.start !== undefined || params.end !== undefined) {\n return content.slice(params.start ?? 0, params.end ?? content.length);\n }\n return content;\n }\n};\n\n/**\n * Tool to search for content within chunks.\n */\nexport const searchChunkTool: IToolDefinition = {\n name: 'search_chunk',\n description: 'Searches for specific content or patterns within Short Term Memory chunks.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' },\n query: { type: 'string', description: 'The search query or keyword' }\n },\n required: ['ref', 'query']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n const content = String(item.content);\n const index = content.toLowerCase().indexOf(params.query.toLowerCase());\n if (index === -1) return 'No matches found.';\n\n // Return a snippet around the match\n const start = Math.max(0, index - 100);\n const end = Math.min(content.length, index + 100);\n return `Match found at index ${index}: ...${content.slice(start, end)}...`;\n }\n};\n\n/**\n * Tool to list chunks of an STM reference.\n */\nexport const listChunksTool: IToolDefinition = {\n name: 'list_chunks',\n description: 'Lists available chunks or structural breakdown of a Short Term Memory reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' }\n },\n required: ['ref']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n const size = String(item.content).length;\n const chunkSize = 2000;\n const totalChunks = Math.ceil(size / chunkSize);\n\n return {\n totalSize: size,\n chunkSize,\n totalChunks,\n chunks: Array.from({ length: totalChunks }, (_, i) => ({\n index: i,\n start: i * chunkSize,\n end: Math.min((i + 1) * chunkSize, size)\n }))\n };\n }\n};\n\n/**\n * Tool to update a chunk in STM.\n */\nexport const updateChunkTool: IToolDefinition = {\n name: 'update_chunk',\n description: 'Updates or appends content to a specific Short Term Memory reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' },\n content: { type: 'string', description: 'The new content or update' },\n mode: { type: 'string', enum: ['append', 'replace'], default: 'append' }\n },\n required: ['ref', 'content']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n let newContent = String(item.content);\n if (params.mode === 'replace') {\n newContent = params.content;\n } else {\n newContent += params.content;\n }\n\n const uuid = params.ref.match(/\\[STM:(.+)\\]/)?.[1];\n if (!uuid) throw new Error('Invalid STM reference');\n\n await context.stmRegistry.update(uuid, { content: newContent });\n return { status: 'success', ref: params.ref };\n }\n};\n\n/**\n * Tool to read the scratchpad.\n */\nexport const readScratchpadTool: IToolDefinition = {\n name: 'read_scratchpad',\n description: 'Reads the content from the current agent scratchpad.',\n parameters: { type: 'object', properties: {} },\n async execute(_params: any, context: ToolContext) {\n if (context.scratchpadAdapter) {\n const stored = await context.scratchpadAdapter.read(context.sessionId);\n return stored ?? '';\n }\n return context.scratchpad ?? '';\n }\n};\n\n/**\n * Tool to write to the scratchpad.\n */\nexport const writeScratchpadTool: IToolDefinition = {\n name: 'write_scratchpad',\n description: 'Writes content to the agent scratchpad for long-term reasoning steps.',\n parameters: {\n type: 'object',\n properties: {\n content: { type: 'string', description: 'Content to write' },\n append: { type: 'boolean', default: true }\n },\n required: ['content']\n },\n async execute(params: any, context: ToolContext) {\n let current = context.scratchpad ?? '';\n if (context.scratchpadAdapter) {\n const stored = await context.scratchpadAdapter.read(context.sessionId);\n if (stored !== undefined) current = stored;\n }\n let newScratchpad = current;\n if (params.append) {\n newScratchpad += (newScratchpad ? '\\n' : '') + params.content;\n } else {\n newScratchpad = params.content;\n }\n if (context.scratchpadAdapter) {\n await context.scratchpadAdapter.write(context.sessionId, newScratchpad);\n }\n return { status: 'success', newScratchpad, note: 'Scratchpad updated' };\n }\n};\n\n/**\n * Tool to remove scratchpad content.\n */\nexport const removeScratchpadTool: IToolDefinition = {\n name: 'remove_scratchpad',\n description: 'Clears or removes content from the scratchpad.',\n parameters: { type: 'object', properties: {} },\n async execute(_params: any, context: ToolContext) {\n if (context.scratchpadAdapter) {\n await context.scratchpadAdapter.clear(context.sessionId);\n }\n return { status: 'success', newScratchpad: '', note: 'Scratchpad cleared' };\n }\n};\n\n/**\n * Tool to summarize via sandwich strategy.\n */\nexport const summarizeSandwichTool: IToolDefinition = {\n name: 'summarize_sandwich',\n description: 'Generated a layered sandwich summary of a large STM reference.',\n parameters: {\n type: 'object',\n properties: {\n ref: { type: 'string', description: 'The STM reference' },\n instructions: { type: 'string', description: 'Summarization instructions' }\n },\n required: ['ref']\n },\n async execute(params: any, context: ToolContext) {\n if (!context.stmRegistry) throw new Error('STM Registry not available in context');\n const item = await context.stmRegistry.getByRef(params.ref);\n if (!item) throw new Error(`STM item not found: ${params.ref}`);\n\n // This tool needs a provider adapter. In a real scenario, this might be passed in context or config.\n // For now, let's assume we can use a strategy if provided.\n // This highlights that some tools might need more context.\n return { status: 'pending', note: 'Summarization requires AI provider' };\n }\n};\n","import { IToolDefinition, ToolContext } from '../../types/index.js';\nimport { LemuraAdapterError } from '../../types/errors.js';\n\nconst defaultPrefix = 'media_';\n\nfunction requireAdapter(context: ToolContext) {\n if (!context.adapter) {\n throw new LemuraAdapterError('Provider adapter is missing from tool context', 'ADAPTER_MISSING');\n }\n return context.adapter;\n}\n\nexport function createMediaTools(prefix: string = defaultPrefix): IToolDefinition[] {\n const p = prefix || defaultPrefix;\n\n const transcribeTool: IToolDefinition = {\n name: `${p}transcribe`,\n description: 'Transcribe audio from base64 into text.',\n parameters: {\n type: 'object',\n properties: {\n audioBase64: { type: 'string', description: 'Base64-encoded audio payload.' },\n mimeType: { type: 'string', description: 'Audio MIME type like audio/wav or audio/mpeg.' },\n language: { type: 'string', description: 'Optional language hint like en, fr.' },\n model: { type: 'string', description: 'Optional model override for ASR.' }\n },\n required: ['audioBase64', 'mimeType']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const result = await adapter.transcribe({\n audioBase64: params.audioBase64,\n mimeType: params.mimeType,\n language: params.language,\n model: params.model\n });\n return result;\n }\n };\n\n const synthesizeTool: IToolDefinition = {\n name: `${p}synthesize`,\n description: 'Synthesize text to speech and return audio chunks (base64).',\n parameters: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to synthesize.' },\n voiceId: { type: 'string', description: 'Voice identifier.' },\n format: { type: 'string', enum: ['mp3', 'wav', 'pcm'] },\n model: { type: 'string', description: 'Optional model override for TTS.' }\n },\n required: ['text', 'voiceId', 'format']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const chunks = [] as { audioBase64: string }[];\n for await (const chunk of adapter.synthesize({\n text: params.text,\n voiceId: params.voiceId,\n format: params.format,\n model: params.model\n })) {\n chunks.push(chunk);\n }\n return { chunks };\n }\n };\n\n const visionTool: IToolDefinition = {\n name: `${p}describe_image`,\n description: 'Describe an image from base64 and optional prompt.',\n parameters: {\n type: 'object',\n properties: {\n imageBase64: { type: 'string', description: 'Base64-encoded image payload.' },\n prompt: { type: 'string', description: 'Optional instruction or focus for description.' },\n model: { type: 'string', description: 'Optional model override for vision.' }\n },\n required: ['imageBase64']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const result = await adapter.describeImage({\n imageBase64: params.imageBase64,\n prompt: params.prompt,\n model: params.model\n });\n return result;\n }\n };\n\n const imageGenTool: IToolDefinition = {\n name: `${p}generate_image`,\n description: 'Generate an image from a prompt.',\n parameters: {\n type: 'object',\n properties: {\n prompt: { type: 'string', description: 'Text prompt for the image.' },\n dimensions: { type: 'string', description: 'Image size like 1024x1024.' },\n model: { type: 'string', description: 'Optional model override for image generation.' }\n },\n required: ['prompt', 'dimensions']\n },\n async execute(params: any, context: ToolContext) {\n const adapter = requireAdapter(context);\n const result = await adapter.generateImage({\n prompt: params.prompt,\n dimensions: params.dimensions,\n model: params.model\n });\n return result;\n }\n };\n\n return [transcribeTool, synthesizeTool, visionTool, imageGenTool];\n}\n","export class StepCounter {\n private toolCallCount: number = 0;\n\n constructor(private maxSteps: number = 20) { }\n\n increment(count: number = 1): void {\n this.toolCallCount += count;\n }\n\n get count(): number {\n return this.toolCallCount;\n }\n\n isMaxReached(): boolean {\n return this.toolCallCount >= this.maxSteps;\n }\n\n getForcedConclusionPrompt(): string {\n return `You have used ${this.toolCallCount}/${this.maxSteps} steps. Provide your final response now.\\nDo not call any more tools. Use the required structure below.`;\n }\n}\n","export class FinalResponseFormatter {\n static getRequiredStructure(): string {\n return `## Goal Status: [ACHIEVED | PARTIALLY_ACHIEVED | FAILED]\n\n### What was accomplished\n[Summary of completed work]\n\n### Remaining tasks\n[Bulleted list, or \"None\"]\n\n### Failed steps\n[Tool/step name + error context, or \"None\"]\n\n### Result\n[The actual answer or deliverable]`;\n }\n\n static validateStructure(response: string): boolean {\n // Very basic validation heuristics\n if (!response.includes('## Goal Status:')) return false;\n if (!response.includes('### What was accomplished')) return false;\n if (!response.includes('### Remaining tasks')) return false;\n if (!response.includes('### Failed steps')) return false;\n if (!response.includes('### Result')) return false;\n return true;\n }\n}\n","import { IToolResponseProcessor, ToolResponseEvaluation, IToolDefinition } from '../../types/index.js';\n\n/**\n * Configuration for `ToolResponseProcessor`.\n *\n * Token thresholds define the boundaries between size classes.\n * `budgetPercent` caps the combined token spend of all tool results per iteration.\n */\nexport interface ToolResponseProcessorConfig {\n /** Max tokens for a `small` response. Responses at or below this are verbatim. Default: 200 */\n smallMaxTokens?: number;\n /** Max tokens for a `medium` response. Responses at or below this are verbatim. Default: 800 */\n mediumMaxTokens?: number;\n /** Max tokens for a `large` response. Above this threshold → `oversized`. Default: 2000 */\n largeMaxTokens?: number;\n /**\n * Cap total tool-response tokens per iteration as a fraction of session `maxTokens`.\n * E.g. `0.15` means all tool results combined must fit within 15% of the context window.\n * Not enforced by the processor itself — SessionManager uses this to decide when to\n * apply extra compression after all tool results are collected. Default: undefined (no cap).\n */\n budgetPercent?: number;\n}\n\n/**\n * Evaluates and compresses tool response strings before they are appended to the\n * context window, preventing large tool outputs from flooding the token budget.\n *\n * @example\n * ```typescript\n * toolResponseProcessor: new ToolResponseProcessor({\n * smallMaxTokens: 200,\n * mediumMaxTokens: 800,\n * largeMaxTokens: 2000,\n * budgetPercent: 0.15,\n * })\n * ```\n */\nexport class ToolResponseProcessor implements IToolResponseProcessor {\n private readonly smallMax: number;\n private readonly mediumMax: number;\n private readonly largeMax: number;\n readonly budgetPercent: number | undefined;\n\n constructor(config: ToolResponseProcessorConfig = {}) {\n this.smallMax = config.smallMaxTokens ?? 200;\n this.mediumMax = config.mediumMaxTokens ?? 800;\n this.largeMax = config.largeMaxTokens ?? 2000;\n this.budgetPercent = config.budgetPercent;\n }\n\n evaluate(response: string, tool: IToolDefinition, context: unknown): ToolResponseEvaluation {\n const estimatedTokens = response.length / 4;\n\n let sizeClass: ToolResponseEvaluation['sizeClass'] = 'small';\n if (estimatedTokens > this.largeMax) sizeClass = 'oversized';\n else if (estimatedTokens > this.mediumMax) sizeClass = 'large';\n else if (estimatedTokens > this.smallMax) sizeClass = 'medium';\n\n // Detect common soft-error patterns even when HTTP status is 200\n const lc = response.toLowerCase();\n const errorDetected =\n lc.includes('error:') ||\n lc.includes('exception:') ||\n lc.includes('\"error\"') ||\n lc.includes('\"status\":\"error\"') ||\n lc.includes('\"status\": \"error\"') ||\n lc.includes('failed:') ||\n lc.includes('connection refused') ||\n lc.includes('timed out');\n\n const suggestedAction: ToolResponseEvaluation['suggestedAction'] = errorDetected\n ? 'retry'\n : sizeClass === 'oversized' || sizeClass === 'large'\n ? 'continue'\n : 'continue';\n\n return {\n relevanceScore: 1.0,\n sizeClass,\n shouldCompress: sizeClass === 'large' || sizeClass === 'oversized',\n suggestedMaxTokens: this.mediumMax,\n answered: !errorDetected,\n answeredPartially: errorDetected,\n errorDetected,\n suggestedAction,\n };\n }\n\n compress(response: string, evaluation: ToolResponseEvaluation): string {\n if (!evaluation.shouldCompress || evaluation.errorDetected) {\n // Never drop error signals — the model must see them\n return response;\n }\n\n if (evaluation.sizeClass === 'oversized') {\n // Truncative: keep head (first ~4000 chars) + tail (last ~2000 chars)\n const headChars = this.largeMax * 4; // approx chars for largeMax tokens\n const tailChars = this.mediumMax * 2; // approx chars for half mediumMax tokens\n if (response.length > headChars + tailChars) {\n const skipped = response.length - headChars - tailChars;\n return (\n response.slice(0, headChars) +\n `\\n\\n...[${skipped} characters omitted — response too large]...\\n\\n` +\n response.slice(-tailChars)\n );\n }\n }\n\n if (evaluation.sizeClass === 'large') {\n // Extractive: keep first N + last M lines\n const lines = response.split('\\n');\n const keepLines = Math.ceil(this.mediumMax / 10); // heuristic\n if (lines.length > keepLines * 2) {\n const skipped = lines.length - keepLines * 2;\n return [\n ...lines.slice(0, keepLines),\n `... [${skipped} lines omitted] ...`,\n ...lines.slice(-keepLines),\n ].join('\\n');\n }\n }\n\n return response;\n }\n}\n","export interface Goal {\n id: string;\n statement: string;\n /** High-level sub-goals decomposed from the main statement */\n decomposition: string[];\n successCriteria: string[];\n injectionFrequency: 'always' | 'every_N_turns' | 'on_compression';\n injectionPosition: 'system_prompt' | 'pre_turn';\n /** Sub-goals already completed — updated via `markSubGoalDone()` */\n completedSubGoals?: string[];\n}\n\n/**\n * GoalInjector keeps the original task objective visible throughout the ReAct loop,\n * preventing goal drift after many tool calls and context compressions.\n *\n * Usage in SessionManager:\n * - For `system_prompt` position: call `injectInto(prompt)` which appends the goal block.\n * - For `pre_turn` position: call `getFormattedBlock()` and push as a system message.\n */\nexport class GoalInjector {\n private goal: Goal;\n private turnsSinceInjection: number = 0;\n\n constructor(goal: Goal) {\n this.goal = {\n ...goal,\n completedSubGoals: goal.completedSubGoals ?? [],\n };\n }\n\n /**\n * Returns the formatted `<lemura:goal>` block string — without caring about\n * where it will be placed. Callers decide whether to append to a system prompt\n * or push as a separate message.\n */\n getFormattedBlock(): string {\n const { statement, successCriteria, decomposition, completedSubGoals = [] } = this.goal;\n\n const pending = decomposition.filter(sg => !completedSubGoals.includes(sg));\n const completed = decomposition.filter(sg => completedSubGoals.includes(sg));\n\n let block = `<lemura:goal>\\n<lemura:statement>${statement}</lemura:statement>\\n`;\n\n if (successCriteria.length > 0) {\n block += `<lemura:criteria>\\n${successCriteria.map(c => `- ${c}`).join('\\n')}\\n</lemura:criteria>\\n`;\n }\n\n if (pending.length > 0) {\n block += `<lemura:subgoals status=\"pending\">\\n${pending.map(sg => `- ${sg}`).join('\\n')}\\n</lemura:subgoals>\\n`;\n }\n\n if (completed.length > 0) {\n block += `<lemura:subgoals status=\"done\">\\n${completed.map(sg => `- ✅ ${sg}`).join('\\n')}\\n</lemura:subgoals>\\n`;\n }\n\n block += '</lemura:goal>';\n return block;\n }\n\n /**\n * Appends the goal block to the given prompt string (for `system_prompt` position).\n * For `pre_turn` position, use `getFormattedBlock()` directly.\n *\n * @param prompt - The existing system prompt to append to.\n */\n injectInto(prompt: string): string {\n const block = this.getFormattedBlock();\n return prompt ? `${prompt}\\n\\n${block}` : block;\n }\n\n /**\n * Returns true when the goal should be re-injected this turn,\n * based on `injectionFrequency`.\n *\n * @param turnIndex - The current turn index in the ReAct loop (0-based)\n * @param compressionOccurred - Whether context was compressed this iteration\n * @param injectionN - The N for 'every_N_turns' frequency (default: 3)\n */\n shouldInjectThisTurn(\n turnIndex: number,\n compressionOccurred: boolean = false,\n injectionN: number = 3\n ): boolean {\n const { injectionFrequency } = this.goal;\n\n if (injectionFrequency === 'always') return true;\n\n if (injectionFrequency === 'every_N_turns') {\n return turnIndex % injectionN === 0;\n }\n\n if (injectionFrequency === 'on_compression') {\n return compressionOccurred;\n }\n\n return true;\n }\n\n /**\n * Updates the goal with new sub-goal decomposition and success criteria,\n * typically populated by the mini-planning LLM call.\n */\n updateDecomposition(decomposition: string[], successCriteria?: string[]): void {\n this.goal = {\n ...this.goal,\n decomposition,\n ...(successCriteria ? { successCriteria } : {}),\n };\n }\n\n /**\n * Marks a sub-goal as completed so it moves to the \"completed\" section\n * in subsequent injections.\n */\n markSubGoalDone(subGoal: string): void {\n const completed = this.goal.completedSubGoals ?? [];\n if (!completed.includes(subGoal)) {\n this.goal = {\n ...this.goal,\n completedSubGoals: [...completed, subGoal],\n };\n }\n }\n\n /** Returns a snapshot of the current goal state (safe to store in context.metadata). */\n getGoal(): Goal {\n return { ...this.goal, completedSubGoals: [...(this.goal.completedSubGoals ?? [])] };\n }\n\n /** Increments the internal turn counter (used for `every_N_turns` frequency). */\n incrementTurn(): void {\n this.turnsSinceInjection++;\n }\n}\n","/**\n * An optional condition that gates a step's execution on the output of a prior step.\n * When the condition is not met, the step is automatically marked `skipped`.\n */\nexport interface StepCondition {\n /** stepId whose output is inspected */\n step: string;\n /** Substring that must be present in the prior step's output to allow this step to run */\n outputContains: string;\n}\n\n/**\n * Result returned by a `StepVerifier.check` function.\n * - `pass` — the sub-goal is achieved; the step is marked `done`.\n * - `fail` — the sub-goal failed; the step is marked `failed` and BFS propagates to dependants.\n * - `retry` — the output is unsatisfactory but retriable; the step is reset to `pending`.\n */\nexport interface StepVerifierResult {\n status: 'pass' | 'fail' | 'retry';\n reason?: string;\n}\n\n/**\n * Optional semantic verifier attached to a `ContinuationStep`.\n * Called after the tool executes successfully to confirm the sub-goal is actually met.\n *\n * @example\n * verify: {\n * maxRetries: 2,\n * check: (output) => {\n * const data = JSON.parse(output);\n * return data.rows?.length > 0\n * ? { status: 'pass' }\n * : { status: 'retry', reason: 'Empty result set' };\n * }\n * }\n */\nexport interface StepVerifier {\n /**\n * Inspects the tool output and decides whether the sub-goal is satisfied.\n * @param output - Serialised tool result string\n * @param args - The resolved arguments that were passed to the tool\n */\n check: (output: string, args: Record<string, unknown>) => Promise<StepVerifierResult> | StepVerifierResult;\n /**\n * Maximum number of `retry` verdicts allowed before the step is forced to `failed`.\n * Defaults to 0 (no retries — a `retry` verdict immediately becomes `failed`).\n */\n maxRetries?: number;\n}\n\nexport interface ContinuationStep {\n stepId: string;\n toolName: string;\n description: string;\n /** stepIds that must be `done` before this step may run */\n dependsOn: string[];\n status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';\n /**\n * When provided, the step's output is stored under this key in\n * `context.metadata['toolOutputs']` for downstream steps to reference.\n */\n outputKey?: string;\n /**\n * Maps prior step `outputKey` values to this step's tool parameter names.\n * E.g. `{ data: 'rawData' }` means the tool's `data` param gets the value\n * stored under the `rawData` output key from an earlier step.\n */\n inputMapping?: Record<string, string>;\n /**\n * Optional condition: the step only runs if the referenced prior step's output\n * contains the given substring. When the condition is not met, the step is skipped.\n */\n condition?: StepCondition;\n /**\n * Optional semantic verifier: called after the tool executes to confirm the\n * sub-goal is actually satisfied. Supports `pass / fail / retry` verdicts\n * with a configurable `maxRetries` count.\n *\n * @since 1.4.4\n */\n verify?: StepVerifier;\n}\n\nexport interface ContinuationPlan {\n steps: ContinuationStep[];\n currentStepIndex: number;\n strategy: 'sequential' | 'parallel' | 'conditional';\n}\n\n/**\n * Manages a structured multi-step continuation plan for the ReAct loop.\n *\n * Steps are tracked by status (`pending`, `running`, `done`, `failed`, `skipped`).\n * Dependency failures automatically propagate `skipped` to all downstream steps.\n * Step outputs are stored by `outputKey` and made available for `inputMapping`.\n *\n * @example\n * ```typescript\n * const planner = new ContinuationPlanner({\n * steps: [\n * { stepId: 'fetch', toolName: 'fetch_data', description: 'Get raw data', dependsOn: [], outputKey: 'rawData' },\n * { stepId: 'analyze', toolName: 'analyze', description: 'Run analysis', dependsOn: ['fetch'], inputMapping: { data: 'rawData' } },\n * ],\n * currentStepIndex: 0,\n * strategy: 'sequential',\n * });\n * ```\n */\nexport class ContinuationPlanner {\n private plan: ContinuationPlan;\n private outputs: Map<string, string> = new Map();\n private retryCount: Map<string, number> = new Map();\n private onStepSkipped: ((stepId: string, reason: string) => void) | undefined;\n private onStepFailed: ((stepId: string, reason: string) => void) | undefined;\n\n constructor(\n plan: ContinuationPlan,\n callbacks?: {\n onStepSkipped?: (stepId: string, reason: string) => void;\n onStepFailed?: (stepId: string, reason: string) => void;\n }\n ) {\n this.plan = { ...plan, steps: plan.steps.map(s => ({ ...s })) };\n this.onStepSkipped = callbacks?.onStepSkipped;\n this.onStepFailed = callbacks?.onStepFailed;\n }\n\n // -------------------------------------------------------------------------\n // State queries\n // -------------------------------------------------------------------------\n\n /** Returns the current plan (deep copy) */\n getPlan(): ContinuationPlan {\n return { ...this.plan, steps: this.plan.steps.map(s => ({ ...s })) };\n }\n\n /** Returns a human-readable status string with icons (injected before each iteration) */\n getPlanStatusString(): string {\n const current = this.plan.currentStepIndex + 1;\n const total = this.plan.steps.length;\n let result = `<lemura:plan step=\"${current}\" total=\"${total}\">\\n`;\n for (const step of this.plan.steps) {\n const icon = this._icon(step.status);\n const statusText = step.status === 'pending' && step.dependsOn.length > 0\n ? `Waiting on Step ${step.dependsOn.join(', ')}`\n : step.status.charAt(0).toUpperCase() + step.status.slice(1);\n result += `<lemura:step id=\"${step.stepId}\" tool=\"${step.toolName}\" status=\"${step.status}\">${icon} ${statusText}</lemura:step>\\n`;\n }\n result += '</lemura:plan>';\n return result;\n }\n\n private _icon(status: ContinuationStep['status']): string {\n switch (status) {\n case 'done': return '✅';\n case 'running': return '▶';\n case 'failed': return '❌';\n case 'skipped': return '⏭';\n default: return '⏳';\n }\n }\n\n /** Returns all steps whose dependencies are satisfied and that are still pending */\n getReadySteps(): ContinuationStep[] {\n return this.plan.steps.filter(step => {\n if (step.status !== 'pending') return false;\n\n // All dependencies must be done\n const depsOk = step.dependsOn.every(depId => {\n const dep = this.plan.steps.find(s => s.stepId === depId);\n return dep?.status === 'done';\n });\n if (!depsOk) return false;\n\n // Evaluate optional condition\n if (step.condition) {\n const condDepOutput = this.outputs.get(step.condition.step) ?? '';\n if (!condDepOutput.includes(step.condition.outputContains)) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n /** Returns true when all steps have reached a terminal state */\n isComplete(): boolean {\n return this.plan.steps.every(\n s => s.status === 'done' || s.status === 'failed' || s.status === 'skipped'\n );\n }\n\n // -------------------------------------------------------------------------\n // State mutations\n // -------------------------------------------------------------------------\n\n /** Marks a step as running */\n markStepRunning(stepId: string): void {\n this._updateStep(stepId, { status: 'running' });\n }\n\n /**\n * Marks a step as done, stores its output under `outputKey` (if set),\n * and advances `currentStepIndex` to the next pending step.\n */\n markStepDone(stepId: string, output?: string): void {\n const step = this.plan.steps.find(s => s.stepId === stepId);\n if (step?.outputKey && output !== undefined) {\n this.outputs.set(step.outputKey, output);\n }\n this._updateStep(stepId, { status: 'done' });\n this._advanceIndex();\n }\n\n /**\n * Marks a step as failed and propagates `skipped` to all transitively dependent steps.\n */\n markStepFailed(stepId: string, reason = 'step failed'): void {\n this._updateStep(stepId, { status: 'failed' });\n this.onStepFailed?.(stepId, reason);\n this._skipDependants(stepId);\n }\n\n /**\n * Marks a step as skipped (e.g., condition not met) and propagates to its dependants.\n */\n markStepSkipped(stepId: string, reason = 'condition not met'): void {\n this._updateStep(stepId, { status: 'skipped' });\n this.onStepSkipped?.(stepId, reason);\n this._skipDependants(stepId);\n }\n\n /**\n * Resets a step back to `pending` for a retry attempt.\n * Increments the internal retry counter for the step.\n */\n markStepPending(stepId: string): void {\n this._updateStep(stepId, { status: 'pending' });\n this.retryCount.set(stepId, (this.retryCount.get(stepId) ?? 0) + 1);\n }\n\n /** Returns how many times a step has been retried. */\n getRetryCount(stepId: string): number {\n return this.retryCount.get(stepId) ?? 0;\n }\n\n // -------------------------------------------------------------------------\n // Output / input mapping helpers\n // -------------------------------------------------------------------------\n\n /** Retrieves an output stored by `outputKey` from a completed step */\n getOutput(key: string): string | undefined {\n return this.outputs.get(key);\n }\n\n /**\n * Resolves the `inputMapping` for a step into a concrete parameter map,\n * substituting `outputKey` values from prior steps. Static (non-key) values\n * in the mapping are passed through unchanged.\n */\n resolveInputs(step: ContinuationStep, baseArgs: Record<string, unknown> = {}): Record<string, unknown> {\n if (!step.inputMapping) return baseArgs;\n\n const resolved: Record<string, unknown> = { ...baseArgs };\n for (const [paramName, outputKey] of Object.entries(step.inputMapping)) {\n const value = this.outputs.get(outputKey);\n // Only substitute if we have a stored output for this key\n if (value !== undefined) {\n resolved[paramName] = value;\n } else {\n // Treat as a static value (e.g. quarter: 'Q4 2025')\n resolved[paramName] = outputKey;\n }\n }\n return resolved;\n }\n\n // -------------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------------\n\n private _updateStep(stepId: string, patch: Partial<ContinuationStep>): void {\n this.plan.steps = this.plan.steps.map(s =>\n s.stepId === stepId ? { ...s, ...patch } : s\n );\n }\n\n private _skipDependants(failedStepId: string): void {\n // BFS / iterative propagation of skipped status\n const toSkip = new Set<string>([failedStepId]);\n let changed = true;\n while (changed) {\n changed = false;\n for (const step of this.plan.steps) {\n if (step.status === 'pending' && step.dependsOn.some(d => toSkip.has(d))) {\n this._updateStep(step.stepId, { status: 'skipped' });\n this.onStepSkipped?.(step.stepId, `dependency '${failedStepId}' failed or was skipped`);\n toSkip.add(step.stepId);\n changed = true;\n }\n }\n }\n }\n\n private _advanceIndex(): void {\n const nextPending = this.plan.steps.findIndex(\n (s, i) => i > this.plan.currentStepIndex && s.status === 'pending'\n );\n if (nextPending !== -1) {\n this.plan.currentStepIndex = nextPending;\n }\n }\n}\n","import { ChildProcess, spawn } from 'child_process';\nimport { ILogger } from '../types/index.js';\nimport {\n MCPServerConfig,\n MCPToolDefinition,\n MCPJsonRpcRequest,\n MCPJsonRpcResponse\n} from '../types/mcp.js';\nimport { LemuraMCPConnectionError, LemuraMCPTimeoutError } from '../types/errors.js';\n\n/**\n * Low-level MCP server client.\n *\n * Supports two transports:\n * - **stdio** — spawns a child process and communicates over stdin/stdout via newline-delimited JSON-RPC 2.0\n * - **http** — sends JSON-RPC 2.0 `POST` requests using native `fetch` (Node >= 18 required)\n *\n * Lifecycle:\n * 1. `connect()` — initialize the server and fetch its tool list\n * 2. `callTool()` — invoke a tool by name\n * 3. `disconnect()` — terminate the connection / child process\n *\n * @example\n * const client = new MCPClient('github', {\n * name: 'github',\n * transport: 'stdio',\n * command: 'npx',\n * args: ['@modelcontextprotocol/server-github'],\n * env: { GITHUB_TOKEN: '...' }\n * }, logger);\n *\n * await client.connect();\n * const result = await client.callTool('create_issue', { title: 'bug' });\n * await client.disconnect();\n */\nexport class MCPClient {\n private readonly config: MCPServerConfig;\n private readonly logger: ILogger;\n private readonly _serverName: string;\n private readonly timeoutMs: number;\n\n private _tools: MCPToolDefinition[] = [];\n private _connected: boolean = false;\n\n // stdio-specific state\n private process: ChildProcess | null = null;\n private pendingCallbacks: Map<number | string, {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n }> = new Map();\n private requestId: number = 1;\n private stdioBuffer: string = '';\n\n constructor(name: string, config: MCPServerConfig, logger: ILogger) {\n this._serverName = name;\n this.config = config;\n this.logger = logger;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n }\n\n get serverName(): string {\n return this._serverName;\n }\n\n get tools(): MCPToolDefinition[] {\n return this._tools;\n }\n\n get isConnected(): boolean {\n return this._connected;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n /**\n * Connects to the MCP server: sends `initialize` + `notifications/initialized`,\n * then fetches the tool list via `tools/list`.\n */\n async connect(): Promise<void> {\n this.logger.debug(`[MCP:${this._serverName}] Connecting via ${this.config.transport}...`);\n\n if (this.config.transport === 'stdio') {\n await this._connectStdio();\n } else {\n // http / sse — validate url exists\n if (!this.config.url) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] 'url' is required for ${this.config.transport} transport`,\n `No URL provided for MCP server '${this._serverName}'`,\n [`Set 'url' in the MCPServerConfig for server '${this._serverName}'`]\n );\n }\n }\n\n await this._initialize();\n await this._discoverTools();\n this._connected = true;\n this.logger.info(`[MCP:${this._serverName}] Connected. ${this._tools.length} tool(s) available.`);\n }\n\n /**\n * Calls a tool on this MCP server.\n *\n * @param toolName - The tool name as declared by the server\n * @param args - Tool arguments (must match the tool's inputSchema)\n * @returns The serialised result from the server\n */\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\n this.logger.debug(`[MCP:${this._serverName}] Calling tool '${toolName}'`, { args });\n\n const request: MCPJsonRpcRequest = {\n jsonrpc: '2.0',\n id: this._nextId(),\n method: 'tools/call',\n params: { name: toolName, arguments: args }\n };\n\n const startMs = Date.now();\n let response: MCPJsonRpcResponse;\n try {\n response = await this._rpc(request);\n } catch (err: unknown) {\n const elapsedMs = Date.now() - startMs;\n if (err instanceof LemuraMCPTimeoutError) {\n this.logger.error(\n `[MCP:${this._serverName}] Tool '${toolName}' timed out after ${elapsedMs}ms (limit: ${this.timeoutMs}ms)`,\n {\n problem: `MCP server '${this._serverName}' did not respond to tool '${toolName}' in time.`,\n hints: [\n `Increase 'timeoutMs' in the MCPServerConfig for '${this._serverName}' (currently ${this.timeoutMs}ms).`,\n `Check whether the MCP server process is healthy and not blocked.`\n ]\n }\n );\n } else {\n this.logger.error(\n `[MCP:${this._serverName}] Tool '${toolName}' RPC failed after ${elapsedMs}ms: ${(err as Error).message}`\n );\n }\n throw err;\n }\n this.logger.debug(`[MCP:${this._serverName}] Tool '${toolName}' completed in ${Date.now() - startMs}ms`);\n this._assertNoError(response, `tool '${toolName}'`);\n\n // MCP spec: result.content is an array of content blocks\n const result = response.result as Record<string, unknown> | undefined;\n if (result && Array.isArray(result['content'])) {\n // Flatten text content blocks into a single string for convenience\n const texts = (result['content'] as Array<{ type: string; text?: string }>)\n .filter(b => b.type === 'text' && b.text)\n .map(b => b.text as string);\n return texts.length === 1 ? texts[0] : texts.length > 1 ? texts.join('\\n') : result;\n }\n return result;\n }\n\n /**\n * Disconnects from the MCP server.\n * For stdio: sends the `exit` notification then terminates the process.\n */\n async disconnect(): Promise<void> {\n if (!this._connected) return;\n\n this.logger.debug(`[MCP:${this._serverName}] Disconnecting...`);\n this._connected = false;\n\n if (this.process) {\n try {\n // Best-effort: send exit notification\n const exitNotif = JSON.stringify({\n jsonrpc: '2.0',\n method: 'notifications/exit'\n }) + '\\n';\n this.process.stdin?.write(exitNotif);\n } catch { /* ignore write errors on shutdown */ }\n\n this.process.kill();\n this.process = null;\n }\n\n // Reject any still-pending callbacks\n for (const [, cb] of this.pendingCallbacks) {\n cb.reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Connection closed before response received`\n ));\n }\n this.pendingCallbacks.clear();\n }\n\n // ---------------------------------------------------------------------------\n // Private: stdio transport\n // ---------------------------------------------------------------------------\n\n private async _connectStdio(): Promise<void> {\n const { command, args = [], env = {} = {} } = this.config as Required<Pick<MCPServerConfig, 'command'>> & MCPServerConfig;\n\n if (!command) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] 'command' is required for stdio transport`,\n `No command provided for stdio MCP server '${this._serverName}'`,\n [`Set the 'command' field in MCPServerConfig for server '${this._serverName}'`]\n );\n }\n\n return new Promise<void>((resolve, reject) => {\n let proc: ChildProcess;\n try {\n proc = spawn(command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env, ...env }\n });\n } catch (err: unknown) {\n return reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Failed to spawn '${command}': ${(err as Error).message}`,\n `Could not start MCP server process for '${this._serverName}'`,\n [\n `Ensure '${command}' is installed and available in PATH`,\n `Check the 'args' and 'env' configuration for server '${this._serverName}'`\n ]\n ));\n }\n\n this.process = proc;\n\n proc.on('error', (err) => {\n this.logger.error(`[MCP:${this._serverName}] Process error: ${err.message}`);\n // Reject any pending callbacks\n for (const [, cb] of this.pendingCallbacks) {\n cb.reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Process error: ${err.message}`\n ));\n }\n this.pendingCallbacks.clear();\n this._connected = false;\n });\n\n proc.on('exit', (code, signal) => {\n if (this._connected) {\n this.logger.warn(`[MCP:${this._serverName}] Process exited unexpectedly (code=${code}, signal=${signal})`);\n this._connected = false;\n }\n });\n\n proc.stdout?.on('data', (chunk: Buffer) => {\n this.stdioBuffer += chunk.toString('utf8');\n this._flushStdioBuffer();\n });\n\n proc.stderr?.on('data', (chunk: Buffer) => {\n // MCP servers may log to stderr; surface as debug\n this.logger.debug(`[MCP:${this._serverName}] stderr: ${chunk.toString('utf8').trim()}`);\n });\n\n resolve();\n });\n }\n\n /** Parses newline-delimited JSON messages from the stdio buffer */\n private _flushStdioBuffer(): void {\n const lines = this.stdioBuffer.split('\\n');\n // Keep the last (potentially incomplete) line in the buffer\n this.stdioBuffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: MCPJsonRpcResponse;\n try {\n msg = JSON.parse(trimmed) as MCPJsonRpcResponse;\n } catch {\n this.logger.debug(`[MCP:${this._serverName}] Ignoring non-JSON line: ${trimmed.slice(0, 120)}`);\n continue;\n }\n\n // Responses have an id; notifications do not — ignore notifications\n if (msg.id === undefined || msg.id === null) continue;\n\n const cb = this.pendingCallbacks.get(msg.id);\n if (cb) {\n this.pendingCallbacks.delete(msg.id);\n cb.resolve(msg);\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private: JSON-RPC helpers\n // ---------------------------------------------------------------------------\n\n private _nextId(): number {\n return this.requestId++;\n }\n\n /** Sends a JSON-RPC request and returns the response, honouring the configured timeout. */\n private async _rpc(request: MCPJsonRpcRequest): Promise<MCPJsonRpcResponse> {\n if (this.config.transport === 'stdio') {\n return this._rpcStdio(request);\n }\n return this._rpcHttp(request);\n }\n\n private _rpcStdio(request: MCPJsonRpcRequest): Promise<MCPJsonRpcResponse> {\n return new Promise<MCPJsonRpcResponse>((resolve, reject) => {\n if (!this.process?.stdin) {\n return reject(new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] stdin is not available`\n ));\n }\n\n const id = request.id;\n let timedOut = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n this.pendingCallbacks.delete(id);\n reject(new LemuraMCPTimeoutError(\n `[MCP:${this._serverName}] RPC call '${request.method}' timed out after ${this.timeoutMs}ms`\n ));\n }, this.timeoutMs);\n\n this.pendingCallbacks.set(id, {\n resolve: (value) => {\n if (timedOut) return;\n clearTimeout(timer);\n resolve(value as MCPJsonRpcResponse);\n },\n reject: (err) => {\n if (timedOut) return;\n clearTimeout(timer);\n reject(err);\n }\n });\n\n this.process.stdin.write(JSON.stringify(request) + '\\n', 'utf8');\n });\n }\n\n private async _rpcHttp(request: MCPJsonRpcRequest): Promise<MCPJsonRpcResponse> {\n const url = this.config.url!;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n ...this.config.headers\n },\n body: JSON.stringify(request),\n signal: controller.signal\n });\n\n if (!res.ok) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] HTTP ${res.status} from server: ${res.statusText}`,\n `MCP server '${this._serverName}' returned a non-2xx response`,\n [`Verify the server is running at '${url}' and accepting JSON-RPC requests`]\n );\n }\n\n return await res.json() as MCPJsonRpcResponse;\n } catch (err: unknown) {\n if ((err as Error).name === 'AbortError') {\n throw new LemuraMCPTimeoutError(\n `[MCP:${this._serverName}] HTTP RPC '${request.method}' timed out after ${this.timeoutMs}ms`\n );\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Sends `initialize` then `notifications/initialized` per MCP spec */\n private async _initialize(): Promise<void> {\n const initRequest: MCPJsonRpcRequest = {\n jsonrpc: '2.0',\n id: this._nextId(),\n method: 'initialize',\n params: {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n clientInfo: { name: 'lemura', version: '1.2.0' }\n }\n };\n\n let response: MCPJsonRpcResponse;\n try {\n response = await this._rpc(initRequest);\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] Initialize failed: ${msg}`,\n `Failed to initialize MCP server '${this._serverName}'`,\n [\n `Ensure the server supports the MCP protocol`,\n `Verify the server is running and accepting connections`\n ]\n );\n }\n\n this._assertNoError(response, 'initialize');\n\n // Send the initialized notification (no id = notification, no response expected)\n const initializedNotif = JSON.stringify({\n jsonrpc: '2.0',\n method: 'notifications/initialized'\n }) + '\\n';\n\n if (this.config.transport === 'stdio' && this.process?.stdin) {\n this.process.stdin.write(initializedNotif, 'utf8');\n } else if (this.config.transport !== 'stdio') {\n // HTTP: fire-and-forget notify (some servers don't require it)\n fetch(this.config.url!, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers\n },\n body: initializedNotif\n }).catch(() => { /* optional notification — ignore errors */ });\n }\n }\n\n /** Fetches and caches the tool list from the server */\n private async _discoverTools(): Promise<void> {\n const request: MCPJsonRpcRequest = {\n jsonrpc: '2.0',\n id: this._nextId(),\n method: 'tools/list',\n params: {}\n };\n\n const response = await this._rpc(request);\n this._assertNoError(response, 'tools/list');\n\n const result = response.result as Record<string, unknown> | undefined;\n const tools = (result?.['tools'] ?? []) as MCPToolDefinition[];\n this._tools = tools;\n }\n\n private _assertNoError(response: MCPJsonRpcResponse, context: string): void {\n if (response.error) {\n throw new LemuraMCPConnectionError(\n `[MCP:${this._serverName}] JSON-RPC error in ${context}: [${response.error.code}] ${response.error.message}`,\n `MCP server '${this._serverName}' returned a JSON-RPC error during ${context}`,\n ['Check the MCP server logs for more details']\n );\n }\n }\n}\n","import { ILogger, IToolDefinition, ToolContext } from '../types/index.js';\nimport { MCPServerConfig, MCPToolDefinition } from '../types/mcp.js';\nimport { LemuraMCPConnectionError } from '../types/errors.js';\nimport { MCPClient } from './MCPClient.js';\n\n/**\n * Manages the full lifecycle of multiple MCP server connections and routes\n * tool calls to the correct server.\n *\n * Typical usage is handled automatically by `SessionManager` when `mcpServers`\n * is set in `SessionConfig`. You can also use it standalone for advanced scenarios.\n *\n * @example\n * const registry = new MCPClientRegistry(logger);\n * await registry.register('github', { transport: 'stdio', command: 'npx', args: ['...'] });\n * const tools = await registry.discoverTools(); // IToolDefinition[] ready for ToolRegistry\n */\nexport class MCPClientRegistry {\n private readonly clients: Map<string, MCPClient> = new Map();\n /** toolName → serverName */\n private readonly toolRouter: Map<string, string> = new Map();\n private readonly logger: ILogger;\n\n constructor(logger: ILogger) {\n this.logger = logger;\n }\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n /**\n * Creates an `MCPClient` for the given config, connects to the server, and\n * registers the server by name.\n *\n * @throws {LemuraMCPConnectionError} if connection / initialization fails\n */\n async register(name: string, config: MCPServerConfig): Promise<void> {\n if (this.clients.has(name)) {\n this.logger.warn(`[MCPClientRegistry] Server '${name}' is already registered — skipping`);\n return;\n }\n\n const client = new MCPClient(name, config, this.logger);\n try {\n await client.connect();\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n throw new LemuraMCPConnectionError(\n `[MCPClientRegistry] Failed to connect to server '${name}': ${msg}`,\n `Could not establish connection to MCP server '${name}'`,\n [\n `Verify the server is reachable and the transport config is correct`,\n `Check the 'command', 'args', or 'url' for server '${name}'`\n ]\n );\n }\n\n this.clients.set(name, client);\n this.logger.info(`[MCPClientRegistry] Server '${name}' registered (${client.tools.length} tools)`);\n }\n\n // ---------------------------------------------------------------------------\n // Tool discovery\n // ---------------------------------------------------------------------------\n\n /**\n * Collects tools from all connected MCP servers and returns them as\n * `IToolDefinition` adapters ready to be registered in `ToolRegistry`.\n *\n * Tool names are **not** namespaced — if two servers expose a tool with the\n * same name, the last-registered server wins and a warning is emitted.\n */\n async discoverTools(): Promise<IToolDefinition[]> {\n const bridged: IToolDefinition[] = [];\n\n for (const [serverName, client] of this.clients) {\n for (const mcpTool of client.tools) {\n if (this.toolRouter.has(mcpTool.name)) {\n this.logger.warn(\n `[MCPClientRegistry] Tool '${mcpTool.name}' is already provided by '${this.toolRouter.get(mcpTool.name)}'; ` +\n `overriding with server '${serverName}'`\n );\n }\n this.toolRouter.set(mcpTool.name, serverName);\n bridged.push(this._bridge(mcpTool, serverName));\n }\n }\n\n this.logger.debug(`[MCPClientRegistry] Discovered ${bridged.length} total MCP tool(s)`);\n return bridged;\n }\n\n // ---------------------------------------------------------------------------\n // Routing\n // ---------------------------------------------------------------------------\n\n /**\n * Calls a tool on the correct MCP server.\n *\n * @param toolName - The tool name as registered via `discoverTools()`\n * @param args - Parsed arguments object\n * @throws {LemuraMCPConnectionError} if no server is registered for `toolName`\n */\n async callTool(toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const serverName = this.toolRouter.get(toolName);\n if (!serverName) {\n throw new LemuraMCPConnectionError(\n `[MCPClientRegistry] No MCP server found for tool '${toolName}'`,\n `Tool '${toolName}' was not discovered from any connected MCP server`,\n ['Verify the MCP server that provides this tool is configured and connected']\n );\n }\n\n const client = this.clients.get(serverName)!;\n return client.callTool(toolName, args);\n }\n\n // ---------------------------------------------------------------------------\n // Lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Disconnects all registered MCP servers gracefully.\n * Called automatically by `SessionManager.close()`.\n */\n async disconnectAll(): Promise<void> {\n const names = Array.from(this.clients.keys());\n this.logger.debug(`[MCPClientRegistry] Disconnecting ${names.length} MCP server(s)...`);\n\n await Promise.allSettled(\n names.map(async (name) => {\n try {\n await this.clients.get(name)!.disconnect();\n this.logger.debug(`[MCPClientRegistry] '${name}' disconnected`);\n } catch (err: unknown) {\n this.logger.warn(\n `[MCPClientRegistry] Error disconnecting '${name}': ${(err as Error).message}`\n );\n }\n })\n );\n\n this.clients.clear();\n this.toolRouter.clear();\n }\n\n /** Returns the names of all currently registered servers */\n getRegisteredServers(): string[] {\n return Array.from(this.clients.keys());\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Bridges an `MCPToolDefinition` from the protocol into an `IToolDefinition`\n * that the existing `ToolRegistry` can execute.\n */\n private _bridge(mcpTool: MCPToolDefinition, serverName: string): IToolDefinition {\n const self = this;\n return {\n name: mcpTool.name,\n description: `[MCP:${serverName}] ${mcpTool.description}`,\n parameters: mcpTool.inputSchema ?? { type: 'object', properties: {} },\n async execute(params: unknown, _context: ToolContext): Promise<unknown> {\n return self.callTool(mcpTool.name, (params ?? {}) as Record<string, unknown>);\n }\n };\n }\n}\n","import {\n SessionConfig,\n ContextWindow,\n IProviderAdapter,\n ContentBlock,\n Turn,\n ILogger,\n IToolDefinition,\n NormalizedMessage,\n ToolCall,\n TraceEvent,\n GoalVerifierResult\n} from '../types/index.js';\nimport { ContextManager } from '../context/ContextManager.js';\nimport { ToolRegistry } from '../tools/ToolRegistry.js';\nimport { SkillInjector } from '../skills/SkillInjector.js';\nimport { LemuraMaxIterationsError, LemuraToolTimeoutError } from '../types/index.js';\nimport { DefaultLogger } from '../logger/DefaultLogger.js';\nimport {\n readChunkTool,\n searchChunkTool,\n listChunksTool,\n updateChunkTool,\n readScratchpadTool,\n writeScratchpadTool,\n removeScratchpadTool,\n summarizeSandwichTool\n} from '../tools/builtin/short_term_memory.js';\nimport { createMediaTools } from '../tools/builtin/media.js';\nimport { MediaBridge } from '../media/MediaBridge.js';\nimport { evaluateToolFirewall } from '../tools/ToolFirewall.js';\nimport { StepCounter } from './execution/StepCounter.js';\nimport { FinalResponseFormatter } from './execution/FinalResponseFormatter.js';\nimport { ToolResponseProcessor } from './execution/ToolResponseProcessor.js';\nimport { Goal, GoalInjector } from './execution/GoalInjector.js';\nimport { ContinuationPlanner, ContinuationPlan, ContinuationStep } from './execution/ContinuationPlanner.js';\nimport { MCPClientRegistry } from '../mcp/MCPClientRegistry.js';\n\n/**\n * Core entry point for lemura agent sessions.\n *\n * `SessionManager` owns the full ReAct loop lifecycle:\n * - Context window management and compression\n * - Skill injection (with optional token budget)\n * - Tool firewall + schema validation + timeout enforcement\n * - Parallel tool execution (opt-in via `parallelToolCalls`)\n * - maxSteps guard → forced graceful conclusion\n * - Tool response compression (via `ToolResponseProcessor`)\n * - Goal injection + mini-planning step (via `enableGoalPlanning`)\n * - Continuation planning with dependency tracking (via `enableContinuationPlanning`)\n * - Streaming output (`stream()`)\n * - Session lifecycle: `reset()`, `close()`\n *\n * @example\n * ```typescript\n * const session = new SessionManager({ adapter, model: 'gpt-4o', maxTokens: 16_000 });\n * const answer = await session.run('What is the capital of France?');\n * ```\n */\nexport class SessionManager {\n private contextManager: ContextManager;\n private toolRegistry: ToolRegistry;\n private skillInjector: SkillInjector;\n private context: ContextWindow;\n private adapter: IProviderAdapter;\n private config: SessionConfig;\n private iterations: number = 0;\n private logger: ILogger;\n private media: MediaBridge;\n private sessionId: string;\n private scratchpadLoaded: boolean = false;\n private pendingScratchpadClear: boolean = false;\n\n // Advanced execution state\n private stepCounter: StepCounter;\n private toolResponseProcessor: ToolResponseProcessor;\n private goalInjector: GoalInjector | null = null;\n private continuationPlanner: ContinuationPlanner | null = null;\n /** Frozen goal/plan injection text keyed by turn index — used when staticSystemPrompt is on */\n private _turnInjections: Map<number, string> = new Map();\n\n // MCP\n private mcpRegistry: MCPClientRegistry | null = null;\n /** Resolves when all MCP servers are connected; awaited by run() and stream() */\n private mcpReady: Promise<void> | null = null;\n\n // Tool execution budget tracking\n private totalToolCallCount: number = 0;\n private perToolCallCount: Map<string, number> = new Map();\n private totalTokens: number = 0;\n\n constructor(config: SessionConfig) {\n this.config = config;\n this.adapter = config.adapter;\n this.logger = config.logger || new DefaultLogger();\n this.sessionId = config.sessionId || 'default';\n this.contextManager = new ContextManager();\n this.toolRegistry = new ToolRegistry(config.tools || [], {\n defaultTimeoutMs: config.toolRegistryTimeoutMs ?? 30_000\n });\n this.skillInjector = new SkillInjector(config.skills || []);\n\n // Apply dynamic skill selectors from config\n if (config.activeDynamicSkills && config.activeDynamicSkills.length > 0) {\n for (const name of config.activeDynamicSkills) {\n this.skillInjector.enableSkill(name);\n }\n }\n if (config.activeDynamicTags && config.activeDynamicTags.length > 0) {\n this.skillInjector.enableByTags(config.activeDynamicTags);\n }\n\n this.media = new MediaBridge(this.adapter);\n\n // maxSteps guard (default 20)\n this.stepCounter = new StepCounter(config.maxSteps ?? 20);\n\n // Warn when maxSteps is explicitly set but maxIterations is not —\n // the default maxIterations=10 will stop the loop before maxSteps is reached\n // if the agent averages more than 1 tool call per iteration.\n if (config.maxSteps !== undefined && config.maxIterations === undefined) {\n const defaultMaxIts = 10;\n if (config.maxSteps > defaultMaxIts) {\n this.logger.warn(\n `[Config] maxSteps=${config.maxSteps} is set but maxIterations is not. ` +\n `The default maxIterations=${defaultMaxIts} may stop the agent before maxSteps is reached. ` +\n `Consider setting maxIterations to at least Math.ceil(maxSteps / avgToolCallsPerTurn).`\n );\n }\n }\n\n // Warn when maxSteps is unreachably large compared to maxIterations\n if (config.maxSteps !== undefined && config.maxIterations !== undefined) {\n if (config.maxSteps > config.maxIterations * 10) {\n this.logger.warn(\n `[Config] maxSteps (${config.maxSteps}) is much larger than maxIterations (${config.maxIterations}). ` +\n `The agent will be stopped by maxIterations before maxSteps is ever reached.`\n );\n }\n }\n\n // Tool response processor — accept custom instance or build from config\n this.toolResponseProcessor = (config.toolResponseProcessor instanceof ToolResponseProcessor\n ? config.toolResponseProcessor\n : config.toolResponseProcessor\n ? config.toolResponseProcessor as unknown as ToolResponseProcessor\n : new ToolResponseProcessor()) as ToolResponseProcessor;\n\n for (const strategy of config.compressionStrategies || []) {\n this.contextManager.registerStrategy(strategy);\n }\n\n // Register STM and Scratchpad tools if registry is provided\n if (config.stmRegistry) {\n this.toolRegistry.register(readChunkTool);\n this.toolRegistry.register(searchChunkTool);\n this.toolRegistry.register(listChunksTool);\n this.toolRegistry.register(updateChunkTool);\n this.toolRegistry.register(readScratchpadTool);\n this.toolRegistry.register(writeScratchpadTool);\n this.toolRegistry.register(removeScratchpadTool);\n this.toolRegistry.register(summarizeSandwichTool);\n }\n\n if (config.media?.enableTools) {\n const prefix = config.media.toolPrefix || 'media_';\n for (const tool of createMediaTools(prefix)) {\n this.toolRegistry.register(tool);\n }\n }\n\n this.context = {\n systemPrompt: config.systemPrompt || '',\n scratchpad: '',\n turns: [],\n tokenCount: 0,\n maxTokens: config.maxTokens,\n metadata: {}\n };\n\n // MCP server setup (non-blocking — tools are registered before first run())\n if (config.mcpServers && config.mcpServers.length > 0) {\n this.mcpRegistry = new MCPClientRegistry(this.logger);\n this.mcpReady = this._initMCP(config.mcpServers);\n }\n\n // Emit initial system trace\n const activeSkills = this.skillInjector.getActiveSkills();\n this.emitTrace('system', 'session_init', {\n config: {\n model: this.config.model,\n maxIterations: this.config.maxIterations,\n maxSteps: this.config.maxSteps,\n parallelToolCalls: this.config.parallelToolCalls,\n enableGoalPlanning: this.config.enableGoalPlanning,\n enableContinuationPlanning: this.config.enableContinuationPlanning\n },\n skills: {\n total: (config.skills || []).length,\n active: activeSkills.length,\n fixed: activeSkills.filter(s => s.strategy !== 'dynamic').length,\n dynamic: activeSkills.filter(s => s.strategy === 'dynamic').length,\n }\n });\n\n // Emit per-skill load traces\n for (const skill of activeSkills) {\n this.emitTrace('skill', 'skill_load', {\n name: skill.name,\n version: skill.version,\n strategy: skill.strategy ?? 'fixed',\n inject: skill.inject,\n priority: skill.priority,\n tags: skill.tags ?? [],\n requiredTools: skill.requiredTools ?? [],\n });\n }\n }\n\n // -----------------------------------------------------------------------\n // Trace helper\n // -----------------------------------------------------------------------\n\n private emitTrace(\n type: TraceEvent['type'],\n name: string,\n metadata?: Record<string, any>,\n input?: any,\n output?: any,\n status: 'running' | 'done' | 'error' = 'done'\n ) {\n if (this.config.onTrace) {\n this.config.onTrace({\n type,\n name,\n metadata: metadata || {},\n input,\n output,\n status,\n startedAt: Date.now()\n });\n }\n }\n\n private async ensureScratchpadLoaded(): Promise<void> {\n if (!this.config.scratchpadAdapter) return;\n if (this.pendingScratchpadClear) {\n await this.config.scratchpadAdapter.clear(this.sessionId);\n this.context.scratchpad = '';\n this.pendingScratchpadClear = false;\n this.scratchpadLoaded = true;\n return;\n }\n if (this.scratchpadLoaded) return;\n const stored = await this.config.scratchpadAdapter.read(this.sessionId);\n this.context.scratchpad = stored ?? '';\n this.scratchpadLoaded = true;\n }\n\n // -----------------------------------------------------------------------\n // Public accessors\n // -----------------------------------------------------------------------\n\n /** Returns a shallow copy of the current context window. */\n getContext(): ContextWindow {\n return { ...this.context };\n }\n\n /** Returns the current conversation history. */\n getHistory() {\n return [...this.context.turns];\n }\n\n /**\n * Populates the session context with a pre-existing conversation history.\n *\n * Turns are assigned sequential `turnIndex` values starting from 0 and the\n * context `tokenCount` is recalculated automatically. Call this immediately\n * after construction and before the first `run()` / `stream()`.\n *\n * @param history - Raw history entries (role + content, optional toolCalls/toolResults).\n *\n * @example\n * ```typescript\n * const session = new SessionManager(config);\n * session.loadHistory(savedMessages);\n * const answer = await session.run('Continue where we left off.');\n * ```\n */\n loadHistory(history: Array<{\n role: Turn['role'];\n content: Turn['content'];\n toolCalls?: Turn['toolCalls'];\n toolResults?: Turn['toolResults'];\n }>): void {\n this.context.turns = history.map((m, i) => ({\n role: m.role,\n content: m.content ?? '',\n tokenCount: this.adapter.estimateTokens(\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content)\n ),\n turnIndex: i,\n compressed: false,\n ...(m.toolCalls ? { toolCalls: m.toolCalls } : {}),\n ...(m.toolResults ? { toolResults: m.toolResults } : {}),\n }));\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.emitTrace('system', 'history_loaded', { turnCount: this.context.turns.length });\n }\n\n /** Returns the `MediaBridge` for direct ASR / TTS / Vision / Image-gen calls. */\n getMedia() {\n return this.media;\n }\n\n /**\n * Returns the `ToolRegistry` for runtime tool management.\n *\n * Use this to register or unregister tools after session construction:\n *\n * ```typescript\n * // Add a tool after the user authenticates\n * session.tools.register(paymentTool);\n *\n * // Remove a tool when no longer needed\n * session.tools.unregister('send_payment');\n *\n * // Inspect what's registered\n * const active = session.tools.getAll();\n * console.log(active.map(t => t.name));\n * ```\n *\n * @since 1.4.0\n */\n get tools(): ToolRegistry {\n return this.toolRegistry;\n }\n\n /**\n * Returns the `SkillInjector` for runtime skill management.\n *\n * Use this to enable or disable dynamic skills after session construction:\n *\n * ```typescript\n * session.skills.enableSkill('code-review');\n * session.skills.enableByTags(['debugging']);\n * session.skills.disableSkill('verbose-mode');\n * const requiredTools = session.skills.getRequiredTools();\n * ```\n *\n * @since 1.4.0\n */\n get skills(): SkillInjector {\n return this.skillInjector;\n }\n\n // -----------------------------------------------------------------------\n // Continuation planning API\n // -----------------------------------------------------------------------\n\n /**\n * Sets an explicit multi-step continuation plan that will be tracked and\n * injected as a status block before each ReAct iteration.\n *\n * Dependency tracking, condition evaluation, `outputKey` storage, and\n * `inputMapping` resolution are all handled automatically by the planner.\n *\n * @param steps - The ordered list of continuation steps.\n * @param strategy - Execution strategy ('sequential' | 'parallel' | 'conditional'). Default: 'sequential'.\n *\n * @example\n * ```typescript\n * await session.setPlan([\n * { stepId: 'fetch', toolName: 'fetch_data', description: 'Get data', dependsOn: [], outputKey: 'rawData' },\n * { stepId: 'analyze', toolName: 'analyze', description: 'Analyze', dependsOn: ['fetch'], inputMapping: { data: 'rawData' } },\n * ]);\n * const result = await session.run('Run the data pipeline.');\n * ```\n */\n setPlan(\n steps: ContinuationStep[],\n strategy: ContinuationPlan['strategy'] = 'sequential'\n ): void {\n this.continuationPlanner = new ContinuationPlanner(\n { steps, currentStepIndex: 0, strategy },\n {\n onStepFailed: (stepId, reason) => this.emitTrace('planning', 'step_failed', { stepId, reason }),\n onStepSkipped: (stepId, reason) => this.emitTrace('planning', 'step_skipped', { stepId, reason }),\n }\n );\n // Store plan in metadata so it survives context compression\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.logger.debug(`[ContinuationPlanner] Plan set with ${steps.length} steps (strategy: ${strategy})`);\n this.emitTrace('planning', 'plan_set', { stepCount: steps.length, strategy });\n }\n\n // -----------------------------------------------------------------------\n // Plan inspection API\n // -----------------------------------------------------------------------\n\n /**\n * Returns a snapshot of the current continuation plan, or `null` if no plan\n * has been set via `setPlan()`.\n *\n * Use this after `run()` to inspect which steps completed, failed, or were skipped.\n *\n * @since 1.4.4\n *\n * @example\n * ```typescript\n * await session.run('Run the pipeline');\n * const plan = session.getPlan();\n * const failed = plan?.steps.filter(s => s.status === 'failed');\n * ```\n */\n getPlan(): import('./execution/ContinuationPlanner.js').ContinuationPlan | null {\n return this.continuationPlanner ? this.continuationPlanner.getPlan() : null;\n }\n\n // -----------------------------------------------------------------------\n // Goal planning API\n // -----------------------------------------------------------------------\n\n /**\n * Manually sets the agent's goal, bypassing the automatic mini-planning LLM call.\n *\n * Use this when you already know the goal structure upfront.\n *\n * @example\n * ```typescript\n * await session.setGoal({\n * statement: 'Audit the authentication module',\n * decomposition: ['Read src/auth/', 'Identify SQL injection risks', 'Write report'],\n * successCriteria: ['Report covers all audit areas', 'Each finding has a severity rating'],\n * });\n * const result = await session.run('Begin the security audit.');\n * ```\n */\n setGoal(goal: Omit<Goal, 'id' | 'injectionFrequency' | 'injectionPosition'>): void {\n this.goalInjector = new GoalInjector({\n id: 'manual',\n statement: goal.statement,\n decomposition: goal.decomposition ?? [],\n successCriteria: goal.successCriteria ?? [],\n injectionFrequency: this.config.goalInjectionFrequency ?? 'always',\n injectionPosition: this.config.goalInjectionPosition ?? 'system_prompt',\n completedSubGoals: goal.completedSubGoals ?? [],\n });\n // Store in context metadata so it persists across compression\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n this.logger.debug('[GoalInjector] Goal set manually');\n this.emitTrace('planning', 'goal_set_manual', {\n statement: goal.statement,\n subGoals: goal.decomposition?.length ?? 0\n });\n }\n\n // -----------------------------------------------------------------------\n // MCP initialisation\n // -----------------------------------------------------------------------\n\n /**\n * Connects all configured MCP servers and registers their bridged tools.\n * Called from the constructor as a fire-and-start async task; `run()` and\n * `stream()` await `this.mcpReady` before executing.\n */\n private async _initMCP(\n mcpServers: NonNullable<import('../types/agent.js').SessionConfig['mcpServers']>\n ): Promise<void> {\n if (!this.mcpRegistry) return;\n\n this.emitTrace('system', 'mcp_init_start', { serverCount: mcpServers.length });\n this.logger.info(`[MCP] Connecting to ${mcpServers.length} server(s)...`);\n\n for (const serverConfig of mcpServers) {\n try {\n await this.mcpRegistry.register(serverConfig.name, serverConfig);\n this.emitTrace('system', 'mcp_server_connected', { server: serverConfig.name });\n } catch (err: unknown) {\n const msg = (err as Error).message ?? String(err);\n this.logger.error(`[MCP] Failed to connect '${serverConfig.name}': ${msg}`);\n this.emitTrace('error', 'mcp_server_failed', { server: serverConfig.name, error: msg });\n // Non-fatal: continue connecting remaining servers\n }\n }\n\n // Discover and register bridged tools into the shared ToolRegistry\n const bridgedTools = await this.mcpRegistry.discoverTools();\n for (const tool of bridgedTools) {\n try {\n this.toolRegistry.register(tool);\n } catch {\n // Already registered (name collision with native tool) — skip\n this.logger.warn(`[MCP] Tool '${tool.name}' conflicts with an existing tool — skipping`);\n }\n }\n\n this.logger.info(`[MCP] ${bridgedTools.length} MCP tool(s) registered`);\n this.emitTrace('system', 'mcp_init_done', {\n servers: this.mcpRegistry.getRegisteredServers(),\n toolCount: bridgedTools.length\n });\n }\n\n // -----------------------------------------------------------------------\n // Goal mini-planning step (one extra LLM call, gated by enableGoalPlanning)\n // -----------------------------------------------------------------------\n\n /**\n * Runs a dedicated planning prompt against the LLM to decompose the user's\n * message into sub-goals and success criteria. Called once at the start of\n * the first `run()` when `enableGoalPlanning` is true and no goal has been\n * manually set via `setGoal()`.\n */\n private async _runMiniPlanningStep(userMessage: string): Promise<void> {\n const planningPrompt = `Given this goal: \"${userMessage}\"\n\n1. List the sub-goals needed to achieve this (max 5, be specific)\n2. List success criteria — what does \"done\" look like? (max 3, binary, measurable)\n\nRespond ONLY with valid JSON (no markdown, no explanations):\n{ \"subGoals\": string[], \"successCriteria\": string[] }`;\n\n try {\n const response = await this.adapter.complete({\n model: this.config.model,\n messages: [{ role: 'user', content: planningPrompt }],\n maxTokens: this.config.maxCompletionTokens ?? 4_000,\n });\n\n // Parse JSON — strip code fences first, then fall back to regex extraction\n // in case the model wraps the object in prose\n const stripped = response.content.replace(/```json|```/g, '').trim();\n const jsonMatch = stripped.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(`No JSON object found in mini-planning response: \"${stripped.slice(0, 200)}\"`);\n }\n const parsed = JSON.parse(jsonMatch[0]) as { subGoals?: string[]; successCriteria?: string[] };\n\n if (this.goalInjector && Array.isArray(parsed.subGoals)) {\n this.goalInjector.updateDecomposition(\n parsed.subGoals,\n Array.isArray(parsed.successCriteria) ? parsed.successCriteria : undefined\n );\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n this.emitTrace('planning', 'mini_plan_done', {\n subGoals: parsed.subGoals,\n successCriteria: parsed.successCriteria\n });\n this.logger.debug(`[GoalInjector] Mini-plan: ${parsed.subGoals.length} sub-goals`);\n }\n } catch (err: unknown) {\n // Non-fatal: continue without decomposition\n this.logger.warn(`[GoalInjector] Mini-planning step failed: ${(err as Error).message ?? String(err)}`);\n }\n }\n\n /**\n * Reconciles sub-goal completion against the recent conversation so the\n * re-injected goal block reflects real progress (anti-drift). Runs only when\n * `goalProgressReconciliation` is enabled, and is a no-op when there are no\n * pending sub-goals. One small, non-fatal LLM call; failures are swallowed.\n *\n * @since 1.5.4\n */\n private async _reconcileSubGoals(): Promise<void> {\n if (!this.config.goalProgressReconciliation) return;\n if (!this.goalInjector) return;\n\n const goal = this.goalInjector.getGoal();\n const completed = new Set(goal.completedSubGoals ?? []);\n const pending = (goal.decomposition ?? []).filter(sg => !completed.has(sg));\n if (pending.length === 0) return;\n\n const recentTurns = this.context.turns.slice(-6).map(t => {\n const text = typeof t.content === 'string' ? t.content : JSON.stringify(t.content);\n return `[${t.role}]: ${text.slice(0, 400)}`;\n }).join('\\n\\n');\n const pendingList = pending.map((sg, i) => `${i + 1}. ${sg}`).join('\\n');\n\n try {\n const response = await this.adapter.complete({\n model: this.config.model,\n temperature: 0,\n maxTokens: 256,\n messages: [\n {\n role: 'system',\n content: 'You track sub-goal progress. Given pending sub-goals and the recent conversation, return ONLY the 1-based indices of sub-goals that are now fully completed. Respond with valid JSON only, no prose: {\"completed\": number[]}'\n },\n {\n role: 'user',\n content: `Pending sub-goals:\\n${pendingList}\\n\\nRecent conversation:\\n${recentTurns}\\n\\nWhich pending sub-goals are now fully completed?`\n }\n ]\n });\n const match = response.content.match(/\\{[\\s\\S]*\\}/);\n if (!match) return;\n const parsed = JSON.parse(match[0]) as { completed?: number[] };\n if (!Array.isArray(parsed.completed)) return;\n for (const idx of parsed.completed) {\n const sg = pending[idx - 1];\n if (sg) {\n this.goalInjector.markSubGoalDone(sg);\n this.emitTrace('planning', 'subgoal_done', { subGoal: sg });\n }\n }\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n } catch (err: unknown) {\n this.logger.warn(`[GoalInjector] Sub-goal reconciliation failed (non-fatal): ${(err as Error).message ?? String(err)}`);\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n /** Builds the system prompt, injecting skills and goal if configured. */\n private buildSystemPrompt(userMessage?: string, iteration: number = 0): string {\n let prompt = this.context.systemPrompt || '';\n\n // When staticSystemPrompt is enabled the system prompt must never vary between\n // iterations — this keeps the KV-cache prefix 100% stable and avoids costly\n // re-computation on every turn. Continuation plan status is therefore injected\n // into the *last user message* by buildMessages instead.\n const isStatic = this.config.staticSystemPrompt === true;\n\n // Inject goal into system prompt (when position === 'system_prompt')\n if (!isStatic && this.goalInjector && this.config.goalInjectionPosition !== 'pre_turn') {\n const shouldInject = this.goalInjector.shouldInjectThisTurn(\n iteration,\n false,\n this.config.goalInjectionN ?? 3\n );\n if (shouldInject) {\n prompt = this.goalInjector.injectInto(prompt);\n this.emitTrace('planning', 'goal_injected', {\n position: 'system_prompt',\n iteration\n });\n }\n }\n\n // Inject continuation plan status block (skipped when staticSystemPrompt is on)\n if (!isStatic && this.continuationPlanner && this.config.enableContinuationPlanning) {\n const planStatus = this.continuationPlanner.getPlanStatusString();\n prompt += `\\n\\n${planStatus}`;\n }\n\n const injectedSkills = this.skillInjector.buildInjectionBlock(\n 'system_prompt',\n this.config.skillTokenBudget\n );\n if (injectedSkills) {\n prompt += '\\n\\n' + injectedSkills;\n }\n\n return prompt.trim();\n }\n\n /** Builds the messages array for the provider from the current context. */\n private buildMessages(systemPrompt: string, iteration: number = 0): NormalizedMessage[] {\n const messages: NormalizedMessage[] = this.context.turns.map(t => ({\n role: t.role,\n content: t.content,\n ...(t.role === 'tool' && t.toolResults?.[0] ? { name: t.toolResults[0].toolCallId } : {}),\n ...(t.role === 'assistant' && t.toolCalls ? { toolCalls: t.toolCalls } : {})\n })) as NormalizedMessage[];\n\n if (systemPrompt) {\n messages.unshift({ role: 'system', content: systemPrompt });\n }\n\n // pre_turn goal injection — injects as a system message just before the last user turn\n if (!this.config.staticSystemPrompt && this.goalInjector && this.config.goalInjectionPosition === 'pre_turn') {\n const shouldInject = this.goalInjector.shouldInjectThisTurn(\n iteration,\n false,\n this.config.goalInjectionN ?? 3\n );\n if (shouldInject) {\n const goalBlock = this.goalInjector.getFormattedBlock();\n messages.push({ role: 'system', content: goalBlock });\n this.emitTrace('planning', 'goal_injected', { position: 'pre_turn', iteration });\n }\n }\n\n // KV-cache frozen turn injections — only active when staticSystemPrompt is on.\n // Dynamic content (goal state, continuation plan) is appended exclusively to the\n // *latest* user/tool message so older turns are never mutated between iterations,\n // keeping their token prefix identical and allowing the provider to reuse cached KV.\n if (this.config.staticSystemPrompt) {\n const totalTurns = this.context.turns.length;\n for (let i = 0; i < totalTurns; i++) {\n const msgIndex = i + 1; // messages[0] is the system prompt\n if (msgIndex >= messages.length) continue;\n const msg = messages[msgIndex]!;\n if (msg.role !== 'user' && msg.role !== 'tool') continue;\n\n let injectionBlock: string;\n\n if (i === totalTurns - 1) {\n // Latest turn — generate fresh dynamic content\n const blocks: string[] = [];\n if (this.goalInjector) {\n const shouldInject = this.goalInjector.shouldInjectThisTurn(\n iteration, false, this.config.goalInjectionN ?? 3\n );\n if (shouldInject) blocks.push(this.goalInjector.getFormattedBlock());\n }\n if (this.continuationPlanner && this.config.enableContinuationPlanning) {\n blocks.push(this.continuationPlanner.getPlanStatusString());\n }\n injectionBlock = blocks.length > 0\n ? `\\n\\n<lemura:agent-state>\\n${blocks.join('\\n\\n')}\\n</lemura:agent-state>`\n : '';\n this._turnInjections.set(i, injectionBlock);\n if (injectionBlock) {\n this.emitTrace('planning', 'goal_injected', { position: 'frozen_turn', turnIndex: i, iteration });\n }\n } else {\n // Past turn — replay the frozen block so token prefix never changes\n injectionBlock = this._turnInjections.get(i) ?? '';\n }\n\n if (!injectionBlock) continue;\n\n // Shallow-copy the message to avoid mutating context turns\n if (Array.isArray(msg.content)) {\n messages[msgIndex] = {\n ...msg,\n content: msg.content.map(item =>\n (item as { type?: string; text?: string }).type === 'text'\n ? { ...(item as object), text: (item as { text: string }).text + injectionBlock }\n : item\n )\n } as NormalizedMessage;\n } else {\n messages[msgIndex] = { ...msg, content: ((msg.content as string) ?? '') + injectionBlock } as NormalizedMessage;\n }\n }\n }\n\n return messages;\n }\n\n /** Checks the tool execution budget and throws descriptively if exceeded. */\n private checkExecutionBudget(toolName: string): void {\n const budget = this.config.toolExecutionBudget;\n if (!budget) return;\n\n if (budget.maxCallsPerSession !== undefined && this.totalToolCallCount >= budget.maxCallsPerSession) {\n const err = new LemuraMaxIterationsError(\n `Tool execution budget exceeded: session limit of ${budget.maxCallsPerSession} tool calls reached`\n );\n this.logger.warn(err.message);\n throw err;\n }\n\n if (budget.maxCallsPerTool?.[toolName] !== undefined) {\n const current = this.perToolCallCount.get(toolName) ?? 0;\n if (current >= (budget.maxCallsPerTool[toolName] ?? Infinity)) {\n const err = new LemuraMaxIterationsError(\n `Tool execution budget exceeded: '${toolName}' has reached its per-tool limit of ${budget.maxCallsPerTool[toolName]}`\n );\n this.logger.warn(err.message);\n this.emitTrace('budget', 'tool_limit_exceeded', {\n toolName,\n limit: budget.maxCallsPerTool[toolName],\n totalTokens: this.totalTokens\n });\n throw err;\n }\n }\n\n this.emitTrace('budget', 'check_passed', {\n toolName,\n totalCalls: this.totalToolCallCount,\n totalTokens: this.totalTokens,\n tokenBudgetRemaining: this.config.maxTokens - this.totalTokens\n });\n }\n\n /** Records a tool call in budget counters. */\n private recordToolCall(toolName: string): void {\n this.totalToolCallCount++;\n this.perToolCallCount.set(toolName, (this.perToolCallCount.get(toolName) ?? 0) + 1);\n }\n\n // -----------------------------------------------------------------------\n // Blob detection helpers\n // -----------------------------------------------------------------------\n\n private isProbablyBase64(value: string): boolean {\n const v = value.trim();\n if (v.startsWith('data:') && v.includes(';base64,')) return true;\n if (v.length < 4096) return false;\n if (/[^A-Za-z0-9+/=]/.test(v)) return false;\n return true;\n }\n\n private isBinaryLike(value: unknown): boolean {\n if (!value) return false;\n if (typeof ArrayBuffer !== 'undefined') {\n if (value instanceof ArrayBuffer) return true;\n if (ArrayBuffer.isView(value)) return true;\n }\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) return true;\n return false;\n }\n\n private async storeBlob(content: any, metadata: Record<string, unknown>): Promise<string | null> {\n if (!this.config.stmRegistry) return null;\n return this.config.stmRegistry.register(content, 'blob', metadata);\n }\n\n private async scrubBlobFields(\n value: any,\n toolName: string,\n depth: number = 0\n ): Promise<{ value: any; changed: boolean }> {\n if (!value || typeof value !== 'object') return { value, changed: false };\n if (depth > 2) return { value, changed: false };\n\n if (Array.isArray(value)) {\n let changed = false;\n const out = [];\n for (const item of value) {\n const res = await this.scrubBlobFields(item, toolName, depth + 1);\n out.push(res.value);\n if (res.changed) changed = true;\n }\n return { value: out, changed };\n }\n\n const obj: Record<string, any> = { ...value };\n let changed = false;\n for (const [key, v] of Object.entries(obj)) {\n if (typeof v === 'string' && this.isProbablyBase64(v)) {\n const ref = await this.storeBlob(v, {\n toolName,\n key,\n encoding: v.startsWith('data:') ? 'data_url' : 'base64'\n });\n if (ref) {\n obj[key] = ref;\n obj[`${key}Note`] = 'Stored in STM';\n changed = true;\n }\n continue;\n }\n\n if (this.isBinaryLike(v)) {\n const ref = await this.storeBlob(v, { toolName, key });\n if (ref) {\n obj[key] = ref;\n obj[`${key}Note`] = 'Stored in STM';\n changed = true;\n }\n continue;\n }\n\n if (typeof v === 'object' && v !== null) {\n const nested = await this.scrubBlobFields(v, toolName, depth + 1);\n obj[key] = nested.value;\n if (nested.changed) changed = true;\n }\n }\n\n return { value: obj, changed };\n }\n\n /**\n * Processes a firewall decision for a tool call.\n * Returns true to proceed, false to block.\n */\n private async passesFirewall(\n toolName: string,\n argsJson: string,\n toolCallId: string,\n toolResults: Array<{ toolCallId: string; content: string }>\n ): Promise<boolean> {\n const firewall = evaluateToolFirewall(\n this.config.toolFirewall,\n toolName,\n argsJson,\n this.logger\n );\n\n if (firewall.decision === 'deny') {\n this.logger.warn(`Tool blocked by firewall: ${toolName}`, { reason: firewall.reason });\n toolResults.push({ toolCallId, content: `Blocked by tool firewall: ${firewall.reason}` });\n return false;\n }\n\n if (firewall.decision === 'ask') {\n if (this.config.toolFirewall?.onAsk) {\n // Fail-safe: only an explicit accept signal ('accept' or true) allows\n // execution. Any other value — 'deny', false, undefined, void, or a\n // thrown error — blocks the tool. This guarantees a user's \"deny\"/Stop\n // can never fall through to executing the tool anyway.\n let accepted = false;\n try {\n const userDecision = await this.config.toolFirewall.onAsk(toolName, argsJson);\n accepted = userDecision === 'accept' || userDecision === true;\n } catch (e: unknown) {\n this.logger.warn(`Tool firewall onAsk handler threw — treating as deny: ${toolName}`, {\n error: e instanceof Error ? e.message : String(e)\n });\n accepted = false;\n }\n if (!accepted) {\n this.logger.warn(`Tool blocked by firewall (ask → deny): ${toolName}`, { reason: firewall.reason });\n toolResults.push({ toolCallId, content: `Blocked by tool firewall: ${firewall.reason}` });\n return false;\n }\n // accepted falls through\n } else {\n this.logger.warn(`Tool blocked by firewall (ask without handler): ${toolName}`, { reason: firewall.reason });\n toolResults.push({ toolCallId, content: `Blocked by tool firewall: ${firewall.reason}` });\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Executes a single parsed tool call and returns the serialised result string.\n * Also handles continuation plan tracking (step status + output storage).\n */\n private async executeSingleToolCall(\n tc: { id: string; name: string; arguments: string }\n ): Promise<string> {\n // Budget check\n this.checkExecutionBudget(tc.name);\n\n let args: Record<string, unknown> = JSON.parse(tc.arguments);\n\n // Continuation planner: resolve inputMapping if a matching step exists\n if (this.continuationPlanner) {\n const plan = this.continuationPlanner.getPlan();\n const matchingStep = plan.steps.find(\n s => s.toolName === tc.name && s.status === 'pending'\n );\n if (matchingStep) {\n this.continuationPlanner.markStepRunning(matchingStep.stepId);\n args = this.continuationPlanner.resolveInputs(matchingStep, args);\n }\n }\n\n const executeContext: Record<string, unknown> = {\n sessionId: this.sessionId,\n turnIndex: this.context.turns.length,\n logger: this.logger,\n adapter: this.adapter,\n stmRegistry: this.config.stmRegistry,\n scratchpad: this.context.scratchpad,\n scratchpadAdapter: this.config.scratchpadAdapter\n };\n if (this.config.ragAdapter) {\n executeContext['ragAdapter'] = this.config.ragAdapter;\n }\n\n this.logger.debug(`Executing tool: ${tc.name}`, { args: JSON.stringify(args) });\n this.emitTrace('tool_call', tc.name, { id: tc.id }, JSON.stringify(args), null, 'running');\n\n let result: unknown;\n let executionError: Error | null = null;\n\n try {\n result = await this.toolRegistry.execute(tc.name, args, executeContext as never);\n } catch (err: unknown) {\n executionError = err as Error;\n // Mark continuation step as failed\n if (this.continuationPlanner) {\n const plan = this.continuationPlanner.getPlan();\n const runningStep = plan.steps.find(\n s => s.toolName === tc.name && s.status === 'running'\n );\n if (runningStep) {\n this.continuationPlanner.markStepFailed(runningStep.stepId);\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n }\n }\n throw executionError;\n }\n\n this.recordToolCall(tc.name);\n this.logger.debug(`Tool ${tc.name} returned successfully`);\n\n // Scratchpad update\n let finalResult = result;\n if (typeof result === 'object' && result !== null) {\n const resObj = result as Record<string, unknown>;\n if (resObj['status'] === 'success' && resObj['newScratchpad'] !== undefined) {\n this.context.scratchpad = resObj['newScratchpad'] as string;\n finalResult = resObj['note'] || 'Scratchpad updated';\n this.emitTrace('planning', 'scratchpad_update', { note: resObj['note'] });\n }\n }\n\n // Blob/binary guard: stash in STM and return refs\n if (this.config.stmRegistry) {\n if (typeof finalResult === 'string' && this.isProbablyBase64(finalResult)) {\n const ref = await this.storeBlob(finalResult, { toolName: tc.name, encoding: 'base64' });\n if (ref) {\n finalResult = { blobRef: ref, note: 'Binary content stored in STM' };\n }\n } else if (this.isBinaryLike(finalResult)) {\n const ref = await this.storeBlob(finalResult, { toolName: tc.name });\n if (ref) {\n finalResult = { blobRef: ref, note: 'Binary content stored in STM' };\n }\n } else if (typeof finalResult === 'object' && finalResult !== null) {\n const scrubbed = await this.scrubBlobFields(finalResult, tc.name);\n if (scrubbed.changed) finalResult = scrubbed.value;\n }\n }\n\n // Serialise + token cap\n let content = JSON.stringify(finalResult);\n const tokenCount = this.adapter.estimateTokens(content);\n if (this.config.maxTokensPerTool && tokenCount > this.config.maxTokensPerTool) {\n content = content.slice(0, this.config.maxTokensPerTool * 4) + '... [TRUNCATED DUE TO TOOL TOKEN LIMIT]';\n }\n\n // Tool response compression\n const toolDef: IToolDefinition = this.toolRegistry.get(tc.name) || {\n name: tc.name,\n description: '',\n parameters: {},\n execute: async () => undefined\n };\n const evaluation = this.toolResponseProcessor.evaluate(content, toolDef, this.context);\n if (evaluation.shouldCompress && !evaluation.errorDetected) {\n content = this.toolResponseProcessor.compress(content, evaluation);\n this.emitTrace('compression', tc.name, { originalSize: evaluation.sizeClass }, null, content);\n }\n\n // Continuation planner: mark step done, store output\n if (this.continuationPlanner) {\n const plan = this.continuationPlanner.getPlan();\n const runningStep = plan.steps.find(\n s => s.toolName === tc.name && s.status === 'running'\n );\n if (runningStep) {\n // Run semantic verifier if provided\n if (runningStep.verify) {\n const maxRetries = runningStep.verify.maxRetries ?? 0;\n const retryCount = this.continuationPlanner.getRetryCount(runningStep.stepId);\n let verdict: import('./execution/ContinuationPlanner.js').StepVerifierResult;\n try {\n verdict = await runningStep.verify.check(content, args);\n } catch (verifyErr: unknown) {\n verdict = { status: 'fail', reason: `Verifier threw: ${(verifyErr as Error).message}` };\n }\n\n if (verdict.status === 'fail' || (verdict.status === 'retry' && retryCount >= maxRetries)) {\n this.continuationPlanner.markStepFailed(runningStep.stepId);\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.emitTrace('planning', 'step_failed', {\n stepId: runningStep.stepId,\n reason: verdict.reason ?? 'verifier returned fail',\n retryCount\n });\n return content;\n }\n\n if (verdict.status === 'retry') {\n this.continuationPlanner.markStepPending(runningStep.stepId);\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.emitTrace('planning', 'step_retry', {\n stepId: runningStep.stepId,\n reason: verdict.reason,\n retryCount: this.continuationPlanner.getRetryCount(runningStep.stepId)\n });\n return content;\n }\n // verdict === 'pass' — fall through to markStepDone\n }\n\n this.continuationPlanner.markStepDone(runningStep.stepId, content);\n // Store in context.metadata['toolOutputs']\n if (runningStep.outputKey) {\n const outputs = (this.context.metadata['toolOutputs'] as Record<string, string>) ?? {};\n outputs[runningStep.outputKey] = content;\n this.context.metadata['toolOutputs'] = outputs;\n }\n this.context.metadata['continuationPlan'] = this.continuationPlanner.getPlan();\n this.emitTrace('planning', 'step_done', {\n stepId: runningStep.stepId,\n outputKey: runningStep.outputKey\n });\n }\n }\n\n if (evaluation.suggestedAction === 'continue' && this.config.enableContinuationPlanning) {\n this.emitTrace('planning', 'continuation_detected', {\n toolName: tc.name,\n action: evaluation.suggestedAction\n });\n }\n\n this.emitTrace('tool_result', tc.name, { id: tc.id }, JSON.stringify(args), content, 'done');\n return content;\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Runs the full ReAct loop for a user message and returns the final assistant response.\n *\n * @param userMessage - The user's message (string or multimodal content blocks)\n * @returns The assistant's final response string\n * @throws {LemuraMaxIterationsError} When the loop exceeds `maxIterations`\n */\n async run(userMessage: string | ContentBlock[]): Promise<string> {\n if (this.mcpReady) await this.mcpReady;\n await this.ensureScratchpadLoaded();\n return this._executeLoop(userMessage, { label: 'run' });\n }\n\n /**\n * Runs the ReAct loop and streams the final assistant response token-by-token.\n *\n * All tool calls, goal verification, and corrections complete before any token\n * is yielded — the stream delivers only the clean final response.\n *\n * @param userMessage - The user's message (string or multimodal content blocks)\n * @returns An `AsyncIterable<string>` of delta tokens from the final response\n *\n * @example\n * ```typescript\n * for await (const token of session.stream('Tell me a story')) {\n * process.stdout.write(token);\n * }\n * ```\n */\n async *stream(userMessage: string | ContentBlock[]): AsyncIterable<string> {\n if (this.mcpReady) await this.mcpReady;\n await this.ensureScratchpadLoaded();\n\n const userMessageStr = Array.isArray(userMessage) ? '[Multimodal Content]' : userMessage;\n this.logger.info(`Starting streaming session run`, { model: this.config.model, message: userMessageStr });\n\n // Goal injector init\n if (this.config.enableGoalPlanning && !this.goalInjector) {\n this.goalInjector = new GoalInjector({\n id: 'auto',\n statement: typeof userMessage === 'string' ? userMessage : '[multimodal]',\n decomposition: [],\n successCriteria: ['The user request is fully answered'],\n injectionFrequency: this.config.goalInjectionFrequency ?? 'always',\n injectionPosition: this.config.goalInjectionPosition ?? 'system_prompt',\n });\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n await this._runMiniPlanningStep(userMessageStr);\n }\n\n this.context.turns.push({\n role: 'user',\n content: userMessage,\n tokenCount: Array.isArray(userMessage) ? userMessage.length * 50 : this.adapter.estimateTokens(userMessage),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n\n const maxIts = this.config.maxIterations || 10;\n this.iterations = 0;\n this.stepCounter = new StepCounter(this.config.maxSteps ?? 20);\n const maxCompletionTokens = this.config.maxCompletionTokens ?? 4_000;\n // Budget for goal-verifier corrections. Each correction re-enters the ReAct\n // loop with full tool access so the model can actually *act* on what is\n // missing (read a file, write output, …) rather than merely re-phrase text.\n let correctionsRemaining = this.config.maxGoalCorrections ?? 1;\n\n while (this.iterations < maxIts) {\n this.iterations++;\n this.logger.debug(`[stream] ReAct Iteration ${this.iterations}/${maxIts}`);\n\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.context = await this.contextManager.prepare(this.context);\n const systemPrompt = this.buildSystemPrompt(userMessageStr, this.iterations);\n const messages = this.buildMessages(systemPrompt, this.iterations);\n\n if (this.stepCounter.isMaxReached()) {\n messages.push({\n role: 'system',\n content: this.stepCounter.getForcedConclusionPrompt() + '\\n\\n' + FinalResponseFormatter.getRequiredStructure()\n });\n }\n\n // Use complete() for tool-call detection on non-final iterations\n let response;\n try {\n response = await this.adapter.complete({\n model: this.config.model,\n messages,\n tools: this.stepCounter.isMaxReached() ? [] : this.toolRegistry.getAll(),\n maxTokens: maxCompletionTokens\n });\n } catch (err: unknown) {\n this.logger.fatal(`Provider call failed: ${(err as Error).message}`);\n throw err;\n }\n\n // Tool calls — execute silently, no yielding\n if (response.finishReason === 'tool_call' && response.toolCalls) {\n this.logger.info(`[stream] Tool calls: ${response.toolCalls.map(tc => tc.name).join(', ')}`);\n this.stepCounter.increment(response.toolCalls.length);\n\n const toolResults: Array<{ toolCallId: string; content: string }> = [];\n for (const tc of response.toolCalls) {\n const ok = await this.passesFirewall(tc.name, tc.arguments, tc.id, toolResults);\n if (!ok) continue;\n try {\n toolResults.push({ toolCallId: tc.id, content: await this.executeSingleToolCall(tc) });\n } catch (e: unknown) {\n toolResults.push({ toolCallId: tc.id, content: `Error: ${e instanceof Error ? e.message : String(e)}` });\n }\n }\n\n const assistantTurn: Turn = {\n role: 'assistant', content: response.content || '',\n tokenCount: this.adapter.estimateTokens(response.content || '') + 50,\n turnIndex: this.context.turns.length, compressed: false, toolCalls: response.toolCalls\n };\n this.context.turns.push(assistantTurn);\n if (this.config.onTurn) this.config.onTurn(assistantTurn);\n\n for (const res of toolResults) {\n const toolTurn: Turn = {\n role: 'tool', content: res.content,\n tokenCount: this.adapter.estimateTokens(res.content),\n turnIndex: this.context.turns.length, compressed: false, toolResults: [res]\n };\n this.context.turns.push(toolTurn);\n if (this.config.onTurn) this.config.onTurn(toolTurn);\n }\n\n if (this.goalInjector) this.goalInjector.incrementTurn();\n // Reconcile sub-goal progress every N tool rounds (anti-drift; opt-in).\n if (this.config.goalProgressReconciliation &&\n this.iterations % (this.config.goalInjectionN ?? 3) === 0) {\n await this._reconcileSubGoals();\n }\n continue;\n }\n\n // Final response — re-prepare context then stream it\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.context = await this.contextManager.prepare(this.context);\n const finalSystemPrompt = this.buildSystemPrompt(userMessageStr, this.iterations);\n const finalMessages = this.buildMessages(finalSystemPrompt, this.iterations);\n\n let accumulated = '';\n let finalTokenCount = 0;\n let finalFinishReason: string | undefined;\n\n for await (const chunk of this.adapter.stream({\n model: this.config.model, messages: finalMessages,\n maxTokens: maxCompletionTokens, stream: true\n })) {\n if (chunk.delta) {\n accumulated += chunk.delta;\n finalTokenCount += Math.ceil(chunk.delta.length / 4);\n yield chunk.delta;\n }\n if (chunk.finished) {\n finalFinishReason = chunk.finishReason;\n if (chunk.usage) this.totalTokens += chunk.usage.totalTokens;\n this.emitTrace('thinking', 'llm_stream_finished', {\n usage: chunk.usage, totalTokens: this.totalTokens, finishReason: chunk.finishReason\n });\n }\n }\n\n const finalTurn: Turn = {\n role: 'assistant', content: accumulated,\n tokenCount: finalTokenCount,\n turnIndex: this.context.turns.length, compressed: false\n };\n this.context.turns.push(finalTurn);\n if (this.config.onTurn) this.config.onTurn(finalTurn);\n\n // Goal verification. Runs after the final response has been yielded.\n // If the goal is incomplete and correction budget remains, we re-enter\n // the ReAct loop with a corrective user turn — this gives the model full\n // tool access and streams the corrected answer, instead of producing an\n // invisible, tool-less one-shot rewrite.\n if (finalFinishReason === 'stop') {\n const verdict = await this._verifyGoal(this.context.turns);\n // Only re-enter the loop if there is still iteration budget — otherwise\n // the corrective turn would trip the maxIterations guard and throw,\n // turning a soft \"incomplete\" into a hard error.\n if (verdict && !verdict.achieved && verdict.missing && correctionsRemaining > 0 && this.iterations < maxIts) {\n correctionsRemaining--;\n this.logger.info(`[GoalVerifier] Incomplete — re-entering loop with tools to correct: \"${verdict.missing}\" (${correctionsRemaining} correction(s) left)`);\n this.emitTrace('verification', 'goal_correction_start', {\n missing: verdict.missing,\n reason: verdict.reason,\n correctionsRemaining\n });\n const directive = `[Goal verification found the previous response incomplete. Continue working — use tools as needed — to address what is still missing, then provide the complete final answer.]\\n\\nStill missing: ${verdict.missing}`;\n this.context.turns.push({\n role: 'user',\n content: directive,\n tokenCount: this.adapter.estimateTokens(directive),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n if (this.goalInjector) this.goalInjector.incrementTurn();\n continue;\n }\n\n // Budget exhausted (or no actionable \"missing\"): surface a visible warning.\n if (verdict && !verdict.achieved) {\n this.logger.warn(`[GoalVerifier] Goal still unmet after corrections: ${verdict.reason}`);\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: false, reason: verdict.reason, missing: verdict.missing\n }, null, null, 'error');\n const warningBlock = `\\n\\n---\\n\\n⚠️ **Goal Verification Warning**\\n* **Status:** Success criteria not fully met.\\n* **Reason:** ${verdict.reason ?? 'Unknown'}\\n* **Missing:** ${verdict.missing ?? 'Not specified'}\\n\\n`;\n yield warningBlock;\n const lastTurn = [...this.context.turns].reverse().find(t => t.role === 'assistant');\n if (lastTurn) lastTurn.content = (lastTurn.content as string) + warningBlock;\n }\n }\n\n this.logger.info(`[stream] Streaming run completed`);\n return;\n }\n\n throw new LemuraMaxIterationsError(`Exceeded max iterations of ${maxIts}`);\n }\n\n /**\n * Core ReAct execution loop shared by `run()` and `stream()`.\n *\n * Uses `adapter.complete()` exclusively — no streaming occurs here.\n * Goal verification and silent corrections run inside this method,\n * fully isolated from the caller's delivery path.\n *\n * @returns The final assistant response string\n * @throws {LemuraMaxIterationsError} When the loop exceeds `maxIterations`\n */\n private async _executeLoop(\n userMessage: string | ContentBlock[],\n opts: { label: string }\n ): Promise<string> {\n const userMessageStr = Array.isArray(userMessage) ? '[Multimodal Content]' : userMessage;\n this.logger.info(`Starting new session run`, {\n model: this.config.model,\n message: userMessageStr\n });\n\n // Goal injector: initialise on first run if enableGoalPlanning and no manual goal set\n if (this.config.enableGoalPlanning && !this.goalInjector) {\n this.goalInjector = new GoalInjector({\n id: 'auto',\n statement: typeof userMessage === 'string' ? userMessage : '[multimodal]',\n decomposition: [],\n successCriteria: ['The user request is fully answered'],\n injectionFrequency: this.config.goalInjectionFrequency ?? 'always',\n injectionPosition: this.config.goalInjectionPosition ?? 'system_prompt',\n });\n this.context.metadata['goal'] = this.goalInjector.getGoal();\n this.logger.debug('Goal injector initialised (auto)');\n this.emitTrace('planning', 'goal_init', {\n statement: this.goalInjector.getGoal().statement,\n criteria: this.goalInjector.getGoal().successCriteria\n });\n await this._runMiniPlanningStep(userMessageStr);\n }\n\n // Push user turn\n this.context.turns.push({\n role: 'user',\n content: userMessage,\n tokenCount: Array.isArray(userMessage)\n ? userMessage.length * 50\n : this.adapter.estimateTokens(userMessage),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n\n const maxIts = this.config.maxIterations || 10;\n this.iterations = 0;\n this.stepCounter = new StepCounter(this.config.maxSteps ?? 20);\n const maxCompletionTokens = this.config.maxCompletionTokens ?? 4_000;\n // Budget for goal-verifier corrections. Each correction re-enters the loop\n // with full tool access (see stream() for rationale).\n let correctionsRemaining = this.config.maxGoalCorrections ?? 1;\n\n while (this.iterations < maxIts) {\n this.iterations++;\n this.logger.debug(`[${opts.label}] ReAct Iteration ${this.iterations}/${maxIts}`);\n\n // Sync token count and compress if needed\n this.context.tokenCount =\n this.context.turns.reduce((sum, t) => sum + t.tokenCount, 0) +\n this.adapter.estimateTokens(this.context.systemPrompt || '');\n this.context = await this.contextManager.prepare(this.context);\n\n const systemPrompt = this.buildSystemPrompt(userMessageStr, this.iterations);\n const messages = this.buildMessages(systemPrompt, this.iterations);\n\n // maxSteps guard — inject forced-conclusion prompt\n if (this.stepCounter.isMaxReached()) {\n this.logger.warn(`maxSteps (${this.config.maxSteps ?? 20}) reached — forcing final response`);\n messages.push({\n role: 'system',\n content: this.stepCounter.getForcedConclusionPrompt() + '\\n\\n' + FinalResponseFormatter.getRequiredStructure()\n });\n this.emitTrace('planning', 'max_steps_reached', {\n maxSteps: this.config.maxSteps,\n currentSteps: this.stepCounter.count\n });\n }\n\n // Call provider\n this.logger.debug(`Calling provider adapter (${this.adapter.name})...`);\n this.emitTrace('thinking', 'llm_call', {\n model: this.config.model,\n iteration: this.iterations,\n totalTokens: this.totalTokens\n }, null, null, 'running');\n\n let response;\n try {\n response = await this.adapter.complete({\n model: this.config.model,\n messages,\n tools: this.stepCounter.isMaxReached() ? [] : this.toolRegistry.getAll(),\n maxTokens: maxCompletionTokens\n });\n } catch (err: unknown) {\n const e = err as { problem?: string; hints?: string[]; message?: string };\n const metadata = e.problem ? { problem: e.problem, hints: e.hints ?? [] } : {};\n this.logger.fatal(`Provider call failed: ${e.message ?? String(err)}`, metadata);\n this.emitTrace('error', 'llm_call_failed', { error: e.message ?? String(err) });\n throw err;\n }\n\n if (response.usage) this.totalTokens += response.usage.totalTokens;\n this.emitTrace('thinking', 'llm_call', {\n model: this.config.model,\n usage: response.usage,\n totalTokens: this.totalTokens\n }, null, response.content, 'done');\n\n // Tool calls\n if (response.finishReason === 'tool_call' && response.toolCalls) {\n this.logger.info(`Assistant requested ${response.toolCalls.length} tool calls`, {\n tools: response.toolCalls.map(tc => tc.name)\n });\n this.stepCounter.increment(response.toolCalls.length);\n\n const toolResults: Array<{ toolCallId: string; content: string }> = [];\n\n if (this.config.parallelToolCalls) {\n const budget = this.config.toolExecutionBudget;\n const maxConcurrent = budget?.maxConcurrentCalls ?? response.toolCalls.length;\n\n for (let i = 0; i < response.toolCalls.length; i += maxConcurrent) {\n const batch: ToolCall[] = response.toolCalls.slice(i, i + maxConcurrent);\n\n const allowed: ToolCall[] = [];\n for (const tc of batch) {\n const ok = await this.passesFirewall(tc.name, tc.arguments, tc.id, toolResults);\n if (ok) allowed.push(tc);\n else this.emitTrace('budget', 'firewall_blocked', { toolName: tc.name });\n }\n\n this.emitTrace('planning', 'parallel_execution', {\n batchSize: allowed.length,\n totalInResponse: response.toolCalls.length\n });\n\n const batchResults = await Promise.all(\n allowed.map(async (tc: ToolCall) => {\n try {\n const content = await this.executeSingleToolCall(tc);\n return { toolCallId: tc.id, content };\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n const isTimeout = e instanceof LemuraToolTimeoutError;\n this.logger.error(`Tool ${tc.name} ${isTimeout ? 'timed out' : 'failed'}: ${msg}`);\n this.emitTrace('error', isTimeout ? 'tool_timeout' : 'tool_error', {\n toolName: tc.name, id: tc.id, error: msg,\n timeoutMs: isTimeout ? (this.config.toolRegistryTimeoutMs ?? 30_000) : undefined\n }, null, null, 'error');\n return { toolCallId: tc.id, content: `Error: ${msg}` };\n }\n })\n );\n toolResults.push(...batchResults);\n }\n } else {\n for (const tc of response.toolCalls) {\n const ok = await this.passesFirewall(tc.name, tc.arguments, tc.id, toolResults);\n if (!ok) continue;\n\n try {\n const content = await this.executeSingleToolCall(tc);\n toolResults.push({ toolCallId: tc.id, content });\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n const isTimeout = e instanceof LemuraToolTimeoutError;\n this.logger.error(`Tool ${tc.name} ${isTimeout ? 'timed out' : 'failed'}: ${msg}`, {\n problem: `Tool ${tc.name} ${isTimeout ? 'timed out' : 'failed to execute'}.`,\n hints: isTimeout\n ? ['Increase toolRegistryTimeoutMs or optimise the tool implementation.']\n : ['Check the tool parameters and ensure required services are running.']\n });\n this.emitTrace('error', isTimeout ? 'tool_timeout' : 'tool_error', {\n toolName: tc.name, id: tc.id, error: msg,\n timeoutMs: isTimeout ? (this.config.toolRegistryTimeoutMs ?? 30_000) : undefined\n }, null, null, 'error');\n toolResults.push({ toolCallId: tc.id, content: `Error: ${msg}` });\n }\n }\n }\n\n const assistantTurn: Turn = {\n role: 'assistant',\n content: response.content || '',\n tokenCount: this.adapter.estimateTokens(response.content || '') + 50,\n turnIndex: this.context.turns.length,\n compressed: false,\n toolCalls: response.toolCalls\n };\n this.context.turns.push(assistantTurn);\n if (this.config.onTurn) this.config.onTurn(assistantTurn);\n\n for (const res of toolResults) {\n const toolTurn: Turn = {\n role: 'tool',\n content: res.content,\n tokenCount: this.adapter.estimateTokens(res.content),\n turnIndex: this.context.turns.length,\n compressed: false,\n toolResults: [res]\n };\n this.context.turns.push(toolTurn);\n if (this.config.onTurn) this.config.onTurn(toolTurn);\n }\n\n if (this.goalInjector) this.goalInjector.incrementTurn();\n // Reconcile sub-goal progress every N tool rounds (anti-drift; opt-in).\n if (this.config.goalProgressReconciliation &&\n this.iterations % (this.config.goalInjectionN ?? 3) === 0) {\n await this._reconcileSubGoals();\n }\n continue;\n }\n\n // Final / stop response\n if (\n response.finishReason === 'stop' ||\n response.finishReason === 'max_tokens' ||\n response.finishReason === 'error'\n ) {\n const finalTurn: Turn = {\n role: 'assistant',\n content: response.content,\n tokenCount: response.usage?.completionTokens ?? this.adapter.estimateTokens(response.content),\n turnIndex: this.context.turns.length,\n compressed: false\n };\n this.context.turns.push(finalTurn);\n if (this.config.onTurn) this.config.onTurn(finalTurn);\n\n // Goal verification. If incomplete and budget remains, re-enter the\n // loop with a corrective user turn so the model can act (with tools)\n // on what is missing — rather than a tool-less one-shot rewrite.\n if (response.finishReason === 'stop') {\n const verdict = await this._verifyGoal(this.context.turns);\n // Only re-enter if iteration budget remains, else the corrective\n // turn would trip the maxIterations guard and throw.\n if (verdict && !verdict.achieved && verdict.missing && correctionsRemaining > 0 && this.iterations < maxIts) {\n correctionsRemaining--;\n this.logger.info(`[GoalVerifier] Incomplete — re-entering loop with tools to correct: \"${verdict.missing}\" (${correctionsRemaining} correction(s) left)`);\n this.emitTrace('verification', 'goal_correction_start', {\n missing: verdict.missing,\n reason: verdict.reason,\n correctionsRemaining\n });\n const directive = `[Goal verification found the previous response incomplete. Continue working — use tools as needed — to address what is still missing, then provide the complete final answer.]\\n\\nStill missing: ${verdict.missing}`;\n this.context.turns.push({\n role: 'user',\n content: directive,\n tokenCount: this.adapter.estimateTokens(directive),\n turnIndex: this.context.turns.length,\n compressed: false\n });\n if (this.goalInjector) this.goalInjector.incrementTurn();\n continue;\n }\n\n // Budget exhausted (or no actionable \"missing\"): append a warning.\n if (verdict && !verdict.achieved) {\n this.logger.warn(`[GoalVerifier] Goal still unmet after corrections: ${verdict.reason}`);\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: false, reason: verdict.reason, missing: verdict.missing\n }, null, null, 'error');\n const warningBlock = `\\n\\n---\\n\\n⚠️ **Goal Verification Warning**\\n* **Status:** Success criteria not fully met.\\n* **Reason:** ${verdict.reason ?? 'Unknown'}\\n* **Missing:** ${verdict.missing ?? 'Not specified'}\\n\\n`;\n const lastTurn = [...this.context.turns].reverse().find(t => t.role === 'assistant');\n if (lastTurn) lastTurn.content = (lastTurn.content as string) + warningBlock;\n this.logger.info(`[${opts.label}] Run completed with goal warning`);\n return (lastTurn?.content as string) ?? response.content;\n }\n }\n\n this.logger.info(`[${opts.label}] Run completed successfully`);\n return response.content;\n }\n }\n\n const maxItsErr = new LemuraMaxIterationsError(`Exceeded max iterations of ${maxIts}`);\n this.logger.fatal(maxItsErr.message, {\n problem: 'The agent entered an infinite loop or took too many steps to resolve the task.',\n hints: [\n 'Increase maxIterations if the task is complex.',\n 'Check if tools are returning consistent results.'\n ]\n });\n throw maxItsErr;\n }\n\n /**\n * Verifies whether the goal was achieved after a `stop` finish.\n *\n * Priority:\n * 1. `config.goalVerifier` callback (Option A — user-supplied)\n * 2. Built-in LLM check against `successCriteria` (Option C — fallback)\n *\n * Returns `null` when verification is skipped (no goal, planning disabled, etc.).\n *\n * @since 1.5.0\n */\n private async _verifyGoal(turns: Turn[]): Promise<GoalVerifierResult | null> {\n if (!this.config.enableGoalPlanning || !this.goalInjector) return null;\n if (this.config.enableGoalVerification === false) return null;\n\n const goal = this.goalInjector.getGoal();\n if (!goal.statement) return null;\n\n this.emitTrace('verification', 'goal_verification_start', { goalStatement: goal.statement });\n\n try {\n // Option A — user-supplied verifier takes priority\n if (this.config.goalVerifier) {\n const result = await this.config.goalVerifier(goal, turns);\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: result.achieved,\n reason: result.reason,\n missing: result.missing,\n source: 'custom'\n });\n return result;\n }\n\n // Option C — built-in LLM check only when successCriteria contains\n // real user-defined criteria (not the generic auto-populated fallback)\n const GENERIC_CRITERION = 'The user request is fully answered';\n const meaningfulCriteria = goal.successCriteria?.filter(c => c !== GENERIC_CRITERION) ?? [];\n if (meaningfulCriteria.length > 0) {\n const recentTurns = turns.slice(-6).map(t => {\n const text = typeof t.content === 'string'\n ? t.content\n : JSON.stringify(t.content);\n return `[${t.role}]: ${text.slice(0, 400)}`;\n }).join('\\n\\n');\n\n const criteriaList = meaningfulCriteria.map((c, i) => `${i + 1}. ${c}`).join('\\n');\n\n const response = await this.adapter.complete({\n model: this.config.model,\n temperature: 0,\n maxTokens: 256,\n messages: [\n {\n role: 'system',\n content: 'You are a strict goal-completion verifier. Respond ONLY with a valid JSON object — no markdown, no prose:\\n{\"achieved\": true|false, \"reason\": \"<short explanation>\", \"missing\": \"<what is still needed, or empty string>\"}'\n },\n {\n role: 'user',\n content: `Goal: ${goal.statement}\\n\\nSuccess criteria:\\n${criteriaList}\\n\\nRecent conversation:\\n${recentTurns}\\n\\nWere ALL success criteria met?`\n }\n ]\n });\n\n let verdict: GoalVerifierResult | null = null;\n try {\n const jsonMatch = response.content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as { achieved?: unknown; reason?: unknown; missing?: unknown };\n verdict = {\n achieved: parsed.achieved === true,\n ...(typeof parsed.reason === 'string' && { reason: parsed.reason }),\n ...(typeof parsed.missing === 'string' && { missing: parsed.missing })\n };\n }\n } catch {\n this.logger.warn('[GoalVerifier] Failed to parse built-in verifier response — skipping');\n }\n\n if (verdict) {\n this.emitTrace('verification', 'goal_verification_result', {\n achieved: verdict.achieved,\n reason: verdict.reason,\n missing: verdict.missing,\n source: 'built_in'\n });\n return verdict;\n }\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n this.logger.warn(`[GoalVerifier] Verification step failed (non-fatal): ${msg}`);\n }\n\n return null;\n }\n\n /**\n * Resets the session: clears conversation history, resets iteration counters,\n * tool execution budget tallies, and goal/plan state.\n * The adapter, config, compression strategies, and tools are retained.\n */\n reset(): void {\n this.context = {\n systemPrompt: this.config.systemPrompt || '',\n scratchpad: '',\n turns: [],\n tokenCount: 0,\n maxTokens: this.config.maxTokens,\n metadata: {}\n };\n this.iterations = 0;\n this.totalToolCallCount = 0;\n this.totalTokens = 0;\n this.perToolCallCount.clear();\n this.stepCounter = new StepCounter(this.config.maxSteps ?? 20);\n this.goalInjector = null;\n this.continuationPlanner = null;\n this.scratchpadLoaded = false;\n this.pendingScratchpadClear = !!this.config.scratchpadAdapter;\n this.logger.debug('Session reset');\n }\n\n /**\n * Closes the session and disconnects all MCP servers.\n *\n * Call this when you are done with the session to ensure child processes are\n * terminated and HTTP connections are released.\n *\n * @example\n * ```typescript\n * const session = new SessionManager({ ..., mcpServers: [...] });\n * try {\n * await session.run('Hello');\n * } finally {\n * await session.close();\n * }\n * ```\n */\n async close(): Promise<void> {\n if (this.mcpRegistry) {\n await this.mcpRegistry.disconnectAll();\n this.emitTrace('system', 'mcp_disconnected', {});\n this.logger.debug('All MCP servers disconnected');\n }\n }\n}\n"]}