@igniter-js/agents 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/agent.error.ts","../src/core/manager.ts","../src/telemetry/index.ts","../src/core/memory.ts","../src/core/agent.ts","../src/builders/main.builder.ts","../src/builders/prompt.builder.ts","../src/builders/agent.builder.ts","../src/builders/toolset.builder.ts","../src/builders/tool.builder.ts","../src/builders/mcp.builder.ts","../src/adapters/memory.adapter.ts","../src/adapters/json-file.adapter.ts","../src/utils/strings.ts","../src/utils/objects.ts","../src/utils/async.ts","../src/utils/validation.ts"],"names":["IgniterAgentErrorCode","tool"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @fileoverview Custom error classes for the IgniterAgent library.\n * This module provides a hierarchy of error types for precise error handling.\n *\n * @description\n * The error system in IgniterAgent follows these principles:\n * - All errors extend IgniterError from @igniter-js/core for consistency\n * - Errors include rich context for debugging\n * - Error codes enable programmatic error handling\n * - Stack traces are preserved for debugging\n *\n * @example\n * ```typescript\n * import {\n * IgniterAgentError,\n * IgniterAgentMCPError,\n * IgniterAgentToolError,\n * isIgniterAgentError\n * } from '@igniter-js/agents';\n *\n * try {\n * await agent.generate({ messages: [] });\n * } catch (error) {\n * if (isIgniterAgentError(error)) {\n * console.error(`[${error.code}] ${error.message}`);\n * }\n * }\n * ```\n *\n * @module errors\n * @packageDocumentation\n */\n\nimport { IgniterError, type IgniterLogger } from \"@igniter-js/core\";\n\n/* =============================================================================\n * ERROR CODES\n * ============================================================================= */\n\n/**\n * Error codes for categorizing IgniterAgent errors.\n *\n * @description\n * Each error code represents a specific type of failure.\n * Use these codes for programmatic error handling.\n *\n * @example\n * ```typescript\n * if (error.code === IgniterAgentErrorCode.MCP_CONNECTION_FAILED) {\n * // Handle MCP connection failure\n * await retryMCPConnection();\n * }\n * ```\n *\n * @public\n */\nexport enum IgniterAgentErrorCode {\n // General errors (1xx)\n /** Generic/unknown error */\n UNKNOWN = \"IGNITER_AGENT_UNKNOWN_ERROR\",\n /** Invalid configuration provided */\n INVALID_CONFIG = \"IGNITER_AGENT_INVALID_CONFIG\",\n /** Required value is missing */\n MISSING_REQUIRED = \"IGNITER_AGENT_MISSING_REQUIRED\",\n\n // Agent errors (2xx)\n /** Agent not initialized */\n AGENT_NOT_INITIALIZED = \"IGNITER_AGENT_NOT_INITIALIZED\",\n /** Model not configured */\n AGENT_MODEL_MISSING = \"IGNITER_AGENT_MODEL_MISSING\",\n /** Agent build failed */\n AGENT_BUILD_FAILED = \"IGNITER_AGENT_BUILD_FAILED\",\n\n // MCP errors (3xx)\n /** MCP connection failed */\n MCP_CONNECTION_FAILED = \"IGNITER_AGENT_MCP_CONNECTION_FAILED\",\n /** MCP client not found */\n MCP_CLIENT_NOT_FOUND = \"IGNITER_AGENT_MCP_CLIENT_NOT_FOUND\",\n /** MCP tool execution failed */\n MCP_TOOL_ERROR = \"IGNITER_AGENT_MCP_TOOL_ERROR\",\n /** Invalid MCP configuration */\n MCP_INVALID_CONFIG = \"IGNITER_AGENT_MCP_INVALID_CONFIG\",\n\n // Tool errors (4xx)\n /** Tool execution failed */\n TOOL_EXECUTION_FAILED = \"IGNITER_AGENT_TOOL_EXECUTION_FAILED\",\n /** Tool not found */\n TOOL_NOT_FOUND = \"IGNITER_AGENT_TOOL_NOT_FOUND\",\n /** Tool validation failed */\n TOOL_VALIDATION_FAILED = \"IGNITER_AGENT_TOOL_VALIDATION_FAILED\",\n /** Invalid agent context schema */\n AGENT_CONTEXT_SCHEMA_INVALID = \"IGNITER_AGENT_CONTEXT_SCHEMA_INVALID\",\n\n // Memory errors (5xx)\n /** Memory provider error */\n MEMORY_PROVIDER_ERROR = \"IGNITER_AGENT_MEMORY_PROVIDER_ERROR\",\n /** Memory not found */\n MEMORY_NOT_FOUND = \"IGNITER_AGENT_MEMORY_NOT_FOUND\",\n /** Memory update failed */\n MEMORY_UPDATE_FAILED = \"IGNITER_AGENT_MEMORY_UPDATE_FAILED\",\n\n // Adapter errors (6xx)\n /** Adapter connection failed */\n ADAPTER_CONNECTION_FAILED = \"IGNITER_AGENT_ADAPTER_CONNECTION_FAILED\",\n /** Adapter operation failed */\n ADAPTER_OPERATION_FAILED = \"IGNITER_AGENT_ADAPTER_OPERATION_FAILED\",\n /** Adapter not initialized */\n ADAPTER_NOT_INITIALIZED = \"IGNITER_AGENT_ADAPTER_NOT_INITIALIZED\",\n}\n\n/* =============================================================================\n * ERROR OPTIONS TYPES\n * ============================================================================= */\n\n/**\n * Options for creating an IgniterAgentError.\n *\n * @public\n */\nexport interface IgniterAgentErrorOptions {\n /** Human-readable error message */\n message: string;\n /** Error code for categorization */\n code: IgniterAgentErrorCode;\n /** HTTP status code (defaults to 500) */\n statusCode?: number;\n /** The component that threw the error */\n causer?: string;\n /** Additional details about the error */\n details?: unknown;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Logger instance for automatic logging */\n logger?: IgniterLogger;\n /** Original error if this wraps another error */\n cause?: Error;\n}\n\n/* =============================================================================\n * BASE ERROR CLASS\n * ============================================================================= */\n\n/**\n * Base error class for all IgniterAgent errors.\n *\n * @description\n * All custom errors in the IgniterAgent library extend this class,\n * which itself extends IgniterError from @igniter-js/core.\n * It provides a consistent interface for error handling, including\n * error codes, context, and cause tracking.\n *\n * @example\n * ```typescript\n * // Throwing a base error\n * throw new IgniterAgentError({\n * message: 'Something went wrong',\n * code: IgniterAgentErrorCode.UNKNOWN,\n * causer: 'Agent',\n * metadata: { operation: 'generate' }\n * });\n *\n * // Catching and handling\n * try {\n * await agent.start();\n * } catch (error) {\n * if (error instanceof IgniterAgentError) {\n * logger.error({\n * code: error.code,\n * message: error.message,\n * details: error.details\n * });\n * }\n * }\n * ```\n *\n * @public\n */\nexport class IgniterAgentError extends IgniterError {\n /**\n * Creates a new IgniterAgentError.\n *\n * @param options - Error configuration options\n */\n constructor(options: IgniterAgentErrorOptions) {\n super({\n message: options.message,\n code: options.code,\n statusCode: options.statusCode ?? 500,\n causer: options.causer,\n details: options.details,\n metadata: options.metadata,\n logger: options.logger,\n cause: options.cause,\n });\n\n this.name = \"IgniterAgentError\";\n }\n}\n\n/* =============================================================================\n * SPECIALIZED ERROR CLASSES\n * ============================================================================= */\n\n/**\n * Error thrown when agent configuration is invalid.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentConfigError({\n * message: 'Model is required but was not provided',\n * field: 'model'\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentConfigError extends IgniterAgentError {\n /**\n * The configuration field that caused the error.\n */\n public readonly field?: string;\n\n constructor(\n options: Omit<IgniterAgentErrorOptions, \"code\"> & { field?: string },\n ) {\n super({\n ...options,\n code: IgniterAgentErrorCode.INVALID_CONFIG,\n metadata: { ...options.metadata, field: options.field },\n });\n this.name = \"IgniterAgentConfigError\";\n this.field = options.field;\n }\n}\n\n/**\n * Error thrown when an MCP operation fails.\n *\n * @description\n * Covers all MCP-related failures including connection errors,\n * tool execution errors, and configuration errors.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentMCPError({\n * message: 'Failed to connect to MCP server',\n * code: IgniterAgentErrorCode.MCP_CONNECTION_FAILED,\n * mcpName: 'filesystem'\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentMCPError extends IgniterAgentError {\n /**\n * The name of the MCP configuration that caused the error.\n */\n public readonly mcpName?: string;\n\n constructor(options: IgniterAgentErrorOptions & { mcpName?: string }) {\n super({\n ...options,\n metadata: { ...options.metadata, mcpName: options.mcpName },\n });\n this.name = \"IgniterAgentMCPError\";\n this.mcpName = options.mcpName;\n }\n}\n\n/**\n * Error thrown when a tool execution fails.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentToolError({\n * message: 'Tool execution timed out',\n * toolName: 'github_createIssue',\n * metadata: { timeout: 30000 }\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentToolError extends IgniterAgentError {\n /**\n * The name of the tool that caused the error.\n */\n public readonly toolName: string;\n\n constructor(\n options: Omit<IgniterAgentErrorOptions, \"code\"> & { toolName: string },\n ) {\n super({\n ...options,\n code: IgniterAgentErrorCode.TOOL_EXECUTION_FAILED,\n metadata: { ...options.metadata, toolName: options.toolName },\n });\n this.name = \"IgniterAgentToolError\";\n this.toolName = options.toolName;\n }\n}\n\n/**\n * Error thrown when a memory operation fails.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentMemoryError({\n * message: 'Failed to save message to history',\n * code: IgniterAgentErrorCode.MEMORY_UPDATE_FAILED,\n * metadata: { chatId: 'chat_123' }\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentMemoryError extends IgniterAgentError {\n constructor(options: IgniterAgentErrorOptions) {\n super(options);\n this.name = \"IgniterAgentMemoryError\";\n }\n}\n\n/**\n * Error thrown when an adapter operation fails.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentAdapterError({\n * message: 'Redis connection lost',\n * code: IgniterAgentErrorCode.ADAPTER_CONNECTION_FAILED,\n * adapterName: 'redis'\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentAdapterError extends IgniterAgentError {\n /**\n * The name of the adapter that caused the error.\n */\n public readonly adapterName?: string;\n\n constructor(options: IgniterAgentErrorOptions & { adapterName?: string }) {\n super({\n ...options,\n metadata: { ...options.metadata, adapterName: options.adapterName },\n });\n this.name = \"IgniterAgentAdapterError\";\n this.adapterName = options.adapterName;\n }\n}\n\n/* =============================================================================\n * TYPE GUARDS\n * ============================================================================= */\n\n/**\n * Type guard to check if an error is an IgniterAgentError.\n *\n * @description\n * Use this function to safely narrow error types in catch blocks.\n *\n * @param error - The error to check\n * @returns True if the error is an IgniterAgentError\n *\n * @example\n * ```typescript\n * try {\n * await agent.generate({ messages: [] });\n * } catch (error) {\n * if (isIgniterAgentError(error)) {\n * // TypeScript knows error is IgniterAgentError\n * console.log(error.code, error.details);\n * }\n * }\n * ```\n *\n * @public\n */\nexport function isIgniterAgentError(\n error: unknown,\n): error is IgniterAgentError {\n return error instanceof IgniterAgentError;\n}\n\n/**\n * Type guard to check if an error is an MCP error.\n *\n * @param error - The error to check\n * @returns True if the error is an IgniterAgentMCPError\n *\n * @public\n */\nexport function isIgniterAgentMCPError(\n error: unknown,\n): error is IgniterAgentMCPError {\n return error instanceof IgniterAgentMCPError;\n}\n\n/**\n * Type guard to check if an error is a tool error.\n *\n * @param error - The error to check\n * @returns True if the error is an IgniterAgentToolError\n *\n * @public\n */\nexport function isIgniterAgentToolError(\n error: unknown,\n): error is IgniterAgentToolError {\n return error instanceof IgniterAgentToolError;\n}\n\n/* =============================================================================\n * HELPER FUNCTIONS\n * ============================================================================= */\n\n/**\n * Wraps an unknown error in an IgniterAgentError.\n *\n * @description\n * Useful for normalizing errors from external sources into\n * the IgniterAgent error format.\n *\n * @param error - The error to wrap\n * @param options - Additional options to add\n * @returns An IgniterAgentError wrapping the original\n *\n * @example\n * ```typescript\n * try {\n * await externalService.call();\n * } catch (error) {\n * throw wrapError(error, { causer: 'ExternalService' });\n * }\n * ```\n *\n * @public\n */\nexport function wrapError(\n error: unknown,\n options: Partial<IgniterAgentErrorOptions> = {},\n): IgniterAgentError {\n if (isIgniterAgentError(error)) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n const cause = error instanceof Error ? error : undefined;\n\n return new IgniterAgentError({\n message,\n code: IgniterAgentErrorCode.UNKNOWN,\n ...options,\n cause,\n });\n}\n","/**\n * @fileoverview Core agent manager for lifecycle and orchestration.\n * This module provides centralized management for IgniterAgent instances.\n *\n * @description\n * The IgniterAgentManager provides utilities for:\n * - Managing multiple agent instances\n * - Coordinating agent lifecycle (start, stop)\n * - Monitoring agent health and status\n * - Routing requests to appropriate agents\n *\n * @example\n * ```typescript\n * import { IgniterAgentManager } from '@igniter-js/agents';\n *\n * // Create a manager\n * const manager = new IgniterAgentManager();\n *\n * // Register agents\n * manager.register('support', supportAgent);\n * manager.register('sales', salesAgent);\n *\n * // Start all agents\n * await manager.startAll();\n *\n * // Route to specific agent\n * const agent = manager.get('support');\n * const response = await agent.generate({ messages: [...] });\n * ```\n *\n * @module core/manager\n * @packageDocumentation\n */\n\nimport type { IgniterAgentBuiltAgent } from \"../types/builder\";\nimport type { IgniterAgentToolset } from \"../types\";\nimport { IgniterAgentError, IgniterAgentErrorCode } from \"../errors\";\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterAgentInfo, IgniterAgentManagerOptions } from \"../types/manager\";\n\n\n/* =============================================================================\n * AGENT MANAGER CLASS\n * ============================================================================= */\n\n/**\n * Manager for coordinating multiple IgniterAgent instances.\n *\n * @description\n * The IgniterAgentManager provides a centralized way to manage multiple\n * agent instances, handling their lifecycle and providing routing capabilities.\n *\n * **Key Features:**\n * - Register and manage multiple agents\n * - Batch start/stop operations\n * - Health monitoring\n * - Request routing\n *\n * @example\n * ```typescript\n * import { IgniterAgentManager, IgniterAgent } from '@igniter-js/agents';\n *\n * // Create agents\n * const supportAgent = IgniterAgent.create('support')\n * .withModel(openai('gpt-4'))\n * .build();\n *\n * const codeAgent = IgniterAgent.create('code')\n * .withModel(openai('gpt-4-turbo'))\n * .addToolset(codeToolset)\n * .build();\n *\n * // Create manager and register agents\n * const manager = new IgniterAgentManager({\n * continueOnError: true,\n * onAgentStart: (name) => console.log(`Agent ${name} started`),\n * onAgentError: (name, err) => console.error(`Agent ${name} failed:`, err)\n * });\n *\n * manager.register('support', supportAgent);\n * manager.register('code', codeAgent);\n *\n * // Start all agents\n * await manager.startAll();\n *\n * // Use specific agent\n * const agent = manager.get('code');\n * const result = await agent.generate({\n * messages: [{ role: 'user', content: 'Write a test' }]\n * });\n *\n * // Get status\n * console.log(manager.getStatus());\n * ```\n *\n * @public\n */\nexport class IgniterAgentManagerCore<\n TAgentRegistry extends Record<string, IgniterAgentBuiltAgent> = Record<string, IgniterAgentBuiltAgent>\n> {\n /**\n * Agent statuses.\n * @internal\n */\n private readonly _statuses: Map<string, IgniterAgentInfo> = new Map();\n\n /**\n * Manager options.\n * @internal\n */\n private readonly _options: IgniterAgentManagerOptions<TAgentRegistry>;\n\n /**\n * Creates a new IgniterAgentManager.\n *\n * @param options - Manager configuration options\n *\n * @example\n * ```typescript\n * const manager = new IgniterAgentManager({\n * autoStart: false,\n * continueOnError: true\n * });\n * ```\n */\n constructor(options: IgniterAgentManagerOptions<TAgentRegistry>) {\n this._options = {\n logger: options.logger,\n telemetry: options.telemetry,\n agents: options.agents ?? {},\n autoStart: options.autoStart ?? false,\n continueOnError: options.continueOnError ?? true,\n onAgentStart: options.onAgentStart ?? (() => {}),\n onAgentError: options.onAgentError ?? (() => {}),\n onToolCallStart: options.onToolCallStart ?? (() => {}),\n onToolCallEnd: options.onToolCallEnd ?? (() => {}),\n onToolCallError: options.onToolCallError ?? (() => {}),\n onMCPStart: options.onMCPStart ?? (() => {}),\n onMCPError: options.onMCPError ?? (() => {}),\n };\n\n for (const [name, agent] of Object.entries(this._options.agents)) {\n this.applyManagerContext(name, agent as IgniterAgentBuiltAgent);\n this._statuses.set(name, {\n name,\n status: \"idle\",\n registeredAt: new Date(),\n toolsetCount: Object.keys((agent as IgniterAgentBuiltAgent).getToolsets()).length,\n });\n }\n }\n\n private applyManagerContext(\n name: string,\n agent: IgniterAgentBuiltAgent,\n ): void {\n const logger = this._options.logger;\n const telemetry = this._options.telemetry;\n\n if (logger) {\n const scopedLogger = logger.child?.(\"IgniterAgent\", { agent: name }) ?? logger;\n agent.attachLogger?.(scopedLogger);\n }\n\n if (telemetry) {\n agent.attachTelemetry?.(telemetry);\n }\n\n agent.attachHooks?.({\n onToolCallStart: this._options.onToolCallStart,\n onToolCallEnd: this._options.onToolCallEnd,\n onToolCallError: this._options.onToolCallError,\n onMCPStart: this._options.onMCPStart,\n onMCPError: this._options.onMCPError,\n });\n }\n\n /**\n * Creates a new IgniterAgentManager with default options.\n * @param options - Manager configuration options\n * @returns A new IgniterAgentManager instance\n * @example\n * ```typescript\n * const manager = IgniterAgentManager.create({\n * autoStart: true\n * });\n * ```\n */\n static create(): IgniterAgentManagerCore {\n return new IgniterAgentManagerCore({\n agents: {},\n });\n }\n\n /* ---------------------------------------------------------------------------\n * REGISTRATION\n * --------------------------------------------------------------------------- */\n\n /**\n * Registers an agent with the manager.\n *\n * @description\n * Adds an agent to the manager's registry. If `autoStart` is enabled,\n * the agent will be started immediately after registration.\n *\n * @param name - Unique name for the agent\n * @param agent - The built agent instance\n * @returns This manager for chaining\n * @throws {IgniterAgentError} If an agent with the name already exists\n *\n * @example\n * ```typescript\n * manager\n * .register('support', supportAgent)\n * .register('sales', salesAgent);\n * ```\n */\n register(name: string, agent: IgniterAgentBuiltAgent): this {\n if (this._options.agents[name]) {\n throw new IgniterAgentError({\n message: `Agent '${name}' is already registered`,\n code: IgniterAgentErrorCode.INVALID_CONFIG,\n causer: \"IgniterAgentManager\",\n metadata: { operation: \"register\" },\n });\n }\n\n // @ts-expect-error -- Dynamic assignment to registry type\n this._options.agents[name] = agent;\n this.applyManagerContext(name, agent);\n\n this._statuses.set(name, {\n name,\n status: \"idle\",\n registeredAt: new Date(),\n toolsetCount: Object.keys(agent.getToolsets()).length,\n });\n\n if (this._options.autoStart) {\n this.start(name).catch((err) => {\n // @ts-expect-error -- Ignore error handling here\n this._options.onAgentError(name, err);\n });\n }\n\n return this;\n }\n\n /**\n * Unregisters an agent from the manager.\n *\n * @param name - The agent name to unregister\n * @returns True if the agent was unregistered\n *\n * @example\n * ```typescript\n * manager.unregister('old-agent');\n * ```\n */\n unregister(name: string): boolean {\n const removed = delete this._options.agents[name];\n this._statuses.delete(name);\n return removed;\n }\n\n /**\n * Checks if an agent is registered.\n *\n * @param name - The agent name to check\n * @returns True if the agent is registered\n */\n has(name: string): boolean {\n return Boolean(this._options.agents[name]);\n }\n\n /* ---------------------------------------------------------------------------\n * LIFECYCLE\n * --------------------------------------------------------------------------- */\n\n /**\n * Starts a specific agent.\n *\n * @description\n * Initializes the agent's MCP connections and prepares it for use.\n *\n * @param name - The agent name to start\n * @returns The agent's toolsets after initialization\n * @throws {IgniterAgentError} If the agent is not found\n *\n * @example\n * ```typescript\n * const toolsets = await manager.start('support');\n * console.log('Connected toolsets:', Object.keys(toolsets));\n * ```\n */\n async start(name: string): Promise<IgniterAgentBuiltAgent> {\n const agent = this._options.agents[name];\n const info = this._statuses.get(name);\n\n if (!agent || !info) {\n throw new IgniterAgentError({\n message: `Agent '${name}' is not registered`,\n code: IgniterAgentErrorCode.AGENT_NOT_INITIALIZED,\n causer: \"IgniterAgentManager\",\n metadata: { operation: \"start\" },\n });\n }\n\n try {\n info.status = \"starting\";\n this._options.logger?.debug(\"IgniterAgentManager.start started\", {\n agent: name,\n });\n await agent.start();\n\n info.status = \"running\";\n info.startedAt = new Date();\n info.toolsetCount = Object.keys(agent.getToolsets()).length;\n this._options.onAgentStart?.(name);\n this._options.logger?.success?.(\"IgniterAgentManager.start success\", {\n agent: name,\n });\n\n return agent;\n } catch (error) {\n info.status = \"error\";\n info.error = error instanceof Error ? error : new Error(String(error));\n\n this._options.onAgentError?.(name, info.error);\n this._options.logger?.error(\"IgniterAgentManager.start failed\", info.error);\n throw error;\n }\n }\n\n /**\n * Starts all registered agents.\n *\n * @description\n * Initializes all agents in parallel. If `continueOnError` is true,\n * failed agents won't prevent others from starting.\n *\n * @returns Map of agent names to their results (toolsets or errors)\n *\n * @example\n * ```typescript\n * const results = await manager.startAll();\n *\n * for (const [name, result] of results) {\n * if (result instanceof Error) {\n * console.error(`${name} failed:`, result.message);\n * } else {\n * console.log(`${name} started with ${Object.keys(result).length} toolsets`);\n * }\n * }\n * ```\n */\n async startAll(): Promise<\n Map<string, Record<string, IgniterAgentToolset> | Error>\n > {\n const results = new Map<\n string,\n Record<string, IgniterAgentToolset> | Error\n >();\n \n const promises = Object.keys(this._options.agents).map(async (name) => {\n try {\n const builtAgent = await this.start(name);\n results.set(name, builtAgent.getToolsets());\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n results.set(name, err);\n\n if (!this._options.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(promises);\n this._options.logger?.info(\"IgniterAgentManager.startAll completed\", {\n agents: this.getNames().length,\n failed: this.getFailedAgents().length,\n });\n return results;\n }\n\n /* ---------------------------------------------------------------------------\n * ACCESS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets a registered agent by name.\n *\n * @param name - The agent name\n * @returns The agent instance\n * @throws {IgniterAgentError} If the agent is not found\n *\n * @example\n * ```typescript\n * const agent = manager.get('support');\n * const response = await agent.generate({ messages: [...] });\n * ```\n */\n get<TName extends string>(name: TName): TAgentRegistry[TName] {\n const agent = this._options.agents[name];\n\n if (!agent) {\n throw new IgniterAgentError({\n message: `Agent '${name}' is not registered`,\n code: IgniterAgentErrorCode.AGENT_NOT_INITIALIZED,\n causer: \"IgniterAgentManager\",\n metadata: { operation: \"get\" },\n });\n }\n\n return agent;\n }\n\n /**\n * Gets an agent if it exists, undefined otherwise.\n *\n * @param name - The agent name\n * @returns The agent instance or undefined\n */\n tryGet<TName extends string>(name: TName): TAgentRegistry[TName] | undefined {\n return this._options.agents[name];\n }\n\n /**\n * Gets all registered agent names.\n *\n * @returns Array of agent names\n */\n getNames(): string[] {\n return Object.keys(this._options.agents);\n }\n\n /**\n * Gets the number of registered agents.\n *\n * @returns Agent count\n */\n get size(): number {\n return Object.keys(this._options.agents).length;\n }\n\n /* ---------------------------------------------------------------------------\n * STATUS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets information about a specific agent.\n *\n * @param name - The agent name\n * @returns Agent information or undefined\n */\n getInfo(name: string): IgniterAgentInfo | undefined {\n return this._statuses.get(name);\n }\n\n /**\n * Gets status information for all agents.\n *\n * @returns Array of agent information objects\n *\n * @example\n * ```typescript\n * const status = manager.getStatus();\n *\n * for (const info of status) {\n * console.log(`${info.name}: ${info.status}`);\n * }\n * ```\n */\n getStatus(): IgniterAgentInfo[] {\n return Array.from(this._statuses.values());\n }\n\n /**\n * Checks if all agents are running.\n *\n * @returns True if all agents are in 'running' status\n */\n isAllRunning(): boolean {\n for (const info of this._statuses.values()) {\n if (info.status !== \"running\") {\n return false;\n }\n }\n\n return Object.keys(this._options.agents).length > 0;\n }\n\n /**\n * Gets agents that are in error state.\n *\n * @returns Array of agent info for failed agents\n */\n getFailedAgents(): IgniterAgentInfo[] {\n return Array.from(this._statuses.values()).filter(\n (info) => info.status === \"error\",\n );\n }\n}\n","/**\n * @fileoverview Telemetry events for @igniter-js/agents\n * @module @igniter-js/agents/telemetry\n *\n * @description\n * Defines telemetry events for agent operations including lifecycle,\n * tool execution, MCP connections, memory operations, and generation.\n * Events use dot notation namespacing and follow the IgniterTelemetry pattern.\n *\n * ### Important Redaction Rules\n *\n * **NEVER** expose these fields in telemetry attributes:\n * - Message contents or prompts (may contain sensitive user data)\n * - Tool execution results (may contain PII)\n * - Memory contents (may contain sensitive context)\n * - API keys or credentials\n *\n * **SAFE** to expose:\n * - Operation names and types\n * - Agent and toolset names\n * - Success/failure states\n * - Error codes and sanitized messages\n * - Timing/duration metrics\n * - Token counts (input/output)\n * - Tool names (not arguments)\n *\n * @example\n * ```typescript\n * import { IgniterAgentTelemetryEvents } from '@igniter-js/agents/telemetry'\n * import { IgniterTelemetry } from '@igniter-js/telemetry'\n *\n * const telemetry = IgniterTelemetry.create()\n * .withService('my-api')\n * .addEvents(IgniterAgentTelemetryEvents)\n * .withRedaction({\n * denylistKeys: ['content', 'message', 'prompt', 'result'],\n * hashKeys: ['ctx.agent.userId'],\n * })\n * .build()\n *\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .withTelemetry(telemetry)\n * .build()\n * ```\n */\n\nimport { IgniterTelemetryEvents } from \"@igniter-js/telemetry\";\nimport { z } from \"zod\";\n\n/**\n * Base attributes present in all agent events.\n * These are safe to expose and provide operational context.\n */\nconst BaseAgentAttributesSchema = z.object({\n /**\n * The agent name.\n */\n \"ctx.agent.name\": z.string(),\n\n /**\n * The current scope (if scoped).\n */\n \"ctx.agent.scope\": z.string().optional(),\n\n /**\n * The scope identifier value.\n */\n \"ctx.agent.scopeId\": z.string().optional(),\n});\n\n/**\n * Attributes for lifecycle events (start, stop).\n */\nconst LifecycleAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * Number of toolsets registered.\n */\n \"ctx.lifecycle.toolsetCount\": z.number().optional(),\n\n /**\n * Number of MCP connections configured.\n */\n \"ctx.lifecycle.mcpCount\": z.number().optional(),\n\n /**\n * Whether memory adapter is configured.\n */\n \"ctx.lifecycle.hasMemory\": z.boolean().optional(),\n});\n\n/**\n * Attributes for generation events.\n */\nconst GenerationAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The model used for generation.\n */\n \"ctx.generation.model\": z.string().optional(),\n\n /**\n * Number of input messages.\n */\n \"ctx.generation.inputMessages\": z.number().optional(),\n\n /**\n * Number of input tokens (if available).\n */\n \"ctx.generation.inputTokens\": z.number().optional(),\n\n /**\n * Number of output tokens (if available).\n */\n \"ctx.generation.outputTokens\": z.number().optional(),\n\n /**\n * Total tokens used (if available).\n */\n \"ctx.generation.totalTokens\": z.number().optional(),\n\n /**\n * Generation duration in milliseconds.\n */\n \"ctx.generation.durationMs\": z.number().optional(),\n\n /**\n * Number of tool calls made during generation.\n */\n \"ctx.generation.toolCalls\": z.number().optional(),\n\n /**\n * Whether the response was streamed.\n */\n \"ctx.generation.streamed\": z.boolean().optional(),\n});\n\n/**\n * Attributes for tool execution events.\n */\nconst ToolAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The toolset name.\n */\n \"ctx.tool.toolset\": z.string(),\n\n /**\n * The tool name (within the toolset).\n */\n \"ctx.tool.name\": z.string(),\n\n /**\n * The full tool identifier (toolset_name).\n */\n \"ctx.tool.fullName\": z.string(),\n\n /**\n * Tool execution duration in milliseconds.\n */\n \"ctx.tool.durationMs\": z.number().optional(),\n});\n\n/**\n * Attributes for MCP events.\n */\nconst MCPAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The MCP configuration name.\n */\n \"ctx.mcp.name\": z.string(),\n\n /**\n * The MCP transport type (stdio, http).\n */\n \"ctx.mcp.type\": z.enum([\"stdio\", \"http\"]),\n\n /**\n * Number of tools provided by this MCP.\n */\n \"ctx.mcp.toolCount\": z.number().optional(),\n\n /**\n * Connection duration in milliseconds.\n */\n \"ctx.mcp.durationMs\": z.number().optional(),\n});\n\n/**\n * Attributes for memory events.\n */\nconst MemoryAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The memory operation type.\n */\n \"ctx.memory.operation\": z.enum([\n \"getWorkingMemory\",\n \"updateWorkingMemory\",\n \"getMessages\",\n \"saveMessage\",\n \"getChats\",\n \"saveChat\",\n \"getChat\",\n \"updateChatTitle\",\n \"deleteChat\",\n ]),\n\n /**\n * The memory scope (user, chat, global).\n */\n \"ctx.memory.scope\": z.string().optional(),\n\n /**\n * Number of items affected.\n */\n \"ctx.memory.count\": z.number().optional(),\n\n /**\n * Operation duration in milliseconds.\n */\n \"ctx.memory.durationMs\": z.number().optional(),\n});\n\n/**\n * Attributes for error events.\n */\nconst ErrorAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The error code.\n */\n \"ctx.error.code\": z.string(),\n\n /**\n * The sanitized error message (no sensitive data).\n */\n \"ctx.error.message\": z.string().optional(),\n\n /**\n * The operation that failed.\n */\n \"ctx.error.operation\": z.string().optional(),\n\n /**\n * The component that threw the error.\n */\n \"ctx.error.component\": z.string().optional(),\n});\n\n/**\n * Telemetry events for @igniter-js/agents.\n *\n * ### Event Naming Convention\n * All events are prefixed with 'igniter.agent' followed by:\n * - `lifecycle.*` - Agent start/stop events\n * - `generation.*` - Text generation events\n * - `tool.*` - Tool execution events\n * - `mcp.*` - MCP connection events\n * - `memory.*` - Memory operation events\n * - `error.*` - Error events\n *\n * ### Usage with IgniterAgent\n *\n * These events are automatically emitted when you use `withTelemetry()`:\n *\n * ```typescript\n * import { IgniterAgent } from '@igniter-js/agents'\n * import { IgniterTelemetry } from '@igniter-js/telemetry'\n * import { IgniterAgentTelemetryEvents } from '@igniter-js/agents/telemetry'\n *\n * const telemetry = IgniterTelemetry.create()\n * .withService('my-api')\n * .addEvents(IgniterAgentTelemetryEvents)\n * .build()\n *\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .withTelemetry(telemetry)\n * .build()\n * ```\n */\nexport const IgniterAgentTelemetryEvents = IgniterTelemetryEvents.namespace(\n \"igniter.agent\",\n)\n // ============================================================================\n // LIFECYCLE EVENTS\n // ============================================================================\n .event(\"lifecycle.start.started\", LifecycleAttributesSchema)\n .event(\"lifecycle.start.success\", LifecycleAttributesSchema)\n .event(\"lifecycle.start.error\", ErrorAttributesSchema)\n .event(\"lifecycle.stop.started\", LifecycleAttributesSchema)\n .event(\"lifecycle.stop.success\", LifecycleAttributesSchema)\n .event(\"lifecycle.stop.error\", ErrorAttributesSchema)\n // ============================================================================\n // GENERATION EVENTS\n // ============================================================================\n .event(\"generation.generate.started\", GenerationAttributesSchema)\n .event(\"generation.generate.success\", GenerationAttributesSchema)\n .event(\"generation.generate.error\", ErrorAttributesSchema)\n .event(\"generation.stream.started\", GenerationAttributesSchema)\n .event(\"generation.stream.chunk\", GenerationAttributesSchema)\n .event(\"generation.stream.success\", GenerationAttributesSchema)\n .event(\"generation.stream.error\", ErrorAttributesSchema)\n // ============================================================================\n // TOOL EVENTS\n // ============================================================================\n .event(\"tool.execute.started\", ToolAttributesSchema)\n .event(\"tool.execute.success\", ToolAttributesSchema)\n .event(\"tool.execute.error\", ErrorAttributesSchema)\n // ============================================================================\n // MCP EVENTS\n // ============================================================================\n .event(\"mcp.connect.started\", MCPAttributesSchema)\n .event(\"mcp.connect.success\", MCPAttributesSchema)\n .event(\"mcp.connect.error\", ErrorAttributesSchema)\n .event(\"mcp.disconnect.started\", MCPAttributesSchema)\n .event(\"mcp.disconnect.success\", MCPAttributesSchema)\n .event(\"mcp.disconnect.error\", ErrorAttributesSchema)\n // ============================================================================\n // MEMORY EVENTS\n // ============================================================================\n .event(\"memory.operation.started\", MemoryAttributesSchema)\n .event(\"memory.operation.success\", MemoryAttributesSchema)\n .event(\"memory.operation.error\", ErrorAttributesSchema)\n .build();\n\n/**\n * Type for the telemetry events registry.\n */\nexport type IgniterAgentTelemetryEventsType =\n typeof IgniterAgentTelemetryEvents;\n","/**\n * @fileoverview Memory runtime for IgniterAgent.\n * @module core/memory\n */\n\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterTelemetryAttributes, IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type {\n IgniterAgentConversationMessage,\n IgniterAgentGetChatsParams,\n IgniterAgentGetMessagesParams,\n IgniterAgentMemoryConfig,\n IgniterAgentMemoryRuntime,\n IgniterAgentUpdateWorkingMemoryParams,\n IgniterAgentWorkingMemory,\n IgniterAgentWorkingMemoryParams,\n IgniterAgentChatSession,\n IgniterAgentUIMessage,\n} from \"../types\";\nimport { IgniterAgentMemoryError, IgniterAgentErrorCode } from \"../errors\";\nimport { IgniterAgentTelemetryEvents } from \"../telemetry\";\n\nconst MEMORY_ERROR_CODE = IgniterAgentErrorCode.MEMORY_PROVIDER_ERROR;\n\n/**\n * Memory runtime wrapper that adds logging and telemetry to provider operations.\n *\n * @public\n */\nexport class IgniterAgentMemoryCore implements IgniterAgentMemoryRuntime {\n private readonly provider: IgniterAgentMemoryConfig[\"provider\"];\n private readonly agentName: string;\n private readonly logger?: IgniterLogger;\n private readonly telemetry?: IgniterTelemetryManager;\n\n constructor(\n config: IgniterAgentMemoryConfig,\n agentName: string,\n logger?: IgniterLogger,\n telemetry?: IgniterTelemetryManager,\n ) {\n this.provider = config.provider;\n this.agentName = agentName;\n this.logger = logger;\n this.telemetry = telemetry;\n }\n\n private getBaseAttributes(operation: string, scope?: string) {\n const attributes: Record<string, unknown> = {\n \"ctx.agent.name\": this.agentName,\n \"ctx.memory.operation\": operation,\n };\n\n if (scope) {\n attributes[\"ctx.memory.scope\"] = scope;\n }\n\n return attributes;\n }\n\n private emitStart(operation: string, scope?: string) {\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"memory.operation.started\"), {\n level: \"debug\",\n attributes: this.getBaseAttributes(operation, scope) as IgniterTelemetryAttributes,\n });\n }\n\n private emitSuccess(\n operation: string,\n durationMs: number,\n scope?: string,\n count?: number,\n ) {\n const attributes = {\n ...this.getBaseAttributes(operation, scope),\n \"ctx.memory.durationMs\": durationMs,\n } as Record<string, unknown>;\n\n if (count !== undefined) {\n attributes[\"ctx.memory.count\"] = count;\n }\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"memory.operation.success\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n }\n\n private emitError(operation: string, error: Error, scope?: string) {\n const attributes: Record<string, unknown> = {\n ...this.getBaseAttributes(operation, scope),\n \"ctx.error.code\": MEMORY_ERROR_CODE,\n \"ctx.error.message\": error.message,\n \"ctx.error.operation\": operation,\n \"ctx.error.component\": \"memory\",\n };\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"memory.operation.error\"), {\n level: \"error\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n }\n\n private async runOperation<T>(\n operation: string,\n scope: string | undefined,\n handler: () => Promise<T>,\n count?: (value: T) => number | undefined,\n ): Promise<T> {\n const start = Date.now();\n this.emitStart(operation, scope);\n this.logger?.debug(`IgniterAgent.memory.${operation} started`, {\n agent: this.agentName,\n scope,\n });\n\n try {\n const result = await handler();\n const durationMs = Date.now() - start;\n this.emitSuccess(operation, durationMs, scope, count?.(result));\n this.logger?.success?.(\n `IgniterAgent.memory.${operation} success`,\n { agent: this.agentName, scope, durationMs },\n );\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emitError(operation, error, scope);\n this.logger?.error(`IgniterAgent.memory.${operation} failed`, error);\n throw new IgniterAgentMemoryError({\n message: error.message,\n code: MEMORY_ERROR_CODE,\n cause: error,\n metadata: { operation },\n });\n }\n }\n\n async getWorkingMemory(\n params: IgniterAgentWorkingMemoryParams,\n ): Promise<IgniterAgentWorkingMemory | null> {\n return this.runOperation(\n \"getWorkingMemory\",\n params.scope,\n () => this.provider.getWorkingMemory(params),\n );\n }\n\n async updateWorkingMemory(\n params: IgniterAgentUpdateWorkingMemoryParams,\n ): Promise<void> {\n await this.runOperation(\n \"updateWorkingMemory\",\n params.scope,\n () => this.provider.updateWorkingMemory(params),\n );\n }\n\n async saveMessage(message: IgniterAgentConversationMessage): Promise<void> {\n await this.runOperation(\n \"saveMessage\",\n undefined,\n async () => {\n if (!this.provider.saveMessage) {\n throw new Error(\"saveMessage is not supported by the provider\");\n }\n await this.provider.saveMessage(message);\n },\n );\n }\n\n async getMessages<T = IgniterAgentUIMessage>(\n params: IgniterAgentGetMessagesParams,\n ): Promise<T[]> {\n return this.runOperation(\n \"getMessages\",\n undefined,\n async () => {\n if (!this.provider.getMessages) {\n throw new Error(\"getMessages is not supported by the provider\");\n }\n return this.provider.getMessages<T>(params);\n },\n (result) => result.length,\n );\n }\n\n async saveChat(chat: IgniterAgentChatSession): Promise<void> {\n await this.runOperation(\n \"saveChat\",\n undefined,\n async () => {\n if (!this.provider.saveChat) {\n throw new Error(\"saveChat is not supported by the provider\");\n }\n await this.provider.saveChat(chat);\n },\n );\n }\n\n async getChats(params: IgniterAgentGetChatsParams): Promise<IgniterAgentChatSession[]> {\n return this.runOperation(\n \"getChats\",\n undefined,\n async () => {\n if (!this.provider.getChats) {\n throw new Error(\"getChats is not supported by the provider\");\n }\n return this.provider.getChats(params);\n },\n (result) => result.length,\n );\n }\n\n async getChat(chatId: string): Promise<IgniterAgentChatSession | null> {\n return this.runOperation(\n \"getChat\",\n undefined,\n async () => {\n if (!this.provider.getChat) {\n throw new Error(\"getChat is not supported by the provider\");\n }\n return this.provider.getChat(chatId);\n },\n );\n }\n\n async updateChatTitle(chatId: string, title: string): Promise<void> {\n await this.runOperation(\n \"updateChatTitle\",\n undefined,\n async () => {\n if (!this.provider.updateChatTitle) {\n throw new Error(\"updateChatTitle is not supported by the provider\");\n }\n await this.provider.updateChatTitle(chatId, title);\n },\n );\n }\n\n async deleteChat(chatId: string): Promise<void> {\n await this.runOperation(\n \"deleteChat\",\n undefined,\n async () => {\n if (!this.provider.deleteChat) {\n throw new Error(\"deleteChat is not supported by the provider\");\n }\n await this.provider.deleteChat(chatId);\n },\n );\n }\n}\n","import { experimental_createMCPClient, type experimental_MCPClient } from \"@ai-sdk/mcp\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport {\n ToolLoopAgent,\n type AgentCallParameters,\n type AgentStreamParameters,\n type LanguageModel,\n type ToolSet,\n} from \"ai\";\nimport { IgniterAgentConfigError, IgniterAgentError, IgniterAgentErrorCode, IgniterAgentMCPError } from \"../errors\";\nimport type { IgniterAgentConfig, IgniterAgentMCPConfigUnion, IgniterAgentMCPHttpConfig, IgniterAgentMCPStdioConfig, IgniterAgentToolset } from \"../types\";\nimport type { z } from \"zod\";\nimport type { IgniterAgentPromptTemplate } from \"../types/prompt\";\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterTelemetryAttributes, IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport { IgniterAgentTelemetryEvents } from \"../telemetry\";\nimport type { IgniterAgentHooks } from \"../types/hooks\";\nimport { IgniterAgentMemoryCore } from \"./memory\";\n\nexport class IgniterAgentCore<\n TAgentName extends string = string,\n TAgentModel extends LanguageModel = LanguageModel,\n TAgentInstructions extends IgniterAgentPromptTemplate =\n IgniterAgentPromptTemplate,\n TAgentToolsets extends Record<string, IgniterAgentToolset> = Record<\n string,\n IgniterAgentToolset\n >,\n TAgentMCPConfigs extends Record<string, IgniterAgentMCPConfigUnion> = Record<\n string,\n IgniterAgentMCPConfigUnion\n >,\n TAgentContextSchema extends z.ZodSchema = z.ZodSchema,\n> {\n private _agent: IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >;\n\n private logger?: IgniterLogger;\n private telemetry?: IgniterTelemetryManager;\n private hooks: IgniterAgentHooks;\n public memory?: IgniterAgentMemoryCore;\n\n constructor(\n agent: IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n ) {\n this._agent = agent;\n this.logger = agent.logger;\n this.telemetry = agent.telemetry;\n this.hooks = agent.hooks ?? {};\n if (agent.memory) {\n this.memory = new IgniterAgentMemoryCore(agent.memory, String(agent.name), this.logger, this.telemetry);\n }\n }\n\n /**\n * Attaches a logger instance to the agent.\n */\n attachLogger(logger?: IgniterLogger): void {\n if (!logger) return;\n if (!this.logger) {\n this.logger = logger;\n if (this._agent.memory) {\n this.memory = new IgniterAgentMemoryCore(\n this._agent.memory,\n this.getName(),\n this.logger,\n this.telemetry,\n );\n }\n }\n }\n\n /**\n * Attaches a telemetry manager to the agent.\n */\n attachTelemetry(telemetry?: IgniterTelemetryManager): void {\n if (!telemetry) return;\n if (!this.telemetry) {\n this.telemetry = telemetry;\n if (this._agent.memory) {\n this.memory = new IgniterAgentMemoryCore(\n this._agent.memory,\n this.getName(),\n this.logger,\n this.telemetry,\n );\n }\n }\n }\n\n /**\n * Attaches hook callbacks to the agent.\n */\n attachHooks(hooks?: IgniterAgentHooks): void {\n if (!hooks) return;\n\n const merge = <T extends (...args: any[]) => void>(\n current?: T,\n incoming?: T,\n ): T | undefined => {\n if (!current) return incoming;\n if (!incoming) return current;\n return ((...args: any[]) => {\n current(...args);\n incoming(...args);\n }) as T;\n };\n\n this.hooks = {\n onAgentStart: merge(this.hooks.onAgentStart, hooks.onAgentStart),\n onAgentError: merge(this.hooks.onAgentError, hooks.onAgentError),\n onToolCallStart: merge(this.hooks.onToolCallStart, hooks.onToolCallStart),\n onToolCallEnd: merge(this.hooks.onToolCallEnd, hooks.onToolCallEnd),\n onToolCallError: merge(this.hooks.onToolCallError, hooks.onToolCallError),\n onMCPStart: merge(this.hooks.onMCPStart, hooks.onMCPStart),\n onMCPError: merge(this.hooks.onMCPError, hooks.onMCPError),\n };\n }\n\n /**\n * Returns the agent name.\n */\n getName(): string {\n return String(this._agent.name);\n }\n\n /**\n * Starts the agent by initializing all MCP connections.\n */\n async start(): Promise<void> {\n const startTime = Date.now();\n const toolsets = this._agent.toolsets;\n const mcpConfigs = Object.values(this._agent.configs || {});\n const lifecycleAttributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.lifecycle.toolsetCount\": Object.keys(toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n \"ctx.lifecycle.hasMemory\": Boolean(this.memory),\n };\n\n this.logger?.debug(\"IgniterAgent.start started\", lifecycleAttributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.start.started\"), {\n level: \"debug\",\n attributes: lifecycleAttributes as IgniterTelemetryAttributes,\n });\n\n try {\n for (const mcpConfig of mcpConfigs) {\n const mcpStart = Date.now();\n this.hooks.onMCPStart?.(this.getName(), mcpConfig.name);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.connect.started\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n } as IgniterTelemetryAttributes,\n });\n\n try {\n const mcpToolset = await this.initializeMCPClient(mcpConfig);\n\n // @ts-expect-error - Expected to assign dynamically\n toolsets[mcpConfig.name] = mcpToolset;\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.connect.success\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.toolCount\": Object.keys(mcpToolset.tools || {}).length,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n } as IgniterTelemetryAttributes,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.connect.error\"), {\n level: \"error\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n ...this.getErrorAttributes(err, \"mcp.connect\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.mcp.connect failed\", err);\n throw err;\n }\n }\n\n const durationMs = Date.now() - startTime;\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.start.success\"), {\n level: \"debug\",\n attributes: {\n ...lifecycleAttributes,\n \"ctx.lifecycle.toolsetCount\": Object.keys(this._agent.toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.start success\", {\n ...lifecycleAttributes,\n durationMs,\n });\n this.hooks.onAgentStart?.(this.getName());\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.start.error\"), {\n level: \"error\",\n attributes: {\n ...lifecycleAttributes,\n ...this.getErrorAttributes(err, \"lifecycle.start\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.start failed\", err);\n this.hooks.onAgentError?.(this.getName(), err);\n throw err;\n }\n }\n\n /**\n * Stops the agent by disconnecting MCP toolsets.\n */\n async stop(): Promise<void> {\n const startTime = Date.now();\n const mcpConfigs = Object.values(this._agent.configs || {});\n const lifecycleAttributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.lifecycle.toolsetCount\": Object.keys(this._agent.toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n \"ctx.lifecycle.hasMemory\": Boolean(this.memory),\n };\n\n this.logger?.debug(\"IgniterAgent.stop started\", lifecycleAttributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.stop.started\"), {\n level: \"debug\",\n attributes: lifecycleAttributes as IgniterTelemetryAttributes,\n });\n\n try {\n for (const mcpConfig of mcpConfigs) {\n const mcpStart = Date.now();\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.disconnect.started\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n } as IgniterTelemetryAttributes,\n });\n\n try {\n const existing = this._agent.toolsets[mcpConfig.name as keyof typeof this._agent.toolsets] as {\n disconnect?: () => Promise<void> | void;\n } | undefined;\n\n if (existing?.disconnect) {\n await existing.disconnect();\n }\n\n if (existing) {\n // @ts-expect-error - Expected to assign dynamically\n this._agent.toolsets[mcpConfig.name] = {\n ...existing,\n status: \"disconnected\",\n tools: {},\n };\n }\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.disconnect.success\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n } as IgniterTelemetryAttributes,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.disconnect.error\"), {\n level: \"error\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n ...this.getErrorAttributes(err, \"mcp.disconnect\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.mcp.disconnect failed\", err);\n throw err;\n }\n }\n\n const durationMs = Date.now() - startTime;\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.stop.success\"), {\n level: \"debug\",\n attributes: {\n ...lifecycleAttributes,\n \"ctx.lifecycle.toolsetCount\": Object.keys(this._agent.toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.stop success\", {\n ...lifecycleAttributes,\n durationMs,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.stop.error\"), {\n level: \"error\",\n attributes: {\n ...lifecycleAttributes,\n ...this.getErrorAttributes(err, \"lifecycle.stop\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.stop failed\", err);\n throw err;\n }\n }\n\n /**\n * Generates a response from the agent.\n */\n async generate(\n input: AgentCallParameters<z.infer<TAgentContextSchema>>,\n ): Promise<any> {\n const startTime = Date.now();\n const attributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.generation.inputMessages\": Array.isArray(input.messages)\n ? input.messages.length\n : undefined,\n \"ctx.generation.streamed\": false,\n };\n\n this.logger?.debug(\"IgniterAgent.generate started\", attributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.generate.started\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n\n try {\n const agent = this.getAgentInstanceWithContext(\n input.options as z.infer<TAgentContextSchema>,\n );\n const result = await agent.generate(input);\n const durationMs = Date.now() - startTime;\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.generate.success\"), {\n level: \"debug\",\n attributes: {\n ...attributes,\n \"ctx.generation.durationMs\": durationMs,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.generate success\", {\n ...attributes,\n durationMs,\n });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.generate.error\"), {\n level: \"error\",\n attributes: {\n ...attributes,\n ...this.getErrorAttributes(err, \"generation.generate\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.generate failed\", err);\n throw err;\n }\n }\n\n /**\n * Streams a response from the agent.\n */\n async stream(\n input: AgentStreamParameters<z.infer<TAgentContextSchema>, ToolSet>,\n ): Promise<any> {\n const startTime = Date.now();\n const attributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.generation.inputMessages\": Array.isArray(input.messages)\n ? input.messages.length\n : undefined,\n \"ctx.generation.streamed\": true,\n };\n\n this.logger?.debug(\"IgniterAgent.stream started\", attributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.started\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n\n try {\n const agent = this.getAgentInstanceWithContext(\n input.options as z.infer<TAgentContextSchema>,\n );\n const result = await agent.stream(input);\n const durationMs = Date.now() - startTime;\n\n const emitChunk = () => {\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.chunk\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n };\n\n const wrapped = this.wrapStreamResult(result, emitChunk);\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.success\"), {\n level: \"debug\",\n attributes: {\n ...attributes,\n \"ctx.generation.durationMs\": durationMs,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.stream success\", {\n ...attributes,\n durationMs,\n });\n return wrapped;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.error\"), {\n level: \"error\",\n attributes: {\n ...attributes,\n ...this.getErrorAttributes(err, \"generation.stream\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.stream failed\", err);\n throw err;\n }\n }\n\n /**\n * Gets all registered toolsets.\n */\n getToolsets() {\n return this._agent.toolsets;\n }\n\n /**\n * Gets the configured model.\n */\n getModel() {\n return this._agent.model as TAgentModel;\n }\n\n /**\n * Gets the configured instructions.\n */\n getInstructions() {\n return this._agent.instructions as TAgentInstructions;\n }\n\n /**\n * Gets the context schema.\n */\n getContextSchema() {\n return this._agent.schema as TAgentContextSchema;\n }\n\n /**\n * Gets all registered tools from all toolsets.\n */\n getTools() {\n const toolsets = this.getToolsets();\n const allTools: ToolSet = {};\n\n for (const toolset of Object.values(toolsets)) {\n for (const [toolName, tool] of Object.entries(toolset.tools)) {\n const wrapped = this.wrapToolExecution(toolset.name, toolName, tool as ToolSet[string]);\n allTools[toolName] = wrapped;\n }\n }\n\n return allTools;\n }\n\n private wrapToolExecution(\n toolsetName: string,\n toolName: string,\n tool: ToolSet[string],\n ): ToolSet[string] {\n if (!tool || !tool.execute || typeof tool.execute !== \"function\") {\n return tool;\n }\n\n const execute = tool.execute as NonNullable<ToolSet[string][\"execute\"]>;\n const fullName = `${toolsetName}.${toolName}`;\n const agentName = this.getName();\n\n return {\n ...tool,\n execute: async (input: unknown, options?: unknown) => {\n const startTime = Date.now();\n this.hooks.onToolCallStart?.(agentName, fullName, input);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"tool.execute.started\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": agentName,\n \"ctx.tool.toolset\": toolsetName,\n \"ctx.tool.name\": toolName,\n \"ctx.tool.fullName\": fullName,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.debug(\"IgniterAgent.tool.execute started\", {\n agent: agentName,\n tool: fullName,\n });\n\n try {\n const result = await execute(input as any, options as any);\n const durationMs = Date.now() - startTime;\n this.hooks.onToolCallEnd?.(agentName, fullName, result);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"tool.execute.success\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": agentName,\n \"ctx.tool.toolset\": toolsetName,\n \"ctx.tool.name\": toolName,\n \"ctx.tool.fullName\": fullName,\n \"ctx.tool.durationMs\": durationMs,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.tool.execute success\", {\n agent: agentName,\n tool: fullName,\n durationMs,\n });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.hooks.onToolCallError?.(agentName, fullName, err);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"tool.execute.error\"), {\n level: \"error\",\n attributes: {\n \"ctx.agent.name\": agentName,\n \"ctx.tool.toolset\": toolsetName,\n \"ctx.tool.name\": toolName,\n \"ctx.tool.fullName\": fullName,\n ...this.getErrorAttributes(err, \"tool.execute\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.tool.execute failed\", err);\n throw err;\n }\n },\n };\n }\n\n private wrapStreamResult<T>(result: T, onChunk: () => void): T {\n if (!result) {\n return result;\n }\n\n if (typeof (result as any)[Symbol.asyncIterator] === \"function\") {\n const iterable = result as unknown as AsyncIterable<unknown>;\n return {\n [Symbol.asyncIterator]: async function* () {\n for await (const chunk of iterable) {\n onChunk();\n yield chunk;\n }\n },\n } as T;\n }\n\n const maybeTextStream = (result as any).textStream;\n if (maybeTextStream && typeof maybeTextStream[Symbol.asyncIterator] === \"function\") {\n return {\n ...(result as any),\n textStream: (async function* () {\n for await (const chunk of maybeTextStream) {\n onChunk();\n yield chunk;\n }\n })(),\n } as T;\n }\n\n return result;\n }\n\n private getErrorAttributes(error: Error, operation: string): Record<string, unknown> {\n return {\n \"ctx.error.code\": (error as { code?: string }).code ?? error.name ?? IgniterAgentErrorCode.UNKNOWN,\n \"ctx.error.message\": error.message,\n \"ctx.error.operation\": operation,\n \"ctx.error.component\": \"agent\",\n };\n }\n \n private getAgentInstanceWithContext(context: z.infer<TAgentContextSchema>) {\n const tools = this.getTools();\n\n if (!this._agent.model) {\n throw new IgniterAgentConfigError({\n message: \"Model is required. Call withModel() before build()\",\n field: \"model\",\n });\n }\n\n if (this._agent.schema !== undefined) {\n const parseResult = this._agent.schema.safeParse(context);\n if (parseResult.success) {\n context = parseResult.data;\n } else {\n throw new IgniterAgentError({\n message: \"Invalid context schema\",\n code: IgniterAgentErrorCode.AGENT_CONTEXT_SCHEMA_INVALID,\n });\n }\n }\n\n return new ToolLoopAgent<z.infer<TAgentContextSchema>, ToolSet>({\n model: this._agent.model,\n instructions: this._agent.instructions\n ? this._agent.instructions.build(context as any)\n : \"\",\n tools,\n callOptionsSchema: this._agent.schema as any,\n })\n }\n\n private async initializeMCPClient<\n TMCPType extends IgniterAgentMCPConfigUnion[\"type\"],\n TMCPName extends string,\n >(\n mcpConfig: IgniterAgentMCPConfigUnion<TMCPName>,\n ): Promise<IgniterAgentToolset<TMCPType, TMCPName>> {\n if (this._agent.toolsets[mcpConfig.name]) {\n return this._agent.toolsets[\n mcpConfig.name as keyof typeof this._agent.toolsets\n ] as unknown as IgniterAgentToolset<TMCPType, TMCPName>;\n }\n\n let client: experimental_MCPClient | null = null;\n\n try {\n if (mcpConfig.type === \"stdio\") {\n const stdioConfig = mcpConfig as IgniterAgentMCPStdioConfig<TMCPName>;\n this.logger?.debug(\"IgniterAgent.mcp.connect stdio\", {\n command: stdioConfig.command,\n args: stdioConfig.args,\n });\n\n client = await experimental_createMCPClient({\n transport: new StdioClientTransport({\n command: stdioConfig.command,\n args: stdioConfig.args,\n env: stdioConfig.env,\n }),\n });\n }\n\n if (mcpConfig.type === \"http\") {\n const httpConfig = mcpConfig as IgniterAgentMCPHttpConfig<TMCPName>;\n this.logger?.debug(\"IgniterAgent.mcp.connect http\", {\n url: httpConfig.url,\n });\n\n const url = new URL(httpConfig.url);\n client = await experimental_createMCPClient({\n transport: new StreamableHTTPClientTransport(url, {\n requestInit: {\n headers: httpConfig.headers,\n },\n }),\n });\n }\n\n if (!client) {\n throw new IgniterAgentMCPError({\n message: `Failed to create MCP client for '${mcpConfig.name}'`,\n code: IgniterAgentErrorCode.MCP_CONNECTION_FAILED,\n mcpName: mcpConfig.name,\n });\n }\n\n const tools = await client.tools();\n\n return {\n type: mcpConfig.type as TMCPType,\n status: \"connected\",\n name: mcpConfig.name,\n tools: tools as ToolSet,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.hooks.onMCPError?.(this.getName(), mcpConfig.name, err);\n throw err;\n }\n }\n}\n","import type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterAgentBuiltAgent } from \"../types\";\nimport { IgniterAgentManagerCore } from \"../core/manager\";\nimport type { IgniterAgentManagerOptions } from \"../types/manager\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterAgentHooks } from \"../types/hooks\";\n\nexport class IgniterAgentManagerBuilder<\n TAgentRegistry extends Record<string, IgniterAgentBuiltAgent> = Record<string, IgniterAgentBuiltAgent>\n> {\n private readonly _manager: IgniterAgentManagerOptions<TAgentRegistry>\n\n private constructor(manager: IgniterAgentManagerOptions<TAgentRegistry>) {\n this._manager = manager;\n }\n\n addAgent<TName extends string, TAgent extends IgniterAgentBuiltAgent>(\n name: TName,\n agent: TAgent,\n ): IgniterAgentManagerBuilder<TAgentRegistry & { [K in TName]: TAgent }> {\n return new IgniterAgentManagerBuilder<TAgentRegistry & { [K in TName]: TAgent }>({\n logger: this._manager.logger,\n telemetry: this._manager.telemetry,\n autoStart: this._manager.autoStart,\n continueOnError: this._manager.continueOnError,\n onAgentStart: this._manager.onAgentStart,\n onAgentError: this._manager.onAgentError,\n onToolCallStart: this._manager.onToolCallStart,\n onToolCallEnd: this._manager.onToolCallEnd,\n onToolCallError: this._manager.onToolCallError,\n onMCPStart: this._manager.onMCPStart,\n onMCPError: this._manager.onMCPError,\n agents: {\n ...this._manager.agents,\n [name]: agent,\n },\n });\n }\n\n withLogger(logger: IgniterLogger): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n logger,\n });\n }\n\n withTelemetry(telemetry: IgniterTelemetryManager): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n telemetry,\n });\n }\n\n withAutoStart(autoStart: boolean): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n autoStart,\n });\n }\n\n withContinueOnError(continueOnError: boolean): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n continueOnError,\n });\n }\n\n onAgentStart(\n callback: IgniterAgentHooks[\"onAgentStart\"],\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n onAgentStart: callback,\n });\n }\n\n onAgentError(\n callback: IgniterAgentHooks[\"onAgentError\"],\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n onAgentError: callback,\n });\n }\n\n onToolCallStart(\n callback: (agentName: keyof TAgentRegistry, toolName: string, input: unknown) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onToolCallStart: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onToolCallEnd(\n callback: (agentName: keyof TAgentRegistry, toolName: string, output: unknown) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onToolCallEnd: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onToolCallError(\n callback: (agentName: keyof TAgentRegistry, toolName: string, error: Error) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onToolCallError: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onMCPStart(\n callback: (agentName: keyof TAgentRegistry, mcpName: string) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onMCPStart: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onMCPError(\n callback: (agentName: string, mcpName: string, error: Error) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onMCPError: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n static create(): IgniterAgentManagerBuilder<{}> {\n return new IgniterAgentManagerBuilder({\n agents: {},\n autoStart: false,\n continueOnError: true,\n });\n }\n\n build(): IgniterAgentManagerCore<TAgentRegistry> {\n return new IgniterAgentManagerCore<TAgentRegistry>(this._manager);\n }\n}\n\n/* =============================================================================\n * MAIN EXPORT ALIAS\n * ============================================================================= */\n\n/**\n * Alias for IgniterAgentManager for cleaner API.\n *\n * @description\n * Use `IgniterAgentManager.create()` as the primary entry point for managing agents.\n *\n * @example\n * ```typescript\n * import { IgniterAgentManager } from '@igniter-js/agents';\n *\n * const manager = IgniterAgentManager\n * .create()\n * .addAgent('assistant', assistantAgent)\n * .addAgent('code-helper', codeHelperAgent)\n * .withLogger(customLogger)\n * .onToolCallStart((agentName, toolName, input) => {\n * console.log(`[${agentName}] Tool ${toolName} called with input:`, input);\n * })\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgentManager = {\n create: IgniterAgentManagerBuilder.create,\n};\n\n/**\n * Type alias for the IgniterAgent class.\n * @public\n */\nexport type IgniterAgentManager = typeof IgniterAgentManagerBuilder;\n","/**\n * @fileoverview Prompt builder for IgniterAgent instructions.\n *\n * @description\n * Provides a lightweight template interpolation utility to build\n * prompt strings with context data.\n *\n * @module builders/prompt\n * @packageDocumentation\n */\n\nimport type { IgniterAgentPromptTemplate } from \"../types/prompt\";\n\nconst TEMPLATE_PATTERN = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n\nconst resolvePath = (value: unknown, path: string): unknown => {\n if (!path) return undefined;\n\n return path\n .split(\".\")\n .reduce<unknown>((acc, key) => {\n if (acc && typeof acc === \"object\" && key in (acc as Record<string, unknown>)) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, value);\n};\n\n/**\n * Fluent prompt builder for agent instructions.\n *\n * @example\n * ```typescript\n * const prompt = IgniterAgentPrompt.create(\n * \"You are {{agentName}}. User: {{user.name}}\"\n * );\n *\n * const result = prompt.build({ agentName: \"assistant\", user: { name: \"Ada\" } });\n * // \"You are assistant. User: Ada\"\n * ```\n *\n * @public\n */\nexport class IgniterAgentPromptBuilder<\n TTemplate extends string = string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n> implements IgniterAgentPromptTemplate<TContext> {\n private readonly template: TTemplate;\n\n private constructor(template: TTemplate) {\n this.template = template;\n }\n\n /**\n * Creates a new prompt builder.\n *\n * @param template - Prompt template string with {{placeholders}}\n * @returns A new prompt builder instance\n */\n static create<TNewTemplate extends string>(\n template: TNewTemplate,\n ): IgniterAgentPromptBuilder<TNewTemplate, Record<string, unknown>> {\n return new IgniterAgentPromptBuilder<TNewTemplate, Record<string, unknown>>(\n template,\n );\n }\n\n /**\n * Builds the prompt string with the provided context.\n *\n * @param context - Context data used for interpolation\n * @returns The resolved prompt string\n */\n build(context: TContext): string {\n return this.template.replace(TEMPLATE_PATTERN, (_match, path) => {\n const value = resolvePath(context, String(path));\n return value === undefined || value === null ? \"\" : String(value);\n });\n }\n\n /**\n * Returns the raw prompt template string.\n */\n getTemplate(): string {\n return this.template;\n }\n}\n\n/* =============================================================================\n * MAIN EXPORT ALIAS\n * ============================================================================= */\n\n/**\n * Alias for IgniterAgentPromptBuilder for cleaner API.\n *\n * @public\n */\nexport const IgniterAgentPrompt = IgniterAgentPromptBuilder;\n\n/**\n * Type alias for the prompt builder constructor.\n *\n * @public\n */\nexport type IgniterAgentPrompt = typeof IgniterAgentPromptBuilder;\n","/**\n * @fileoverview Main Agent Builder for creating AI agents with tools and MCP support.\n * This module provides the primary fluent API for building IgniterAgent instances.\n *\n * @description\n * The IgniterAgentBuilder is the central class for creating AI agents. It provides\n * a type-safe fluent API for configuring all aspects of an agent including:\n * - Language model selection\n * - Custom toolsets\n * - MCP server connections\n * - Context schema validation\n * - Prompt instructions\n *\n * @example\n * ```typescript\n * import { IgniterAgent } from '@igniter-js/agents';\n * import { openai } from '@ai-sdk/openai';\n * import { z } from 'zod';\n *\n * const agent = IgniterAgent\n * .create('assistant')\n * .withModel(openai('gpt-4'))\n * .withContextSchema(z.object({\n * userId: z.string(),\n * chatId: z.string()\n * }))\n * .addToolset(myCustomToolset)\n * .addMCP(filesystemMCP)\n * .build();\n *\n * // Start the agent (initializes MCP connections)\n * await agent.start();\n *\n * // Generate a response\n * const result = await agent.generate({\n * messages: [{ role: 'user', content: 'Hello!' }],\n * options: { userId: 'user_123', chatId: 'chat_456' }\n * });\n * ```\n *\n * @module builders/agent\n * @packageDocumentation\n */\nimport {\n type LanguageModel,\n} from \"ai\";\nimport type { z } from \"zod\";\nimport type {\n IgniterAgentConfig,\n IgniterAgentToolset,\n IgniterAgentToolsetType,\n IgniterAgentMCPConfigUnion,\n} from \"../types\";\nimport type { IgniterAgentBuiltAgent } from \"../types/builder\";\nimport { IgniterAgentCore } from \"../core/agent\";\nimport type { IgniterAgentPromptTemplate } from \"../types/prompt\";\nimport { IgniterAgentPromptBuilder } from \"./prompt.builder\";\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterAgentHooks } from \"../types/hooks\";\nimport type { IgniterAgentMemoryConfig } from \"../types/memory\";\n\n/* =============================================================================\n * AGENT BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for creating AI agents.\n *\n * @description\n * The IgniterAgentBuilder provides a comprehensive fluent API for creating\n * AI agents with full TypeScript type inference. It supports:\n *\n * - **Multiple Language Models**: Works with any Vercel AI SDK compatible model\n * - **Custom Toolsets**: Register your own tools with automatic error handling\n * - **MCP Integration**: Connect to MCP servers for external tool providers\n * - **Context Schema**: Type-safe context validation with Zod\n * - **Dynamic Prompts**: Template-based prompt generation\n *\n * **Lifecycle:**\n * 1. Create the builder with `IgniterAgent.create()`\n * 2. Configure using fluent methods (`withModel`, etc.)\n * 3. Build with `.build()` to get the runtime agent\n * 4. Call `.start()` to initialize MCP connections\n * 5. Use `.generate()` or `.stream()` to interact with the agent\n *\n * @typeParam TAgentName - The agent's unique name type\n * @typeParam TAgentModel - The language model type\n * @typeParam TAgentInstructions - The prompt template type\n * @typeParam TAgentToolsets - Record of registered toolsets\n * @typeParam TAgentMCPConfigs - Record of MCP configurations\n * @typeParam TAgentContextSchema - The context schema type\n *\n * @example\n * ```typescript\n * import {\n * IgniterAgent,\n * IgniterAgentPrompt,\n * IgniterAgentToolset,\n * IgniterAgentTool,\n * IgniterAgentMCPClient,\n * } from '@igniter-js/agents';\n * import { openai } from '@ai-sdk/openai';\n * import { z } from 'zod';\n *\n * const runCodeTool = IgniterAgentTool\n * .create('runCode')\n * .withDescription('Runs code')\n * .withInput(z.object({ code: z.string() }))\n * .withExecute(async ({ code }) => codeRunner(code))\n * .build();\n *\n * const searchDocsTool = IgniterAgentTool\n * .create('searchDocs')\n * .withDescription('Searches docs')\n * .withInput(z.object({ query: z.string() }))\n * .withExecute(async ({ query }) => docSearcher(query))\n * .build();\n *\n * // Create a fully-configured agent\n * const agent = IgniterAgent\n * .create('code-assistant')\n * .withModel(openai('gpt-4-turbo'))\n * .withContextSchema(z.object({\n * userId: z.string(),\n * projectId: z.string()\n * }))\n * .withPrompt(\n * IgniterAgentPrompt.create('You are a helpful coding assistant...')\n * )\n * .addToolset(\n * IgniterAgentToolset.create('code')\n * .addTool(runCodeTool)\n * .addTool(searchDocsTool)\n * .build()\n * )\n * .addMCP(\n * IgniterAgentMCPClient.create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@mcp/server-filesystem'])\n * .build()\n * )\n * .build();\n *\n * // Initialize and use\n * await agent.start();\n *\n * const response = await agent.generate({\n * messages: [{ role: 'user', content: 'Help me write a test' }],\n * options: { userId: 'user_123', projectId: 'proj_456' }\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentBuilder<\n TAgentName extends string = string,\n TAgentModel extends LanguageModel = LanguageModel,\n TAgentInstructions extends IgniterAgentPromptTemplate =\n IgniterAgentPromptTemplate,\n TAgentToolsets extends Record<string, IgniterAgentToolset> = Record<\n string,\n IgniterAgentToolset\n >,\n TAgentMCPConfigs extends Record<string, IgniterAgentMCPConfigUnion> = Record<\n string,\n IgniterAgentMCPConfigUnion\n >,\n TAgentContextSchema extends z.ZodSchema = z.ZodSchema,\n> {\n /**\n * The agent configuration being built.\n * @internal\n */\n private readonly _config: Partial<\n IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n >;\n\n /**\n * Creates a new IgniterAgentBuilder instance.\n *\n * @param config - Initial configuration\n * @internal\n */\n private constructor(\n config: Partial<\n IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n > = {},\n ) {\n this._config = {\n name: \"agent\" as TAgentName,\n toolsets: {} as TAgentToolsets,\n configs: {} as TAgentMCPConfigs,\n instructions: IgniterAgentPromptBuilder.create(\"\") as unknown as TAgentInstructions,\n ...config,\n };\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new agent builder.\n *\n * @description\n * Primary entry point for creating an agent. Returns a new builder\n * instance that can be configured using fluent methods.\n *\n * @returns A new IgniterAgentBuilder instance\n *\n * @example\n * ```typescript\n * const agent = IgniterAgent.create('my-agent')\n * .withModel(openai('gpt-4'))\n * .build();\n * ```\n *\n * @public\n */\n static create<TNewName extends string = string>(\n name: TNewName = \"agent\" as TNewName,\n ): IgniterAgentBuilder<\n TNewName,\n LanguageModel,\n IgniterAgentPromptTemplate,\n {},\n {},\n z.ZodSchema\n > {\n return new IgniterAgentBuilder({\n name: name,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the language model.\n *\n * @description\n * Configures the AI model that powers the agent. Supports any model\n * provider compatible with the Vercel AI SDK.\n *\n * @typeParam TNewModel - The new model type\n * @param model - The language model instance\n * @returns A new builder with the model set\n *\n * @example\n * ```typescript\n * import { openai } from '@ai-sdk/openai';\n * import { anthropic } from '@ai-sdk/anthropic';\n * import { google } from '@ai-sdk/google';\n *\n * // Using OpenAI\n * const agent1 = IgniterAgent.create()\n * .withModel(openai('gpt-4-turbo'))\n * .build();\n *\n * // Using Anthropic\n * const agent2 = IgniterAgent.create()\n * .withModel(anthropic('claude-3-opus'))\n * .build();\n *\n * // Using Google\n * const agent3 = IgniterAgent.create()\n * .withModel(google('gemini-pro'))\n * .build();\n * ```\n *\n * @public\n */\n withModel<TNewModel extends LanguageModel>(\n model: TNewModel,\n ): IgniterAgentBuilder<\n TAgentName,\n TNewModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n model,\n });\n }\n\n /**\n * Sets the prompt instructions.\n *\n * @description\n * Configures the agent's system prompt using an IgniterAgentPrompt template.\n * The prompt defines the agent's behavior, personality, and capabilities.\n *\n * @typeParam TNewInstructions - The new instructions type\n * @param instructions - The prompt template instance\n * @returns A new builder with the instructions set\n *\n * @example\n * ```typescript\n * const agent = IgniterAgent.create()\n * .withPrompt(\n * IgniterAgentPrompt.create(`\n * You are a helpful coding assistant specialized in TypeScript.\n *\n * Guidelines:\n * - Always provide type-safe code\n * - Include JSDoc comments\n * - Follow best practices\n * `)\n * )\n * .build();\n * ```\n *\n * @public\n */\n withPrompt<TNewInstructions extends IgniterAgentPromptTemplate>(\n instructions: TNewInstructions,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TNewInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n instructions,\n });\n }\n\n /**\n * Attaches a logger instance for operational logs.\n */\n withLogger(logger: IgniterLogger): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n logger,\n });\n }\n\n /**\n * Attaches a telemetry manager for observability.\n */\n withTelemetry(\n telemetry: IgniterTelemetryManager,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n telemetry,\n });\n }\n\n /**\n * Configures persistent memory for the agent.\n */\n withMemory(\n memory: IgniterAgentMemoryConfig,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n memory,\n });\n }\n\n /**\n * Callback when the agent starts.\n */\n onAgentStart(\n callback: IgniterAgentHooks[\"onAgentStart\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onAgentStart: callback,\n },\n });\n }\n\n /**\n * Callback when the agent errors.\n */\n onAgentError(\n callback: IgniterAgentHooks[\"onAgentError\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onAgentError: callback,\n },\n });\n }\n\n /**\n * Callback when a tool call starts.\n */\n onToolCallStart(\n callback: IgniterAgentHooks[\"onToolCallStart\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onToolCallStart: callback,\n },\n });\n }\n\n /**\n * Callback when a tool call completes.\n */\n onToolCallEnd(\n callback: IgniterAgentHooks[\"onToolCallEnd\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onToolCallEnd: callback,\n },\n });\n }\n\n /**\n * Callback when a tool call fails.\n */\n onToolCallError(\n callback: IgniterAgentHooks[\"onToolCallError\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onToolCallError: callback,\n },\n });\n }\n\n /**\n * Callback when an MCP connection starts.\n */\n onMCPStart(\n callback: IgniterAgentHooks[\"onMCPStart\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onMCPStart: callback,\n },\n });\n }\n\n /**\n * Callback when an MCP connection fails.\n */\n onMCPError(\n callback: IgniterAgentHooks[\"onMCPError\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onMCPError: callback,\n },\n });\n }\n\n /**\n * Sets the context schema.\n *\n * @description\n * Configures a Zod schema for validating context passed to the agent.\n * The context is available in prompt templates and can be used to\n * customize agent behavior per-request.\n *\n * @typeParam TNewSchema - The new schema type\n * @param schema - The Zod schema for context validation\n * @returns A new builder with the schema set\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * const contextSchema = z.object({\n * userId: z.string(),\n * chatId: z.string(),\n * userRole: z.enum(['admin', 'user', 'guest']),\n * preferences: z.object({\n * language: z.string().default('en'),\n * theme: z.string().optional()\n * })\n * });\n *\n * const agent = IgniterAgent.create()\n * .withContextSchema(contextSchema)\n * .build();\n *\n * // Context is type-safe when calling generate\n * await agent.generate({\n * messages: [...],\n * options: {\n * userId: 'user_123',\n * chatId: 'chat_456',\n * userRole: 'admin',\n * preferences: { language: 'pt' }\n * }\n * });\n * ```\n *\n * @public\n */\n withContextSchema<TNewSchema extends z.ZodSchema>(\n schema: TNewSchema,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TNewSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n schema,\n });\n }\n\n /**\n * Adds a toolset to the agent.\n *\n * @description\n * Registers a toolset with the agent. The toolset's tools become available\n * for the AI to invoke. Multiple toolsets can be added to a single agent.\n *\n * Tool names are prefixed with the toolset name to avoid collisions:\n * `{toolsetName}_{toolName}`\n *\n * @typeParam TNewToolset - The toolset type\n * @param toolset - The toolset to register\n * @returns A new builder with the toolset added\n *\n * @example\n * ```typescript\n * const githubToolset = IgniterAgentToolset.create('github')\n * .addTool(createIssueTool)\n * .addTool(listReposTool)\n * .build();\n *\n * const dockerToolset = IgniterAgentToolset.create('docker')\n * .addTool(buildImageTool)\n * .addTool(runContainerTool)\n * .build();\n *\n * const agent = IgniterAgent.create()\n * .addToolset(githubToolset) // Adds github_createIssue, github_listRepos\n * .addToolset(dockerToolset) // Adds docker_build, docker_run\n * .build();\n * ```\n *\n * @public\n */\n addToolset<TNewToolset extends IgniterAgentToolset>(\n toolset: TNewToolset,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets & { [K in TNewToolset[\"name\"]]: TNewToolset },\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n toolsets: {\n ...this._config.toolsets,\n [toolset.name]: toolset,\n } as TAgentToolsets & { [K in TNewToolset[\"name\"]]: TNewToolset },\n });\n }\n\n /**\n * Adds an MCP configuration to the agent.\n *\n * @description\n * Registers an MCP server configuration with the agent. The MCP server\n * will be connected when `agent.start()` is called, and its tools will\n * become available for the AI to invoke.\n *\n * @typeParam TMCPType - The MCP transport type\n * @typeParam TMCPName - The MCP configuration name\n * @param config - The MCP configuration\n * @returns A new builder with the MCP config added\n *\n * @example\n * ```typescript\n * const filesystemMCP = IgniterAgentMCPClient.create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .build();\n *\n * const remoteMCP = IgniterAgentMCPClient.create('remote-api')\n * .withType('http')\n * .withURL('https://api.example.com/mcp')\n * .withHeaders({ 'Authorization': 'Bearer xxx' })\n * .build();\n *\n * const agent = IgniterAgent.create()\n * .addMCP(filesystemMCP)\n * .addMCP(remoteMCP)\n * .build();\n *\n * // MCP connections are established here\n * await agent.start();\n * ```\n *\n * @public\n */\n addMCP<TMCPName extends string>(\n config: IgniterAgentMCPConfigUnion<TMCPName>,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs & { [K in TMCPName]: typeof config },\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n configs: {\n ...this._config.configs,\n [config.name]: config,\n } as TAgentMCPConfigs & { [K in TMCPName]: typeof config },\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed agent.\n *\n * @description\n * Finalizes the agent configuration and returns a runtime agent object.\n * The agent provides methods for:\n * - `start()`: Initialize MCP connections\n * - `generate()`: Generate a single response\n * - `stream()`: Stream a response\n * - Accessors for configuration\n *\n * @returns The built agent runtime object\n *\n * @example\n * ```typescript\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .addToolset(myToolset)\n * .build();\n *\n * // Start the agent\n * await agent.start();\n *\n * // Generate a response\n * const result = await agent.generate({\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n *\n * // Access configuration\n * console.log('Model:', agent.getModel());\n * console.log('Toolsets:', agent.getToolsets());\n * ```\n *\n * @public\n */\n build(): IgniterAgentBuiltAgent<\n TAgentContextSchema,\n TAgentToolsets,\n TAgentModel,\n TAgentInstructions\n > {\n return new IgniterAgentCore<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >(this._config as IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >);\n }\n\n /* ---------------------------------------------------------------------------\n * ACCESSORS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets the current configuration (partial).\n *\n * @returns The current configuration state\n * @public\n */\n getConfig(): Partial<\n IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n > {\n return { ...this._config };\n }\n\n /**\n * Gets the agent name.\n *\n * @returns The agent's name\n * @public\n */\n getName(): TAgentName {\n return this._config.name as TAgentName;\n }\n}\n\n/* =============================================================================\n * MAIN EXPORT ALIAS\n * ============================================================================= */\n\n/**\n * Alias for IgniterAgentBuilder for cleaner API.\n *\n * @description\n * Use `IgniterAgent.create()` as the primary entry point for building agents.\n *\n * @example\n * ```typescript\n * import { IgniterAgent } from '@igniter-js/agents';\n *\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgent = {\n create: IgniterAgentBuilder.create,\n};\n\n/**\n * Type alias for the IgniterAgent class.\n * @public\n */\nexport type IgniterAgent = typeof IgniterAgentBuilder;\n","/**\n * @fileoverview Toolset Builder for creating custom tool collections.\n * This module provides a fluent API for building toolsets with type safety.\n *\n * @description\n * The IgniterAgentToolsetBuilder allows you to create collections of related\n * tools that can be registered with an agent. Each toolset has a unique name\n * and contains one or more tools that the AI can invoke.\n *\n * @example\n * ```typescript\n * import { IgniterAgentToolsetBuilder, IgniterAgentTool } from '@igniter-js/agents/builders';\n * import { z } from 'zod';\n *\n * const createIssue = IgniterAgentTool\n * .create('createIssue')\n * .withDescription('Creates a new issue in a GitHub repository')\n * .withInput(z.object({\n * repo: z.string().describe('Repository name (owner/repo)'),\n * title: z.string().describe('Issue title'),\n * body: z.string().optional().describe('Issue body')\n * }))\n * .withExecute(async ({ repo, title, body }) => {\n * return await github.createIssue(repo, title, body);\n * })\n * .build();\n *\n * const listRepos = IgniterAgentTool\n * .create('listRepos')\n * .withDescription('Lists repositories for a user')\n * .withInputect({\n * username: z.string().describe('GitHub username')\n * }))\n * .withExecute(async ({ username }) => {\n * return await github.listRepos(username);\n * })\n * .build();\n *\n * const githubToolset = IgniterAgentToolsetBuilder\n * .create('github')\n * .addTool(createIssue)\n * .addTool(listRepos)\n * .build();\n * ```\n *\n * @module builders/toolset\n * @packageDocumentation\n */\n\nimport { tool, type Tool, type ToolSet } from \"ai\";\n\nimport type {\n IgniterAgentToolset as IgniterAgentToolsetType,\n IgniterAgentToolsetParams,\n IgniterAgentToolResult,\n} from \"../types\";\n\nimport type {\n IgniterAgentBuiltTool,\n IgniterAgentBuiltToolset,\n} from \"../types/builder\";\n\nimport { IgniterAgentConfigError } from \"../errors\";\n\n/* =============================================================================\n * TOOLSET BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for creating custom toolsets.\n *\n * @description\n * The IgniterAgentToolsetBuilder provides a type-safe fluent API for creating\n * collections of related tools. Tools are wrapped with error handling and\n * result normalization to ensure consistent behavior.\n *\n * **Key Features:**\n * - Fluent chainable API\n * - Full TypeScript type inference for tool parameters\n * - Automatic error handling and result wrapping\n * - Tool execution logging\n *\n * @typeParam TToolsetName - The unique name for this toolset\n * @typeParam TTools - The accumulated tools collection type\n *\n * @example\n * ```typescript\n * // Create tools\n * const getCurrent = IgniterAgentTool\n * .create('getCurrent')\n * .withDescription('Gets current weather for a location')\n * .withInputect({\n * city: z.string(),\n * units: z.enum(['celsius', 'fahrenheit']).default('celsius')\n * }))\n * .withExecute(async ({ city, units }) => {\n * const weather = await weatherApi.getCurrent(city, units);\n * return {\n * temperature: weather.temp,\n * conditions: weather.description,\n * humidity: weather.humidity\n * };\n * })\n * .build();\n *\n * const getForecast = IgniterAgentTool\n * .create('getForecast')\n * .withDescription('Gets 5-day weather forecast')\n * .withInputect({\n * city: z.string(),\n * days: z.number().min(1).max(7).default(5)\n * }))\n * .withExecute(async ({ city, days }) => {\n * return await weatherApi.getForecast(city, days);\n * })\n * .build();\n *\n * // Create a toolset with multiple tools\n * const weatherToolset = IgniterAgentToolsetBuilder\n * .create('weather')\n * .addTool(getCurrent)\n * .addTool(getForecast)\n * .build();\n *\n * // Register with an agent\n * const agent = IgniterAgent.create('assistant')\n * .addToolset(weatherToolset)\n * .build();\n * ```\n *\n * @public\n */\nexport class IgniterAgentToolsetBuilder<\n TToolsetName extends string = string,\n TTools extends ToolSet = Record<string, never>,\n> {\n /**\n * The toolset's unique name.\n * @internal\n */\n private readonly _name: TToolsetName;\n\n /**\n * The accumulated tools collection.\n * @internal\n */\n private readonly _tools: TTools;\n\n /**\n * Creates a new IgniterAgentToolsetBuilder instance.\n *\n * @param params - The toolset name and initial tools\n * @internal\n */\n constructor(params: IgniterAgentToolsetParams<TToolsetName, TTools>) {\n this._name = params.name;\n this._tools = params.tools;\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new toolset builder with the given name.\n *\n * @description\n * This is the primary entry point for creating a new toolset.\n * The name must be unique within an agent and is used as a prefix\n * for tool names when the toolset is registered.\n *\n * @typeParam TName - The toolset name type\n * @param name - Unique name for the toolset\n * @returns A new IgniterAgentToolsetBuilder instance\n *\n * @example\n * ```typescript\n * const tool = IgniterAgentTool\n * .create('doSomething')\n * .withDescription('Does something')\n * .withInputect({}))\n * .withExecute(async () => ({ ok: true }))\n * .build();\n *\n * const toolset = IgniterAgentToolset\n * .create('myTools')\n * .addTool(tool)\n * .build();\n * ```\n *\n * @public\n */\n static create<TName extends string>(\n name: TName,\n ): IgniterAgentToolsetBuilder<TName, {}> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Toolset name is required and must be a non-empty string\",\n field: \"name\",\n });\n }\n\n return new IgniterAgentToolsetBuilder<TName, Record<string, never>>({\n name,\n tools: {} as Record<string, never>,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Changes the toolset name.\n *\n * @description\n * Allows renaming the toolset during the building process.\n * This creates a new builder instance with the new name.\n *\n * @typeParam TNewName - The new name type\n * @param name - The new name for the toolset\n * @returns A new builder with the updated name\n *\n * @example\n * ```typescript\n * const toolset = IgniterAgentToolset\n * .create('temp')\n * .withName('production') // Rename to 'production'\n * .addTool(myTool)\n * .build();\n * ```\n *\n * @public\n */\n withName<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentToolsetBuilder<TNewName, TTools> {\n return new IgniterAgentToolsetBuilder<TNewName, TTools>({\n name,\n tools: this._tools,\n });\n }\n\n /**\n * Adds a tool to the toolset.\n *\n * @description\n * Adds a built tool definition to the toolset. The tool is automatically\n * wrapped with error handling that returns a consistent result format\n * (`{ success: true, data: ... }` or `{ success: false, error: ... }`).\n *\n * @typeParam TToolName - The tool name type\n * @param dto - The built tool definition\n * @returns A new builder with the tool added\n *\n * @example\n * ```typescript\n * const greetTool = IgniterAgentTool.create('greet')\n * .withDescription('Greets a user')\n * .withInputect({ name: z.string() }))\n * .withExecute(async ({ name }) => `Hello, ${name}!`)\n * .build();\n *\n * const toolset = IgniterAgentToolset.create('utils')\n * .addTool(greetTool)\n * .build();\n * ```\n *\n * @public\n */\n addTool<TTool extends IgniterAgentBuiltTool<any, any, any>>(\n dto: TTool,\n ): IgniterAgentToolsetBuilder<\n TToolsetName,\n TTools & { [K in TTool['$Infer']['Name']]: Tool<TTool['$Infer']['Input'], TTool['$Infer']['Output']> }\n > {\n if (!dto.name || typeof dto.name !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Tool name is required and must be a non-empty string\",\n field: \"name\",\n metadata: { toolset: this._name },\n });\n }\n\n // Wrap the tool with error handling\n const wrappedTool = tool({\n description: dto.description,\n inputSchema: dto.inputSchema,\n outputSchema: dto.outputSchema,\n execute: async (params, options) => {\n // If no execute function, return error\n if (!dto.execute) {\n const result: IgniterAgentToolResult<undefined> = {\n success: false,\n error: `Tool '${dto.name}' has no execute method`,\n };\n \n return result;\n }\n\n try {\n // Execute the tool and wrap result\n const response = await dto.execute(params, options as any);\n const result: IgniterAgentToolResult<typeof response> = {\n success: true,\n data: response,\n };\n return result;\n } catch (error) {\n // Log and return error\n console.error(\n `[IgniterAgent] Error executing tool '${dto.name}':`,\n error,\n );\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n const result: IgniterAgentToolResult<undefined> = {\n success: false,\n error: errorMessage,\n };\n return result;\n }\n },\n });\n\n // Return new builder with the tool added\n return new IgniterAgentToolsetBuilder<\n TToolsetName,\n TTools & { [K in TTool['name']]: Tool }\n >({\n name: this._name,\n tools: {\n ...this._tools,\n [dto.name]: wrappedTool,\n } as TTools & { [K in TTool['$Infer']['Name']]: Tool<TTool['$Infer']['Input'], TTool['$Infer']['Output']> },\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed toolset.\n *\n * @description\n * Finalizes the toolset configuration and returns an object that can\n * be registered with an agent using `addToolset()`.\n *\n * The returned object includes:\n * - `name`: The toolset's unique identifier\n * - `type`: Always `'custom'` for user-defined toolsets\n * - `status`: Always `'connected'` for custom toolsets\n * - `tools`: The tools collection\n * - `toolset`: Reference to the raw tools object\n *\n * @returns The completed toolset configuration\n *\n * @example\n * ```typescript\n * const toolset = IgniterAgentToolset\n * .create('utils')\n * .addTool(formatDateTool)\n * .addTool(parseJsonTool)\n * .build();\n *\n * console.log(toolset.name); // 'utils'\n * console.log(toolset.type); // 'custom'\n * console.log(toolset.status); // 'connected'\n * console.log(Object.keys(toolset.tools)); // ['formatDate', 'parseJSON']\n * ```\n *\n * @public\n */\n build(): IgniterAgentBuiltToolset<TToolsetName, TTools> {\n return {\n type: \"custom\" as const,\n name: this._name,\n toolset: this._tools,\n status: \"connected\" as const,\n tools: this._tools,\n $Infer: {} as {\n Name: TToolsetName;\n Tools: TTools;\n }\n };\n }\n\n /* ---------------------------------------------------------------------------\n * ACCESSORS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets the current toolset name.\n *\n * @returns The toolset's name\n * @public\n */\n getName(): TToolsetName {\n return this._name;\n }\n\n /**\n * Gets the current tools collection.\n *\n * @returns The tools object\n * @public\n */\n getTools(): TTools {\n return this._tools;\n }\n\n /**\n * Gets the number of tools in the toolset.\n *\n * @returns The tool count\n * @public\n */\n getToolCount(): number {\n return Object.keys(this._tools).length;\n }\n}\n\n/* =============================================================================\n * FACTORY FUNCTION\n * ============================================================================= */\n\n/**\n * Factory function to create a new toolset builder.\n *\n * @description\n * Convenience function that wraps `IgniterAgentToolsetBuilder.create()`.\n * Useful for more concise code or functional programming patterns.\n *\n * @typeParam TName - The toolset name type\n * @param name - Unique name for the toolset\n * @returns A new IgniterAgentToolsetBuilder instance\n *\n * @example\n * ```typescript\n * import { IgniterAgentToolset, IgniterAgentTool } from '@igniter-js/agents';\n *\n * const sayHello = IgniterAgentTool\n * .create('sayHello')\n * .withDescription('Says hello')\n * .withInputect({ name: z.string() }))\n * .withExecute(async ({ name }) => `Hello, ${name}!`)\n * .build();\n *\n * const myToolset = IgniterAgentToolset.create('myTools')\n * .addTool(sayHello)\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgentToolset = {\n create: IgniterAgentToolsetBuilder.create,\n}; \n","/**\n * @fileoverview Tool Builder for creating individual tool definitions.\n * This module provides a fluent API for building single tools with type safety.\n *\n * @description\n * The IgniterAgentToolBuilder allows you to define a single tool using a\n * fluent builder pattern. The resulting tool definition can be added to a\n * toolset builder for registration with an agent.\n *\n * @example\n * ```typescript\n * import { IgniterAgentTool } from '@igniter-js/agents';\n * import { z } from 'zod';\n *\n * const greetTool = IgniterAgentTool\n * .create('greet')\n * .withDescription('Greets a user by name')\n * .withInput(z.object({ name: z.string() }))\n * .withExecute(async ({ name }) => `Hello, ${name}!`)\n * .build();\n * ```\n *\n * @module builders/tool\n * @packageDocumentation\n */\n\nimport type { z } from \"zod\";\n\nimport type {\n IgniterAgentBuiltTool,\n IgniterAgentToolExecuteOptions,\n} from \"../types\";\n\nimport { IgniterAgentConfigError } from \"../errors\";\n\n/* =============================================================================\n * TOOL BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for creating a single tool definition.\n *\n * @description\n * The IgniterAgentToolBuilder provides a type-safe fluent API for defining\n * a tool's metadata, input schema, and execution handler.\n *\n * @typeParam TName - The tool's unique name\n * @typeParam TInputSchema - The tool parameters type\n * @typeParam TOutputSchema - The tool result type\n *\n * @public\n */\nexport class IgniterAgentToolBuilder<\n TName extends string = string,\n TInputSchema = unknown,\n TOutputSchema = undefined,\n TExecute extends (\n params: TInputSchema,\n options: IgniterAgentToolExecuteOptions\n ) => \n Promise<unknown>\n = any\n> {\n /**\n * The accumulated tool definition.\n * @internal\n */\n private readonly _definition: Partial<\n IgniterAgentBuiltTool<TName, TInputSchema, TOutputSchema>\n >;\n\n /**\n * Creates a new IgniterAgentToolBuilder instance.\n *\n * @param name - The tool name\n * @param definition - Partial tool definition\n * @internal\n */\n private constructor(\n definition: Partial<IgniterAgentBuiltTool<TName, TInputSchema, TOutputSchema>> = {},\n ) {\n this._definition = definition;\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new tool builder with the given name.\n *\n * @description\n * The name must be unique within a toolset.\n *\n * @typeParam TNewName - The tool name type\n * @param name - Unique name for the tool\n * @returns A new IgniterAgentToolBuilder instance\n *\n * @public\n */\n static create<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentToolBuilder<TNewName, unknown, unknown> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Tool name is required and must be a non-empty string\",\n field: \"name\",\n });\n }\n\n return new IgniterAgentToolBuilder<TNewName, unknown, unknown, any>({\n name,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILDER METHODS\n * --------------------------------------------------------------------------- */\n /**\n * Sets the tool description.\n *\n * @param description - Human-readable description shown to the AI\n * @returns A new builder with the description set\n *\n * @public\n */\n withDescription(\n description: string,\n ): IgniterAgentToolBuilder<TName, TInputSchema, TOutputSchema> {\n if (!description || typeof description !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Tool description is required and must be a non-empty string\",\n field: \"description\",\n metadata: { tool: this._definition.name },\n });\n }\n\n return new IgniterAgentToolBuilder<TName, TInputSchema, TOutputSchema, TExecute>({\n ...this._definition,\n description,\n });\n }\n\n /**\n * Sets the tool parameters schema.\n *\n * @typeParam TNewParams - The new parameters type\n * @param parameters - Zod schema defining input parameters\n * @returns A new builder with the parameters set\n *\n * @public\n */\n withInput<TNewParams>(\n inputSchema: z.ZodSchema<TNewParams>,\n ): IgniterAgentToolBuilder<TName, TNewParams, TOutputSchema> {\n if (!inputSchema) {\n throw new IgniterAgentConfigError({\n message: \"Tool parameters schema is required\",\n field: \"parameters\",\n metadata: { tool: this._definition.name },\n });\n }\n\n type TNewExecute = (\n params: TNewParams,\n options: IgniterAgentToolExecuteOptions\n ) => \n TOutputSchema extends undefined ? Promise<unknown> : Promise<TOutputSchema>;\n\n return new IgniterAgentToolBuilder<TName, TNewParams, TOutputSchema, TNewExecute>({\n ...this._definition,\n inputSchema,\n } as Partial<IgniterAgentBuiltTool<TName, TNewParams, TOutputSchema, TNewExecute>>);\n }\n\n /**\n * Sets the tool output schema.\n *\n * @typeParam TNewResult - The new result type\n * @param outputSchema - Zod schema defining the tool's output\n * @returns A new builder with the output schema set\n *\n * @public\n */\n withOutput<TNewResult>(\n outputSchema: z.ZodSchema<TNewResult>,\n ): IgniterAgentToolBuilder<TName, TInputSchema, TNewResult> {\n if (!outputSchema) {\n throw new IgniterAgentConfigError({\n message: \"Tool output schema is required\",\n field: \"outputSchema\",\n metadata: { tool: this._definition.name },\n });\n }\n\n type TNewExecute = (\n params: TInputSchema,\n options: IgniterAgentToolExecuteOptions\n ) => \n TNewResult extends undefined ? Promise<unknown> : Promise<TNewResult>;\n\n return new IgniterAgentToolBuilder<TName, TInputSchema, TNewResult, TNewExecute>({\n ...this._definition,\n outputSchema,\n } as Partial<IgniterAgentBuiltTool<TName, TInputSchema, TNewResult, TNewExecute>>);\n } \n\n /**\n * Sets the tool execution handler.\n *\n * @typeParam TNewResult - The new result type\n * @param execute - Function that performs the tool's logic\n * @returns A new builder with the execute handler set\n *\n * @public\n */\n withExecute<\n TNewExecute extends (\n params: TInputSchema,\n options: IgniterAgentToolExecuteOptions\n ) =>\n TOutputSchema extends undefined ? Promise<unknown> : Promise<TOutputSchema>,\n TNewResult = Awaited<ReturnType<TNewExecute>>\n >(\n execute: TNewExecute,\n ): IgniterAgentToolBuilder<TName, TInputSchema, TNewResult, TNewExecute> {\n if (typeof execute !== \"function\") {\n throw new IgniterAgentConfigError({\n message: \"Tool execute handler must be a function\",\n field: \"execute\",\n metadata: { tool: this._definition.name },\n });\n }\n\n // @ts-expect-error - TypeScript cannot infer the new result type here\n return new IgniterAgentToolBuilder<TName, TInputSchema, TNewResult, TExecute>({\n ...this._definition,\n execute,\n } as Partial<IgniterAgentBuiltTool<TName, TInputSchema, TNewResult, TExecute>>);\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed tool definition.\n *\n * @returns The completed tool definition with its name\n *\n * @public\n */\n build(): IgniterAgentBuiltTool<TName, TInputSchema, TOutputSchema> {\n const { name, description, inputSchema, outputSchema, execute } = this._definition;\n\n if (!name) {\n throw new IgniterAgentConfigError({\n message: \"Tool name is required before building\",\n field: \"name\",\n });\n }\n\n if (!description) {\n throw new IgniterAgentConfigError({\n message: \"Tool description is required before building\",\n field: \"description\",\n metadata: { tool: this._definition.name },\n });\n }\n\n if (!inputSchema) {\n throw new IgniterAgentConfigError({\n message: \"Tool parameters schema is required before building\",\n field: \"parameters\",\n metadata: { tool: this._definition.name },\n });\n }\n\n if (!execute) {\n throw new IgniterAgentConfigError({\n message: \"Tool execute handler is required before building\",\n field: \"execute\",\n metadata: { tool: this._definition.name },\n });\n }\n\n return {\n name,\n description,\n inputSchema,\n outputSchema,\n execute,\n $Infer: {} as {\n Name: TName;\n Description: string;\n Input: TInputSchema;\n Output: TOutputSchema;\n }\n };\n }\n}\n\n/* =============================================================================\n * FACTORY FUNCTION\n * ============================================================================= */\n\n/**\n * Factory function to create a new tool builder.\n *\n * @description\n * Convenience function that wraps `IgniterAgentTool.create('toolName')`.\n *\n * @typeParam TName - The tool name type\n * @param name - Unique name for the tool\n * @returns A new IgniterAgentToolBuilder instance\n *\n * @public\n */\nexport const IgniterAgentTool = {\n create: IgniterAgentToolBuilder.create,\n}\n","/**\n * @fileoverview MCP (Model Context Protocol) Client Builder.\n * This module provides a fluent API for configuring MCP server connections.\n *\n * @description\n * The IgniterAgentMCPBuilder allows you to configure connections to MCP servers\n * using either stdio (local process) or HTTP (remote server) transport.\n *\n * MCP servers provide tools that the agent can invoke, similar to custom toolsets,\n * but the tools are hosted externally and discovered at runtime.\n *\n * @see {@link https://modelcontextprotocol.io/ | Model Context Protocol}\n *\n * @example\n * ```typescript\n * import { IgniterAgentMCPBuilder } from '@igniter-js/agents/builders';\n *\n * // Configure a stdio MCP server (local process)\n * const filesystemMCP = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .withEnv({ DEBUG: 'true' })\n * .build();\n *\n * // Configure an HTTP MCP server (remote)\n * const remoteMCP = IgniterAgentMCPBuilder\n * .create('remote-tools')\n * .withType('http')\n * .withURL('https://mcp.example.com/api')\n * .withHeaders({ 'Authorization': 'Bearer token123' })\n * .build();\n * ```\n *\n * @module builders/mcp\n * @packageDocumentation\n */\n\nimport type {\n IgniterAgentToolsetType,\n IgniterAgentMCPStdioConfig,\n IgniterAgentMCPHttpConfig,\n IgniterAgentMCPConfigUnion,\n IgniterAgentMCPClientInterface,\n} from \"../types\";\n\nimport {\n IgniterAgentConfigError,\n IgniterAgentMCPError,\n IgniterAgentErrorCode,\n} from \"../errors\";\n\n/* =============================================================================\n * MCP BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for configuring MCP server connections.\n *\n * @description\n * The IgniterAgentMCPBuilder provides a type-safe fluent API for creating\n * MCP server configurations. The builder adapts its available methods based\n * on the transport type selected.\n *\n * **Transport Types:**\n * - `stdio`: For local MCP servers running as child processes\n * - `http`: For remote MCP servers accessed over HTTP/HTTPS\n *\n * **Key Features:**\n * - Type-safe configuration based on transport type\n * - Validation of required fields\n * - Environment variable support for stdio\n * - Header support for HTTP authentication\n *\n * @typeParam TType - The transport type ('stdio' | 'http')\n * @typeParam TName - The unique configuration name\n *\n * @example\n * ```typescript\n * // Stdio transport (local process)\n * const localMCP = IgniterAgentMCPBuilder\n * .create('github')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-github'])\n * .withEnv({ GITHUB_TOKEN: process.env.GITHUB_TOKEN! })\n * .build();\n *\n * // HTTP transport (remote server)\n * const remoteMCP = IgniterAgentMCPBuilder\n * .create('opencode')\n * .withType('http')\n * .withURL('https://sandbox.example.com/mcp')\n * .withHeaders({\n * 'X-API-Key': process.env.API_KEY!,\n * 'Content-Type': 'application/json'\n * })\n * .build();\n *\n * // Register with an agent\n * const agent = IgniterAgent.create('my-agent')\n * .addMCP(localMCP)\n * .addMCP(remoteMCP)\n * .build();\n * ```\n *\n * @public\n */\nexport class IgniterAgentMCPBuilder<\n TType extends IgniterAgentToolsetType = IgniterAgentToolsetType,\n TName extends string = string,\n> {\n /**\n * The configuration being built.\n * @internal\n */\n private readonly _config: Partial<IgniterAgentMCPConfigUnion<TName>>;\n\n /**\n * Creates a new IgniterAgentMCPBuilder instance.\n *\n * @param config - Initial configuration\n * @internal\n */\n private constructor(config: Partial<IgniterAgentMCPConfigUnion<TName>> = {}) {\n this._config = config;\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new MCP builder with the given name.\n *\n * @description\n * This is the primary entry point for creating an MCP configuration.\n * The name must be unique within an agent and is used to identify\n * the MCP server and its tools.\n *\n * After calling `create()`, you must call `withType()` to specify\n * the transport type before configuring transport-specific options.\n *\n * @typeParam TNewName - The configuration name type\n * @param name - Unique name for the MCP configuration\n * @returns A new IgniterAgentMCPBuilder instance\n *\n * @example\n * ```typescript\n * const mcpConfig = IgniterAgentMCPBuilder\n * .create('my-mcp')\n * .withType('stdio') // or 'http'\n * .withCommand('...') // available after withType('stdio')\n * .build();\n * ```\n *\n * @public\n */\n static create<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentMCPBuilder<IgniterAgentToolsetType, TNewName> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterAgentConfigError({\n message:\n \"MCP configuration name is required and must be a non-empty string\",\n field: \"name\",\n });\n }\n\n return new IgniterAgentMCPBuilder<IgniterAgentToolsetType, TNewName>({\n name,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * COMMON BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the configuration name.\n *\n * @description\n * Allows changing the configuration name during the building process.\n *\n * @typeParam TNewName - The new name type\n * @param name - The new name for the configuration\n * @returns A new builder with the updated name\n *\n * @public\n */\n withName<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentMCPBuilder<TType, TNewName> {\n return new IgniterAgentMCPBuilder<TType, TNewName>({\n ...this._config,\n name,\n } as Partial<IgniterAgentMCPConfigUnion<TNewName>>);\n }\n\n /**\n * Sets the transport type for the MCP connection.\n *\n * @description\n * Specifies how the agent will communicate with the MCP server:\n * - `stdio`: Spawns a local process and communicates via stdin/stdout\n * - `http`: Connects to a remote server via HTTP/HTTPS\n *\n * After calling this method, transport-specific methods become available:\n * - For `stdio`: `withCommand()`, `withArgs()`, `withEnv()`\n * - For `http`: `withURL()`, `withHeaders()`\n *\n * @typeParam TNewType - The transport type\n * @param type - The transport type to use\n * @returns A new builder configured for the specified transport\n *\n * @example\n * ```typescript\n * // Stdio transport\n * const stdioConfig = IgniterAgentMCPBuilder\n * .create('local')\n * .withType('stdio')\n * .withCommand('python')\n * .withArgs(['mcp_server.py'])\n * .build();\n *\n * // HTTP transport\n * const httpConfig = IgniterAgentMCPBuilder\n * .create('remote')\n * .withType('http')\n * .withURL('https://api.example.com/mcp')\n * .build();\n * ```\n *\n * @public\n */\n withType<TNewType extends IgniterAgentToolsetType>(\n type: TNewType,\n ): IgniterAgentMCPBuilder<TNewType, TName> {\n if (type !== \"stdio\" && type !== \"http\") {\n throw new IgniterAgentConfigError({\n message: `Invalid MCP transport type: '${type}'. Must be 'stdio' or 'http'`,\n field: \"type\",\n metadata: { validTypes: [\"stdio\", \"http\"] },\n });\n }\n\n return new IgniterAgentMCPBuilder<TNewType, TName>({\n ...this._config,\n type,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /* ---------------------------------------------------------------------------\n * STDIO-SPECIFIC BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the command to execute for stdio transport.\n *\n * @description\n * Specifies the executable to run when starting the MCP server process.\n * Common values include `npx`, `node`, `python`, `deno`, etc.\n *\n * @param command - The command to execute\n * @returns A new builder with the command set\n * @throws {IgniterAgentConfigError} If transport type is not 'stdio'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem'])\n * .build();\n * ```\n *\n * @public\n */\n withCommand(command: string): IgniterAgentMCPBuilder<TType, TName> {\n this._assertStdioType(\"withCommand\");\n\n if (!command || typeof command !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Command is required and must be a non-empty string\",\n field: \"command\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n command,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /**\n * Sets the arguments to pass to the command.\n *\n * @description\n * Specifies command-line arguments for the MCP server process.\n *\n * @param args - Array of command arguments\n * @returns A new builder with the arguments set\n * @throws {IgniterAgentConfigError} If transport type is not 'stdio'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs([\n * '-y',\n * '@modelcontextprotocol/server-filesystem',\n * '/home/user/documents',\n * '--read-only'\n * ])\n * .build();\n * ```\n *\n * @public\n */\n withArgs(args: string[]): IgniterAgentMCPBuilder<TType, TName> {\n this._assertStdioType(\"withArgs\");\n\n if (!Array.isArray(args)) {\n throw new IgniterAgentConfigError({\n message: \"Args must be an array of strings\",\n field: \"args\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n args,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /**\n * Sets environment variables for the command process.\n *\n * @description\n * Specifies environment variables to pass to the MCP server process.\n * Useful for passing API keys, configuration, or feature flags.\n *\n * @param env - Record of environment variable names to values\n * @returns A new builder with the environment variables set\n * @throws {IgniterAgentConfigError} If transport type is not 'stdio'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('github')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-github'])\n * .withEnv({\n * GITHUB_TOKEN: process.env.GITHUB_TOKEN!,\n * GITHUB_ORG: 'my-organization',\n * DEBUG: 'mcp:*'\n * })\n * .build();\n * ```\n *\n * @public\n */\n withEnv(env: Record<string, string>): IgniterAgentMCPBuilder<TType, TName> {\n this._assertStdioType(\"withEnv\");\n\n if (!env || typeof env !== \"object\") {\n throw new IgniterAgentConfigError({\n message: \"Env must be an object mapping variable names to values\",\n field: \"env\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n env,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /* ---------------------------------------------------------------------------\n * HTTP-SPECIFIC BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the URL for HTTP transport.\n *\n * @description\n * Specifies the endpoint URL for the remote MCP server.\n * Must be a valid HTTP or HTTPS URL.\n *\n * @param url - The MCP server URL\n * @returns A new builder with the URL set\n * @throws {IgniterAgentConfigError} If transport type is not 'http' or URL is invalid\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('opencode')\n * .withType('http')\n * .withURL('https://sandbox.example.com/mcp/v1')\n * .build();\n * ```\n *\n * @public\n */\n withURL(url: string): IgniterAgentMCPBuilder<TType, TName> {\n this._assertHttpType(\"withURL\");\n\n if (!url || typeof url !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"URL is required and must be a non-empty string\",\n field: \"url\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n // Validate URL format\n try {\n new URL(url);\n } catch {\n throw new IgniterAgentConfigError({\n message: `Invalid URL format: '${url}'`,\n field: \"url\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n url,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /**\n * Sets HTTP headers for requests to the MCP server.\n *\n * @description\n * Specifies headers to include in all HTTP requests to the MCP server.\n * Commonly used for authentication, API keys, or content type.\n *\n * @param headers - Record of header names to values\n * @returns A new builder with the headers set\n * @throws {IgniterAgentConfigError} If transport type is not 'http'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('authenticated-mcp')\n * .withType('http')\n * .withURL('https://api.example.com/mcp')\n * .withHeaders({\n * 'Authorization': `Bearer ${process.env.API_TOKEN}`,\n * 'X-Client-ID': 'my-app',\n * 'Content-Type': 'application/json'\n * })\n * .build();\n * ```\n *\n * @public\n */\n withHeaders(\n headers: Record<string, string>,\n ): IgniterAgentMCPBuilder<TType, TName> {\n this._assertHttpType(\"withHeaders\");\n\n if (!headers || typeof headers !== \"object\") {\n throw new IgniterAgentConfigError({\n message: \"Headers must be an object mapping header names to values\",\n field: \"headers\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n headers,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed MCP configuration.\n *\n * @description\n * Validates the configuration and returns a typed configuration object\n * that can be registered with an agent using `addMCP()`.\n *\n * @returns The completed MCP configuration\n * @throws {IgniterAgentConfigError} If required fields are missing\n *\n * @example\n * ```typescript\n * const mcpConfig = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .build();\n *\n * // Use with an agent\n * const agent = IgniterAgent.create()\n * .addMCP(mcpConfig)\n * .build();\n * ```\n *\n * @public\n */\n build(): TType extends \"stdio\"\n ? IgniterAgentMCPStdioConfig<TName>\n : TType extends \"http\"\n ? IgniterAgentMCPHttpConfig<TName>\n : IgniterAgentMCPConfigUnion<TName> {\n // Validate required fields\n if (!this._config.name) {\n throw new IgniterAgentConfigError({\n message: \"MCP configuration name is required\",\n field: \"name\",\n });\n }\n\n if (!this._config.type) {\n throw new IgniterAgentConfigError({\n message:\n 'MCP transport type is required. Call withType(\"stdio\") or withType(\"http\")',\n field: \"type\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n // Validate stdio-specific requirements\n if (this._config.type === \"stdio\") {\n const config = this._config as Partial<IgniterAgentMCPStdioConfig<TName>>;\n\n if (!config.command) {\n throw new IgniterAgentConfigError({\n message: \"Command is required for stdio transport\",\n field: \"command\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n if (!config.args) {\n throw new IgniterAgentConfigError({\n message: \"Args are required for stdio transport\",\n field: \"args\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return {\n type: \"stdio\",\n name: config.name!,\n command: config.command,\n args: config.args,\n env: config.env,\n } as TType extends \"stdio\" ? IgniterAgentMCPStdioConfig<TName> : never;\n }\n\n // Validate http-specific requirements\n if (this._config.type === \"http\") {\n const config = this._config as Partial<IgniterAgentMCPHttpConfig<TName>>;\n\n if (!config.url) {\n throw new IgniterAgentConfigError({\n message: \"URL is required for http transport\",\n field: \"url\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n // @ts-expect-error - headers are optional\n return {\n type: \"http\",\n name: config.name,\n url: config.url,\n headers: config.headers,\n } as TType extends \"http\" ? IgniterAgentMCPHttpConfig<TName> : never;\n }\n\n throw new IgniterAgentConfigError({\n message: `Invalid transport type: '${this._config.type}'`,\n field: \"type\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n /* ---------------------------------------------------------------------------\n * PRIVATE HELPER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Asserts that the current transport type is 'stdio'.\n * @internal\n */\n private _assertStdioType(methodName: string): void {\n if (this._config.type !== \"stdio\") {\n throw new IgniterAgentConfigError({\n message:\n `${methodName}() is only available for stdio transport. ` +\n `Current type: '${this._config.type || \"not set\"}'. ` +\n `Call withType('stdio') first.`,\n field: \"type\",\n metadata: { mcpName: this._config.name, operation: methodName },\n });\n }\n }\n\n /**\n * Asserts that the current transport type is 'http'.\n * @internal\n */\n private _assertHttpType(methodName: string): void {\n if (this._config.type !== \"http\") {\n throw new IgniterAgentConfigError({\n message:\n `${methodName}() is only available for http transport. ` +\n `Current type: '${this._config.type || \"not set\"}'. ` +\n `Call withType('http') first.`,\n field: \"type\",\n metadata: { mcpName: this._config.name, operation: methodName },\n });\n }\n }\n}\n\n/* =============================================================================\n * FACTORY FUNCTION\n * ============================================================================= */\n\n/**\n * Factory function to create a new MCP builder.\n *\n * @description\n * Convenience function that wraps `IgniterAgentMCPBuilder.create()`.\n *\n * @typeParam TName - The configuration name type\n * @param name - Unique name for the MCP configuration\n * @returns A new IgniterAgentMCPBuilder instance\n *\n * @example\n * ```typescript\n * import { IgniterAgentMCPClient } from '@igniter-js/agents';\n *\n * const filesystemMCP = IgniterAgentMCPClient.create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgentMCPClient = {\n create: IgniterAgentMCPBuilder.create,\n}\n","/**\n * @fileoverview In-memory adapter for IgniterAgent memory storage.\n * This module provides a simple in-memory implementation of the memory provider.\n * \n * @description\n * The IgniterAgentInMemoryAdapter stores all data in JavaScript Maps,\n * making it ideal for:\n * - Development and testing\n * - Short-lived applications\n * - Prototyping\n * - Demos\n * \n * **Important:** Data is lost when the process restarts. For production use,\n * consider using a persistent adapter like Redis or PostgreSQL.\n * \n * @example\n * ```typescript\n * import { IgniterAgentInMemoryAdapter } from '@igniter-js/agents/adapters';\n * \n * // Create adapter\n * const adapter = new IgniterAgentInMemoryAdapter({\n * namespace: 'myapp',\n * debug: true\n * });\n * \n * // Use with memory config\n * const memoryConfig: IgniterAgentMemoryConfig = {\n * provider: adapter,\n * working: { enabled: true, scope: 'chat' },\n * history: { enabled: true, limit: 100 }\n * };\n * ```\n * \n * @module adapters/memory\n * @packageDocumentation\n */\n\nimport type {\n IgniterAgentMemoryProvider,\n IgniterAgentWorkingMemory,\n IgniterAgentConversationMessage,\n IgniterAgentChatSession,\n IgniterAgentWorkingMemoryParams,\n IgniterAgentUpdateWorkingMemoryParams,\n IgniterAgentGetMessagesParams,\n IgniterAgentGetChatsParams,\n IgniterAgentInMemoryAdapterOptions,\n IgniterAgentMemoryAdapter,\n IgniterAgentAdapterStats,\n} from \"../types\";\n\n/* =============================================================================\n * IN-MEMORY ADAPTER CLASS\n * ============================================================================= */\n\n/**\n * In-memory implementation of the IgniterAgent memory provider.\n * \n * @description\n * Stores all memory data in JavaScript Maps. Provides a complete implementation\n * of the memory provider interface for development and testing purposes.\n * \n * **Features:**\n * - Full implementation of all memory provider methods\n * - Optional message/chat limits to control memory usage\n * - Debug logging\n * - Namespace support for multi-tenant applications\n * \n * **Limitations:**\n * - Data is not persisted across process restarts\n * - Not suitable for production with high availability requirements\n * - No horizontal scaling support\n * \n * @example\n * ```typescript\n * import { IgniterAgentInMemoryAdapter } from '@igniter-js/agents/adapters';\n * \n * const adapter = new IgniterAgentInMemoryAdapter({\n * namespace: 'test',\n * debug: process.env.NODE_ENV === 'development',\n * maxMessages: 500,\n * maxChats: 50\n * });\n * \n * // Store working memory\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: 'User prefers TypeScript'\n * });\n * \n * // Retrieve working memory\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * console.log(memory?.content); // 'User prefers TypeScript'\n * ```\n * \n * @public\n */\nexport class IgniterAgentInMemoryAdapter implements IgniterAgentMemoryAdapter<IgniterAgentInMemoryAdapterOptions> {\n /**\n * The adapter configuration options.\n */\n public readonly options: Required<IgniterAgentInMemoryAdapterOptions>;\n\n /**\n * Storage for working memory.\n * Key format: `{namespace}:{scope}:{identifier}`\n * @internal\n */\n private readonly _workingMemory: Map<string, IgniterAgentWorkingMemory> = new Map();\n\n /**\n * Storage for conversation messages.\n * Key format: `{namespace}:{chatId}`\n * @internal\n */\n private readonly _messages: Map<string, IgniterAgentConversationMessage[]> = new Map();\n\n /**\n * Storage for chat sessions.\n * Key format: `{namespace}:{chatId}`\n * @internal\n */\n private readonly _chats: Map<string, IgniterAgentChatSession> = new Map();\n\n /**\n * Creates a new IgniterAgentInMemoryAdapter.\n * \n * @param options - Adapter configuration\n * \n * @example\n * ```typescript\n * const adapter = new IgniterAgentInMemoryAdapter({\n * namespace: 'myapp',\n * maxMessages: 1000,\n * maxChats: 100\n * });\n * ```\n */\n constructor(options: IgniterAgentInMemoryAdapterOptions = {}) {\n this.options = {\n namespace: options.namespace ?? 'igniter',\n maxMessages: options.maxMessages ?? 1000,\n maxChats: options.maxChats ?? 100,\n };\n }\n\n /**\n * Factory method to create a new adapter instance.\n * @param options - Adapter configuration\n * @returns A new IgniterAgentInMemoryAdapter instance\n *\n * @example\n * ```typescript\n * const adapter = IgniterAgentInMemoryAdapter.create({\n * namespace: 'test',\n * });\n * ```\n */\n static create(\n options?: IgniterAgentInMemoryAdapterOptions\n ): IgniterAgentInMemoryAdapter {\n return new IgniterAgentInMemoryAdapter(options);\n }\n\n /* ---------------------------------------------------------------------------\n * HELPER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Generates a storage key with namespace prefix.\n * @internal\n */\n private _key(...parts: string[]): string {\n return [this.options.namespace, ...parts].join(':');\n }\n\n /* ---------------------------------------------------------------------------\n * LIFECYCLE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Connects to the storage backend (no-op for in-memory).\n * \n * @description\n * In-memory adapter doesn't require connection setup.\n * This method exists for interface compatibility.\n */\n async connect(): Promise<void> {\n // No-op for in-memory adapter\n }\n\n /**\n * Disconnects from the storage backend (no-op for in-memory).\n * \n * @description\n * In-memory adapter doesn't require disconnection.\n * This method exists for interface compatibility.\n */\n async disconnect(): Promise<void> {\n // No-op for in-memory adapter\n }\n\n /**\n * Checks if the adapter is connected.\n * \n * @returns Always true for in-memory adapter\n */\n isConnected(): boolean {\n return true;\n }\n\n /**\n * Clears all stored data.\n * \n * @description\n * Removes all working memory, messages, and chat sessions.\n * Use with caution.\n * \n * @example\n * ```typescript\n * // Clear all data (useful for testing)\n * await adapter.clear();\n * ```\n */\n async clear(): Promise<void> {\n this._workingMemory.clear();\n this._messages.clear();\n this._chats.clear();\n }\n\n /* ---------------------------------------------------------------------------\n * WORKING MEMORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets working memory for a scope and identifier.\n * \n * @param params - The scope and identifier\n * @returns The working memory or null if not found\n * \n * @example\n * ```typescript\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * if (memory) {\n * console.log('Content:', memory.content);\n * console.log('Updated:', memory.updatedAt);\n * }\n * ```\n */\n async getWorkingMemory(\n params: IgniterAgentWorkingMemoryParams\n ): Promise<IgniterAgentWorkingMemory | null> {\n const key = this._key('memory', params.scope, params.identifier);\n \n return this._workingMemory.get(key) ?? null;\n }\n\n /**\n * Updates working memory for a scope and identifier.\n * \n * @param params - The scope, identifier, and new content\n * \n * @example\n * ```typescript\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: `\n * ## User Preferences\n * - Prefers TypeScript\n * - Uses VS Code\n * `\n * });\n * ```\n */\n async updateWorkingMemory(\n params: IgniterAgentUpdateWorkingMemoryParams\n ): Promise<void> {\n const key = this._key('memory', params.scope, params.identifier);\n \n this._workingMemory.set(key, {\n content: params.content,\n updatedAt: new Date(),\n });\n }\n\n /* ---------------------------------------------------------------------------\n * MESSAGE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves a message to the conversation history.\n * \n * @param message - The message to save\n * \n * @example\n * ```typescript\n * await adapter.saveMessage({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * role: 'user',\n * content: 'How do I use TypeScript?',\n * timestamp: new Date()\n * });\n * ```\n */\n async saveMessage(message: IgniterAgentConversationMessage): Promise<void> {\n const key = this._key('messages', message.chatId);\n \n // Get or create messages array\n let messages = this._messages.get(key);\n if (!messages) {\n messages = [];\n this._messages.set(key, messages);\n }\n \n // Add message\n messages.push(message);\n \n // Enforce max messages limit\n if (messages.length > this.options.maxMessages) {\n messages.splice(0, messages.length - this.options.maxMessages);\n }\n }\n\n /**\n * Gets messages from the conversation history.\n * \n * @typeParam T - The message type to return\n * @param params - Query parameters\n * @returns Array of messages\n * \n * @example\n * ```typescript\n * const messages = await adapter.getMessages({\n * chatId: 'chat_123',\n * limit: 50\n * });\n * \n * for (const msg of messages) {\n * console.log(`[${msg.role}]: ${msg.content}`);\n * }\n * ```\n */\n async getMessages<T = unknown>(\n params: IgniterAgentGetMessagesParams\n ): Promise<T[]> {\n const key = this._key('messages', params.chatId);\n \n let messages = this._messages.get(key) ?? [];\n \n // Filter by userId if provided\n if (params.userId) {\n messages = messages.filter(m => m.userId === params.userId);\n }\n \n // Apply limit\n if (params.limit && params.limit > 0) {\n messages = messages.slice(-params.limit);\n }\n \n // Convert to expected format (extract content)\n return messages.map(m => ({\n id: `${m.chatId}-${m.timestamp.getTime()}`,\n role: m.role,\n content: m.content,\n createdAt: m.timestamp,\n })) as T[];\n }\n\n /* ---------------------------------------------------------------------------\n * CHAT SESSION METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves or updates a chat session.\n * \n * @param chat - The chat session to save\n * \n * @example\n * ```typescript\n * await adapter.saveChat({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * title: 'TypeScript Help',\n * createdAt: new Date(),\n * updatedAt: new Date(),\n * messageCount: 0\n * });\n * ```\n */\n async saveChat(chat: IgniterAgentChatSession): Promise<void> {\n const key = this._key('chats', chat.chatId);\n \n this._chats.set(key, chat);\n \n // Enforce max chats limit\n if (this._chats.size > this.options.maxChats) {\n // Remove oldest chats\n const entries = Array.from(this._chats.entries())\n .sort((a, b) => a[1].updatedAt.getTime() - b[1].updatedAt.getTime());\n \n const toRemove = entries.slice(0, this._chats.size - this.options.maxChats);\n for (const [k] of toRemove) {\n this._chats.delete(k);\n }\n }\n }\n\n /**\n * Gets chat sessions matching the query parameters.\n * \n * @param params - Query parameters\n * @returns Array of chat sessions\n * \n * @example\n * ```typescript\n * const chats = await adapter.getChats({\n * userId: 'user_456',\n * search: 'typescript',\n * limit: 10\n * });\n * \n * for (const chat of chats) {\n * console.log(`${chat.title} (${chat.messageCount} messages)`);\n * }\n * ```\n */\n async getChats(\n params: IgniterAgentGetChatsParams\n ): Promise<IgniterAgentChatSession[]> { \n let chats = Array.from(this._chats.values());\n \n // Filter by userId\n if (params.userId) {\n chats = chats.filter(c => c.userId === params.userId);\n }\n \n // Filter by search term (title)\n if (params.search) {\n const searchLower = params.search.toLowerCase();\n chats = chats.filter(c => \n c.title?.toLowerCase().includes(searchLower)\n );\n }\n \n // Sort by most recent\n chats.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n \n // Apply limit\n if (params.limit && params.limit > 0) {\n chats = chats.slice(0, params.limit);\n }\n \n return chats;\n }\n\n /**\n * Gets a specific chat session by ID.\n * \n * @param chatId - The chat ID\n * @returns The chat session or null if not found\n * \n * @example\n * ```typescript\n * const chat = await adapter.getChat('chat_123');\n * \n * if (chat) {\n * console.log('Title:', chat.title);\n * console.log('Messages:', chat.messageCount);\n * }\n * ```\n */\n async getChat(chatId: string): Promise<IgniterAgentChatSession | null> {\n const key = this._key('chats', chatId);\n \n return this._chats.get(key) ?? null;\n }\n\n /**\n * Updates the title of a chat session.\n * \n * @param chatId - The chat ID\n * @param title - The new title\n * \n * @example\n * ```typescript\n * await adapter.updateChatTitle('chat_123', 'New Title');\n * ```\n */\n async updateChatTitle(chatId: string, title: string): Promise<void> {\n const key = this._key('chats', chatId);\n \n const chat = this._chats.get(key);\n if (chat) {\n chat.title = title;\n chat.updatedAt = new Date();\n }\n }\n\n /**\n * Deletes a chat session and its messages.\n * \n * @param chatId - The chat ID to delete\n * \n * @example\n * ```typescript\n * await adapter.deleteChat('chat_123');\n * ```\n */\n async deleteChat(chatId: string): Promise<void> {\n const chatKey = this._key('chats', chatId);\n const messagesKey = this._key('messages', chatId);\n \n this._chats.delete(chatKey);\n this._messages.delete(messagesKey);\n }\n\n /* ---------------------------------------------------------------------------\n * STATS METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets storage statistics.\n * \n * @returns Current storage stats\n * \n * @example\n * ```typescript\n * const stats = await adapter.getStats();\n * console.log(`Storing ${stats.messageCount} messages`);\n * console.log(`Across ${stats.chatCount} chats`);\n * ```\n */\n async getStats(): Promise<IgniterAgentAdapterStats> {\n let messageCount = 0;\n for (const messages of this._messages.values()) {\n messageCount += messages.length;\n }\n\n return {\n workingMemoryCount: this._workingMemory.size,\n messageCount,\n chatCount: this._chats.size,\n timestamp: new Date(),\n };\n }\n}","/**\n * @fileoverview JSON file-based adapter for IgniterAgent memory storage.\n * This module provides a simple file-based implementation of the memory provider.\n * \n * @description\n * The IgniterAgentJSONFileAdapter stores all data in JSON files on the local filesystem,\n * making it ideal for:\n * - Development and testing\n * - Single-machine deployments\n * - Offline-first applications\n * - Simple persistence without external databases\n * \n * **Directory Structure:**\n * ```\n * {dataDir}/\n * ├── working-memory.json # All working memory entries\n * ├── chats.json # All chat sessions\n * └── messages/\n * ├── {chatId}.json # Messages for specific chat\n * └── ...\n * ```\n * \n * @example\n * ```typescript\n * import { IgniterAgentJSONFileAdapter } from '@igniter-js/agents/adapters';\n * \n * // Create adapter\n * const adapter = new IgniterAgentJSONFileAdapter({\n * dataDir: './data/agent-memory',\n * namespace: 'myapp',\n * autoSync: true\n * });\n * \n * // Use with memory config\n * const memoryConfig: IgniterAgentMemoryConfig = {\n * provider: adapter,\n * working: { enabled: true, scope: 'chat' },\n * history: { enabled: true, limit: 100 }\n * };\n * ```\n * \n * @module adapters/json-file\n * @packageDocumentation\n */\n\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport type {\n IgniterAgentMemoryProvider,\n IgniterAgentWorkingMemory,\n IgniterAgentConversationMessage,\n IgniterAgentChatSession,\n IgniterAgentWorkingMemoryParams,\n IgniterAgentUpdateWorkingMemoryParams,\n IgniterAgentGetMessagesParams,\n IgniterAgentGetChatsParams,\n IgniterAgentMemoryAdapter,\n IgniterAgentAdapterStats,\n} from \"../types\";\n\n/* =============================================================================\n * TYPES\n * ============================================================================= */\n\n/**\n * Options for IgniterAgentJSONFileAdapter.\n * \n * @public\n */\nexport interface IgniterAgentJSONFileAdapterOptions {\n /**\n * Directory path where JSON files will be stored.\n * Will be created if it doesn't exist.\n * \n * @default './igniter-agent-memory'\n */\n dataDir?: string;\n\n /**\n * Namespace prefix for keys in the JSON files.\n * Allows storing data for multiple apps/instances in the same directory.\n * \n * @default 'igniter'\n */\n namespace?: string;\n\n /**\n * Whether to automatically sync changes to disk.\n * If false, call `sync()` manually after modifications.\n * \n * @default true\n */\n autoSync?: boolean;\n\n /**\n * Whether to enable debug logging.\n * \n * @default false\n */\n debug?: boolean;\n\n /**\n * Maximum number of messages to store per chat.\n * Older messages are removed when limit is exceeded.\n * \n * @default 1000\n */\n maxMessages?: number;\n\n /**\n * Maximum number of chat sessions to store.\n * Older chats are removed when limit is exceeded.\n * \n * @default 100\n */\n maxChats?: number;\n}\n\n/* =============================================================================\n * JSON FILE ADAPTER CLASS\n * ============================================================================= */\n\n/**\n * File-based (JSON) implementation of the IgniterAgent memory provider.\n * \n * @description\n * Stores all memory data in JSON files on the local filesystem. Provides a complete\n * implementation of the memory provider interface for development and testing purposes.\n * \n * **Features:**\n * - Full implementation of all memory provider methods\n * - Persistent storage across process restarts\n * - Namespace support for multi-tenant applications\n * - Optional automatic file synchronization\n * - Message/chat limits to control storage\n * - Debug logging\n * \n * **Limitations:**\n * - Not suitable for concurrent access from multiple processes\n * - Performance degrades with large numbers of messages/chats\n * - Not suitable for high-frequency writes\n * \n * **File Format:**\n * All data is stored in JSON format with ISO 8601 timestamps.\n * \n * @example\n * ```typescript\n * import { IgniterAgentJSONFileAdapter } from '@igniter-js/agents/adapters';\n * \n * const adapter = new IgniterAgentJSONFileAdapter({\n * dataDir: './memory',\n * namespace: 'myapp',\n * debug: true\n * });\n * \n * // Connect to initialize directories\n * await adapter.connect();\n * \n * // Store working memory\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: 'User prefers TypeScript'\n * });\n * \n * // Retrieve working memory\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * console.log(memory?.content); // 'User prefers TypeScript'\n * ```\n * \n * @public\n */\nexport class IgniterAgentJSONFileAdapter\n implements IgniterAgentMemoryAdapter<IgniterAgentJSONFileAdapterOptions>\n{\n /**\n * The adapter configuration options.\n */\n public readonly options: Required<IgniterAgentJSONFileAdapterOptions>;\n\n /**\n * Whether the adapter is currently connected and ready to use.\n * @internal\n */\n private _connected: boolean = false;\n\n /**\n * In-memory cache of working memory entries.\n * @internal\n */\n private _workingMemoryCache: Map<string, IgniterAgentWorkingMemory> =\n new Map();\n\n /**\n * In-memory cache of messages.\n * @internal\n */\n private _messagesCache: Map<string, IgniterAgentConversationMessage[]> =\n new Map();\n\n /**\n * In-memory cache of chat sessions.\n * @internal\n */\n private _chatsCache: Map<string, IgniterAgentChatSession> = new Map();\n\n /**\n * Creates a new IgniterAgentJSONFileAdapter.\n * \n * @param options - Adapter configuration\n * \n * @example\n * ```typescript\n * const adapter = new IgniterAgentJSONFileAdapter({\n * dataDir: './memory',\n * namespace: 'myapp'\n * });\n * ```\n */\n constructor(options: IgniterAgentJSONFileAdapterOptions = {}) {\n this.options = {\n dataDir: options.dataDir ?? \"./igniter-agent-memory\",\n namespace: options.namespace ?? \"igniter\",\n autoSync: options.autoSync ?? true,\n debug: options.debug ?? false,\n maxMessages: options.maxMessages ?? 1000,\n maxChats: options.maxChats ?? 100,\n };\n }\n\n /**\n * Factory method to create a new adapter instance.\n * @param options - Adapter configuration\n * @returns A new IgniterAgentJSONFileAdapter instance\n *\n * @example\n * ```typescript\n * const adapter = IgniterAgentJSONFileAdapter.create({\n * dataDir: './data',\n * });\n * ```\n */\n static create(\n options?: IgniterAgentJSONFileAdapterOptions\n ): IgniterAgentJSONFileAdapter {\n return new IgniterAgentJSONFileAdapter(options);\n }\n\n /* ---------------------------------------------------------------------------\n * PRIVATE HELPER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Logs debug messages if debug mode is enabled.\n * @internal\n */\n private _log(message: string, data?: unknown): void {\n if (this.options.debug) {\n console.log(`[IgniterAgentJSONFileAdapter] ${message}`, data ?? \"\");\n }\n }\n\n /**\n * Gets the path for the working memory JSON file.\n * @internal\n */\n private _getWorkingMemoryPath(): string {\n return join(this.options.dataDir, \"working-memory.json\");\n }\n\n /**\n * Gets the path for the chats JSON file.\n * @internal\n */\n private _getChatsPath(): string {\n return join(this.options.dataDir, \"chats.json\");\n }\n\n /**\n * Gets the directory for message files.\n * @internal\n */\n private _getMessagesDir(): string {\n return join(this.options.dataDir, \"messages\");\n }\n\n /**\n * Gets the path for a specific chat's messages JSON file.\n * @internal\n */\n private _getMessagesPath(chatId: string): string {\n return join(this._getMessagesDir(), `${chatId}.json`);\n }\n\n /**\n * Generates a cache key with namespace prefix.\n * @internal\n */\n private _key(...parts: string[]): string {\n return [this.options.namespace, ...parts].join(\":\");\n }\n\n /**\n * Loads working memory from disk.\n * @internal\n */\n private async _loadWorkingMemory(): Promise<void> {\n try {\n const path = this._getWorkingMemoryPath();\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n\n this._workingMemoryCache.clear();\n for (const [key, value] of Object.entries(data)) {\n this._workingMemoryCache.set(key, {\n content: (value as any).content,\n updatedAt: new Date((value as any).updatedAt),\n });\n }\n this._log(\"Loaded working memory\", {\n entries: this._workingMemoryCache.size,\n });\n } catch (err) {\n // File doesn't exist yet, that's ok\n this._log(\"Working memory file not found, starting fresh\");\n }\n }\n\n /**\n * Loads chats from disk.\n * @internal\n */\n private async _loadChats(): Promise<void> {\n try {\n const path = this._getChatsPath();\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n\n this._chatsCache.clear();\n for (const [key, value] of Object.entries(data)) {\n const chat = value as any;\n this._chatsCache.set(key, {\n chatId: chat.chatId,\n userId: chat.userId,\n title: chat.title,\n createdAt: new Date(chat.createdAt),\n updatedAt: new Date(chat.updatedAt),\n messageCount: chat.messageCount,\n });\n }\n this._log(\"Loaded chats\", { entries: this._chatsCache.size });\n } catch (err) {\n this._log(\"Chats file not found, starting fresh\");\n }\n }\n\n /**\n * Loads a specific chat's messages from disk.\n * @internal\n */\n private async _loadMessages(chatId: string): Promise<void> {\n try {\n const path = this._getMessagesPath(chatId);\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n\n const key = this._key(\"messages\", chatId);\n const messages: IgniterAgentConversationMessage[] = data.map(\n (msg: any) => ({\n chatId: msg.chatId,\n userId: msg.userId,\n role: msg.role,\n content: msg.content,\n timestamp: new Date(msg.timestamp),\n })\n );\n\n this._messagesCache.set(key, messages);\n this._log(\"Loaded messages\", { chatId, count: messages.length });\n } catch (err) {\n this._log(\"Messages file not found for chat\", { chatId });\n }\n }\n\n /**\n * Saves working memory to disk.\n * @internal\n */\n private async _saveWorkingMemory(): Promise<void> {\n const path = this._getWorkingMemoryPath();\n const data: Record<string, any> = {};\n\n for (const [key, value] of this._workingMemoryCache.entries()) {\n data[key] = {\n content: value.content,\n updatedAt: value.updatedAt.toISOString(),\n };\n }\n\n await writeFile(path, JSON.stringify(data, null, 2));\n this._log(\"Saved working memory\");\n }\n\n /**\n * Saves chats to disk.\n * @internal\n */\n private async _saveChats(): Promise<void> {\n const path = this._getChatsPath();\n const data: Record<string, any> = {};\n\n for (const [key, value] of this._chatsCache.entries()) {\n data[key] = {\n chatId: value.chatId,\n userId: value.userId,\n title: value.title,\n createdAt: value.createdAt.toISOString(),\n updatedAt: value.updatedAt.toISOString(),\n messageCount: value.messageCount,\n };\n }\n\n await writeFile(path, JSON.stringify(data, null, 2));\n this._log(\"Saved chats\");\n }\n\n /**\n * Saves messages for a specific chat to disk.\n * @internal\n */\n private async _saveMessages(chatId: string): Promise<void> {\n const key = this._key(\"messages\", chatId);\n const messages = this._messagesCache.get(key) ?? [];\n const path = this._getMessagesPath(chatId);\n\n const data = messages.map((msg) => ({\n chatId: msg.chatId,\n userId: msg.userId,\n role: msg.role,\n content: msg.content,\n timestamp: msg.timestamp.toISOString(),\n }));\n\n await writeFile(path, JSON.stringify(data, null, 2));\n this._log(\"Saved messages\", { chatId, count: messages.length });\n }\n\n /* ---------------------------------------------------------------------------\n * LIFECYCLE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Connects to the storage backend and loads data from disk.\n * \n * @description\n * Creates necessary directories and loads all data into memory cache.\n * Must be called before using the adapter.\n * \n * @throws {Error} If directory creation fails\n * \n * @example\n * ```typescript\n * const adapter = new IgniterAgentJSONFileAdapter();\n * await adapter.connect();\n * ```\n */\n async connect(): Promise<void> {\n try {\n await mkdir(this.options.dataDir, { recursive: true });\n await mkdir(this._getMessagesDir(), { recursive: true });\n\n await this._loadWorkingMemory();\n await this._loadChats();\n\n this._connected = true;\n this._log(\"Connected successfully\", {\n dataDir: this.options.dataDir,\n });\n } catch (err) {\n this._log(\"Connection failed\", err);\n throw err;\n }\n }\n\n /**\n * Disconnects from the storage backend.\n * \n * @description\n * Syncs any pending changes to disk before disconnecting.\n * \n * @example\n * ```typescript\n * await adapter.disconnect();\n * ```\n */\n async disconnect(): Promise<void> {\n if (this._connected) {\n await this.sync();\n this._connected = false;\n this._log(\"Disconnected\");\n }\n }\n\n /**\n * Checks if the adapter is connected and ready to use.\n * \n * @returns True if connected, false otherwise\n */\n isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Manually syncs all in-memory data to disk.\n * \n * @description\n * Called automatically if autoSync is enabled. Can be called manually\n * to ensure data is persisted to disk.\n * \n * @example\n * ```typescript\n * await adapter.updateWorkingMemory({ ... });\n * await adapter.sync(); // Ensure written to disk\n * ```\n */\n async sync(): Promise<void> {\n try {\n await this._saveWorkingMemory();\n await this._saveChats();\n\n // Save all loaded message files\n for (const chatId of this._messagesCache.keys()) {\n const idParts = chatId.split(\":\");\n if (idParts.length > 0) {\n const actualChatId = idParts[idParts.length - 1];\n await this._saveMessages(actualChatId);\n }\n }\n\n this._log(\"Synced all data to disk\");\n } catch (err) {\n this._log(\"Sync failed\", err);\n throw err;\n }\n }\n\n /**\n * Clears all stored data from disk and memory.\n * \n * @description\n * Removes all working memory, messages, and chat sessions.\n * Use with caution.\n * \n * @example\n * ```typescript\n * await adapter.clear();\n * ```\n */\n async clear(): Promise<void> {\n this._workingMemoryCache.clear();\n this._messagesCache.clear();\n this._chatsCache.clear();\n\n if (this.options.autoSync) {\n await this.sync();\n }\n\n this._log(\"Cleared all data\");\n }\n\n /* ---------------------------------------------------------------------------\n * WORKING MEMORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets working memory for a scope and identifier.\n * \n * @param params - The scope and identifier\n * @returns The working memory or null if not found\n * \n * @example\n * ```typescript\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * if (memory) {\n * console.log('Content:', memory.content);\n * }\n * ```\n */\n async getWorkingMemory(\n params: IgniterAgentWorkingMemoryParams\n ): Promise<IgniterAgentWorkingMemory | null> {\n const key = this._key(\"memory\", params.scope, params.identifier);\n return this._workingMemoryCache.get(key) ?? null;\n }\n\n /**\n * Updates working memory for a scope and identifier.\n * \n * @param params - The scope, identifier, and new content\n * \n * @example\n * ```typescript\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: 'User prefers TypeScript'\n * });\n * ```\n */\n async updateWorkingMemory(\n params: IgniterAgentUpdateWorkingMemoryParams\n ): Promise<void> {\n const key = this._key(\"memory\", params.scope, params.identifier);\n\n this._workingMemoryCache.set(key, {\n content: params.content,\n updatedAt: new Date(),\n });\n\n if (this.options.autoSync) {\n await this._saveWorkingMemory();\n }\n }\n\n /* ---------------------------------------------------------------------------\n * MESSAGE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves a message to the conversation history.\n * \n * @param message - The message to save\n * \n * @example\n * ```typescript\n * await adapter.saveMessage({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * role: 'user',\n * content: 'How do I use TypeScript?',\n * timestamp: new Date()\n * });\n * ```\n */\n async saveMessage(message: IgniterAgentConversationMessage): Promise<void> {\n const key = this._key(\"messages\", message.chatId);\n\n let messages = this._messagesCache.get(key);\n if (!messages) {\n messages = [];\n this._messagesCache.set(key, messages);\n }\n\n messages.push(message);\n\n // Enforce max messages limit\n if (messages.length > this.options.maxMessages) {\n messages.splice(0, messages.length - this.options.maxMessages);\n }\n\n if (this.options.autoSync) {\n await this._saveMessages(message.chatId);\n }\n }\n\n /**\n * Gets messages from the conversation history.\n * \n * @typeParam T - The message type to return\n * @param params - Query parameters\n * @returns Array of messages\n * \n * @example\n * ```typescript\n * const messages = await adapter.getMessages({\n * chatId: 'chat_123',\n * limit: 50\n * });\n * \n * for (const msg of messages) {\n * console.log(`[${msg.role}]: ${msg.content}`);\n * }\n * ```\n */\n async getMessages<T = unknown>(\n params: IgniterAgentGetMessagesParams\n ): Promise<T[]> {\n const key = this._key(\"messages\", params.chatId);\n\n // Load messages if not in cache\n if (!this._messagesCache.has(key)) {\n await this._loadMessages(params.chatId);\n }\n\n let messages = this._messagesCache.get(key) ?? [];\n\n // Filter by userId if provided\n if (params.userId) {\n messages = messages.filter((m) => m.userId === params.userId);\n }\n\n // Apply limit\n if (params.limit && params.limit > 0) {\n messages = messages.slice(-params.limit);\n }\n\n // Convert to expected format\n return messages.map((m) => ({\n id: `${m.chatId}-${m.timestamp.getTime()}`,\n role: m.role,\n content: m.content,\n createdAt: m.timestamp,\n })) as T[];\n }\n\n /* ---------------------------------------------------------------------------\n * CHAT SESSION METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves or updates a chat session.\n * \n * @param chat - The chat session to save\n * \n * @example\n * ```typescript\n * await adapter.saveChat({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * title: 'TypeScript Help',\n * createdAt: new Date(),\n * updatedAt: new Date(),\n * messageCount: 0\n * });\n * ```\n */\n async saveChat(chat: IgniterAgentChatSession): Promise<void> {\n const key = this._key(\"chats\", chat.chatId);\n\n this._chatsCache.set(key, chat);\n\n // Enforce max chats limit\n if (this._chatsCache.size > this.options.maxChats) {\n const entries = Array.from(this._chatsCache.entries())\n .sort(\n (a, b) =>\n a[1].updatedAt.getTime() - b[1].updatedAt.getTime()\n );\n\n const toRemove = entries.slice(\n 0,\n this._chatsCache.size - this.options.maxChats\n );\n for (const [k] of toRemove) {\n this._chatsCache.delete(k);\n }\n }\n\n if (this.options.autoSync) {\n await this._saveChats();\n }\n }\n\n /**\n * Gets chat sessions matching the query parameters.\n * \n * @param params - Query parameters\n * @returns Array of chat sessions\n * \n * @example\n * ```typescript\n * const chats = await adapter.getChats({\n * userId: 'user_456',\n * search: 'typescript',\n * limit: 10\n * });\n * \n * for (const chat of chats) {\n * console.log(`${chat.title} (${chat.messageCount} messages)`);\n * }\n * ```\n */\n async getChats(\n params: IgniterAgentGetChatsParams\n ): Promise<IgniterAgentChatSession[]> {\n let chats = Array.from(this._chatsCache.values());\n\n // Filter by userId\n if (params.userId) {\n chats = chats.filter((c) => c.userId === params.userId);\n }\n\n // Filter by search term (title)\n if (params.search) {\n const searchLower = params.search.toLowerCase();\n chats = chats.filter((c) =>\n c.title?.toLowerCase().includes(searchLower)\n );\n }\n\n // Sort by most recent\n chats.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n // Apply limit\n if (params.limit && params.limit > 0) {\n chats = chats.slice(0, params.limit);\n }\n\n return chats;\n }\n\n /**\n * Gets a specific chat session by ID.\n * \n * @param chatId - The chat ID\n * @returns The chat session or null if not found\n * \n * @example\n * ```typescript\n * const chat = await adapter.getChat('chat_123');\n * \n * if (chat) {\n * console.log('Title:', chat.title);\n * }\n * ```\n */\n async getChat(chatId: string): Promise<IgniterAgentChatSession | null> {\n const key = this._key(\"chats\", chatId);\n return this._chatsCache.get(key) ?? null;\n }\n\n /**\n * Updates the title of a chat session.\n * \n * @param chatId - The chat ID\n * @param title - The new title\n * \n * @example\n * ```typescript\n * await adapter.updateChatTitle('chat_123', 'New Title');\n * ```\n */\n async updateChatTitle(chatId: string, title: string): Promise<void> {\n const key = this._key(\"chats\", chatId);\n\n const chat = this._chatsCache.get(key);\n if (chat) {\n chat.title = title;\n chat.updatedAt = new Date();\n\n if (this.options.autoSync) {\n await this._saveChats();\n }\n }\n }\n\n /**\n * Deletes a chat session and its messages.\n * \n * @param chatId - The chat ID to delete\n * \n * @example\n * ```typescript\n * await adapter.deleteChat('chat_123');\n * ```\n */\n async deleteChat(chatId: string): Promise<void> {\n const chatKey = this._key(\"chats\", chatId);\n const messagesKey = this._key(\"messages\", chatId);\n\n this._chatsCache.delete(chatKey);\n this._messagesCache.delete(messagesKey);\n\n if (this.options.autoSync) {\n await this._saveChats();\n // Optionally delete the messages file\n try {\n const path = this._getMessagesPath(chatId);\n await readFile(path); // Check if exists\n this._log(\"Messages file for deleted chat still exists\");\n } catch {\n // File doesn't exist, that's fine\n }\n }\n }\n\n /* ---------------------------------------------------------------------------\n * STATS METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets storage statistics.\n * \n * @returns Current storage stats\n * \n * @example\n * ```typescript\n * const stats = await adapter.getStats();\n * console.log(`Storing ${stats.messageCount} messages`);\n * console.log(`Across ${stats.chatCount} chats`);\n * ```\n */\n async getStats(): Promise<IgniterAgentAdapterStats> {\n let messageCount = 0;\n for (const messages of this._messagesCache.values()) {\n messageCount += messages.length;\n }\n\n return {\n workingMemoryCount: this._workingMemoryCache.size,\n messageCount,\n chatCount: this._chatsCache.size,\n timestamp: new Date(),\n };\n }\n}\n","/**\n * String utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentStringUtils {\n /**\n * Generates a unique identifier.\n */\n static generateId(prefix?: string): string {\n const random = Math.random().toString(36).substring(2, 12);\n return prefix ? `${prefix}_${random}` : random;\n }\n\n /**\n * Truncates a string to a maximum length.\n */\n static truncate(str: string, maxLength: number, suffix = \"...\"): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n }\n\n /**\n * Converts a string to snake_case.\n */\n static toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .replace(/^_/, \"\");\n }\n\n /**\n * Converts a string to camelCase.\n */\n static toCamelCase(str: string): string {\n return str\n .replace(/[-_](.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^(.)/, (char: string) => char.toLowerCase());\n }\n}\n","/**\n * Object utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentObjectUtils {\n /**\n * Deep merges two objects.\n */\n static deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>,\n ): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === \"object\" &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === \"object\" &&\n !Array.isArray(targetValue)\n ) {\n (result as Record<string, unknown>)[key] = IgniterAgentObjectUtils.deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n } else {\n (result as Record<string, unknown>)[key] = sourceValue;\n }\n }\n\n return result;\n }\n\n /**\n * Picks specified keys from an object.\n */\n static pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[],\n ): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n }\n\n /**\n * Omits specified keys from an object.\n */\n static omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[],\n ): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n }\n}\n","/**\n * Async utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentAsyncUtils {\n /**\n * Delays execution for a specified duration.\n */\n static delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Retries an async function with exponential backoff.\n */\n static async retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n baseDelay?: number;\n maxDelay?: number;\n onRetry?: (attempt: number, error: Error) => void;\n } = {},\n ): Promise<T> {\n const {\n maxAttempts = 3,\n baseDelay = 1000,\n maxDelay = 30000,\n onRetry,\n } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) {\n throw lastError;\n }\n\n onRetry?.(attempt, lastError);\n\n const delayMs = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n await IgniterAgentAsyncUtils.delay(delayMs);\n }\n }\n\n throw lastError;\n }\n}\n","/**\n * Validation utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentValidationUtils {\n /**\n * Checks if a value is defined (not null or undefined).\n */\n static isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n }\n\n /**\n * Checks if a value is a non-empty string.\n */\n static isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n }\n\n /**\n * Checks if a value is a plain object.\n */\n static isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/agent.error.ts","../src/core/manager.ts","../src/telemetry/index.ts","../src/core/memory.ts","../src/core/agent.ts","../src/builders/main.builder.ts","../src/builders/prompt.builder.ts","../src/builders/agent.builder.ts","../src/builders/toolset.builder.ts","../src/builders/tool.builder.ts","../src/builders/mcp.builder.ts","../src/adapters/memory.adapter.ts","../src/adapters/json-file.adapter.ts","../src/utils/strings.ts","../src/utils/objects.ts","../src/utils/async.ts","../src/utils/validation.ts"],"names":["IgniterAgentErrorCode","tool"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @fileoverview Custom error classes for the IgniterAgent library.\n * This module provides a hierarchy of error types for precise error handling.\n *\n * @description\n * The error system in IgniterAgent follows these principles:\n * - All errors extend IgniterError from @igniter-js/core for consistency\n * - Errors include rich context for debugging\n * - Error codes enable programmatic error handling\n * - Stack traces are preserved for debugging\n *\n * @example\n * ```typescript\n * import {\n * IgniterAgentError,\n * IgniterAgentMCPError,\n * IgniterAgentToolError,\n * isIgniterAgentError\n * } from '@igniter-js/agents';\n *\n * try {\n * await agent.generate({ messages: [] });\n * } catch (error) {\n * if (isIgniterAgentError(error)) {\n * console.error(`[${error.code}] ${error.message}`);\n * }\n * }\n * ```\n *\n * @module errors\n * @packageDocumentation\n */\n\nimport { IgniterError, type IgniterLogger } from \"@igniter-js/core\";\n\n/* =============================================================================\n * ERROR CODES\n * ============================================================================= */\n\n/**\n * Error codes for categorizing IgniterAgent errors.\n *\n * @description\n * Each error code represents a specific type of failure.\n * Use these codes for programmatic error handling.\n *\n * @example\n * ```typescript\n * if (error.code === IgniterAgentErrorCode.MCP_CONNECTION_FAILED) {\n * // Handle MCP connection failure\n * await retryMCPConnection();\n * }\n * ```\n *\n * @public\n */\nexport enum IgniterAgentErrorCode {\n // General errors (1xx)\n /** Generic/unknown error */\n UNKNOWN = \"IGNITER_AGENT_UNKNOWN_ERROR\",\n /** Invalid configuration provided */\n INVALID_CONFIG = \"IGNITER_AGENT_INVALID_CONFIG\",\n /** Required value is missing */\n MISSING_REQUIRED = \"IGNITER_AGENT_MISSING_REQUIRED\",\n\n // Agent errors (2xx)\n /** Agent not initialized */\n AGENT_NOT_INITIALIZED = \"IGNITER_AGENT_NOT_INITIALIZED\",\n /** Model not configured */\n AGENT_MODEL_MISSING = \"IGNITER_AGENT_MODEL_MISSING\",\n /** Agent build failed */\n AGENT_BUILD_FAILED = \"IGNITER_AGENT_BUILD_FAILED\",\n\n // MCP errors (3xx)\n /** MCP connection failed */\n MCP_CONNECTION_FAILED = \"IGNITER_AGENT_MCP_CONNECTION_FAILED\",\n /** MCP client not found */\n MCP_CLIENT_NOT_FOUND = \"IGNITER_AGENT_MCP_CLIENT_NOT_FOUND\",\n /** MCP tool execution failed */\n MCP_TOOL_ERROR = \"IGNITER_AGENT_MCP_TOOL_ERROR\",\n /** Invalid MCP configuration */\n MCP_INVALID_CONFIG = \"IGNITER_AGENT_MCP_INVALID_CONFIG\",\n\n // Tool errors (4xx)\n /** Tool execution failed */\n TOOL_EXECUTION_FAILED = \"IGNITER_AGENT_TOOL_EXECUTION_FAILED\",\n /** Tool not found */\n TOOL_NOT_FOUND = \"IGNITER_AGENT_TOOL_NOT_FOUND\",\n /** Tool validation failed */\n TOOL_VALIDATION_FAILED = \"IGNITER_AGENT_TOOL_VALIDATION_FAILED\",\n /** Invalid agent context schema */\n AGENT_CONTEXT_SCHEMA_INVALID = \"IGNITER_AGENT_CONTEXT_SCHEMA_INVALID\",\n\n // Memory errors (5xx)\n /** Memory provider error */\n MEMORY_PROVIDER_ERROR = \"IGNITER_AGENT_MEMORY_PROVIDER_ERROR\",\n /** Memory not found */\n MEMORY_NOT_FOUND = \"IGNITER_AGENT_MEMORY_NOT_FOUND\",\n /** Memory update failed */\n MEMORY_UPDATE_FAILED = \"IGNITER_AGENT_MEMORY_UPDATE_FAILED\",\n\n // Adapter errors (6xx)\n /** Adapter connection failed */\n ADAPTER_CONNECTION_FAILED = \"IGNITER_AGENT_ADAPTER_CONNECTION_FAILED\",\n /** Adapter operation failed */\n ADAPTER_OPERATION_FAILED = \"IGNITER_AGENT_ADAPTER_OPERATION_FAILED\",\n /** Adapter not initialized */\n ADAPTER_NOT_INITIALIZED = \"IGNITER_AGENT_ADAPTER_NOT_INITIALIZED\",\n}\n\n/* =============================================================================\n * ERROR OPTIONS TYPES\n * ============================================================================= */\n\n/**\n * Options for creating an IgniterAgentError.\n *\n * @public\n */\nexport interface IgniterAgentErrorOptions {\n /** Human-readable error message */\n message: string;\n /** Error code for categorization */\n code: IgniterAgentErrorCode;\n /** HTTP status code (defaults to 500) */\n statusCode?: number;\n /** The component that threw the error */\n causer?: string;\n /** Additional details about the error */\n details?: unknown;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n /** Logger instance for automatic logging */\n logger?: IgniterLogger;\n /** Original error if this wraps another error */\n cause?: Error;\n}\n\n/* =============================================================================\n * BASE ERROR CLASS\n * ============================================================================= */\n\n/**\n * Base error class for all IgniterAgent errors.\n *\n * @description\n * All custom errors in the IgniterAgent library extend this class,\n * which itself extends IgniterError from @igniter-js/core.\n * It provides a consistent interface for error handling, including\n * error codes, context, and cause tracking.\n *\n * @example\n * ```typescript\n * // Throwing a base error\n * throw new IgniterAgentError({\n * message: 'Something went wrong',\n * code: IgniterAgentErrorCode.UNKNOWN,\n * causer: 'Agent',\n * metadata: { operation: 'generate' }\n * });\n *\n * // Catching and handling\n * try {\n * await agent.start();\n * } catch (error) {\n * if (error instanceof IgniterAgentError) {\n * logger.error({\n * code: error.code,\n * message: error.message,\n * details: error.details\n * });\n * }\n * }\n * ```\n *\n * @public\n */\nexport class IgniterAgentError extends IgniterError {\n /**\n * Creates a new IgniterAgentError.\n *\n * @param options - Error configuration options\n */\n constructor(options: IgniterAgentErrorOptions) {\n super({\n message: options.message,\n code: options.code,\n statusCode: options.statusCode ?? 500,\n causer: options.causer,\n details: options.details,\n metadata: options.metadata,\n logger: options.logger,\n cause: options.cause,\n });\n\n this.name = \"IgniterAgentError\";\n }\n}\n\n/* =============================================================================\n * SPECIALIZED ERROR CLASSES\n * ============================================================================= */\n\n/**\n * Error thrown when agent configuration is invalid.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentConfigError({\n * message: 'Model is required but was not provided',\n * field: 'model'\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentConfigError extends IgniterAgentError {\n /**\n * The configuration field that caused the error.\n */\n public readonly field?: string;\n\n constructor(\n options: Omit<IgniterAgentErrorOptions, \"code\"> & { field?: string },\n ) {\n super({\n ...options,\n code: IgniterAgentErrorCode.INVALID_CONFIG,\n metadata: { ...options.metadata, field: options.field },\n });\n this.name = \"IgniterAgentConfigError\";\n this.field = options.field;\n }\n}\n\n/**\n * Error thrown when an MCP operation fails.\n *\n * @description\n * Covers all MCP-related failures including connection errors,\n * tool execution errors, and configuration errors.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentMCPError({\n * message: 'Failed to connect to MCP server',\n * code: IgniterAgentErrorCode.MCP_CONNECTION_FAILED,\n * mcpName: 'filesystem'\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentMCPError extends IgniterAgentError {\n /**\n * The name of the MCP configuration that caused the error.\n */\n public readonly mcpName?: string;\n\n constructor(options: IgniterAgentErrorOptions & { mcpName?: string }) {\n super({\n ...options,\n metadata: { ...options.metadata, mcpName: options.mcpName },\n });\n this.name = \"IgniterAgentMCPError\";\n this.mcpName = options.mcpName;\n }\n}\n\n/**\n * Error thrown when a tool execution fails.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentToolError({\n * message: 'Tool execution timed out',\n * toolName: 'github_createIssue',\n * metadata: { timeout: 30000 }\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentToolError extends IgniterAgentError {\n /**\n * The name of the tool that caused the error.\n */\n public readonly toolName: string;\n\n constructor(\n options: Omit<IgniterAgentErrorOptions, \"code\"> & { toolName: string },\n ) {\n super({\n ...options,\n code: IgniterAgentErrorCode.TOOL_EXECUTION_FAILED,\n metadata: { ...options.metadata, toolName: options.toolName },\n });\n this.name = \"IgniterAgentToolError\";\n this.toolName = options.toolName;\n }\n}\n\n/**\n * Error thrown when a memory operation fails.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentMemoryError({\n * message: 'Failed to save message to history',\n * code: IgniterAgentErrorCode.MEMORY_UPDATE_FAILED,\n * metadata: { chatId: 'chat_123' }\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentMemoryError extends IgniterAgentError {\n constructor(options: IgniterAgentErrorOptions) {\n super(options);\n this.name = \"IgniterAgentMemoryError\";\n }\n}\n\n/**\n * Error thrown when an adapter operation fails.\n *\n * @example\n * ```typescript\n * throw new IgniterAgentAdapterError({\n * message: 'Redis connection lost',\n * code: IgniterAgentErrorCode.ADAPTER_CONNECTION_FAILED,\n * adapterName: 'redis'\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentAdapterError extends IgniterAgentError {\n /**\n * The name of the adapter that caused the error.\n */\n public readonly adapterName?: string;\n\n constructor(options: IgniterAgentErrorOptions & { adapterName?: string }) {\n super({\n ...options,\n metadata: { ...options.metadata, adapterName: options.adapterName },\n });\n this.name = \"IgniterAgentAdapterError\";\n this.adapterName = options.adapterName;\n }\n}\n\n/* =============================================================================\n * TYPE GUARDS\n * ============================================================================= */\n\n/**\n * Type guard to check if an error is an IgniterAgentError.\n *\n * @description\n * Use this function to safely narrow error types in catch blocks.\n *\n * @param error - The error to check\n * @returns True if the error is an IgniterAgentError\n *\n * @example\n * ```typescript\n * try {\n * await agent.generate({ messages: [] });\n * } catch (error) {\n * if (isIgniterAgentError(error)) {\n * // TypeScript knows error is IgniterAgentError\n * console.log(error.code, error.details);\n * }\n * }\n * ```\n *\n * @public\n */\nexport function isIgniterAgentError(\n error: unknown,\n): error is IgniterAgentError {\n return error instanceof IgniterAgentError;\n}\n\n/**\n * Type guard to check if an error is an MCP error.\n *\n * @param error - The error to check\n * @returns True if the error is an IgniterAgentMCPError\n *\n * @public\n */\nexport function isIgniterAgentMCPError(\n error: unknown,\n): error is IgniterAgentMCPError {\n return error instanceof IgniterAgentMCPError;\n}\n\n/**\n * Type guard to check if an error is a tool error.\n *\n * @param error - The error to check\n * @returns True if the error is an IgniterAgentToolError\n *\n * @public\n */\nexport function isIgniterAgentToolError(\n error: unknown,\n): error is IgniterAgentToolError {\n return error instanceof IgniterAgentToolError;\n}\n\n/* =============================================================================\n * HELPER FUNCTIONS\n * ============================================================================= */\n\n/**\n * Wraps an unknown error in an IgniterAgentError.\n *\n * @description\n * Useful for normalizing errors from external sources into\n * the IgniterAgent error format.\n *\n * @param error - The error to wrap\n * @param options - Additional options to add\n * @returns An IgniterAgentError wrapping the original\n *\n * @example\n * ```typescript\n * try {\n * await externalService.call();\n * } catch (error) {\n * throw wrapError(error, { causer: 'ExternalService' });\n * }\n * ```\n *\n * @public\n */\nexport function wrapError(\n error: unknown,\n options: Partial<IgniterAgentErrorOptions> = {},\n): IgniterAgentError {\n if (isIgniterAgentError(error)) {\n return error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n const cause = error instanceof Error ? error : undefined;\n\n return new IgniterAgentError({\n message,\n code: IgniterAgentErrorCode.UNKNOWN,\n ...options,\n cause,\n });\n}\n","/**\n * @fileoverview Core agent manager for lifecycle and orchestration.\n * This module provides centralized management for IgniterAgent instances.\n *\n * @description\n * The IgniterAgentManager provides utilities for:\n * - Managing multiple agent instances\n * - Coordinating agent lifecycle (start, stop)\n * - Monitoring agent health and status\n * - Routing requests to appropriate agents\n *\n * @example\n * ```typescript\n * import { IgniterAgentManager } from '@igniter-js/agents';\n *\n * // Create a manager\n * const manager = new IgniterAgentManager();\n *\n * // Register agents\n * manager.register('support', supportAgent);\n * manager.register('sales', salesAgent);\n *\n * // Start all agents\n * await manager.startAll();\n *\n * // Route to specific agent\n * const agent = manager.get('support');\n * const response = await agent.generate({ messages: [...] });\n * ```\n *\n * @module core/manager\n * @packageDocumentation\n */\n\nimport type { IgniterAgentBuiltAgent } from \"../types/builder\";\nimport type { IgniterAgentToolset } from \"../types\";\nimport { IgniterAgentError, IgniterAgentErrorCode } from \"../errors\";\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterAgentInfo, IgniterAgentManagerOptions } from \"../types/manager\";\n\n\n/* =============================================================================\n * AGENT MANAGER CLASS\n * ============================================================================= */\n\n/**\n * Manager for coordinating multiple IgniterAgent instances.\n *\n * @description\n * The IgniterAgentManager provides a centralized way to manage multiple\n * agent instances, handling their lifecycle and providing routing capabilities.\n *\n * **Key Features:**\n * - Register and manage multiple agents\n * - Batch start/stop operations\n * - Health monitoring\n * - Request routing\n *\n * @example\n * ```typescript\n * import { IgniterAgentManager, IgniterAgent } from '@igniter-js/agents';\n *\n * // Create agents\n * const supportAgent = IgniterAgent.create('support')\n * .withModel(openai('gpt-4'))\n * .build();\n *\n * const codeAgent = IgniterAgent.create('code')\n * .withModel(openai('gpt-4-turbo'))\n * .addToolset(codeToolset)\n * .build();\n *\n * // Create manager and register agents\n * const manager = new IgniterAgentManager({\n * continueOnError: true,\n * onAgentStart: (name) => console.log(`Agent ${name} started`),\n * onAgentError: (name, err) => console.error(`Agent ${name} failed:`, err)\n * });\n *\n * manager.register('support', supportAgent);\n * manager.register('code', codeAgent);\n *\n * // Start all agents\n * await manager.startAll();\n *\n * // Use specific agent\n * const agent = manager.get('code');\n * const result = await agent.generate({\n * messages: [{ role: 'user', content: 'Write a test' }]\n * });\n *\n * // Get status\n * console.log(manager.getStatus());\n * ```\n *\n * @public\n */\nexport class IgniterAgentManagerCore<\n TAgentRegistry extends Record<string, IgniterAgentBuiltAgent> = Record<string, IgniterAgentBuiltAgent>\n> {\n /**\n * Agent statuses.\n * @internal\n */\n private readonly _statuses: Map<string, IgniterAgentInfo> = new Map();\n\n /**\n * Manager options.\n * @internal\n */\n private readonly _options: IgniterAgentManagerOptions<TAgentRegistry>;\n\n /**\n * Creates a new IgniterAgentManager.\n *\n * @param options - Manager configuration options\n *\n * @example\n * ```typescript\n * const manager = new IgniterAgentManager({\n * autoStart: false,\n * continueOnError: true\n * });\n * ```\n */\n constructor(options: IgniterAgentManagerOptions<TAgentRegistry>) {\n this._options = {\n logger: options.logger,\n telemetry: options.telemetry,\n agents: options.agents ?? {},\n autoStart: options.autoStart ?? false,\n continueOnError: options.continueOnError ?? true,\n onAgentStart: options.onAgentStart ?? (() => {}),\n onAgentError: options.onAgentError ?? (() => {}),\n onToolCallStart: options.onToolCallStart ?? (() => {}),\n onToolCallEnd: options.onToolCallEnd ?? (() => {}),\n onToolCallError: options.onToolCallError ?? (() => {}),\n onMCPStart: options.onMCPStart ?? (() => {}),\n onMCPError: options.onMCPError ?? (() => {}),\n };\n\n for (const [name, agent] of Object.entries(this._options.agents)) {\n this.applyManagerContext(name, agent as IgniterAgentBuiltAgent);\n this._statuses.set(name, {\n name,\n status: \"idle\",\n registeredAt: new Date(),\n toolsetCount: Object.keys((agent as IgniterAgentBuiltAgent).getToolsets()).length,\n });\n }\n }\n\n private applyManagerContext(\n name: string,\n agent: IgniterAgentBuiltAgent,\n ): void {\n const logger = this._options.logger;\n const telemetry = this._options.telemetry;\n\n if (logger) {\n const scopedLogger = logger.child?.(\"IgniterAgent\", { agent: name }) ?? logger;\n agent.attachLogger?.(scopedLogger);\n }\n\n if (telemetry) {\n agent.attachTelemetry?.(telemetry);\n }\n\n agent.attachHooks?.({\n onToolCallStart: this._options.onToolCallStart,\n onToolCallEnd: this._options.onToolCallEnd,\n onToolCallError: this._options.onToolCallError,\n onMCPStart: this._options.onMCPStart,\n onMCPError: this._options.onMCPError,\n });\n }\n\n /**\n * Creates a new IgniterAgentManager with default options.\n * @param options - Manager configuration options\n * @returns A new IgniterAgentManager instance\n * @example\n * ```typescript\n * const manager = IgniterAgentManager.create({\n * autoStart: true\n * });\n * ```\n */\n static create(): IgniterAgentManagerCore {\n return new IgniterAgentManagerCore({\n agents: {},\n });\n }\n\n /* ---------------------------------------------------------------------------\n * REGISTRATION\n * --------------------------------------------------------------------------- */\n\n /**\n * Registers an agent with the manager.\n *\n * @description\n * Adds an agent to the manager's registry. If `autoStart` is enabled,\n * the agent will be started immediately after registration.\n *\n * @param name - Unique name for the agent\n * @param agent - The built agent instance\n * @returns This manager for chaining\n * @throws {IgniterAgentError} If an agent with the name already exists\n *\n * @example\n * ```typescript\n * manager\n * .register('support', supportAgent)\n * .register('sales', salesAgent);\n * ```\n */\n register(name: string, agent: IgniterAgentBuiltAgent): this {\n if (this._options.agents[name]) {\n throw new IgniterAgentError({\n message: `Agent '${name}' is already registered`,\n code: IgniterAgentErrorCode.INVALID_CONFIG,\n causer: \"IgniterAgentManager\",\n metadata: { operation: \"register\" },\n });\n }\n\n // @ts-expect-error -- Dynamic assignment to registry type\n this._options.agents[name] = agent;\n this.applyManagerContext(name, agent);\n\n this._statuses.set(name, {\n name,\n status: \"idle\",\n registeredAt: new Date(),\n toolsetCount: Object.keys(agent.getToolsets()).length,\n });\n\n if (this._options.autoStart) {\n this.start(name).catch((err) => {\n // @ts-expect-error -- Ignore error handling here\n this._options.onAgentError(name, err);\n });\n }\n\n return this;\n }\n\n /**\n * Unregisters an agent from the manager.\n *\n * @param name - The agent name to unregister\n * @returns True if the agent was unregistered\n *\n * @example\n * ```typescript\n * manager.unregister('old-agent');\n * ```\n */\n unregister(name: string): boolean {\n const removed = delete this._options.agents[name];\n this._statuses.delete(name);\n return removed;\n }\n\n /**\n * Checks if an agent is registered.\n *\n * @param name - The agent name to check\n * @returns True if the agent is registered\n */\n has(name: string): boolean {\n return Boolean(this._options.agents[name]);\n }\n\n /* ---------------------------------------------------------------------------\n * LIFECYCLE\n * --------------------------------------------------------------------------- */\n\n /**\n * Starts a specific agent.\n *\n * @description\n * Initializes the agent's MCP connections and prepares it for use.\n *\n * @param name - The agent name to start\n * @returns The agent's toolsets after initialization\n * @throws {IgniterAgentError} If the agent is not found\n *\n * @example\n * ```typescript\n * const toolsets = await manager.start('support');\n * console.log('Connected toolsets:', Object.keys(toolsets));\n * ```\n */\n async start(name: string): Promise<IgniterAgentBuiltAgent> {\n const agent = this._options.agents[name];\n const info = this._statuses.get(name);\n\n if (!agent || !info) {\n throw new IgniterAgentError({\n message: `Agent '${name}' is not registered`,\n code: IgniterAgentErrorCode.AGENT_NOT_INITIALIZED,\n causer: \"IgniterAgentManager\",\n metadata: { operation: \"start\" },\n });\n }\n\n try {\n info.status = \"starting\";\n this._options.logger?.debug(\"IgniterAgentManager.start started\", {\n agent: name,\n });\n await agent.start();\n\n info.status = \"running\";\n info.startedAt = new Date();\n info.toolsetCount = Object.keys(agent.getToolsets()).length;\n this._options.onAgentStart?.(name);\n this._options.logger?.success?.(\"IgniterAgentManager.start success\", {\n agent: name,\n });\n\n return agent;\n } catch (error) {\n info.status = \"error\";\n info.error = error instanceof Error ? error : new Error(String(error));\n\n this._options.onAgentError?.(name, info.error);\n this._options.logger?.error(\"IgniterAgentManager.start failed\", info.error);\n throw error;\n }\n }\n\n /**\n * Starts all registered agents.\n *\n * @description\n * Initializes all agents in parallel. If `continueOnError` is true,\n * failed agents won't prevent others from starting.\n *\n * @returns Map of agent names to their results (toolsets or errors)\n *\n * @example\n * ```typescript\n * const results = await manager.startAll();\n *\n * for (const [name, result] of results) {\n * if (result instanceof Error) {\n * console.error(`${name} failed:`, result.message);\n * } else {\n * console.log(`${name} started with ${Object.keys(result).length} toolsets`);\n * }\n * }\n * ```\n */\n async startAll(): Promise<\n Map<string, Record<string, IgniterAgentToolset> | Error>\n > {\n const results = new Map<\n string,\n Record<string, IgniterAgentToolset> | Error\n >();\n \n const promises = Object.keys(this._options.agents).map(async (name) => {\n try {\n const builtAgent = await this.start(name);\n results.set(name, builtAgent.getToolsets());\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n results.set(name, err);\n\n if (!this._options.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(promises);\n this._options.logger?.info(\"IgniterAgentManager.startAll completed\", {\n agents: this.getNames().length,\n failed: this.getFailedAgents().length,\n });\n return results;\n }\n\n /* ---------------------------------------------------------------------------\n * ACCESS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets a registered agent by name.\n *\n * @param name - The agent name\n * @returns The agent instance\n * @throws {IgniterAgentError} If the agent is not found\n *\n * @example\n * ```typescript\n * const agent = manager.get('support');\n * const response = await agent.generate({ messages: [...] });\n * ```\n */\n get<TName extends string>(name: TName): TAgentRegistry[TName] {\n const agent = this._options.agents[name];\n\n if (!agent) {\n throw new IgniterAgentError({\n message: `Agent '${name}' is not registered`,\n code: IgniterAgentErrorCode.AGENT_NOT_INITIALIZED,\n causer: \"IgniterAgentManager\",\n metadata: { operation: \"get\" },\n });\n }\n\n return agent;\n }\n\n /**\n * Gets an agent if it exists, undefined otherwise.\n *\n * @param name - The agent name\n * @returns The agent instance or undefined\n */\n tryGet<TName extends string>(name: TName): TAgentRegistry[TName] | undefined {\n return this._options.agents[name];\n }\n\n /**\n * Gets all registered agent names.\n *\n * @returns Array of agent names\n */\n getNames(): string[] {\n return Object.keys(this._options.agents);\n }\n\n /**\n * Gets the number of registered agents.\n *\n * @returns Agent count\n */\n get size(): number {\n return Object.keys(this._options.agents).length;\n }\n\n /* ---------------------------------------------------------------------------\n * STATUS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets information about a specific agent.\n *\n * @param name - The agent name\n * @returns Agent information or undefined\n */\n getInfo(name: string): IgniterAgentInfo | undefined {\n return this._statuses.get(name);\n }\n\n /**\n * Gets status information for all agents.\n *\n * @returns Array of agent information objects\n *\n * @example\n * ```typescript\n * const status = manager.getStatus();\n *\n * for (const info of status) {\n * console.log(`${info.name}: ${info.status}`);\n * }\n * ```\n */\n getStatus(): IgniterAgentInfo[] {\n return Array.from(this._statuses.values());\n }\n\n /**\n * Checks if all agents are running.\n *\n * @returns True if all agents are in 'running' status\n */\n isAllRunning(): boolean {\n for (const info of this._statuses.values()) {\n if (info.status !== \"running\") {\n return false;\n }\n }\n\n return Object.keys(this._options.agents).length > 0;\n }\n\n /**\n * Gets agents that are in error state.\n *\n * @returns Array of agent info for failed agents\n */\n getFailedAgents(): IgniterAgentInfo[] {\n return Array.from(this._statuses.values()).filter(\n (info) => info.status === \"error\",\n );\n }\n}\n","/**\n * @fileoverview Telemetry events for @igniter-js/agents\n * @module @igniter-js/agents/telemetry\n *\n * @description\n * Defines telemetry events for agent operations including lifecycle,\n * tool execution, MCP connections, memory operations, and generation.\n * Events use dot notation namespacing and follow the IgniterTelemetry pattern.\n *\n * ### Important Redaction Rules\n *\n * **NEVER** expose these fields in telemetry attributes:\n * - Message contents or prompts (may contain sensitive user data)\n * - Tool execution results (may contain PII)\n * - Memory contents (may contain sensitive context)\n * - API keys or credentials\n *\n * **SAFE** to expose:\n * - Operation names and types\n * - Agent and toolset names\n * - Success/failure states\n * - Error codes and sanitized messages\n * - Timing/duration metrics\n * - Token counts (input/output)\n * - Tool names (not arguments)\n *\n * @example\n * ```typescript\n * import { IgniterAgentTelemetryEvents } from '@igniter-js/agents/telemetry'\n * import { IgniterTelemetry } from '@igniter-js/telemetry'\n *\n * const telemetry = IgniterTelemetry.create()\n * .withService('my-api')\n * .addEvents(IgniterAgentTelemetryEvents)\n * .withRedaction({\n * denylistKeys: ['content', 'message', 'prompt', 'result'],\n * hashKeys: ['ctx.agent.userId'],\n * })\n * .build()\n *\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .withTelemetry(telemetry)\n * .build()\n * ```\n */\n\nimport { IgniterTelemetryEvents } from \"@igniter-js/telemetry\";\nimport { z } from \"zod\";\n\n/**\n * Base attributes present in all agent events.\n * These are safe to expose and provide operational context.\n */\nconst BaseAgentAttributesSchema = z.object({\n /**\n * The agent name.\n */\n \"ctx.agent.name\": z.string(),\n\n /**\n * The current scope (if scoped).\n */\n \"ctx.agent.scope\": z.string().optional(),\n\n /**\n * The scope identifier value.\n */\n \"ctx.agent.scopeId\": z.string().optional(),\n});\n\n/**\n * Attributes for lifecycle events (start, stop).\n */\nconst LifecycleAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * Number of toolsets registered.\n */\n \"ctx.lifecycle.toolsetCount\": z.number().optional(),\n\n /**\n * Number of MCP connections configured.\n */\n \"ctx.lifecycle.mcpCount\": z.number().optional(),\n\n /**\n * Whether memory adapter is configured.\n */\n \"ctx.lifecycle.hasMemory\": z.boolean().optional(),\n});\n\n/**\n * Attributes for generation events.\n */\nconst GenerationAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The model used for generation.\n */\n \"ctx.generation.model\": z.string().optional(),\n\n /**\n * Number of input messages.\n */\n \"ctx.generation.inputMessages\": z.number().optional(),\n\n /**\n * Number of input tokens (if available).\n */\n \"ctx.generation.inputTokens\": z.number().optional(),\n\n /**\n * Number of output tokens (if available).\n */\n \"ctx.generation.outputTokens\": z.number().optional(),\n\n /**\n * Total tokens used (if available).\n */\n \"ctx.generation.totalTokens\": z.number().optional(),\n\n /**\n * Generation duration in milliseconds.\n */\n \"ctx.generation.durationMs\": z.number().optional(),\n\n /**\n * Number of tool calls made during generation.\n */\n \"ctx.generation.toolCalls\": z.number().optional(),\n\n /**\n * Whether the response was streamed.\n */\n \"ctx.generation.streamed\": z.boolean().optional(),\n});\n\n/**\n * Attributes for tool execution events.\n */\nconst ToolAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The toolset name.\n */\n \"ctx.tool.toolset\": z.string(),\n\n /**\n * The tool name (within the toolset).\n */\n \"ctx.tool.name\": z.string(),\n\n /**\n * The full tool identifier (toolset_name).\n */\n \"ctx.tool.fullName\": z.string(),\n\n /**\n * Tool execution duration in milliseconds.\n */\n \"ctx.tool.durationMs\": z.number().optional(),\n});\n\n/**\n * Attributes for MCP events.\n */\nconst MCPAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The MCP configuration name.\n */\n \"ctx.mcp.name\": z.string(),\n\n /**\n * The MCP transport type (stdio, http).\n */\n \"ctx.mcp.type\": z.enum([\"stdio\", \"http\"]),\n\n /**\n * Number of tools provided by this MCP.\n */\n \"ctx.mcp.toolCount\": z.number().optional(),\n\n /**\n * Connection duration in milliseconds.\n */\n \"ctx.mcp.durationMs\": z.number().optional(),\n});\n\n/**\n * Attributes for memory events.\n */\nconst MemoryAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The memory operation type.\n */\n \"ctx.memory.operation\": z.enum([\n \"getWorkingMemory\",\n \"updateWorkingMemory\",\n \"getMessages\",\n \"saveMessage\",\n \"getChats\",\n \"saveChat\",\n \"getChat\",\n \"updateChatTitle\",\n \"deleteChat\",\n ]),\n\n /**\n * The memory scope (user, chat, global).\n */\n \"ctx.memory.scope\": z.string().optional(),\n\n /**\n * Number of items affected.\n */\n \"ctx.memory.count\": z.number().optional(),\n\n /**\n * Operation duration in milliseconds.\n */\n \"ctx.memory.durationMs\": z.number().optional(),\n});\n\n/**\n * Attributes for error events.\n */\nconst ErrorAttributesSchema = BaseAgentAttributesSchema.extend({\n /**\n * The error code.\n */\n \"ctx.error.code\": z.string(),\n\n /**\n * The sanitized error message (no sensitive data).\n */\n \"ctx.error.message\": z.string().optional(),\n\n /**\n * The operation that failed.\n */\n \"ctx.error.operation\": z.string().optional(),\n\n /**\n * The component that threw the error.\n */\n \"ctx.error.component\": z.string().optional(),\n});\n\n/**\n * Telemetry events for @igniter-js/agents.\n *\n * ### Event Naming Convention\n * All events are prefixed with 'igniter.agent' followed by:\n * - `lifecycle.*` - Agent start/stop events\n * - `generation.*` - Text generation events\n * - `tool.*` - Tool execution events\n * - `mcp.*` - MCP connection events\n * - `memory.*` - Memory operation events\n * - `error.*` - Error events\n *\n * ### Usage with IgniterAgent\n *\n * These events are automatically emitted when you use `withTelemetry()`:\n *\n * ```typescript\n * import { IgniterAgent } from '@igniter-js/agents'\n * import { IgniterTelemetry } from '@igniter-js/telemetry'\n * import { IgniterAgentTelemetryEvents } from '@igniter-js/agents/telemetry'\n *\n * const telemetry = IgniterTelemetry.create()\n * .withService('my-api')\n * .addEvents(IgniterAgentTelemetryEvents)\n * .build()\n *\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .withTelemetry(telemetry)\n * .build()\n * ```\n */\nexport const IgniterAgentTelemetryEvents = IgniterTelemetryEvents.namespace(\n \"igniter.agent\",\n)\n // ============================================================================\n // LIFECYCLE EVENTS\n // ============================================================================\n .event(\"lifecycle.start.started\", LifecycleAttributesSchema)\n .event(\"lifecycle.start.success\", LifecycleAttributesSchema)\n .event(\"lifecycle.start.error\", ErrorAttributesSchema)\n .event(\"lifecycle.stop.started\", LifecycleAttributesSchema)\n .event(\"lifecycle.stop.success\", LifecycleAttributesSchema)\n .event(\"lifecycle.stop.error\", ErrorAttributesSchema)\n // ============================================================================\n // GENERATION EVENTS\n // ============================================================================\n .event(\"generation.generate.started\", GenerationAttributesSchema)\n .event(\"generation.generate.success\", GenerationAttributesSchema)\n .event(\"generation.generate.error\", ErrorAttributesSchema)\n .event(\"generation.stream.started\", GenerationAttributesSchema)\n .event(\"generation.stream.chunk\", GenerationAttributesSchema)\n .event(\"generation.stream.success\", GenerationAttributesSchema)\n .event(\"generation.stream.error\", ErrorAttributesSchema)\n // ============================================================================\n // TOOL EVENTS\n // ============================================================================\n .event(\"tool.execute.started\", ToolAttributesSchema)\n .event(\"tool.execute.success\", ToolAttributesSchema)\n .event(\"tool.execute.error\", ErrorAttributesSchema)\n // ============================================================================\n // MCP EVENTS\n // ============================================================================\n .event(\"mcp.connect.started\", MCPAttributesSchema)\n .event(\"mcp.connect.success\", MCPAttributesSchema)\n .event(\"mcp.connect.error\", ErrorAttributesSchema)\n .event(\"mcp.disconnect.started\", MCPAttributesSchema)\n .event(\"mcp.disconnect.success\", MCPAttributesSchema)\n .event(\"mcp.disconnect.error\", ErrorAttributesSchema)\n // ============================================================================\n // MEMORY EVENTS\n // ============================================================================\n .event(\"memory.operation.started\", MemoryAttributesSchema)\n .event(\"memory.operation.success\", MemoryAttributesSchema)\n .event(\"memory.operation.error\", ErrorAttributesSchema)\n .build();\n\n/**\n * Type for the telemetry events registry.\n */\nexport type IgniterAgentTelemetryEventsType =\n typeof IgniterAgentTelemetryEvents;\n","/**\n * @fileoverview Memory runtime for IgniterAgent.\n * @module core/memory\n */\n\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterTelemetryAttributes, IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type {\n IgniterAgentConversationMessage,\n IgniterAgentGetChatsParams,\n IgniterAgentGetMessagesParams,\n IgniterAgentMemoryConfig,\n IgniterAgentMemoryRuntime,\n IgniterAgentUpdateWorkingMemoryParams,\n IgniterAgentWorkingMemory,\n IgniterAgentWorkingMemoryParams,\n IgniterAgentChatSession,\n IgniterAgentUIMessage,\n} from \"../types\";\nimport { IgniterAgentMemoryError, IgniterAgentErrorCode } from \"../errors\";\nimport { IgniterAgentTelemetryEvents } from \"../telemetry\";\n\nconst MEMORY_ERROR_CODE = IgniterAgentErrorCode.MEMORY_PROVIDER_ERROR;\n\n/**\n * Memory runtime wrapper that adds logging and telemetry to provider operations.\n *\n * @public\n */\nexport class IgniterAgentMemoryCore implements IgniterAgentMemoryRuntime {\n private readonly provider: IgniterAgentMemoryConfig[\"provider\"];\n private readonly agentName: string;\n private readonly logger?: IgniterLogger;\n private readonly telemetry?: IgniterTelemetryManager;\n\n constructor(\n config: IgniterAgentMemoryConfig,\n agentName: string,\n logger?: IgniterLogger,\n telemetry?: IgniterTelemetryManager,\n ) {\n this.provider = config.provider;\n this.agentName = agentName;\n this.logger = logger;\n this.telemetry = telemetry;\n }\n\n private getBaseAttributes(operation: string, scope?: string) {\n const attributes: Record<string, unknown> = {\n \"ctx.agent.name\": this.agentName,\n \"ctx.memory.operation\": operation,\n };\n\n if (scope) {\n attributes[\"ctx.memory.scope\"] = scope;\n }\n\n return attributes;\n }\n\n private emitStart(operation: string, scope?: string) {\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"memory.operation.started\"), {\n level: \"debug\",\n attributes: this.getBaseAttributes(operation, scope) as IgniterTelemetryAttributes,\n });\n }\n\n private emitSuccess(\n operation: string,\n durationMs: number,\n scope?: string,\n count?: number,\n ) {\n const attributes = {\n ...this.getBaseAttributes(operation, scope),\n \"ctx.memory.durationMs\": durationMs,\n } as Record<string, unknown>;\n\n if (count !== undefined) {\n attributes[\"ctx.memory.count\"] = count;\n }\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"memory.operation.success\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n }\n\n private emitError(operation: string, error: Error, scope?: string) {\n const attributes: Record<string, unknown> = {\n ...this.getBaseAttributes(operation, scope),\n \"ctx.error.code\": MEMORY_ERROR_CODE,\n \"ctx.error.message\": error.message,\n \"ctx.error.operation\": operation,\n \"ctx.error.component\": \"memory\",\n };\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"memory.operation.error\"), {\n level: \"error\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n }\n\n private async runOperation<T>(\n operation: string,\n scope: string | undefined,\n handler: () => Promise<T>,\n count?: (value: T) => number | undefined,\n ): Promise<T> {\n const start = Date.now();\n this.emitStart(operation, scope);\n this.logger?.debug(`IgniterAgent.memory.${operation} started`, {\n agent: this.agentName,\n scope,\n });\n\n try {\n const result = await handler();\n const durationMs = Date.now() - start;\n this.emitSuccess(operation, durationMs, scope, count?.(result));\n this.logger?.success?.(\n `IgniterAgent.memory.${operation} success`,\n { agent: this.agentName, scope, durationMs },\n );\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emitError(operation, error, scope);\n this.logger?.error(`IgniterAgent.memory.${operation} failed`, error);\n throw new IgniterAgentMemoryError({\n message: error.message,\n code: MEMORY_ERROR_CODE,\n cause: error,\n metadata: { operation },\n });\n }\n }\n\n async getWorkingMemory(\n params: IgniterAgentWorkingMemoryParams,\n ): Promise<IgniterAgentWorkingMemory | null> {\n return this.runOperation(\n \"getWorkingMemory\",\n params.scope,\n () => this.provider.getWorkingMemory(params),\n );\n }\n\n async updateWorkingMemory(\n params: IgniterAgentUpdateWorkingMemoryParams,\n ): Promise<void> {\n await this.runOperation(\n \"updateWorkingMemory\",\n params.scope,\n () => this.provider.updateWorkingMemory(params),\n );\n }\n\n async saveMessage(message: IgniterAgentConversationMessage): Promise<void> {\n await this.runOperation(\n \"saveMessage\",\n undefined,\n async () => {\n if (!this.provider.saveMessage) {\n throw new Error(\"saveMessage is not supported by the provider\");\n }\n await this.provider.saveMessage(message);\n },\n );\n }\n\n async getMessages<T = IgniterAgentUIMessage>(\n params: IgniterAgentGetMessagesParams,\n ): Promise<T[]> {\n return this.runOperation(\n \"getMessages\",\n undefined,\n async () => {\n if (!this.provider.getMessages) {\n throw new Error(\"getMessages is not supported by the provider\");\n }\n return this.provider.getMessages<T>(params);\n },\n (result) => result.length,\n );\n }\n\n async saveChat(chat: IgniterAgentChatSession): Promise<void> {\n await this.runOperation(\n \"saveChat\",\n undefined,\n async () => {\n if (!this.provider.saveChat) {\n throw new Error(\"saveChat is not supported by the provider\");\n }\n await this.provider.saveChat(chat);\n },\n );\n }\n\n async getChats(params: IgniterAgentGetChatsParams): Promise<IgniterAgentChatSession[]> {\n return this.runOperation(\n \"getChats\",\n undefined,\n async () => {\n if (!this.provider.getChats) {\n throw new Error(\"getChats is not supported by the provider\");\n }\n return this.provider.getChats(params);\n },\n (result) => result.length,\n );\n }\n\n async getChat(chatId: string): Promise<IgniterAgentChatSession | null> {\n return this.runOperation(\n \"getChat\",\n undefined,\n async () => {\n if (!this.provider.getChat) {\n throw new Error(\"getChat is not supported by the provider\");\n }\n return this.provider.getChat(chatId);\n },\n );\n }\n\n async updateChatTitle(chatId: string, title: string): Promise<void> {\n await this.runOperation(\n \"updateChatTitle\",\n undefined,\n async () => {\n if (!this.provider.updateChatTitle) {\n throw new Error(\"updateChatTitle is not supported by the provider\");\n }\n await this.provider.updateChatTitle(chatId, title);\n },\n );\n }\n\n async deleteChat(chatId: string): Promise<void> {\n await this.runOperation(\n \"deleteChat\",\n undefined,\n async () => {\n if (!this.provider.deleteChat) {\n throw new Error(\"deleteChat is not supported by the provider\");\n }\n await this.provider.deleteChat(chatId);\n },\n );\n }\n}\n","import { experimental_createMCPClient, type experimental_MCPClient } from \"@ai-sdk/mcp\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport {\n ToolLoopAgent,\n type AgentCallParameters,\n type AgentStreamParameters,\n type LanguageModel,\n type ToolSet,\n} from \"ai\";\nimport { IgniterAgentConfigError, IgniterAgentError, IgniterAgentErrorCode, IgniterAgentMCPError } from \"../errors\";\nimport type { IgniterAgentConfig, IgniterAgentMCPConfigUnion, IgniterAgentMCPHttpConfig, IgniterAgentMCPStdioConfig, IgniterAgentToolset } from \"../types\";\nimport type { z } from \"zod\";\nimport type { IgniterAgentPromptTemplate } from \"../types/prompt\";\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterTelemetryAttributes, IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport { IgniterAgentTelemetryEvents } from \"../telemetry\";\nimport type { IgniterAgentHooks } from \"../types/hooks\";\nimport { IgniterAgentMemoryCore } from \"./memory\";\n\nexport class IgniterAgentCore<\n TAgentName extends string = string,\n TAgentModel extends LanguageModel = LanguageModel,\n TAgentInstructions extends IgniterAgentPromptTemplate =\n IgniterAgentPromptTemplate,\n TAgentToolsets extends Record<string, IgniterAgentToolset> = Record<\n string,\n IgniterAgentToolset\n >,\n TAgentMCPConfigs extends Record<string, IgniterAgentMCPConfigUnion> = Record<\n string,\n IgniterAgentMCPConfigUnion\n >,\n TAgentContextSchema extends z.ZodSchema = z.ZodSchema,\n> {\n private _agent: IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >;\n\n private logger?: IgniterLogger;\n private telemetry?: IgniterTelemetryManager;\n private hooks: IgniterAgentHooks;\n public memory?: IgniterAgentMemoryCore;\n\n constructor(\n agent: IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n ) {\n this._agent = agent;\n this.logger = agent.logger;\n this.telemetry = agent.telemetry;\n this.hooks = agent.hooks ?? {};\n if (agent.memory) {\n this.memory = new IgniterAgentMemoryCore(agent.memory, String(agent.name), this.logger, this.telemetry);\n }\n }\n\n /**\n * Attaches a logger instance to the agent.\n */\n attachLogger(logger?: IgniterLogger): void {\n if (!logger) return;\n if (!this.logger) {\n this.logger = logger;\n if (this._agent.memory) {\n this.memory = new IgniterAgentMemoryCore(\n this._agent.memory,\n this.getName(),\n this.logger,\n this.telemetry,\n );\n }\n }\n }\n\n /**\n * Attaches a telemetry manager to the agent.\n */\n attachTelemetry(telemetry?: IgniterTelemetryManager): void {\n if (!telemetry) return;\n if (!this.telemetry) {\n this.telemetry = telemetry;\n if (this._agent.memory) {\n this.memory = new IgniterAgentMemoryCore(\n this._agent.memory,\n this.getName(),\n this.logger,\n this.telemetry,\n );\n }\n }\n }\n\n /**\n * Attaches hook callbacks to the agent.\n */\n attachHooks(hooks?: IgniterAgentHooks): void {\n if (!hooks) return;\n\n const merge = <T extends (...args: any[]) => void>(\n current?: T,\n incoming?: T,\n ): T | undefined => {\n if (!current) return incoming;\n if (!incoming) return current;\n return ((...args: any[]) => {\n current(...args);\n incoming(...args);\n }) as T;\n };\n\n this.hooks = {\n onAgentStart: merge(this.hooks.onAgentStart, hooks.onAgentStart),\n onAgentError: merge(this.hooks.onAgentError, hooks.onAgentError),\n onToolCallStart: merge(this.hooks.onToolCallStart, hooks.onToolCallStart),\n onToolCallEnd: merge(this.hooks.onToolCallEnd, hooks.onToolCallEnd),\n onToolCallError: merge(this.hooks.onToolCallError, hooks.onToolCallError),\n onMCPStart: merge(this.hooks.onMCPStart, hooks.onMCPStart),\n onMCPError: merge(this.hooks.onMCPError, hooks.onMCPError),\n };\n }\n\n /**\n * Returns the agent name.\n */\n getName(): string {\n return String(this._agent.name);\n }\n\n /**\n * Starts the agent by initializing all MCP connections.\n */\n async start(): Promise<void> {\n const startTime = Date.now();\n const toolsets = this._agent.toolsets;\n const mcpConfigs = Object.values(this._agent.configs || {});\n const lifecycleAttributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.lifecycle.toolsetCount\": Object.keys(toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n \"ctx.lifecycle.hasMemory\": Boolean(this.memory),\n };\n\n this.logger?.debug(\"IgniterAgent.start started\", lifecycleAttributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.start.started\"), {\n level: \"debug\",\n attributes: lifecycleAttributes as IgniterTelemetryAttributes,\n });\n\n try {\n for (const mcpConfig of mcpConfigs) {\n const mcpStart = Date.now();\n this.hooks.onMCPStart?.(this.getName(), mcpConfig.name);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.connect.started\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n } as IgniterTelemetryAttributes,\n });\n\n try {\n const mcpToolset = await this.initializeMCPClient(mcpConfig);\n\n // @ts-expect-error - Expected to assign dynamically\n toolsets[mcpConfig.name] = mcpToolset;\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.connect.success\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.toolCount\": Object.keys(mcpToolset.tools || {}).length,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n } as IgniterTelemetryAttributes,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.connect.error\"), {\n level: \"error\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n ...this.getErrorAttributes(err, \"mcp.connect\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.mcp.connect failed\", err);\n throw err;\n }\n }\n\n const durationMs = Date.now() - startTime;\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.start.success\"), {\n level: \"debug\",\n attributes: {\n ...lifecycleAttributes,\n \"ctx.lifecycle.toolsetCount\": Object.keys(this._agent.toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.start success\", {\n ...lifecycleAttributes,\n durationMs,\n });\n this.hooks.onAgentStart?.(this.getName());\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.start.error\"), {\n level: \"error\",\n attributes: {\n ...lifecycleAttributes,\n ...this.getErrorAttributes(err, \"lifecycle.start\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.start failed\", err);\n this.hooks.onAgentError?.(this.getName(), err);\n throw err;\n }\n }\n\n /**\n * Stops the agent by disconnecting MCP toolsets.\n */\n async stop(): Promise<void> {\n const startTime = Date.now();\n const mcpConfigs = Object.values(this._agent.configs || {});\n const lifecycleAttributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.lifecycle.toolsetCount\": Object.keys(this._agent.toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n \"ctx.lifecycle.hasMemory\": Boolean(this.memory),\n };\n\n this.logger?.debug(\"IgniterAgent.stop started\", lifecycleAttributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.stop.started\"), {\n level: \"debug\",\n attributes: lifecycleAttributes as IgniterTelemetryAttributes,\n });\n\n try {\n for (const mcpConfig of mcpConfigs) {\n const mcpStart = Date.now();\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.disconnect.started\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n } as IgniterTelemetryAttributes,\n });\n\n try {\n const existing = this._agent.toolsets[mcpConfig.name as keyof typeof this._agent.toolsets] as {\n disconnect?: () => Promise<void> | void;\n } | undefined;\n\n if (existing?.disconnect) {\n await existing.disconnect();\n }\n\n if (existing) {\n // @ts-expect-error - Expected to assign dynamically\n this._agent.toolsets[mcpConfig.name] = {\n ...existing,\n status: \"disconnected\",\n tools: {},\n };\n }\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.disconnect.success\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n } as IgniterTelemetryAttributes,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"mcp.disconnect.error\"), {\n level: \"error\",\n attributes: {\n \"ctx.agent.name\": this.getName(),\n \"ctx.mcp.name\": mcpConfig.name,\n \"ctx.mcp.type\": mcpConfig.type,\n \"ctx.mcp.durationMs\": Date.now() - mcpStart,\n ...this.getErrorAttributes(err, \"mcp.disconnect\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.mcp.disconnect failed\", err);\n throw err;\n }\n }\n\n const durationMs = Date.now() - startTime;\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.stop.success\"), {\n level: \"debug\",\n attributes: {\n ...lifecycleAttributes,\n \"ctx.lifecycle.toolsetCount\": Object.keys(this._agent.toolsets || {}).length,\n \"ctx.lifecycle.mcpCount\": mcpConfigs.length,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.stop success\", {\n ...lifecycleAttributes,\n durationMs,\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"lifecycle.stop.error\"), {\n level: \"error\",\n attributes: {\n ...lifecycleAttributes,\n ...this.getErrorAttributes(err, \"lifecycle.stop\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.stop failed\", err);\n throw err;\n }\n }\n\n /**\n * Generates a response from the agent.\n */\n async generate(\n input: AgentCallParameters<z.infer<TAgentContextSchema>>,\n ): Promise<any> {\n const startTime = Date.now();\n const attributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.generation.inputMessages\": Array.isArray(input.messages)\n ? input.messages.length\n : undefined,\n \"ctx.generation.streamed\": false,\n };\n\n this.logger?.debug(\"IgniterAgent.generate started\", attributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.generate.started\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n\n try {\n const agent = this.getAgentInstanceWithContext(\n input.options as z.infer<TAgentContextSchema>,\n );\n const result = await agent.generate(input);\n const durationMs = Date.now() - startTime;\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.generate.success\"), {\n level: \"debug\",\n attributes: {\n ...attributes,\n \"ctx.generation.durationMs\": durationMs,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.generate success\", {\n ...attributes,\n durationMs,\n });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.generate.error\"), {\n level: \"error\",\n attributes: {\n ...attributes,\n ...this.getErrorAttributes(err, \"generation.generate\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.generate failed\", err);\n throw err;\n }\n }\n\n /**\n * Streams a response from the agent.\n */\n async stream(\n input: AgentStreamParameters<z.infer<TAgentContextSchema>, ToolSet>,\n ): Promise<any> {\n const startTime = Date.now();\n const attributes = {\n \"ctx.agent.name\": this.getName(),\n \"ctx.generation.inputMessages\": Array.isArray(input.messages)\n ? input.messages.length\n : undefined,\n \"ctx.generation.streamed\": true,\n };\n\n this.logger?.debug(\"IgniterAgent.stream started\", attributes);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.started\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n\n try {\n const agent = this.getAgentInstanceWithContext(\n input.options as z.infer<TAgentContextSchema>,\n );\n const result = await agent.stream(input);\n const durationMs = Date.now() - startTime;\n\n const emitChunk = () => {\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.chunk\"), {\n level: \"debug\",\n attributes: attributes as IgniterTelemetryAttributes,\n });\n };\n\n const wrapped = this.wrapStreamResult(result, emitChunk);\n\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.success\"), {\n level: \"debug\",\n attributes: {\n ...attributes,\n \"ctx.generation.durationMs\": durationMs,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.stream success\", {\n ...attributes,\n durationMs,\n });\n return wrapped;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"generation.stream.error\"), {\n level: \"error\",\n attributes: {\n ...attributes,\n ...this.getErrorAttributes(err, \"generation.stream\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.stream failed\", err);\n throw err;\n }\n }\n\n /**\n * Gets all registered toolsets.\n */\n getToolsets() {\n return this._agent.toolsets;\n }\n\n /**\n * Gets the configured model.\n */\n getModel() {\n return this._agent.model as TAgentModel;\n }\n\n /**\n * Gets the configured instructions.\n */\n getInstructions() {\n return this._agent.instructions as TAgentInstructions;\n }\n\n /**\n * Gets the context schema.\n */\n getContextSchema() {\n return this._agent.schema as TAgentContextSchema;\n }\n\n /**\n * Gets all registered tools from all toolsets.\n */\n getTools() {\n const toolsets = this.getToolsets();\n const allTools: ToolSet = {};\n\n for (const toolset of Object.values(toolsets)) {\n for (const [toolName, tool] of Object.entries(toolset.tools)) {\n const wrapped = this.wrapToolExecution(toolset.name, toolName, tool as ToolSet[string]);\n allTools[toolName] = wrapped;\n }\n }\n\n return allTools;\n }\n\n private wrapToolExecution(\n toolsetName: string,\n toolName: string,\n tool: ToolSet[string],\n ): ToolSet[string] {\n if (!tool || !tool.execute || typeof tool.execute !== \"function\") {\n return tool;\n }\n\n const execute = tool.execute as NonNullable<ToolSet[string][\"execute\"]>;\n const fullName = `${toolsetName}.${toolName}`;\n const agentName = this.getName();\n\n return {\n ...tool,\n execute: async (input: unknown, options?: unknown) => {\n const startTime = Date.now();\n this.hooks.onToolCallStart?.(agentName, fullName, input);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"tool.execute.started\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": agentName,\n \"ctx.tool.toolset\": toolsetName,\n \"ctx.tool.name\": toolName,\n \"ctx.tool.fullName\": fullName,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.debug(\"IgniterAgent.tool.execute started\", {\n agent: agentName,\n tool: fullName,\n });\n\n try {\n const result = await execute(input as any, options as any);\n const durationMs = Date.now() - startTime;\n this.hooks.onToolCallEnd?.(agentName, fullName, result);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"tool.execute.success\"), {\n level: \"debug\",\n attributes: {\n \"ctx.agent.name\": agentName,\n \"ctx.tool.toolset\": toolsetName,\n \"ctx.tool.name\": toolName,\n \"ctx.tool.fullName\": fullName,\n \"ctx.tool.durationMs\": durationMs,\n } as IgniterTelemetryAttributes,\n });\n this.logger?.success?.(\"IgniterAgent.tool.execute success\", {\n agent: agentName,\n tool: fullName,\n durationMs,\n });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.hooks.onToolCallError?.(agentName, fullName, err);\n this.telemetry?.emit(IgniterAgentTelemetryEvents.get.key(\"tool.execute.error\"), {\n level: \"error\",\n attributes: {\n \"ctx.agent.name\": agentName,\n \"ctx.tool.toolset\": toolsetName,\n \"ctx.tool.name\": toolName,\n \"ctx.tool.fullName\": fullName,\n ...this.getErrorAttributes(err, \"tool.execute\"),\n } as IgniterTelemetryAttributes,\n });\n this.logger?.error(\"IgniterAgent.tool.execute failed\", err);\n throw err;\n }\n },\n };\n }\n\n private wrapStreamResult<T>(result: T, onChunk: () => void): T {\n if (!result) {\n return result;\n }\n\n if (typeof (result as any)[Symbol.asyncIterator] === \"function\") {\n const iterable = result as unknown as AsyncIterable<unknown>;\n return {\n [Symbol.asyncIterator]: async function* () {\n for await (const chunk of iterable) {\n onChunk();\n yield chunk;\n }\n },\n } as T;\n }\n\n const maybeTextStream = (result as any).textStream;\n if (maybeTextStream && typeof maybeTextStream[Symbol.asyncIterator] === \"function\") {\n return {\n ...(result as any),\n textStream: (async function* () {\n for await (const chunk of maybeTextStream) {\n onChunk();\n yield chunk;\n }\n })(),\n } as T;\n }\n\n return result;\n }\n\n private getErrorAttributes(error: Error, operation: string): Record<string, unknown> {\n return {\n \"ctx.error.code\": (error as { code?: string }).code ?? error.name ?? IgniterAgentErrorCode.UNKNOWN,\n \"ctx.error.message\": error.message,\n \"ctx.error.operation\": operation,\n \"ctx.error.component\": \"agent\",\n };\n }\n \n private getAgentInstanceWithContext(context: z.infer<TAgentContextSchema>) {\n const tools = this.getTools();\n\n if (!this._agent.model) {\n throw new IgniterAgentConfigError({\n message: \"Model is required. Call withModel() before build()\",\n field: \"model\",\n });\n }\n\n if (this._agent.schema !== undefined) {\n const parseResult = this._agent.schema.safeParse(context);\n if (parseResult.success) {\n context = parseResult.data;\n } else {\n throw new IgniterAgentError({\n message: \"Invalid context schema\",\n code: IgniterAgentErrorCode.AGENT_CONTEXT_SCHEMA_INVALID,\n });\n }\n }\n\n return new ToolLoopAgent<z.infer<TAgentContextSchema>, ToolSet>({\n model: this._agent.model,\n instructions: this._agent.instructions\n ? this._agent.instructions.build(context as any)\n : \"\",\n tools,\n callOptionsSchema: this._agent.schema as any,\n })\n }\n\n private async initializeMCPClient<\n TMCPType extends IgniterAgentMCPConfigUnion[\"type\"],\n TMCPName extends string,\n >(\n mcpConfig: IgniterAgentMCPConfigUnion<TMCPName>,\n ): Promise<IgniterAgentToolset<TMCPType, TMCPName>> {\n if (this._agent.toolsets[mcpConfig.name]) {\n return this._agent.toolsets[\n mcpConfig.name as keyof typeof this._agent.toolsets\n ] as unknown as IgniterAgentToolset<TMCPType, TMCPName>;\n }\n\n let client: experimental_MCPClient | null = null;\n\n try {\n if (mcpConfig.type === \"stdio\") {\n const stdioConfig = mcpConfig as IgniterAgentMCPStdioConfig<TMCPName>;\n this.logger?.debug(\"IgniterAgent.mcp.connect stdio\", {\n command: stdioConfig.command,\n args: stdioConfig.args,\n });\n\n client = await experimental_createMCPClient({\n transport: new StdioClientTransport({\n command: stdioConfig.command,\n args: stdioConfig.args,\n env: stdioConfig.env,\n }),\n });\n }\n\n if (mcpConfig.type === \"http\") {\n const httpConfig = mcpConfig as IgniterAgentMCPHttpConfig<TMCPName>;\n this.logger?.debug(\"IgniterAgent.mcp.connect http\", {\n url: httpConfig.url,\n });\n\n const url = new URL(httpConfig.url);\n client = await experimental_createMCPClient({\n transport: new StreamableHTTPClientTransport(url, {\n requestInit: {\n headers: httpConfig.headers,\n },\n }),\n });\n }\n\n if (!client) {\n throw new IgniterAgentMCPError({\n message: `Failed to create MCP client for '${mcpConfig.name}'`,\n code: IgniterAgentErrorCode.MCP_CONNECTION_FAILED,\n mcpName: mcpConfig.name,\n });\n }\n\n const tools = await client.tools();\n\n return {\n type: mcpConfig.type as TMCPType,\n status: \"connected\",\n name: mcpConfig.name,\n tools: tools as ToolSet,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.hooks.onMCPError?.(this.getName(), mcpConfig.name, err);\n throw err;\n }\n }\n}\n","import type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterAgentBuiltAgent } from \"../types\";\nimport { IgniterAgentManagerCore } from \"../core/manager\";\nimport type { IgniterAgentManagerOptions } from \"../types/manager\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterAgentHooks } from \"../types/hooks\";\n\nexport class IgniterAgentManagerBuilder<\n TAgentRegistry extends Record<string, IgniterAgentBuiltAgent> = Record<string, IgniterAgentBuiltAgent>\n> {\n private readonly _manager: IgniterAgentManagerOptions<TAgentRegistry>\n\n private constructor(manager: IgniterAgentManagerOptions<TAgentRegistry>) {\n this._manager = manager;\n }\n\n addAgent<TName extends string, TAgent extends IgniterAgentBuiltAgent>(\n name: TName,\n agent: TAgent,\n ): IgniterAgentManagerBuilder<TAgentRegistry & { [K in TName]: TAgent }> {\n return new IgniterAgentManagerBuilder<TAgentRegistry & { [K in TName]: TAgent }>({\n logger: this._manager.logger,\n telemetry: this._manager.telemetry,\n autoStart: this._manager.autoStart,\n continueOnError: this._manager.continueOnError,\n onAgentStart: this._manager.onAgentStart,\n onAgentError: this._manager.onAgentError,\n onToolCallStart: this._manager.onToolCallStart,\n onToolCallEnd: this._manager.onToolCallEnd,\n onToolCallError: this._manager.onToolCallError,\n onMCPStart: this._manager.onMCPStart,\n onMCPError: this._manager.onMCPError,\n agents: {\n ...this._manager.agents,\n [name]: agent,\n },\n });\n }\n\n withLogger(logger: IgniterLogger): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n logger,\n });\n }\n\n withTelemetry(telemetry: IgniterTelemetryManager): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n telemetry,\n });\n }\n\n withAutoStart(autoStart: boolean): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n autoStart,\n });\n }\n\n withContinueOnError(continueOnError: boolean): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n continueOnError,\n });\n }\n\n onAgentStart(\n callback: IgniterAgentHooks[\"onAgentStart\"],\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n onAgentStart: callback,\n });\n }\n\n onAgentError(\n callback: IgniterAgentHooks[\"onAgentError\"],\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n return new IgniterAgentManagerBuilder({\n ...this._manager,\n onAgentError: callback,\n });\n }\n\n onToolCallStart(\n callback: (agentName: keyof TAgentRegistry, toolName: string, input: unknown) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onToolCallStart: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onToolCallEnd(\n callback: (agentName: keyof TAgentRegistry, toolName: string, output: unknown) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onToolCallEnd: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onToolCallError(\n callback: (agentName: keyof TAgentRegistry, toolName: string, error: Error) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onToolCallError: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onMCPStart(\n callback: (agentName: keyof TAgentRegistry, mcpName: string) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onMCPStart: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n onMCPError(\n callback: (agentName: string, mcpName: string, error: Error) => void\n ): IgniterAgentManagerBuilder<TAgentRegistry> {\n const manager = new IgniterAgentManagerBuilder({\n ...this._manager,\n onMCPError: callback\n });\n\n return manager as unknown as IgniterAgentManagerBuilder<TAgentRegistry>;\n }\n\n static create(): IgniterAgentManagerBuilder<{}> {\n return new IgniterAgentManagerBuilder({\n agents: {},\n autoStart: false,\n continueOnError: true,\n });\n }\n\n build(): IgniterAgentManagerCore<TAgentRegistry> {\n return new IgniterAgentManagerCore<TAgentRegistry>(this._manager);\n }\n}\n\n/* =============================================================================\n * MAIN EXPORT ALIAS\n * ============================================================================= */\n\n/**\n * Alias for IgniterAgentManager for cleaner API.\n *\n * @description\n * Use `IgniterAgentManager.create()` as the primary entry point for managing agents.\n *\n * @example\n * ```typescript\n * import { IgniterAgentManager } from '@igniter-js/agents';\n *\n * const manager = IgniterAgentManager\n * .create()\n * .addAgent('assistant', assistantAgent)\n * .addAgent('code-helper', codeHelperAgent)\n * .withLogger(customLogger)\n * .onToolCallStart((agentName, toolName, input) => {\n * console.log(`[${agentName}] Tool ${toolName} called with input:`, input);\n * })\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgentManager = {\n create: IgniterAgentManagerBuilder.create,\n};\n\n/**\n * Type alias for the IgniterAgent class.\n * @public\n */\nexport type IgniterAgentManager = typeof IgniterAgentManagerBuilder;\n","/**\n * @fileoverview Prompt builder for IgniterAgent instructions.\n *\n * @description\n * Provides a lightweight template interpolation utility to build\n * prompt strings with context data.\n *\n * @module builders/prompt\n * @packageDocumentation\n */\n\nimport type { IgniterAgentPromptTemplate } from \"../types/prompt\";\n\nconst TEMPLATE_PATTERN = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n\nconst resolvePath = (value: unknown, path: string): unknown => {\n if (!path) return undefined;\n\n return path\n .split(\".\")\n .reduce<unknown>((acc, key) => {\n if (acc && typeof acc === \"object\" && key in (acc as Record<string, unknown>)) {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, value);\n};\n\n/**\n * Fluent prompt builder for agent instructions.\n *\n * @example\n * ```typescript\n * const prompt = IgniterAgentPrompt.create(\n * \"You are {{agentName}}. User: {{user.name}}\"\n * );\n *\n * const result = prompt.build({ agentName: \"assistant\", user: { name: \"Ada\" } });\n * // \"You are assistant. User: Ada\"\n * ```\n *\n * @public\n */\nexport class IgniterAgentPromptBuilder<\n TTemplate extends string = string,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n> implements IgniterAgentPromptTemplate<TContext> {\n private readonly template: TTemplate;\n\n private constructor(template: TTemplate) {\n this.template = template;\n }\n\n /**\n * Creates a new prompt builder.\n *\n * @param template - Prompt template string with {{placeholders}}\n * @returns A new prompt builder instance\n */\n static create<TNewTemplate extends string>(\n template: TNewTemplate,\n ): IgniterAgentPromptBuilder<TNewTemplate, Record<string, unknown>> {\n return new IgniterAgentPromptBuilder<TNewTemplate, Record<string, unknown>>(\n template,\n );\n }\n\n /**\n * Builds the prompt string with the provided context.\n *\n * @param context - Context data used for interpolation\n * @returns The resolved prompt string\n */\n build(context: TContext): string {\n return this.template.replace(TEMPLATE_PATTERN, (_match, path) => {\n const value = resolvePath(context, String(path));\n return value === undefined || value === null ? \"\" : String(value);\n });\n }\n\n /**\n * Returns the raw prompt template string.\n */\n getTemplate(): string {\n return this.template;\n }\n}\n\n/* =============================================================================\n * MAIN EXPORT ALIAS\n * ============================================================================= */\n\n/**\n * Alias for IgniterAgentPromptBuilder for cleaner API.\n *\n * @public\n */\nexport const IgniterAgentPrompt = IgniterAgentPromptBuilder;\n\n/**\n * Type alias for the prompt builder constructor.\n *\n * @public\n */\nexport type IgniterAgentPrompt = typeof IgniterAgentPromptBuilder;\n","/**\n * @fileoverview Main Agent Builder for creating AI agents with tools and MCP support.\n * This module provides the primary fluent API for building IgniterAgent instances.\n *\n * @description\n * The IgniterAgentBuilder is the central class for creating AI agents. It provides\n * a type-safe fluent API for configuring all aspects of an agent including:\n * - Language model selection\n * - Custom toolsets\n * - MCP server connections\n * - Context schema validation\n * - Prompt instructions\n *\n * @example\n * ```typescript\n * import { IgniterAgent } from '@igniter-js/agents';\n * import { openai } from '@ai-sdk/openai';\n * import { z } from 'zod';\n *\n * const agent = IgniterAgent\n * .create('assistant')\n * .withModel(openai('gpt-4'))\n * .withContextSchema(z.object({\n * userId: z.string(),\n * chatId: z.string()\n * }))\n * .addToolset(myCustomToolset)\n * .addMCP(filesystemMCP)\n * .build();\n *\n * // Start the agent (initializes MCP connections)\n * await agent.start();\n *\n * // Generate a response\n * const result = await agent.generate({\n * messages: [{ role: 'user', content: 'Hello!' }],\n * options: { userId: 'user_123', chatId: 'chat_456' }\n * });\n * ```\n *\n * @module builders/agent\n * @packageDocumentation\n */\nimport {\n type LanguageModel,\n} from \"ai\";\nimport type { z } from \"zod\";\nimport type {\n IgniterAgentConfig,\n IgniterAgentToolset,\n IgniterAgentToolsetType,\n IgniterAgentMCPConfigUnion,\n} from \"../types\";\nimport type { IgniterAgentBuiltAgent } from \"../types/builder\";\nimport { IgniterAgentCore } from \"../core/agent\";\nimport type { IgniterAgentPromptTemplate } from \"../types/prompt\";\nimport { IgniterAgentPromptBuilder } from \"./prompt.builder\";\nimport type { IgniterLogger } from \"@igniter-js/core\";\nimport type { IgniterTelemetryManager } from \"@igniter-js/telemetry\";\nimport type { IgniterAgentHooks } from \"../types/hooks\";\nimport type { IgniterAgentMemoryConfig } from \"../types/memory\";\n\n/* =============================================================================\n * AGENT BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for creating AI agents.\n *\n * @description\n * The IgniterAgentBuilder provides a comprehensive fluent API for creating\n * AI agents with full TypeScript type inference. It supports:\n *\n * - **Multiple Language Models**: Works with any Vercel AI SDK compatible model\n * - **Custom Toolsets**: Register your own tools with automatic error handling\n * - **MCP Integration**: Connect to MCP servers for external tool providers\n * - **Context Schema**: Type-safe context validation with Zod\n * - **Dynamic Prompts**: Template-based prompt generation\n *\n * **Lifecycle:**\n * 1. Create the builder with `IgniterAgent.create()`\n * 2. Configure using fluent methods (`withModel`, etc.)\n * 3. Build with `.build()` to get the runtime agent\n * 4. Call `.start()` to initialize MCP connections\n * 5. Use `.generate()` or `.stream()` to interact with the agent\n *\n * @typeParam TAgentName - The agent's unique name type\n * @typeParam TAgentModel - The language model type\n * @typeParam TAgentInstructions - The prompt template type\n * @typeParam TAgentToolsets - Record of registered toolsets\n * @typeParam TAgentMCPConfigs - Record of MCP configurations\n * @typeParam TAgentContextSchema - The context schema type\n *\n * @example\n * ```typescript\n * import {\n * IgniterAgent,\n * IgniterAgentPrompt,\n * IgniterAgentToolset,\n * IgniterAgentTool,\n * IgniterAgentMCPClient,\n * } from '@igniter-js/agents';\n * import { openai } from '@ai-sdk/openai';\n * import { z } from 'zod';\n *\n * const runCodeTool = IgniterAgentTool\n * .create('runCode')\n * .withDescription('Runs code')\n * .withInput(z.object({ code: z.string() }))\n * .withExecute(async ({ code }) => codeRunner(code))\n * .build();\n *\n * const searchDocsTool = IgniterAgentTool\n * .create('searchDocs')\n * .withDescription('Searches docs')\n * .withInput(z.object({ query: z.string() }))\n * .withExecute(async ({ query }) => docSearcher(query))\n * .build();\n *\n * // Create a fully-configured agent\n * const agent = IgniterAgent\n * .create('code-assistant')\n * .withModel(openai('gpt-4-turbo'))\n * .withContextSchema(z.object({\n * userId: z.string(),\n * projectId: z.string()\n * }))\n * .withPrompt(\n * IgniterAgentPrompt.create('You are a helpful coding assistant...')\n * )\n * .addToolset(\n * IgniterAgentToolset.create('code')\n * .addTool(runCodeTool)\n * .addTool(searchDocsTool)\n * .build()\n * )\n * .addMCP(\n * IgniterAgentMCPClient.create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@mcp/server-filesystem'])\n * .build()\n * )\n * .build();\n *\n * // Initialize and use\n * await agent.start();\n *\n * const response = await agent.generate({\n * messages: [{ role: 'user', content: 'Help me write a test' }],\n * options: { userId: 'user_123', projectId: 'proj_456' }\n * });\n * ```\n *\n * @public\n */\nexport class IgniterAgentBuilder<\n TAgentName extends string = string,\n TAgentModel extends LanguageModel = LanguageModel,\n TAgentInstructions extends IgniterAgentPromptTemplate =\n IgniterAgentPromptTemplate,\n TAgentToolsets extends Record<string, IgniterAgentToolset> = Record<\n string,\n IgniterAgentToolset\n >,\n TAgentMCPConfigs extends Record<string, IgniterAgentMCPConfigUnion> = Record<\n string,\n IgniterAgentMCPConfigUnion\n >,\n TAgentContextSchema extends z.ZodSchema = z.ZodSchema,\n> {\n /**\n * The agent configuration being built.\n * @internal\n */\n private readonly _config: Partial<\n IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n >;\n\n /**\n * Creates a new IgniterAgentBuilder instance.\n *\n * @param config - Initial configuration\n * @internal\n */\n private constructor(\n config: Partial<\n IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n > = {},\n ) {\n this._config = {\n name: \"agent\" as TAgentName,\n toolsets: {} as TAgentToolsets,\n configs: {} as TAgentMCPConfigs,\n instructions: IgniterAgentPromptBuilder.create(\"\") as unknown as TAgentInstructions,\n ...config,\n };\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new agent builder.\n *\n * @description\n * Primary entry point for creating an agent. Returns a new builder\n * instance that can be configured using fluent methods.\n *\n * @returns A new IgniterAgentBuilder instance\n *\n * @example\n * ```typescript\n * const agent = IgniterAgent.create('my-agent')\n * .withModel(openai('gpt-4'))\n * .build();\n * ```\n *\n * @public\n */\n static create<TNewName extends string = string>(\n name: TNewName = \"agent\" as TNewName,\n ): IgniterAgentBuilder<\n TNewName,\n LanguageModel,\n IgniterAgentPromptTemplate,\n {},\n {},\n z.ZodSchema\n > {\n return new IgniterAgentBuilder({\n name: name,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the language model.\n *\n * @description\n * Configures the AI model that powers the agent. Supports any model\n * provider compatible with the Vercel AI SDK.\n *\n * @typeParam TNewModel - The new model type\n * @param model - The language model instance\n * @returns A new builder with the model set\n *\n * @example\n * ```typescript\n * import { openai } from '@ai-sdk/openai';\n * import { anthropic } from '@ai-sdk/anthropic';\n * import { google } from '@ai-sdk/google';\n *\n * // Using OpenAI\n * const agent1 = IgniterAgent.create()\n * .withModel(openai('gpt-4-turbo'))\n * .build();\n *\n * // Using Anthropic\n * const agent2 = IgniterAgent.create()\n * .withModel(anthropic('claude-3-opus'))\n * .build();\n *\n * // Using Google\n * const agent3 = IgniterAgent.create()\n * .withModel(google('gemini-pro'))\n * .build();\n * ```\n *\n * @public\n */\n withModel<TNewModel extends LanguageModel>(\n model: TNewModel,\n ): IgniterAgentBuilder<\n TAgentName,\n TNewModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n model,\n });\n }\n\n /**\n * Sets the prompt instructions.\n *\n * @description\n * Configures the agent's system prompt using an IgniterAgentPrompt template.\n * The prompt defines the agent's behavior, personality, and capabilities.\n *\n * @typeParam TNewInstructions - The new instructions type\n * @param instructions - The prompt template instance\n * @returns A new builder with the instructions set\n *\n * @example\n * ```typescript\n * const agent = IgniterAgent.create()\n * .withPrompt(\n * IgniterAgentPrompt.create(`\n * You are a helpful coding assistant specialized in TypeScript.\n *\n * Guidelines:\n * - Always provide type-safe code\n * - Include JSDoc comments\n * - Follow best practices\n * `)\n * )\n * .build();\n * ```\n *\n * @public\n */\n withPrompt<TNewInstructions extends IgniterAgentPromptTemplate>(\n instructions: TNewInstructions,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TNewInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n instructions,\n });\n }\n\n /**\n * Attaches a logger instance for operational logs.\n */\n withLogger(logger: IgniterLogger): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n logger,\n });\n }\n\n /**\n * Attaches a telemetry manager for observability.\n */\n withTelemetry(\n telemetry: IgniterTelemetryManager,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n telemetry,\n });\n }\n\n /**\n * Configures persistent memory for the agent.\n */\n withMemory(\n memory: IgniterAgentMemoryConfig,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n memory,\n });\n }\n\n /**\n * Callback when the agent starts.\n */\n onAgentStart(\n callback: IgniterAgentHooks[\"onAgentStart\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onAgentStart: callback,\n },\n });\n }\n\n /**\n * Callback when the agent errors.\n */\n onAgentError(\n callback: IgniterAgentHooks[\"onAgentError\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onAgentError: callback,\n },\n });\n }\n\n /**\n * Callback when a tool call starts.\n */\n onToolCallStart(\n callback: IgniterAgentHooks[\"onToolCallStart\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onToolCallStart: callback,\n },\n });\n }\n\n /**\n * Callback when a tool call completes.\n */\n onToolCallEnd(\n callback: IgniterAgentHooks[\"onToolCallEnd\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onToolCallEnd: callback,\n },\n });\n }\n\n /**\n * Callback when a tool call fails.\n */\n onToolCallError(\n callback: IgniterAgentHooks[\"onToolCallError\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onToolCallError: callback,\n },\n });\n }\n\n /**\n * Callback when an MCP connection starts.\n */\n onMCPStart(\n callback: IgniterAgentHooks[\"onMCPStart\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onMCPStart: callback,\n },\n });\n }\n\n /**\n * Callback when an MCP connection fails.\n */\n onMCPError(\n callback: IgniterAgentHooks[\"onMCPError\"],\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n hooks: {\n ...this._config.hooks,\n onMCPError: callback,\n },\n });\n }\n\n /**\n * Sets the context schema.\n *\n * @description\n * Configures a Zod schema for validating context passed to the agent.\n * The context is available in prompt templates and can be used to\n * customize agent behavior per-request.\n *\n * @typeParam TNewSchema - The new schema type\n * @param schema - The Zod schema for context validation\n * @returns A new builder with the schema set\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n *\n * const contextSchema = z.object({\n * userId: z.string(),\n * chatId: z.string(),\n * userRole: z.enum(['admin', 'user', 'guest']),\n * preferences: z.object({\n * language: z.string().default('en'),\n * theme: z.string().optional()\n * })\n * });\n *\n * const agent = IgniterAgent.create()\n * .withContextSchema(contextSchema)\n * .build();\n *\n * // Context is type-safe when calling generate\n * await agent.generate({\n * messages: [...],\n * options: {\n * userId: 'user_123',\n * chatId: 'chat_456',\n * userRole: 'admin',\n * preferences: { language: 'pt' }\n * }\n * });\n * ```\n *\n * @public\n */\n withContextSchema<TNewSchema extends z.ZodSchema>(\n schema: TNewSchema,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TNewSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n schema,\n });\n }\n\n /**\n * Adds a toolset to the agent.\n *\n * @description\n * Registers a toolset with the agent. The toolset's tools become available\n * for the AI to invoke. Multiple toolsets can be added to a single agent.\n *\n * Tool names are prefixed with the toolset name to avoid collisions:\n * `{toolsetName}_{toolName}`\n *\n * @typeParam TNewToolset - The toolset type\n * @param toolset - The toolset to register\n * @returns A new builder with the toolset added\n *\n * @example\n * ```typescript\n * const githubToolset = IgniterAgentToolset.create('github')\n * .addTool(createIssueTool)\n * .addTool(listReposTool)\n * .build();\n *\n * const dockerToolset = IgniterAgentToolset.create('docker')\n * .addTool(buildImageTool)\n * .addTool(runContainerTool)\n * .build();\n *\n * const agent = IgniterAgent.create()\n * .addToolset(githubToolset) // Adds github_createIssue, github_listRepos\n * .addToolset(dockerToolset) // Adds docker_build, docker_run\n * .build();\n * ```\n *\n * @public\n */\n addToolset<TNewToolset extends IgniterAgentToolset>(\n toolset: TNewToolset,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets & { [K in TNewToolset[\"name\"]]: TNewToolset },\n TAgentMCPConfigs,\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n toolsets: {\n ...this._config.toolsets,\n [toolset.name]: toolset,\n } as TAgentToolsets & { [K in TNewToolset[\"name\"]]: TNewToolset },\n });\n }\n\n /**\n * Adds an MCP configuration to the agent.\n *\n * @description\n * Registers an MCP server configuration with the agent. The MCP server\n * will be connected when `agent.start()` is called, and its tools will\n * become available for the AI to invoke.\n *\n * @typeParam TMCPType - The MCP transport type\n * @typeParam TMCPName - The MCP configuration name\n * @param config - The MCP configuration\n * @returns A new builder with the MCP config added\n *\n * @example\n * ```typescript\n * const filesystemMCP = IgniterAgentMCPClient.create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .build();\n *\n * const remoteMCP = IgniterAgentMCPClient.create('remote-api')\n * .withType('http')\n * .withURL('https://api.example.com/mcp')\n * .withHeaders({ 'Authorization': 'Bearer xxx' })\n * .build();\n *\n * const agent = IgniterAgent.create()\n * .addMCP(filesystemMCP)\n * .addMCP(remoteMCP)\n * .build();\n *\n * // MCP connections are established here\n * await agent.start();\n * ```\n *\n * @public\n */\n addMCP<TMCPName extends string>(\n config: IgniterAgentMCPConfigUnion<TMCPName>,\n ): IgniterAgentBuilder<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs & { [K in TMCPName]: typeof config },\n TAgentContextSchema\n > {\n return new IgniterAgentBuilder({\n ...this._config,\n configs: {\n ...this._config.configs,\n [config.name]: config,\n } as TAgentMCPConfigs & { [K in TMCPName]: typeof config },\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed agent.\n *\n * @description\n * Finalizes the agent configuration and returns a runtime agent object.\n * The agent provides methods for:\n * - `start()`: Initialize MCP connections\n * - `generate()`: Generate a single response\n * - `stream()`: Stream a response\n * - Accessors for configuration\n *\n * @returns The built agent runtime object\n *\n * @example\n * ```typescript\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .addToolset(myToolset)\n * .build();\n *\n * // Start the agent\n * await agent.start();\n *\n * // Generate a response\n * const result = await agent.generate({\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n *\n * // Access configuration\n * console.log('Model:', agent.getModel());\n * console.log('Toolsets:', agent.getToolsets());\n * ```\n *\n * @public\n */\n build(): IgniterAgentBuiltAgent<\n TAgentContextSchema,\n TAgentToolsets,\n TAgentModel,\n TAgentInstructions\n > {\n return new IgniterAgentCore<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >(this._config as IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >);\n }\n\n /* ---------------------------------------------------------------------------\n * ACCESSORS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets the current configuration (partial).\n *\n * @returns The current configuration state\n * @public\n */\n getConfig(): Partial<\n IgniterAgentConfig<\n TAgentName,\n TAgentModel,\n TAgentInstructions,\n TAgentToolsets,\n TAgentMCPConfigs,\n TAgentContextSchema\n >\n > {\n return { ...this._config };\n }\n\n /**\n * Gets the agent name.\n *\n * @returns The agent's name\n * @public\n */\n getName(): TAgentName {\n return this._config.name as TAgentName;\n }\n}\n\n/* =============================================================================\n * MAIN EXPORT ALIAS\n * ============================================================================= */\n\n/**\n * Alias for IgniterAgentBuilder for cleaner API.\n *\n * @description\n * Use `IgniterAgent.create()` as the primary entry point for building agents.\n *\n * @example\n * ```typescript\n * import { IgniterAgent } from '@igniter-js/agents';\n *\n * const agent = IgniterAgent.create('assistant')\n * .withModel(openai('gpt-4'))\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgent = {\n create: IgniterAgentBuilder.create,\n};\n\n/**\n * Type alias for the IgniterAgent class.\n * @public\n */\nexport type IgniterAgent = typeof IgniterAgentBuilder;\n","/**\n * @fileoverview Toolset Builder for creating custom tool collections.\n * This module provides a fluent API for building toolsets with type safety.\n *\n * @description\n * The IgniterAgentToolsetBuilder allows you to create collections of related\n * tools that can be registered with an agent. Each toolset has a unique name\n * and contains one or more tools that the AI can invoke.\n *\n * @example\n * ```typescript\n * import { IgniterAgentToolsetBuilder, IgniterAgentTool } from '@igniter-js/agents/builders';\n * import { z } from 'zod';\n *\n * const createIssue = IgniterAgentTool\n * .create('createIssue')\n * .withDescription('Creates a new issue in a GitHub repository')\n * .withInput(z.object({\n * repo: z.string().describe('Repository name (owner/repo)'),\n * title: z.string().describe('Issue title'),\n * body: z.string().optional().describe('Issue body')\n * }))\n * .withExecute(async ({ repo, title, body }) => {\n * return await github.createIssue(repo, title, body);\n * })\n * .build();\n *\n * const listRepos = IgniterAgentTool\n * .create('listRepos')\n * .withDescription('Lists repositories for a user')\n * .withInputect({\n * username: z.string().describe('GitHub username')\n * }))\n * .withExecute(async ({ username }) => {\n * return await github.listRepos(username);\n * })\n * .build();\n *\n * const githubToolset = IgniterAgentToolsetBuilder\n * .create('github')\n * .addTool(createIssue)\n * .addTool(listRepos)\n * .build();\n * ```\n *\n * @module builders/toolset\n * @packageDocumentation\n */\n\nimport { tool, type Tool, type ToolSet } from \"ai\";\n\nimport type {\n IgniterAgentToolset as IgniterAgentToolsetType,\n IgniterAgentToolsetParams,\n IgniterAgentToolResult,\n} from \"../types\";\n\nimport type {\n IgniterAgentBuiltTool,\n IgniterAgentBuiltToolset,\n} from \"../types/builder\";\n\nimport { IgniterAgentConfigError } from \"../errors\";\n\n/* =============================================================================\n * TOOLSET BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for creating custom toolsets.\n *\n * @description\n * The IgniterAgentToolsetBuilder provides a type-safe fluent API for creating\n * collections of related tools. Tools are wrapped with error handling and\n * result normalization to ensure consistent behavior.\n *\n * **Key Features:**\n * - Fluent chainable API\n * - Full TypeScript type inference for tool parameters\n * - Automatic error handling and result wrapping\n * - Tool execution logging\n *\n * @typeParam TToolsetName - The unique name for this toolset\n * @typeParam TTools - The accumulated tools collection type\n *\n * @example\n * ```typescript\n * // Create tools\n * const getCurrent = IgniterAgentTool\n * .create('getCurrent')\n * .withDescription('Gets current weather for a location')\n * .withInputect({\n * city: z.string(),\n * units: z.enum(['celsius', 'fahrenheit']).default('celsius')\n * }))\n * .withExecute(async ({ city, units }) => {\n * const weather = await weatherApi.getCurrent(city, units);\n * return {\n * temperature: weather.temp,\n * conditions: weather.description,\n * humidity: weather.humidity\n * };\n * })\n * .build();\n *\n * const getForecast = IgniterAgentTool\n * .create('getForecast')\n * .withDescription('Gets 5-day weather forecast')\n * .withInputect({\n * city: z.string(),\n * days: z.number().min(1).max(7).default(5)\n * }))\n * .withExecute(async ({ city, days }) => {\n * return await weatherApi.getForecast(city, days);\n * })\n * .build();\n *\n * // Create a toolset with multiple tools\n * const weatherToolset = IgniterAgentToolsetBuilder\n * .create('weather')\n * .addTool(getCurrent)\n * .addTool(getForecast)\n * .build();\n *\n * // Register with an agent\n * const agent = IgniterAgent.create('assistant')\n * .addToolset(weatherToolset)\n * .build();\n * ```\n *\n * @public\n */\nexport class IgniterAgentToolsetBuilder<\n TToolsetName extends string = string,\n TTools extends ToolSet = Record<string, never>,\n> {\n /**\n * The toolset's unique name.\n * @internal\n */\n private readonly _name: TToolsetName;\n\n /**\n * The accumulated tools collection.\n * @internal\n */\n private readonly _tools: TTools;\n\n /**\n * Creates a new IgniterAgentToolsetBuilder instance.\n *\n * @param params - The toolset name and initial tools\n * @internal\n */\n constructor(params: IgniterAgentToolsetParams<TToolsetName, TTools>) {\n this._name = params.name;\n this._tools = params.tools;\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new toolset builder with the given name.\n *\n * @description\n * This is the primary entry point for creating a new toolset.\n * The name must be unique within an agent and is used as a prefix\n * for tool names when the toolset is registered.\n *\n * @typeParam TName - The toolset name type\n * @param name - Unique name for the toolset\n * @returns A new IgniterAgentToolsetBuilder instance\n *\n * @example\n * ```typescript\n * const tool = IgniterAgentTool\n * .create('doSomething')\n * .withDescription('Does something')\n * .withInputect({}))\n * .withExecute(async () => ({ ok: true }))\n * .build();\n *\n * const toolset = IgniterAgentToolset\n * .create('myTools')\n * .addTool(tool)\n * .build();\n * ```\n *\n * @public\n */\n static create<TName extends string>(\n name: TName,\n ): IgniterAgentToolsetBuilder<TName, {}> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Toolset name is required and must be a non-empty string\",\n field: \"name\",\n });\n }\n\n return new IgniterAgentToolsetBuilder<TName, Record<string, never>>({\n name,\n tools: {} as Record<string, never>,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Changes the toolset name.\n *\n * @description\n * Allows renaming the toolset during the building process.\n * This creates a new builder instance with the new name.\n *\n * @typeParam TNewName - The new name type\n * @param name - The new name for the toolset\n * @returns A new builder with the updated name\n *\n * @example\n * ```typescript\n * const toolset = IgniterAgentToolset\n * .create('temp')\n * .withName('production') // Rename to 'production'\n * .addTool(myTool)\n * .build();\n * ```\n *\n * @public\n */\n withName<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentToolsetBuilder<TNewName, TTools> {\n return new IgniterAgentToolsetBuilder<TNewName, TTools>({\n name,\n tools: this._tools,\n });\n }\n\n /**\n * Adds a tool to the toolset.\n *\n * @description\n * Adds a built tool definition to the toolset. The tool is automatically\n * wrapped with error handling that returns a consistent result format\n * (`{ success: true, data: ... }` or `{ success: false, error: ... }`).\n *\n * @typeParam TToolName - The tool name type\n * @param dto - The built tool definition\n * @returns A new builder with the tool added\n *\n * @example\n * ```typescript\n * const greetTool = IgniterAgentTool.create('greet')\n * .withDescription('Greets a user')\n * .withInputect({ name: z.string() }))\n * .withExecute(async ({ name }) => `Hello, ${name}!`)\n * .build();\n *\n * const toolset = IgniterAgentToolset.create('utils')\n * .addTool(greetTool)\n * .build();\n * ```\n *\n * @public\n */\n addTool<TTool extends IgniterAgentBuiltTool<any, any, any>>(\n dto: TTool,\n ): IgniterAgentToolsetBuilder<\n TToolsetName,\n TTools & { [K in TTool['$Infer']['Name']]: Tool<TTool['$Infer']['Input'], TTool['$Infer']['Output']> }\n > {\n if (!dto.name || typeof dto.name !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Tool name is required and must be a non-empty string\",\n field: \"name\",\n metadata: { toolset: this._name },\n });\n }\n\n // Wrap the tool with error handling\n const wrappedTool = tool({\n description: dto.description,\n inputSchema: dto.inputSchema,\n outputSchema: dto.outputSchema,\n execute: async (params, options) => {\n // If no execute function, return error\n if (!dto.execute) {\n const result: IgniterAgentToolResult<undefined> = {\n success: false,\n error: `Tool '${dto.name}' has no execute method`,\n };\n \n return result;\n }\n\n try {\n // Execute the tool and wrap result\n const response = await dto.execute(params, options as any);\n const result: IgniterAgentToolResult<typeof response> = {\n success: true,\n data: response,\n };\n return result;\n } catch (error) {\n // Log and return error\n console.error(\n `[IgniterAgent] Error executing tool '${dto.name}':`,\n error,\n );\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n const result: IgniterAgentToolResult<undefined> = {\n success: false,\n error: errorMessage,\n };\n return result;\n }\n },\n });\n\n // Return new builder with the tool added\n return new IgniterAgentToolsetBuilder<\n TToolsetName,\n TTools & { [K in TTool['name']]: Tool }\n >({\n name: this._name,\n tools: {\n ...this._tools,\n [dto.name]: wrappedTool,\n } as TTools & { [K in TTool['$Infer']['Name']]: Tool<TTool['$Infer']['Input'], TTool['$Infer']['Output']> },\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed toolset.\n *\n * @description\n * Finalizes the toolset configuration and returns an object that can\n * be registered with an agent using `addToolset()`.\n *\n * The returned object includes:\n * - `name`: The toolset's unique identifier\n * - `type`: Always `'custom'` for user-defined toolsets\n * - `status`: Always `'connected'` for custom toolsets\n * - `tools`: The tools collection\n * - `toolset`: Reference to the raw tools object\n *\n * @returns The completed toolset configuration\n *\n * @example\n * ```typescript\n * const toolset = IgniterAgentToolset\n * .create('utils')\n * .addTool(formatDateTool)\n * .addTool(parseJsonTool)\n * .build();\n *\n * console.log(toolset.name); // 'utils'\n * console.log(toolset.type); // 'custom'\n * console.log(toolset.status); // 'connected'\n * console.log(Object.keys(toolset.tools)); // ['formatDate', 'parseJSON']\n * ```\n *\n * @public\n */\n build(): IgniterAgentBuiltToolset<TToolsetName, TTools> {\n return {\n type: \"custom\" as const,\n name: this._name,\n toolset: this._tools,\n status: \"connected\" as const,\n tools: this._tools,\n $Infer: {} as {\n Name: TToolsetName;\n Tools: TTools;\n }\n };\n }\n\n /* ---------------------------------------------------------------------------\n * ACCESSORS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets the current toolset name.\n *\n * @returns The toolset's name\n * @public\n */\n getName(): TToolsetName {\n return this._name;\n }\n\n /**\n * Gets the current tools collection.\n *\n * @returns The tools object\n * @public\n */\n getTools(): TTools {\n return this._tools;\n }\n\n /**\n * Gets the number of tools in the toolset.\n *\n * @returns The tool count\n * @public\n */\n getToolCount(): number {\n return Object.keys(this._tools).length;\n }\n}\n\n/* =============================================================================\n * FACTORY FUNCTION\n * ============================================================================= */\n\n/**\n * Factory function to create a new toolset builder.\n *\n * @description\n * Convenience function that wraps `IgniterAgentToolsetBuilder.create()`.\n * Useful for more concise code or functional programming patterns.\n *\n * @typeParam TName - The toolset name type\n * @param name - Unique name for the toolset\n * @returns A new IgniterAgentToolsetBuilder instance\n *\n * @example\n * ```typescript\n * import { IgniterAgentToolset, IgniterAgentTool } from '@igniter-js/agents';\n *\n * const sayHello = IgniterAgentTool\n * .create('sayHello')\n * .withDescription('Says hello')\n * .withInputect({ name: z.string() }))\n * .withExecute(async ({ name }) => `Hello, ${name}!`)\n * .build();\n *\n * const myToolset = IgniterAgentToolset.create('myTools')\n * .addTool(sayHello)\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgentToolset = {\n create: IgniterAgentToolsetBuilder.create,\n}; \n","/**\n * @fileoverview Tool Builder for creating individual tool definitions.\n * This module provides a fluent API for building single tools with type safety.\n *\n * @description\n * The IgniterAgentToolBuilder allows you to define a single tool using a\n * fluent builder pattern. The resulting tool definition can be added to a\n * toolset builder for registration with an agent.\n *\n * @example\n * ```typescript\n * import { IgniterAgentTool } from '@igniter-js/agents';\n * import { z } from 'zod';\n *\n * const greetTool = IgniterAgentTool\n * .create('greet')\n * .withDescription('Greets a user by name')\n * .withInput(z.object({ name: z.string() }))\n * .withExecute(async ({ name }) => `Hello, ${name}!`)\n * .build();\n * ```\n *\n * @module builders/tool\n * @packageDocumentation\n */\n\nimport type { z } from \"zod\";\n\nimport type {\n IgniterAgentBuiltTool,\n IgniterAgentToolExecuteOptions,\n} from \"../types\";\n\nimport { IgniterAgentConfigError } from \"../errors\";\n\n/* =============================================================================\n * TOOL BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for creating a single tool definition.\n *\n * @description\n * The IgniterAgentToolBuilder provides a type-safe fluent API for defining\n * a tool's metadata, input schema, and execution handler.\n *\n * @typeParam TName - The tool's unique name\n * @typeParam TInputSchema - The tool parameters type\n * @typeParam TOutputSchema - The tool result type\n *\n * @public\n */\nexport class IgniterAgentToolBuilder<\n TName extends string = string,\n TInputSchema = unknown,\n TOutputSchema = undefined,\n TExecute extends (\n params: TInputSchema,\n options: IgniterAgentToolExecuteOptions\n ) => \n Promise<unknown>\n = any\n> {\n /**\n * The accumulated tool definition.\n * @internal\n */\n private readonly _definition: Partial<\n IgniterAgentBuiltTool<TName, TInputSchema, TOutputSchema>\n >;\n\n /**\n * Creates a new IgniterAgentToolBuilder instance.\n *\n * @param name - The tool name\n * @param definition - Partial tool definition\n * @internal\n */\n private constructor(\n definition: Partial<IgniterAgentBuiltTool<TName, TInputSchema, TOutputSchema>> = {},\n ) {\n this._definition = definition;\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new tool builder with the given name.\n *\n * @description\n * The name must be unique within a toolset.\n *\n * @typeParam TNewName - The tool name type\n * @param name - Unique name for the tool\n * @returns A new IgniterAgentToolBuilder instance\n *\n * @public\n */\n static create<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentToolBuilder<TNewName, unknown, unknown> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Tool name is required and must be a non-empty string\",\n field: \"name\",\n });\n }\n\n return new IgniterAgentToolBuilder<TNewName, unknown, unknown, any>({\n name,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * BUILDER METHODS\n * --------------------------------------------------------------------------- */\n /**\n * Sets the tool description.\n *\n * @param description - Human-readable description shown to the AI\n * @returns A new builder with the description set\n *\n * @public\n */\n withDescription(\n description: string,\n ): IgniterAgentToolBuilder<TName, TInputSchema, TOutputSchema> {\n if (!description || typeof description !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Tool description is required and must be a non-empty string\",\n field: \"description\",\n metadata: { tool: this._definition.name },\n });\n }\n\n return new IgniterAgentToolBuilder<TName, TInputSchema, TOutputSchema, TExecute>({\n ...this._definition,\n description,\n });\n }\n\n /**\n * Sets the tool parameters schema.\n *\n * @typeParam TNewParams - The new parameters type\n * @param parameters - Zod schema defining input parameters\n * @returns A new builder with the parameters set\n *\n * @public\n */\n withInput<TNewParams>(\n inputSchema: z.ZodSchema<TNewParams>,\n ): IgniterAgentToolBuilder<TName, TNewParams, TOutputSchema> {\n if (!inputSchema) {\n throw new IgniterAgentConfigError({\n message: \"Tool parameters schema is required\",\n field: \"parameters\",\n metadata: { tool: this._definition.name },\n });\n }\n\n type TNewExecute = (\n params: TNewParams,\n options: IgniterAgentToolExecuteOptions\n ) => \n TOutputSchema extends undefined ? Promise<unknown> : Promise<TOutputSchema>;\n\n return new IgniterAgentToolBuilder<TName, TNewParams, TOutputSchema, TNewExecute>({\n ...this._definition,\n inputSchema,\n } as Partial<IgniterAgentBuiltTool<TName, TNewParams, TOutputSchema, TNewExecute>>);\n }\n\n /**\n * Sets the tool output schema.\n *\n * @typeParam TNewResult - The new result type\n * @param outputSchema - Zod schema defining the tool's output\n * @returns A new builder with the output schema set\n *\n * @public\n */\n withOutput<TNewResult>(\n outputSchema: z.ZodSchema<TNewResult>,\n ): IgniterAgentToolBuilder<TName, TInputSchema, TNewResult> {\n if (!outputSchema) {\n throw new IgniterAgentConfigError({\n message: \"Tool output schema is required\",\n field: \"outputSchema\",\n metadata: { tool: this._definition.name },\n });\n }\n\n type TNewExecute = (\n params: TInputSchema,\n options: IgniterAgentToolExecuteOptions\n ) => \n TNewResult extends undefined ? Promise<unknown> : Promise<TNewResult>;\n\n return new IgniterAgentToolBuilder<TName, TInputSchema, TNewResult, TNewExecute>({\n ...this._definition,\n outputSchema,\n } as Partial<IgniterAgentBuiltTool<TName, TInputSchema, TNewResult, TNewExecute>>);\n } \n\n /**\n * Sets the tool execution handler.\n *\n * @typeParam TNewResult - The new result type\n * @param execute - Function that performs the tool's logic\n * @returns A new builder with the execute handler set\n *\n * @public\n */\n withExecute<\n TNewExecute extends (\n params: TInputSchema,\n options: IgniterAgentToolExecuteOptions\n ) =>\n TOutputSchema extends undefined ? Promise<unknown> : Promise<TOutputSchema>,\n TNewResult = Awaited<ReturnType<TNewExecute>>\n >(\n execute: TNewExecute,\n ): IgniterAgentToolBuilder<TName, TInputSchema, TNewResult, TNewExecute> {\n if (typeof execute !== \"function\") {\n throw new IgniterAgentConfigError({\n message: \"Tool execute handler must be a function\",\n field: \"execute\",\n metadata: { tool: this._definition.name },\n });\n }\n\n // @ts-expect-error - TypeScript cannot infer the new result type here\n return new IgniterAgentToolBuilder<TName, TInputSchema, TNewResult, TExecute>({\n ...this._definition,\n execute,\n } as Partial<IgniterAgentBuiltTool<TName, TInputSchema, TNewResult, TExecute>>);\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed tool definition.\n *\n * @returns The completed tool definition with its name\n *\n * @public\n */\n build(): IgniterAgentBuiltTool<TName, TInputSchema, TOutputSchema> {\n const { name, description, inputSchema, outputSchema, execute } = this._definition;\n\n if (!name) {\n throw new IgniterAgentConfigError({\n message: \"Tool name is required before building\",\n field: \"name\",\n });\n }\n\n if (!description) {\n throw new IgniterAgentConfigError({\n message: \"Tool description is required before building\",\n field: \"description\",\n metadata: { tool: this._definition.name },\n });\n }\n\n if (!inputSchema) {\n throw new IgniterAgentConfigError({\n message: \"Tool parameters schema is required before building\",\n field: \"parameters\",\n metadata: { tool: this._definition.name },\n });\n }\n\n if (!execute) {\n throw new IgniterAgentConfigError({\n message: \"Tool execute handler is required before building\",\n field: \"execute\",\n metadata: { tool: this._definition.name },\n });\n }\n\n return {\n name,\n description,\n inputSchema,\n outputSchema,\n execute,\n $Infer: {} as {\n Name: TName;\n Description: string;\n Input: TInputSchema;\n Output: TOutputSchema;\n }\n };\n }\n}\n\n/* =============================================================================\n * FACTORY FUNCTION\n * ============================================================================= */\n\n/**\n * Factory function to create a new tool builder.\n *\n * @description\n * Convenience function that wraps `IgniterAgentTool.create('toolName')`.\n *\n * @typeParam TName - The tool name type\n * @param name - Unique name for the tool\n * @returns A new IgniterAgentToolBuilder instance\n *\n * @public\n */\nexport const IgniterAgentTool = {\n create: IgniterAgentToolBuilder.create,\n}\n","/**\n * @fileoverview MCP (Model Context Protocol) Client Builder.\n * This module provides a fluent API for configuring MCP server connections.\n *\n * @description\n * The IgniterAgentMCPBuilder allows you to configure connections to MCP servers\n * using either stdio (local process) or HTTP (remote server) transport.\n *\n * MCP servers provide tools that the agent can invoke, similar to custom toolsets,\n * but the tools are hosted externally and discovered at runtime.\n *\n * @see {@link https://modelcontextprotocol.io/ | Model Context Protocol}\n *\n * @example\n * ```typescript\n * import { IgniterAgentMCPBuilder } from '@igniter-js/agents/builders';\n *\n * // Configure a stdio MCP server (local process)\n * const filesystemMCP = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .withEnv({ DEBUG: 'true' })\n * .build();\n *\n * // Configure an HTTP MCP server (remote)\n * const remoteMCP = IgniterAgentMCPBuilder\n * .create('remote-tools')\n * .withType('http')\n * .withURL('https://mcp.example.com/api')\n * .withHeaders({ 'Authorization': 'Bearer token123' })\n * .build();\n * ```\n *\n * @module builders/mcp\n * @packageDocumentation\n */\n\nimport type {\n IgniterAgentToolsetType,\n IgniterAgentMCPStdioConfig,\n IgniterAgentMCPHttpConfig,\n IgniterAgentMCPConfigUnion,\n IgniterAgentMCPClientInterface,\n} from \"../types\";\n\nimport {\n IgniterAgentConfigError,\n IgniterAgentMCPError,\n IgniterAgentErrorCode,\n} from \"../errors\";\n\n/* =============================================================================\n * MCP BUILDER CLASS\n * ============================================================================= */\n\n/**\n * Fluent builder for configuring MCP server connections.\n *\n * @description\n * The IgniterAgentMCPBuilder provides a type-safe fluent API for creating\n * MCP server configurations. The builder adapts its available methods based\n * on the transport type selected.\n *\n * **Transport Types:**\n * - `stdio`: For local MCP servers running as child processes\n * - `http`: For remote MCP servers accessed over HTTP/HTTPS\n *\n * **Key Features:**\n * - Type-safe configuration based on transport type\n * - Validation of required fields\n * - Environment variable support for stdio\n * - Header support for HTTP authentication\n *\n * @typeParam TType - The transport type ('stdio' | 'http')\n * @typeParam TName - The unique configuration name\n *\n * @example\n * ```typescript\n * // Stdio transport (local process)\n * const localMCP = IgniterAgentMCPBuilder\n * .create('github')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-github'])\n * .withEnv({ GITHUB_TOKEN: process.env.GITHUB_TOKEN! })\n * .build();\n *\n * // HTTP transport (remote server)\n * const remoteMCP = IgniterAgentMCPBuilder\n * .create('opencode')\n * .withType('http')\n * .withURL('https://sandbox.example.com/mcp')\n * .withHeaders({\n * 'X-API-Key': process.env.API_KEY!,\n * 'Content-Type': 'application/json'\n * })\n * .build();\n *\n * // Register with an agent\n * const agent = IgniterAgent.create('my-agent')\n * .addMCP(localMCP)\n * .addMCP(remoteMCP)\n * .build();\n * ```\n *\n * @public\n */\nexport class IgniterAgentMCPBuilder<\n TType extends IgniterAgentToolsetType = IgniterAgentToolsetType,\n TName extends string = string,\n> {\n /**\n * The configuration being built.\n * @internal\n */\n private readonly _config: Partial<IgniterAgentMCPConfigUnion<TName>>;\n\n /**\n * Creates a new IgniterAgentMCPBuilder instance.\n *\n * @param config - Initial configuration\n * @internal\n */\n private constructor(config: Partial<IgniterAgentMCPConfigUnion<TName>> = {}) {\n this._config = config;\n }\n\n /* ---------------------------------------------------------------------------\n * STATIC FACTORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Creates a new MCP builder with the given name.\n *\n * @description\n * This is the primary entry point for creating an MCP configuration.\n * The name must be unique within an agent and is used to identify\n * the MCP server and its tools.\n *\n * After calling `create()`, you must call `withType()` to specify\n * the transport type before configuring transport-specific options.\n *\n * @typeParam TNewName - The configuration name type\n * @param name - Unique name for the MCP configuration\n * @returns A new IgniterAgentMCPBuilder instance\n *\n * @example\n * ```typescript\n * const mcpConfig = IgniterAgentMCPBuilder\n * .create('my-mcp')\n * .withType('stdio') // or 'http'\n * .withCommand('...') // available after withType('stdio')\n * .build();\n * ```\n *\n * @public\n */\n static create<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentMCPBuilder<IgniterAgentToolsetType, TNewName> {\n if (!name || typeof name !== \"string\") {\n throw new IgniterAgentConfigError({\n message:\n \"MCP configuration name is required and must be a non-empty string\",\n field: \"name\",\n });\n }\n\n return new IgniterAgentMCPBuilder<IgniterAgentToolsetType, TNewName>({\n name,\n });\n }\n\n /* ---------------------------------------------------------------------------\n * COMMON BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the configuration name.\n *\n * @description\n * Allows changing the configuration name during the building process.\n *\n * @typeParam TNewName - The new name type\n * @param name - The new name for the configuration\n * @returns A new builder with the updated name\n *\n * @public\n */\n withName<TNewName extends string>(\n name: TNewName,\n ): IgniterAgentMCPBuilder<TType, TNewName> {\n return new IgniterAgentMCPBuilder<TType, TNewName>({\n ...this._config,\n name,\n } as Partial<IgniterAgentMCPConfigUnion<TNewName>>);\n }\n\n /**\n * Sets the transport type for the MCP connection.\n *\n * @description\n * Specifies how the agent will communicate with the MCP server:\n * - `stdio`: Spawns a local process and communicates via stdin/stdout\n * - `http`: Connects to a remote server via HTTP/HTTPS\n *\n * After calling this method, transport-specific methods become available:\n * - For `stdio`: `withCommand()`, `withArgs()`, `withEnv()`\n * - For `http`: `withURL()`, `withHeaders()`\n *\n * @typeParam TNewType - The transport type\n * @param type - The transport type to use\n * @returns A new builder configured for the specified transport\n *\n * @example\n * ```typescript\n * // Stdio transport\n * const stdioConfig = IgniterAgentMCPBuilder\n * .create('local')\n * .withType('stdio')\n * .withCommand('python')\n * .withArgs(['mcp_server.py'])\n * .build();\n *\n * // HTTP transport\n * const httpConfig = IgniterAgentMCPBuilder\n * .create('remote')\n * .withType('http')\n * .withURL('https://api.example.com/mcp')\n * .build();\n * ```\n *\n * @public\n */\n withType<TNewType extends IgniterAgentToolsetType>(\n type: TNewType,\n ): IgniterAgentMCPBuilder<TNewType, TName> {\n if (type !== \"stdio\" && type !== \"http\") {\n throw new IgniterAgentConfigError({\n message: `Invalid MCP transport type: '${type}'. Must be 'stdio' or 'http'`,\n field: \"type\",\n metadata: { validTypes: [\"stdio\", \"http\"] },\n });\n }\n\n return new IgniterAgentMCPBuilder<TNewType, TName>({\n ...this._config,\n type,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /* ---------------------------------------------------------------------------\n * STDIO-SPECIFIC BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the command to execute for stdio transport.\n *\n * @description\n * Specifies the executable to run when starting the MCP server process.\n * Common values include `npx`, `node`, `python`, `deno`, etc.\n *\n * @param command - The command to execute\n * @returns A new builder with the command set\n * @throws {IgniterAgentConfigError} If transport type is not 'stdio'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem'])\n * .build();\n * ```\n *\n * @public\n */\n withCommand(command: string): IgniterAgentMCPBuilder<TType, TName> {\n this._assertStdioType(\"withCommand\");\n\n if (!command || typeof command !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"Command is required and must be a non-empty string\",\n field: \"command\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n command,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /**\n * Sets the arguments to pass to the command.\n *\n * @description\n * Specifies command-line arguments for the MCP server process.\n *\n * @param args - Array of command arguments\n * @returns A new builder with the arguments set\n * @throws {IgniterAgentConfigError} If transport type is not 'stdio'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs([\n * '-y',\n * '@modelcontextprotocol/server-filesystem',\n * '/home/user/documents',\n * '--read-only'\n * ])\n * .build();\n * ```\n *\n * @public\n */\n withArgs(args: string[]): IgniterAgentMCPBuilder<TType, TName> {\n this._assertStdioType(\"withArgs\");\n\n if (!Array.isArray(args)) {\n throw new IgniterAgentConfigError({\n message: \"Args must be an array of strings\",\n field: \"args\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n args,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /**\n * Sets environment variables for the command process.\n *\n * @description\n * Specifies environment variables to pass to the MCP server process.\n * Useful for passing API keys, configuration, or feature flags.\n *\n * @param env - Record of environment variable names to values\n * @returns A new builder with the environment variables set\n * @throws {IgniterAgentConfigError} If transport type is not 'stdio'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('github')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-github'])\n * .withEnv({\n * GITHUB_TOKEN: process.env.GITHUB_TOKEN!,\n * GITHUB_ORG: 'my-organization',\n * DEBUG: 'mcp:*'\n * })\n * .build();\n * ```\n *\n * @public\n */\n withEnv(env: Record<string, string>): IgniterAgentMCPBuilder<TType, TName> {\n this._assertStdioType(\"withEnv\");\n\n if (!env || typeof env !== \"object\") {\n throw new IgniterAgentConfigError({\n message: \"Env must be an object mapping variable names to values\",\n field: \"env\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n env,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /* ---------------------------------------------------------------------------\n * HTTP-SPECIFIC BUILDER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Sets the URL for HTTP transport.\n *\n * @description\n * Specifies the endpoint URL for the remote MCP server.\n * Must be a valid HTTP or HTTPS URL.\n *\n * @param url - The MCP server URL\n * @returns A new builder with the URL set\n * @throws {IgniterAgentConfigError} If transport type is not 'http' or URL is invalid\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('opencode')\n * .withType('http')\n * .withURL('https://sandbox.example.com/mcp/v1')\n * .build();\n * ```\n *\n * @public\n */\n withURL(url: string): IgniterAgentMCPBuilder<TType, TName> {\n this._assertHttpType(\"withURL\");\n\n if (!url || typeof url !== \"string\") {\n throw new IgniterAgentConfigError({\n message: \"URL is required and must be a non-empty string\",\n field: \"url\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n // Validate URL format\n try {\n new URL(url);\n } catch {\n throw new IgniterAgentConfigError({\n message: `Invalid URL format: '${url}'`,\n field: \"url\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n url,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /**\n * Sets HTTP headers for requests to the MCP server.\n *\n * @description\n * Specifies headers to include in all HTTP requests to the MCP server.\n * Commonly used for authentication, API keys, or content type.\n *\n * @param headers - Record of header names to values\n * @returns A new builder with the headers set\n * @throws {IgniterAgentConfigError} If transport type is not 'http'\n *\n * @example\n * ```typescript\n * const config = IgniterAgentMCPBuilder\n * .create('authenticated-mcp')\n * .withType('http')\n * .withURL('https://api.example.com/mcp')\n * .withHeaders({\n * 'Authorization': `Bearer ${process.env.API_TOKEN}`,\n * 'X-Client-ID': 'my-app',\n * 'Content-Type': 'application/json'\n * })\n * .build();\n * ```\n *\n * @public\n */\n withHeaders(\n headers: Record<string, string>,\n ): IgniterAgentMCPBuilder<TType, TName> {\n this._assertHttpType(\"withHeaders\");\n\n if (!headers || typeof headers !== \"object\") {\n throw new IgniterAgentConfigError({\n message: \"Headers must be an object mapping header names to values\",\n field: \"headers\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return new IgniterAgentMCPBuilder<TType, TName>({\n ...this._config,\n headers,\n } as Partial<IgniterAgentMCPConfigUnion<TName>>);\n }\n\n /* ---------------------------------------------------------------------------\n * BUILD METHOD\n * --------------------------------------------------------------------------- */\n\n /**\n * Builds and returns the completed MCP configuration.\n *\n * @description\n * Validates the configuration and returns a typed configuration object\n * that can be registered with an agent using `addMCP()`.\n *\n * @returns The completed MCP configuration\n * @throws {IgniterAgentConfigError} If required fields are missing\n *\n * @example\n * ```typescript\n * const mcpConfig = IgniterAgentMCPBuilder\n * .create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .build();\n *\n * // Use with an agent\n * const agent = IgniterAgent.create()\n * .addMCP(mcpConfig)\n * .build();\n * ```\n *\n * @public\n */\n build(): TType extends \"stdio\"\n ? IgniterAgentMCPStdioConfig<TName>\n : TType extends \"http\"\n ? IgniterAgentMCPHttpConfig<TName>\n : IgniterAgentMCPConfigUnion<TName> {\n // Validate required fields\n if (!this._config.name) {\n throw new IgniterAgentConfigError({\n message: \"MCP configuration name is required\",\n field: \"name\",\n });\n }\n\n if (!this._config.type) {\n throw new IgniterAgentConfigError({\n message:\n 'MCP transport type is required. Call withType(\"stdio\") or withType(\"http\")',\n field: \"type\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n // Validate stdio-specific requirements\n if (this._config.type === \"stdio\") {\n const config = this._config as Partial<IgniterAgentMCPStdioConfig<TName>>;\n\n if (!config.command) {\n throw new IgniterAgentConfigError({\n message: \"Command is required for stdio transport\",\n field: \"command\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n if (!config.args) {\n throw new IgniterAgentConfigError({\n message: \"Args are required for stdio transport\",\n field: \"args\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n return {\n type: \"stdio\",\n name: config.name!,\n command: config.command,\n args: config.args,\n env: config.env,\n } as TType extends \"stdio\" ? IgniterAgentMCPStdioConfig<TName> : never;\n }\n\n // Validate http-specific requirements\n if (this._config.type === \"http\") {\n const config = this._config as Partial<IgniterAgentMCPHttpConfig<TName>>;\n\n if (!config.url) {\n throw new IgniterAgentConfigError({\n message: \"URL is required for http transport\",\n field: \"url\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n // @ts-expect-error - headers are optional\n return {\n type: \"http\",\n name: config.name,\n url: config.url,\n headers: config.headers,\n } as TType extends \"http\" ? IgniterAgentMCPHttpConfig<TName> : never;\n }\n\n throw new IgniterAgentConfigError({\n message: `Invalid transport type: '${this._config.type}'`,\n field: \"type\",\n metadata: { mcpName: this._config.name },\n });\n }\n\n /* ---------------------------------------------------------------------------\n * PRIVATE HELPER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Asserts that the current transport type is 'stdio'.\n * @internal\n */\n private _assertStdioType(methodName: string): void {\n if (this._config.type !== \"stdio\") {\n throw new IgniterAgentConfigError({\n message:\n `${methodName}() is only available for stdio transport. ` +\n `Current type: '${this._config.type || \"not set\"}'. ` +\n `Call withType('stdio') first.`,\n field: \"type\",\n metadata: { mcpName: this._config.name, operation: methodName },\n });\n }\n }\n\n /**\n * Asserts that the current transport type is 'http'.\n * @internal\n */\n private _assertHttpType(methodName: string): void {\n if (this._config.type !== \"http\") {\n throw new IgniterAgentConfigError({\n message:\n `${methodName}() is only available for http transport. ` +\n `Current type: '${this._config.type || \"not set\"}'. ` +\n `Call withType('http') first.`,\n field: \"type\",\n metadata: { mcpName: this._config.name, operation: methodName },\n });\n }\n }\n}\n\n/* =============================================================================\n * FACTORY FUNCTION\n * ============================================================================= */\n\n/**\n * Factory function to create a new MCP builder.\n *\n * @description\n * Convenience function that wraps `IgniterAgentMCPBuilder.create()`.\n *\n * @typeParam TName - The configuration name type\n * @param name - Unique name for the MCP configuration\n * @returns A new IgniterAgentMCPBuilder instance\n *\n * @example\n * ```typescript\n * import { IgniterAgentMCPClient } from '@igniter-js/agents';\n *\n * const filesystemMCP = IgniterAgentMCPClient.create('filesystem')\n * .withType('stdio')\n * .withCommand('npx')\n * .withArgs(['-y', '@modelcontextprotocol/server-filesystem', '/tmp'])\n * .build();\n * ```\n *\n * @public\n */\nexport const IgniterAgentMCPClient = {\n create: IgniterAgentMCPBuilder.create,\n}\n","/**\n * @fileoverview In-memory adapter for IgniterAgent memory storage.\n * This module provides a simple in-memory implementation of the memory provider.\n * \n * @description\n * The IgniterAgentInMemoryAdapter stores all data in JavaScript Maps,\n * making it ideal for:\n * - Development and testing\n * - Short-lived applications\n * - Prototyping\n * - Demos\n * \n * **Important:** Data is lost when the process restarts. For production use,\n * consider using a persistent adapter like Redis or PostgreSQL.\n * \n * @example\n * ```typescript\n * import { IgniterAgentInMemoryAdapter } from '@igniter-js/agents/adapters';\n * \n * // Create adapter\n * const adapter = new IgniterAgentInMemoryAdapter({\n * namespace: 'myapp',\n * debug: true\n * });\n * \n * // Use with memory config\n * const memoryConfig: IgniterAgentMemoryConfig = {\n * provider: adapter,\n * working: { enabled: true, scope: 'chat' },\n * history: { enabled: true, limit: 100 }\n * };\n * ```\n * \n * @module adapters/memory\n * @packageDocumentation\n */\n\nimport type {\n IgniterAgentMemoryProvider,\n IgniterAgentWorkingMemory,\n IgniterAgentConversationMessage,\n IgniterAgentChatSession,\n IgniterAgentWorkingMemoryParams,\n IgniterAgentUpdateWorkingMemoryParams,\n IgniterAgentGetMessagesParams,\n IgniterAgentGetChatsParams,\n IgniterAgentInMemoryAdapterOptions,\n IgniterAgentMemoryAdapter,\n IgniterAgentAdapterStats,\n} from \"../types\";\n\n/* =============================================================================\n * IN-MEMORY ADAPTER CLASS\n * ============================================================================= */\n\n/**\n * In-memory implementation of the IgniterAgent memory provider.\n * \n * @description\n * Stores all memory data in JavaScript Maps. Provides a complete implementation\n * of the memory provider interface for development and testing purposes.\n * \n * **Features:**\n * - Full implementation of all memory provider methods\n * - Optional message/chat limits to control memory usage\n * - Debug logging\n * - Namespace support for multi-tenant applications\n * \n * **Limitations:**\n * - Data is not persisted across process restarts\n * - Not suitable for production with high availability requirements\n * - No horizontal scaling support\n * \n * @example\n * ```typescript\n * import { IgniterAgentInMemoryAdapter } from '@igniter-js/agents/adapters';\n * \n * const adapter = new IgniterAgentInMemoryAdapter({\n * namespace: 'test',\n * debug: process.env.NODE_ENV === 'development',\n * maxMessages: 500,\n * maxChats: 50\n * });\n * \n * // Store working memory\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: 'User prefers TypeScript'\n * });\n * \n * // Retrieve working memory\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * console.log(memory?.content); // 'User prefers TypeScript'\n * ```\n * \n * @public\n */\nexport class IgniterAgentInMemoryAdapter implements IgniterAgentMemoryAdapter<IgniterAgentInMemoryAdapterOptions> {\n /**\n * The adapter configuration options.\n */\n public readonly options: Required<IgniterAgentInMemoryAdapterOptions>;\n\n /**\n * Storage for working memory.\n * Key format: `{namespace}:{scope}:{identifier}`\n * @internal\n */\n private readonly _workingMemory: Map<string, IgniterAgentWorkingMemory> = new Map();\n\n /**\n * Storage for conversation messages.\n * Key format: `{namespace}:{chatId}`\n * @internal\n */\n private readonly _messages: Map<string, IgniterAgentConversationMessage[]> = new Map();\n\n /**\n * Storage for chat sessions.\n * Key format: `{namespace}:{chatId}`\n * @internal\n */\n private readonly _chats: Map<string, IgniterAgentChatSession> = new Map();\n\n /**\n * Creates a new IgniterAgentInMemoryAdapter.\n * \n * @param options - Adapter configuration\n * \n * @example\n * ```typescript\n * const adapter = new IgniterAgentInMemoryAdapter({\n * namespace: 'myapp',\n * maxMessages: 1000,\n * maxChats: 100\n * });\n * ```\n */\n constructor(options: IgniterAgentInMemoryAdapterOptions = {}) {\n this.options = {\n namespace: options.namespace ?? 'igniter',\n maxMessages: options.maxMessages ?? 1000,\n maxChats: options.maxChats ?? 100,\n };\n }\n\n /**\n * Factory method to create a new adapter instance.\n * @param options - Adapter configuration\n * @returns A new IgniterAgentInMemoryAdapter instance\n *\n * @example\n * ```typescript\n * const adapter = IgniterAgentInMemoryAdapter.create({\n * namespace: 'test',\n * });\n * ```\n */\n static create(\n options?: IgniterAgentInMemoryAdapterOptions\n ): IgniterAgentInMemoryAdapter {\n return new IgniterAgentInMemoryAdapter(options);\n }\n\n /* ---------------------------------------------------------------------------\n * HELPER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Generates a storage key with namespace prefix.\n * @internal\n */\n private _key(...parts: string[]): string {\n return [this.options.namespace, ...parts].join(':');\n }\n\n /* ---------------------------------------------------------------------------\n * LIFECYCLE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Connects to the storage backend (no-op for in-memory).\n * \n * @description\n * In-memory adapter doesn't require connection setup.\n * This method exists for interface compatibility.\n */\n async connect(): Promise<void> {\n // No-op for in-memory adapter\n }\n\n /**\n * Disconnects from the storage backend (no-op for in-memory).\n * \n * @description\n * In-memory adapter doesn't require disconnection.\n * This method exists for interface compatibility.\n */\n async disconnect(): Promise<void> {\n // No-op for in-memory adapter\n }\n\n /**\n * Checks if the adapter is connected.\n * \n * @returns Always true for in-memory adapter\n */\n isConnected(): boolean {\n return true;\n }\n\n /**\n * Clears all stored data.\n * \n * @description\n * Removes all working memory, messages, and chat sessions.\n * Use with caution.\n * \n * @example\n * ```typescript\n * // Clear all data (useful for testing)\n * await adapter.clear();\n * ```\n */\n async clear(): Promise<void> {\n this._workingMemory.clear();\n this._messages.clear();\n this._chats.clear();\n }\n\n /* ---------------------------------------------------------------------------\n * WORKING MEMORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets working memory for a scope and identifier.\n * \n * @param params - The scope and identifier\n * @returns The working memory or null if not found\n * \n * @example\n * ```typescript\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * if (memory) {\n * console.log('Content:', memory.content);\n * console.log('Updated:', memory.updatedAt);\n * }\n * ```\n */\n async getWorkingMemory(\n params: IgniterAgentWorkingMemoryParams\n ): Promise<IgniterAgentWorkingMemory | null> {\n const key = this._key('memory', params.scope, params.identifier);\n \n return this._workingMemory.get(key) ?? null;\n }\n\n /**\n * Updates working memory for a scope and identifier.\n * \n * @param params - The scope, identifier, and new content\n * \n * @example\n * ```typescript\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: `\n * ## User Preferences\n * - Prefers TypeScript\n * - Uses VS Code\n * `\n * });\n * ```\n */\n async updateWorkingMemory(\n params: IgniterAgentUpdateWorkingMemoryParams\n ): Promise<void> {\n const key = this._key('memory', params.scope, params.identifier);\n \n this._workingMemory.set(key, {\n content: params.content,\n updatedAt: new Date(),\n });\n }\n\n /* ---------------------------------------------------------------------------\n * MESSAGE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves a message to the conversation history.\n * \n * @param message - The message to save\n * \n * @example\n * ```typescript\n * await adapter.saveMessage({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * role: 'user',\n * content: 'How do I use TypeScript?',\n * timestamp: new Date()\n * });\n * ```\n */\n async saveMessage(message: IgniterAgentConversationMessage): Promise<void> {\n const key = this._key('messages', message.chatId);\n \n // Get or create messages array\n let messages = this._messages.get(key);\n if (!messages) {\n messages = [];\n this._messages.set(key, messages);\n }\n \n // Add message\n messages.push(message);\n \n // Enforce max messages limit\n if (messages.length > this.options.maxMessages) {\n messages.splice(0, messages.length - this.options.maxMessages);\n }\n }\n\n /**\n * Gets messages from the conversation history.\n * \n * @typeParam T - The message type to return\n * @param params - Query parameters\n * @returns Array of messages\n * \n * @example\n * ```typescript\n * const messages = await adapter.getMessages({\n * chatId: 'chat_123',\n * limit: 50\n * });\n * \n * for (const msg of messages) {\n * console.log(`[${msg.role}]: ${msg.content}`);\n * }\n * ```\n */\n async getMessages<T = unknown>(\n params: IgniterAgentGetMessagesParams\n ): Promise<T[]> {\n const key = this._key('messages', params.chatId);\n \n let messages = this._messages.get(key) ?? [];\n \n // Filter by userId if provided\n if (params.userId) {\n messages = messages.filter(m => m.userId === params.userId);\n }\n \n // Apply limit\n if (params.limit && params.limit > 0) {\n messages = messages.slice(-params.limit);\n }\n \n // Convert to expected format (extract content)\n return messages.map(m => ({\n id: `${m.chatId}-${m.timestamp.getTime()}`,\n role: m.role,\n content: m.content,\n createdAt: m.timestamp,\n })) as T[];\n }\n\n /* ---------------------------------------------------------------------------\n * CHAT SESSION METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves or updates a chat session.\n * \n * @param chat - The chat session to save\n * \n * @example\n * ```typescript\n * await adapter.saveChat({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * title: 'TypeScript Help',\n * createdAt: new Date(),\n * updatedAt: new Date(),\n * messageCount: 0\n * });\n * ```\n */\n async saveChat(chat: IgniterAgentChatSession): Promise<void> {\n const key = this._key('chats', chat.chatId);\n \n this._chats.set(key, chat);\n \n // Enforce max chats limit\n if (this._chats.size > this.options.maxChats) {\n // Remove oldest chats\n const entries = Array.from(this._chats.entries())\n .sort((a, b) => a[1].updatedAt.getTime() - b[1].updatedAt.getTime());\n \n const toRemove = entries.slice(0, this._chats.size - this.options.maxChats);\n for (const [k] of toRemove) {\n this._chats.delete(k);\n }\n }\n }\n\n /**\n * Gets chat sessions matching the query parameters.\n * \n * @param params - Query parameters\n * @returns Array of chat sessions\n * \n * @example\n * ```typescript\n * const chats = await adapter.getChats({\n * userId: 'user_456',\n * search: 'typescript',\n * limit: 10\n * });\n * \n * for (const chat of chats) {\n * console.log(`${chat.title} (${chat.messageCount} messages)`);\n * }\n * ```\n */\n async getChats(\n params: IgniterAgentGetChatsParams\n ): Promise<IgniterAgentChatSession[]> { \n let chats = Array.from(this._chats.values());\n \n // Filter by userId\n if (params.userId) {\n chats = chats.filter(c => c.userId === params.userId);\n }\n \n // Filter by search term (title)\n if (params.search) {\n const searchLower = params.search.toLowerCase();\n chats = chats.filter(c => \n c.title?.toLowerCase().includes(searchLower)\n );\n }\n \n // Sort by most recent\n chats.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n \n // Apply limit\n if (params.limit && params.limit > 0) {\n chats = chats.slice(0, params.limit);\n }\n \n return chats;\n }\n\n /**\n * Gets a specific chat session by ID.\n * \n * @param chatId - The chat ID\n * @returns The chat session or null if not found\n * \n * @example\n * ```typescript\n * const chat = await adapter.getChat('chat_123');\n * \n * if (chat) {\n * console.log('Title:', chat.title);\n * console.log('Messages:', chat.messageCount);\n * }\n * ```\n */\n async getChat(chatId: string): Promise<IgniterAgentChatSession | null> {\n const key = this._key('chats', chatId);\n \n return this._chats.get(key) ?? null;\n }\n\n /**\n * Updates the title of a chat session.\n * \n * @param chatId - The chat ID\n * @param title - The new title\n * \n * @example\n * ```typescript\n * await adapter.updateChatTitle('chat_123', 'New Title');\n * ```\n */\n async updateChatTitle(chatId: string, title: string): Promise<void> {\n const key = this._key('chats', chatId);\n \n const chat = this._chats.get(key);\n if (chat) {\n chat.title = title;\n chat.updatedAt = new Date();\n }\n }\n\n /**\n * Deletes a chat session and its messages.\n * \n * @param chatId - The chat ID to delete\n * \n * @example\n * ```typescript\n * await adapter.deleteChat('chat_123');\n * ```\n */\n async deleteChat(chatId: string): Promise<void> {\n const chatKey = this._key('chats', chatId);\n const messagesKey = this._key('messages', chatId);\n \n this._chats.delete(chatKey);\n this._messages.delete(messagesKey);\n }\n\n /* ---------------------------------------------------------------------------\n * STATS METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets storage statistics.\n * \n * @returns Current storage stats\n * \n * @example\n * ```typescript\n * const stats = await adapter.getStats();\n * console.log(`Storing ${stats.messageCount} messages`);\n * console.log(`Across ${stats.chatCount} chats`);\n * ```\n */\n async getStats(): Promise<IgniterAgentAdapterStats> {\n let messageCount = 0;\n for (const messages of this._messages.values()) {\n messageCount += messages.length;\n }\n\n return {\n workingMemoryCount: this._workingMemory.size,\n messageCount,\n chatCount: this._chats.size,\n timestamp: new Date(),\n };\n }\n}","/**\n * @fileoverview JSON file-based adapter for IgniterAgent memory storage.\n * This module provides a simple file-based implementation of the memory provider.\n * \n * @description\n * The IgniterAgentJSONFileAdapter stores all data in JSON files on the local filesystem,\n * making it ideal for:\n * - Development and testing\n * - Single-machine deployments\n * - Offline-first applications\n * - Simple persistence without external databases\n * \n * **Directory Structure:**\n * ```\n * {dataDir}/\n * ├── working-memory.json # All working memory entries\n * ├── chats.json # All chat sessions\n * └── messages/\n * ├── {chatId}.json # Messages for specific chat\n * └── ...\n * ```\n * \n * @example\n * ```typescript\n * import { IgniterAgentJSONFileAdapter } from '@igniter-js/agents/adapters';\n * \n * // Create adapter\n * const adapter = new IgniterAgentJSONFileAdapter({\n * dataDir: './data/agent-memory',\n * namespace: 'myapp',\n * autoSync: true\n * });\n * \n * // Use with memory config\n * const memoryConfig: IgniterAgentMemoryConfig = {\n * provider: adapter,\n * working: { enabled: true, scope: 'chat' },\n * history: { enabled: true, limit: 100 }\n * };\n * ```\n * \n * @module adapters/json-file\n * @packageDocumentation\n */\n\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport type {\n IgniterAgentMemoryProvider,\n IgniterAgentWorkingMemory,\n IgniterAgentConversationMessage,\n IgniterAgentChatSession,\n IgniterAgentWorkingMemoryParams,\n IgniterAgentUpdateWorkingMemoryParams,\n IgniterAgentGetMessagesParams,\n IgniterAgentGetChatsParams,\n IgniterAgentMemoryAdapter,\n IgniterAgentAdapterStats,\n} from \"../types\";\n\n/* =============================================================================\n * TYPES\n * ============================================================================= */\n\n/**\n * Options for IgniterAgentJSONFileAdapter.\n * \n * @public\n */\nexport interface IgniterAgentJSONFileAdapterOptions {\n /**\n * Directory path where JSON files will be stored.\n * Will be created if it doesn't exist.\n * \n * @default './igniter-agent-memory'\n */\n dataDir?: string;\n\n /**\n * Namespace prefix for keys in the JSON files.\n * Allows storing data for multiple apps/instances in the same directory.\n * \n * @default 'igniter'\n */\n namespace?: string;\n\n /**\n * Whether to automatically sync changes to disk.\n * If false, call `sync()` manually after modifications.\n * \n * @default true\n */\n autoSync?: boolean;\n\n /**\n * Whether to enable debug logging.\n * \n * @default false\n */\n debug?: boolean;\n\n /**\n * Maximum number of messages to store per chat.\n * Older messages are removed when limit is exceeded.\n * \n * @default 1000\n */\n maxMessages?: number;\n\n /**\n * Maximum number of chat sessions to store.\n * Older chats are removed when limit is exceeded.\n * \n * @default 100\n */\n maxChats?: number;\n}\n\n/* =============================================================================\n * JSON FILE ADAPTER CLASS\n * ============================================================================= */\n\n/**\n * File-based (JSON) implementation of the IgniterAgent memory provider.\n * \n * @description\n * Stores all memory data in JSON files on the local filesystem. Provides a complete\n * implementation of the memory provider interface for development and testing purposes.\n * \n * **Features:**\n * - Full implementation of all memory provider methods\n * - Persistent storage across process restarts\n * - Namespace support for multi-tenant applications\n * - Optional automatic file synchronization\n * - Message/chat limits to control storage\n * - Debug logging\n * \n * **Limitations:**\n * - Not suitable for concurrent access from multiple processes\n * - Performance degrades with large numbers of messages/chats\n * - Not suitable for high-frequency writes\n * \n * **File Format:**\n * All data is stored in JSON format with ISO 8601 timestamps.\n * \n * @example\n * ```typescript\n * import { IgniterAgentJSONFileAdapter } from '@igniter-js/agents/adapters';\n * \n * const adapter = new IgniterAgentJSONFileAdapter({\n * dataDir: './memory',\n * namespace: 'myapp',\n * debug: true\n * });\n * \n * // Connect to initialize directories\n * await adapter.connect();\n * \n * // Store working memory\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: 'User prefers TypeScript'\n * });\n * \n * // Retrieve working memory\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * console.log(memory?.content); // 'User prefers TypeScript'\n * ```\n * \n * @public\n */\nexport class IgniterAgentJSONFileAdapter\n implements IgniterAgentMemoryAdapter<IgniterAgentJSONFileAdapterOptions>\n{\n /**\n * The adapter configuration options.\n */\n public readonly options: Required<IgniterAgentJSONFileAdapterOptions>;\n\n /**\n * Whether the adapter is currently connected and ready to use.\n * @internal\n */\n private _connected: boolean = false;\n\n /**\n * In-memory cache of working memory entries.\n * @internal\n */\n private _workingMemoryCache: Map<string, IgniterAgentWorkingMemory> =\n new Map();\n\n /**\n * In-memory cache of messages.\n * @internal\n */\n private _messagesCache: Map<string, IgniterAgentConversationMessage[]> =\n new Map();\n\n /**\n * In-memory cache of chat sessions.\n * @internal\n */\n private _chatsCache: Map<string, IgniterAgentChatSession> = new Map();\n\n /**\n * Creates a new IgniterAgentJSONFileAdapter.\n * \n * @param options - Adapter configuration\n * \n * @example\n * ```typescript\n * const adapter = new IgniterAgentJSONFileAdapter({\n * dataDir: './memory',\n * namespace: 'myapp'\n * });\n * ```\n */\n constructor(options: IgniterAgentJSONFileAdapterOptions = {}) {\n this.options = {\n dataDir: options.dataDir ?? \"./igniter-agent-memory\",\n namespace: options.namespace ?? \"igniter\",\n autoSync: options.autoSync ?? true,\n debug: options.debug ?? false,\n maxMessages: options.maxMessages ?? 1000,\n maxChats: options.maxChats ?? 100,\n };\n }\n\n /**\n * Factory method to create a new adapter instance.\n * @param options - Adapter configuration\n * @returns A new IgniterAgentJSONFileAdapter instance\n *\n * @example\n * ```typescript\n * const adapter = IgniterAgentJSONFileAdapter.create({\n * dataDir: './data',\n * });\n * ```\n */\n static create(\n options?: IgniterAgentJSONFileAdapterOptions\n ): IgniterAgentJSONFileAdapter {\n return new IgniterAgentJSONFileAdapter(options);\n }\n\n /* ---------------------------------------------------------------------------\n * PRIVATE HELPER METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Logs debug messages if debug mode is enabled.\n * @internal\n */\n private _log(message: string, data?: unknown): void {\n if (this.options.debug) {\n console.log(`[IgniterAgentJSONFileAdapter] ${message}`, data ?? \"\");\n }\n }\n\n /**\n * Gets the path for the working memory JSON file.\n * @internal\n */\n private _getWorkingMemoryPath(): string {\n return join(this.options.dataDir, \"working-memory.json\");\n }\n\n /**\n * Gets the path for the chats JSON file.\n * @internal\n */\n private _getChatsPath(): string {\n return join(this.options.dataDir, \"chats.json\");\n }\n\n /**\n * Gets the directory for message files.\n * @internal\n */\n private _getMessagesDir(): string {\n return join(this.options.dataDir, \"messages\");\n }\n\n /**\n * Gets the path for a specific chat's messages JSON file.\n * @internal\n */\n private _getMessagesPath(chatId: string): string {\n return join(this._getMessagesDir(), `${chatId}.json`);\n }\n\n /**\n * Generates a cache key with namespace prefix.\n * @internal\n */\n private _key(...parts: string[]): string {\n return [this.options.namespace, ...parts].join(\":\");\n }\n\n /**\n * Loads working memory from disk.\n * @internal\n */\n private async _loadWorkingMemory(): Promise<void> {\n try {\n const path = this._getWorkingMemoryPath();\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n\n this._workingMemoryCache.clear();\n for (const [key, value] of Object.entries(data)) {\n this._workingMemoryCache.set(key, {\n content: (value as any).content,\n updatedAt: new Date((value as any).updatedAt),\n });\n }\n this._log(\"Loaded working memory\", {\n entries: this._workingMemoryCache.size,\n });\n } catch (err) {\n // File doesn't exist yet, that's ok\n this._log(\"Working memory file not found, starting fresh\");\n }\n }\n\n /**\n * Loads chats from disk.\n * @internal\n */\n private async _loadChats(): Promise<void> {\n try {\n const path = this._getChatsPath();\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n\n this._chatsCache.clear();\n for (const [key, value] of Object.entries(data)) {\n const chat = value as any;\n this._chatsCache.set(key, {\n chatId: chat.chatId,\n userId: chat.userId,\n title: chat.title,\n createdAt: new Date(chat.createdAt),\n updatedAt: new Date(chat.updatedAt),\n messageCount: chat.messageCount,\n });\n }\n this._log(\"Loaded chats\", { entries: this._chatsCache.size });\n } catch (err) {\n this._log(\"Chats file not found, starting fresh\");\n }\n }\n\n /**\n * Loads a specific chat's messages from disk.\n * @internal\n */\n private async _loadMessages(chatId: string): Promise<void> {\n try {\n const path = this._getMessagesPath(chatId);\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n\n const key = this._key(\"messages\", chatId);\n const messages: IgniterAgentConversationMessage[] = data.map(\n (msg: any) => ({\n chatId: msg.chatId,\n userId: msg.userId,\n role: msg.role,\n content: msg.content,\n timestamp: new Date(msg.timestamp),\n })\n );\n\n this._messagesCache.set(key, messages);\n this._log(\"Loaded messages\", { chatId, count: messages.length });\n } catch (err) {\n this._log(\"Messages file not found for chat\", { chatId });\n }\n }\n\n /**\n * Saves working memory to disk.\n * @internal\n */\n private async _saveWorkingMemory(): Promise<void> {\n const path = this._getWorkingMemoryPath();\n const data: Record<string, any> = {};\n\n for (const [key, value] of this._workingMemoryCache.entries()) {\n data[key] = {\n content: value.content,\n updatedAt: value.updatedAt.toISOString(),\n };\n }\n\n await writeFile(path, JSON.stringify(data, null, 2));\n this._log(\"Saved working memory\");\n }\n\n /**\n * Saves chats to disk.\n * @internal\n */\n private async _saveChats(): Promise<void> {\n const path = this._getChatsPath();\n const data: Record<string, any> = {};\n\n for (const [key, value] of this._chatsCache.entries()) {\n data[key] = {\n chatId: value.chatId,\n userId: value.userId,\n title: value.title,\n createdAt: value.createdAt.toISOString(),\n updatedAt: value.updatedAt.toISOString(),\n messageCount: value.messageCount,\n };\n }\n\n await writeFile(path, JSON.stringify(data, null, 2));\n this._log(\"Saved chats\");\n }\n\n /**\n * Saves messages for a specific chat to disk.\n * @internal\n */\n private async _saveMessages(chatId: string): Promise<void> {\n const key = this._key(\"messages\", chatId);\n const messages = this._messagesCache.get(key) ?? [];\n const path = this._getMessagesPath(chatId);\n\n const data = messages.map((msg) => ({\n chatId: msg.chatId,\n userId: msg.userId,\n role: msg.role,\n content: msg.content,\n timestamp: msg.timestamp.toISOString(),\n }));\n\n await writeFile(path, JSON.stringify(data, null, 2));\n this._log(\"Saved messages\", { chatId, count: messages.length });\n }\n\n /* ---------------------------------------------------------------------------\n * LIFECYCLE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Connects to the storage backend and loads data from disk.\n * \n * @description\n * Creates necessary directories and loads all data into memory cache.\n * Must be called before using the adapter.\n * \n * @throws {Error} If directory creation fails\n * \n * @example\n * ```typescript\n * const adapter = new IgniterAgentJSONFileAdapter();\n * await adapter.connect();\n * ```\n */\n async connect(): Promise<void> {\n try {\n await mkdir(this.options.dataDir, { recursive: true });\n await mkdir(this._getMessagesDir(), { recursive: true });\n\n await this._loadWorkingMemory();\n await this._loadChats();\n\n this._connected = true;\n this._log(\"Connected successfully\", {\n dataDir: this.options.dataDir,\n });\n } catch (err) {\n this._log(\"Connection failed\", err);\n throw err;\n }\n }\n\n /**\n * Disconnects from the storage backend.\n * \n * @description\n * Syncs any pending changes to disk before disconnecting.\n * \n * @example\n * ```typescript\n * await adapter.disconnect();\n * ```\n */\n async disconnect(): Promise<void> {\n if (this._connected) {\n await this.sync();\n this._connected = false;\n this._log(\"Disconnected\");\n }\n }\n\n /**\n * Checks if the adapter is connected and ready to use.\n * \n * @returns True if connected, false otherwise\n */\n isConnected(): boolean {\n return this._connected;\n }\n\n /**\n * Manually syncs all in-memory data to disk.\n * \n * @description\n * Called automatically if autoSync is enabled. Can be called manually\n * to ensure data is persisted to disk.\n * \n * @example\n * ```typescript\n * await adapter.updateWorkingMemory({ ... });\n * await adapter.sync(); // Ensure written to disk\n * ```\n */\n async sync(): Promise<void> {\n try {\n await this._saveWorkingMemory();\n await this._saveChats();\n\n // Save all loaded message files\n for (const chatId of this._messagesCache.keys()) {\n const idParts = chatId.split(\":\");\n if (idParts.length > 0) {\n const actualChatId = idParts[idParts.length - 1];\n await this._saveMessages(actualChatId);\n }\n }\n\n this._log(\"Synced all data to disk\");\n } catch (err) {\n this._log(\"Sync failed\", err);\n throw err;\n }\n }\n\n /**\n * Clears all stored data from disk and memory.\n * \n * @description\n * Removes all working memory, messages, and chat sessions.\n * Use with caution.\n * \n * @example\n * ```typescript\n * await adapter.clear();\n * ```\n */\n async clear(): Promise<void> {\n this._workingMemoryCache.clear();\n this._messagesCache.clear();\n this._chatsCache.clear();\n\n if (this.options.autoSync) {\n await this.sync();\n }\n\n this._log(\"Cleared all data\");\n }\n\n /* ---------------------------------------------------------------------------\n * WORKING MEMORY METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets working memory for a scope and identifier.\n * \n * @param params - The scope and identifier\n * @returns The working memory or null if not found\n * \n * @example\n * ```typescript\n * const memory = await adapter.getWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123'\n * });\n * \n * if (memory) {\n * console.log('Content:', memory.content);\n * }\n * ```\n */\n async getWorkingMemory(\n params: IgniterAgentWorkingMemoryParams\n ): Promise<IgniterAgentWorkingMemory | null> {\n const key = this._key(\"memory\", params.scope, params.identifier);\n return this._workingMemoryCache.get(key) ?? null;\n }\n\n /**\n * Updates working memory for a scope and identifier.\n * \n * @param params - The scope, identifier, and new content\n * \n * @example\n * ```typescript\n * await adapter.updateWorkingMemory({\n * scope: 'chat',\n * identifier: 'chat_123',\n * content: 'User prefers TypeScript'\n * });\n * ```\n */\n async updateWorkingMemory(\n params: IgniterAgentUpdateWorkingMemoryParams\n ): Promise<void> {\n const key = this._key(\"memory\", params.scope, params.identifier);\n\n this._workingMemoryCache.set(key, {\n content: params.content,\n updatedAt: new Date(),\n });\n\n if (this.options.autoSync) {\n await this._saveWorkingMemory();\n }\n }\n\n /* ---------------------------------------------------------------------------\n * MESSAGE METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves a message to the conversation history.\n * \n * @param message - The message to save\n * \n * @example\n * ```typescript\n * await adapter.saveMessage({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * role: 'user',\n * content: 'How do I use TypeScript?',\n * timestamp: new Date()\n * });\n * ```\n */\n async saveMessage(message: IgniterAgentConversationMessage): Promise<void> {\n const key = this._key(\"messages\", message.chatId);\n\n let messages = this._messagesCache.get(key);\n if (!messages) {\n messages = [];\n this._messagesCache.set(key, messages);\n }\n\n messages.push(message);\n\n // Enforce max messages limit\n if (messages.length > this.options.maxMessages) {\n messages.splice(0, messages.length - this.options.maxMessages);\n }\n\n if (this.options.autoSync) {\n await this._saveMessages(message.chatId);\n }\n }\n\n /**\n * Gets messages from the conversation history.\n * \n * @typeParam T - The message type to return\n * @param params - Query parameters\n * @returns Array of messages\n * \n * @example\n * ```typescript\n * const messages = await adapter.getMessages({\n * chatId: 'chat_123',\n * limit: 50\n * });\n * \n * for (const msg of messages) {\n * console.log(`[${msg.role}]: ${msg.content}`);\n * }\n * ```\n */\n async getMessages<T = unknown>(\n params: IgniterAgentGetMessagesParams\n ): Promise<T[]> {\n const key = this._key(\"messages\", params.chatId);\n\n // Load messages if not in cache\n if (!this._messagesCache.has(key)) {\n await this._loadMessages(params.chatId);\n }\n\n let messages = this._messagesCache.get(key) ?? [];\n\n // Filter by userId if provided\n if (params.userId) {\n messages = messages.filter((m) => m.userId === params.userId);\n }\n\n // Apply limit\n if (params.limit && params.limit > 0) {\n messages = messages.slice(-params.limit);\n }\n\n // Convert to expected format\n return messages.map((m) => ({\n id: `${m.chatId}-${m.timestamp.getTime()}`,\n role: m.role,\n content: m.content,\n createdAt: m.timestamp,\n })) as T[];\n }\n\n /* ---------------------------------------------------------------------------\n * CHAT SESSION METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Saves or updates a chat session.\n * \n * @param chat - The chat session to save\n * \n * @example\n * ```typescript\n * await adapter.saveChat({\n * chatId: 'chat_123',\n * userId: 'user_456',\n * title: 'TypeScript Help',\n * createdAt: new Date(),\n * updatedAt: new Date(),\n * messageCount: 0\n * });\n * ```\n */\n async saveChat(chat: IgniterAgentChatSession): Promise<void> {\n const key = this._key(\"chats\", chat.chatId);\n\n this._chatsCache.set(key, chat);\n\n // Enforce max chats limit\n if (this._chatsCache.size > this.options.maxChats) {\n const entries = Array.from(this._chatsCache.entries())\n .sort(\n (a, b) =>\n a[1].updatedAt.getTime() - b[1].updatedAt.getTime()\n );\n\n const toRemove = entries.slice(\n 0,\n this._chatsCache.size - this.options.maxChats\n );\n for (const [k] of toRemove) {\n this._chatsCache.delete(k);\n }\n }\n\n if (this.options.autoSync) {\n await this._saveChats();\n }\n }\n\n /**\n * Gets chat sessions matching the query parameters.\n * \n * @param params - Query parameters\n * @returns Array of chat sessions\n * \n * @example\n * ```typescript\n * const chats = await adapter.getChats({\n * userId: 'user_456',\n * search: 'typescript',\n * limit: 10\n * });\n * \n * for (const chat of chats) {\n * console.log(`${chat.title} (${chat.messageCount} messages)`);\n * }\n * ```\n */\n async getChats(\n params: IgniterAgentGetChatsParams\n ): Promise<IgniterAgentChatSession[]> {\n let chats = Array.from(this._chatsCache.values());\n\n // Filter by userId\n if (params.userId) {\n chats = chats.filter((c) => c.userId === params.userId);\n }\n\n // Filter by search term (title)\n if (params.search) {\n const searchLower = params.search.toLowerCase();\n chats = chats.filter((c) =>\n c.title?.toLowerCase().includes(searchLower)\n );\n }\n\n // Sort by most recent\n chats.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n // Apply limit\n if (params.limit && params.limit > 0) {\n chats = chats.slice(0, params.limit);\n }\n\n return chats;\n }\n\n /**\n * Gets a specific chat session by ID.\n * \n * @param chatId - The chat ID\n * @returns The chat session or null if not found\n * \n * @example\n * ```typescript\n * const chat = await adapter.getChat('chat_123');\n * \n * if (chat) {\n * console.log('Title:', chat.title);\n * }\n * ```\n */\n async getChat(chatId: string): Promise<IgniterAgentChatSession | null> {\n const key = this._key(\"chats\", chatId);\n return this._chatsCache.get(key) ?? null;\n }\n\n /**\n * Updates the title of a chat session.\n * \n * @param chatId - The chat ID\n * @param title - The new title\n * \n * @example\n * ```typescript\n * await adapter.updateChatTitle('chat_123', 'New Title');\n * ```\n */\n async updateChatTitle(chatId: string, title: string): Promise<void> {\n const key = this._key(\"chats\", chatId);\n\n const chat = this._chatsCache.get(key);\n if (chat) {\n chat.title = title;\n chat.updatedAt = new Date();\n\n if (this.options.autoSync) {\n await this._saveChats();\n }\n }\n }\n\n /**\n * Deletes a chat session and its messages.\n * \n * @param chatId - The chat ID to delete\n * \n * @example\n * ```typescript\n * await adapter.deleteChat('chat_123');\n * ```\n */\n async deleteChat(chatId: string): Promise<void> {\n const chatKey = this._key(\"chats\", chatId);\n const messagesKey = this._key(\"messages\", chatId);\n\n this._chatsCache.delete(chatKey);\n this._messagesCache.delete(messagesKey);\n\n if (this.options.autoSync) {\n await this._saveChats();\n // Optionally delete the messages file\n try {\n const path = this._getMessagesPath(chatId);\n await readFile(path); // Check if exists\n this._log(\"Messages file for deleted chat still exists\");\n } catch {\n // File doesn't exist, that's fine\n }\n }\n }\n\n /* ---------------------------------------------------------------------------\n * STATS METHODS\n * --------------------------------------------------------------------------- */\n\n /**\n * Gets storage statistics.\n * \n * @returns Current storage stats\n * \n * @example\n * ```typescript\n * const stats = await adapter.getStats();\n * console.log(`Storing ${stats.messageCount} messages`);\n * console.log(`Across ${stats.chatCount} chats`);\n * ```\n */\n async getStats(): Promise<IgniterAgentAdapterStats> {\n let messageCount = 0;\n for (const messages of this._messagesCache.values()) {\n messageCount += messages.length;\n }\n\n return {\n workingMemoryCount: this._workingMemoryCache.size,\n messageCount,\n chatCount: this._chatsCache.size,\n timestamp: new Date(),\n };\n }\n}\n","/**\n * String utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentStringUtils {\n /**\n * Generates a unique identifier.\n */\n static generateId(prefix?: string): string {\n const random = Math.random().toString(36).substring(2, 12);\n return prefix ? `${prefix}_${random}` : random;\n }\n\n /**\n * Truncates a string to a maximum length.\n */\n static truncate(str: string, maxLength: number, suffix = \"...\"): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n }\n\n /**\n * Converts a string to snake_case.\n */\n static toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n .replace(/^_/, \"\");\n }\n\n /**\n * Converts a string to camelCase.\n */\n static toCamelCase(str: string): string {\n return str\n .replace(/[-_](.)/g, (_, char: string) => char.toUpperCase())\n .replace(/^(.)/, (char: string) => char.toLowerCase());\n }\n}\n","/**\n * Object utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentObjectUtils {\n /**\n * Deep merges two objects.\n */\n static deepMerge<T extends Record<string, unknown>>(\n target: T,\n source: Partial<T>,\n ): T {\n const result = { ...target };\n\n for (const key in source) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === \"object\" &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === \"object\" &&\n !Array.isArray(targetValue)\n ) {\n (result as Record<string, unknown>)[key] = IgniterAgentObjectUtils.deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n } else {\n (result as Record<string, unknown>)[key] = sourceValue;\n }\n }\n\n return result;\n }\n\n /**\n * Picks specified keys from an object.\n */\n static pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[],\n ): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n }\n\n /**\n * Omits specified keys from an object.\n */\n static omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[],\n ): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n }\n}\n","/**\n * Async utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentAsyncUtils {\n /**\n * Delays execution for a specified duration.\n */\n static delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Retries an async function with exponential backoff.\n */\n static async retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n baseDelay?: number;\n maxDelay?: number;\n onRetry?: (attempt: number, error: Error) => void;\n } = {},\n ): Promise<T> {\n const {\n maxAttempts = 3,\n baseDelay = 1000,\n maxDelay = 30000,\n onRetry,\n } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) {\n throw lastError;\n }\n\n onRetry?.(attempt, lastError);\n\n const delayMs = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n await IgniterAgentAsyncUtils.delay(delayMs);\n }\n }\n\n throw lastError;\n }\n}\n","/**\n * Validation utilities for `@igniter-js/agents`.\n */\nexport class IgniterAgentValidationUtils {\n /**\n * Checks if a value is defined (not null or undefined).\n */\n static isDefined<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n }\n\n /**\n * Checks if a value is a non-empty string.\n */\n static isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n }\n\n /**\n * Checks if a value is a plain object.\n */\n static isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n }\n}\n"]}
|