@riotprompt/riotprompt 0.0.9 → 0.0.10
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 +1 -1
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sources":["../src/conversation.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Model } from \"./chat\";\nimport { ContextManager, type DynamicContentItem } from \"./context-manager\";\nimport { ConversationLogger, type LogConfig } from \"./conversation-logger\";\nimport { Content } from \"./items/content\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { MessageBuilder } from \"./message-builder\";\nimport { Prompt } from \"./prompt\";\nimport * as Formatter from \"./formatter\";\nimport { TokenBudgetManager, type TokenBudgetConfig, type TokenUsage, type CompressionStrategy } from \"./token-budget\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Options for injecting context\n */\nexport interface InjectOptions {\n // Where to inject\n position?: 'end' | 'before-last' | 'after-system' | number;\n\n // How to format\n format?: 'structured' | 'inline' | 'reference';\n\n // Deduplication\n deduplicate?: boolean;\n deduplicateBy?: 'id' | 'content' | 'hash';\n\n // Priority\n priority?: 'high' | 'medium' | 'low';\n weight?: number;\n\n // Metadata\n category?: string;\n source?: string;\n}\n\n/**\n * Represents a tool call made by the assistant\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Message in a conversation (compatible with OpenAI ChatCompletionMessageParam)\n */\nexport interface ConversationMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\n/**\n * Configuration for ConversationBuilder\n */\nexport interface ConversationBuilderConfig {\n model: Model;\n formatter?: Formatter.Instance;\n trackContext?: boolean;\n deduplicateContext?: boolean;\n}\n\n/**\n * Metadata about the conversation\n */\nexport interface ConversationMetadata {\n model: Model;\n created: Date;\n lastModified: Date;\n messageCount: number;\n toolCallCount: number;\n}\n\n/**\n * Internal state of a conversation\n */\nexport interface ConversationState {\n messages: ConversationMessage[];\n metadata: ConversationMetadata;\n contextProvided: Set<string>;\n contextManager: ContextManager;\n}\n\n/**\n * Serializable conversation state for persistence\n */\nexport interface SerializedConversation {\n messages: ConversationMessage[];\n metadata: Omit<ConversationMetadata, 'created' | 'lastModified'> & {\n created: string;\n lastModified: string;\n };\n contextProvided: string[];\n}\n\n// ===== SCHEMAS =====\n\nconst ConversationBuilderConfigSchema = z.object({\n model: z.string(),\n formatter: z.any().optional(),\n trackContext: z.boolean().optional().default(true),\n deduplicateContext: z.boolean().optional().default(true),\n});\n\n// ===== CONVERSATION BUILDER =====\n\n/**\n * ConversationBuilder manages multi-turn conversations with full lifecycle support.\n *\n * Features:\n * - Initialize from RiotPrompt prompts\n * - Add messages of any type (system, user, assistant, tool)\n * - Handle tool calls and results\n * - Inject dynamic context\n * - Clone for parallel exploration\n * - Serialize/deserialize for persistence\n *\n * @example\n * ```typescript\n * // Create from prompt\n * const conversation = ConversationBuilder.create()\n * .fromPrompt(prompt, 'gpt-4o')\n * .build();\n *\n * // Add messages\n * conversation.addUserMessage('Analyze this code');\n *\n * // Handle tool calls\n * conversation.addAssistantWithToolCalls(null, toolCalls);\n * conversation.addToolResult(toolCallId, result);\n *\n * // Export\n * const messages = conversation.toMessages();\n * ```\n */\nexport class ConversationBuilder {\n private state: ConversationState;\n private config: ConversationBuilderConfig;\n private logger: any;\n private budgetManager?: TokenBudgetManager;\n private conversationLogger?: ConversationLogger;\n\n private constructor(config: ConversationBuilderConfig, logger?: any) {\n this.config = ConversationBuilderConfigSchema.parse(config) as ConversationBuilderConfig;\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ConversationBuilder');\n\n this.state = {\n messages: [],\n metadata: {\n model: this.config.model,\n created: new Date(),\n lastModified: new Date(),\n messageCount: 0,\n toolCallCount: 0,\n },\n contextProvided: new Set<string>(),\n contextManager: new ContextManager(logger),\n };\n\n this.logger.debug('Created ConversationBuilder', { model: this.config.model });\n }\n\n /**\n * Create a new ConversationBuilder instance\n */\n static create(config?: Partial<ConversationBuilderConfig>, logger?: any): ConversationBuilder {\n const defaultConfig: ConversationBuilderConfig = {\n model: 'gpt-4o',\n trackContext: true,\n deduplicateContext: true,\n ...config,\n };\n\n return new ConversationBuilder(defaultConfig, logger);\n }\n\n /**\n * Initialize conversation from a RiotPrompt prompt\n */\n fromPrompt(prompt: Prompt, model?: Model): this {\n const targetModel = model || this.config.model;\n this.logger.debug('Initializing from prompt', { model: targetModel });\n\n // Use formatter (provided or create new one)\n const formatter = this.config.formatter || Formatter.create();\n const request = formatter.formatPrompt(targetModel, prompt);\n\n // Add all messages from formatted request\n request.messages.forEach(msg => {\n this.state.messages.push(msg as ConversationMessage);\n });\n\n this.updateMetadata();\n this.logger.debug('Initialized from prompt', { messageCount: this.state.messages.length });\n\n return this;\n }\n\n /**\n * Add a system message\n */\n addSystemMessage(content: string | Section<Instruction>): this {\n this.logger.debug('Adding system message');\n\n let messageContent: string;\n if (typeof content === 'string') {\n messageContent = content;\n } else {\n // Format section using formatter\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(content);\n }\n\n this.state.messages.push({\n role: 'system',\n content: messageContent,\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a user message (with automatic budget management)\n */\n addUserMessage(content: string | Section<Content>): this {\n this.logger.debug('Adding user message');\n\n let messageContent: string;\n if (typeof content === 'string') {\n messageContent = content;\n } else {\n // Format section using formatter\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(content);\n }\n\n const message: ConversationMessage = {\n role: 'user',\n content: messageContent,\n };\n\n // Check budget if enabled\n if (this.budgetManager) {\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Budget exceeded, compressing conversation');\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n }\n\n this.state.messages.push(message);\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message\n */\n addAssistantMessage(content: string | null): this {\n this.logger.debug('Adding assistant message');\n\n this.state.messages.push({\n role: 'assistant',\n content: content || '',\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message with tool calls\n */\n addAssistantWithToolCalls(content: string | null, toolCalls: ToolCall[]): this {\n this.logger.debug('Adding assistant message with tool calls', { toolCount: toolCalls.length });\n\n this.state.messages.push({\n role: 'assistant',\n content: content,\n tool_calls: toolCalls,\n });\n\n this.state.metadata.toolCallCount += toolCalls.length;\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a tool result message\n */\n addToolResult(toolCallId: string, content: string, toolName?: string): this {\n this.logger.debug('Adding tool result', { toolCallId, toolName });\n\n const message: ConversationMessage = {\n role: 'tool',\n tool_call_id: toolCallId,\n content: content,\n };\n\n if (toolName) {\n message.name = toolName;\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Alias for addToolResult (more intuitive naming)\n */\n addToolMessage(toolCallId: string, content: string, toolName?: string): this {\n return this.addToolResult(toolCallId, content, toolName);\n }\n\n /**\n * Inject context into the conversation with advanced options\n *\n * @param context - Array of content items to inject\n * @param options - Injection options (position, format, deduplication, etc.)\n */\n injectContext(context: DynamicContentItem[], options?: InjectOptions): this {\n const opts: Required<InjectOptions> = {\n position: 'end',\n format: 'structured',\n deduplicate: this.config.deduplicateContext ?? true,\n deduplicateBy: 'id',\n priority: 'medium',\n weight: 1.0,\n category: undefined as any,\n source: undefined as any,\n ...options,\n };\n\n this.logger.debug('Injecting context', { itemCount: context.length, options: opts });\n\n // Filter out duplicates if enabled\n const itemsToAdd: DynamicContentItem[] = [];\n\n for (const item of context) {\n const enrichedItem: DynamicContentItem = {\n ...item,\n priority: item.priority || opts.priority,\n weight: item.weight || opts.weight,\n category: item.category || opts.category,\n source: item.source || opts.source,\n timestamp: item.timestamp || new Date(),\n };\n\n // Check deduplication\n if (opts.deduplicate) {\n let skip = false;\n\n switch (opts.deduplicateBy) {\n case 'id':\n if (enrichedItem.id && this.state.contextManager.hasContext(enrichedItem.id)) {\n this.logger.debug('Skipping duplicate context by ID', { id: enrichedItem.id });\n skip = true;\n }\n break;\n case 'hash':\n if (this.state.contextManager.hasContentHash(enrichedItem.content)) {\n this.logger.debug('Skipping duplicate context by hash');\n skip = true;\n }\n break;\n case 'content':\n if (this.state.contextManager.hasSimilarContent(enrichedItem.content)) {\n this.logger.debug('Skipping duplicate context by content');\n skip = true;\n }\n break;\n }\n\n if (skip) {\n continue;\n }\n }\n\n itemsToAdd.push(enrichedItem);\n }\n\n // Only proceed if we have items to add\n if (itemsToAdd.length === 0) {\n return this;\n }\n\n // Calculate position\n const position = this.calculatePosition(opts.position);\n\n // Format and inject\n for (const item of itemsToAdd) {\n const formatted = this.formatContextItem(item, opts.format);\n const contextMessage: ConversationMessage = {\n role: 'user',\n content: formatted,\n };\n\n this.state.messages.splice(position, 0, contextMessage);\n\n // Track in context manager\n this.state.contextManager.track(item, position);\n }\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Inject system-level context\n */\n injectSystemContext(context: Section<Context> | string): this {\n this.logger.debug('Injecting system context');\n\n let messageContent: string;\n if (typeof context === 'string') {\n messageContent = context;\n } else {\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(context);\n }\n\n this.state.messages.push({\n role: 'system',\n content: messageContent,\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Get the number of messages in the conversation\n */\n getMessageCount(): number {\n return this.state.messages.length;\n }\n\n /**\n * Get the last message in the conversation\n */\n getLastMessage(): ConversationMessage | undefined {\n return this.state.messages[this.state.messages.length - 1];\n }\n\n /**\n * Get all messages\n */\n getMessages(): ConversationMessage[] {\n return [...this.state.messages];\n }\n\n /**\n * Check if conversation has any tool calls\n */\n hasToolCalls(): boolean {\n return this.state.metadata.toolCallCount > 0;\n }\n\n /**\n * Get conversation metadata\n */\n getMetadata(): ConversationMetadata {\n return { ...this.state.metadata };\n }\n\n /**\n * Export messages in OpenAI format\n */\n toMessages(): ConversationMessage[] {\n return this.state.messages.map(msg => ({ ...msg }));\n }\n\n /**\n * Serialize conversation to JSON\n */\n toJSON(): string {\n const serialized: SerializedConversation = {\n messages: this.state.messages,\n metadata: {\n ...this.state.metadata,\n created: this.state.metadata.created.toISOString(),\n lastModified: this.state.metadata.lastModified.toISOString(),\n },\n contextProvided: Array.from(this.state.contextProvided),\n };\n\n return JSON.stringify(serialized, null, 2);\n }\n\n /**\n * Restore conversation from JSON\n */\n static fromJSON(json: string, config?: Partial<ConversationBuilderConfig>, logger?: any): ConversationBuilder {\n const parsed: SerializedConversation = JSON.parse(json);\n\n const builder = ConversationBuilder.create(\n {\n model: parsed.metadata.model,\n ...config,\n },\n logger\n );\n\n // Restore state\n builder.state.messages = parsed.messages;\n builder.state.metadata = {\n ...parsed.metadata,\n created: new Date(parsed.metadata.created),\n lastModified: new Date(parsed.metadata.lastModified),\n };\n builder.state.contextProvided = new Set(parsed.contextProvided);\n\n return builder;\n }\n\n /**\n * Clone the conversation for parallel exploration\n */\n clone(): ConversationBuilder {\n this.logger.debug('Cloning conversation');\n\n const cloned = ConversationBuilder.create(\n { ...this.config },\n this.logger\n );\n\n // Deep copy state (note: contextManager is already created in constructor)\n cloned.state.messages = this.state.messages.map(msg => ({ ...msg }));\n cloned.state.metadata = { ...this.state.metadata };\n cloned.state.contextProvided = new Set(this.state.contextProvided);\n\n // Copy context manager state\n const allContext = this.state.contextManager.getAll();\n allContext.forEach(item => {\n cloned.state.contextManager.track(item, item.position);\n });\n\n return cloned;\n }\n\n /**\n * Truncate conversation to last N messages\n */\n truncate(maxMessages: number): this {\n this.logger.debug('Truncating conversation', { maxMessages, current: this.state.messages.length });\n\n if (this.state.messages.length > maxMessages) {\n this.state.messages = this.state.messages.slice(-maxMessages);\n this.updateMetadata();\n }\n\n return this;\n }\n\n /**\n * Remove all messages of a specific type\n */\n removeMessagesOfType(role: 'system' | 'user' | 'assistant' | 'tool'): this {\n this.logger.debug('Removing messages of type', { role });\n\n this.state.messages = this.state.messages.filter(msg => msg.role !== role);\n this.updateMetadata();\n\n return this;\n }\n\n /**\n * Get the context manager\n */\n getContextManager(): ContextManager {\n return this.state.contextManager;\n }\n\n /**\n * Get conversation state (for conditional injection)\n */\n getState(): ConversationState {\n return {\n messages: [...this.state.messages],\n metadata: { ...this.state.metadata },\n contextProvided: new Set(this.state.contextProvided),\n contextManager: this.state.contextManager,\n };\n }\n\n // ===== SEMANTIC MESSAGE METHODS (Feature 5) =====\n\n /**\n * Add a system message using semantic builder\n */\n asSystem(content: string | Section<Instruction>): this {\n const message = MessageBuilder.system(this.logger)\n .withContent(content)\n .withFormatter(this.config.formatter || Formatter.create())\n .buildForModel(this.config.model);\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a user message using semantic builder\n */\n asUser(content: string | Section<Content>): this {\n const message = MessageBuilder.user(this.logger)\n .withContent(content)\n .withFormatter(this.config.formatter || Formatter.create())\n .buildForModel(this.config.model);\n\n // Check budget if enabled\n if (this.budgetManager) {\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Budget exceeded, compressing conversation');\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message using semantic builder\n */\n asAssistant(content: string | null, toolCalls?: ToolCall[]): this {\n const builder = MessageBuilder.assistant(this.logger)\n .withFormatter(this.config.formatter || Formatter.create());\n\n if (content) {\n builder.withContent(content);\n }\n\n if (toolCalls) {\n builder.withToolCalls(toolCalls);\n }\n\n const message = builder.buildForModel(this.config.model);\n\n if (toolCalls) {\n this.state.metadata.toolCallCount += toolCalls.length;\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a tool result message using semantic builder\n */\n asTool(callId: string, result: any, metadata?: Record<string, any>): this {\n const builder = MessageBuilder.tool(callId, this.logger)\n .withResult(result);\n\n if (metadata) {\n builder.withMetadata(metadata);\n }\n\n const message = builder.buildForModel(this.config.model);\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Configure token budget\n */\n withTokenBudget(config: TokenBudgetConfig): this {\n this.logger.debug('Configuring token budget', { max: config.max });\n this.budgetManager = new TokenBudgetManager(config, this.config.model, this.logger);\n return this;\n }\n\n /**\n * Configure conversation logging\n */\n withLogging(config: LogConfig): this {\n this.logger.debug('Configuring conversation logging');\n this.conversationLogger = new ConversationLogger(config, this.logger);\n this.conversationLogger.onConversationStart({\n model: this.config.model,\n startTime: new Date(),\n });\n return this;\n }\n\n /**\n * Save conversation log\n */\n async saveLog(): Promise<string> {\n if (!this.conversationLogger) {\n throw new Error('Logging not enabled. Call withLogging() first.');\n }\n\n this.conversationLogger.onConversationEnd({\n totalMessages: this.state.messages.length,\n toolCallsExecuted: this.state.metadata.toolCallCount,\n iterations: 0,\n success: true,\n });\n\n return await this.conversationLogger.save();\n }\n\n /**\n * Get current token usage\n */\n getTokenUsage(): TokenUsage {\n if (!this.budgetManager) {\n return { used: 0, max: Infinity, remaining: Infinity, percentage: 0 };\n }\n return this.budgetManager.getCurrentUsage(this.state.messages);\n }\n\n /**\n * Manually compress conversation\n */\n compress(_strategy?: CompressionStrategy): this {\n if (this.budgetManager) {\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n return this;\n }\n\n /**\n * Build and return the builder (for fluent API compatibility)\n */\n build(): this {\n return this;\n }\n\n /**\n * Calculate position for context injection\n */\n private calculatePosition(position: InjectOptions['position']): number {\n if (typeof position === 'number') {\n return Math.max(0, Math.min(position, this.state.messages.length));\n }\n\n switch (position) {\n case 'end':\n return this.state.messages.length;\n case 'before-last':\n return Math.max(0, this.state.messages.length - 1);\n case 'after-system': {\n // Find last system message (reverse search for compatibility)\n let lastSystemIdx = -1;\n for (let i = this.state.messages.length - 1; i >= 0; i--) {\n if (this.state.messages[i].role === 'system') {\n lastSystemIdx = i;\n break;\n }\n }\n return lastSystemIdx >= 0 ? lastSystemIdx + 1 : 0;\n }\n default:\n return this.state.messages.length;\n }\n }\n\n /**\n * Format context item based on format option\n */\n private formatContextItem(item: DynamicContentItem, format: 'structured' | 'inline' | 'reference'): string {\n switch (format) {\n case 'structured': {\n let result = `## ${item.title || 'Context'}\\n\\n${item.content}`;\n\n // Add metadata if available\n const metadata: string[] = [];\n if (item.source) {\n metadata.push(`Source: ${item.source}`);\n }\n if (item.timestamp) {\n metadata.push(`Timestamp: ${item.timestamp.toISOString()}`);\n }\n if (metadata.length > 0) {\n result += `\\n\\n_${metadata.join(' | ')}_`;\n }\n\n return result;\n }\n\n case 'inline':\n return `Note: ${item.title ? `${item.title}: ` : ''}${item.content}`;\n\n case 'reference':\n return `[Context Reference: ${item.id || 'unknown'}]\\nSee attached context${item.title ? ` for ${item.title}` : ''}`;\n\n default:\n return item.content;\n }\n }\n\n /**\n * Update metadata after state changes\n */\n private updateMetadata(): void {\n this.state.metadata.messageCount = this.state.messages.length;\n this.state.metadata.lastModified = new Date();\n }\n}\n\n/**\n * Export the builder for use in other modules\n */\nexport default ConversationBuilder;\n\n"],"names":["ConversationBuilderConfigSchema","z","object","model","string","formatter","any","optional","trackContext","boolean","default","deduplicateContext","ConversationBuilder","create","config","logger","defaultConfig","fromPrompt","prompt","targetModel","debug","Formatter","request","formatPrompt","messages","forEach","msg","state","push","updateMetadata","messageCount","length","addSystemMessage","content","messageContent","format","role","addUserMessage","message","budgetManager","canAddMessage","warn","compress","addAssistantMessage","addAssistantWithToolCalls","toolCalls","toolCount","tool_calls","metadata","toolCallCount","addToolResult","toolCallId","toolName","tool_call_id","name","addToolMessage","injectContext","context","options","opts","position","deduplicate","deduplicateBy","priority","weight","category","undefined","source","itemCount","itemsToAdd","item","enrichedItem","timestamp","Date","skip","id","contextManager","hasContext","hasContentHash","hasSimilarContent","calculatePosition","formatted","formatContextItem","contextMessage","splice","track","injectSystemContext","getMessageCount","getLastMessage","getMessages","hasToolCalls","getMetadata","toMessages","map","toJSON","serialized","created","toISOString","lastModified","contextProvided","Array","from","JSON","stringify","fromJSON","json","parsed","parse","builder","Set","clone","cloned","allContext","getAll","truncate","maxMessages","current","slice","removeMessagesOfType","filter","getContextManager","getState","asSystem","MessageBuilder","system","withContent","withFormatter","buildForModel","asUser","user","asAssistant","assistant","withToolCalls","asTool","callId","result","tool","withResult","withMetadata","withTokenBudget","max","TokenBudgetManager","withLogging","conversationLogger","ConversationLogger","onConversationStart","startTime","saveLog","Error","onConversationEnd","totalMessages","toolCallsExecuted","iterations","success","save","getTokenUsage","used","Infinity","remaining","percentage","getCurrentUsage","_strategy","build","Math","min","lastSystemIdx","i","title","join","wrapLogger","DEFAULT_LOGGER","ContextManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation.js","sources":["../src/conversation.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Model } from \"./chat\";\nimport { ContextManager, type DynamicContentItem } from \"./context-manager\";\nimport { ConversationLogger, type LogConfig } from \"./conversation-logger\";\nimport { Content } from \"./items/content\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { MessageBuilder } from \"./message-builder\";\nimport { Prompt } from \"./prompt\";\nimport * as Formatter from \"./formatter\";\nimport { TokenBudgetManager, type TokenBudgetConfig, type TokenUsage, type CompressionStrategy } from \"./token-budget\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Options for injecting context\n */\nexport interface InjectOptions {\n // Where to inject\n position?: 'end' | 'before-last' | 'after-system' | number;\n\n // How to format\n format?: 'structured' | 'inline' | 'reference';\n\n // Deduplication\n deduplicate?: boolean;\n deduplicateBy?: 'id' | 'content' | 'hash';\n\n // Priority\n priority?: 'high' | 'medium' | 'low';\n weight?: number;\n\n // Metadata\n category?: string;\n source?: string;\n}\n\n/**\n * Represents a tool call made by the assistant\n */\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Message in a conversation (compatible with OpenAI ChatCompletionMessageParam)\n */\nexport interface ConversationMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string | null;\n name?: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\n/**\n * Configuration for ConversationBuilder\n */\nexport interface ConversationBuilderConfig {\n model: Model;\n formatter?: Formatter.Instance;\n trackContext?: boolean;\n deduplicateContext?: boolean;\n}\n\n/**\n * Metadata about the conversation\n */\nexport interface ConversationMetadata {\n model: Model;\n created: Date;\n lastModified: Date;\n messageCount: number;\n toolCallCount: number;\n}\n\n/**\n * Internal state of a conversation\n */\nexport interface ConversationState {\n messages: ConversationMessage[];\n metadata: ConversationMetadata;\n contextProvided: Set<string>;\n contextManager: ContextManager;\n}\n\n/**\n * Serializable conversation state for persistence\n */\nexport interface SerializedConversation {\n messages: ConversationMessage[];\n metadata: Omit<ConversationMetadata, 'created' | 'lastModified'> & {\n created: string;\n lastModified: string;\n };\n contextProvided: string[];\n}\n\n// ===== SCHEMAS =====\n\nconst ConversationBuilderConfigSchema = z.object({\n model: z.string(),\n formatter: z.any().optional(),\n trackContext: z.boolean().optional().default(true),\n deduplicateContext: z.boolean().optional().default(true),\n});\n\n// ===== CONVERSATION BUILDER =====\n\n/**\n * ConversationBuilder manages multi-turn conversations with full lifecycle support.\n *\n * Features:\n * - Initialize from RiotPrompt prompts\n * - Add messages of any type (system, user, assistant, tool)\n * - Handle tool calls and results\n * - Inject dynamic context\n * - Clone for parallel exploration\n * - Serialize/deserialize for persistence\n *\n * @example\n * ```typescript\n * // Create from prompt\n * const conversation = ConversationBuilder.create()\n * .fromPrompt(prompt, 'gpt-4o')\n * .build();\n *\n * // Add messages\n * conversation.addUserMessage('Analyze this code');\n *\n * // Handle tool calls\n * conversation.addAssistantWithToolCalls(null, toolCalls);\n * conversation.addToolResult(toolCallId, result);\n *\n * // Export\n * const messages = conversation.toMessages();\n * ```\n */\nexport class ConversationBuilder {\n private state: ConversationState;\n private config: ConversationBuilderConfig;\n private logger: any;\n private budgetManager?: TokenBudgetManager;\n private conversationLogger?: ConversationLogger;\n\n private constructor(config: ConversationBuilderConfig, logger?: any) {\n this.config = ConversationBuilderConfigSchema.parse(config) as ConversationBuilderConfig;\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ConversationBuilder');\n\n this.state = {\n messages: [],\n metadata: {\n model: this.config.model,\n created: new Date(),\n lastModified: new Date(),\n messageCount: 0,\n toolCallCount: 0,\n },\n contextProvided: new Set<string>(),\n contextManager: new ContextManager(logger),\n };\n\n this.logger.debug('Created ConversationBuilder', { model: this.config.model });\n }\n\n /**\n * Create a new ConversationBuilder instance\n */\n static create(config?: Partial<ConversationBuilderConfig>, logger?: any): ConversationBuilder {\n const defaultConfig: ConversationBuilderConfig = {\n model: 'gpt-4o',\n trackContext: true,\n deduplicateContext: true,\n ...config,\n };\n\n return new ConversationBuilder(defaultConfig, logger);\n }\n\n /**\n * Initialize conversation from a RiotPrompt prompt\n */\n fromPrompt(prompt: Prompt, model?: Model): this {\n const targetModel = model || this.config.model;\n this.logger.debug('Initializing from prompt', { model: targetModel });\n\n // Use formatter (provided or create new one)\n const formatter = this.config.formatter || Formatter.create();\n const request = formatter.formatPrompt(targetModel, prompt);\n\n // Add all messages from formatted request\n request.messages.forEach(msg => {\n this.state.messages.push(msg as ConversationMessage);\n });\n\n this.updateMetadata();\n this.logger.debug('Initialized from prompt', { messageCount: this.state.messages.length });\n\n return this;\n }\n\n /**\n * Add a system message\n */\n addSystemMessage(content: string | Section<Instruction>): this {\n this.logger.debug('Adding system message');\n\n let messageContent: string;\n if (typeof content === 'string') {\n messageContent = content;\n } else {\n // Format section using formatter\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(content);\n }\n\n this.state.messages.push({\n role: 'system',\n content: messageContent,\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a user message (with automatic budget management)\n */\n addUserMessage(content: string | Section<Content>): this {\n this.logger.debug('Adding user message');\n\n let messageContent: string;\n if (typeof content === 'string') {\n messageContent = content;\n } else {\n // Format section using formatter\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(content);\n }\n\n const message: ConversationMessage = {\n role: 'user',\n content: messageContent,\n };\n\n // Check budget if enabled\n if (this.budgetManager) {\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Budget exceeded, compressing conversation');\n this.state.messages = this.budgetManager.compress(this.state.messages);\n\n // Re-check after compression and warn if still over budget\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Token budget still exceeded after compression, adding message anyway');\n // Note: We add the message anyway to maintain backward compatibility\n // Consider setting onBudgetExceeded: 'error' in config if strict enforcement is needed\n }\n }\n }\n\n this.state.messages.push(message);\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message\n */\n addAssistantMessage(content: string | null): this {\n this.logger.debug('Adding assistant message');\n\n this.state.messages.push({\n role: 'assistant',\n content: content || '',\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message with tool calls\n */\n addAssistantWithToolCalls(content: string | null, toolCalls: ToolCall[]): this {\n this.logger.debug('Adding assistant message with tool calls', { toolCount: toolCalls.length });\n\n this.state.messages.push({\n role: 'assistant',\n content: content,\n tool_calls: toolCalls,\n });\n\n this.state.metadata.toolCallCount += toolCalls.length;\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a tool result message\n */\n addToolResult(toolCallId: string, content: string, toolName?: string): this {\n this.logger.debug('Adding tool result', { toolCallId, toolName });\n\n const message: ConversationMessage = {\n role: 'tool',\n tool_call_id: toolCallId,\n content: content,\n };\n\n if (toolName) {\n message.name = toolName;\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Alias for addToolResult (more intuitive naming)\n */\n addToolMessage(toolCallId: string, content: string, toolName?: string): this {\n return this.addToolResult(toolCallId, content, toolName);\n }\n\n /**\n * Inject context into the conversation with advanced options\n *\n * @param context - Array of content items to inject\n * @param options - Injection options (position, format, deduplication, etc.)\n */\n injectContext(context: DynamicContentItem[], options?: InjectOptions): this {\n const opts: Required<InjectOptions> = {\n position: 'end',\n format: 'structured',\n deduplicate: this.config.deduplicateContext ?? true,\n deduplicateBy: 'id',\n priority: 'medium',\n weight: 1.0,\n category: undefined as any,\n source: undefined as any,\n ...options,\n };\n\n this.logger.debug('Injecting context', { itemCount: context.length, options: opts });\n\n // Filter out duplicates if enabled\n const itemsToAdd: DynamicContentItem[] = [];\n\n for (const item of context) {\n const enrichedItem: DynamicContentItem = {\n ...item,\n priority: item.priority || opts.priority,\n weight: item.weight || opts.weight,\n category: item.category || opts.category,\n source: item.source || opts.source,\n timestamp: item.timestamp || new Date(),\n };\n\n // Check deduplication\n if (opts.deduplicate) {\n let skip = false;\n\n switch (opts.deduplicateBy) {\n case 'id':\n if (enrichedItem.id && this.state.contextManager.hasContext(enrichedItem.id)) {\n this.logger.debug('Skipping duplicate context by ID', { id: enrichedItem.id });\n skip = true;\n }\n break;\n case 'hash':\n if (this.state.contextManager.hasContentHash(enrichedItem.content)) {\n this.logger.debug('Skipping duplicate context by hash');\n skip = true;\n }\n break;\n case 'content':\n if (this.state.contextManager.hasSimilarContent(enrichedItem.content)) {\n this.logger.debug('Skipping duplicate context by content');\n skip = true;\n }\n break;\n }\n\n if (skip) {\n continue;\n }\n }\n\n itemsToAdd.push(enrichedItem);\n }\n\n // Only proceed if we have items to add\n if (itemsToAdd.length === 0) {\n return this;\n }\n\n // Calculate position\n const position = this.calculatePosition(opts.position);\n\n // Format and inject\n for (let i = 0; i < itemsToAdd.length; i++) {\n const item = itemsToAdd[i];\n const formatted = this.formatContextItem(item, opts.format);\n const contextMessage: ConversationMessage = {\n role: 'user',\n content: formatted,\n };\n\n // Each item is inserted at position + index to maintain order\n const actualPosition = position + i;\n this.state.messages.splice(actualPosition, 0, contextMessage);\n\n // Track in context manager with correct position\n this.state.contextManager.track(item, actualPosition);\n }\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Inject system-level context\n */\n injectSystemContext(context: Section<Context> | string): this {\n this.logger.debug('Injecting system context');\n\n let messageContent: string;\n if (typeof context === 'string') {\n messageContent = context;\n } else {\n const formatter = this.config.formatter || Formatter.create();\n messageContent = formatter.format(context);\n }\n\n this.state.messages.push({\n role: 'system',\n content: messageContent,\n });\n\n this.updateMetadata();\n return this;\n }\n\n /**\n * Get the number of messages in the conversation\n */\n getMessageCount(): number {\n return this.state.messages.length;\n }\n\n /**\n * Get the last message in the conversation\n */\n getLastMessage(): ConversationMessage | undefined {\n return this.state.messages[this.state.messages.length - 1];\n }\n\n /**\n * Get all messages\n */\n getMessages(): ConversationMessage[] {\n return [...this.state.messages];\n }\n\n /**\n * Check if conversation has any tool calls\n */\n hasToolCalls(): boolean {\n return this.state.metadata.toolCallCount > 0;\n }\n\n /**\n * Get conversation metadata\n */\n getMetadata(): ConversationMetadata {\n return { ...this.state.metadata };\n }\n\n /**\n * Export messages in OpenAI format (deep copy to prevent shared state)\n */\n toMessages(): ConversationMessage[] {\n return this.state.messages.map(msg => ({\n ...msg,\n tool_calls: msg.tool_calls ? msg.tool_calls.map(tc => ({\n ...tc,\n function: { ...tc.function }\n })) : undefined\n }));\n }\n\n /**\n * Serialize conversation to JSON\n */\n toJSON(): string {\n const serialized: SerializedConversation = {\n messages: this.state.messages,\n metadata: {\n ...this.state.metadata,\n created: this.state.metadata.created.toISOString(),\n lastModified: this.state.metadata.lastModified.toISOString(),\n },\n contextProvided: Array.from(this.state.contextProvided),\n };\n\n return JSON.stringify(serialized, null, 2);\n }\n\n /**\n * Restore conversation from JSON\n */\n static fromJSON(json: string, config?: Partial<ConversationBuilderConfig>, logger?: any): ConversationBuilder {\n const parsed: SerializedConversation = JSON.parse(json);\n\n const builder = ConversationBuilder.create(\n {\n model: parsed.metadata.model,\n ...config,\n },\n logger\n );\n\n // Restore state\n builder.state.messages = parsed.messages;\n builder.state.metadata = {\n ...parsed.metadata,\n created: new Date(parsed.metadata.created),\n lastModified: new Date(parsed.metadata.lastModified),\n };\n builder.state.contextProvided = new Set(parsed.contextProvided);\n\n return builder;\n }\n\n /**\n * Clone the conversation for parallel exploration (deep copy to prevent shared state)\n */\n clone(): ConversationBuilder {\n this.logger.debug('Cloning conversation');\n\n const cloned = ConversationBuilder.create(\n { ...this.config },\n this.logger\n );\n\n // Deep copy state (note: contextManager is already created in constructor)\n cloned.state.messages = this.state.messages.map(msg => ({\n ...msg,\n tool_calls: msg.tool_calls ? msg.tool_calls.map(tc => ({\n ...tc,\n function: { ...tc.function }\n })) : undefined\n }));\n cloned.state.metadata = { ...this.state.metadata };\n cloned.state.contextProvided = new Set(this.state.contextProvided);\n\n // Copy context manager state\n const allContext = this.state.contextManager.getAll();\n allContext.forEach(item => {\n cloned.state.contextManager.track(item, item.position);\n });\n\n return cloned;\n }\n\n /**\n * Truncate conversation to last N messages\n */\n truncate(maxMessages: number): this {\n this.logger.debug('Truncating conversation', { maxMessages, current: this.state.messages.length });\n\n if (this.state.messages.length > maxMessages) {\n this.state.messages = this.state.messages.slice(-maxMessages);\n this.updateMetadata();\n }\n\n return this;\n }\n\n /**\n * Remove all messages of a specific type\n */\n removeMessagesOfType(role: 'system' | 'user' | 'assistant' | 'tool'): this {\n this.logger.debug('Removing messages of type', { role });\n\n this.state.messages = this.state.messages.filter(msg => msg.role !== role);\n this.updateMetadata();\n\n return this;\n }\n\n /**\n * Get the context manager\n */\n getContextManager(): ContextManager {\n return this.state.contextManager;\n }\n\n /**\n * Get conversation state (for conditional injection)\n */\n getState(): ConversationState {\n return {\n messages: [...this.state.messages],\n metadata: { ...this.state.metadata },\n contextProvided: new Set(this.state.contextProvided),\n contextManager: this.state.contextManager,\n };\n }\n\n // ===== SEMANTIC MESSAGE METHODS (Feature 5) =====\n\n /**\n * Add a system message using semantic builder\n */\n asSystem(content: string | Section<Instruction>): this {\n const message = MessageBuilder.system(this.logger)\n .withContent(content)\n .withFormatter(this.config.formatter || Formatter.create())\n .buildForModel(this.config.model);\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a user message using semantic builder\n */\n asUser(content: string | Section<Content>): this {\n const message = MessageBuilder.user(this.logger)\n .withContent(content)\n .withFormatter(this.config.formatter || Formatter.create())\n .buildForModel(this.config.model);\n\n // Check budget if enabled\n if (this.budgetManager) {\n if (!this.budgetManager.canAddMessage(message, this.state.messages)) {\n this.logger.warn('Budget exceeded, compressing conversation');\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add an assistant message using semantic builder\n */\n asAssistant(content: string | null, toolCalls?: ToolCall[]): this {\n const builder = MessageBuilder.assistant(this.logger)\n .withFormatter(this.config.formatter || Formatter.create());\n\n if (content) {\n builder.withContent(content);\n }\n\n if (toolCalls) {\n builder.withToolCalls(toolCalls);\n }\n\n const message = builder.buildForModel(this.config.model);\n\n if (toolCalls) {\n this.state.metadata.toolCallCount += toolCalls.length;\n }\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Add a tool result message using semantic builder\n */\n asTool(callId: string, result: any, metadata?: Record<string, any>): this {\n const builder = MessageBuilder.tool(callId, this.logger)\n .withResult(result);\n\n if (metadata) {\n builder.withMetadata(metadata);\n }\n\n const message = builder.buildForModel(this.config.model);\n\n this.state.messages.push(message);\n this.updateMetadata();\n return this;\n }\n\n /**\n * Configure token budget\n */\n withTokenBudget(config: TokenBudgetConfig): this {\n this.logger.debug('Configuring token budget', { max: config.max });\n this.budgetManager = new TokenBudgetManager(config, this.config.model, this.logger);\n return this;\n }\n\n /**\n * Configure conversation logging\n */\n withLogging(config: LogConfig): this {\n this.logger.debug('Configuring conversation logging');\n this.conversationLogger = new ConversationLogger(config, this.logger);\n this.conversationLogger.onConversationStart({\n model: this.config.model,\n startTime: new Date(),\n });\n return this;\n }\n\n /**\n * Save conversation log\n */\n async saveLog(): Promise<string> {\n if (!this.conversationLogger) {\n throw new Error('Logging not enabled. Call withLogging() first.');\n }\n\n this.conversationLogger.onConversationEnd({\n totalMessages: this.state.messages.length,\n toolCallsExecuted: this.state.metadata.toolCallCount,\n iterations: 0,\n success: true,\n });\n\n return await this.conversationLogger.save();\n }\n\n /**\n * Get current token usage\n */\n getTokenUsage(): TokenUsage {\n if (!this.budgetManager) {\n return { used: 0, max: Infinity, remaining: Infinity, percentage: 0 };\n }\n return this.budgetManager.getCurrentUsage(this.state.messages);\n }\n\n /**\n * Manually compress conversation\n */\n compress(_strategy?: CompressionStrategy): this {\n if (this.budgetManager) {\n this.state.messages = this.budgetManager.compress(this.state.messages);\n }\n return this;\n }\n\n /**\n * Build and return the builder (for fluent API compatibility)\n */\n build(): this {\n return this;\n }\n\n /**\n * Calculate position for context injection\n *\n * Positions:\n * - 'end': After all messages\n * - 'before-last': Before the last message\n * - 'after-system': After the LAST system message (useful for models with multiple system messages)\n * - number: Specific index (clamped to valid range)\n */\n private calculatePosition(position: InjectOptions['position']): number {\n if (typeof position === 'number') {\n return Math.max(0, Math.min(position, this.state.messages.length));\n }\n\n switch (position) {\n case 'end':\n return this.state.messages.length;\n case 'before-last':\n return Math.max(0, this.state.messages.length - 1);\n case 'after-system': {\n // Find last system message (uses reverse search to find most recent system message)\n let lastSystemIdx = -1;\n for (let i = this.state.messages.length - 1; i >= 0; i--) {\n if (this.state.messages[i].role === 'system') {\n lastSystemIdx = i;\n break;\n }\n }\n return lastSystemIdx >= 0 ? lastSystemIdx + 1 : 0;\n }\n default:\n return this.state.messages.length;\n }\n }\n\n /**\n * Format context item based on format option\n */\n private formatContextItem(item: DynamicContentItem, format: 'structured' | 'inline' | 'reference'): string {\n switch (format) {\n case 'structured': {\n let result = `## ${item.title || 'Context'}\\n\\n${item.content}`;\n\n // Add metadata if available\n const metadata: string[] = [];\n if (item.source) {\n metadata.push(`Source: ${item.source}`);\n }\n if (item.timestamp) {\n metadata.push(`Timestamp: ${item.timestamp.toISOString()}`);\n }\n if (metadata.length > 0) {\n result += `\\n\\n_${metadata.join(' | ')}_`;\n }\n\n return result;\n }\n\n case 'inline':\n return `Note: ${item.title ? `${item.title}: ` : ''}${item.content}`;\n\n case 'reference':\n return `[Context Reference: ${item.id || 'unknown'}]\\nSee attached context${item.title ? ` for ${item.title}` : ''}`;\n\n default:\n return item.content;\n }\n }\n\n /**\n * Update metadata after state changes\n */\n private updateMetadata(): void {\n this.state.metadata.messageCount = this.state.messages.length;\n this.state.metadata.lastModified = new Date();\n }\n}\n\n/**\n * Export the builder for use in other modules\n */\nexport default ConversationBuilder;\n\n"],"names":["ConversationBuilderConfigSchema","z","object","model","string","formatter","any","optional","trackContext","boolean","default","deduplicateContext","ConversationBuilder","create","config","logger","defaultConfig","fromPrompt","prompt","targetModel","debug","Formatter","request","formatPrompt","messages","forEach","msg","state","push","updateMetadata","messageCount","length","addSystemMessage","content","messageContent","format","role","addUserMessage","message","budgetManager","canAddMessage","warn","compress","addAssistantMessage","addAssistantWithToolCalls","toolCalls","toolCount","tool_calls","metadata","toolCallCount","addToolResult","toolCallId","toolName","tool_call_id","name","addToolMessage","injectContext","context","options","opts","position","deduplicate","deduplicateBy","priority","weight","category","undefined","source","itemCount","itemsToAdd","item","enrichedItem","timestamp","Date","skip","id","contextManager","hasContext","hasContentHash","hasSimilarContent","calculatePosition","i","formatted","formatContextItem","contextMessage","actualPosition","splice","track","injectSystemContext","getMessageCount","getLastMessage","getMessages","hasToolCalls","getMetadata","toMessages","map","tc","function","toJSON","serialized","created","toISOString","lastModified","contextProvided","Array","from","JSON","stringify","fromJSON","json","parsed","parse","builder","Set","clone","cloned","allContext","getAll","truncate","maxMessages","current","slice","removeMessagesOfType","filter","getContextManager","getState","asSystem","MessageBuilder","system","withContent","withFormatter","buildForModel","asUser","user","asAssistant","assistant","withToolCalls","asTool","callId","result","tool","withResult","withMetadata","withTokenBudget","max","TokenBudgetManager","withLogging","conversationLogger","ConversationLogger","onConversationStart","startTime","saveLog","Error","onConversationEnd","totalMessages","toolCallsExecuted","iterations","success","save","getTokenUsage","used","Infinity","remaining","percentage","getCurrentUsage","_strategy","build","Math","min","lastSystemIdx","title","join","wrapLogger","DEFAULT_LOGGER","ContextManager"],"mappings":"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"}
|
package/dist/items/section.js
CHANGED
|
@@ -23,7 +23,7 @@ const create = (options = {})=>{
|
|
|
23
23
|
};
|
|
24
24
|
if (Array.isArray(item)) {
|
|
25
25
|
item.forEach((item)=>{
|
|
26
|
-
append(item);
|
|
26
|
+
append(item, options); // Propagate options to array items
|
|
27
27
|
});
|
|
28
28
|
} else {
|
|
29
29
|
if (typeof item === 'string') {
|
|
@@ -42,7 +42,7 @@ const create = (options = {})=>{
|
|
|
42
42
|
};
|
|
43
43
|
if (Array.isArray(item)) {
|
|
44
44
|
item.forEach((item)=>{
|
|
45
|
-
prepend(item);
|
|
45
|
+
prepend(item, options); // Propagate options to array items
|
|
46
46
|
});
|
|
47
47
|
} else {
|
|
48
48
|
if (typeof item === 'string') {
|
|
@@ -61,7 +61,7 @@ const create = (options = {})=>{
|
|
|
61
61
|
};
|
|
62
62
|
if (Array.isArray(item)) {
|
|
63
63
|
item.forEach((item)=>{
|
|
64
|
-
insert(index, item);
|
|
64
|
+
insert(index, item, options); // Propagate options to array items
|
|
65
65
|
});
|
|
66
66
|
} else {
|
|
67
67
|
if (typeof item === 'string') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section.js","sources":["../../src/items/section.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ParametersSchema } from \"./parameters\";\nimport { Weighted, WeightedOptions, WeightedOptionsSchema, create as createWeighted } from \"./weighted\";\n\nexport interface Section<T extends Weighted> {\n title?: string;\n items: (T | Section<T>)[];\n weight?: number;\n add: (\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n append: (\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n prepend: (\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n insert: (\n index: number,\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n replace: (\n index: number,\n item: T | Section<T> | string,\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n remove: (index: number) => Section<T>;\n toJSON: () => { title?: string; items: any[]; weight?: number; };\n}\n\nexport const SectionOptionsSchema = z.object({\n title: z.string().optional(),\n weight: z.number().optional(),\n itemWeight: z.number().optional(),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type SectionOptions = z.infer<typeof SectionOptionsSchema>;\n\nexport const isSection = (object: any): boolean => {\n return object !== undefined && object != null && typeof object === 'object' && 'items' in object;\n}\n\nexport const convertToSection = (\n object: any,\n options: Partial<SectionOptions> = {}\n): Section<Weighted> => {\n const sectionOptions = SectionOptionsSchema.parse(options);\n\n const weightedOptions = WeightedOptionsSchema.parse({\n ...sectionOptions,\n weight: sectionOptions.itemWeight,\n });\n\n if (isSection(object)) {\n const section = create({ ...sectionOptions, title: object.title });\n object.items.forEach((item: any) => {\n if (isSection(item)) {\n section.append(convertToSection(item, sectionOptions));\n } else {\n section.append(createWeighted(item.text, weightedOptions));\n }\n });\n return section;\n } else {\n throw new Error('Object is not a section');\n }\n}\n\nexport const create = <T extends Weighted>(\n options: Partial<SectionOptions> = {}\n): Section<T> => {\n const items: (T | Section<T>)[] = [];\n const sectionOptions = SectionOptionsSchema.parse(options);\n\n const sectionItemOptions = WeightedOptionsSchema.parse({\n ...sectionOptions,\n weight: sectionOptions.itemWeight,\n });\n\n const append = (item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (Array.isArray(item)) {\n item.forEach((item) => {\n append(item);\n });\n } else {\n if (typeof item === 'string') {\n items.push(createWeighted<T>(item, itemOptions));\n } else {\n items.push(item);\n }\n }\n return section;\n }\n\n const prepend = (item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (Array.isArray(item)) {\n item.forEach((item) => {\n prepend(item);\n });\n } else {\n if (typeof item === 'string') {\n items.unshift(createWeighted<T>(item, itemOptions));\n } else {\n items.unshift(item);\n }\n }\n return section;\n }\n\n const insert = (index: number, item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (Array.isArray(item)) {\n item.forEach((item) => {\n insert(index, item);\n });\n } else {\n if (typeof item === 'string') {\n items.splice(index, 0, createWeighted<T>(item, itemOptions));\n } else {\n items.splice(index, 0, item);\n }\n }\n return section;\n }\n\n const remove = (index: number): Section<T> => {\n items.splice(index, 1);\n return section;\n }\n\n const replace = (index: number, item: T | Section<T> | string, options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (typeof item === 'string') {\n items[index] = createWeighted<T>(item, itemOptions);\n } else {\n items[index] = item;\n }\n return section;\n }\n\n const add = (item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n return append(item, itemOptions);\n }\n\n const toJSON = () => {\n return {\n title: section.title,\n items: items.map(item => {\n // If the item has a toJSON method, call it, otherwise return the item itself\n return typeof item === 'object' && item !== null && 'toJSON' in item && typeof item.toJSON === 'function'\n ? item.toJSON()\n : item;\n }),\n weight: section.weight,\n };\n };\n\n const section: Section<T> = {\n title: sectionOptions.title,\n items,\n weight: sectionOptions.weight,\n add,\n append,\n prepend,\n insert,\n remove,\n replace,\n toJSON,\n }\n\n return section;\n}\n\n\n"],"names":["SectionOptionsSchema","z","object","title","string","optional","weight","number","itemWeight","parameters","ParametersSchema","default","create","options","items","sectionOptions","parse","sectionItemOptions","WeightedOptionsSchema","append","item","itemOptions","Array","isArray","forEach","push","createWeighted","section","prepend","unshift","insert","index","splice","remove","replace","add","toJSON","map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"section.js","sources":["../../src/items/section.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { ParametersSchema } from \"./parameters\";\nimport { Weighted, WeightedOptions, WeightedOptionsSchema, create as createWeighted } from \"./weighted\";\n\nexport interface Section<T extends Weighted> {\n title?: string;\n items: (T | Section<T>)[];\n weight?: number;\n add: (\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n append: (\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n prepend: (\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n insert: (\n index: number,\n item: T | T[] | Section<T> | Section<T>[] | string | string[],\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n replace: (\n index: number,\n item: T | Section<T> | string,\n options?: Partial<WeightedOptions>\n ) => Section<T>;\n remove: (index: number) => Section<T>;\n toJSON: () => { title?: string; items: any[]; weight?: number; };\n}\n\nexport const SectionOptionsSchema = z.object({\n title: z.string().optional(),\n weight: z.number().optional(),\n itemWeight: z.number().optional(),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type SectionOptions = z.infer<typeof SectionOptionsSchema>;\n\nexport const isSection = (object: any): boolean => {\n return object !== undefined && object != null && typeof object === 'object' && 'items' in object;\n}\n\nexport const convertToSection = (\n object: any,\n options: Partial<SectionOptions> = {}\n): Section<Weighted> => {\n const sectionOptions = SectionOptionsSchema.parse(options);\n\n const weightedOptions = WeightedOptionsSchema.parse({\n ...sectionOptions,\n weight: sectionOptions.itemWeight,\n });\n\n if (isSection(object)) {\n const section = create({ ...sectionOptions, title: object.title });\n object.items.forEach((item: any) => {\n if (isSection(item)) {\n section.append(convertToSection(item, sectionOptions));\n } else {\n section.append(createWeighted(item.text, weightedOptions));\n }\n });\n return section;\n } else {\n throw new Error('Object is not a section');\n }\n}\n\nexport const create = <T extends Weighted>(\n options: Partial<SectionOptions> = {}\n): Section<T> => {\n const items: (T | Section<T>)[] = [];\n const sectionOptions = SectionOptionsSchema.parse(options);\n\n const sectionItemOptions = WeightedOptionsSchema.parse({\n ...sectionOptions,\n weight: sectionOptions.itemWeight,\n });\n\n const append = (item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (Array.isArray(item)) {\n item.forEach((item) => {\n append(item, options); // Propagate options to array items\n });\n } else {\n if (typeof item === 'string') {\n items.push(createWeighted<T>(item, itemOptions));\n } else {\n items.push(item);\n }\n }\n return section;\n }\n\n const prepend = (item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (Array.isArray(item)) {\n item.forEach((item) => {\n prepend(item, options); // Propagate options to array items\n });\n } else {\n if (typeof item === 'string') {\n items.unshift(createWeighted<T>(item, itemOptions));\n } else {\n items.unshift(item);\n }\n }\n return section;\n }\n\n const insert = (index: number, item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (Array.isArray(item)) {\n item.forEach((item) => {\n insert(index, item, options); // Propagate options to array items\n });\n } else {\n if (typeof item === 'string') {\n items.splice(index, 0, createWeighted<T>(item, itemOptions));\n } else {\n items.splice(index, 0, item);\n }\n }\n return section;\n }\n\n const remove = (index: number): Section<T> => {\n items.splice(index, 1);\n return section;\n }\n\n const replace = (index: number, item: T | Section<T> | string, options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n if (typeof item === 'string') {\n items[index] = createWeighted<T>(item, itemOptions);\n } else {\n items[index] = item;\n }\n return section;\n }\n\n const add = (item: T | T[] | Section<T> | Section<T>[] | string | string[], options: Partial<WeightedOptions> = {}): Section<T> => {\n let itemOptions: WeightedOptions = WeightedOptionsSchema.parse(options);\n itemOptions = { ...sectionItemOptions, ...itemOptions };\n\n return append(item, itemOptions);\n }\n\n const toJSON = () => {\n return {\n title: section.title,\n items: items.map(item => {\n // If the item has a toJSON method, call it, otherwise return the item itself\n return typeof item === 'object' && item !== null && 'toJSON' in item && typeof item.toJSON === 'function'\n ? item.toJSON()\n : item;\n }),\n weight: section.weight,\n };\n };\n\n const section: Section<T> = {\n title: sectionOptions.title,\n items,\n weight: sectionOptions.weight,\n add,\n append,\n prepend,\n insert,\n remove,\n replace,\n toJSON,\n }\n\n return section;\n}\n\n\n"],"names":["SectionOptionsSchema","z","object","title","string","optional","weight","number","itemWeight","parameters","ParametersSchema","default","create","options","items","sectionOptions","parse","sectionItemOptions","WeightedOptionsSchema","append","item","itemOptions","Array","isArray","forEach","push","createWeighted","section","prepend","unshift","insert","index","splice","remove","replace","add","toJSON","map"],"mappings":"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"}
|
|
@@ -34,6 +34,7 @@ export interface StrategyState {
|
|
|
34
34
|
insights: Insight[];
|
|
35
35
|
findings: any[];
|
|
36
36
|
errors: Error[];
|
|
37
|
+
toolFailures: Map<string, number>;
|
|
37
38
|
[key: string]: any;
|
|
38
39
|
}
|
|
39
40
|
/**
|
|
@@ -100,6 +101,7 @@ export interface StrategyPhase {
|
|
|
100
101
|
earlyExit?: boolean;
|
|
101
102
|
requireFinalAnswer?: boolean;
|
|
102
103
|
adaptiveDepth?: boolean;
|
|
104
|
+
maxConsecutiveToolFailures?: number;
|
|
103
105
|
continueIf?: (state: StrategyState) => boolean;
|
|
104
106
|
skipIf?: (state: StrategyState) => boolean;
|
|
105
107
|
}
|
|
@@ -61,7 +61,8 @@ function _define_property(obj, key, value) {
|
|
|
61
61
|
startTime,
|
|
62
62
|
insights: [],
|
|
63
63
|
findings: [],
|
|
64
|
-
errors: []
|
|
64
|
+
errors: [],
|
|
65
|
+
toolFailures: new Map()
|
|
65
66
|
};
|
|
66
67
|
this.logger.info('Starting strategy execution', {
|
|
67
68
|
strategy: strategy.name
|
|
@@ -101,10 +102,6 @@ function _define_property(obj, key, value) {
|
|
|
101
102
|
});
|
|
102
103
|
const phaseResult = await this.executePhase(conversation, tools, phase, state, strategy);
|
|
103
104
|
phaseResults.push(phaseResult);
|
|
104
|
-
// Track iteration for metrics
|
|
105
|
-
if (this.metricsCollector) {
|
|
106
|
-
this.metricsCollector.incrementIteration();
|
|
107
|
-
}
|
|
108
105
|
await ((_strategy_onPhaseComplete = strategy.onPhaseComplete) === null || _strategy_onPhaseComplete === void 0 ? void 0 : _strategy_onPhaseComplete.call(strategy, phaseResult, state));
|
|
109
106
|
// Check if should continue
|
|
110
107
|
if (strategy.shouldContinue && !strategy.shouldContinue(state)) {
|
|
@@ -199,6 +196,10 @@ function _define_property(obj, key, value) {
|
|
|
199
196
|
for(let i = 0; i < phase.maxIterations; i++){
|
|
200
197
|
var _strategy_onIteration;
|
|
201
198
|
state.iteration++;
|
|
199
|
+
// Track iteration for metrics
|
|
200
|
+
if (this.metricsCollector) {
|
|
201
|
+
this.metricsCollector.incrementIteration();
|
|
202
|
+
}
|
|
202
203
|
this.logger.debug('Iteration', {
|
|
203
204
|
phase: phase.name,
|
|
204
205
|
iteration: i + 1
|
|
@@ -224,6 +225,7 @@ function _define_property(obj, key, value) {
|
|
|
224
225
|
conversation.asAssistant(response.content, response.tool_calls);
|
|
225
226
|
// Execute tools
|
|
226
227
|
for (const toolCall of response.tool_calls){
|
|
228
|
+
var _phase_maxConsecutiveToolFailures;
|
|
227
229
|
var _strategy_onToolCall;
|
|
228
230
|
// Check if tool is allowed in this phase
|
|
229
231
|
if (phase.allowedTools && !phase.allowedTools.includes(toolCall.function.name)) {
|
|
@@ -232,6 +234,22 @@ function _define_property(obj, key, value) {
|
|
|
232
234
|
});
|
|
233
235
|
continue;
|
|
234
236
|
}
|
|
237
|
+
// Circuit breaker: Check if tool has exceeded failure threshold
|
|
238
|
+
const maxFailures = (_phase_maxConsecutiveToolFailures = phase.maxConsecutiveToolFailures) !== null && _phase_maxConsecutiveToolFailures !== void 0 ? _phase_maxConsecutiveToolFailures : 3;
|
|
239
|
+
const consecutiveFailures = state.toolFailures.get(toolCall.function.name) || 0;
|
|
240
|
+
if (consecutiveFailures >= maxFailures) {
|
|
241
|
+
this.logger.warn('Tool circuit breaker triggered', {
|
|
242
|
+
tool: toolCall.function.name,
|
|
243
|
+
failures: consecutiveFailures
|
|
244
|
+
});
|
|
245
|
+
conversation.asTool(toolCall.id, {
|
|
246
|
+
error: `Tool temporarily disabled due to ${consecutiveFailures} consecutive failures`
|
|
247
|
+
}, {
|
|
248
|
+
success: false,
|
|
249
|
+
circuitBreakerTriggered: true
|
|
250
|
+
});
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
235
253
|
// Check tool call hook
|
|
236
254
|
const toolAction = await ((_strategy_onToolCall = strategy.onToolCall) === null || _strategy_onToolCall === void 0 ? void 0 : _strategy_onToolCall.call(strategy, toolCall, state));
|
|
237
255
|
if (toolAction === 'skip') {
|
|
@@ -241,7 +259,18 @@ function _define_property(obj, key, value) {
|
|
|
241
259
|
const toolStart = Date.now();
|
|
242
260
|
try {
|
|
243
261
|
var _strategy_onToolResult;
|
|
244
|
-
|
|
262
|
+
// Parse tool arguments with error handling
|
|
263
|
+
let toolArgs;
|
|
264
|
+
try {
|
|
265
|
+
toolArgs = JSON.parse(toolCall.function.arguments);
|
|
266
|
+
} catch (parseError) {
|
|
267
|
+
const error = new Error(`Invalid JSON in tool arguments for ${toolCall.function.name}: ${parseError instanceof Error ? parseError.message : String(parseError)}`);
|
|
268
|
+
if (parseError instanceof Error) {
|
|
269
|
+
error.cause = parseError; // Preserve original error
|
|
270
|
+
}
|
|
271
|
+
throw error;
|
|
272
|
+
}
|
|
273
|
+
const result = await tools.execute(toolCall.function.name, toolArgs);
|
|
245
274
|
const toolDuration = Date.now() - toolStart;
|
|
246
275
|
const toolResult = {
|
|
247
276
|
callId: toolCall.id,
|
|
@@ -254,6 +283,8 @@ function _define_property(obj, key, value) {
|
|
|
254
283
|
success: true
|
|
255
284
|
});
|
|
256
285
|
state.toolCallsExecuted++;
|
|
286
|
+
// Reset failure counter on success
|
|
287
|
+
state.toolFailures.set(toolCall.function.name, 0);
|
|
257
288
|
// Record metrics
|
|
258
289
|
if (this.metricsCollector) {
|
|
259
290
|
this.metricsCollector.recordToolCall(toolCall.function.name, state.iteration, toolDuration, true);
|
|
@@ -280,6 +311,9 @@ function _define_property(obj, key, value) {
|
|
|
280
311
|
errorName: error.name
|
|
281
312
|
});
|
|
282
313
|
state.errors.push(error);
|
|
314
|
+
// Increment failure counter for circuit breaker
|
|
315
|
+
const failures = (state.toolFailures.get(toolCall.function.name) || 0) + 1;
|
|
316
|
+
state.toolFailures.set(toolCall.function.name, failures);
|
|
283
317
|
// Record metrics
|
|
284
318
|
if (this.metricsCollector) {
|
|
285
319
|
this.metricsCollector.recordToolCall(toolCall.function.name, state.iteration, toolDuration, false, error.message);
|