@riotprompt/riotprompt 0.0.9 → 0.0.11
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/BUG-ANALYSIS.md +523 -0
- package/CODE-REVIEW-SUMMARY.md +330 -0
- package/FIXES-APPLIED.md +437 -0
- package/dist/chat.d.ts +1 -1
- package/dist/chat.js +2 -5
- package/dist/chat.js.map +1 -1
- package/dist/constants.js +1 -2
- package/dist/constants.js.map +1 -1
- package/dist/context-manager.d.ts +3 -2
- package/dist/context-manager.js +29 -6
- package/dist/context-manager.js.map +1 -1
- package/dist/conversation-logger.d.ts +3 -1
- package/dist/conversation-logger.js +41 -4
- package/dist/conversation-logger.js.map +1 -1
- package/dist/conversation.d.ts +8 -2
- package/dist/conversation.js +36 -9
- package/dist/conversation.js.map +1 -1
- package/dist/items/section.js +3 -3
- package/dist/items/section.js.map +1 -1
- package/dist/iteration-strategy.d.ts +2 -0
- package/dist/iteration-strategy.js +40 -6
- package/dist/iteration-strategy.js.map +1 -1
- package/dist/loader.js +18 -3
- package/dist/loader.js.map +1 -1
- package/dist/message-builder.js +4 -2
- package/dist/message-builder.js.map +1 -1
- package/dist/model-config.d.ts +115 -0
- package/dist/model-config.js +205 -0
- package/dist/model-config.js.map +1 -0
- package/dist/override.js +5 -1
- package/dist/override.js.map +1 -1
- package/dist/parser.js +3 -3
- package/dist/parser.js.map +1 -1
- package/dist/recipes.d.ts +1 -1
- package/dist/recipes.js +4 -4
- package/dist/recipes.js.map +1 -1
- package/dist/reflection.js +5 -2
- package/dist/reflection.js.map +1 -1
- package/dist/riotprompt.cjs +439 -94
- package/dist/riotprompt.cjs.map +1 -1
- package/dist/riotprompt.d.ts +2 -0
- package/dist/riotprompt.js +1 -0
- package/dist/riotprompt.js.map +1 -1
- package/dist/token-budget.d.ts +2 -2
- package/dist/token-budget.js +23 -26
- package/dist/token-budget.js.map +1 -1
- package/dist/util/general.js +1 -1
- package/dist/util/general.js.map +1 -1
- package/package.json +2 -2
- package/.kodrdriv-test-cache.json +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iteration-strategy.js","sources":["../src/iteration-strategy.ts"],"sourcesContent":["import { ConversationBuilder, type ConversationMessage, type ToolCall } from \"./conversation\";\nimport { ToolRegistry, type Tool } from \"./tools\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { MetricsCollector, ReflectionReportGenerator, type ReflectionReport, type ReflectionConfig } from \"./reflection\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Tool usage policy for a phase\n */\nexport type ToolUsagePolicy = 'required' | 'encouraged' | 'optional' | 'forbidden';\n\n/**\n * LLM client interface (generic, provider-agnostic)\n */\nexport interface LLMClient {\n complete(messages: ConversationMessage[], tools?: any[]): Promise<{\n content: string | null;\n tool_calls?: ToolCall[];\n }>;\n}\n\n/**\n * Context provided to strategy execution\n */\nexport interface StrategyContext {\n conversation: ConversationBuilder;\n tools: ToolRegistry;\n llm: LLMClient;\n state: StrategyState;\n}\n\n/**\n * Current state of strategy execution\n */\nexport interface StrategyState {\n phase: string | number;\n iteration: number;\n toolCallsExecuted: number;\n startTime: number;\n insights: Insight[];\n findings: any[];\n errors: Error[];\n [key: string]: any;\n}\n\n/**\n * Insight discovered during execution\n */\nexport interface Insight {\n source: string;\n content: string;\n confidence: number;\n relatedTo?: string[];\n}\n\n/**\n * Result of tool execution\n */\nexport interface ToolResult {\n callId: string;\n toolName: string;\n result: any;\n error?: Error;\n duration: number;\n}\n\n/**\n * Action to take after iteration\n */\nexport type IterationAction = 'continue' | 'stop' | 'next-phase';\n\n/**\n * Action to take for tool call\n */\nexport type ToolCallAction = 'execute' | 'skip' | 'defer';\n\n/**\n * Result of a phase\n */\nexport interface PhaseResult {\n name: string;\n iterations: number;\n toolCalls: number;\n success: boolean;\n insights?: Insight[];\n}\n\n/**\n * Final strategy result\n */\nexport interface StrategyResult {\n finalMessage: ConversationMessage | undefined;\n phases: PhaseResult[];\n totalIterations: number;\n toolCallsExecuted: number;\n duration: number;\n success: boolean;\n conversation: ConversationBuilder;\n reflection?: ReflectionReport;\n}\n\n/**\n * Configuration for a strategy phase\n */\nexport interface StrategyPhase {\n name: string;\n maxIterations: number;\n toolUsage: ToolUsagePolicy;\n allowedTools?: string[];\n minToolCalls?: number;\n maxToolCalls?: number;\n instructions?: string;\n earlyExit?: boolean;\n requireFinalAnswer?: boolean;\n adaptiveDepth?: boolean;\n continueIf?: (state: StrategyState) => boolean;\n skipIf?: (state: StrategyState) => boolean;\n}\n\n/**\n * Iteration strategy interface\n */\nexport interface IterationStrategy {\n name: string;\n description: string;\n maxIterations: number;\n maxToolCalls?: number;\n timeoutMs?: number;\n phases?: StrategyPhase[];\n\n // Lifecycle hooks\n onStart?: (context: StrategyContext) => Promise<void>;\n onIteration?: (iteration: number, state: StrategyState) => Promise<IterationAction>;\n onToolCall?: (toolCall: ToolCall, state: StrategyState) => Promise<ToolCallAction>;\n onToolResult?: (result: ToolResult, state: StrategyState) => Promise<void>;\n onPhaseComplete?: (phase: PhaseResult, state: StrategyState) => Promise<void>;\n onComplete?: (result: StrategyResult) => Promise<void>;\n\n // Decision logic\n shouldContinue?: (state: StrategyState) => boolean;\n shouldCallTool?: (tool: Tool, state: StrategyState) => boolean;\n selectTools?: (available: Tool[], state: StrategyState) => Tool[];\n}\n\n// ===== STRATEGY EXECUTOR =====\n\n/**\n * StrategyExecutor executes iteration strategies.\n *\n * Features:\n * - Execute multi-phase strategies\n * - Manage tool calls and results\n * - Track state and metrics\n * - Handle timeouts and errors\n * - Provide lifecycle hooks\n *\n * @example\n * ```typescript\n * const executor = new StrategyExecutor(llmClient);\n *\n * const result = await executor.execute(\n * conversation,\n * toolRegistry,\n * strategy\n * );\n *\n * console.log('Completed in', result.totalIterations, 'iterations');\n * console.log('Used', result.toolCallsExecuted, 'tools');\n * ```\n */\nexport class StrategyExecutor {\n private llm: LLMClient;\n private logger: any;\n private metricsCollector?: MetricsCollector;\n private reflectionConfig?: ReflectionConfig;\n\n constructor(llm: LLMClient, logger?: any) {\n this.llm = llm;\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'StrategyExecutor');\n }\n\n /**\n * Enable reflection generation\n */\n withReflection(config: ReflectionConfig): this {\n this.reflectionConfig = config;\n return this;\n }\n\n /**\n * Execute a strategy\n */\n async execute(\n conversation: ConversationBuilder,\n tools: ToolRegistry,\n strategy: IterationStrategy\n ): Promise<StrategyResult> {\n const startTime = Date.now();\n\n // Initialize metrics collector if reflection enabled\n if (this.reflectionConfig?.enabled) {\n this.metricsCollector = new MetricsCollector(this.logger);\n }\n\n const state: StrategyState = {\n phase: 0,\n iteration: 0,\n toolCallsExecuted: 0,\n startTime,\n insights: [],\n findings: [],\n errors: [],\n };\n\n this.logger.info('Starting strategy execution', { strategy: strategy.name });\n\n const context: StrategyContext = { conversation, tools, llm: this.llm, state };\n\n try {\n // Initialize\n await strategy.onStart?.(context);\n\n // Execute phases or single loop\n const phases = strategy.phases || [\n {\n name: 'default',\n maxIterations: strategy.maxIterations,\n toolUsage: 'encouraged' as ToolUsagePolicy,\n }\n ];\n\n const phaseResults: PhaseResult[] = [];\n\n for (const phase of phases) {\n // Check if should skip phase\n if (phase.skipIf?.(state)) {\n this.logger.debug('Skipping phase', { phase: phase.name });\n continue;\n }\n\n state.phase = phase.name;\n state.iteration = 0;\n\n this.logger.debug('Starting phase', { phase: phase.name });\n\n const phaseResult = await this.executePhase(\n conversation,\n tools,\n phase,\n state,\n strategy\n );\n\n phaseResults.push(phaseResult);\n\n // Track iteration for metrics\n if (this.metricsCollector) {\n this.metricsCollector.incrementIteration();\n }\n\n await strategy.onPhaseComplete?.(phaseResult, state);\n\n // Check if should continue\n if (strategy.shouldContinue && !strategy.shouldContinue(state)) {\n this.logger.debug('Strategy decided to stop');\n break;\n }\n }\n\n const duration = Date.now() - startTime;\n\n const result: StrategyResult = {\n finalMessage: conversation.getLastMessage(),\n phases: phaseResults,\n totalIterations: state.iteration,\n toolCallsExecuted: state.toolCallsExecuted,\n duration,\n success: true,\n conversation,\n };\n\n // Generate reflection if enabled\n if (this.metricsCollector && this.reflectionConfig?.enabled) {\n const metrics = this.metricsCollector.getMetrics(\n conversation.getMessages(),\n conversation.getMetadata().model\n );\n\n const generator = new ReflectionReportGenerator(this.logger);\n result.reflection = generator.generate(metrics, result);\n\n // Save reflection if output path specified\n if (this.reflectionConfig.outputPath && result.reflection) {\n await this.saveReflection(result.reflection, this.reflectionConfig);\n }\n }\n\n await strategy.onComplete?.(result);\n\n this.logger.info('Strategy execution complete', {\n iterations: result.totalIterations,\n toolCalls: result.toolCallsExecuted,\n duration\n });\n\n return result;\n\n } catch (error) {\n this.logger.error('Strategy execution failed', { error });\n\n return {\n finalMessage: conversation.getLastMessage(),\n phases: [],\n totalIterations: state.iteration,\n toolCallsExecuted: state.toolCallsExecuted,\n duration: Date.now() - startTime,\n success: false,\n conversation,\n };\n }\n }\n\n /**\n * Save reflection report\n */\n private async saveReflection(\n reflection: ReflectionReport,\n config: ReflectionConfig\n ): Promise<void> {\n if (!config.outputPath) {\n return;\n }\n\n try {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `reflection-${timestamp}.${config.format === 'json' ? 'json' : 'md'}`;\n const fullPath = path.join(config.outputPath, filename);\n\n // Ensure directory exists\n await fs.mkdir(config.outputPath, { recursive: true });\n\n // Save based on format\n if (config.format === 'json') {\n await fs.writeFile(fullPath, JSON.stringify(reflection, null, 2), 'utf-8');\n } else {\n const generator = new ReflectionReportGenerator(this.logger);\n const markdown = generator.formatMarkdown(reflection);\n await fs.writeFile(fullPath, markdown, 'utf-8');\n }\n\n this.logger.info('Reflection saved', { path: fullPath });\n } catch (error) {\n this.logger.error('Failed to save reflection', { error });\n }\n }\n\n /**\n * Execute a single phase\n */\n private async executePhase(\n conversation: ConversationBuilder,\n tools: ToolRegistry,\n phase: StrategyPhase,\n state: StrategyState,\n strategy: IterationStrategy\n ): Promise<PhaseResult> {\n const phaseStartTools = state.toolCallsExecuted;\n\n // Add phase instructions if provided\n if (phase.instructions) {\n conversation.asUser(phase.instructions);\n }\n\n // Iteration loop for this phase\n for (let i = 0; i < phase.maxIterations; i++) {\n state.iteration++;\n\n this.logger.debug('Iteration', { phase: phase.name, iteration: i + 1 });\n\n // Check iteration hook\n const action = await strategy.onIteration?.(i, state);\n if (action === 'stop') {\n break;\n }\n if (action === 'next-phase') {\n break;\n }\n\n // Get LLM response\n const toolsToProvide = phase.toolUsage !== 'forbidden' ? tools.toOpenAIFormat() : undefined;\n const response = await this.llm.complete(\n conversation.toMessages(),\n toolsToProvide\n );\n\n // Handle tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n if (phase.toolUsage === 'forbidden') {\n this.logger.warn('Tool calls requested but forbidden in this phase');\n conversation.asAssistant(response.content);\n continue;\n }\n\n conversation.asAssistant(response.content, response.tool_calls);\n\n // Execute tools\n for (const toolCall of response.tool_calls) {\n // Check if tool is allowed in this phase\n if (phase.allowedTools && !phase.allowedTools.includes(toolCall.function.name)) {\n this.logger.debug('Tool not allowed in phase', { tool: toolCall.function.name });\n continue;\n }\n\n // Check tool call hook\n const toolAction = await strategy.onToolCall?.(toolCall, state);\n if (toolAction === 'skip') {\n continue;\n }\n\n // Execute tool\n const toolStart = Date.now();\n try {\n const result = await tools.execute(\n toolCall.function.name,\n JSON.parse(toolCall.function.arguments)\n );\n\n const toolDuration = Date.now() - toolStart;\n\n const toolResult: ToolResult = {\n callId: toolCall.id,\n toolName: toolCall.function.name,\n result,\n duration: toolDuration,\n };\n\n conversation.asTool(toolCall.id, result, {\n duration: toolDuration,\n success: true\n });\n\n state.toolCallsExecuted++;\n\n // Record metrics\n if (this.metricsCollector) {\n this.metricsCollector.recordToolCall(\n toolCall.function.name,\n state.iteration,\n toolDuration,\n true\n );\n }\n\n await strategy.onToolResult?.(toolResult, state);\n\n } catch (error) {\n this.logger.error('Tool execution failed', { tool: toolCall.function.name, error });\n\n const toolDuration = Date.now() - toolStart;\n\n const toolResult: ToolResult = {\n callId: toolCall.id,\n toolName: toolCall.function.name,\n result: null,\n error: error as Error,\n duration: toolDuration,\n };\n\n conversation.asTool(toolCall.id, {\n error: (error as Error).message\n }, {\n success: false,\n errorName: (error as Error).name\n });\n\n state.errors.push(error as Error);\n\n // Record metrics\n if (this.metricsCollector) {\n this.metricsCollector.recordToolCall(\n toolCall.function.name,\n state.iteration,\n toolDuration,\n false,\n (error as Error).message\n );\n }\n\n await strategy.onToolResult?.(toolResult, state);\n }\n }\n\n } else {\n // No tool calls - add response and potentially end phase\n conversation.asAssistant(response.content);\n\n // Check if this phase requires tool calls\n if (phase.toolUsage === 'required' && state.toolCallsExecuted === phaseStartTools) {\n this.logger.warn('No tools used but required in phase');\n // Continue to try again\n } else if (phase.earlyExit !== false) {\n // Exit phase early if we got a response without tools\n break;\n }\n }\n\n // Check phase completion conditions\n const toolCallsInPhase = state.toolCallsExecuted - phaseStartTools;\n\n if (phase.minToolCalls && toolCallsInPhase < phase.minToolCalls) {\n continue; // Need more tool calls\n }\n\n if (phase.maxToolCalls && toolCallsInPhase >= phase.maxToolCalls) {\n break; // Hit max tool calls for phase\n }\n\n if (phase.continueIf && !phase.continueIf(state)) {\n break; // Condition not met\n }\n }\n\n return {\n name: phase.name,\n iterations: state.iteration,\n toolCalls: state.toolCallsExecuted - phaseStartTools,\n success: true,\n insights: state.insights,\n };\n }\n}\n\n// ===== PRE-BUILT STRATEGIES =====\n\n/**\n * Factory for creating iteration strategies\n */\nexport class IterationStrategyFactory {\n /**\n * Investigate then respond strategy\n * Phase 1: Use tools to gather information\n * Phase 2: Synthesize into final answer\n */\n static investigateThenRespond(config: {\n maxInvestigationSteps?: number;\n requireMinimumTools?: number;\n finalSynthesis?: boolean;\n } = {}): IterationStrategy {\n const {\n maxInvestigationSteps = 5,\n requireMinimumTools = 1,\n finalSynthesis = true,\n } = config;\n\n return {\n name: 'investigate-then-respond',\n description: 'Investigate using tools, then synthesize findings',\n maxIterations: maxInvestigationSteps + (finalSynthesis ? 1 : 0),\n phases: [\n {\n name: 'investigate',\n maxIterations: maxInvestigationSteps,\n toolUsage: 'encouraged',\n minToolCalls: requireMinimumTools,\n earlyExit: false,\n },\n ...(finalSynthesis ? [{\n name: 'respond',\n maxIterations: 1,\n toolUsage: 'forbidden' as ToolUsagePolicy,\n instructions: 'Based on your investigation, provide a comprehensive answer.',\n requireFinalAnswer: true,\n }] : []),\n ],\n };\n }\n\n /**\n * Multi-pass refinement strategy\n * Generate, critique, refine repeatedly\n */\n static multiPassRefinement(config: {\n passes?: number;\n critiqueBetweenPasses?: boolean;\n improvementThreshold?: number;\n } = {}): IterationStrategy {\n const {\n passes = 3,\n critiqueBetweenPasses = true,\n } = config;\n\n const phases: StrategyPhase[] = [];\n\n for (let i = 0; i < passes; i++) {\n phases.push({\n name: `pass-${i + 1}`,\n maxIterations: 1,\n toolUsage: 'optional',\n instructions: i === 0\n ? 'Generate your best response'\n : 'Refine your previous response based on the critique',\n });\n\n if (critiqueBetweenPasses && i < passes - 1) {\n phases.push({\n name: `critique-${i + 1}`,\n maxIterations: 1,\n toolUsage: 'forbidden',\n instructions: 'Critique the previous response. What can be improved?',\n });\n }\n }\n\n return {\n name: 'multi-pass-refinement',\n description: 'Iteratively refine response through multiple passes',\n maxIterations: passes * 2,\n phases,\n };\n }\n\n /**\n * Breadth-first investigation\n * Explore broadly before going deep\n */\n static breadthFirst(config: {\n levelsDeep?: number;\n toolsPerLevel?: number;\n } = {}): IterationStrategy {\n const {\n levelsDeep = 3,\n toolsPerLevel = 4,\n } = config;\n\n const phases: StrategyPhase[] = [];\n\n for (let level = 0; level < levelsDeep; level++) {\n phases.push({\n name: `level-${level + 1}`,\n maxIterations: toolsPerLevel,\n toolUsage: 'encouraged',\n minToolCalls: 1,\n maxToolCalls: toolsPerLevel,\n instructions: level === 0\n ? 'Get a broad overview'\n : `Dive deeper into areas discovered in level ${level}`,\n });\n }\n\n return {\n name: 'breadth-first',\n description: 'Explore broadly at each level before going deeper',\n maxIterations: levelsDeep * toolsPerLevel,\n phases,\n };\n }\n\n /**\n * Depth-first investigation\n * Deep dive immediately\n */\n static depthFirst(config: {\n maxDepth?: number;\n backtrackOnFailure?: boolean;\n } = {}): IterationStrategy {\n const {\n maxDepth = 5,\n backtrackOnFailure = true,\n } = config;\n\n return {\n name: 'depth-first',\n description: 'Deep dive investigation path',\n maxIterations: maxDepth,\n phases: [{\n name: 'deep-dive',\n maxIterations: maxDepth,\n toolUsage: 'encouraged',\n adaptiveDepth: true,\n }],\n shouldContinue: (state) => {\n // Continue if making progress\n if (backtrackOnFailure && state.errors.length > 2) {\n return false;\n }\n return true;\n },\n };\n }\n\n /**\n * Adaptive strategy\n * Changes behavior based on progress\n */\n static adaptive(_config: {\n strategies?: IterationStrategy[];\n switchConditions?: Array<{\n when: (state: StrategyState) => boolean;\n switchTo: number;\n }>;\n } = {}): IterationStrategy {\n return {\n name: 'adaptive',\n description: 'Adapts strategy based on progress',\n maxIterations: 20,\n onIteration: async (iteration, state) => {\n // Change behavior based on iteration count\n if (iteration < 5) {\n // Early: broad exploration\n return 'continue';\n } else if (iteration < 15) {\n // Mid: focused investigation\n return 'continue';\n } else {\n // Late: wrap up\n return state.toolCallsExecuted > 0 ? 'continue' : 'stop';\n }\n },\n };\n }\n\n /**\n * Simple iteration (basic tool-use loop)\n */\n static simple(config: {\n maxIterations?: number;\n allowTools?: boolean;\n } = {}): IterationStrategy {\n const {\n maxIterations = 10,\n allowTools = true,\n } = config;\n\n return {\n name: 'simple',\n description: 'Simple iteration loop',\n maxIterations,\n phases: [{\n name: 'main',\n maxIterations,\n toolUsage: allowTools ? 'encouraged' : 'forbidden',\n earlyExit: true,\n }],\n };\n }\n}\n\nexport default IterationStrategyFactory;\n\n"],"names":["StrategyExecutor","withReflection","config","reflectionConfig","execute","conversation","tools","strategy","startTime","Date","now","enabled","metricsCollector","MetricsCollector","logger","state","phase","iteration","toolCallsExecuted","insights","findings","errors","info","name","context","llm","onStart","phases","maxIterations","toolUsage","phaseResults","skipIf","debug","phaseResult","executePhase","push","incrementIteration","onPhaseComplete","shouldContinue","duration","result","finalMessage","getLastMessage","totalIterations","success","metrics","getMetrics","getMessages","getMetadata","model","generator","ReflectionReportGenerator","reflection","generate","outputPath","saveReflection","onComplete","iterations","toolCalls","error","fs","path","timestamp","toISOString","replace","filename","format","fullPath","join","mkdir","recursive","writeFile","JSON","stringify","markdown","formatMarkdown","phaseStartTools","instructions","asUser","i","action","onIteration","toolsToProvide","toOpenAIFormat","undefined","response","complete","toMessages","tool_calls","length","warn","asAssistant","content","toolCall","allowedTools","includes","function","tool","toolAction","onToolCall","toolStart","parse","arguments","toolDuration","toolResult","callId","id","toolName","asTool","recordToolCall","onToolResult","message","errorName","earlyExit","toolCallsInPhase","minToolCalls","maxToolCalls","continueIf","wrapLogger","DEFAULT_LOGGER","IterationStrategyFactory","investigateThenRespond","maxInvestigationSteps","requireMinimumTools","finalSynthesis","description","requireFinalAnswer","multiPassRefinement","passes","critiqueBetweenPasses","breadthFirst","levelsDeep","toolsPerLevel","level","depthFirst","maxDepth","backtrackOnFailure","adaptiveDepth","adaptive","_config","simple","allowTools"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iteration-strategy.js","sources":["../src/iteration-strategy.ts"],"sourcesContent":["import { ConversationBuilder, type ConversationMessage, type ToolCall } from \"./conversation\";\nimport { ToolRegistry, type Tool } from \"./tools\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { MetricsCollector, ReflectionReportGenerator, type ReflectionReport, type ReflectionConfig } from \"./reflection\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Tool usage policy for a phase\n */\nexport type ToolUsagePolicy = 'required' | 'encouraged' | 'optional' | 'forbidden';\n\n/**\n * LLM client interface (generic, provider-agnostic)\n */\nexport interface LLMClient {\n complete(messages: ConversationMessage[], tools?: any[]): Promise<{\n content: string | null;\n tool_calls?: ToolCall[];\n }>;\n}\n\n/**\n * Context provided to strategy execution\n */\nexport interface StrategyContext {\n conversation: ConversationBuilder;\n tools: ToolRegistry;\n llm: LLMClient;\n state: StrategyState;\n}\n\n/**\n * Current state of strategy execution\n */\nexport interface StrategyState {\n phase: string | number;\n iteration: number;\n toolCallsExecuted: number;\n startTime: number;\n insights: Insight[];\n findings: any[];\n errors: Error[];\n toolFailures: Map<string, number>; // Track consecutive failures per tool\n [key: string]: any;\n}\n\n/**\n * Insight discovered during execution\n */\nexport interface Insight {\n source: string;\n content: string;\n confidence: number;\n relatedTo?: string[];\n}\n\n/**\n * Result of tool execution\n */\nexport interface ToolResult {\n callId: string;\n toolName: string;\n result: any;\n error?: Error;\n duration: number;\n}\n\n/**\n * Action to take after iteration\n */\nexport type IterationAction = 'continue' | 'stop' | 'next-phase';\n\n/**\n * Action to take for tool call\n */\nexport type ToolCallAction = 'execute' | 'skip' | 'defer';\n\n/**\n * Result of a phase\n */\nexport interface PhaseResult {\n name: string;\n iterations: number;\n toolCalls: number;\n success: boolean;\n insights?: Insight[];\n}\n\n/**\n * Final strategy result\n */\nexport interface StrategyResult {\n finalMessage: ConversationMessage | undefined;\n phases: PhaseResult[];\n totalIterations: number;\n toolCallsExecuted: number;\n duration: number;\n success: boolean;\n conversation: ConversationBuilder;\n reflection?: ReflectionReport;\n}\n\n/**\n * Configuration for a strategy phase\n */\nexport interface StrategyPhase {\n name: string;\n maxIterations: number;\n toolUsage: ToolUsagePolicy;\n allowedTools?: string[];\n minToolCalls?: number;\n maxToolCalls?: number;\n instructions?: string;\n earlyExit?: boolean;\n requireFinalAnswer?: boolean;\n adaptiveDepth?: boolean;\n maxConsecutiveToolFailures?: number; // Circuit breaker threshold (default: 3)\n continueIf?: (state: StrategyState) => boolean;\n skipIf?: (state: StrategyState) => boolean;\n}\n\n/**\n * Iteration strategy interface\n */\nexport interface IterationStrategy {\n name: string;\n description: string;\n maxIterations: number;\n maxToolCalls?: number;\n timeoutMs?: number;\n phases?: StrategyPhase[];\n\n // Lifecycle hooks\n onStart?: (context: StrategyContext) => Promise<void>;\n onIteration?: (iteration: number, state: StrategyState) => Promise<IterationAction>;\n onToolCall?: (toolCall: ToolCall, state: StrategyState) => Promise<ToolCallAction>;\n onToolResult?: (result: ToolResult, state: StrategyState) => Promise<void>;\n onPhaseComplete?: (phase: PhaseResult, state: StrategyState) => Promise<void>;\n onComplete?: (result: StrategyResult) => Promise<void>;\n\n // Decision logic\n shouldContinue?: (state: StrategyState) => boolean;\n shouldCallTool?: (tool: Tool, state: StrategyState) => boolean;\n selectTools?: (available: Tool[], state: StrategyState) => Tool[];\n}\n\n// ===== STRATEGY EXECUTOR =====\n\n/**\n * StrategyExecutor executes iteration strategies.\n *\n * Features:\n * - Execute multi-phase strategies\n * - Manage tool calls and results\n * - Track state and metrics\n * - Handle timeouts and errors\n * - Provide lifecycle hooks\n *\n * @example\n * ```typescript\n * const executor = new StrategyExecutor(llmClient);\n *\n * const result = await executor.execute(\n * conversation,\n * toolRegistry,\n * strategy\n * );\n *\n * console.log('Completed in', result.totalIterations, 'iterations');\n * console.log('Used', result.toolCallsExecuted, 'tools');\n * ```\n */\nexport class StrategyExecutor {\n private llm: LLMClient;\n private logger: any;\n private metricsCollector?: MetricsCollector;\n private reflectionConfig?: ReflectionConfig;\n\n constructor(llm: LLMClient, logger?: any) {\n this.llm = llm;\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'StrategyExecutor');\n }\n\n /**\n * Enable reflection generation\n */\n withReflection(config: ReflectionConfig): this {\n this.reflectionConfig = config;\n return this;\n }\n\n /**\n * Execute a strategy\n */\n async execute(\n conversation: ConversationBuilder,\n tools: ToolRegistry,\n strategy: IterationStrategy\n ): Promise<StrategyResult> {\n const startTime = Date.now();\n\n // Initialize metrics collector if reflection enabled\n if (this.reflectionConfig?.enabled) {\n this.metricsCollector = new MetricsCollector(this.logger);\n }\n\n const state: StrategyState = {\n phase: 0,\n iteration: 0,\n toolCallsExecuted: 0,\n startTime,\n insights: [],\n findings: [],\n errors: [],\n toolFailures: new Map<string, number>(),\n };\n\n this.logger.info('Starting strategy execution', { strategy: strategy.name });\n\n const context: StrategyContext = { conversation, tools, llm: this.llm, state };\n\n try {\n // Initialize\n await strategy.onStart?.(context);\n\n // Execute phases or single loop\n const phases = strategy.phases || [\n {\n name: 'default',\n maxIterations: strategy.maxIterations,\n toolUsage: 'encouraged' as ToolUsagePolicy,\n }\n ];\n\n const phaseResults: PhaseResult[] = [];\n\n for (const phase of phases) {\n // Check if should skip phase\n if (phase.skipIf?.(state)) {\n this.logger.debug('Skipping phase', { phase: phase.name });\n continue;\n }\n\n state.phase = phase.name;\n state.iteration = 0;\n\n this.logger.debug('Starting phase', { phase: phase.name });\n\n const phaseResult = await this.executePhase(\n conversation,\n tools,\n phase,\n state,\n strategy\n );\n\n phaseResults.push(phaseResult);\n\n await strategy.onPhaseComplete?.(phaseResult, state);\n\n // Check if should continue\n if (strategy.shouldContinue && !strategy.shouldContinue(state)) {\n this.logger.debug('Strategy decided to stop');\n break;\n }\n }\n\n const duration = Date.now() - startTime;\n\n const result: StrategyResult = {\n finalMessage: conversation.getLastMessage(),\n phases: phaseResults,\n totalIterations: state.iteration,\n toolCallsExecuted: state.toolCallsExecuted,\n duration,\n success: true,\n conversation,\n };\n\n // Generate reflection if enabled\n if (this.metricsCollector && this.reflectionConfig?.enabled) {\n const metrics = this.metricsCollector.getMetrics(\n conversation.getMessages(),\n conversation.getMetadata().model\n );\n\n const generator = new ReflectionReportGenerator(this.logger);\n result.reflection = generator.generate(metrics, result);\n\n // Save reflection if output path specified\n if (this.reflectionConfig.outputPath && result.reflection) {\n await this.saveReflection(result.reflection, this.reflectionConfig);\n }\n }\n\n await strategy.onComplete?.(result);\n\n this.logger.info('Strategy execution complete', {\n iterations: result.totalIterations,\n toolCalls: result.toolCallsExecuted,\n duration\n });\n\n return result;\n\n } catch (error) {\n this.logger.error('Strategy execution failed', { error });\n\n return {\n finalMessage: conversation.getLastMessage(),\n phases: [],\n totalIterations: state.iteration,\n toolCallsExecuted: state.toolCallsExecuted,\n duration: Date.now() - startTime,\n success: false,\n conversation,\n };\n }\n }\n\n /**\n * Save reflection report\n */\n private async saveReflection(\n reflection: ReflectionReport,\n config: ReflectionConfig\n ): Promise<void> {\n if (!config.outputPath) {\n return;\n }\n\n try {\n const fs = await import('fs/promises');\n const path = await import('path');\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `reflection-${timestamp}.${config.format === 'json' ? 'json' : 'md'}`;\n const fullPath = path.join(config.outputPath, filename);\n\n // Ensure directory exists\n await fs.mkdir(config.outputPath, { recursive: true });\n\n // Save based on format\n if (config.format === 'json') {\n await fs.writeFile(fullPath, JSON.stringify(reflection, null, 2), 'utf-8');\n } else {\n const generator = new ReflectionReportGenerator(this.logger);\n const markdown = generator.formatMarkdown(reflection);\n await fs.writeFile(fullPath, markdown, 'utf-8');\n }\n\n this.logger.info('Reflection saved', { path: fullPath });\n } catch (error) {\n this.logger.error('Failed to save reflection', { error });\n }\n }\n\n /**\n * Execute a single phase\n */\n private async executePhase(\n conversation: ConversationBuilder,\n tools: ToolRegistry,\n phase: StrategyPhase,\n state: StrategyState,\n strategy: IterationStrategy\n ): Promise<PhaseResult> {\n const phaseStartTools = state.toolCallsExecuted;\n\n // Add phase instructions if provided\n if (phase.instructions) {\n conversation.asUser(phase.instructions);\n }\n\n // Iteration loop for this phase\n for (let i = 0; i < phase.maxIterations; i++) {\n state.iteration++;\n\n // Track iteration for metrics\n if (this.metricsCollector) {\n this.metricsCollector.incrementIteration();\n }\n\n this.logger.debug('Iteration', { phase: phase.name, iteration: i + 1 });\n\n // Check iteration hook\n const action = await strategy.onIteration?.(i, state);\n if (action === 'stop') {\n break;\n }\n if (action === 'next-phase') {\n break;\n }\n\n // Get LLM response\n const toolsToProvide = phase.toolUsage !== 'forbidden' ? tools.toOpenAIFormat() : undefined;\n const response = await this.llm.complete(\n conversation.toMessages(),\n toolsToProvide\n );\n\n // Handle tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n if (phase.toolUsage === 'forbidden') {\n this.logger.warn('Tool calls requested but forbidden in this phase');\n conversation.asAssistant(response.content);\n continue;\n }\n\n conversation.asAssistant(response.content, response.tool_calls);\n\n // Execute tools\n for (const toolCall of response.tool_calls) {\n // Check if tool is allowed in this phase\n if (phase.allowedTools && !phase.allowedTools.includes(toolCall.function.name)) {\n this.logger.debug('Tool not allowed in phase', { tool: toolCall.function.name });\n continue;\n }\n\n // Circuit breaker: Check if tool has exceeded failure threshold\n const maxFailures = phase.maxConsecutiveToolFailures ?? 3;\n const consecutiveFailures = state.toolFailures.get(toolCall.function.name) || 0;\n if (consecutiveFailures >= maxFailures) {\n this.logger.warn('Tool circuit breaker triggered', {\n tool: toolCall.function.name,\n failures: consecutiveFailures\n });\n conversation.asTool(toolCall.id, {\n error: `Tool temporarily disabled due to ${consecutiveFailures} consecutive failures`\n }, {\n success: false,\n circuitBreakerTriggered: true\n });\n continue;\n }\n\n // Check tool call hook\n const toolAction = await strategy.onToolCall?.(toolCall, state);\n if (toolAction === 'skip') {\n continue;\n }\n\n // Execute tool\n const toolStart = Date.now();\n try {\n // Parse tool arguments with error handling\n let toolArgs: any;\n try {\n toolArgs = JSON.parse(toolCall.function.arguments);\n } catch (parseError) {\n const error = new Error(\n `Invalid JSON in tool arguments for ${toolCall.function.name}: ${\n parseError instanceof Error ? parseError.message : String(parseError)\n }`\n );\n if (parseError instanceof Error) {\n (error as any).cause = parseError; // Preserve original error\n }\n throw error;\n }\n\n const result = await tools.execute(\n toolCall.function.name,\n toolArgs\n );\n\n const toolDuration = Date.now() - toolStart;\n\n const toolResult: ToolResult = {\n callId: toolCall.id,\n toolName: toolCall.function.name,\n result,\n duration: toolDuration,\n };\n\n conversation.asTool(toolCall.id, result, {\n duration: toolDuration,\n success: true\n });\n\n state.toolCallsExecuted++;\n\n // Reset failure counter on success\n state.toolFailures.set(toolCall.function.name, 0);\n\n // Record metrics\n if (this.metricsCollector) {\n this.metricsCollector.recordToolCall(\n toolCall.function.name,\n state.iteration,\n toolDuration,\n true\n );\n }\n\n await strategy.onToolResult?.(toolResult, state);\n\n } catch (error) {\n this.logger.error('Tool execution failed', { tool: toolCall.function.name, error });\n\n const toolDuration = Date.now() - toolStart;\n\n const toolResult: ToolResult = {\n callId: toolCall.id,\n toolName: toolCall.function.name,\n result: null,\n error: error as Error,\n duration: toolDuration,\n };\n\n conversation.asTool(toolCall.id, {\n error: (error as Error).message\n }, {\n success: false,\n errorName: (error as Error).name\n });\n\n state.errors.push(error as Error);\n\n // Increment failure counter for circuit breaker\n const failures = (state.toolFailures.get(toolCall.function.name) || 0) + 1;\n state.toolFailures.set(toolCall.function.name, failures);\n\n // Record metrics\n if (this.metricsCollector) {\n this.metricsCollector.recordToolCall(\n toolCall.function.name,\n state.iteration,\n toolDuration,\n false,\n (error as Error).message\n );\n }\n\n await strategy.onToolResult?.(toolResult, state);\n }\n }\n\n } else {\n // No tool calls - add response and potentially end phase\n conversation.asAssistant(response.content);\n\n // Check if this phase requires tool calls\n if (phase.toolUsage === 'required' && state.toolCallsExecuted === phaseStartTools) {\n this.logger.warn('No tools used but required in phase');\n // Continue to try again\n } else if (phase.earlyExit !== false) {\n // Exit phase early if we got a response without tools\n break;\n }\n }\n\n // Check phase completion conditions\n const toolCallsInPhase = state.toolCallsExecuted - phaseStartTools;\n\n if (phase.minToolCalls && toolCallsInPhase < phase.minToolCalls) {\n continue; // Need more tool calls\n }\n\n if (phase.maxToolCalls && toolCallsInPhase >= phase.maxToolCalls) {\n break; // Hit max tool calls for phase\n }\n\n if (phase.continueIf && !phase.continueIf(state)) {\n break; // Condition not met\n }\n }\n\n return {\n name: phase.name,\n iterations: state.iteration,\n toolCalls: state.toolCallsExecuted - phaseStartTools,\n success: true,\n insights: state.insights,\n };\n }\n}\n\n// ===== PRE-BUILT STRATEGIES =====\n\n/**\n * Factory for creating iteration strategies\n */\nexport class IterationStrategyFactory {\n /**\n * Investigate then respond strategy\n * Phase 1: Use tools to gather information\n * Phase 2: Synthesize into final answer\n */\n static investigateThenRespond(config: {\n maxInvestigationSteps?: number;\n requireMinimumTools?: number;\n finalSynthesis?: boolean;\n } = {}): IterationStrategy {\n const {\n maxInvestigationSteps = 5,\n requireMinimumTools = 1,\n finalSynthesis = true,\n } = config;\n\n return {\n name: 'investigate-then-respond',\n description: 'Investigate using tools, then synthesize findings',\n maxIterations: maxInvestigationSteps + (finalSynthesis ? 1 : 0),\n phases: [\n {\n name: 'investigate',\n maxIterations: maxInvestigationSteps,\n toolUsage: 'encouraged',\n minToolCalls: requireMinimumTools,\n earlyExit: false,\n },\n ...(finalSynthesis ? [{\n name: 'respond',\n maxIterations: 1,\n toolUsage: 'forbidden' as ToolUsagePolicy,\n instructions: 'Based on your investigation, provide a comprehensive answer.',\n requireFinalAnswer: true,\n }] : []),\n ],\n };\n }\n\n /**\n * Multi-pass refinement strategy\n * Generate, critique, refine repeatedly\n */\n static multiPassRefinement(config: {\n passes?: number;\n critiqueBetweenPasses?: boolean;\n improvementThreshold?: number;\n } = {}): IterationStrategy {\n const {\n passes = 3,\n critiqueBetweenPasses = true,\n } = config;\n\n const phases: StrategyPhase[] = [];\n\n for (let i = 0; i < passes; i++) {\n phases.push({\n name: `pass-${i + 1}`,\n maxIterations: 1,\n toolUsage: 'optional',\n instructions: i === 0\n ? 'Generate your best response'\n : 'Refine your previous response based on the critique',\n });\n\n if (critiqueBetweenPasses && i < passes - 1) {\n phases.push({\n name: `critique-${i + 1}`,\n maxIterations: 1,\n toolUsage: 'forbidden',\n instructions: 'Critique the previous response. What can be improved?',\n });\n }\n }\n\n return {\n name: 'multi-pass-refinement',\n description: 'Iteratively refine response through multiple passes',\n maxIterations: passes * 2,\n phases,\n };\n }\n\n /**\n * Breadth-first investigation\n * Explore broadly before going deep\n */\n static breadthFirst(config: {\n levelsDeep?: number;\n toolsPerLevel?: number;\n } = {}): IterationStrategy {\n const {\n levelsDeep = 3,\n toolsPerLevel = 4,\n } = config;\n\n const phases: StrategyPhase[] = [];\n\n for (let level = 0; level < levelsDeep; level++) {\n phases.push({\n name: `level-${level + 1}`,\n maxIterations: toolsPerLevel,\n toolUsage: 'encouraged',\n minToolCalls: 1,\n maxToolCalls: toolsPerLevel,\n instructions: level === 0\n ? 'Get a broad overview'\n : `Dive deeper into areas discovered in level ${level}`,\n });\n }\n\n return {\n name: 'breadth-first',\n description: 'Explore broadly at each level before going deeper',\n maxIterations: levelsDeep * toolsPerLevel,\n phases,\n };\n }\n\n /**\n * Depth-first investigation\n * Deep dive immediately\n */\n static depthFirst(config: {\n maxDepth?: number;\n backtrackOnFailure?: boolean;\n } = {}): IterationStrategy {\n const {\n maxDepth = 5,\n backtrackOnFailure = true,\n } = config;\n\n return {\n name: 'depth-first',\n description: 'Deep dive investigation path',\n maxIterations: maxDepth,\n phases: [{\n name: 'deep-dive',\n maxIterations: maxDepth,\n toolUsage: 'encouraged',\n adaptiveDepth: true,\n }],\n shouldContinue: (state) => {\n // Continue if making progress\n if (backtrackOnFailure && state.errors.length > 2) {\n return false;\n }\n return true;\n },\n };\n }\n\n /**\n * Adaptive strategy\n * Changes behavior based on progress\n */\n static adaptive(_config: {\n strategies?: IterationStrategy[];\n switchConditions?: Array<{\n when: (state: StrategyState) => boolean;\n switchTo: number;\n }>;\n } = {}): IterationStrategy {\n return {\n name: 'adaptive',\n description: 'Adapts strategy based on progress',\n maxIterations: 20,\n onIteration: async (iteration, state) => {\n // Change behavior based on iteration count\n if (iteration < 5) {\n // Early: broad exploration\n return 'continue';\n } else if (iteration < 15) {\n // Mid: focused investigation\n return 'continue';\n } else {\n // Late: wrap up\n return state.toolCallsExecuted > 0 ? 'continue' : 'stop';\n }\n },\n };\n }\n\n /**\n * Simple iteration (basic tool-use loop)\n */\n static simple(config: {\n maxIterations?: number;\n allowTools?: boolean;\n } = {}): IterationStrategy {\n const {\n maxIterations = 10,\n allowTools = true,\n } = config;\n\n return {\n name: 'simple',\n description: 'Simple iteration loop',\n maxIterations,\n phases: [{\n name: 'main',\n maxIterations,\n toolUsage: allowTools ? 'encouraged' : 'forbidden',\n earlyExit: true,\n }],\n };\n }\n}\n\nexport default IterationStrategyFactory;\n\n"],"names":["StrategyExecutor","withReflection","config","reflectionConfig","execute","conversation","tools","strategy","startTime","Date","now","enabled","metricsCollector","MetricsCollector","logger","state","phase","iteration","toolCallsExecuted","insights","findings","errors","toolFailures","Map","info","name","context","llm","onStart","phases","maxIterations","toolUsage","phaseResults","skipIf","debug","phaseResult","executePhase","push","onPhaseComplete","shouldContinue","duration","result","finalMessage","getLastMessage","totalIterations","success","metrics","getMetrics","getMessages","getMetadata","model","generator","ReflectionReportGenerator","reflection","generate","outputPath","saveReflection","onComplete","iterations","toolCalls","error","fs","path","timestamp","toISOString","replace","filename","format","fullPath","join","mkdir","recursive","writeFile","JSON","stringify","markdown","formatMarkdown","phaseStartTools","instructions","asUser","i","incrementIteration","action","onIteration","toolsToProvide","toOpenAIFormat","undefined","response","complete","toMessages","tool_calls","length","warn","asAssistant","content","toolCall","allowedTools","includes","function","tool","maxFailures","maxConsecutiveToolFailures","consecutiveFailures","get","failures","asTool","id","circuitBreakerTriggered","toolAction","onToolCall","toolStart","toolArgs","parse","arguments","parseError","Error","message","String","cause","toolDuration","toolResult","callId","toolName","set","recordToolCall","onToolResult","errorName","earlyExit","toolCallsInPhase","minToolCalls","maxToolCalls","continueIf","wrapLogger","DEFAULT_LOGGER","IterationStrategyFactory","investigateThenRespond","maxInvestigationSteps","requireMinimumTools","finalSynthesis","description","requireFinalAnswer","multiPassRefinement","passes","critiqueBetweenPasses","breadthFirst","levelsDeep","toolsPerLevel","level","depthFirst","maxDepth","backtrackOnFailure","adaptiveDepth","adaptive","_config","simple","allowTools"],"mappings":";;;;;;;;;;;;;;;;AAmJA;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBC,IACM,MAAMA,gBAAAA,CAAAA;AAWT;;QAGAC,cAAAA,CAAeC,MAAwB,EAAQ;QAC3C,IAAI,CAACC,gBAAgB,GAAGD,MAAAA;AACxB,QAAA,OAAO,IAAI;AACf,IAAA;AAEA;;AAEC,QACD,MAAME,OAAAA,CACFC,YAAiC,EACjCC,KAAmB,EACnBC,QAA2B,EACJ;AAInB,QAAA,IAAA,sBAAA;QAHJ,MAAMC,SAAAA,GAAYC,KAAKC,GAAG,EAAA;;QAG1B,IAAA,CAAI,sBAAA,GAAA,IAAI,CAACP,gBAAgB,cAArB,sBAAA,KAAA,MAAA,GAAA,MAAA,GAAA,sBAAA,CAAuBQ,OAAO,EAAE;AAChC,YAAA,IAAI,CAACC,gBAAgB,GAAG,IAAIC,gBAAAA,CAAiB,IAAI,CAACC,MAAM,CAAA;AAC5D,QAAA;AAEA,QAAA,MAAMC,KAAAA,GAAuB;YACzBC,KAAAA,EAAO,CAAA;YACPC,SAAAA,EAAW,CAAA;YACXC,iBAAAA,EAAmB,CAAA;AACnBV,YAAAA,SAAAA;AACAW,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,QAAAA,EAAU,EAAE;AACZC,YAAAA,MAAAA,EAAQ,EAAE;AACVC,YAAAA,YAAAA,EAAc,IAAIC,GAAAA;AACtB,SAAA;AAEA,QAAA,IAAI,CAACT,MAAM,CAACU,IAAI,CAAC,6BAAA,EAA+B;AAAEjB,YAAAA,QAAAA,EAAUA,SAASkB;AAAK,SAAA,CAAA;AAE1E,QAAA,MAAMC,OAAAA,GAA2B;AAAErB,YAAAA,YAAAA;AAAcC,YAAAA,KAAAA;YAAOqB,GAAAA,EAAK,IAAI,CAACA,GAAG;AAAEZ,YAAAA;AAAM,SAAA;QAE7E,IAAI;AAEMR,YAAAA,IAAAA,iBAAAA,EAyDuB,uBAAA,EAevBA,oBAAAA;;AAxEN,YAAA,OAAA,CAAMA,oBAAAA,QAAAA,CAASqB,OAAO,MAAA,IAAA,IAAhBrB,iBAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,uBAAAA,QAAAA,EAAmBmB,OAAAA,CAAAA,CAAAA;;YAGzB,MAAMG,MAAAA,GAAStB,QAAAA,CAASsB,MAAM,IAAI;AAC9B,gBAAA;oBACIJ,IAAAA,EAAM,SAAA;AACNK,oBAAAA,aAAAA,EAAevB,SAASuB,aAAa;oBACrCC,SAAAA,EAAW;AACf;AACH,aAAA;AAED,YAAA,MAAMC,eAA8B,EAAE;YAEtC,KAAK,MAAMhB,SAASa,MAAAA,CAAQ;oBAEpBb,aAAAA,EAoBET,yBAAAA;;AApBN,gBAAA,IAAA,CAAIS,gBAAAA,KAAAA,CAAMiB,MAAM,cAAZjB,aAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,aAAAA,CAAAA,IAAAA,CAAAA,OAAeD,KAAAA,CAAAA,EAAQ;AACvB,oBAAA,IAAI,CAACD,MAAM,CAACoB,KAAK,CAAC,gBAAA,EAAkB;AAAElB,wBAAAA,KAAAA,EAAOA,MAAMS;AAAK,qBAAA,CAAA;AACxD,oBAAA;AACJ,gBAAA;gBAEAV,KAAAA,CAAMC,KAAK,GAAGA,KAAAA,CAAMS,IAAI;AACxBV,gBAAAA,KAAAA,CAAME,SAAS,GAAG,CAAA;AAElB,gBAAA,IAAI,CAACH,MAAM,CAACoB,KAAK,CAAC,gBAAA,EAAkB;AAAElB,oBAAAA,KAAAA,EAAOA,MAAMS;AAAK,iBAAA,CAAA;gBAExD,MAAMU,WAAAA,GAAc,MAAM,IAAI,CAACC,YAAY,CACvC/B,YAAAA,EACAC,KAAAA,EACAU,KAAAA,EACAD,KAAAA,EACAR,QAAAA,CAAAA;AAGJyB,gBAAAA,YAAAA,CAAaK,IAAI,CAACF,WAAAA,CAAAA;AAElB,gBAAA,OAAA,CAAM5B,4BAAAA,QAAAA,CAAS+B,eAAe,cAAxB/B,yBAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,yBAAAA,CAAAA,IAAAA,CAAAA,UAA2B4B,WAAAA,EAAapB,KAAAA,CAAAA,CAAAA;;AAG9C,gBAAA,IAAIR,SAASgC,cAAc,IAAI,CAAChC,QAAAA,CAASgC,cAAc,CAACxB,KAAAA,CAAAA,EAAQ;AAC5D,oBAAA,IAAI,CAACD,MAAM,CAACoB,KAAK,CAAC,0BAAA,CAAA;AAClB,oBAAA;AACJ,gBAAA;AACJ,YAAA;YAEA,MAAMM,QAAAA,GAAW/B,IAAAA,CAAKC,GAAG,EAAA,GAAKF,SAAAA;AAE9B,YAAA,MAAMiC,MAAAA,GAAyB;AAC3BC,gBAAAA,YAAAA,EAAcrC,aAAasC,cAAc,EAAA;gBACzCd,MAAAA,EAAQG,YAAAA;AACRY,gBAAAA,eAAAA,EAAiB7B,MAAME,SAAS;AAChCC,gBAAAA,iBAAAA,EAAmBH,MAAMG,iBAAiB;AAC1CsB,gBAAAA,QAAAA;gBACAK,OAAAA,EAAS,IAAA;AACTxC,gBAAAA;AACJ,aAAA;;AAGA,YAAA,IAAI,IAAI,CAACO,gBAAgB,KAAA,CAAI,uBAAA,GAAA,IAAI,CAACT,gBAAgB,MAAA,IAAA,IAArB,uBAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,uBAAA,CAAuBQ,OAAO,CAAA,EAAE;AACzD,gBAAA,MAAMmC,OAAAA,GAAU,IAAI,CAAClC,gBAAgB,CAACmC,UAAU,CAC5C1C,YAAAA,CAAa2C,WAAW,EAAA,EACxB3C,YAAAA,CAAa4C,WAAW,GAAGC,KAAK,CAAA;AAGpC,gBAAA,MAAMC,SAAAA,GAAY,IAAIC,yBAAAA,CAA0B,IAAI,CAACtC,MAAM,CAAA;AAC3D2B,gBAAAA,MAAAA,CAAOY,UAAU,GAAGF,SAAAA,CAAUG,QAAQ,CAACR,OAAAA,EAASL,MAAAA,CAAAA;;gBAGhD,IAAI,IAAI,CAACtC,gBAAgB,CAACoD,UAAU,IAAId,MAAAA,CAAOY,UAAU,EAAE;oBACvD,MAAM,IAAI,CAACG,cAAc,CAACf,OAAOY,UAAU,EAAE,IAAI,CAAClD,gBAAgB,CAAA;AACtE,gBAAA;AACJ,YAAA;AAEA,YAAA,OAAA,CAAMI,uBAAAA,QAAAA,CAASkD,UAAU,MAAA,IAAA,IAAnBlD,oBAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,0BAAAA,QAAAA,EAAsBkC,MAAAA,CAAAA,CAAAA;AAE5B,YAAA,IAAI,CAAC3B,MAAM,CAACU,IAAI,CAAC,6BAAA,EAA+B;AAC5CkC,gBAAAA,UAAAA,EAAYjB,OAAOG,eAAe;AAClCe,gBAAAA,SAAAA,EAAWlB,OAAOvB,iBAAiB;AACnCsB,gBAAAA;AACJ,aAAA,CAAA;YAEA,OAAOC,MAAAA;AAEX,QAAA,CAAA,CAAE,OAAOmB,KAAAA,EAAO;AACZ,YAAA,IAAI,CAAC9C,MAAM,CAAC8C,KAAK,CAAC,2BAAA,EAA6B;AAAEA,gBAAAA;AAAM,aAAA,CAAA;YAEvD,OAAO;AACHlB,gBAAAA,YAAAA,EAAcrC,aAAasC,cAAc,EAAA;AACzCd,gBAAAA,MAAAA,EAAQ,EAAE;AACVe,gBAAAA,eAAAA,EAAiB7B,MAAME,SAAS;AAChCC,gBAAAA,iBAAAA,EAAmBH,MAAMG,iBAAiB;gBAC1CsB,QAAAA,EAAU/B,IAAAA,CAAKC,GAAG,EAAA,GAAKF,SAAAA;gBACvBqC,OAAAA,EAAS,KAAA;AACTxC,gBAAAA;AACJ,aAAA;AACJ,QAAA;AACJ,IAAA;AAEA;;AAEC,QACD,MAAcmD,cAAAA,CACVH,UAA4B,EAC5BnD,MAAwB,EACX;QACb,IAAI,CAACA,MAAAA,CAAOqD,UAAU,EAAE;AACpB,YAAA;AACJ,QAAA;QAEA,IAAI;YACA,MAAMM,EAAAA,GAAK,MAAM,OAAO,aAAA,CAAA;YACxB,MAAMC,IAAAA,GAAO,MAAM,OAAO,MAAA,CAAA;AAE1B,YAAA,MAAMC,YAAY,IAAItD,IAAAA,EAAAA,CAAOuD,WAAW,EAAA,CAAGC,OAAO,CAAC,OAAA,EAAS,GAAA,CAAA;AAC5D,YAAA,MAAMC,QAAAA,GAAW,CAAC,WAAW,EAAEH,SAAAA,CAAU,CAAC,EAAE7D,MAAAA,CAAOiE,MAAM,KAAK,MAAA,GAAS,MAAA,GAAS,IAAA,CAAA,CAAM;AACtF,YAAA,MAAMC,WAAWN,IAAAA,CAAKO,IAAI,CAACnE,MAAAA,CAAOqD,UAAU,EAAEW,QAAAA,CAAAA;;AAG9C,YAAA,MAAML,EAAAA,CAAGS,KAAK,CAACpE,MAAAA,CAAOqD,UAAU,EAAE;gBAAEgB,SAAAA,EAAW;AAAK,aAAA,CAAA;;YAGpD,IAAIrE,MAAAA,CAAOiE,MAAM,KAAK,MAAA,EAAQ;gBAC1B,MAAMN,EAAAA,CAAGW,SAAS,CAACJ,QAAAA,EAAUK,KAAKC,SAAS,CAACrB,UAAAA,EAAY,IAAA,EAAM,CAAA,CAAA,EAAI,OAAA,CAAA;YACtE,CAAA,MAAO;AACH,gBAAA,MAAMF,SAAAA,GAAY,IAAIC,yBAAAA,CAA0B,IAAI,CAACtC,MAAM,CAAA;gBAC3D,MAAM6D,QAAAA,GAAWxB,SAAAA,CAAUyB,cAAc,CAACvB,UAAAA,CAAAA;AAC1C,gBAAA,MAAMQ,EAAAA,CAAGW,SAAS,CAACJ,QAAAA,EAAUO,QAAAA,EAAU,OAAA,CAAA;AAC3C,YAAA;AAEA,YAAA,IAAI,CAAC7D,MAAM,CAACU,IAAI,CAAC,kBAAA,EAAoB;gBAAEsC,IAAAA,EAAMM;AAAS,aAAA,CAAA;AAC1D,QAAA,CAAA,CAAE,OAAOR,KAAAA,EAAO;AACZ,YAAA,IAAI,CAAC9C,MAAM,CAAC8C,KAAK,CAAC,2BAAA,EAA6B;AAAEA,gBAAAA;AAAM,aAAA,CAAA;AAC3D,QAAA;AACJ,IAAA;AAEA;;QAGA,MAAcxB,YAAAA,CACV/B,YAAiC,EACjCC,KAAmB,EACnBU,KAAoB,EACpBD,KAAoB,EACpBR,QAA2B,EACP;QACpB,MAAMsE,eAAAA,GAAkB9D,MAAMG,iBAAiB;;QAG/C,IAAIF,KAAAA,CAAM8D,YAAY,EAAE;YACpBzE,YAAAA,CAAa0E,MAAM,CAAC/D,KAAAA,CAAM8D,YAAY,CAAA;AAC1C,QAAA;;AAGA,QAAA,IAAK,IAAIE,CAAAA,GAAI,CAAA,EAAGA,IAAIhE,KAAAA,CAAMc,aAAa,EAAEkD,CAAAA,EAAAA,CAAK;AAWrBzE,YAAAA,IAAAA,qBAAAA;AAVrBQ,YAAAA,KAAAA,CAAME,SAAS,EAAA;;YAGf,IAAI,IAAI,CAACL,gBAAgB,EAAE;gBACvB,IAAI,CAACA,gBAAgB,CAACqE,kBAAkB,EAAA;AAC5C,YAAA;AAEA,YAAA,IAAI,CAACnE,MAAM,CAACoB,KAAK,CAAC,WAAA,EAAa;AAAElB,gBAAAA,KAAAA,EAAOA,MAAMS,IAAI;AAAER,gBAAAA,SAAAA,EAAW+D,CAAAA,GAAI;AAAE,aAAA,CAAA;;YAGrE,MAAME,MAAAA,GAAS,QAAM3E,qBAAAA,GAAAA,QAAAA,CAAS4E,WAAW,MAAA,IAAA,IAApB5E,qBAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,qBAAAA,CAAAA,IAAAA,CAAAA,QAAAA,EAAuByE,CAAAA,EAAGjE,KAAAA,CAAAA,CAAAA;AAC/C,YAAA,IAAImE,WAAW,MAAA,EAAQ;AACnB,gBAAA;AACJ,YAAA;AACA,YAAA,IAAIA,WAAW,YAAA,EAAc;AACzB,gBAAA;AACJ,YAAA;;AAGA,YAAA,MAAME,iBAAiBpE,KAAAA,CAAMe,SAAS,KAAK,WAAA,GAAczB,KAAAA,CAAM+E,cAAc,EAAA,GAAKC,SAAAA;YAClF,MAAMC,QAAAA,GAAW,MAAM,IAAI,CAAC5D,GAAG,CAAC6D,QAAQ,CACpCnF,YAAAA,CAAaoF,UAAU,EAAA,EACvBL,cAAAA,CAAAA;;YAIJ,IAAIG,QAAAA,CAASG,UAAU,IAAIH,QAAAA,CAASG,UAAU,CAACC,MAAM,GAAG,CAAA,EAAG;gBACvD,IAAI3E,KAAAA,CAAMe,SAAS,KAAK,WAAA,EAAa;AACjC,oBAAA,IAAI,CAACjB,MAAM,CAAC8E,IAAI,CAAC,kDAAA,CAAA;oBACjBvF,YAAAA,CAAawF,WAAW,CAACN,QAAAA,CAASO,OAAO,CAAA;AACzC,oBAAA;AACJ,gBAAA;AAEAzF,gBAAAA,YAAAA,CAAawF,WAAW,CAACN,QAAAA,CAASO,OAAO,EAAEP,SAASG,UAAU,CAAA;;AAG9D,gBAAA,KAAK,MAAMK,QAAAA,IAAYR,QAAAA,CAASG,UAAU,CAAE;AAQpB1E,oBAAAA,IAAAA,iCAAAA;AAiBKT,oBAAAA,IAAAA,oBAAAA;;AAvBzB,oBAAA,IAAIS,KAAAA,CAAMgF,YAAY,IAAI,CAAChF,KAAAA,CAAMgF,YAAY,CAACC,QAAQ,CAACF,QAAAA,CAASG,QAAQ,CAACzE,IAAI,CAAA,EAAG;AAC5E,wBAAA,IAAI,CAACX,MAAM,CAACoB,KAAK,CAAC,2BAAA,EAA6B;4BAAEiE,IAAAA,EAAMJ,QAAAA,CAASG,QAAQ,CAACzE;AAAK,yBAAA,CAAA;AAC9E,wBAAA;AACJ,oBAAA;;AAGA,oBAAA,MAAM2E,eAAcpF,iCAAAA,GAAAA,KAAAA,CAAMqF,0BAA0B,MAAA,IAAA,IAAhCrF,+CAAAA,iCAAAA,GAAoC,CAAA;oBACxD,MAAMsF,mBAAAA,GAAsBvF,KAAAA,CAAMO,YAAY,CAACiF,GAAG,CAACR,QAAAA,CAASG,QAAQ,CAACzE,IAAI,CAAA,IAAK,CAAA;AAC9E,oBAAA,IAAI6E,uBAAuBF,WAAAA,EAAa;AACpC,wBAAA,IAAI,CAACtF,MAAM,CAAC8E,IAAI,CAAC,gCAAA,EAAkC;4BAC/CO,IAAAA,EAAMJ,QAAAA,CAASG,QAAQ,CAACzE,IAAI;4BAC5B+E,QAAAA,EAAUF;AACd,yBAAA,CAAA;AACAjG,wBAAAA,YAAAA,CAAaoG,MAAM,CAACV,QAAAA,CAASW,EAAE,EAAE;AAC7B9C,4BAAAA,KAAAA,EAAO,CAAC,iCAAiC,EAAE0C,mBAAAA,CAAoB,qBAAqB;yBACxF,EAAG;4BACCzD,OAAAA,EAAS,KAAA;4BACT8D,uBAAAA,EAAyB;AAC7B,yBAAA,CAAA;AACA,wBAAA;AACJ,oBAAA;;oBAGA,MAAMC,UAAAA,GAAa,QAAMrG,oBAAAA,GAAAA,QAAAA,CAASsG,UAAU,MAAA,IAAA,IAAnBtG,oBAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,oBAAAA,CAAAA,IAAAA,CAAAA,QAAAA,EAAsBwF,QAAAA,EAAUhF,KAAAA,CAAAA,CAAAA;AACzD,oBAAA,IAAI6F,eAAe,MAAA,EAAQ;AACvB,wBAAA;AACJ,oBAAA;;oBAGA,MAAME,SAAAA,GAAYrG,KAAKC,GAAG,EAAA;oBAC1B,IAAI;AAmDMH,wBAAAA,IAAAA,sBAAAA;;wBAjDN,IAAIwG,QAAAA;wBACJ,IAAI;AACAA,4BAAAA,QAAAA,GAAWtC,KAAKuC,KAAK,CAACjB,QAAAA,CAASG,QAAQ,CAACe,SAAS,CAAA;AACrD,wBAAA,CAAA,CAAE,OAAOC,UAAAA,EAAY;AACjB,4BAAA,MAAMtD,QAAQ,IAAIuD,KAAAA,CACd,CAAC,mCAAmC,EAAEpB,SAASG,QAAQ,CAACzE,IAAI,CAAC,EAAE,EAC3DyF,UAAAA,YAAsBC,KAAAA,GAAQD,WAAWE,OAAO,GAAGC,OAAOH,UAAAA,CAAAA,CAAAA,CAC5D,CAAA;AAEN,4BAAA,IAAIA,sBAAsBC,KAAAA,EAAO;gCAC5BvD,KAAAA,CAAc0D,KAAK,GAAGJ,UAAAA,CAAAA;AAC3B,4BAAA;4BACA,MAAMtD,KAAAA;AACV,wBAAA;wBAEA,MAAMnB,MAAAA,GAAS,MAAMnC,KAAAA,CAAMF,OAAO,CAC9B2F,QAAAA,CAASG,QAAQ,CAACzE,IAAI,EACtBsF,QAAAA,CAAAA;wBAGJ,MAAMQ,YAAAA,GAAe9G,IAAAA,CAAKC,GAAG,EAAA,GAAKoG,SAAAA;AAElC,wBAAA,MAAMU,UAAAA,GAAyB;AAC3BC,4BAAAA,MAAAA,EAAQ1B,SAASW,EAAE;4BACnBgB,QAAAA,EAAU3B,QAAAA,CAASG,QAAQ,CAACzE,IAAI;AAChCgB,4BAAAA,MAAAA;4BACAD,QAAAA,EAAU+E;AACd,yBAAA;AAEAlH,wBAAAA,YAAAA,CAAaoG,MAAM,CAACV,QAAAA,CAASW,EAAE,EAAEjE,MAAAA,EAAQ;4BACrCD,QAAAA,EAAU+E,YAAAA;4BACV1E,OAAAA,EAAS;AACb,yBAAA,CAAA;AAEA9B,wBAAAA,KAAAA,CAAMG,iBAAiB,EAAA;;wBAGvBH,KAAAA,CAAMO,YAAY,CAACqG,GAAG,CAAC5B,SAASG,QAAQ,CAACzE,IAAI,EAAE,CAAA,CAAA;;wBAG/C,IAAI,IAAI,CAACb,gBAAgB,EAAE;AACvB,4BAAA,IAAI,CAACA,gBAAgB,CAACgH,cAAc,CAChC7B,QAAAA,CAASG,QAAQ,CAACzE,IAAI,EACtBV,KAAAA,CAAME,SAAS,EACfsG,YAAAA,EACA,IAAA,CAAA;AAER,wBAAA;AAEA,wBAAA,OAAA,CAAMhH,yBAAAA,QAAAA,CAASsH,YAAY,cAArBtH,sBAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,sBAAAA,CAAAA,IAAAA,CAAAA,UAAwBiH,UAAAA,EAAYzG,KAAAA,CAAAA,CAAAA;AAE9C,oBAAA,CAAA,CAAE,OAAO6C,KAAAA,EAAO;AAqCNrD,wBAAAA,IAAAA,uBAAAA;AApCN,wBAAA,IAAI,CAACO,MAAM,CAAC8C,KAAK,CAAC,uBAAA,EAAyB;4BAAEuC,IAAAA,EAAMJ,QAAAA,CAASG,QAAQ,CAACzE,IAAI;AAAEmC,4BAAAA;AAAM,yBAAA,CAAA;wBAEjF,MAAM2D,YAAAA,GAAe9G,IAAAA,CAAKC,GAAG,EAAA,GAAKoG,SAAAA;AAElC,wBAAA,MAAMU,UAAAA,GAAyB;AAC3BC,4BAAAA,MAAAA,EAAQ1B,SAASW,EAAE;4BACnBgB,QAAAA,EAAU3B,QAAAA,CAASG,QAAQ,CAACzE,IAAI;4BAChCgB,MAAAA,EAAQ,IAAA;4BACRmB,KAAAA,EAAOA,KAAAA;4BACPpB,QAAAA,EAAU+E;AACd,yBAAA;AAEAlH,wBAAAA,YAAAA,CAAaoG,MAAM,CAACV,QAAAA,CAASW,EAAE,EAAE;4BAC7B9C,KAAAA,EAAQA,MAAgBwD;yBAC5B,EAAG;4BACCvE,OAAAA,EAAS,KAAA;4BACTiF,SAAAA,EAAYlE,MAAgBnC;AAChC,yBAAA,CAAA;wBAEAV,KAAAA,CAAMM,MAAM,CAACgB,IAAI,CAACuB,KAAAA,CAAAA;;AAGlB,wBAAA,MAAM4C,QAAAA,GAAYzF,CAAAA,KAAAA,CAAMO,YAAY,CAACiF,GAAG,CAACR,QAAAA,CAASG,QAAQ,CAACzE,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA;wBACzEV,KAAAA,CAAMO,YAAY,CAACqG,GAAG,CAAC5B,SAASG,QAAQ,CAACzE,IAAI,EAAE+E,QAAAA,CAAAA;;wBAG/C,IAAI,IAAI,CAAC5F,gBAAgB,EAAE;AACvB,4BAAA,IAAI,CAACA,gBAAgB,CAACgH,cAAc,CAChC7B,SAASG,QAAQ,CAACzE,IAAI,EACtBV,MAAME,SAAS,EACfsG,cACA,KAAA,EACC3D,MAAgBwD,OAAO,CAAA;AAEhC,wBAAA;AAEA,wBAAA,OAAA,CAAM7G,0BAAAA,QAAAA,CAASsH,YAAY,cAArBtH,uBAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,uBAAAA,CAAAA,IAAAA,CAAAA,UAAwBiH,UAAAA,EAAYzG,KAAAA,CAAAA,CAAAA;AAC9C,oBAAA;AACJ,gBAAA;YAEJ,CAAA,MAAO;;gBAEHV,YAAAA,CAAawF,WAAW,CAACN,QAAAA,CAASO,OAAO,CAAA;;AAGzC,gBAAA,IAAI9E,MAAMe,SAAS,KAAK,cAAchB,KAAAA,CAAMG,iBAAiB,KAAK2D,eAAAA,EAAiB;AAC/E,oBAAA,IAAI,CAAC/D,MAAM,CAAC8E,IAAI,CAAC,qCAAA,CAAA;;AAErB,gBAAA,CAAA,MAAO,IAAI5E,KAAAA,CAAM+G,SAAS,KAAK,KAAA,EAAO;AAElC,oBAAA;AACJ,gBAAA;AACJ,YAAA;;YAGA,MAAMC,gBAAAA,GAAmBjH,KAAAA,CAAMG,iBAAiB,GAAG2D,eAAAA;AAEnD,YAAA,IAAI7D,MAAMiH,YAAY,IAAID,gBAAAA,GAAmBhH,KAAAA,CAAMiH,YAAY,EAAE;AAC7D,gBAAA,SAAA;AACJ,YAAA;AAEA,YAAA,IAAIjH,MAAMkH,YAAY,IAAIF,gBAAAA,IAAoBhH,KAAAA,CAAMkH,YAAY,EAAE;AAC9D,gBAAA,MAAA;AACJ,YAAA;AAEA,YAAA,IAAIlH,MAAMmH,UAAU,IAAI,CAACnH,KAAAA,CAAMmH,UAAU,CAACpH,KAAAA,CAAAA,EAAQ;AAC9C,gBAAA,MAAA;AACJ,YAAA;AACJ,QAAA;QAEA,OAAO;AACHU,YAAAA,IAAAA,EAAMT,MAAMS,IAAI;AAChBiC,YAAAA,UAAAA,EAAY3C,MAAME,SAAS;YAC3B0C,SAAAA,EAAW5C,KAAAA,CAAMG,iBAAiB,GAAG2D,eAAAA;YACrChC,OAAAA,EAAS,IAAA;AACT1B,YAAAA,QAAAA,EAAUJ,MAAMI;AACpB,SAAA;AACJ,IAAA;IA7YA,WAAA,CAAYQ,GAAc,EAAEb,MAAY,CAAE;AAL1C,QAAA,gBAAA,CAAA,IAAA,EAAQa,OAAR,MAAA,CAAA;AACA,QAAA,gBAAA,CAAA,IAAA,EAAQb,UAAR,MAAA,CAAA;AACA,QAAA,gBAAA,CAAA,IAAA,EAAQF,oBAAR,MAAA,CAAA;AACA,QAAA,gBAAA,CAAA,IAAA,EAAQT,oBAAR,MAAA,CAAA;QAGI,IAAI,CAACwB,GAAG,GAAGA,GAAAA;AACX,QAAA,IAAI,CAACb,MAAM,GAAGsH,UAAAA,CAAWtH,UAAUuH,cAAAA,EAAgB,kBAAA,CAAA;AACvD,IAAA;AA2YJ;AAEA;AAEA;;AAEC,IACM,MAAMC,wBAAAA,CAAAA;AACT;;;;AAIC,QACD,OAAOC,sBAAAA,CAAuBrI,MAAAA,GAI1B,EAAE,EAAqB;QACvB,MAAM,EACFsI,qBAAAA,GAAwB,CAAC,EACzBC,mBAAAA,GAAsB,CAAC,EACvBC,cAAAA,GAAiB,IAAI,EACxB,GAAGxI,MAAAA;QAEJ,OAAO;YACHuB,IAAAA,EAAM,0BAAA;YACNkH,WAAAA,EAAa,mDAAA;AACb7G,YAAAA,aAAAA,EAAe0G,qBAAAA,IAAyBE,cAAAA,GAAiB,CAAA,GAAI,CAAA,CAAA;YAC7D7G,MAAAA,EAAQ;AACJ,gBAAA;oBACIJ,IAAAA,EAAM,aAAA;oBACNK,aAAAA,EAAe0G,qBAAAA;oBACfzG,SAAAA,EAAW,YAAA;oBACXkG,YAAAA,EAAcQ,mBAAAA;oBACdV,SAAAA,EAAW;AACf,iBAAA;mBACIW,cAAAA,GAAiB;AAAC,oBAAA;wBAClBjH,IAAAA,EAAM,SAAA;wBACNK,aAAAA,EAAe,CAAA;wBACfC,SAAAA,EAAW,WAAA;wBACX+C,YAAAA,EAAc,8DAAA;wBACd8D,kBAAAA,EAAoB;AACxB;AAAE,iBAAA,GAAG;AACR;AACL,SAAA;AACJ,IAAA;AAEA;;;AAGC,QACD,OAAOC,mBAAAA,CAAoB3I,MAAAA,GAIvB,EAAE,EAAqB;AACvB,QAAA,MAAM,EACF4I,MAAAA,GAAS,CAAC,EACVC,qBAAAA,GAAwB,IAAI,EAC/B,GAAG7I,MAAAA;AAEJ,QAAA,MAAM2B,SAA0B,EAAE;AAElC,QAAA,IAAK,IAAImD,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI8D,QAAQ9D,CAAAA,EAAAA,CAAK;AAC7BnD,YAAAA,MAAAA,CAAOQ,IAAI,CAAC;AACRZ,gBAAAA,IAAAA,EAAM,CAAC,KAAK,EAAEuD,CAAAA,GAAI,CAAA,CAAA,CAAG;gBACrBlD,aAAAA,EAAe,CAAA;gBACfC,SAAAA,EAAW,UAAA;gBACX+C,YAAAA,EAAcE,CAAAA,KAAM,IACd,6BAAA,GACA;AACV,aAAA,CAAA;YAEA,IAAI+D,qBAAAA,IAAyB/D,CAAAA,GAAI8D,MAAAA,GAAS,CAAA,EAAG;AACzCjH,gBAAAA,MAAAA,CAAOQ,IAAI,CAAC;AACRZ,oBAAAA,IAAAA,EAAM,CAAC,SAAS,EAAEuD,CAAAA,GAAI,CAAA,CAAA,CAAG;oBACzBlD,aAAAA,EAAe,CAAA;oBACfC,SAAAA,EAAW,WAAA;oBACX+C,YAAAA,EAAc;AAClB,iBAAA,CAAA;AACJ,YAAA;AACJ,QAAA;QAEA,OAAO;YACHrD,IAAAA,EAAM,uBAAA;YACNkH,WAAAA,EAAa,qDAAA;AACb7G,YAAAA,aAAAA,EAAegH,MAAAA,GAAS,CAAA;AACxBjH,YAAAA;AACJ,SAAA;AACJ,IAAA;AAEA;;;AAGC,QACD,OAAOmH,YAAAA,CAAa9I,MAAAA,GAGhB,EAAE,EAAqB;AACvB,QAAA,MAAM,EACF+I,UAAAA,GAAa,CAAC,EACdC,aAAAA,GAAgB,CAAC,EACpB,GAAGhJ,MAAAA;AAEJ,QAAA,MAAM2B,SAA0B,EAAE;AAElC,QAAA,IAAK,IAAIsH,KAAAA,GAAQ,CAAA,EAAGA,KAAAA,GAAQF,YAAYE,KAAAA,EAAAA,CAAS;AAC7CtH,YAAAA,MAAAA,CAAOQ,IAAI,CAAC;AACRZ,gBAAAA,IAAAA,EAAM,CAAC,MAAM,EAAE0H,KAAAA,GAAQ,CAAA,CAAA,CAAG;gBAC1BrH,aAAAA,EAAeoH,aAAAA;gBACfnH,SAAAA,EAAW,YAAA;gBACXkG,YAAAA,EAAc,CAAA;gBACdC,YAAAA,EAAcgB,aAAAA;AACdpE,gBAAAA,YAAAA,EAAcqE,UAAU,CAAA,GAClB,sBAAA,GACA,CAAC,2CAA2C,EAAEA,KAAAA,CAAAA;AACxD,aAAA,CAAA;AACJ,QAAA;QAEA,OAAO;YACH1H,IAAAA,EAAM,eAAA;YACNkH,WAAAA,EAAa,mDAAA;AACb7G,YAAAA,aAAAA,EAAemH,UAAAA,GAAaC,aAAAA;AAC5BrH,YAAAA;AACJ,SAAA;AACJ,IAAA;AAEA;;;AAGC,QACD,OAAOuH,UAAAA,CAAWlJ,MAAAA,GAGd,EAAE,EAAqB;AACvB,QAAA,MAAM,EACFmJ,QAAAA,GAAW,CAAC,EACZC,kBAAAA,GAAqB,IAAI,EAC5B,GAAGpJ,MAAAA;QAEJ,OAAO;YACHuB,IAAAA,EAAM,aAAA;YACNkH,WAAAA,EAAa,8BAAA;YACb7G,aAAAA,EAAeuH,QAAAA;YACfxH,MAAAA,EAAQ;AAAC,gBAAA;oBACLJ,IAAAA,EAAM,WAAA;oBACNK,aAAAA,EAAeuH,QAAAA;oBACftH,SAAAA,EAAW,YAAA;oBACXwH,aAAAA,EAAe;AACnB;AAAE,aAAA;AACFhH,YAAAA,cAAAA,EAAgB,CAACxB,KAAAA,GAAAA;;AAEb,gBAAA,IAAIuI,sBAAsBvI,KAAAA,CAAMM,MAAM,CAACsE,MAAM,GAAG,CAAA,EAAG;oBAC/C,OAAO,KAAA;AACX,gBAAA;gBACA,OAAO,IAAA;AACX,YAAA;AACJ,SAAA;AACJ,IAAA;AAEA;;;AAGC,QACD,OAAO6D,QAAAA,CAASC,OAAAA,GAMZ,EAAE,EAAqB;QACvB,OAAO;YACHhI,IAAAA,EAAM,UAAA;YACNkH,WAAAA,EAAa,mCAAA;YACb7G,aAAAA,EAAe,EAAA;AACfqD,YAAAA,WAAAA,EAAa,OAAOlE,SAAAA,EAAWF,KAAAA,GAAAA;;AAE3B,gBAAA,IAAIE,YAAY,CAAA,EAAG;;oBAEf,OAAO,UAAA;gBACX,CAAA,MAAO,IAAIA,YAAY,EAAA,EAAI;;oBAEvB,OAAO,UAAA;gBACX,CAAA,MAAO;;AAEH,oBAAA,OAAOF,KAAAA,CAAMG,iBAAiB,GAAG,CAAA,GAAI,UAAA,GAAa,MAAA;AACtD,gBAAA;AACJ,YAAA;AACJ,SAAA;AACJ,IAAA;AAEA;;AAEC,QACD,OAAOwI,MAAAA,CAAOxJ,MAAAA,GAGV,EAAE,EAAqB;AACvB,QAAA,MAAM,EACF4B,aAAAA,GAAgB,EAAE,EAClB6H,UAAAA,GAAa,IAAI,EACpB,GAAGzJ,MAAAA;QAEJ,OAAO;YACHuB,IAAAA,EAAM,QAAA;YACNkH,WAAAA,EAAa,uBAAA;AACb7G,YAAAA,aAAAA;YACAD,MAAAA,EAAQ;AAAC,gBAAA;oBACLJ,IAAAA,EAAM,MAAA;AACNK,oBAAAA,aAAAA;AACAC,oBAAAA,SAAAA,EAAW4H,aAAa,YAAA,GAAe,WAAA;oBACvC5B,SAAAA,EAAW;AACf;AAAE;AACN,SAAA;AACJ,IAAA;AACJ;;;;"}
|
package/dist/loader.js
CHANGED
|
@@ -63,7 +63,7 @@ const create = (loaderOptions)=>{
|
|
|
63
63
|
};
|
|
64
64
|
/**
|
|
65
65
|
* Loads context from the provided directories and returns instruction sections
|
|
66
|
-
*
|
|
66
|
+
*
|
|
67
67
|
* @param contextDirectories Directories containing context files
|
|
68
68
|
* @returns Array of instruction sections loaded from context directories
|
|
69
69
|
*/ const load = async (contextDirectories = [], options = {})=>{
|
|
@@ -115,8 +115,22 @@ const create = (loaderOptions)=>{
|
|
|
115
115
|
}
|
|
116
116
|
// Get all other files in the directory
|
|
117
117
|
const files = await storage.listFiles(contextDir);
|
|
118
|
-
const ignorePatternsRegex = ignorePatterns.map((pattern)=>
|
|
119
|
-
|
|
118
|
+
const ignorePatternsRegex = ignorePatterns.map((pattern)=>{
|
|
119
|
+
try {
|
|
120
|
+
return new RegExp(pattern, 'i');
|
|
121
|
+
} catch (error) {
|
|
122
|
+
logger.error(`Invalid ignore pattern: ${pattern}`, {
|
|
123
|
+
error
|
|
124
|
+
});
|
|
125
|
+
// Return a pattern that matches nothing
|
|
126
|
+
return /(?!)/; // Negative lookahead that always fails
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
const filteredFiles = files.filter((file)=>{
|
|
130
|
+
const fullPath = path__default.join(contextDir, file);
|
|
131
|
+
// Test against both filename and full path for flexibility
|
|
132
|
+
return !ignorePatternsRegex.some((regex)=>regex.test(file) || regex.test(fullPath));
|
|
133
|
+
});
|
|
120
134
|
for (const file of filteredFiles){
|
|
121
135
|
// Skip the context.md file as it's already processed
|
|
122
136
|
if (file === 'context.md') continue;
|
|
@@ -144,6 +158,7 @@ const create = (loaderOptions)=>{
|
|
|
144
158
|
...sectionOptions
|
|
145
159
|
});
|
|
146
160
|
// Add this file section to the main context section
|
|
161
|
+
// Type is correct - Section.add() accepts Section<T>
|
|
147
162
|
mainContextSection.add(fileSection, {
|
|
148
163
|
...sectionOptions
|
|
149
164
|
});
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sources":["../src/loader.ts"],"sourcesContent":["import path from \"path\";\nimport { z } from \"zod\";\nimport { DEFAULT_IGNORE_PATTERNS } from \"./constants\";\nimport { ParametersSchema } from \"./items/parameters\";\nimport { SectionOptions, SectionOptionsSchema } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Section, Weighted, createSection } from \"./riotprompt\";\nimport * as Storage from \"./util/storage\";\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n ignorePatterns: z.array(z.string()).optional().default(DEFAULT_IGNORE_PATTERNS),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionsSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n load: <T extends Weighted>(contextDirectories?: string[], options?: SectionOptions) => Promise<Section<T>[]>;\n}\n\n/**\n * Extracts the first header from Markdown text\n * @param markdownText The Markdown text to parse\n * @returns The first header found in the Markdown or null if none is found\n */\nexport function extractFirstHeader(markdownText: string): string | null {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match && match[2]) {\n return match[2].trim();\n }\n\n return null;\n}\n\n/**\n * Removes the first header from Markdown text\n * @param markdownText The Markdown text to process\n * @returns The Markdown text without the first header\n */\nexport function removeFirstHeader(markdownText: string): string {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match) {\n return markdownText.replace(headerRegex, '').trim();\n }\n\n return markdownText;\n}\n\nexport const create = (loaderOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionsSchema.parse(loaderOptions || {}) as Required<Options>;\n const parameters = options.parameters;\n\n const logger = wrapLogger(options.logger, 'Loader');\n const ignorePatterns = options.ignorePatterns;\n\n const loadOptions = (sectionOptions: Partial<SectionOptions> = {}): SectionOptions => {\n const currentOptions = SectionOptionsSchema.parse(sectionOptions);\n return {\n ...currentOptions,\n parameters: {\n ...parameters,\n ...currentOptions.parameters\n }\n }\n }\n\n /**\n * Loads context from the provided directories and returns instruction sections\n * \n * @param contextDirectories Directories containing context files\n * @returns Array of instruction sections loaded from context directories\n */\n const load = async<T extends Weighted>(\n contextDirectories: string[] = [],\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>[]> => {\n const sectionOptions = loadOptions(options);\n\n logger.debug(`Loading context from ${contextDirectories}`);\n const contextSections: Section<T>[] = [];\n\n if (!contextDirectories || contextDirectories.length === 0) {\n logger.debug(`No context directories provided, returning empty context`);\n return contextSections;\n }\n\n const storage = Storage.create({ log: logger.debug });\n\n // Add context sections from each directory\n for (const contextDir of contextDirectories) {\n try {\n const dirName = path.basename(contextDir);\n logger.debug(`Processing context directory ${dirName}`);\n let mainContextSection: Section<T>;\n\n // First check if there's a context.md file\n const contextFile = path.join(contextDir, 'context.md');\n\n if (await storage.exists(contextFile)) {\n logger.debug(`Found context.md file in ${contextDir}`);\n const mainContextContent = await storage.readFile(contextFile, 'utf8');\n // Extract the first header from the Markdown content\n const firstHeader = extractFirstHeader(mainContextContent);\n\n // Use the header from context.md as the section title, or fallback to directory name\n const sectionTitle = firstHeader || dirName;\n mainContextSection = createSection<T>({ ...sectionOptions, title: sectionTitle });\n\n // Add content without the header\n if (firstHeader) {\n mainContextSection.add(removeFirstHeader(mainContextContent), { ...sectionOptions });\n } else {\n mainContextSection.add(mainContextContent, { ...sectionOptions });\n }\n } else {\n // If no context.md exists, use directory name as title\n mainContextSection = createSection<T>({ ...sectionOptions, title: dirName });\n }\n\n // Get all other files in the directory\n const files = await storage.listFiles(contextDir);\n const ignorePatternsRegex = ignorePatterns.map(pattern => new RegExp(pattern, 'i'));\n\n const filteredFiles = files.filter(file =>\n !ignorePatternsRegex.some(regex => regex.test(file))\n );\n\n for (const file of filteredFiles) {\n // Skip the context.md file as it's already processed\n if (file === 'context.md') continue;\n\n logger.debug(`Processing file ${file} in ${contextDir}`);\n const filePath = path.join(contextDir, file);\n if (await storage.isFile(filePath)) {\n const fileContent = await storage.readFile(filePath, 'utf8');\n let sectionName = file;\n let contentToAdd = fileContent;\n\n // Extract header if it exists\n if (file.endsWith('.md')) {\n const fileHeader = extractFirstHeader(fileContent);\n if (fileHeader) {\n sectionName = fileHeader;\n // Remove the header from the content\n contentToAdd = removeFirstHeader(fileContent);\n }\n }\n\n // Create a subsection with the extracted name\n const fileSection = createSection<T>({ ...sectionOptions, title: sectionName });\n fileSection.add(contentToAdd, { ...sectionOptions });\n\n // Add this file section to the main context section\n mainContextSection.add(fileSection as unknown as T, { ...sectionOptions });\n }\n }\n\n contextSections.push(mainContextSection);\n } catch (error) {\n logger.error(`Error processing context directory ${contextDir}: ${error}`);\n }\n }\n\n return contextSections;\n }\n\n\n return {\n load\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","ignorePatterns","array","string","DEFAULT_IGNORE_PATTERNS","parameters","ParametersSchema","extractFirstHeader","markdownText","headerRegex","match","trim","removeFirstHeader","replace","create","loaderOptions","options","parse","wrapLogger","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","load","contextDirectories","debug","contextSections","length","storage","Storage","log","contextDir","dirName","path","basename","mainContextSection","contextFile","join","exists","mainContextContent","readFile","firstHeader","sectionTitle","createSection","title","add","files","listFiles","ignorePatternsRegex","map","pattern","RegExp","filteredFiles","filter","file","some","regex","test","filePath","isFile","fileContent","sectionName","contentToAdd","endsWith","fileHeader","fileSection","push","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loader.js","sources":["../src/loader.ts"],"sourcesContent":["import path from \"path\";\nimport { z } from \"zod\";\nimport { DEFAULT_IGNORE_PATTERNS } from \"./constants\";\nimport { ParametersSchema } from \"./items/parameters\";\nimport { SectionOptions, SectionOptionsSchema } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Section, Weighted, createSection } from \"./riotprompt\";\nimport * as Storage from \"./util/storage\";\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n ignorePatterns: z.array(z.string()).optional().default(DEFAULT_IGNORE_PATTERNS),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionsSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n load: <T extends Weighted>(contextDirectories?: string[], options?: SectionOptions) => Promise<Section<T>[]>;\n}\n\n/**\n * Extracts the first header from Markdown text\n * @param markdownText The Markdown text to parse\n * @returns The first header found in the Markdown or null if none is found\n */\nexport function extractFirstHeader(markdownText: string): string | null {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match && match[2]) {\n return match[2].trim();\n }\n\n return null;\n}\n\n/**\n * Removes the first header from Markdown text\n * @param markdownText The Markdown text to process\n * @returns The Markdown text without the first header\n */\nexport function removeFirstHeader(markdownText: string): string {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match) {\n return markdownText.replace(headerRegex, '').trim();\n }\n\n return markdownText;\n}\n\nexport const create = (loaderOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionsSchema.parse(loaderOptions || {}) as Required<Options>;\n const parameters = options.parameters;\n\n const logger = wrapLogger(options.logger, 'Loader');\n const ignorePatterns = options.ignorePatterns;\n\n const loadOptions = (sectionOptions: Partial<SectionOptions> = {}): SectionOptions => {\n const currentOptions = SectionOptionsSchema.parse(sectionOptions);\n return {\n ...currentOptions,\n parameters: {\n ...parameters,\n ...currentOptions.parameters\n }\n }\n }\n\n /**\n * Loads context from the provided directories and returns instruction sections\n *\n * @param contextDirectories Directories containing context files\n * @returns Array of instruction sections loaded from context directories\n */\n const load = async<T extends Weighted>(\n contextDirectories: string[] = [],\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>[]> => {\n const sectionOptions = loadOptions(options);\n\n logger.debug(`Loading context from ${contextDirectories}`);\n const contextSections: Section<T>[] = [];\n\n if (!contextDirectories || contextDirectories.length === 0) {\n logger.debug(`No context directories provided, returning empty context`);\n return contextSections;\n }\n\n const storage = Storage.create({ log: logger.debug });\n\n // Add context sections from each directory\n for (const contextDir of contextDirectories) {\n try {\n const dirName = path.basename(contextDir);\n logger.debug(`Processing context directory ${dirName}`);\n let mainContextSection: Section<T>;\n\n // First check if there's a context.md file\n const contextFile = path.join(contextDir, 'context.md');\n\n if (await storage.exists(contextFile)) {\n logger.debug(`Found context.md file in ${contextDir}`);\n const mainContextContent = await storage.readFile(contextFile, 'utf8');\n // Extract the first header from the Markdown content\n const firstHeader = extractFirstHeader(mainContextContent);\n\n // Use the header from context.md as the section title, or fallback to directory name\n const sectionTitle = firstHeader || dirName;\n mainContextSection = createSection<T>({ ...sectionOptions, title: sectionTitle });\n\n // Add content without the header\n if (firstHeader) {\n mainContextSection.add(removeFirstHeader(mainContextContent), { ...sectionOptions });\n } else {\n mainContextSection.add(mainContextContent, { ...sectionOptions });\n }\n } else {\n // If no context.md exists, use directory name as title\n mainContextSection = createSection<T>({ ...sectionOptions, title: dirName });\n }\n\n // Get all other files in the directory\n const files = await storage.listFiles(contextDir);\n const ignorePatternsRegex = ignorePatterns.map(pattern => {\n try {\n return new RegExp(pattern, 'i');\n } catch (error) {\n logger.error(`Invalid ignore pattern: ${pattern}`, { error });\n // Return a pattern that matches nothing\n return /(?!)/; // Negative lookahead that always fails\n }\n });\n\n const filteredFiles = files.filter(file => {\n const fullPath = path.join(contextDir, file);\n // Test against both filename and full path for flexibility\n return !ignorePatternsRegex.some(regex => regex.test(file) || regex.test(fullPath));\n });\n\n for (const file of filteredFiles) {\n // Skip the context.md file as it's already processed\n if (file === 'context.md') continue;\n\n logger.debug(`Processing file ${file} in ${contextDir}`);\n const filePath = path.join(contextDir, file);\n if (await storage.isFile(filePath)) {\n const fileContent = await storage.readFile(filePath, 'utf8');\n let sectionName = file;\n let contentToAdd = fileContent;\n\n // Extract header if it exists\n if (file.endsWith('.md')) {\n const fileHeader = extractFirstHeader(fileContent);\n if (fileHeader) {\n sectionName = fileHeader;\n // Remove the header from the content\n contentToAdd = removeFirstHeader(fileContent);\n }\n }\n\n // Create a subsection with the extracted name\n const fileSection = createSection<T>({ ...sectionOptions, title: sectionName });\n fileSection.add(contentToAdd, { ...sectionOptions });\n\n // Add this file section to the main context section\n // Type is correct - Section.add() accepts Section<T>\n mainContextSection.add(fileSection, { ...sectionOptions });\n }\n }\n\n contextSections.push(mainContextSection);\n } catch (error) {\n logger.error(`Error processing context directory ${contextDir}: ${error}`);\n }\n }\n\n return contextSections;\n }\n\n\n return {\n load\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","ignorePatterns","array","string","DEFAULT_IGNORE_PATTERNS","parameters","ParametersSchema","extractFirstHeader","markdownText","headerRegex","match","trim","removeFirstHeader","replace","create","loaderOptions","options","parse","wrapLogger","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","load","contextDirectories","debug","contextSections","length","storage","Storage","log","contextDir","dirName","path","basename","mainContextSection","contextFile","join","exists","mainContextContent","readFile","firstHeader","sectionTitle","createSection","title","add","files","listFiles","ignorePatternsRegex","map","pattern","RegExp","error","filteredFiles","filter","file","fullPath","some","regex","test","filePath","isFile","fileContent","sectionName","contentToAdd","endsWith","fileHeader","fileSection","push"],"mappings":"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"}
|
package/dist/message-builder.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { wrapLogger, DEFAULT_LOGGER } from './logger.js';
|
|
2
2
|
import { create } from './formatter.js';
|
|
3
|
+
import { getPersonaRole } from './model-config.js';
|
|
3
4
|
|
|
4
5
|
function _define_property(obj, key, value) {
|
|
5
6
|
if (key in obj) {
|
|
@@ -175,8 +176,9 @@ function _define_property(obj, key, value) {
|
|
|
175
176
|
const message = this.build();
|
|
176
177
|
// Handle model-specific role requirements
|
|
177
178
|
if (this.semanticRole === 'system') {
|
|
178
|
-
//
|
|
179
|
-
|
|
179
|
+
// Use model registry to determine correct role
|
|
180
|
+
const personaRole = getPersonaRole(model);
|
|
181
|
+
if (personaRole === 'developer') {
|
|
180
182
|
message.role = 'developer';
|
|
181
183
|
}
|
|
182
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-builder.js","sources":["../src/message-builder.ts"],"sourcesContent":["import { Model } from \"./chat\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport type { ConversationMessage, ToolCall } from \"./conversation\";\nimport * as Formatter from \"./formatter\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Semantic message role\n */\nexport type SemanticRole = 'system' | 'user' | 'assistant' | 'tool' | 'developer';\n\n/**\n * Message metadata\n */\nexport interface MessageMetadata {\n priority?: 'high' | 'medium' | 'low';\n timestamp?: Date;\n source?: string;\n [key: string]: any;\n}\n\n/**\n * MessageBuilder provides semantic, type-safe message construction.\n *\n * Features:\n * - Semantic message types (system, user, assistant, tool)\n * - Model-specific role handling (system vs developer)\n * - Structured content composition\n * - Metadata attachment\n * - Format-aware building\n *\n * @example\n * ```typescript\n * const message = MessageBuilder.system()\n * .withContent('You are a helpful assistant')\n * .withInstructions(instructionSection)\n * .buildForModel('gpt-4o');\n *\n * const toolMessage = MessageBuilder.tool('call_123')\n * .withResult(result)\n * .withMetadata({ duration: 45 })\n * .build();\n * ```\n */\nexport class MessageBuilder {\n private semanticRole: SemanticRole;\n private contentParts: string[];\n private metadata: MessageMetadata;\n private formatter?: Formatter.Instance;\n private toolCallId?: string;\n private toolCalls?: ToolCall[];\n private logger: any;\n\n private constructor(role: SemanticRole, logger?: any) {\n this.semanticRole = role;\n this.contentParts = [];\n this.metadata = {};\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'MessageBuilder');\n }\n\n /**\n * Create system message builder\n */\n static system(logger?: any): MessageBuilder {\n return new MessageBuilder('system', logger);\n }\n\n /**\n * Create user message builder\n */\n static user(logger?: any): MessageBuilder {\n return new MessageBuilder('user', logger);\n }\n\n /**\n * Create assistant message builder\n */\n static assistant(logger?: any): MessageBuilder {\n return new MessageBuilder('assistant', logger);\n }\n\n /**\n * Create tool message builder\n */\n static tool(callId: string, logger?: any): MessageBuilder {\n const builder = new MessageBuilder('tool', logger);\n builder.toolCallId = callId;\n return builder;\n }\n\n /**\n * Create developer message builder (for o1 models)\n */\n static developer(logger?: any): MessageBuilder {\n return new MessageBuilder('developer', logger);\n }\n\n /**\n * Add content to message\n */\n withContent(content: string | Section<any>): this {\n if (typeof content === 'string') {\n this.contentParts.push(content);\n } else {\n // Format section\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(content));\n }\n return this;\n }\n\n /**\n * Add persona section (typically for system messages)\n */\n withPersona(persona: Section<Instruction>): this {\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(persona));\n return this;\n }\n\n /**\n * Add instructions section\n */\n withInstructions(instructions: Section<Instruction> | string[]): this {\n if (Array.isArray(instructions)) {\n this.contentParts.push(instructions.join('\\n'));\n } else {\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(instructions));\n }\n return this;\n }\n\n /**\n * Add context section\n */\n withContext(context: Section<Context> | Array<{ content: string; title?: string }>): this {\n if (Array.isArray(context)) {\n const contextStr = context.map(c =>\n c.title ? `## ${c.title}\\n\\n${c.content}` : c.content\n ).join('\\n\\n');\n this.contentParts.push(contextStr);\n } else {\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(context));\n }\n return this;\n }\n\n /**\n * Set tool call ID (for tool messages)\n */\n withCallId(id: string): this {\n this.toolCallId = id;\n return this;\n }\n\n /**\n * Set tool result (for tool messages)\n */\n withResult(result: any): this {\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n this.contentParts.push(resultStr);\n return this;\n }\n\n /**\n * Add tool calls (for assistant messages)\n */\n withToolCalls(calls: ToolCall[]): this {\n this.toolCalls = calls;\n return this;\n }\n\n /**\n * Add metadata\n */\n withMetadata(metadata: Record<string, any>): this {\n this.metadata = { ...this.metadata, ...metadata };\n return this;\n }\n\n /**\n * Add timestamp to metadata\n */\n withTimestamp(): this {\n this.metadata.timestamp = new Date();\n return this;\n }\n\n /**\n * Set priority in metadata\n */\n withPriority(priority: 'high' | 'medium' | 'low'): this {\n this.metadata.priority = priority;\n return this;\n }\n\n /**\n * Set formatter for section rendering\n */\n withFormatter(formatter: Formatter.Instance): this {\n this.formatter = formatter;\n return this;\n }\n\n /**\n * Build message with semantic role\n */\n build(): ConversationMessage {\n const content = this.contentParts.join('\\n\\n');\n\n const message: ConversationMessage = {\n role: this.semanticRole as any,\n content: content || null,\n };\n\n // Add tool-specific fields\n if (this.semanticRole === 'tool' && this.toolCallId) {\n message.tool_call_id = this.toolCallId;\n }\n\n if (this.toolCalls) {\n message.tool_calls = this.toolCalls;\n }\n\n return message;\n }\n\n /**\n * Build message with model-specific role\n */\n buildForModel(model: Model): ConversationMessage {\n const message = this.build();\n\n // Handle model-specific role requirements\n if (this.semanticRole === 'system') {\n // O1 models use 'developer' instead of 'system'\n if (model.startsWith('o1') || model.startsWith('o3') || model === 'o1-pro') {\n message.role = 'developer' as any;\n }\n }\n\n return message;\n }\n}\n\n/**\n * Message template functions for common patterns\n */\nexport const MessageTemplates = {\n /**\n * System message for agentic tasks\n */\n agenticSystem: (persona?: string, instructions?: string[]) => {\n const builder = MessageBuilder.system();\n\n if (persona) {\n builder.withContent(persona);\n }\n\n if (instructions) {\n builder.withInstructions(instructions);\n }\n\n return builder;\n },\n\n /**\n * User query with optional context\n */\n userQuery: (query: string, context?: Array<{ content: string; title?: string }>) => {\n const builder = MessageBuilder.user().withContent(query);\n\n if (context) {\n builder.withContext(context);\n }\n\n return builder;\n },\n\n /**\n * Tool result with metadata\n */\n toolResult: (callId: string, result: any, metadata?: Record<string, any>) => {\n const builder = MessageBuilder.tool(callId)\n .withResult(result)\n .withTimestamp();\n\n if (metadata) {\n builder.withMetadata(metadata);\n }\n\n return builder;\n },\n\n /**\n * Tool success result\n */\n toolSuccess: (callId: string, result: any, duration?: number) => {\n return MessageBuilder.tool(callId)\n .withResult(result)\n .withMetadata({ success: true, duration })\n .withTimestamp();\n },\n\n /**\n * Tool failure result\n */\n toolFailure: (callId: string, error: Error) => {\n return MessageBuilder.tool(callId)\n .withResult({ error: error.message, stack: error.stack })\n .withMetadata({ success: false, errorName: error.name })\n .withTimestamp();\n },\n};\n\nexport default MessageBuilder;\n\n"],"names":["MessageBuilder","system","logger","user","assistant","tool","callId","builder","toolCallId","developer","withContent","content","contentParts","push","formatter","Formatter","format","withPersona","persona","withInstructions","instructions","Array","isArray","join","withContext","context","contextStr","map","c","title","withCallId","id","withResult","result","resultStr","JSON","stringify","withToolCalls","calls","toolCalls","withMetadata","metadata","withTimestamp","timestamp","Date","withPriority","priority","withFormatter","build","message","role","semanticRole","tool_call_id","tool_calls","buildForModel","model","startsWith","wrapLogger","DEFAULT_LOGGER","MessageTemplates","agenticSystem","userQuery","query","toolResult","toolSuccess","duration","success","toolFailure","error","stack","errorName","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message-builder.js","sources":["../src/message-builder.ts"],"sourcesContent":["import { Model } from \"./chat\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport type { ConversationMessage, ToolCall } from \"./conversation\";\nimport * as Formatter from \"./formatter\";\nimport { getPersonaRole as getPersonaRoleFromRegistry } from \"./model-config\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Semantic message role\n */\nexport type SemanticRole = 'system' | 'user' | 'assistant' | 'tool' | 'developer';\n\n/**\n * Message metadata\n */\nexport interface MessageMetadata {\n priority?: 'high' | 'medium' | 'low';\n timestamp?: Date;\n source?: string;\n [key: string]: any;\n}\n\n/**\n * MessageBuilder provides semantic, type-safe message construction.\n *\n * Features:\n * - Semantic message types (system, user, assistant, tool)\n * - Model-specific role handling (system vs developer)\n * - Structured content composition\n * - Metadata attachment\n * - Format-aware building\n *\n * @example\n * ```typescript\n * const message = MessageBuilder.system()\n * .withContent('You are a helpful assistant')\n * .withInstructions(instructionSection)\n * .buildForModel('gpt-4o');\n *\n * const toolMessage = MessageBuilder.tool('call_123')\n * .withResult(result)\n * .withMetadata({ duration: 45 })\n * .build();\n * ```\n */\nexport class MessageBuilder {\n private semanticRole: SemanticRole;\n private contentParts: string[];\n private metadata: MessageMetadata;\n private formatter?: Formatter.Instance;\n private toolCallId?: string;\n private toolCalls?: ToolCall[];\n private logger: any;\n\n private constructor(role: SemanticRole, logger?: any) {\n this.semanticRole = role;\n this.contentParts = [];\n this.metadata = {};\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'MessageBuilder');\n }\n\n /**\n * Create system message builder\n */\n static system(logger?: any): MessageBuilder {\n return new MessageBuilder('system', logger);\n }\n\n /**\n * Create user message builder\n */\n static user(logger?: any): MessageBuilder {\n return new MessageBuilder('user', logger);\n }\n\n /**\n * Create assistant message builder\n */\n static assistant(logger?: any): MessageBuilder {\n return new MessageBuilder('assistant', logger);\n }\n\n /**\n * Create tool message builder\n */\n static tool(callId: string, logger?: any): MessageBuilder {\n const builder = new MessageBuilder('tool', logger);\n builder.toolCallId = callId;\n return builder;\n }\n\n /**\n * Create developer message builder (for o1 models)\n */\n static developer(logger?: any): MessageBuilder {\n return new MessageBuilder('developer', logger);\n }\n\n /**\n * Add content to message\n */\n withContent(content: string | Section<any>): this {\n if (typeof content === 'string') {\n this.contentParts.push(content);\n } else {\n // Format section\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(content));\n }\n return this;\n }\n\n /**\n * Add persona section (typically for system messages)\n */\n withPersona(persona: Section<Instruction>): this {\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(persona));\n return this;\n }\n\n /**\n * Add instructions section\n */\n withInstructions(instructions: Section<Instruction> | string[]): this {\n if (Array.isArray(instructions)) {\n this.contentParts.push(instructions.join('\\n'));\n } else {\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(instructions));\n }\n return this;\n }\n\n /**\n * Add context section\n */\n withContext(context: Section<Context> | Array<{ content: string; title?: string }>): this {\n if (Array.isArray(context)) {\n const contextStr = context.map(c =>\n c.title ? `## ${c.title}\\n\\n${c.content}` : c.content\n ).join('\\n\\n');\n this.contentParts.push(contextStr);\n } else {\n const formatter = this.formatter || Formatter.create();\n this.contentParts.push(formatter.format(context));\n }\n return this;\n }\n\n /**\n * Set tool call ID (for tool messages)\n */\n withCallId(id: string): this {\n this.toolCallId = id;\n return this;\n }\n\n /**\n * Set tool result (for tool messages)\n */\n withResult(result: any): this {\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n this.contentParts.push(resultStr);\n return this;\n }\n\n /**\n * Add tool calls (for assistant messages)\n */\n withToolCalls(calls: ToolCall[]): this {\n this.toolCalls = calls;\n return this;\n }\n\n /**\n * Add metadata\n */\n withMetadata(metadata: Record<string, any>): this {\n this.metadata = { ...this.metadata, ...metadata };\n return this;\n }\n\n /**\n * Add timestamp to metadata\n */\n withTimestamp(): this {\n this.metadata.timestamp = new Date();\n return this;\n }\n\n /**\n * Set priority in metadata\n */\n withPriority(priority: 'high' | 'medium' | 'low'): this {\n this.metadata.priority = priority;\n return this;\n }\n\n /**\n * Set formatter for section rendering\n */\n withFormatter(formatter: Formatter.Instance): this {\n this.formatter = formatter;\n return this;\n }\n\n /**\n * Build message with semantic role\n */\n build(): ConversationMessage {\n const content = this.contentParts.join('\\n\\n');\n\n const message: ConversationMessage = {\n role: this.semanticRole as any,\n content: content || null,\n };\n\n // Add tool-specific fields\n if (this.semanticRole === 'tool' && this.toolCallId) {\n message.tool_call_id = this.toolCallId;\n }\n\n if (this.toolCalls) {\n message.tool_calls = this.toolCalls;\n }\n\n return message;\n }\n\n /**\n * Build message with model-specific role\n */\n buildForModel(model: Model): ConversationMessage {\n const message = this.build();\n\n // Handle model-specific role requirements\n if (this.semanticRole === 'system') {\n // Use model registry to determine correct role\n const personaRole = getPersonaRoleFromRegistry(model);\n if (personaRole === 'developer') {\n message.role = 'developer' as any;\n }\n }\n\n return message;\n }\n}\n\n/**\n * Message template functions for common patterns\n */\nexport const MessageTemplates = {\n /**\n * System message for agentic tasks\n */\n agenticSystem: (persona?: string, instructions?: string[]) => {\n const builder = MessageBuilder.system();\n\n if (persona) {\n builder.withContent(persona);\n }\n\n if (instructions) {\n builder.withInstructions(instructions);\n }\n\n return builder;\n },\n\n /**\n * User query with optional context\n */\n userQuery: (query: string, context?: Array<{ content: string; title?: string }>) => {\n const builder = MessageBuilder.user().withContent(query);\n\n if (context) {\n builder.withContext(context);\n }\n\n return builder;\n },\n\n /**\n * Tool result with metadata\n */\n toolResult: (callId: string, result: any, metadata?: Record<string, any>) => {\n const builder = MessageBuilder.tool(callId)\n .withResult(result)\n .withTimestamp();\n\n if (metadata) {\n builder.withMetadata(metadata);\n }\n\n return builder;\n },\n\n /**\n * Tool success result\n */\n toolSuccess: (callId: string, result: any, duration?: number) => {\n return MessageBuilder.tool(callId)\n .withResult(result)\n .withMetadata({ success: true, duration })\n .withTimestamp();\n },\n\n /**\n * Tool failure result\n */\n toolFailure: (callId: string, error: Error) => {\n return MessageBuilder.tool(callId)\n .withResult({ error: error.message, stack: error.stack })\n .withMetadata({ success: false, errorName: error.name })\n .withTimestamp();\n },\n};\n\nexport default MessageBuilder;\n\n"],"names":["MessageBuilder","system","logger","user","assistant","tool","callId","builder","toolCallId","developer","withContent","content","contentParts","push","formatter","Formatter","format","withPersona","persona","withInstructions","instructions","Array","isArray","join","withContext","context","contextStr","map","c","title","withCallId","id","withResult","result","resultStr","JSON","stringify","withToolCalls","calls","toolCalls","withMetadata","metadata","withTimestamp","timestamp","Date","withPriority","priority","withFormatter","build","message","role","semanticRole","tool_call_id","tool_calls","buildForModel","model","personaRole","getPersonaRoleFromRegistry","wrapLogger","DEFAULT_LOGGER","MessageTemplates","agenticSystem","userQuery","query","toolResult","toolSuccess","duration","success","toolFailure","error","stack","errorName","name"],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Configuration System
|
|
3
|
+
*
|
|
4
|
+
* Provides a flexible, user-configurable system for model detection and configuration
|
|
5
|
+
* that doesn't hardcode model names.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Model role mapping for persona/system messages
|
|
9
|
+
*/
|
|
10
|
+
export type PersonaRole = 'system' | 'developer';
|
|
11
|
+
/**
|
|
12
|
+
* Tokenizer encoding to use for token counting
|
|
13
|
+
*/
|
|
14
|
+
export type TokenizerEncoding = 'gpt-4o' | 'cl100k_base' | 'o200k_base';
|
|
15
|
+
/**
|
|
16
|
+
* Configuration for a model or model family
|
|
17
|
+
*/
|
|
18
|
+
export interface ModelConfig {
|
|
19
|
+
pattern?: RegExp;
|
|
20
|
+
exactMatch?: string;
|
|
21
|
+
personaRole: PersonaRole;
|
|
22
|
+
encoding: TokenizerEncoding;
|
|
23
|
+
supportsToolCalls?: boolean;
|
|
24
|
+
maxTokens?: number;
|
|
25
|
+
family?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Model registry for managing model configurations
|
|
30
|
+
*/
|
|
31
|
+
export declare class ModelRegistry {
|
|
32
|
+
private configs;
|
|
33
|
+
private cache;
|
|
34
|
+
private logger;
|
|
35
|
+
constructor(logger?: any);
|
|
36
|
+
/**
|
|
37
|
+
* Register default model configurations
|
|
38
|
+
*/
|
|
39
|
+
private registerDefaults;
|
|
40
|
+
/**
|
|
41
|
+
* Register a model configuration
|
|
42
|
+
* Configs are checked in registration order (first match wins)
|
|
43
|
+
*/
|
|
44
|
+
register(config: ModelConfig): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get configuration for a model
|
|
47
|
+
*/
|
|
48
|
+
getConfig(model: string): ModelConfig;
|
|
49
|
+
/**
|
|
50
|
+
* Get persona role for a model
|
|
51
|
+
*/
|
|
52
|
+
getPersonaRole(model: string): PersonaRole;
|
|
53
|
+
/**
|
|
54
|
+
* Get tokenizer encoding for a model
|
|
55
|
+
*/
|
|
56
|
+
getEncoding(model: string): TokenizerEncoding;
|
|
57
|
+
/**
|
|
58
|
+
* Check if model supports tool calls
|
|
59
|
+
*/
|
|
60
|
+
supportsToolCalls(model: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get model family
|
|
63
|
+
*/
|
|
64
|
+
getFamily(model: string): string | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Clear all registered configs and reset to defaults
|
|
67
|
+
*/
|
|
68
|
+
reset(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Clear cache (useful if configs are modified)
|
|
71
|
+
*/
|
|
72
|
+
clearCache(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Get all registered configurations
|
|
75
|
+
*/
|
|
76
|
+
getAllConfigs(): ModelConfig[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the global model registry
|
|
80
|
+
*/
|
|
81
|
+
export declare function getModelRegistry(logger?: any): ModelRegistry;
|
|
82
|
+
/**
|
|
83
|
+
* Reset the global registry (useful for testing)
|
|
84
|
+
*/
|
|
85
|
+
export declare function resetModelRegistry(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Helper functions using global registry
|
|
88
|
+
*/
|
|
89
|
+
export declare function getPersonaRole(model: string): PersonaRole;
|
|
90
|
+
export declare function getEncoding(model: string): TokenizerEncoding;
|
|
91
|
+
export declare function supportsToolCalls(model: string): boolean;
|
|
92
|
+
export declare function getModelFamily(model: string): string | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* Configure a custom model
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* // Add support for a new model family
|
|
99
|
+
* configureModel({
|
|
100
|
+
* pattern: /^gemini/i,
|
|
101
|
+
* personaRole: 'system',
|
|
102
|
+
* encoding: 'cl100k_base',
|
|
103
|
+
* family: 'gemini'
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* // Add specific model override
|
|
107
|
+
* configureModel({
|
|
108
|
+
* exactMatch: 'custom-model-v1',
|
|
109
|
+
* personaRole: 'developer',
|
|
110
|
+
* encoding: 'gpt-4o'
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare function configureModel(config: ModelConfig): void;
|
|
115
|
+
export default ModelRegistry;
|