@alcyone-labs/arg-parser 2.13.1 → 2.13.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/@alcyone-labs+simple-chalk@1.0.2/node_modules/@alcyone-labs/simple-chalk/dist/esm/SimpleChalk.js","../node_modules/.pnpm/@alcyone-labs+simple-chalk@1.0.2/node_modules/@alcyone-labs/simple-chalk/dist/esm/SimpleChalkFast.js","../node_modules/.pnpm/@alcyone-labs+simple-chalk@1.0.2/node_modules/@alcyone-labs/simple-chalk/dist/esm/SimpleChalkBrowser.js","../src/config/plugins/ConfigPlugin.ts","../src/config/plugins/ConfigPluginRegistry.ts","../src/config/ConfigurationManager.ts","../src/core/log-path-utils.ts","../src/core/dxt-path-resolver.ts","../src/core/types.ts","../src/dxt/DxtGenerator-testUtils.ts","../src/dxt/DxtGenerator.ts","../src/mcp/mcp-notifications.ts","../src/mcp/mcp-prompts.ts","../src/mcp/mcp-resources.ts","../src/utils/debug-utils.ts","../src/core/FlagManager.ts","../src/core/ArgParserBase.ts","../src/mcp/mcp-utils.ts","../src/mcp/mcp-integration.ts","../src/mcp/mcp-protocol-versions.ts","../src/mcp/zod-compatibility.ts","../src/core/ArgParser.ts","../src/mcp/ArgParserMcp.ts","../src/config/plugins/TomlConfigPlugin.ts","../src/config/plugins/YamlConfigPlugin.ts","../src/testing/fuzzy-tester.ts","../src/mcp/mcp-lifecycle.ts","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/index.js"],"sourcesContent":["/**\n * Simple chalk replacement for basic terminal colors\n * Provides the same API as chalk but without dynamic requires or complex dependencies\n * Perfect for bundling in autonomous builds\n */\n// ANSI codes\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst UNDERLINE = '\\x1b[4m';\nconst CLEAR = '\\x1b[2J\\x1b[3J\\x1b[H';\n// Colors\nconst BLACK = '\\x1b[30m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst MAGENTA = '\\x1b[35m';\nconst CYAN = '\\x1b[36m';\nconst WHITE = '\\x1b[37m';\nconst GRAY = '\\x1b[90m';\n// Check if colors should be enabled\nfunction supportsColor() {\n // Browser environment detection\n const isBrowser = typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined';\n if (isBrowser) {\n // In browsers, enable colors by default (modern browsers support ANSI in console)\n // But respect NO_COLOR if somehow set in browser environment\n return !globalThis.NO_COLOR;\n }\n // Node.js environment\n if (typeof process !== 'undefined') {\n // In MCP mode or when NO_COLOR is set, disable colors\n if (process.env['NO_COLOR'] || process.env['MCP_MODE']) {\n return false;\n }\n // Enable colors if FORCE_COLOR is set\n if (process.env['FORCE_COLOR']) {\n return true;\n }\n // Check if we're in a TTY\n if (process.stdout && process.stdout.isTTY) {\n return true;\n }\n }\n return false;\n}\nconst colorEnabled = supportsColor();\nfunction colorize(text, ...codes) {\n if (!colorEnabled || codes.length === 0) {\n return text;\n }\n return codes.join('') + text + RESET;\n}\n// Helper function to add a property to a chalk function\nfunction addChalkProperty(fn, name, code, codes) {\n Object.defineProperty(fn, name, {\n get: () => createColorFunction([...codes, code]),\n configurable: true\n });\n}\n// Create a chainable color function\nfunction createColorFunction(codes) {\n const fn = ((text) => colorize(text, ...codes));\n // Add modifier properties\n addChalkProperty(fn, 'bold', BOLD, codes);\n addChalkProperty(fn, 'dim', DIM, codes);\n addChalkProperty(fn, 'underline', UNDERLINE, codes);\n // Add color properties\n addChalkProperty(fn, 'black', BLACK, codes);\n addChalkProperty(fn, 'red', RED, codes);\n addChalkProperty(fn, 'green', GREEN, codes);\n addChalkProperty(fn, 'yellow', YELLOW, codes);\n addChalkProperty(fn, 'blue', BLUE, codes);\n addChalkProperty(fn, 'magenta', MAGENTA, codes);\n addChalkProperty(fn, 'cyan', CYAN, codes);\n addChalkProperty(fn, 'white', WHITE, codes);\n addChalkProperty(fn, 'gray', GRAY, codes);\n addChalkProperty(fn, 'grey', GRAY, codes);\n addChalkProperty(fn, 'blueBright', CYAN, codes);\n // Add clear property\n Object.defineProperty(fn, 'clear', {\n get: () => colorEnabled ? CLEAR : '',\n configurable: true\n });\n return fn;\n}\n// Create the main chalk object\nconst simpleChalk = createColorFunction([]);\nexport default simpleChalk;\n//# sourceMappingURL=SimpleChalk.js.map","/**\n * Fast SimpleChalk implementation - no chaining, maximum performance\n * Similar to picocolors approach\n */\n// ANSI color codes\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst UNDERLINE = '\\x1b[4m';\nconst CLEAR = '\\x1b[2J\\x1b[3J\\x1b[H';\n// Colors\nconst BLACK = '\\x1b[30m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst MAGENTA = '\\x1b[35m';\nconst CYAN = '\\x1b[36m';\nconst WHITE = '\\x1b[37m';\nconst GRAY = '\\x1b[90m';\n// Check if colors should be enabled\nfunction supportsColor() {\n // Browser environment detection\n const isBrowser = typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined';\n if (isBrowser) {\n // In browsers, enable colors by default (modern browsers support ANSI in console)\n // But respect NO_COLOR if somehow set in browser environment\n return !globalThis.NO_COLOR;\n }\n // Node.js environment\n if (typeof process !== 'undefined') {\n // In MCP mode or when NO_COLOR is set, disable colors\n if (process.env['NO_COLOR'] || process.env['MCP_MODE']) {\n return false;\n }\n // Enable colors if FORCE_COLOR is set\n if (process.env['FORCE_COLOR']) {\n return true;\n }\n // Check if we're in a TTY\n if (process.stdout && process.stdout.isTTY) {\n return true;\n }\n }\n return false;\n}\nconst colorEnabled = supportsColor();\n// Simple formatter function\nconst format = (code) => colorEnabled\n ? (text) => code + text + RESET\n : (text) => text;\n// Pre-created functions - no dynamic creation\nconst simpleChalkFast = {\n // Colors\n black: format(BLACK),\n red: format(RED),\n green: format(GREEN),\n yellow: format(YELLOW),\n blue: format(BLUE),\n magenta: format(MAGENTA),\n cyan: format(CYAN),\n white: format(WHITE),\n gray: format(GRAY),\n grey: format(GRAY), // alias\n blueBright: format(CYAN), // alias\n // Modifiers\n bold: format(BOLD),\n dim: format(DIM),\n underline: format(UNDERLINE),\n /**\n * [NON-CHALK EXTENSION] Returns an ANSI escape sequence that clears the screen\n * and the scrollback buffer (equivalent to CMD+K).\n *\n * @example\n * ```javascript\n * process.stdout.write(fast.clear);\n * ```\n */\n clear: colorEnabled ? CLEAR : '',\n // Pre-created common combinations for some chaining support\n redBold: format(RED + BOLD),\n greenBold: format(GREEN + BOLD),\n blueBold: format(BLUE + BOLD),\n yellowBold: format(YELLOW + BOLD),\n redUnderline: format(RED + UNDERLINE),\n greenUnderline: format(GREEN + UNDERLINE),\n blueUnderline: format(BLUE + UNDERLINE),\n boldRed: format(BOLD + RED),\n boldGreen: format(BOLD + GREEN),\n boldBlue: format(BOLD + BLUE),\n boldYellow: format(BOLD + YELLOW),\n};\n// Make it callable as a function\nconst callableChalk = Object.assign((text) => text, simpleChalkFast);\nexport default callableChalk;\n//# sourceMappingURL=SimpleChalkFast.js.map","/**\n * Browser-optimized SimpleChalk implementation\n * Uses CSS styling for browsers, ANSI codes for Node.js\n */\n// Check if we're in a browser environment\nconst isBrowser = typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined';\n// CSS styles for browser console\nconst browserStyles = {\n reset: '',\n bold: 'font-weight: bold;',\n dim: 'opacity: 0.5;',\n underline: 'text-decoration: underline;',\n black: 'color: #000000;',\n red: 'color: #ff0000;',\n green: 'color: #00ff00;',\n yellow: 'color: #ffff00;',\n blue: 'color: #0000ff;',\n magenta: 'color: #ff00ff;',\n cyan: 'color: #00ffff;',\n white: 'color: #ffffff;',\n gray: 'color: #808080;',\n};\n// ANSI codes for Node.js\nconst ansiCodes = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n underline: '\\x1b[4m',\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n// Check if colors should be enabled (dynamic check)\nfunction supportsColor() {\n if (isBrowser) {\n // In browsers, enable colors by default\n return !globalThis.NO_COLOR;\n }\n // Node.js environment\n if (typeof process !== 'undefined') {\n if (process.env['NO_COLOR'] || process.env['MCP_MODE']) {\n return false;\n }\n if (process.env['FORCE_COLOR']) {\n return true;\n }\n if (process.stdout && process.stdout.isTTY) {\n return true;\n }\n }\n return false;\n}\n// Browser-specific formatter using CSS\nfunction formatBrowser(styles, text) {\n if (!supportsColor() || styles.length === 0) {\n return [text];\n }\n const cssStyle = styles.join(' ');\n return [`%c${text}`, cssStyle];\n}\n// Node.js formatter using ANSI codes\nfunction formatNode(codes, text) {\n if (!supportsColor() || codes.length === 0) {\n return text;\n }\n return codes.join('') + text + ansiCodes.reset;\n}\n// Universal formatter that works in both environments\nfunction format(styleKey) {\n return (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles[styleKey]], text);\n }\n else {\n return formatNode([ansiCodes[styleKey]], text);\n }\n };\n}\n// Create the browser-optimized chalk object\nconst simpleChalkBrowser = {\n // Colors\n black: format('black'),\n red: format('red'),\n green: format('green'),\n yellow: format('yellow'),\n blue: format('blue'),\n magenta: format('magenta'),\n cyan: format('cyan'),\n white: format('white'),\n gray: format('gray'),\n grey: format('gray'), // alias\n blueBright: format('cyan'), // alias\n // Modifiers\n bold: format('bold'),\n dim: format('dim'),\n underline: format('underline'),\n /**\n * [NON-CHALK EXTENSION] Clears the screen and scrollback buffer.\n * In a browser environment, this calls console.clear().\n * In a Node environment, it returns the ANSI clear/scrollback sequence.\n *\n * @example\n * ```javascript\n * // In browser: console.clear() will be called immediately\n * // In node: will return ANSI string\n * console.log(...browser.clear);\n * ```\n */\n clear: (() => {\n if (!supportsColor())\n return '';\n if (isBrowser) {\n console.clear();\n return '';\n }\n else {\n return '\\x1b[2J\\x1b[3J\\x1b[H';\n }\n })(),\n // Browser-specific combinations (CSS can combine styles)\n redBold: (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles.red, browserStyles.bold], text);\n }\n else {\n return formatNode([ansiCodes.red, ansiCodes.bold], text);\n }\n },\n greenBold: (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles.green, browserStyles.bold], text);\n }\n else {\n return formatNode([ansiCodes.green, ansiCodes.bold], text);\n }\n },\n blueBold: (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles.blue, browserStyles.bold], text);\n }\n else {\n return formatNode([ansiCodes.blue, ansiCodes.bold], text);\n }\n },\n};\n// Make it callable as a function\nconst callableChalk = Object.assign((text) => text, simpleChalkBrowser);\nexport default callableChalk;\n//# sourceMappingURL=SimpleChalkBrowser.js.map","/**\n * Plugin interface for configuration file format support\n */\nexport interface IConfigPlugin {\n /**\n * File extensions this plugin supports (e.g., ['.toml', '.tml'])\n */\n readonly supportedExtensions: string[];\n\n /**\n * Plugin name for identification\n */\n readonly name: string;\n\n /**\n * Parse configuration file content\n * @param content File content as string\n * @returns Parsed configuration object\n */\n parse(content: string): Record<string, any>;\n\n /**\n * Generate configuration file content\n * @param config Configuration object\n * @param flags Flag definitions for metadata\n * @param parsedArgs Parsed arguments for values\n * @returns Generated file content\n */\n generate(config: Record<string, any>, flags: any[], parsedArgs: any): string;\n}\n\n/**\n * Base class for configuration plugins\n */\nexport abstract class ConfigPlugin implements IConfigPlugin {\n abstract readonly supportedExtensions: string[];\n abstract readonly name: string;\n\n abstract parse(content: string): Record<string, any>;\n abstract generate(\n config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string;\n\n /**\n * Check if this plugin supports a given file extension\n */\n public supportsExtension(extension: string): boolean {\n return this.supportedExtensions.includes(extension.toLowerCase());\n }\n}\n\n/**\n * Built-in JSON configuration plugin (no external dependencies)\n */\nexport class JsonConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".json\", \".jsonc\"];\n readonly name = \"json\";\n\n parse(content: string): Record<string, any> {\n try {\n const parsed = JSON.parse(content);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"JSON file must contain an object at the root level\");\n }\n // Remove metadata if present\n const { _meta, ...config } = parsed;\n return config;\n } catch (error) {\n throw new Error(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const metadata = {\n _meta: {\n generated: new Date().toISOString(),\n generator: \"ArgParser\",\n format: \"json\",\n },\n };\n\n const configWithValues: Record<string, any> = {};\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n if (isSet) {\n configWithValues[flag.name] = flagValue;\n } else if (isMandatory) {\n configWithValues[flag.name] =\n flag.defaultValue !== undefined ? flag.defaultValue : null;\n }\n }\n\n const result = { ...metadata, ...configWithValues };\n return JSON.stringify(result, null, 2);\n }\n}\n\n/**\n * Built-in ENV configuration plugin (no external dependencies)\n */\nexport class EnvConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".env\"];\n readonly name = \"env\";\n\n parse(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration generated by ArgParser\");\n lines.push(\"# Format: ENV\");\n lines.push(\"\");\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n lines.push(`# ${flag.description || flag.name}`);\n lines.push(`# Type: ${this.getTypeString(flag.type)}`);\n\n if (flag.defaultValue !== undefined) {\n lines.push(`# Default: ${flag.defaultValue}`);\n }\n\n if (isSet) {\n lines.push(`${flag.name.toUpperCase()}=${flagValue}`);\n } else if (isMandatory) {\n const defaultVal =\n flag.defaultValue !== undefined ? flag.defaultValue : \"\";\n lines.push(`${flag.name.toUpperCase()}=${defaultVal}`);\n } else {\n lines.push(`# ${flag.name.toUpperCase()}=`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n private getTypeString(type: any): string {\n if (typeof type === \"function\") {\n return type.name || \"custom function\";\n }\n return String(type).toLowerCase();\n }\n}\n","import type { IConfigPlugin } from \"./ConfigPlugin\";\nimport { EnvConfigPlugin, JsonConfigPlugin } from \"./ConfigPlugin\";\n\n/**\n * Registry for configuration plugins\n * Manages available config format plugins and provides plugin lookup\n */\nexport class ConfigPluginRegistry {\n private plugins: Map<string, IConfigPlugin> = new Map();\n private extensionMap: Map<string, IConfigPlugin> = new Map();\n\n constructor() {\n // Register built-in plugins (no external dependencies)\n this.registerPlugin(new JsonConfigPlugin());\n this.registerPlugin(new EnvConfigPlugin());\n }\n\n /**\n * Register a configuration plugin\n */\n public registerPlugin(plugin: IConfigPlugin): void {\n this.plugins.set(plugin.name, plugin);\n\n // Map extensions to plugin\n for (const ext of plugin.supportedExtensions) {\n this.extensionMap.set(ext.toLowerCase(), plugin);\n }\n }\n\n /**\n * Get plugin by name\n */\n public getPlugin(name: string): IConfigPlugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get plugin by file extension\n */\n public getPluginByExtension(extension: string): IConfigPlugin | undefined {\n return this.extensionMap.get(extension.toLowerCase());\n }\n\n /**\n * Check if a file extension is supported\n */\n public isExtensionSupported(extension: string): boolean {\n return this.extensionMap.has(extension.toLowerCase());\n }\n\n /**\n * Get all registered plugin names\n */\n public getRegisteredPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * Get all supported extensions\n */\n public getSupportedExtensions(): string[] {\n return Array.from(this.extensionMap.keys());\n }\n\n /**\n * Unregister a plugin\n */\n public unregisterPlugin(name: string): boolean {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n return false;\n }\n\n // Remove from plugins map\n this.plugins.delete(name);\n\n // Remove extensions from extension map\n for (const ext of plugin.supportedExtensions) {\n this.extensionMap.delete(ext.toLowerCase());\n }\n\n return true;\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n public clear(): void {\n this.plugins.clear();\n this.extensionMap.clear();\n }\n\n /**\n * Auto-register optional plugins if their dependencies are available\n * This method attempts to load TOML and YAML plugins without throwing errors\n */\n public autoRegisterOptionalPlugins(): void {\n // Try to register TOML plugin\n try {\n const { createTomlPlugin } = require(\"./TomlConfigPlugin\");\n const tomlPlugin = createTomlPlugin();\n if (tomlPlugin) {\n this.registerPlugin(tomlPlugin);\n }\n } catch (error) {\n // TOML plugin not available, continue without it\n }\n\n // Try to register YAML plugin\n try {\n const { createYamlPlugin } = require(\"./YamlConfigPlugin\");\n const yamlPlugin = createYamlPlugin();\n if (yamlPlugin) {\n this.registerPlugin(yamlPlugin);\n }\n } catch (error) {\n // YAML plugin not available, continue without it\n }\n }\n\n /**\n * Async version of auto-register optional plugins with ESM support\n * This method attempts to load TOML and YAML plugins without throwing errors\n */\n public async autoRegisterOptionalPluginsAsync(): Promise<void> {\n // Try to register TOML plugin\n try {\n const { createTomlPluginAsync } = await import(\"./TomlConfigPlugin\");\n const tomlPlugin = await createTomlPluginAsync();\n if (tomlPlugin) {\n this.registerPlugin(tomlPlugin);\n }\n } catch (error) {\n // TOML plugin not available, continue without it\n }\n\n // Try to register YAML plugin\n try {\n const { createYamlPluginAsync } = await import(\"./YamlConfigPlugin\");\n const yamlPlugin = await createYamlPluginAsync();\n if (yamlPlugin) {\n this.registerPlugin(yamlPlugin);\n }\n } catch (error) {\n // YAML plugin not available, continue without it\n }\n }\n}\n\n/**\n * Global plugin registry instance\n * This can be used throughout the application\n */\nexport const globalConfigPluginRegistry = new ConfigPluginRegistry();\n\n/**\n * Convenience function to register optional plugins\n * Call this once at application startup if you want TOML/YAML support\n */\nexport function enableOptionalConfigPlugins(): void {\n globalConfigPluginRegistry.autoRegisterOptionalPlugins();\n}\n\n/**\n * Async convenience function to register optional plugins with ESM support\n * Call this once at application startup if you want TOML/YAML support in ESM environments\n */\nexport async function enableOptionalConfigPluginsAsync(): Promise<void> {\n await globalConfigPluginRegistry.autoRegisterOptionalPluginsAsync();\n}\n\n/**\n * Convenience function to register only specific plugins\n */\nexport function enableConfigPlugins(pluginNames: string[]): void {\n for (const pluginName of pluginNames) {\n switch (pluginName.toLowerCase()) {\n case \"toml\":\n try {\n const { createTomlPlugin } = require(\"./TomlConfigPlugin\");\n const tomlPlugin = createTomlPlugin();\n if (tomlPlugin) {\n globalConfigPluginRegistry.registerPlugin(tomlPlugin);\n }\n } catch (error) {\n console.warn(\n `Failed to enable TOML plugin: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n break;\n\n case \"yaml\":\n try {\n const { createYamlPlugin } = require(\"./YamlConfigPlugin\");\n const yamlPlugin = createYamlPlugin();\n if (yamlPlugin) {\n globalConfigPluginRegistry.registerPlugin(yamlPlugin);\n }\n } catch (error) {\n console.warn(\n `Failed to enable YAML plugin: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n break;\n\n default:\n console.warn(`Unknown config plugin: ${pluginName}`);\n }\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport chalk from \"@alcyone-labs/simple-chalk\";\nimport type { ProcessedFlag, TParsedArgs } from \"../core/types\";\nimport { globalConfigPluginRegistry } from \"./plugins/ConfigPluginRegistry\";\n\n/**\n * ConfigurationManager handles environment file operations, format conversion,\n * and configuration merging for ArgParser instances.\n */\nexport class ConfigurationManager {\n private argParserInstance: any;\n\n constructor(argParserInstance: any) {\n this.argParserInstance = argParserInstance;\n\n // Auto-register built-in plugins (JSON and ENV only by default)\n // TOML and YAML plugins are optional and must be explicitly enabled\n }\n\n /**\n * Generates a default environment file name based on app configuration\n */\n public generateDefaultEnvFileName(): string {\n let baseName = \"config\";\n\n const appCommandName = this.argParserInstance.getAppCommandName();\n const appName = this.argParserInstance.getAppName();\n\n if (appCommandName) {\n baseName = appCommandName;\n } else if (appName && appName !== \"Argument Parser\") {\n baseName = appName;\n }\n\n // Convert to a safe filename format (PascalCase for .env files)\n baseName = baseName\n .split(/[\\s\\-_]+/)\n .map(\n (word: string) =>\n word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),\n )\n .join(\"\");\n\n return `${baseName}.env`;\n }\n\n /**\n * Handles the --s-save-to-env system flag at the final parser level\n */\n public handleSaveToEnvFlag(\n processArgs: string[],\n parserChain: any[],\n ): boolean {\n const saveToEnvIndex = processArgs.findIndex(\n (arg) => arg === \"--s-save-to-env\",\n );\n if (saveToEnvIndex !== -1) {\n let filePath: string;\n\n // Check if a filename is provided\n if (saveToEnvIndex + 1 < processArgs.length) {\n const nextArg = processArgs[saveToEnvIndex + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n filePath = nextArg;\n } else {\n // No filename provided, auto-generate one\n filePath = this.generateDefaultEnvFileName();\n }\n } else {\n // No filename provided, auto-generate one\n filePath = this.generateDefaultEnvFileName();\n }\n\n this.saveToEnvFile(filePath, processArgs, parserChain);\n return true;\n }\n return false;\n }\n\n /**\n * Saves current configuration to an environment file\n */\n public saveToEnvFile(\n filePath: string,\n _processArgs: string[],\n parserChain: any[],\n ): void {\n try {\n // Parse the current arguments to get the values\n const finalParser = parserChain[parserChain.length - 1];\n const parsedArgs = finalParser.getLastParseResult();\n\n if (!parsedArgs || !parsedArgs.data) {\n console.log(\n chalk.yellow(\n \"No parsed arguments available. Run the command first to generate configuration.\",\n ),\n );\n return;\n }\n\n // Collect all flags from the parser chain\n const allFlags: ProcessedFlag[] = [];\n for (const parser of parserChain) {\n allFlags.push(...parser.flags);\n }\n\n // Determine file format based on extension\n const ext = path.extname(filePath).toLowerCase();\n let content: string;\n\n // Try to use plugin system first\n const plugin = globalConfigPluginRegistry.getPluginByExtension(ext);\n if (plugin) {\n content = plugin.generate({}, allFlags, parsedArgs.data);\n } else {\n // Fallback to legacy methods for unsupported formats\n switch (ext) {\n case \".yaml\":\n case \".yml\":\n content = this.generateYamlFormat(allFlags, parsedArgs);\n break;\n case \".json\":\n content = this.generateJsonFormat(allFlags, parsedArgs);\n break;\n case \".toml\":\n content = this.generateTomlFormat(allFlags, parsedArgs);\n break;\n case \".env\":\n default:\n content = this.generateEnvFormat(allFlags, parsedArgs);\n break;\n }\n }\n\n // Write the file\n fs.writeFileSync(filePath, content, \"utf8\");\n\n console.log(chalk.green(`✅ Configuration saved to: ${filePath}`));\n console.log(chalk.gray(`Format: ${ext || \".env\"}`));\n console.log(\n chalk.gray(`Flags saved: ${Object.keys(parsedArgs.data).length}`),\n );\n } catch (error) {\n console.error(\n chalk.red(\n `❌ Failed to save configuration: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n throw new Error(\n `Failed to save configuration: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Loads configuration from an environment file\n */\n public loadEnvFile(\n filePath: string,\n parserChain: any[],\n ): Record<string, any> {\n try {\n if (!fs.existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, \"utf8\");\n const ext = path.extname(filePath).toLowerCase();\n\n let rawConfig: Record<string, any>;\n\n // Try to use plugin system first\n const plugin = globalConfigPluginRegistry.getPluginByExtension(ext);\n if (plugin) {\n rawConfig = plugin.parse(content);\n } else {\n // Fallback to legacy methods for unsupported formats\n switch (ext) {\n case \".yaml\":\n case \".yml\":\n rawConfig = this.parseYamlFile(content);\n break;\n case \".json\":\n rawConfig = this.parseJsonFile(content);\n break;\n case \".toml\":\n rawConfig = this.parseTomlFile(content);\n break;\n case \".env\":\n default:\n rawConfig = this.parseEnvFile(content);\n break;\n }\n }\n\n // Convert the raw config to flag values\n return this.convertConfigToFlagValues(rawConfig, parserChain);\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return {};\n }\n }\n\n /**\n * Parses environment file content\n */\n public parseEnvFile(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n /**\n * Parses YAML file content (legacy method - now uses plugin system)\n */\n public parseYamlFile(content: string): Record<string, any> {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".yaml\");\n if (plugin) {\n return plugin.parse(content);\n }\n\n // Fallback: Simple YAML parsing for basic key-value pairs and arrays\n console.warn(\n \"YAML plugin not available, using simple parser. Install js-yaml and enable YAML plugin for full support.\",\n );\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n let currentKey: string | null = null;\n let currentArray: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n // Check if this is an array item\n if (trimmed.startsWith(\"- \")) {\n if (currentKey) {\n const arrayValue = trimmed.substring(2).trim();\n // Remove quotes if present\n const cleanValue =\n (arrayValue.startsWith('\"') && arrayValue.endsWith('\"')) ||\n (arrayValue.startsWith(\"'\") && arrayValue.endsWith(\"'\"))\n ? arrayValue.slice(1, -1)\n : arrayValue;\n currentArray.push(cleanValue);\n }\n continue;\n }\n\n // Check if this is a key-value pair\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > 0) {\n // If we were building an array, save it\n if (currentKey && currentArray.length > 0) {\n config[currentKey] = currentArray;\n currentArray = [];\n }\n\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n\n // If value is empty, this might be the start of an array\n if (!value) {\n currentKey = key;\n currentArray = [];\n continue;\n }\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n currentKey = null;\n }\n }\n\n // Handle any remaining array\n if (currentKey && currentArray.length > 0) {\n config[currentKey] = currentArray;\n }\n\n return config;\n }\n\n /**\n * Discovers .env files in a specified directory\n * Searches in priority order: .env.local, .env.dev/.env.test, .env\n *\n * @param searchDir - The directory to search for .env files\n * @returns Path to found .env file, or null if none is found\n */\n public discoverEnvFile(searchDir: string): string | null {\n const envFilesToCheck: string[] = [\".env.local\"];\n\n // Add environment-specific files based on NODE_ENV\n const nodeEnv = process.env[\"NODE_ENV\"]?.toLowerCase();\n if (nodeEnv === \"development\" || nodeEnv === \"dev\") {\n envFilesToCheck.push(\".env.dev\");\n } else if (nodeEnv === \"test\") {\n envFilesToCheck.push(\".env.test\");\n }\n\n envFilesToCheck.push(\".env\");\n\n // Check each file in priority order\n for (const envFile of envFilesToCheck) {\n const envPath = path.join(searchDir, envFile);\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n return null;\n }\n\n /**\n * Parses JSON file content\n */\n public parseJsonFile(content: string): Record<string, any> {\n try {\n return JSON.parse(content) || {};\n } catch (error) {\n throw new Error(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Parses TOML file content (legacy method - now uses plugin system)\n */\n public parseTomlFile(content: string): Record<string, any> {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".toml\");\n if (plugin) {\n return plugin.parse(content);\n }\n\n // Fallback: Simple TOML parsing for basic key-value pairs\n console.warn(\n \"TOML plugin not available, using simple parser. Install smol-toml and enable TOML plugin for full support.\",\n );\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n /**\n * Converts raw configuration to flag values with proper type conversion\n */\n public convertConfigToFlagValues(\n rawConfig: Record<string, any>,\n parserChain: any[],\n ): Record<string, any> {\n const flagValues: Record<string, any> = {};\n\n // Collect all flags from the parser chain\n const allFlags: ProcessedFlag[] = [];\n for (const parser of parserChain) {\n allFlags.push(...parser.flags);\n }\n\n /**\n * Normalizes a key for comparison by converting to lowercase and removing underscores/hyphens.\n * This allows matching between SCREAMING_SNAKE_CASE (env vars) and camelCase (flag names).\n * E.g., \"TEST_VAR\" -> \"testvar\", \"testVar\" -> \"testvar\", \"test-var\" -> \"testvar\"\n */\n const normalizeKey = (key: string): string => {\n return key.toLowerCase().replace(/[-_]/g, \"\");\n };\n\n // Convert each config value to the appropriate flag type\n for (const [key, value] of Object.entries(rawConfig)) {\n // Try exact match first\n let flag = allFlags.find((f) => f[\"name\"] === key);\n\n // Try case-insensitive match\n if (!flag) {\n flag = allFlags.find(\n (f) => f[\"name\"].toLowerCase() === key.toLowerCase(),\n );\n }\n\n // Try normalized match (handles SCREAMING_SNAKE_CASE to camelCase)\n if (!flag) {\n const normalizedKey = normalizeKey(key);\n flag = allFlags.find((f) => normalizeKey(f[\"name\"]) === normalizedKey);\n }\n\n if (flag) {\n try {\n // Use the actual flag name (not the config key) for consistency\n flagValues[flag[\"name\"]] = this.convertValueToFlagType(value, flag);\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not convert config value for flag '${key}': ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n }\n }\n\n return flagValues;\n }\n\n /**\n * Converts a value to the appropriate flag type\n */\n public convertValueToFlagType(value: any, flag: ProcessedFlag): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle both string literal and String constructor function\n const flagType = flag[\"type\"];\n const isStringType = flagType === \"string\" || flagType === String;\n const isNumberType = flagType === \"number\" || flagType === Number;\n const isBooleanType = flagType === \"boolean\" || flagType === Boolean;\n\n if (isStringType) {\n // Handle allowMultiple flags that expect arrays\n if (flag[\"allowMultiple\"]) {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") {\n try {\n // Try to parse as JSON array\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) return parsed;\n } catch (e) {\n // Try to split by comma\n return value.split(\",\").map((v) => v.trim());\n }\n }\n return [String(value)];\n }\n return String(value);\n } else if (isNumberType) {\n // If it's already a number, return it as-is\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (isNaN(num)) {\n throw new Error(\n `Cannot convert '${value}' to number for flag '${flag[\"name\"]}'`,\n );\n }\n return num;\n } else if (isBooleanType) {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (\n lower === \"true\" ||\n lower === \"1\" ||\n lower === \"yes\" ||\n lower === \"on\"\n )\n return true;\n if (\n lower === \"false\" ||\n lower === \"0\" ||\n lower === \"no\" ||\n lower === \"off\"\n )\n return false;\n }\n throw new Error(\n `Cannot convert '${value}' to boolean for flag '${flag[\"name\"]}'`,\n );\n } else if (flagType === \"table\") {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") {\n try {\n // Try to parse as JSON array\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) return parsed;\n } catch (e) {\n // Try to split by comma\n return value.split(\",\").map((v) => v.trim());\n }\n }\n throw new Error(\n `Cannot convert '${value}' to table for flag '${flag[\"name\"]}'`,\n );\n } else {\n // Handle custom type functions or fallback to string\n if (typeof flagType === \"function\") {\n try {\n return flagType(value);\n } catch (error) {\n throw new Error(\n `Custom type conversion failed for flag '${flag[\"name\"]}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return String(value);\n }\n }\n\n /**\n * Merges environment configuration with command line arguments\n */\n public mergeEnvConfigWithArgs(\n envConfig: Record<string, any>,\n processArgs: string[],\n parserChain?: any[],\n ): string[] {\n const mergedArgs = [...processArgs];\n\n // Collect all flags from the parser chain for option lookup\n const allFlags: ProcessedFlag[] = [];\n if (parserChain) {\n for (const parser of parserChain) {\n allFlags.push(...parser.flags);\n }\n }\n\n // Helper to get the primary flag option (e.g., \"--test-var\") for a flag name (e.g., \"testVar\")\n const getFlagOption = (flagName: string): string => {\n const flag = allFlags.find((f) => f[\"name\"] === flagName);\n if (\n flag &&\n Array.isArray(flag[\"options\"]) &&\n flag[\"options\"].length > 0\n ) {\n // Get the first option that starts with \"--\" (prefer long form)\n const longOption = flag[\"options\"].find((opt: string) =>\n opt.startsWith(\"--\"),\n );\n return longOption || flag[\"options\"][0];\n }\n // Fallback to default format if flag not found\n return `--${flagName}`;\n };\n\n // Add environment config values as flags if they're not already present\n for (const [key, value] of Object.entries(envConfig)) {\n const flagOption = getFlagOption(key);\n\n // Check if this flag is already present in the args\n // Check both the flag option and variations (e.g., --test-var and --testVar)\n const flagOptionWithoutDashes = flagOption.replace(/^--?/, \"\");\n const hasFlag = mergedArgs.some((arg) => {\n const argWithoutDashes = arg.replace(/^--?/, \"\").split(\"=\")[0];\n return (\n argWithoutDashes === flagOptionWithoutDashes ||\n argWithoutDashes === key\n );\n });\n\n if (!hasFlag) {\n if (typeof value === \"boolean\") {\n if (value) {\n mergedArgs.push(flagOption);\n }\n } else if (Array.isArray(value)) {\n // For table/array values, add multiple flags\n for (const item of value) {\n mergedArgs.push(flagOption, String(item));\n }\n } else {\n mergedArgs.push(flagOption, String(value));\n }\n }\n }\n\n return mergedArgs;\n }\n\n /**\n * Generates environment file format\n */\n public generateEnvFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration file\");\n lines.push(`# Generated on ${new Date().toISOString()}`);\n lines.push(\"\");\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n lines.push(`# ${flag[\"description\"] || flag[\"name\"]} `);\n lines.push(`# Type: ${this.getTypeString(flag[\"type\"])}`);\n\n if (Array.isArray(value)) {\n lines.push(`${flag[\"name\"].toUpperCase()}=${JSON.stringify(value)}`);\n } else if (typeof value === \"string\" && value.includes(\" \")) {\n lines.push(`${flag[\"name\"].toUpperCase()}=\"${value}\"`);\n } else {\n lines.push(`${flag[\"name\"].toUpperCase()}=${value}`);\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generates YAML file format (legacy method - now uses plugin system)\n */\n public generateYamlFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".yaml\");\n if (plugin) {\n // Plugin expects raw data object, not TParsedArgs\n return plugin.generate({}, flags, parsedArgs[\"data\"] || parsedArgs);\n }\n\n // Fallback: Simple YAML generation\n const lines: string[] = [];\n lines.push(\"# YAML configuration file\");\n lines.push(`# Generated on ${new Date().toISOString()}`);\n lines.push(\"\");\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n lines.push(`# ${flag[\"description\"] || flag[\"name\"]} `);\n lines.push(`# Type: ${this.getTypeString(flag[\"type\"])}`);\n\n if (Array.isArray(value)) {\n lines.push(`${flag[\"name\"]}:`);\n for (const item of value) {\n lines.push(\n ` - ${typeof item === \"string\" && item.includes(\" \") ? `\"${item}\"` : item}`,\n );\n }\n } else if (typeof value === \"string\" && value.includes(\" \")) {\n lines.push(`${flag[\"name\"]}: \"${value}\"`);\n } else {\n lines.push(`${flag[\"name\"]}: ${value}`);\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generates JSON file format\n */\n public generateJsonFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const config: Record<string, any> = {};\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n config[flag[\"name\"]] = value;\n }\n }\n\n return JSON.stringify(config, null, 2);\n }\n\n /**\n * Generates TOML file format (legacy method - now uses plugin system)\n */\n public generateTomlFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".toml\");\n if (plugin) {\n // Plugin expects raw data object, not TParsedArgs\n return plugin.generate({}, flags, parsedArgs[\"data\"] || parsedArgs);\n }\n\n // Fallback: Simple TOML generation\n const lines: string[] = [];\n lines.push(\"# TOML configuration file\");\n lines.push(`# Generated on ${new Date().toISOString()}`);\n lines.push(\"\");\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n lines.push(`# ${flag[\"description\"] || flag[\"name\"]} `);\n lines.push(`# Type: ${this.getTypeString(flag[\"type\"])}`);\n\n if (Array.isArray(value)) {\n const arrayStr = value\n .map((item) =>\n typeof item === \"string\" ? `\"${item}\"` : String(item),\n )\n .join(\", \");\n lines.push(`${flag[\"name\"]} = [${arrayStr}]`);\n } else if (typeof value === \"string\") {\n lines.push(`${flag[\"name\"]} = \"${value}\"`);\n } else {\n lines.push(`${flag[\"name\"]} = ${value}`);\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Gets a string representation of a flag type\n */\n private getTypeString(type: any): string {\n if (typeof type === \"string\") {\n return type;\n } else if (typeof type === \"function\") {\n return type.name || \"function\";\n } else {\n return \"unknown\";\n }\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { DxtPathResolver } from \"./dxt-path-resolver\";\n\n/**\n * Configuration object for log path with explicit relative base\n */\nexport interface LogPathConfig {\n /** The log file path */\n path: string;\n /** What the path should be relative to */\n relativeTo?: \"entry\" | \"cwd\" | \"absolute\";\n /** Manual base path override (used with relativeTo: 'absolute') */\n basePath?: string;\n}\n\n/**\n * Log path can be a simple string or a configuration object\n */\nexport type LogPath = string | LogPathConfig;\n\n/**\n * Attempts to detect the entry point script using multiple methods\n * @returns The detected entry point path or null if detection fails\n */\nexport function detectEntryPoint(): string | null {\n try {\n // Method 1: Check process.argv[1] (most reliable for direct execution)\n if (process.argv[1] && fs.existsSync(process.argv[1])) {\n return process.argv[1];\n }\n\n // Method 2: ES modules - import.meta.url (when available)\n // Note: This needs to be handled by the caller since import.meta is not available in all contexts\n\n // Method 3: CommonJS - __filename (when available)\n // Note: This also needs to be handled by the caller since __filename is not available in ES modules\n\n // Method 4: Try to find main module from require.main (CommonJS)\n if (\n typeof require !== \"undefined\" &&\n require.main &&\n require.main.filename\n ) {\n return require.main.filename;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Helper to get entry point from import.meta.url when in ES module context\n * @param importMetaUrl The import.meta.url value\n * @returns The file path\n */\nexport function getEntryPointFromImportMeta(importMetaUrl: string): string {\n // Simple URL to path conversion for file:// URLs\n if (importMetaUrl.startsWith(\"file://\")) {\n return decodeURIComponent(importMetaUrl.replace(\"file://\", \"\"));\n }\n return importMetaUrl;\n}\n\n/**\n * Helper to validate and normalize a log path string\n * @param path The path to validate\n * @returns The normalized path\n */\nfunction normalizePath(path: string): string {\n // Remove any trailing/leading whitespace\n return path.trim();\n}\n\n/**\n * Resolves a log path configuration to an absolute file path\n * @param logPath The log path configuration (string or object)\n * @param fallbackEntryPoint Optional fallback entry point if detection fails\n * @returns Absolute path to the log file\n */\nexport function resolveLogPath(\n logPath: LogPath,\n fallbackEntryPoint?: string,\n): string {\n // Handle string inputs\n if (typeof logPath === \"string\") {\n // First, substitute any DXT variables in the path\n const pathWithVariables = DxtPathResolver.substituteVariables(\n logPath,\n DxtPathResolver.detectContext(),\n );\n const normalizedPath = normalizePath(pathWithVariables);\n\n // Absolute paths - return as-is\n if (path.isAbsolute(normalizedPath)) {\n return normalizedPath;\n }\n\n // Explicit process.cwd() relative paths\n if (normalizedPath.startsWith(\"cwd:\")) {\n const relativePath = normalizedPath.slice(4); // Remove \"cwd:\" prefix\n return path.resolve(process.cwd(), relativePath);\n }\n\n // Default behavior: relative to entry point\n const entryPoint = detectEntryPoint() || fallbackEntryPoint;\n if (entryPoint) {\n return path.resolve(path.dirname(entryPoint), normalizedPath);\n }\n\n // Fallback to process.cwd() if entry point detection fails\n console.warn(\n `Warning: Could not detect entry point for log path resolution. ` +\n `Using process.cwd() as fallback. Path: ${normalizedPath}`,\n );\n return path.resolve(process.cwd(), normalizedPath);\n }\n\n // Handle object form\n const { path: logFilePath, relativeTo = \"entry\", basePath } = logPath;\n // Substitute DXT variables in the path\n const pathWithVariables = DxtPathResolver.substituteVariables(\n logFilePath,\n DxtPathResolver.detectContext(),\n );\n const normalizedPath = normalizePath(pathWithVariables);\n\n switch (relativeTo) {\n case \"absolute\":\n if (basePath) {\n // Substitute DXT variables in basePath as well\n const resolvedBasePath = DxtPathResolver.substituteVariables(\n basePath,\n DxtPathResolver.detectContext(),\n );\n return path.resolve(resolvedBasePath, normalizedPath);\n }\n if (path.isAbsolute(normalizedPath)) {\n return normalizedPath;\n }\n // If no basePath provided and path is not absolute, fall back to process.cwd()\n console.warn(\n `Warning: relativeTo 'absolute' specified but no basePath provided and path is not absolute. ` +\n `Using process.cwd() as fallback. Path: ${normalizedPath}`,\n );\n return path.resolve(process.cwd(), normalizedPath);\n\n case \"cwd\":\n return path.resolve(process.cwd(), normalizedPath);\n\n case \"entry\":\n default:\n const entryPoint = detectEntryPoint() || fallbackEntryPoint;\n if (entryPoint) {\n return path.resolve(path.dirname(entryPoint), normalizedPath);\n }\n\n // Fallback to process.cwd() if entry point detection fails\n console.warn(\n `Warning: Could not detect entry point for log path resolution. ` +\n `Using process.cwd() as fallback. Path: ${normalizedPath}`,\n );\n return path.resolve(process.cwd(), normalizedPath);\n }\n}\n\n/**\n * Creates a log path configuration for entry-point relative logging\n * @param path The relative path from the entry point\n * @returns LogPathConfig object\n */\nexport function entryRelative(path: string): LogPathConfig {\n return {\n path,\n relativeTo: \"entry\",\n };\n}\n\n/**\n * Creates a log path configuration for process.cwd() relative logging\n * @param path The relative path from process.cwd()\n * @returns LogPathConfig object\n */\nexport function cwdRelative(path: string): LogPathConfig {\n return {\n path,\n relativeTo: \"cwd\",\n };\n}\n\n/**\n * Creates a log path configuration for absolute path logging\n * @param path The absolute path or relative path\n * @param basePath Optional base path to resolve relative paths against\n * @returns LogPathConfig object\n */\nexport function absolutePath(path: string, basePath?: string): LogPathConfig {\n return {\n path,\n relativeTo: \"absolute\",\n basePath,\n };\n}\n\n/**\n * Utility to help migrate from old relative-to-cwd behavior\n * @param path The path that was previously relative to cwd\n * @returns String with explicit cwd: prefix\n */\nexport function legacyCwdPath(path: string): string {\n return `cwd:${path}`;\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { detectEntryPoint } from \"./log-path-utils\";\n\n/**\n * Context information for path resolution\n */\nexport interface IPathContext {\n /** Whether the code is running in a DXT environment */\n isDxt: boolean;\n /** DXT extension directory (when running in DXT) */\n extensionDir?: string;\n /** User's home directory */\n userHome?: string;\n /** Current working directory */\n cwd?: string;\n /** Entry point directory */\n entryDir?: string;\n}\n\n/**\n * Configuration for DXT variable substitution\n */\nexport interface IDxtVariableConfig {\n /** Custom variable values to override defaults */\n customVariables?: Record<string, string>;\n /** Whether to allow undefined variables (default: false) */\n allowUndefined?: boolean;\n}\n\n/**\n * DXT-aware path resolver with context detection and variable substitution\n */\nexport class DxtPathResolver {\n private static _cachedContext: IPathContext | null = null;\n\n /**\n * Detects the current execution context\n * @param forceRefresh - Force refresh of cached context\n * @returns Path context information\n */\n public static detectContext(forceRefresh = false): IPathContext {\n if (!forceRefresh && this._cachedContext) {\n return this._cachedContext;\n }\n\n const context: IPathContext = {\n isDxt: this.isDxtEnvironment(),\n userHome: typeof os.homedir === \"function\" ? os.homedir() : undefined,\n cwd:\n typeof process !== \"undefined\" && typeof process.cwd === \"function\"\n ? process.cwd()\n : undefined,\n };\n\n // Detect entry point directory\n const entryPoint = detectEntryPoint();\n if (entryPoint) {\n context.entryDir = path.dirname(entryPoint);\n }\n\n // Detect DXT extension directory if in DXT environment\n if (context.isDxt) {\n context.extensionDir = this.detectDxtExtensionDir();\n }\n\n this._cachedContext = context;\n return context;\n }\n\n /**\n * Checks if the current environment is a DXT environment\n * @returns True if running in DXT, false otherwise\n */\n public static isDxtEnvironment(): boolean {\n // Check for DXT-specific environment variables\n if (process.env[\"DXT_EXTENSION_DIR\"] || process.env[\"CLAUDE_DESKTOP_DXT\"]) {\n return true;\n }\n\n // Check for DXT-specific file patterns in the current directory\n const dxtIndicators = [\n \"manifest.json\", // DXT packages have manifest.json\n \".dxt\", // DXT marker file\n ];\n\n for (const indicator of dxtIndicators) {\n const indicatorPath = path.join(process.cwd(), indicator);\n if (fs.existsSync(indicatorPath)) {\n // Additional validation for manifest.json to ensure it's a DXT manifest\n if (indicator === \"manifest.json\") {\n try {\n const manifest = JSON.parse(\n fs.readFileSync(indicatorPath, \"utf-8\"),\n );\n if (manifest.server && manifest.user_config) {\n return true;\n }\n } catch {\n // Not a valid DXT manifest, continue checking\n }\n } else {\n return true;\n }\n }\n }\n\n // Check if running from a path that looks like a DXT extension\n const cwd = process.cwd();\n if (cwd.includes(\"claude-desktop\") || cwd.includes(\"extensions\")) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Detects the DXT extension directory\n * @returns DXT extension directory path or undefined\n */\n private static detectDxtExtensionDir(): string | undefined {\n // Check environment variable first\n if (process.env[\"DXT_EXTENSION_DIR\"]) {\n return process.env[\"DXT_EXTENSION_DIR\"];\n }\n\n // Try to detect from current working directory\n const cwd = process.cwd();\n\n // If we're in a DXT package, the extension dir is typically the parent or current directory\n if (fs.existsSync(path.join(cwd, \"manifest.json\"))) {\n return cwd;\n }\n\n // Look for parent directories that might be the extension dir\n let currentDir = cwd;\n for (let i = 0; i < 3; i++) {\n // Check up to 3 levels up\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n\n if (fs.existsSync(path.join(parentDir, \"manifest.json\"))) {\n return parentDir;\n }\n currentDir = parentDir;\n }\n\n return undefined;\n }\n\n /**\n * Resolves a path with DXT variable substitution\n * @param inputPath - Path that may contain DXT variables\n * @param context - Optional context (will be detected if not provided)\n * @param config - Optional configuration for variable substitution\n * @returns Resolved absolute path\n */\n public static resolvePath(\n inputPath: string,\n context?: IPathContext,\n config?: IDxtVariableConfig,\n ): string {\n const ctx = context || this.detectContext();\n const resolvedPath = this.substituteVariables(inputPath, ctx, config);\n\n // If already absolute, return as-is\n if (path.isAbsolute(resolvedPath)) {\n return resolvedPath;\n }\n\n // Resolve relative paths based on context\n if (ctx.isDxt && ctx.extensionDir) {\n return path.resolve(ctx.extensionDir, resolvedPath);\n } else if (ctx.entryDir) {\n return path.resolve(ctx.entryDir, resolvedPath);\n } else {\n return path.resolve(ctx.cwd || process.cwd(), resolvedPath);\n }\n }\n\n /**\n * Substitutes DXT variables in a path string\n * @param inputPath - Path containing variables like ${HOME}, ${__dirname}, etc.\n * @param context - Path context\n * @param config - Variable substitution configuration\n * @returns Path with variables substituted\n */\n public static substituteVariables(\n inputPath: string,\n context: IPathContext,\n config?: IDxtVariableConfig,\n ): string {\n const safeHomedir = () =>\n typeof os.homedir === \"function\" ? os.homedir() : \"/tmp\";\n const homeDir = context.userHome || safeHomedir();\n\n const variables: Record<string, string> = {\n // Standard DXT variables\n HOME: homeDir,\n DOCUMENTS: path.join(homeDir, \"Documents\"),\n DOWNLOADS: path.join(homeDir, \"Downloads\"),\n DESKTOP: path.join(homeDir, \"Desktop\"),\n pathSeparator: path.sep,\n\n // Context-specific variables\n __dirname:\n context.isDxt && context.extensionDir\n ? context.extensionDir\n : context.entryDir || context.cwd || process.cwd(),\n\n // DXT-specific variables\n ...(context.isDxt &&\n context.extensionDir && {\n DXT_DIR: context.extensionDir,\n EXTENSION_DIR: context.extensionDir,\n }),\n\n // Custom variables override defaults\n ...config?.customVariables,\n };\n\n // Replace variables in the format ${VARIABLE_NAME}\n return inputPath.replace(/\\$\\{([^}]*)\\}/g, (match, variableName) => {\n // Handle empty variable names\n if (!variableName.trim()) {\n if (config?.allowUndefined) {\n return match;\n }\n throw new Error(\n `Undefined DXT variable: ${variableName}. Available variables: ${Object.keys(variables).join(\", \")}`,\n );\n }\n\n const value = variables[variableName];\n\n if (value !== undefined) {\n return value;\n }\n\n if (config?.allowUndefined) {\n return match; // Keep the original variable if undefined is allowed\n }\n\n throw new Error(\n `Undefined DXT variable: ${variableName}. Available variables: ${Object.keys(variables).join(\", \")}`,\n );\n });\n }\n\n /**\n * Creates a path for user data storage\n * @param filename - Name of the file or subdirectory\n * @param context - Optional context (will be detected if not provided)\n * @returns Absolute path for user data\n */\n public static createUserDataPath(\n filename: string,\n context?: IPathContext,\n ): string {\n const ctx = context || this.detectContext();\n\n if (ctx.isDxt && ctx.extensionDir) {\n // In DXT environment, store in extension directory\n return path.join(ctx.extensionDir, \"data\", filename);\n } else {\n // In development, store in user's data directory\n const safeHomedir = () =>\n typeof os.homedir === \"function\" ? os.homedir() : \"/tmp\";\n const userDataDir =\n process.env[\"XDG_DATA_HOME\"] ||\n path.join(ctx.userHome || safeHomedir(), \".local\", \"share\");\n const appName = this.getAppName(ctx);\n return path.join(userDataDir, appName, filename);\n }\n }\n\n /**\n * Creates a path for temporary files\n * @param filename - Name of the temporary file\n * @param context - Optional context (will be detected if not provided)\n * @returns Absolute path for temporary file\n */\n public static createTempPath(\n filename: string,\n context?: IPathContext,\n ): string {\n const ctx = context || this.detectContext();\n\n if (ctx.isDxt && ctx.extensionDir) {\n // In DXT environment, use extension temp directory\n return path.join(ctx.extensionDir, \"temp\", filename);\n } else {\n // In development, use system temp directory\n const safeTmpdir = () =>\n typeof os.tmpdir === \"function\" ? os.tmpdir() : \"/tmp\";\n const appName = this.getAppName(ctx);\n return path.join(safeTmpdir(), appName, filename);\n }\n }\n\n /**\n * Creates a path for configuration files\n * @param filename - Name of the configuration file\n * @param context - Optional context (will be detected if not provided)\n * @returns Absolute path for configuration file\n */\n public static createConfigPath(\n filename: string,\n context?: IPathContext,\n ): string {\n const ctx = context || this.detectContext();\n\n if (ctx.isDxt && ctx.extensionDir) {\n // In DXT environment, store in extension directory\n return path.join(ctx.extensionDir, \"config\", filename);\n } else {\n // In development, store in user's config directory\n const safeHomedir = () =>\n typeof os.homedir === \"function\" ? os.homedir() : \"/tmp\";\n const configDir =\n process.env[\"XDG_CONFIG_HOME\"] ||\n path.join(ctx.userHome || safeHomedir(), \".config\");\n const appName = this.getAppName(ctx);\n return path.join(configDir, appName, filename);\n }\n }\n\n /**\n * Gets the application name for directory creation\n * @param context - Path context\n * @returns Application name or default\n */\n private static getAppName(context: IPathContext): string {\n // Try to get app name from package.json\n try {\n const packageJsonPath = path.join(\n context.entryDir || context.cwd || process.cwd(),\n \"package.json\",\n );\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, \"utf-8\"),\n );\n return packageJson.name || \"argparser-app\";\n }\n } catch {\n // Ignore errors\n }\n\n return \"argparser-app\";\n }\n\n /**\n * Ensures a directory exists, creating it if necessary\n * @param dirPath - Directory path to ensure\n * @returns True if directory exists or was created successfully\n */\n public static ensureDirectory(dirPath: string): boolean {\n try {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n return true;\n } catch (error) {\n console.warn(`Failed to create directory: ${dirPath}`, error);\n return false;\n }\n }\n\n /**\n * Clears the cached context (useful for testing)\n */\n public static clearCache(): void {\n this._cachedContext = null;\n }\n}\n","import { z, type ZodTypeAny } from \"zod\";\n\n// Forward declaration for ArgParser to avoid circular dependency in HandlerContext\n// This will be replaced or refined once ArgParser.ts is updated to use these types.\nexport type ArgParserInstance = IArgParser;\n\n/**\n * Interface defining the MCP server methods expected by ArgParserBase.\n * This allows ArgParserBase to use these methods without depending on the concrete ArgParser class.\n */\nexport interface IMcpServerMethods {\n createMcpServer(\n serverInfo?: any,\n toolOptions?: any,\n logPath?: any,\n ): Promise<any>;\n\n startMcpServerWithTransport(\n serverInfo: any,\n transportType: string,\n transportOptions: any,\n toolOptions: any,\n logPath?: string,\n ): Promise<void>;\n\n startMcpServerWithMultipleTransports(\n serverInfo: any,\n transports: any[],\n toolOptions: any,\n logPath?: string,\n ): Promise<void>;\n\n getMcpServerConfig(): any;\n}\n\n/**\n * Interface representing the public API of ArgParser/ArgParserBase.\n */\nexport interface IArgParser<THandlerReturn = any> {\n // Common methods from ArgParserBase\n getAppName(): string | undefined;\n getAppCommandName(): string | undefined;\n getSubCommandName(): string;\n getDescription(): string | undefined;\n getAutoExit(): boolean;\n getHandler(): ((ctx: IHandlerContext) => void) | undefined;\n getSubCommands(): Map<string, ISubCommand>;\n get logger(): any;\n\n // Flag methods\n get flags(): ProcessedFlag[];\n get flagNames(): string[];\n addFlag(flag: IFlag): this;\n addFlags(flags: readonly IFlag[]): this;\n hasFlag(name: string): boolean;\n getFlagDefinition(name: string): ProcessedFlag | undefined;\n\n // Subcommand methods\n addSubCommand(subCommandConfig: ISubCommand): this;\n getSubCommand(name: string): ISubCommand | undefined;\n\n // Parsing methods\n parse(processArgs?: string[], options?: any): Promise<any>;\n\n // Configuration methods\n setHandler(\n handler: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>,\n ): this;\n\n // Help\n helpText(): string;\n printAll(filePath?: string): void;\n getCommandChain(): string[];\n\n // MCP methods (optional or requires casting)\n addMcpResource(config: any): this;\n removeMcpResource(name: string): this;\n getMcpResources(): any[];\n addMcpPrompt(config: any): this;\n removeMcpPrompt(name: string): this;\n getMcpPrompts(): any[];\n\n // MCP methods from ArgParser subclass (optional in interface but present at runtime)\n getMcpServerConfig?(): any;\n}\n\n/**\n * Defines the behavior for flag inheritance in sub-commands.\n */\nexport const FlagInheritance = {\n /**\n * No flags are inherited from the parent.\n */\n NONE: \"none\",\n /**\n * Inherits flags only from the direct parent at the time of attachment (Snapshot behavior).\n * Equivalent to `true` in legacy boolean config.\n */\n DirectParentOnly: \"direct-parent-only\",\n /**\n * Inherits flags from the entire parent chain, ensuring grandchildren receive root flags\n * even in bottom-up construction scenarios.\n */\n AllParents: \"all-parents\",\n} as const;\n\nexport type TFlagInheritance =\n | (typeof FlagInheritance)[keyof typeof FlagInheritance]\n | boolean;\n\n/**\n * Zod schema for validating DXT-specific options\n */\nexport const zodDxtOptionsSchema = z\n .object({\n sensitive: z\n .boolean()\n .optional()\n .describe(\n \"Whether this field should be marked as sensitive in DXT user_config\",\n ),\n localDefault: z\n .string()\n .optional()\n .describe(\"Default value specific to DXT sandbox environment\"),\n type: z\n .enum([\"string\", \"directory\", \"file\", \"boolean\", \"number\"])\n .optional()\n .describe(\"DXT input type - determines UI component in DXT clients\"),\n multiple: z\n .boolean()\n .optional()\n .describe(\"Allow multiple values (for arrays)\"),\n min: z.number().optional().describe(\"Minimum value (for number type)\"),\n max: z.number().optional().describe(\"Maximum value (for number type)\"),\n default: z\n .any()\n .optional()\n .describe(\n \"DXT-specific default value (overrides localDefault if provided)\",\n ),\n title: z\n .string()\n .optional()\n .describe(\"Custom title for the user_config field\"),\n })\n .strict()\n .refine(\n (data) => {\n // If min or max are provided, type should be \"number\"\n if (\n (data.min !== undefined || data.max !== undefined) &&\n data.type !== \"number\"\n ) {\n return false;\n }\n // If min and max are both provided, min should be <= max\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.min > data.max\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"Invalid dxtOptions: min/max can only be used with type 'number', and min must be <= max\",\n },\n );\n\nexport const zodFlagSchema = z\n .object({\n name: z\n .string()\n .min(1, \"Flag name cannot be empty\")\n .describe(\n \"The output property name, used as a return key `{name: value}`. Must be unique.\",\n ),\n allowLigature: z\n .boolean()\n .default(true)\n .describe(\n \"Enable both forms of flag input, e.g., `./script.js -f=value` and `-f value`.\",\n ),\n allowMultiple: z\n .boolean()\n .default(false)\n .describe(\n \"Allow passing the same flag multiple times, e.g., `-f val1 -f val2` results in an array.\",\n ),\n description: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\"Textual description for help messages.\"),\n valueHint: z\n .string()\n .optional()\n .describe(\"Hint/example value shown in help and examples.\"),\n options: z\n .array(z.string().min(1))\n .min(1, \"Flag must have at least one option (e.g., ['-f', '--flag'])\")\n .describe(\"Array of option strings, e.g., ['-f', '--flag'].\"),\n defaultValue: z\n .any()\n .optional()\n .describe(\"Default value if the flag is not provided.\"),\n type: z\n .union([\n z.any().refine((val) => val === String, {\n message: \"Must be String constructor\",\n }),\n z.any().refine((val) => val === Number, {\n message: \"Must be Number constructor\",\n }),\n z.any().refine((val) => val === Boolean, {\n message: \"Must be Boolean constructor\",\n }),\n z.any().refine((val) => val === Array, {\n // Native Array constructor\n message: \"Must be Array constructor\",\n }),\n z.any().refine((val) => val === Object, {\n // Native Object constructor\n message: \"Must be Object constructor\",\n }),\n z.custom<(value: string) => any | Promise<any>>(\n (val) => typeof val === \"function\",\n \"Must be a custom parser function\",\n ), // Custom parser function (value: string) => any | Promise<any>\n z.custom<ZodTypeAny>(\n (val) => val && typeof val === \"object\" && (val as any)._def,\n \"Must be a Zod schema\",\n ), // Zod schema for structured JSON validation\n z.string().refine(\n // String literal types\n (value) =>\n [\"boolean\", \"string\", \"number\", \"array\", \"object\"].includes(\n value.toLowerCase(),\n ),\n {\n message:\n \"Invalid type string. Must be one of 'boolean', 'string', 'number', 'array', 'object'.\",\n },\n ),\n ])\n .default(\"string\") // Default type is string if not specified\n .describe(\n \"Expected data type (constructor, string literal, custom parser function, or Zod schema). Defaults to 'string'.\",\n ),\n mandatory: z\n .union([\n z.boolean(),\n z.custom<(value?: any, parsedArgs?: any) => boolean>(\n (val) => typeof val === \"function\",\n \"Must be a boolean or function\",\n ),\n ]) // `z.any()` for parsedArgs flexibility\n .optional()\n .describe(\n \"Makes the flag mandatory, can be a boolean or a function conditional on other args.\",\n ),\n flagOnly: z\n .boolean()\n .default(false)\n .describe(\n \"If true, the flag's presence is noted (true/false), and any subsequent value is not consumed by this flag.\",\n ),\n validate: z // User-provided validation function\n .custom<\n (\n value?: any,\n parsedArgs?: any,\n ) => boolean | string | void | Promise<boolean | string | void>\n >((val) => typeof val === \"function\", \"Must be a validation function\")\n .optional()\n .describe(\n \"Custom validation function for the flag's value (receives value, parsedArgs).\",\n ),\n enum: z // User-provided enum values\n .array(z.any())\n .optional()\n .describe(\"Array of allowed values for the flag.\"),\n env: z // Environment variables mapping\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\n \"Environment variable(s) to map to this flag. Logic: Fallback (Env -> Flag) and Sync (Flag -> Env). Precedence: Flag > Env > Default.\",\n ),\n dxtOptions: zodDxtOptionsSchema\n .optional()\n .describe(\n \"DXT-specific configuration options for enhanced DXT manifest generation\",\n ),\n dynamicRegister: z\n .custom<DynamicRegisterFn>((val) => typeof val === \"function\")\n .optional()\n .describe(\n \"Optional callback that can register additional flags dynamically when this flag is present.\",\n ),\n setWorkingDirectory: z\n .boolean()\n .optional()\n .describe(\n \"If true, this flag's value becomes the effective working directory for file operations.\",\n ),\n positional: z\n .number()\n .int()\n .positive(\"Positional index must be a positive integer (1, 2, 3...)\")\n .optional()\n .describe(\n \"If set, this flag captures the Nth trailing positional argument (1-indexed). \" +\n \"Multiple flags can have different positional values to capture multiple trailing args in order.\",\n ),\n })\n // Allow unrecognized properties by default in Zod v4\n .transform((obj) => {\n // Alias handling for 'default' and 'required'\n const newObj: { [key: string]: any } = { ...obj };\n if (\n \"default\" in newObj &&\n newObj[\"default\"] !== undefined &&\n !(\"defaultValue\" in newObj)\n ) {\n newObj[\"defaultValue\"] = newObj[\"default\"];\n }\n if (\n \"required\" in newObj &&\n newObj[\"required\"] !== undefined &&\n !(\"mandatory\" in newObj)\n ) {\n newObj[\"mandatory\"] = newObj[\"required\"] as\n | boolean\n | ((parsedArgs: any) => boolean);\n }\n return newObj;\n });\n\n/**\n * The raw input type for defining a flag, before Zod processing (aliases, defaults).\n */\nexport type IFlagCore = z.input<typeof zodFlagSchema>;\n\n/**\n * The type of the `type` property in a ProcessedFlagCore object.\n * This represents all valid forms the `type` property can take after Zod processing.\n */\nexport type TParsedArgsTypeFromFlagDef =\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor\n | ((value: string) => any) // Sync custom parser function\n | ((value: string) => Promise<any>) // Async custom parser function\n | ZodTypeAny // Zod schema for structured JSON validation\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"array\"\n | \"object\"; // String literal types\n\n/**\n * The core type of a flag after Zod processing (defaults applied, aliases resolved),\n * but before some properties are made more specific (like `type` constructor to actual type).\n * This type is output by `zodFlagSchema.parse()`.\n */\nexport type ProcessedFlagCore = Omit<z.output<typeof zodFlagSchema>, \"type\"> & {\n type: TParsedArgsTypeFromFlagDef;\n};\n\n/**\n * DXT-specific configuration options for flags that will be included in DXT manifests.\n * These options control how the flag appears in DXT user_config and how it behaves in DXT environments.\n */\nexport interface IDxtOptions {\n /** Whether this field should be marked as sensitive in DXT user_config (default: true for ENV-linked flags) */\n sensitive?: boolean;\n\n /** Default value specific to DXT sandbox environment (different from regular default) */\n localDefault?: string;\n\n /** DXT input type - determines UI component in DXT clients (default: inferred from IFlag.type) */\n type?: \"string\" | \"directory\" | \"file\" | \"boolean\" | \"number\";\n\n /** Allow multiple values (for arrays) */\n multiple?: boolean;\n\n /** Minimum value (for number type) */\n min?: number;\n\n /** Maximum value (for number type) */\n max?: number;\n\n /** DXT-specific default value (overrides localDefault if provided) */\n default?: any;\n\n /** Custom title for the user_config field (overrides auto-generated title) */\n title?: string;\n}\n\n/**\n * The user-facing type for defining a flag. It includes aliases like `default` and `required`.\n * The `handler` property is removed as handlers are typically associated with commands/subcommands, not individual flags.\n */\nexport type IFlag = IFlagCore & {\n /** @alias defaultValue */\n default?: any;\n /** @alias mandatory */\n required?: boolean | ((parsedArgs: TParsedArgs<any>) => boolean);\n /** Environment variables that should be set from this flag's value in DXT packages */\n env?: string | string[];\n /** DXT-specific configuration options for enhanced DXT manifest generation */\n dxtOptions?: IDxtOptions;\n /** Optional callback to dynamically register additional flags when this flag is present */\n dynamicRegister?: DynamicRegisterFn;\n /**\n * If true, this flag's value becomes the effective working directory.\n * When set, all file operations (including .env loading) will be relative to this path.\n * Last flag with this property in the command chain wins.\n *\n * @alias chdir\n *\n * @example\n * ```typescript\n * .addFlag({\n * name: \"workspace\",\n * description: \"Workspace directory to operate in\",\n * options: [\"--workspace\", \"-w\"],\n * type: \"string\",\n * setWorkingDirectory: true,\n * })\n * ```\n *\n * @example\n * ```typescript\n * // User runs: my-cli --workspace ./packages/my-app\n * // Effective cwd becomes: /repo/packages/my-app/\n * // All .env files are loaded from: /repo/packages/my-app/\n * ```\n */\n setWorkingDirectory?: boolean;\n /**\n * Captures the Nth trailing positional argument (1-indexed).\n *\n * - `positional: 1` captures the first trailing arg\n * - `positional: 2` captures the second trailing arg\n * - etc.\n *\n * Positional args are assigned AFTER all flags and subcommands are parsed.\n * The flag's `options` array still works as a fallback (e.g., `--id xxx`).\n *\n * @example\n * ```typescript\n * .addFlag({\n * name: \"id\",\n * type: \"string\",\n * mandatory: true,\n * options: [\"--id\"], // Fallback: --id xxx\n * positional: 1, // Primary: workflow show xxx\n * description: \"Workflow ID to show\",\n * })\n * ```\n */\n positional?: number;\n};\n\n/**\n * Context for dynamic flag registration callbacks.\n */\nexport type DynamicRegisterContext = {\n value: any | any[];\n argsSoFar: Record<string, any>;\n parser: ArgParserInstance;\n processArgs: string[];\n forHelp?: boolean;\n registerFlags: (flags: readonly IFlag[]) => void;\n};\n\n/**\n * Function signature for dynamic flag loader/registrar.\n */\nexport type DynamicRegisterFn = (\n ctx: DynamicRegisterContext,\n) => Promise<readonly IFlag[] | void> | readonly IFlag[] | void;\n\n/**\n * A more refined type for a flag after it has been fully processed by ArgParser,\n * particularly its `type` property and validation/enum/mandatory functions.\n * This is the type that ArgParser would internally work with for parsing and type extraction.\n */\nexport type ProcessedFlag = Omit<\n ProcessedFlagCore,\n \"validate\" | \"enum\" | \"mandatory\"\n> & {\n // `type` is already correctly typed via ProcessedFlagCore.\n validate?: (\n value: any,\n parsedArgs?: TParsedArgs<ProcessedFlag[]>, // Parsed args up to this point\n ) => boolean | string | void | Promise<boolean | string | void>;\n enum?: any[]; // Enum values, type-checked by user or ArgParser\n mandatory?: boolean | ((parsedArgs: TParsedArgs<ProcessedFlag[]>) => boolean);\n env?: string | string[]; // Environment variables for DXT packages\n dynamicRegister?: DynamicRegisterFn;\n positional?: number; // Captures Nth trailing positional argument (1-indexed)\n};\n\n/**\n * Resolves the TypeScript type from a flag's `type` definition.\n */\nexport type ResolveType<T extends TParsedArgsTypeFromFlagDef> =\n T extends StringConstructor\n ? string\n : T extends NumberConstructor\n ? number\n : T extends BooleanConstructor\n ? boolean\n : T extends ArrayConstructor\n ? any[] // Default to array of any if not further specified\n : T extends ObjectConstructor\n ? Record<string, any> // Default to object with any properties\n : T extends ZodTypeAny\n ? z.infer<T> // Infer TypeScript type from Zod schema\n : T extends \"string\"\n ? string\n : T extends \"number\"\n ? number\n : T extends \"boolean\"\n ? boolean\n : T extends \"array\"\n ? any[] // Default for string literal 'array'\n : T extends \"object\"\n ? Record<string, any> // Default for string literal 'object'\n : T extends (value: string) => infer R // Custom parser function\n ? R // The return type of the custom parser\n : any; // Fallback type\n\n/**\n * Extracts the final TypeScript type for a flag's value based on its definition,\n * considering `flagOnly` and `allowMultiple` properties.\n */\nexport type ExtractFlagType<TFlag extends ProcessedFlag> =\n TFlag[\"flagOnly\"] extends true // If the flag is a \"flag-only\" (presence) type\n ? TFlag[\"allowMultiple\"] extends true\n ? boolean[] // Multiple presence flags result in an array of booleans\n : boolean // Single presence flag results in a boolean\n : TFlag[\"allowMultiple\"] extends true // If the flag can have multiple values\n ? Array<ResolveType<TFlag[\"type\"]>> // Results in an array of the resolved type\n : ResolveType<TFlag[\"type\"]>; // Single value of the resolved type\n\n/**\n * Represents the structured object of parsed arguments.\n * Keys are flag names, and values are their parsed and typed values.\n * `TFlags` should be the array of `ProcessedFlag` definitions for the specific command.\n */\nexport type TParsedArgs<TFlags extends readonly ProcessedFlag[]> = {\n [K in TFlags[number][\"name\"]]: ExtractFlagType<\n Extract<TFlags[number], { name: K }>\n >;\n};\n\n/**\n * Generic context object passed to command handlers.\n * @template TCurrentCommandArgs Shape of `args` for the current command, derived from its flags.\n * @template TParentCommandArgs Shape of `parentArgs` from the parent command, if any.\n */\nexport type IHandlerContext<\n TCurrentCommandArgs = any,\n TParentCommandArgs = any,\n> = {\n /** Parsed arguments specific to the current command. */\n args: TCurrentCommandArgs;\n /** Parsed arguments from the parent command, if this is a subcommand. */\n parentArgs?: TParentCommandArgs;\n /** The sequence of command names that led to this handler. */\n commandChain: string[];\n /** The `ArgParser` instance that invoked this handler (could be a subcommand's parser). */\n parser: ArgParserInstance;\n /** The parent `ArgParser` instance, if this is a subcommand handler. */\n parentParser?: ArgParserInstance;\n /** Optional: The root `ArgParser` instance of the CLI. */\n // rootParser?: ArgParserInstance;\n /** Indicates if the handler is being called from MCP mode (true) or CLI mode (false). */\n isMcp?: boolean;\n /**\n * Get a flag value with proper resolution priority (CLI flag > ENV > default).\n * Only available in MCP mode when isMcp is true.\n */\n getFlag?: (name: string) => any;\n /**\n * Display the help message for the current command context.\n */\n displayHelp: () => void;\n /**\n * The root path from the user's CLI command perspective.\n * This is the original current working directory when the CLI was invoked.\n *\n * Use this when you need to reference paths relative to where the user ran the command,\n * as opposed to the effective working directory (which may have been changed by\n * flags with `setWorkingDirectory`).\n *\n * @example\n * // User runs: my-cli --workspace ./packages/app --input ./data/file.txt\n * // From /repo/ directory\n *\n * // In handler:\n * console.log(ctx.rootPath); // \"/repo/\" (where user ran command)\n * console.log(process.cwd()); // \"/repo/packages/app/\" (effective cwd)\n * console.log(ctx.args.input); // \"./data/file.txt\" (relative to effective cwd)\n *\n * // To resolve ctx.args.input relative to user's cwd:\n * const userInputPath = path.resolve(ctx.rootPath, ctx.args.input);\n */\n rootPath?: string;\n /**\n * Data-safe logger instance.\n * In MCP mode, this logger ensures STDOUT safety by routing logs to STDERR or a file.\n */\n logger: any; // Using any to avoid circular dependency or complex type imports in types.ts\n};\n\n/**\n * Generic type for the collection of processed flags that an ArgParser instance manages.\n */\nexport type FlagsArray = readonly ProcessedFlag[];\n\n/**\n * Converts a flag type to a JSON Schema type string.\n * This function handles all possible flag type formats and returns a valid JSON Schema type.\n *\n * @param flagType - The flag type from IFlag or ProcessedFlag\n * @returns A JSON Schema type string: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\"\n *\n * @example\n * ```typescript\n * getJsonSchemaTypeFromFlag(String) // returns \"string\"\n * getJsonSchemaTypeFromFlag(\"number\") // returns \"number\"\n * getJsonSchemaTypeFromFlag((val) => parseInt(val)) // returns \"string\" (fallback for custom functions)\n * ```\n */\nexport function getJsonSchemaTypeFromFlag(\n flagType: TParsedArgsTypeFromFlagDef,\n): \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" {\n // Handle Zod schemas first\n if (flagType && typeof flagType === \"object\" && flagType._def) {\n // For Zod schemas, we'll return \"object\" as they represent structured data\n // The actual JSON Schema will be generated by the MCP integration layer\n return \"object\";\n }\n\n // Handle constructor functions\n if (typeof flagType === \"function\") {\n // Check if it's a built-in constructor\n if (flagType === String) return \"string\";\n if (flagType === Number) return \"number\";\n if (flagType === Boolean) return \"boolean\";\n if (flagType === Array) return \"array\";\n if (flagType === Object) return \"object\";\n\n // For custom parser functions, we can't determine the return type at compile time\n // so we default to \"string\" as the safest fallback for JSON Schema\n return \"string\";\n }\n\n // Handle string literals\n if (typeof flagType === \"string\") {\n const normalizedType = flagType.toLowerCase();\n switch (normalizedType) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n default:\n // Unknown string type, default to string\n return \"string\";\n }\n }\n\n // Fallback for any other type\n return \"string\";\n}\n\n/**\n * Common output schema patterns for typical CLI/MCP tool responses\n */\nexport const OutputSchemaPatterns = {\n /**\n * Simple success/error response pattern\n * @example { success: true, message: \"Operation completed\" }\n */\n successError: () =>\n z.object({\n success: z.boolean().describe(\"Whether the operation was successful\"),\n message: z\n .string()\n .optional()\n .describe(\"Optional message about the operation\"),\n error: z\n .string()\n .optional()\n .describe(\"Error message if operation failed\"),\n }),\n\n /**\n * Success response with data payload\n * @example { success: true, data: {...}, message: \"Data retrieved\" }\n */\n successWithData: (dataSchema?: z.ZodTypeAny) =>\n z.object({\n success: z.boolean().describe(\"Whether the operation was successful\"),\n data: dataSchema || z.any().describe(\"The response data\"),\n message: z\n .string()\n .optional()\n .describe(\"Optional message about the operation\"),\n error: z\n .string()\n .optional()\n .describe(\"Error message if operation failed\"),\n }),\n\n /**\n * List/array response pattern\n * @example { items: [...], count: 5, hasMore: false }\n */\n list: (itemSchema?: z.ZodTypeAny) =>\n z.object({\n items: z.array(itemSchema || z.any()).describe(\"Array of items\"),\n count: z.number().optional().describe(\"Total number of items\"),\n hasMore: z\n .boolean()\n .optional()\n .describe(\"Whether there are more items available\"),\n }),\n\n /**\n * File operation response pattern\n * @example { path: \"/path/to/file\", size: 1024, created: true }\n */\n fileOperation: () =>\n z.object({\n path: z.string().describe(\"File path\"),\n size: z.number().optional().describe(\"File size in bytes\"),\n created: z.boolean().optional().describe(\"Whether the file was created\"),\n modified: z\n .boolean()\n .optional()\n .describe(\"Whether the file was modified\"),\n exists: z.boolean().optional().describe(\"Whether the file exists\"),\n }),\n\n /**\n * Process execution response pattern\n * @example { exitCode: 0, stdout: \"output\", stderr: \"\", duration: 1500 }\n */\n processExecution: () =>\n z.object({\n exitCode: z.number().describe(\"Process exit code\"),\n stdout: z.string().optional().describe(\"Standard output\"),\n stderr: z.string().optional().describe(\"Standard error output\"),\n duration: z\n .number()\n .optional()\n .describe(\"Execution duration in milliseconds\"),\n command: z.string().optional().describe(\"The command that was executed\"),\n }),\n} as const;\n\n/**\n * Type for output schema pattern names with auto-completion support\n */\nexport type OutputSchemaPatternName = keyof typeof OutputSchemaPatterns;\n\n/**\n * Type for output schema configuration - supports pattern names, Zod schemas, or schema definition objects\n */\nexport type OutputSchemaConfig =\n | OutputSchemaPatternName\n | z.ZodTypeAny\n | Record<string, z.ZodTypeAny>;\n\n/**\n * Creates a Zod output schema from a pattern or custom definition\n *\n * @param pattern - Either a predefined pattern name, a Zod schema, or a schema definition object\n * @returns A Zod schema for output validation\n *\n * @example\n * ```typescript\n * // Using a predefined pattern\n * const schema1 = createOutputSchema('successError');\n *\n * // Using a custom Zod schema\n * const schema2 = createOutputSchema(z.object({ result: z.string() }));\n *\n * // Using a schema definition object\n * const schema3 = createOutputSchema({\n * result: z.string().describe(\"The result\"),\n * timestamp: z.string().describe(\"When the operation completed\")\n * });\n * ```\n */\nexport function createOutputSchema(pattern: OutputSchemaConfig): z.ZodTypeAny {\n // Handle predefined patterns\n if (typeof pattern === \"string\" && pattern in OutputSchemaPatterns) {\n return OutputSchemaPatterns[pattern]();\n }\n\n // Handle Zod schema directly\n if (pattern && typeof pattern === \"object\" && \"_def\" in pattern) {\n return pattern as z.ZodTypeAny;\n }\n\n // Handle schema definition object\n if (pattern && typeof pattern === \"object\") {\n return z.object(pattern as Record<string, z.ZodTypeAny>);\n }\n\n // Fallback to a generic success pattern\n return OutputSchemaPatterns.successError();\n}\n\n/**\n * Defines a subcommand within an ArgParser setup.\n * @template TSubCommandFlags Flags defined specifically FOR this subcommand.\n * @template TParentCommandFlags Flags defined for the PARENT of this subcommand.\n * @template THandlerReturn The expected return type of the subcommand's handler.\n */\nexport interface ISubCommand<\n TSubCommandFlags extends FlagsArray = FlagsArray,\n TParentCommandFlags extends FlagsArray = FlagsArray,\n THandlerReturn = any,\n> {\n name: string;\n description?: string;\n /** The ArgParser instance for this subcommand, typed with its own flags. */\n // Ideally: parser: ArgParser<TSubCommandFlags>; (if ArgParser class is made generic)\n parser: ArgParserInstance;\n /** Handler function for this subcommand. */\n handler?: (\n ctx: IHandlerContext<\n TParsedArgs<TSubCommandFlags>,\n TParsedArgs<TParentCommandFlags>\n >,\n ) => THandlerReturn | Promise<THandlerReturn>;\n /** Internal flag to identify MCP subcommands for proper exclusion from tool generation */\n isMcp?: boolean;\n /** MCP server information for DXT generation */\n mcpServerInfo?: {\n name: string;\n version: string;\n description?: string;\n };\n /** MCP tool generation options for DXT generation */\n mcpToolOptions?: any;\n}\n\n/**\n * Result of parsing operations that replaces process.exit() calls.\n * Provides structured information about the parsing outcome.\n */\nexport interface ParseResult<T = any> {\n /** Whether the parsing was successful */\n success: boolean;\n /** Exit code that would have been used with process.exit() */\n exitCode: number;\n /** The parsed data/result when successful */\n data?: T;\n /** Human-readable message about the result */\n message?: string;\n /** Whether the process should exit (for help, version, etc.) */\n shouldExit?: boolean;\n /** Type of result for better handling */\n type?: \"success\" | \"error\" | \"help\" | \"version\" | \"debug\";\n}\n\n/**\n * Configuration options for ArgParser behavior\n * @deprecated Use IArgParserParams for full configuration options. This interface will be removed in v3.0.\n */\nexport interface ArgParserOptions {\n /** Whether to automatically call process.exit() based on ParseResult (default: true for backward compatibility) */\n autoExit?: boolean;\n /** Whether to handle errors by exiting or throwing (default: true for backward compatibility) */\n handleErrors?: boolean;\n}\n\n/**\n * Configuration options for ArgParser runtime behavior\n * This is a more clearly named version of ArgParserOptions\n */\nexport interface ArgParserBehaviorOptions {\n /** Whether to automatically call process.exit() based on ParseResult (default: true for backward compatibility) */\n autoExit?: boolean;\n /** Whether to handle errors by exiting or throwing (default: true for backward compatibility) */\n handleErrors?: boolean;\n}\n\n/**\n * Type for the main handler of an ArgParser instance (root command or a command defined by an ArgParser).\n * @template TParserFlags Flags defined for this ArgParser instance.\n * @template TParentParserFlags Flags of the parent parser, if this parser is used as a subcommand.\n * @template THandlerReturn The expected return type of the handler.\n */\nexport type MainHandler<\n TParserFlags extends FlagsArray = FlagsArray,\n TParentParserFlags extends FlagsArray = FlagsArray,\n THandlerReturn = any,\n> = (\n ctx: IHandlerContext<\n TParsedArgs<TParserFlags>,\n TParsedArgs<TParentParserFlags>\n >,\n) => THandlerReturn | Promise<THandlerReturn>;\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ParseResult } from \"../core/types\";\n\n/**\n * Test utilities for DxtGenerator\n * Contains methods that are only used during testing\n */\nexport class DxtGeneratorTestUtils {\n private argParserInstance: any;\n private extractMcpServerInfo: () => any;\n private handleExit: (\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ) => ParseResult | never;\n\n constructor(\n argParserInstance: any,\n extractMcpServerInfo: () => any,\n handleExit: (\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ) => ParseResult | never,\n ) {\n this.argParserInstance = argParserInstance;\n this.extractMcpServerInfo = extractMcpServerInfo;\n this.handleExit = handleExit;\n }\n\n /**\n * Handles DXT generation in test mode by creating mock DXT package structure\n * This method creates simplified mock files for testing purposes\n */\n public async handleTestModeDxtGeneration(\n processArgs: string[],\n buildDxtIndex: number,\n ): Promise<ParseResult> {\n try {\n // Get output directory from arguments (test mode expects directory argument)\n const outputDir = processArgs[buildDxtIndex + 1] || \"./dxt-packages\";\n\n // Check if we have MCP configuration\n const mcpTools = this.argParserInstance.toMcpTools();\n if (mcpTools.length === 0) {\n return this.handleExit(0, \"No MCP servers found\", \"success\");\n }\n\n // Extract server info from the unified MCP configuration\n const serverInfo = this.extractMcpServerInfo();\n\n // Create mock DXT package structure for testing\n const folderName = `${serverInfo.name.replace(/[^a-zA-Z0-9_-]/g, \"_\")}-dxt`;\n const buildDir = path.join(outputDir, folderName);\n\n // Ensure build directory exists\n if (!fs.existsSync(buildDir)) {\n fs.mkdirSync(buildDir, { recursive: true });\n }\n\n // Create mock manifest.json with DXT-compliant structure\n const manifest = {\n dxt_version: \"0.1\",\n name: serverInfo.name,\n version: serverInfo.version,\n description: serverInfo.description,\n author: serverInfo.author,\n server: {\n type: \"node\",\n entry_point: \"server/index.mjs\",\n mcp_config: {\n command: \"node\",\n args: [\"${__dirname}/server/index.mjs\", \"--s-mcp-serve\"],\n env: {},\n },\n },\n tools: mcpTools.map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n })),\n icon: \"logo.jpg\",\n };\n\n fs.writeFileSync(\n path.join(buildDir, \"manifest.json\"),\n JSON.stringify(manifest, null, 2),\n );\n\n // Create mock package.json\n const packageJson = {\n name: serverInfo.name,\n version: serverInfo.version,\n description: serverInfo.description,\n main: \"index.mjs\",\n type: \"module\",\n };\n fs.writeFileSync(\n path.join(buildDir, \"package.json\"),\n JSON.stringify(packageJson, null, 2),\n );\n\n // Create mock README.md\n const readme = `# ${serverInfo.name}\\n\\n${serverInfo.description}\\n\\nGenerated by @alcyone-labs/arg-parser`;\n fs.writeFileSync(path.join(buildDir, \"README.md\"), readme);\n\n // Create mock build script\n const buildScript = `#!/bin/bash\\necho \"Mock DXT build script for ${serverInfo.name}\"`;\n fs.writeFileSync(\n path.join(buildDir, \"build-dxt-package.sh\"),\n buildScript,\n );\n\n return this.handleExit(0, \"DXT package generation completed\", \"success\", {\n entryPoint: \"test-mode\",\n outputDir: buildDir,\n });\n } catch (error) {\n return this.handleExit(\n 1,\n `Test mode DXT generation failed: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n /**\n * Checks if the current environment is in test mode\n * Used to determine whether to use test utilities or production code\n */\n public static isTestMode(): boolean {\n return (\n process.env[\"NODE_ENV\"] === \"test\" ||\n process.argv[0]?.includes(\"vitest\") ||\n process.argv[1]?.includes(\"vitest\") ||\n process.argv[1]?.includes(\"tinypool\")\n );\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createPathsMatcher, getTsconfig } from \"get-tsconfig\";\nimport chalk from \"@alcyone-labs/simple-chalk\";\nimport { DxtPathResolver } from \"../core/dxt-path-resolver\";\nimport type { ParseResult } from \"../core/types\";\nimport { getJsonSchemaTypeFromFlag } from \"../core/types\";\nimport { DxtGeneratorTestUtils } from \"./DxtGenerator-testUtils\";\n\n// tsdown types - Options type is not exported, using any for now\ntype TsdownOptions = any;\n\n/**\n * DxtGenerator handles the generation of DXT (Desktop Extension) packages\n * for MCP servers created from ArgParser instances.\n */\nexport class DxtGenerator {\n private argParserInstance: any;\n\n constructor(argParserInstance: any) {\n this.argParserInstance = argParserInstance;\n }\n\n /**\n * Helper method to handle exit logic based on autoExit setting\n */\n private _handleExit(\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ): ParseResult | never {\n const result: ParseResult = {\n success: exitCode === 0,\n exitCode,\n message,\n type: type || (exitCode === 0 ? \"success\" : \"error\"),\n shouldExit: true,\n data,\n };\n\n if (\n this.argParserInstance.getAutoExit() &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(exitCode as never);\n }\n\n return result;\n }\n\n /**\n * Handles the --s-build-dxt system flag to generate DXT packages for MCP servers\n */\n public async handleBuildDxtFlag(\n processArgs: string[],\n buildDxtIndex: number,\n ): Promise<boolean | ParseResult> {\n try {\n // Check if we're in test mode (vitest/jest environment)\n if (DxtGeneratorTestUtils.isTestMode()) {\n // In test mode, generate a mock DXT package structure\n const testUtils = new DxtGeneratorTestUtils(\n this.argParserInstance,\n () => this.extractMcpServerInfo(),\n (exitCode, message, type, data) =>\n this._handleExit(exitCode, message, type, data),\n );\n return await testUtils.handleTestModeDxtGeneration(\n processArgs,\n buildDxtIndex,\n );\n }\n\n // Check for --s-with-node-modules flag\n const withNodeModules = processArgs.includes(\"--s-with-node-modules\");\n if (withNodeModules) {\n console.log(\n chalk.yellow(\n \"🗂️ --s-with-node-modules detected: will include node_modules in bundle\",\n ),\n );\n\n // Validate that node_modules exists and looks properly set up\n const nodeModulesPath = path.resolve(\"./node_modules\");\n if (!fs.existsSync(nodeModulesPath)) {\n console.error(\n chalk.red(\n \"❌ Error: node_modules directory not found. Please run the installation command first.\",\n ),\n );\n console.log(\n chalk.cyan(\n \"💡 Required command: pnpm install --prod --node-linker=hoisted\",\n ),\n );\n return this._handleExit(\n 1,\n \"node_modules directory not found\",\n \"error\",\n );\n }\n\n // Check if node_modules looks properly hoisted (no nested node_modules in immediate subdirs)\n try {\n const nodeModulesContents = fs.readdirSync(nodeModulesPath);\n const hasNestedNodeModules = nodeModulesContents\n .filter((item) => !item.startsWith(\".\") && !item.startsWith(\"@\"))\n .some((item) => {\n const itemPath = path.join(nodeModulesPath, item);\n try {\n return (\n fs.statSync(itemPath).isDirectory() &&\n fs.existsSync(path.join(itemPath, \"node_modules\"))\n );\n } catch {\n return false;\n }\n });\n\n if (hasNestedNodeModules) {\n console.warn(\n chalk.yellow(\n \"⚠️ Warning: Detected nested node_modules. For best results, ensure hoisted installation:\",\n ),\n );\n console.log(\n chalk.cyan(\n \" rm -rf node_modules && pnpm install --prod --node-linker=hoisted\",\n ),\n );\n } else {\n console.log(\n chalk.green(\n \"✅ node_modules appears properly hoisted and ready for bundling\",\n ),\n );\n }\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠️ Could not validate node_modules structure: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n\n console.log(\n chalk.gray(\n \"💡 This will create a fully autonomous DXT with all native dependencies included\",\n ),\n );\n }\n\n // The entry point is the script that called this flag (process.argv[1])\n const entryPointFile = process.argv[1];\n\n if (!entryPointFile || !fs.existsSync(entryPointFile)) {\n console.error(\n chalk.red(`Error: Entry point file not found: ${entryPointFile}`),\n );\n return this._handleExit(1, \"Entry point file not found\", \"error\");\n }\n\n // Get the output directory from arguments (defaults to './dxt')\n let outputDir = processArgs[buildDxtIndex + 1] || \"./dxt\";\n // If the output folder was not specified but other system flags were.\n if (outputDir.startsWith(\"--s-\")) outputDir = \"./dxt\";\n\n console.log(\n chalk.cyan(\n `\\n🔧 Building DXT package for entry point: ${entryPointFile}`,\n ),\n );\n console.log(chalk.gray(`Output directory: ${outputDir}`));\n console.log(chalk.gray(`Entrypoint file: ${entryPointFile}`));\n\n // Build the DXT package using TSDown\n await this.buildDxtWithTsdown(entryPointFile, outputDir, withNodeModules);\n\n console.log(chalk.green(`\\n✅ DXT package generation completed!`));\n\n return this._handleExit(\n 0,\n \"DXT package generation completed\",\n \"success\",\n { entryPoint: entryPointFile, outputDir },\n );\n } catch (error) {\n console.error(\n chalk.red(\n `Error generating DXT package: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return this._handleExit(\n 1,\n `Error generating DXT package: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n /**\n * Extracts server information from MCP configuration\n * Now supports both withMcp() configuration and legacy addMcpSubCommand()\n */\n private extractMcpServerInfo(mcpSubCommand?: any): any {\n // First, try to get server info from withMcp() configuration\n if ((this.argParserInstance as any).getMcpServerConfig) {\n const mcpConfig = (this.argParserInstance as any).getMcpServerConfig();\n if (mcpConfig?.serverInfo) {\n return mcpConfig.serverInfo;\n }\n }\n\n // Fallback: Use the stored server info from addMcpSubCommand if available\n if (mcpSubCommand?.mcpServerInfo) {\n return mcpSubCommand.mcpServerInfo;\n }\n\n // Final fallback: Generate default info from ArgParser instance\n const appName = this.argParserInstance.getAppName();\n const appCommandName = this.argParserInstance.getAppCommandName();\n const description =\n (this.argParserInstance as any).getDescription?.() ||\n \"MCP server generated from ArgParser\";\n\n const defaultInfo = {\n name:\n appCommandName ||\n appName?.toLowerCase().replace(/[^a-zA-Z0-9_-]/g, \"_\") ||\n \"mcp-server\",\n version: \"1.0.0\",\n description: description,\n };\n\n return defaultInfo;\n }\n\n // Additional methods will be added in subsequent edits...\n\n private generateMcpToolsForDxt(\n mcpSubCommand?: any,\n ): Array<{ name: string; description?: string }> {\n try {\n // Check if this is an ArgParser instance with MCP capabilities\n if (typeof (this.argParserInstance as any).toMcpTools === \"function\") {\n // Get tool options from withMcp() configuration or fallback to subcommand\n let toolOptions = mcpSubCommand?.mcpToolOptions;\n\n // Try to get tool options from withMcp() configuration\n if ((this.argParserInstance as any).getMcpServerConfig) {\n const mcpConfig = (\n this.argParserInstance as any\n ).getMcpServerConfig();\n if (mcpConfig?.toolOptions) {\n toolOptions = mcpConfig.toolOptions;\n }\n }\n\n // Use the unified MCP tool generation (includes both CLI-generated and manual tools)\n const mcpTools = (this.argParserInstance as any).toMcpTools(\n toolOptions,\n );\n\n return mcpTools.map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n }));\n }\n\n // Fallback: create simplified tool list based on parser structure (DXT-compliant)\n const tools: Array<{ name: string; description?: string }> = [];\n\n // Add main command tool if there's a handler\n if (\n this.argParserInstance.getHandler &&\n this.argParserInstance.getHandler()\n ) {\n const appName = this.argParserInstance.getAppName() || \"main\";\n const commandName =\n this.argParserInstance.getAppCommandName() ||\n appName.toLowerCase().replace(/[^a-zA-Z0-9_-]/g, \"_\");\n\n tools.push({\n name: commandName,\n description:\n this.argParserInstance.getDescription() ||\n `Execute ${appName} command`,\n });\n }\n\n // Add subcommand tools (excluding MCP subcommands to avoid recursion)\n for (const [name, subCmd] of this.argParserInstance.getSubCommands()) {\n if (!(subCmd as any).isMcp) {\n const commandName =\n this.argParserInstance.getAppCommandName() ||\n this.argParserInstance\n .getAppName()\n ?.toLowerCase()\n .replace(/[^a-zA-Z0-9_-]/g, \"_\") ||\n \"main\";\n tools.push({\n name: `${commandName}_${name}`,\n description:\n (subCmd as any).description || `Execute ${name} subcommand`,\n });\n }\n }\n\n return tools.length > 0\n ? tools\n : [\n {\n name: \"main\",\n description: \"Main command tool\",\n },\n ];\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not generate detailed tool list: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return [\n {\n name: \"main\",\n description: \"Main command tool\",\n },\n ];\n }\n }\n\n /**\n * Maps ArgParser flag types to DXT user config types\n */\n /**\n * Adds the logo to the build folder if available\n * @returns The filename of the logo that was added, or undefined if no logo was added\n */\n private async addLogoToFolder(\n buildDir: string,\n serverInfo?: any,\n entryPointFile?: string,\n ): Promise<string | undefined> {\n try {\n let logoBuffer: Buffer | null = null;\n let logoFilename = \"logo.jpg\";\n\n // First, try to use custom logo from serverInfo\n if (serverInfo?.logo) {\n const customLogo = serverInfo.logo;\n\n if (\n customLogo.startsWith(\"http://\") ||\n customLogo.startsWith(\"https://\")\n ) {\n // Download logo from URL\n try {\n console.log(`📥 Downloading logo from: ${customLogo}`);\n const response = await fetch(customLogo);\n if (response.ok) {\n logoBuffer = Buffer.from(await response.arrayBuffer());\n // Extract extension from URL and normalize to logo.ext format\n const urlPath = new URL(customLogo).pathname;\n const urlFilename = path.basename(urlPath);\n if (urlFilename && urlFilename.includes(\".\")) {\n const ext = path.extname(urlFilename);\n logoFilename = `logo${ext}`;\n } else {\n logoFilename = \"logo.jpg\"; // fallback if no extension detected\n }\n console.log(\"✓ Downloaded logo from URL\");\n } else {\n console.warn(\n `⚠ Failed to download logo: HTTP ${response.status}`,\n );\n }\n } catch (error) {\n console.warn(\n \"⚠ Failed to download logo from URL:\",\n error instanceof Error ? error.message : String(error),\n );\n }\n } else {\n // Try to read logo from local file path\n // If entryPointFile is provided and customLogo is relative, resolve relative to entry point\n let logoPath: string;\n if (entryPointFile && !path.isAbsolute(customLogo)) {\n // Resolve relative to the directory containing the entry point file\n const entryDir = path.dirname(entryPointFile);\n logoPath = path.resolve(entryDir, customLogo);\n console.log(\n `📍 Resolving logo path relative to entry point: ${logoPath}`,\n );\n } else {\n // Absolute path or no entry point provided - resolve relative to cwd\n logoPath = path.resolve(customLogo);\n }\n\n if (fs.existsSync(logoPath)) {\n logoBuffer = fs.readFileSync(logoPath);\n const ext = path.extname(logoPath);\n logoFilename = `logo${ext}`;\n console.log(\"✓ Added custom logo from local file\");\n } else {\n console.warn(`⚠ Custom logo file not found: ${logoPath}`);\n }\n }\n }\n\n // Fallback to default logo if no custom logo was loaded\n if (!logoBuffer) {\n // Get current directory equivalent for ES modules\n const currentDir = path.dirname(new URL(import.meta.url).pathname);\n\n // Try to find the default logo in the dist/assets folder (built version)\n let logoPath = path.join(currentDir, \"assets\", \"logo_1_small.jpg\");\n\n // If not found, try the source location (development)\n if (!fs.existsSync(logoPath)) {\n logoPath = path.join(\n currentDir,\n \"..\",\n \"docs\",\n \"MCP\",\n \"icons\",\n \"logo_1_small.jpg\",\n );\n }\n\n // If still not found, try relative to process.cwd()\n if (!fs.existsSync(logoPath)) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n logoPath = path.join(\n currentDir,\n \"docs\",\n \"MCP\",\n \"icons\",\n \"logo_1_small.jpg\",\n );\n }\n\n // If still not found, try node_modules (when package is installed)\n if (!fs.existsSync(logoPath)) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n logoPath = path.join(\n currentDir,\n \"node_modules\",\n \"@alcyone-labs\",\n \"arg-parser\",\n \"dist\",\n \"assets\",\n \"logo_1_small.jpg\",\n );\n }\n\n // If still not found, try package root dist/assets (for local build)\n if (!fs.existsSync(logoPath)) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n logoPath = path.join(\n currentDir,\n \"dist\",\n \"assets\",\n \"logo_1_small.jpg\",\n );\n }\n\n if (fs.existsSync(logoPath)) {\n logoBuffer = fs.readFileSync(logoPath);\n const ext = path.extname(logoPath);\n logoFilename = `logo${ext}`;\n console.log(\"✓ Added default logo to build folder\");\n } else {\n console.warn(\n \"⚠ No logo found (custom or default), build folder will be created without icon\",\n );\n return undefined;\n }\n }\n\n // Write logo to build folder\n if (logoBuffer) {\n fs.writeFileSync(path.join(buildDir, logoFilename), logoBuffer);\n return logoFilename;\n }\n\n return undefined;\n } catch (error) {\n console.warn(\n \"⚠ Failed to add logo to build folder:\",\n error instanceof Error ? error.message : String(error),\n );\n return undefined;\n }\n }\n\n /**\n * Builds a complete DXT package using TSDown CLI for autonomous execution\n */\n private async buildDxtWithTsdown(\n entryPointFile: string,\n outputDir: string = \"./dxt\",\n withNodeModules: boolean = false,\n ): Promise<void> {\n try {\n console.log(chalk.cyan(\"🔧 Building DXT package with TSDown...\"));\n\n // Find project root and calculate relative entry path\n const projectRoot = this.findProjectRoot(entryPointFile);\n const absoluteEntryPath = path.resolve(entryPointFile);\n const relativeEntryPath = path.relative(projectRoot, absoluteEntryPath);\n\n console.log(chalk.gray(`Entry point: ${entryPointFile}`));\n console.log(chalk.gray(`Project root: ${projectRoot}`));\n console.log(chalk.gray(`Relative entry path: ${relativeEntryPath}`));\n\n // Copy .dxtignore template\n const dxtIgnorePath = this.getDxtIgnoreTemplatePath();\n if (fs.existsSync(dxtIgnorePath)) {\n fs.copyFileSync(dxtIgnorePath, path.join(projectRoot, \".dxtignore\"));\n }\n\n // Handle logo copying/downloading to working directory\n const serverInfo = this.extractMcpServerInfo();\n const logoFilename = await this.addLogoToFolder(\n projectRoot,\n serverInfo,\n entryPointFile,\n );\n console.log(\n logoFilename\n ? chalk.gray(`✓ Logo prepared: ${logoFilename}`)\n : chalk.gray(\"⚠ No logo available\"),\n );\n\n // Run TSDown build from the project root directory\n const originalCwd =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n try {\n // process.chdir(projectRoot);\n\n // Dynamic import TSDown to handle optional dependency\n const { build } = await import(\"tsdown\");\n\n console.log(chalk.gray(`Building with TSDown: ${relativeEntryPath}`));\n console.log(\n chalk.green(\n `${withNodeModules ? \"with node_modules\" : \"without node_modules\"}`,\n ),\n );\n\n // Extract MCP config for use in copy function\n const mcpConfig = (\n this.argParserInstance as any\n ).getMcpServerConfig?.();\n\n // Preserve directory structure by including the entry directory in outDir\n const entryDir = path.dirname(relativeEntryPath);\n const preservedOutDir =\n entryDir !== \".\" && entryDir !== \"\"\n ? path.resolve(originalCwd, outputDir, entryDir)\n : path.resolve(originalCwd, outputDir);\n\n const buildConfig: TsdownOptions = {\n entry: [relativeEntryPath],\n outDir: preservedOutDir,\n format: [\"es\"],\n target: \"node22\",\n define: {\n // Define any compile-time constants\n NODE_ENV: \"production\",\n },\n dts: true,\n minify: false,\n sourcemap: false,\n // Remove all output folders and artefacts\n clean: [outputDir, \"./.dxtignore\", `${outputDir}.dxt`],\n silent: process.env[\"NO_SILENCE\"] !== \"1\",\n unbundle: true,\n external: (id: string, importer?: string) => {\n try {\n const external = this.shouldModuleBeExternal(\n id,\n importer,\n withNodeModules,\n );\n\n if (Boolean(process.env[\"DEBUG\"]))\n console.log(\n `[${chalk.blue(\"External\")}] ${chalk.yellow(external ? \"true\" : \"false\")} for module: (${chalk.green(id)}), path: '${chalk.grey(importer ?? \"\")}'`,\n );\n\n return Boolean(external);\n } catch (error) {\n console.warn(\n `Warning: Error in external function for ${id}:`,\n error,\n );\n return true; // Default to external on error\n }\n },\n noExternal: (id: string, importer?: string) => {\n try {\n const external = this.shouldModuleBeExternal(\n id,\n importer,\n withNodeModules,\n );\n\n if (Boolean(process.env[\"DEBUG\"]))\n console.log(\n `[${chalk.yellow(\"noExternal\")}] ${chalk.yellow(external === false ? \"true\" : \"false\")} for module: (${chalk.green(id)}), path: '${chalk.grey(importer ?? \"\")}'`,\n );\n\n return Boolean(external === false);\n } catch (error) {\n console.warn(\n `Warning: Error in noExternal function for ${id}:`,\n error,\n );\n return false; // Default to not noExternal on error\n }\n },\n copy: async (\n options: any,\n ): Promise<Array<string | { from: string; to: string }>> => {\n try {\n const outputPaths: Array<string | { from: string; to: string }> =\n [\"package.json\"];\n\n // Only include node_modules if --s-with-node-modules flag is set\n if (withNodeModules) {\n console.log(\n chalk.gray(\n \"📦 Including node_modules in bundle (may take longer)...\",\n ),\n );\n outputPaths.push(\"node_modules\");\n }\n\n // Calculate the DXT package root (parent of outDir when preserving structure)\n const dxtPackageRoot =\n entryDir !== \".\" && entryDir !== \"\"\n ? path.dirname(options.outDir)\n : options.outDir;\n\n // Add logo if it was successfully prepared\n if (logoFilename) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n const logoPath = path.join(currentDir, logoFilename);\n if (fs.existsSync(logoPath)) {\n console.log(chalk.gray(`Adding logo from: ${logoPath}`));\n outputPaths.push({\n from: logoPath,\n to: path.join(dxtPackageRoot, logoFilename),\n });\n }\n }\n\n // Add user-specified include files from DXT configuration\n if (mcpConfig?.dxt?.include) {\n console.log(\n chalk.gray(\n \"📁 Including additional files from DXT configuration...\",\n ),\n );\n\n for (const includeItem of mcpConfig.dxt.include) {\n if (typeof includeItem === \"string\") {\n // Simple string path - copy to same relative location in DXT package root\n // First substitute any DXT variables in the path\n const resolvedIncludePath =\n DxtPathResolver.substituteVariables(\n includeItem,\n DxtPathResolver.detectContext(),\n { allowUndefined: true }, // Allow undefined variables for flexibility\n );\n const sourcePath = path.resolve(\n projectRoot,\n resolvedIncludePath,\n );\n if (fs.existsSync(sourcePath)) {\n console.log(chalk.gray(` • ${resolvedIncludePath}`));\n outputPaths.push({\n from: sourcePath,\n to: path.join(dxtPackageRoot, resolvedIncludePath),\n });\n } else {\n console.warn(\n chalk.yellow(\n ` ⚠ File not found: ${resolvedIncludePath} (resolved to ${sourcePath})`,\n ),\n );\n }\n } else {\n // Object with from/to mapping - copy to specified location in DXT package root\n // Substitute DXT variables in both from and to paths\n const resolvedFromPath =\n DxtPathResolver.substituteVariables(\n includeItem.from,\n DxtPathResolver.detectContext(),\n { allowUndefined: true },\n );\n const resolvedToPath = DxtPathResolver.substituteVariables(\n includeItem.to,\n DxtPathResolver.detectContext(),\n { allowUndefined: true },\n );\n const sourcePath = path.resolve(\n projectRoot,\n resolvedFromPath,\n );\n if (fs.existsSync(sourcePath)) {\n console.log(\n chalk.gray(\n ` • ${resolvedFromPath} → ${resolvedToPath}`,\n ),\n );\n outputPaths.push({\n from: sourcePath,\n to: path.join(dxtPackageRoot, resolvedToPath),\n });\n } else {\n console.warn(\n chalk.yellow(\n ` ⚠ File not found: ${resolvedFromPath} (resolved to ${sourcePath})`,\n ),\n );\n }\n }\n }\n }\n\n return outputPaths;\n } catch (error) {\n console.warn(`Warning: Error in copy function:`, error);\n return [\"package.json\"]; // Return minimal copy list on error\n }\n },\n platform: \"node\" as const,\n plugins: [],\n };\n\n // Debug output and config file generation\n if (process.env[\"DEBUG\"] === \"1\") {\n console.log(chalk.cyan(\"🐛 DEBUG: TSDown build configuration:\"));\n console.log(JSON.stringify(buildConfig, null, 2));\n\n // Create dxt directory if it doesn't exist\n if (!fs.existsSync(\"dxt\")) {\n fs.mkdirSync(\"dxt\", { recursive: true });\n }\n\n // Write config to file for debugging\n const configContent = `// TSDown configuration used for DXT build\n// Generated on ${new Date().toISOString()}\nimport { build } from 'tsdown';\n\nexport default ${JSON.stringify(buildConfig, null, 2)};\n\n// To run manually:\n// npx tsdown -c tsdown.config.dxt.ts\n`;\n fs.writeFileSync(\n path.join(\"dxt\", \"tsdown.config.dxt.ts\"),\n configContent,\n );\n console.log(\n chalk.gray(\"📝 Debug config written to dxt/tsdown.config.dxt.ts\"),\n );\n }\n\n try {\n await build(buildConfig as any);\n console.log(chalk.green(\"✅ TSDown bundling completed\"));\n } catch (buildError) {\n console.error(chalk.red(\"❌ TSDown build failed with error:\"));\n console.error(buildError);\n if (buildError instanceof Error) {\n console.error(chalk.red(\"Error message:\"), buildError.message);\n console.error(chalk.red(\"Error stack:\"), buildError.stack);\n }\n throw new Error(\n `TSDown DXT build failed: ${buildError instanceof Error ? buildError.message : String(buildError)}`,\n );\n }\n\n // Determine the actual output filename from TSDown\n const detectedOutputFile = this.detectTsdownOutputFile(\n outputDir,\n relativeEntryPath.replace(/\\.ts$/, \".js\"),\n );\n\n // Copy manifest and logo to the output directory\n await this.setupDxtPackageFiles(\n entryPointFile,\n outputDir,\n detectedOutputFile ?? undefined,\n logoFilename ?? \"logo.jpg\",\n );\n\n // Run dxt pack (temporarily disabled due to dynamic import issues)\n console.log(chalk.cyan(\"📦 DXT package ready for packing\"));\n console.log(\n chalk.gray(\n `To complete the process, run: npx @anthropic-ai/dxt pack ${outputDir}/`,\n ),\n );\n // await this.packDxtPackage();\n } finally {\n process.chdir(originalCwd);\n }\n } catch (error) {\n throw new Error(\n `TSDown DXT build failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Checks if a module ID is a Node.js built-in\n */\n public isNodeBuiltin(id: string): boolean {\n const nodeBuiltins = [\n \"stream\",\n \"fs\",\n \"path\",\n \"url\",\n \"util\",\n \"events\",\n \"child_process\",\n \"os\",\n \"tty\",\n \"process\",\n \"crypto\",\n \"http\",\n \"https\",\n \"net\",\n \"zlib\",\n \"fs/promises\",\n \"timers\",\n \"timers/promises\",\n \"perf_hooks\",\n \"async_hooks\",\n \"inspector\",\n \"v8\",\n \"vm\",\n \"assert\",\n \"constants\",\n \"module\",\n \"repl\",\n \"string_decoder\",\n \"punycode\",\n \"domain\",\n \"querystring\",\n \"readline\",\n \"worker_threads\",\n \"cluster\",\n \"dgram\",\n \"dns\",\n \"buffer\",\n ];\n\n return nodeBuiltins.includes(id) || id.startsWith(\"node:\");\n }\n\n /**\n * Determines if a module should be treated as external based on bundling configuration.\n * This logic is shared between external and noExternal configurations.\n *\n * @param id - The module identifier (e.g., 'lodash', '@types/node', './utils')\n * @param importer - The file path that is importing this module (undefined for entry points)\n * @param withNodeModules - Whether to include node_modules in the bundle\n * @returns true if the module should be external (not bundled), false if it should be bundled\n *\n * Logic flow:\n * 1. Node built-ins (fs, path, etc.) are always external\n * 2. If no importer (entry point), always bundle\n * 3. If withNodeModules is false, bundle everything except Node built-ins\n * 4. If withNodeModules is true:\n * - If importer is from node_modules, make external\n * - If module resolves to a project file (via TS paths or regular paths), bundle it\n * - Otherwise, make external (likely npm package)\n *\n * @example\n * // Node built-in - always external\n * shouldModuleBeExternal('fs', './src/main.ts', true) // returns true\n *\n * // Project file via TS paths or regular paths - bundle it\n * shouldModuleBeExternal('@/utils', './src/main.ts', true) // returns false\n *\n * // NPM package - external when withNodeModules=true\n * shouldModuleBeExternal('lodash', './src/main.ts', true) // returns true\n */\n private shouldModuleBeExternal(\n id: string,\n importer: string | undefined,\n withNodeModules: boolean,\n ): boolean {\n if (this.isNodeBuiltin(id)) {\n // Node built-ins are always external\n return true;\n }\n\n if (importer) {\n if (withNodeModules) {\n if (importer.includes(\"node_modules\")) {\n return true;\n } else {\n const resolvedPath = this.resolveModulePath(id, importer);\n // If the path was resolved (via TS paths or regular file resolution)\n // We consider it to be a project file, so we bundle it\n if (resolvedPath) {\n return false;\n } else {\n return true;\n }\n }\n } else {\n // We bundle everything\n return false;\n }\n } else {\n // If no importer, it's the entrypoint\n return false;\n }\n }\n\n /**\n * Checks if a package ID exists in the local node_modules folder.\n * Only checks the folder or parent folder that contains the nearest package.json file.\n * Returns false if no package.json file is found after 3 parent directory traversals.\n *\n * Alternative approach using require.resolve():\n * ```ts\n * public isNodeModulesPackageWithResolve(packageId: string): boolean {\n * try {\n * require.resolve(packageId);\n * return true;\n * } catch {\n * return false;\n * }\n * }\n * ```\n *\n * Filesystem approach is preferred for bundler context because:\n * - Faster (no module resolution overhead)\n * - No side effects during build\n * - Predictable behavior in build vs runtime contexts\n */\n public isNodeModulesPackage(packageId: string): boolean {\n try {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n let searchDir = currentDir;\n let attempts = 0;\n const maxAttempts = 3;\n\n while (attempts < maxAttempts) {\n const packageJsonPath = path.join(searchDir, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n const nodeModulesPath = path.join(searchDir, \"node_modules\");\n if (!fs.existsSync(nodeModulesPath)) {\n return false;\n }\n\n const packagePath = path.join(nodeModulesPath, packageId);\n if (fs.existsSync(packagePath)) {\n const packagePackageJsonPath = path.join(\n packagePath,\n \"package.json\",\n );\n return fs.existsSync(packagePackageJsonPath);\n }\n\n return false;\n }\n\n const parentDir = path.dirname(searchDir);\n if (parentDir === searchDir) {\n break;\n }\n searchDir = parentDir;\n attempts++;\n }\n\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Get the path to the .dxtignore template file\n */\n private getDxtIgnoreTemplatePath(): string {\n // Try multiple locations for the .dxtignore template\n const possiblePaths = [\n // 1. From the built library assets (when installed via npm)\n path.join(\n path.dirname(new URL(import.meta.url).pathname),\n \"..\",\n \"assets\",\n \".dxtignore.template\",\n ),\n\n // 2. From node_modules/@alcyone-labs/arg-parser/dist/assets (when installed via npm)\n path.join(\n typeof process !== \"undefined\" ? process.cwd() : \"/test\",\n \"node_modules\",\n \"@alcyone-labs\",\n \"arg-parser\",\n \"dist\",\n \"assets\",\n \".dxtignore.template\",\n ),\n\n // 3. From the root directory (development/local build)\n path.join(\n typeof process !== \"undefined\" ? process.cwd() : \"/test\",\n \".dxtignore.template\",\n ),\n\n // 4. From the library root (when using local file dependency)\n path.join(\n typeof process !== \"undefined\" ? process.cwd() : \"/test\",\n \"..\",\n \"..\",\n \"..\",\n \".dxtignore.template\",\n ),\n ];\n\n for (const ignorePath of possiblePaths) {\n if (fs.existsSync(ignorePath)) {\n console.log(chalk.gray(`Found .dxtignore template at: ${ignorePath}`));\n return ignorePath;\n }\n }\n\n // Return empty string if not found - we'll skip copying the template\n console.log(chalk.yellow(\"⚠ .dxtignore template not found, skipping\"));\n return \"\";\n }\n\n /**\n * Sets up DXT package files (manifest.json) in the output directory\n */\n private async setupDxtPackageFiles(\n entryPointFile: string,\n outputDir: string = \"./dxt\",\n actualOutputFilename?: string,\n logoFilename: string = \"logo.jpg\",\n ): Promise<void> {\n const currentDir = typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n const dxtDir = path.resolve(currentDir, outputDir);\n if (!fs.existsSync(dxtDir)) {\n throw new Error(`TSDown output directory (${outputDir}) not found`);\n }\n\n // Read package.json for project information\n const packageJsonPath = path.join(currentDir, \"package.json\");\n let packageInfo: any = {};\n if (fs.existsSync(packageJsonPath)) {\n try {\n packageInfo = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\"));\n } catch (error) {\n console.warn(chalk.yellow(\"Warning: Could not read package.json\"));\n }\n }\n\n // Generate tools using the unified approach (DXT-compliant: only name and description)\n let tools: Array<{ name: string; description?: string }> = [];\n\n try {\n // Use the unified tool generation that includes both CLI and manual tools\n const mcpTools = this.generateMcpToolsForDxt();\n tools = mcpTools.map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n }));\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not generate unified tool list: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n\n // Fallback: Generate tools from main parser flags\n const mainFlags = this.argParserInstance.flags;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const flag of mainFlags) {\n // Skip help flag and system flags\n if (flag.name === \"help\" || flag.name.startsWith(\"s-\")) continue;\n\n properties[flag.name] = {\n type: getJsonSchemaTypeFromFlag(flag.type as any),\n description: flag.description || `${flag.name} parameter`,\n };\n\n if (flag.enum) {\n properties[flag.name].enum = flag.enum;\n }\n\n if (\n flag.defaultValue !== undefined &&\n typeof flag.defaultValue !== \"function\"\n ) {\n properties[flag.name].default = flag.defaultValue;\n }\n\n if (flag.mandatory) {\n required.push(flag.name);\n }\n }\n\n // Create fallback tool from the parser's configuration (DXT-compliant)\n const commandName = this.argParserInstance.getAppCommandName();\n tools = [\n {\n name: commandName || packageInfo.name || \"cli-tool\",\n description:\n packageInfo.description ||\n this.argParserInstance.getDescription() ||\n \"CLI tool\",\n },\n ];\n }\n\n // Extract environment variables and user config from the ArgParser instance\n const { envVars, userConfig } = this.generateEnvAndUserConfig();\n\n // Get server info from withMcp() configuration or fallback to package.json\n const serverInfo = this.extractMcpServerInfo();\n\n // Create DXT manifest using server info and package.json data\n let entryFileName: string;\n if (actualOutputFilename) {\n entryFileName = actualOutputFilename;\n } else {\n // Find project root and calculate relative path\n const projectRoot = this.findProjectRoot(entryPointFile);\n const absoluteEntryPath = path.resolve(entryPointFile);\n const relativeEntryPath = path.relative(projectRoot, absoluteEntryPath);\n entryFileName = relativeEntryPath.replace(/\\.ts$/, \".js\");\n }\n\n // Use server info if available, otherwise fallback to package.json (DXT-compliant)\n const manifest = {\n dxt_version: \"0.1\",\n name: serverInfo.name || packageInfo.name || \"mcp-server\",\n version: serverInfo.version || packageInfo.version || \"1.0.0\",\n description:\n serverInfo.description ||\n packageInfo.description ||\n \"MCP server generated by @alcyone-labs/arg-parser\",\n author: serverInfo.author || {\n name:\n packageInfo.author?.name ||\n packageInfo.author ||\n \"@alcyone-labs/arg-parser\",\n ...(packageInfo.author?.email && { email: packageInfo.author.email }),\n url:\n packageInfo.author?.url ||\n packageInfo.homepage ||\n packageInfo.repository?.url ||\n \"https://github.com/alcyone-labs/arg-parser\",\n },\n server: {\n type: \"node\",\n entry_point: entryFileName,\n mcp_config: {\n command: \"node\",\n args: [\n `\\${__dirname}/${entryFileName}`,\n \"--s-mcp-serve\",\n // Overwrite the CLI config to only use stdio to avoid conflicts\n \"--s-mcp-transport\",\n \"stdio\",\n ],\n env: envVars,\n },\n },\n tools: tools,\n icon: logoFilename,\n ...(Object.keys(userConfig).length > 0 && { user_config: userConfig }),\n repository: packageInfo.repository?.url\n ? {\n type: \"git\",\n url: packageInfo.repository?.url,\n }\n : undefined,\n license: packageInfo.license || \"MIT\",\n };\n\n fs.writeFileSync(\n path.join(dxtDir, \"manifest.json\"),\n JSON.stringify(manifest, null, 2),\n );\n\n console.log(chalk.gray(\"✅ DXT package files set up\"));\n }\n\n /**\n * Detects the actual output filename generated by TSDown\n */\n private detectTsdownOutputFile(\n outputDir: string,\n expectedBaseName: string,\n ): string | null {\n try {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n const dxtDir = path.resolve(currentDir, outputDir);\n if (!fs.existsSync(dxtDir)) {\n console.warn(\n chalk.yellow(`⚠ Output directory (${outputDir}) not found`),\n );\n return null;\n }\n\n // List all .js and .mjs files in the output directory (including subdirectories)\n const files: string[] = [];\n\n function findJsFiles(dir: string, relativePath: string = \"\"): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and other non-source directories\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) {\n continue;\n }\n // Recursively search subdirectories\n findJsFiles(fullPath, relativeFilePath);\n } else if (\n (entry.name.endsWith(\".js\") || entry.name.endsWith(\".mjs\")) &&\n !entry.name.includes(\"chunk-\") &&\n !entry.name.includes(\"dist-\") &&\n !entry.name.startsWith(\".\")\n ) {\n files.push(relativeFilePath);\n }\n }\n }\n\n findJsFiles(dxtDir);\n\n // First, try to find exact match based on the expected filename\n // expectedBaseName might be \"src/cli.js\" so we need to handle the full path\n const expectedJsFile = expectedBaseName.endsWith(\".js\")\n ? expectedBaseName\n : expectedBaseName.replace(/\\.ts$/, \".js\");\n const expectedMjsFile = expectedBaseName.endsWith(\".mjs\")\n ? expectedBaseName\n : expectedBaseName.replace(/\\.ts$/, \".mjs\");\n\n // Look for exact matches first (including directory structure)\n if (files.includes(expectedJsFile)) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${expectedJsFile}`));\n return expectedJsFile;\n }\n\n if (files.includes(expectedMjsFile)) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${expectedMjsFile}`));\n return expectedMjsFile;\n }\n\n // Fallback: try to match just the basename for backward compatibility\n const baseNameWithoutExt = path.parse(expectedBaseName).name;\n for (const ext of [\".js\", \".mjs\"]) {\n const exactMatch = `${baseNameWithoutExt}${ext}`;\n if (files.includes(exactMatch)) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${exactMatch}`));\n return exactMatch;\n }\n }\n\n // If no exact match, look for the largest non-chunk file (likely the main entry)\n const mainFiles = files.filter(\n (file) =>\n !file.includes(\"chunk\") &&\n !file.includes(\"dist\") &&\n file !== \"logo.jpg\" &&\n file !== \"manifest.json\",\n );\n\n if (mainFiles.length === 1) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${mainFiles[0]}`));\n return mainFiles[0];\n }\n\n // If multiple candidates, pick the one with the most similar name or largest size\n if (mainFiles.length > 1) {\n let bestMatch = mainFiles[0];\n let bestScore = 0;\n\n for (const file of mainFiles) {\n const filePath = path.join(dxtDir, file);\n const stats = fs.statSync(filePath);\n\n // Score based on name similarity and file size\n const nameScore = file.includes(baseNameWithoutExt) ? 100 : 0;\n const sizeScore = Math.min(stats.size / 1000, 50); // Cap at 50KB for scoring\n const totalScore = nameScore + sizeScore;\n\n if (totalScore > bestScore) {\n bestScore = totalScore;\n bestMatch = file;\n }\n }\n\n console.log(\n chalk.gray(\n `✓ Detected TSDown output: ${bestMatch} (best match from ${mainFiles.length} candidates)`,\n ),\n );\n return bestMatch;\n }\n\n console.warn(\n chalk.yellow(`⚠ Could not detect TSDown output file in ${outputDir}`),\n );\n return null;\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠ Error detecting TSDown output: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return null;\n }\n }\n\n private findProjectRoot(entryPointFile: string): string {\n let currentDir = path.dirname(path.resolve(entryPointFile));\n let attempts = 0;\n const maxAttempts = 5;\n\n while (attempts < maxAttempts) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n attempts++;\n }\n\n throw new Error(\n `Could not find package.json within ${maxAttempts} directories up from ${entryPointFile}. ` +\n `Please ensure your entry point is within a project that has a package.json file.`,\n );\n }\n\n /**\n * Validate dxtOptions for common mistakes and security issues\n * @param flag The flag with dxtOptions to validate\n * @param envVar The environment variable name for context\n */\n private validateDxtOptions(flag: any, envVar: string): void {\n const dxtOptions = flag.dxtOptions;\n if (!dxtOptions) return;\n\n // Critical validations (throw errors)\n if (dxtOptions.min !== undefined && dxtOptions.max !== undefined) {\n if (dxtOptions.min > dxtOptions.max) {\n throw new Error(\n `Invalid dxtOptions for ${envVar}: min (${dxtOptions.min}) cannot be greater than max (${dxtOptions.max})`,\n );\n }\n }\n\n if (dxtOptions.type !== undefined) {\n const validTypes = [\"string\", \"directory\", \"file\", \"boolean\", \"number\"];\n if (!validTypes.includes(dxtOptions.type)) {\n throw new Error(\n `Invalid dxtOptions.type for ${envVar}: \"${dxtOptions.type}\". Must be one of: ${validTypes.join(\", \")}`,\n );\n }\n }\n\n // Type consistency check for default values\n if (dxtOptions.default !== undefined && dxtOptions.type !== undefined) {\n const defaultType = typeof dxtOptions.default;\n if (dxtOptions.type === \"number\" && defaultType !== \"number\") {\n throw new Error(\n `Invalid dxtOptions.default for ${envVar}: expected number, got ${defaultType}`,\n );\n }\n if (dxtOptions.type === \"boolean\" && defaultType !== \"boolean\") {\n throw new Error(\n `Invalid dxtOptions.default for ${envVar}: expected boolean, got ${defaultType}`,\n );\n }\n }\n\n // Security warnings (log but continue)\n const sensitiveKeywords = [\"key\", \"token\", \"password\", \"secret\", \"auth\"];\n const envLower = envVar.toLowerCase();\n const hasSensitiveKeyword = sensitiveKeywords.some((keyword) =>\n envLower.includes(keyword),\n );\n\n if (hasSensitiveKeyword && dxtOptions.sensitive === false) {\n console.warn(\n `⚠️ Security Warning: ${envVar} contains sensitive keyword but dxtOptions.sensitive is false`,\n );\n }\n\n if (flag.mandatory === true && dxtOptions.sensitive !== false) {\n console.warn(\n `⚠️ Security Warning: ${envVar} is required and sensitive - consider providing a secure default or making it optional`,\n );\n }\n }\n\n /**\n * Generate environment variables and user configuration from ArgParser flags\n * @returns Object containing envVars and userConfig\n */\n public generateEnvAndUserConfig(): {\n envVars: Record<string, string>;\n userConfig: Record<string, any>;\n } {\n const envVars: Record<string, string> = {};\n const userConfig: Record<string, any> = {};\n\n // Helper function to determine if a flag should be required in user_config\n const shouldBeRequired = (flag: any): boolean => {\n // If the flag has mandatory property, respect it\n if (typeof flag.mandatory === \"boolean\") {\n return flag.mandatory;\n }\n // If the flag has a mandatory function, we can't evaluate it here, so default to false\n if (typeof flag.mandatory === \"function\") {\n return false;\n }\n // Default to false for top-level flags (non-sensitive, non-mandatory by default)\n return false;\n };\n\n // Helper function to determine if a flag should be sensitive\n const shouldBeSensitive = (flag: any): boolean => {\n // Check if dxtOptions explicitly sets sensitivity\n if (flag.dxtOptions?.sensitive !== undefined) {\n return flag.dxtOptions.sensitive;\n }\n // Default: If a flag is tied to an ENV, it should be sensitive\n const envVar = (flag as any).env || (flag as any).envVar;\n return !!envVar;\n };\n\n // Helper function to determine DXT type from flag\n const getDxtType = (flag: any): string => {\n // Check if dxtOptions explicitly sets type\n if (flag.dxtOptions?.type) {\n return flag.dxtOptions.type;\n }\n // Try to infer from IFlag.type\n if (typeof flag.type === \"string\") {\n const lowerType = flag.type.toLowerCase();\n if ([\"string\", \"boolean\", \"number\"].includes(lowerType)) {\n return lowerType;\n }\n } else if (flag.type === String) {\n return \"string\";\n } else if (flag.type === Boolean) {\n return \"boolean\";\n } else if (flag.type === Number) {\n return \"number\";\n }\n // Default to string\n return \"string\";\n };\n\n // Helper function to get title for user_config\n const getDxtTitle = (flag: any, envVar: string): string => {\n // Check if dxtOptions explicitly sets title\n if (flag.dxtOptions?.title) {\n return flag.dxtOptions.title;\n }\n // Default: Convert env var to title case (first letter of each word capitalized)\n return envVar\n .replace(/_/g, \" \")\n .toLowerCase()\n .replace(/\\b\\w/g, (l: string) => l.toUpperCase());\n };\n\n // Helper function to get description with default value\n const getDxtDescription = (flag: any, envVar: string): string => {\n let baseDescription =\n flag.description || `${envVar} environment variable`;\n\n // Add default value to description if available\n const defaultValue =\n flag.dxtOptions?.default ??\n flag.dxtOptions?.localDefault ??\n flag.defaultValue;\n if (defaultValue !== undefined && typeof defaultValue !== \"function\") {\n baseDescription += ` (default: ${defaultValue})`;\n }\n\n return baseDescription;\n };\n\n // Get all flags from the main ArgParser to find environment variables\n const mainFlags = this.argParserInstance.flags;\n\n for (const flag of mainFlags) {\n const envVar = (flag as any).env || (flag as any).envVar;\n if (envVar) {\n // Validate dxtOptions before processing\n this.validateDxtOptions(flag, envVar);\n\n // Add to server env - use the original env var name so process.env.CANNY_API_KEY works\n envVars[envVar] = `\\${user_config.${envVar}}`;\n\n // Add to user_config - use the original env var name to maintain compatibility\n const userConfigEntry: any = {\n type: getDxtType(flag),\n title: getDxtTitle(flag, envVar),\n description: getDxtDescription(flag, envVar),\n required: shouldBeRequired(flag), // Respect the flag's mandatory setting\n sensitive: shouldBeSensitive(flag), // Use dxtOptions or default logic\n };\n\n // Add DXT-specific properties if available\n if (flag.dxtOptions?.multiple !== undefined) {\n userConfigEntry.multiple = flag.dxtOptions.multiple;\n }\n if (flag.dxtOptions?.min !== undefined) {\n userConfigEntry.min = flag.dxtOptions.min;\n }\n if (flag.dxtOptions?.max !== undefined) {\n userConfigEntry.max = flag.dxtOptions.max;\n }\n if (\n flag.dxtOptions?.default !== undefined &&\n typeof flag.dxtOptions.default !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.default;\n } else if (\n flag.dxtOptions?.localDefault !== undefined &&\n typeof flag.dxtOptions.localDefault !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.localDefault;\n }\n\n userConfig[envVar] = userConfigEntry;\n }\n }\n\n // Also check unified tools for environment variables\n if (typeof (this.argParserInstance as any).getTools === \"function\") {\n const tools = (this.argParserInstance as any).getTools();\n for (const [, toolConfig] of tools) {\n const toolFlags = (toolConfig as any).flags || [];\n for (const flag of toolFlags) {\n const envVar = (flag as any).env || (flag as any).envVar;\n if (envVar && !envVars[envVar]) {\n // Only add if not already present\n // Validate dxtOptions before processing\n this.validateDxtOptions(flag, envVar);\n\n // Add to server env - use the original env var name so process.env.CANNY_API_KEY works\n envVars[envVar] = `\\${user_config.${envVar}}`;\n\n // Add to user_config - use the original env var name to maintain compatibility\n const userConfigEntry: any = {\n type: getDxtType(flag),\n title: getDxtTitle(flag, envVar),\n description: getDxtDescription(flag, envVar),\n required: shouldBeRequired(flag), // Respect the flag's mandatory setting\n sensitive: shouldBeSensitive(flag), // Use dxtOptions or default logic\n };\n\n // Add DXT-specific properties if available\n if (flag.dxtOptions?.multiple !== undefined) {\n userConfigEntry.multiple = flag.dxtOptions.multiple;\n }\n if (flag.dxtOptions?.min !== undefined) {\n userConfigEntry.min = flag.dxtOptions.min;\n }\n if (flag.dxtOptions?.max !== undefined) {\n userConfigEntry.max = flag.dxtOptions.max;\n }\n if (\n flag.dxtOptions?.default !== undefined &&\n typeof flag.dxtOptions.default !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.default;\n } else if (\n flag.dxtOptions?.localDefault !== undefined &&\n typeof flag.dxtOptions.localDefault !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.localDefault;\n }\n\n userConfig[envVar] = userConfigEntry;\n }\n }\n }\n }\n\n return { envVars, userConfig };\n }\n\n private resolveModulePath(id: string, importer: string): string | null {\n try {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"module-resolve\")}> Resolving '${chalk.green(id)}' from '${chalk.gray(importer)}'`,\n );\n }\n\n // Get tsconfig for the importing file\n const tsconfig = getTsconfig(importer);\n if (!tsconfig?.config.compilerOptions?.paths) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"ts-paths\")}> No tsconfig or paths found for '${importer}'`,\n );\n }\n // Fall through to regular file resolution\n } else {\n if (Boolean(process.env[\"DEBUG\"])) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n console.log(\n ` <${chalk.gray(\"ts-paths\")}> Found tsconfig at '${path.relative(currentDir, tsconfig.path)}' with paths:`,\n Object.keys(tsconfig.config.compilerOptions.paths),\n );\n }\n\n // Create paths matcher\n const pathsMatcher = createPathsMatcher(tsconfig);\n if (!pathsMatcher || typeof pathsMatcher !== \"function\") {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"ts-paths\")}> Failed to create paths matcher or matcher is not a function`,\n );\n }\n // Fall through to regular file resolution\n } else {\n const possiblePaths = pathsMatcher(id);\n\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> Possible paths for '${id}':`,\n possiblePaths,\n );\n }\n\n // Try to resolve each possible path\n for (const possiblePath of possiblePaths) {\n const resolvedPath = path.resolve(\n path.dirname(tsconfig.path),\n possiblePath,\n );\n\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> Trying resolved path: '${resolvedPath}'`,\n );\n }\n\n // Try common extensions\n const extensions = [\".ts\", \".js\", \".tsx\", \".jsx\", \".mjs\", \".cjs\"];\n\n // Check if it's a file (with or without extension)\n // 1. Try the resolved path as-is\n if (\n fs.existsSync(resolvedPath) &&\n fs.statSync(resolvedPath).isFile()\n ) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${resolvedPath}'`,\n );\n }\n return resolvedPath;\n }\n\n // 2. If it has a .js extension, try replacing with TypeScript extensions\n if (resolvedPath.endsWith(\".js\")) {\n const basePath = resolvedPath.slice(0, -3); // Remove .js\n for (const ext of [\".ts\", \".tsx\"]) {\n const testPath = basePath + ext;\n if (fs.existsSync(testPath) && fs.statSync(testPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${testPath}' (replaced .js)`,\n );\n }\n return testPath;\n }\n }\n }\n\n // 3. Try adding extensions to the path (in case no extension)\n for (const ext of extensions) {\n const testPath = resolvedPath + ext;\n if (fs.existsSync(testPath) && fs.statSync(testPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${testPath}' (added extension)`,\n );\n }\n return testPath;\n }\n }\n\n // Check if it's a directory with index file\n if (\n fs.existsSync(resolvedPath) &&\n fs.statSync(resolvedPath).isDirectory()\n ) {\n for (const ext of extensions) {\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${indexPath}' (index)`,\n );\n }\n return indexPath;\n }\n }\n }\n }\n }\n }\n\n // TypeScript path resolution failed, try regular file resolution\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> Trying regular file resolution for '${id}'`,\n );\n }\n\n // Try to resolve as a regular file path relative to the importer\n let testPath: string;\n if (path.isAbsolute(id)) {\n testPath = id;\n } else {\n testPath = path.resolve(path.dirname(importer), id);\n }\n\n const extensions = [\".ts\", \".js\", \".tsx\", \".jsx\", \".mjs\", \".cjs\"];\n\n // Check if it's a file (with or without extension)\n // 1. Try the path as-is\n if (fs.existsSync(testPath) && fs.statSync(testPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${testPath}'`,\n );\n }\n return testPath;\n }\n\n // 2. If it has a .js extension, try replacing with TypeScript extensions\n if (testPath.endsWith(\".js\")) {\n const basePath = testPath.slice(0, -3); // Remove .js\n for (const ext of [\".ts\", \".tsx\"]) {\n const tsPath = basePath + ext;\n if (fs.existsSync(tsPath) && fs.statSync(tsPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${tsPath}' (replaced .js)`,\n );\n }\n return tsPath;\n }\n }\n }\n\n // 3. Try adding extensions to the path (in case no extension)\n for (const ext of extensions) {\n const extPath = testPath + ext;\n if (fs.existsSync(extPath) && fs.statSync(extPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${extPath}' (added extension)`,\n );\n }\n return extPath;\n }\n }\n\n // Check if it's a directory with index file\n if (fs.existsSync(testPath) && fs.statSync(testPath).isDirectory()) {\n for (const ext of extensions) {\n const indexPath = path.join(testPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${indexPath}' (index)`,\n );\n }\n return indexPath;\n }\n }\n }\n\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"module-resolve\")}> ✗ Could not resolve '${id}'`,\n );\n }\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Failed to resolve module path '${id}': ${error}`,\n ),\n );\n }\n\n return null;\n }\n}\n","/**\n * MCP Change Notifications System\n *\n * This module provides functionality for managing MCP change notifications,\n * allowing clients to subscribe to changes in tools, resources, and prompts.\n */\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"MCP Notifications\");\n\n/**\n * Types of MCP entities that can change\n */\nexport type McpChangeType = \"tools\" | \"resources\" | \"prompts\";\n\n/**\n * Change notification event\n */\nexport interface McpChangeEvent {\n type: McpChangeType;\n timestamp: Date;\n action: \"added\" | \"removed\" | \"updated\";\n entityName?: string;\n}\n\n/**\n * Change listener function type\n */\nexport type McpChangeListener = (event: McpChangeEvent) => void;\n\n/**\n * Client subscription information\n */\nexport interface McpClientSubscription {\n clientId: string;\n subscriptions: Set<McpChangeType>;\n connection: any; // MCP server connection object\n}\n\n/**\n * MCP Change Notifications Manager\n *\n * Manages client subscriptions and change notifications for MCP entities\n */\nexport class McpNotificationsManager {\n private clients = new Map<string, McpClientSubscription>();\n private globalListeners = new Set<McpChangeListener>();\n private changeHistory: McpChangeEvent[] = [];\n private maxHistorySize = 100;\n\n /**\n * Add a client connection\n */\n addClient(clientId: string, connection: any): void {\n this.clients.set(clientId, {\n clientId,\n subscriptions: new Set(),\n connection,\n });\n }\n\n /**\n * Remove a client connection\n */\n removeClient(clientId: string): void {\n this.clients.delete(clientId);\n }\n\n /**\n * Subscribe a client to changes of a specific type\n */\n subscribe(clientId: string, type: McpChangeType): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.add(type);\n }\n }\n\n /**\n * Unsubscribe a client from changes of a specific type\n */\n unsubscribe(clientId: string, type: McpChangeType): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.delete(type);\n }\n }\n\n /**\n * Subscribe a client to all change types\n */\n subscribeToAll(clientId: string): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.add(\"tools\");\n client.subscriptions.add(\"resources\");\n client.subscriptions.add(\"prompts\");\n }\n }\n\n /**\n * Unsubscribe a client from all change types\n */\n unsubscribeFromAll(clientId: string): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.clear();\n }\n }\n\n /**\n * Get client subscription status\n */\n getClientSubscriptions(clientId: string): Set<McpChangeType> | undefined {\n return this.clients.get(clientId)?.subscriptions;\n }\n\n /**\n * Check if a client is subscribed to a specific change type\n */\n isClientSubscribed(clientId: string, type: McpChangeType): boolean {\n const client = this.clients.get(clientId);\n return client ? client.subscriptions.has(type) : false;\n }\n\n /**\n * Notify all subscribed clients of a change\n */\n notifyChange(\n type: McpChangeType,\n action: \"added\" | \"removed\" | \"updated\",\n entityName?: string,\n ): void {\n const event: McpChangeEvent = {\n type,\n timestamp: new Date(),\n action,\n entityName,\n };\n\n // Add to history\n this.addToHistory(event);\n\n // Notify global listeners\n for (const listener of this.globalListeners) {\n try {\n listener(event);\n } catch (error) {\n logger.error(\"Error in global change listener:\", error);\n }\n }\n\n // Notify subscribed clients\n for (const client of this.clients.values()) {\n if (client.subscriptions.has(type)) {\n this.sendNotificationToClient(client, type);\n }\n }\n }\n\n /**\n * Add a global change listener (not client-specific)\n */\n addGlobalListener(listener: McpChangeListener): void {\n this.globalListeners.add(listener);\n }\n\n /**\n * Remove a global change listener\n */\n removeGlobalListener(listener: McpChangeListener): void {\n this.globalListeners.delete(listener);\n }\n\n /**\n * Get change history\n */\n getChangeHistory(limit?: number): McpChangeEvent[] {\n const history = [...this.changeHistory];\n return limit ? history.slice(-limit) : history;\n }\n\n /**\n * Clear change history\n */\n clearHistory(): void {\n this.changeHistory = [];\n }\n\n /**\n * Get connected client count\n */\n getClientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get subscription statistics\n */\n getSubscriptionStats(): Record<McpChangeType, number> {\n const stats: Record<McpChangeType, number> = {\n tools: 0,\n resources: 0,\n prompts: 0,\n };\n\n for (const client of this.clients.values()) {\n for (const type of client.subscriptions) {\n stats[type]++;\n }\n }\n\n return stats;\n }\n\n /**\n * Send notification to a specific client\n */\n private sendNotificationToClient(\n client: McpClientSubscription,\n type: McpChangeType,\n ): void {\n try {\n // Send MCP notification using the connection\n if (\n client.connection &&\n typeof client.connection.sendNotification === \"function\"\n ) {\n client.connection.sendNotification(\n `notifications/${type}/list_changed`,\n {},\n );\n }\n } catch (error) {\n logger.error(\n `Error sending notification to client ${client.clientId}:`,\n error,\n );\n // Consider removing the client if connection is broken\n this.removeClient(client.clientId);\n }\n }\n\n /**\n * Add event to change history\n */\n private addToHistory(event: McpChangeEvent): void {\n this.changeHistory.push(event);\n\n // Trim history if it exceeds max size\n if (this.changeHistory.length > this.maxHistorySize) {\n this.changeHistory = this.changeHistory.slice(-this.maxHistorySize);\n }\n }\n\n /**\n * Set maximum history size\n */\n setMaxHistorySize(size: number): void {\n this.maxHistorySize = Math.max(0, size);\n\n // Trim current history if needed\n if (this.changeHistory.length > this.maxHistorySize) {\n this.changeHistory = this.changeHistory.slice(-this.maxHistorySize);\n }\n }\n\n /**\n * Clear all subscriptions and clients\n */\n clear(): void {\n this.clients.clear();\n this.globalListeners.clear();\n this.changeHistory = [];\n }\n}\n\n/**\n * Utility functions for working with change notifications\n */\n\n/**\n * Create a debounced change notifier to batch rapid changes\n */\nexport function createDebouncedNotifier(\n manager: McpNotificationsManager,\n delay: number = 100,\n): (\n type: McpChangeType,\n action: \"added\" | \"removed\" | \"updated\",\n entityName?: string,\n) => void {\n const pending = new Map<\n string,\n {\n type: McpChangeType;\n action: \"added\" | \"removed\" | \"updated\";\n entityName?: string;\n }\n >();\n let timeoutId: NodeJS.Timeout | null = null;\n\n return (\n type: McpChangeType,\n action: \"added\" | \"removed\" | \"updated\",\n entityName?: string,\n ) => {\n const key = `${type}:${action}:${entityName || \"\"}`;\n pending.set(key, { type, action, entityName });\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n for (const { type, action, entityName } of pending.values()) {\n manager.notifyChange(type, action, entityName);\n }\n pending.clear();\n timeoutId = null;\n }, delay);\n };\n}\n\n/**\n * Create a filtered change listener that only responds to specific types\n */\nexport function createFilteredListener(\n types: McpChangeType[],\n listener: McpChangeListener,\n): McpChangeListener {\n return (event: McpChangeEvent) => {\n if (types.includes(event.type)) {\n listener(event);\n }\n };\n}\n\n/**\n * Create a logging change listener for debugging\n */\nexport function createLoggingListener(\n prefix: string = \"[MCP]\",\n): McpChangeListener {\n return (event: McpChangeEvent) => {\n const entityInfo = event.entityName ? ` (${event.entityName})` : \"\";\n // Use console.log directly for debugging output (not MCP-safe, but this is a debug utility)\n console.log(\n `${prefix} ${event.type} ${event.action}${entityInfo} at ${event.timestamp.toISOString()}`,\n );\n };\n}\n\n/**\n * Default global notifications manager instance\n */\nexport const globalNotificationsManager = new McpNotificationsManager();\n","/**\n * MCP Prompts Management\n *\n * This module provides functionality for managing MCP prompts - server-side prompt templates\n * that clients can discover and execute with custom parameters for dynamic text generation.\n */\n\nimport { z, type ZodTypeAny } from \"zod\";\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"MCP Prompts\");\n\n/**\n * Prompt message content types\n */\nexport interface McpPromptTextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface McpPromptImageContent {\n type: \"image\";\n data: string; // base64 encoded\n mimeType: string;\n}\n\nexport type McpPromptContent = McpPromptTextContent | McpPromptImageContent;\n\n/**\n * Prompt message structure\n */\nexport interface McpPromptMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: McpPromptContent;\n}\n\n/**\n * Prompt response structure\n */\nexport interface McpPromptResponse {\n description?: string;\n messages: McpPromptMessage[];\n}\n\n/**\n * Prompt handler function type\n */\nexport type McpPromptHandler = (\n args: any,\n) => McpPromptResponse | Promise<McpPromptResponse>;\n\n/**\n * Prompt configuration for registration\n */\nexport interface McpPromptConfig {\n name: string;\n title?: string;\n description?: string;\n argsSchema: ZodTypeAny;\n handler: McpPromptHandler;\n}\n\n/**\n * Internal prompt storage structure\n */\nexport interface McpPromptEntry {\n config: McpPromptConfig;\n registeredAt: Date;\n}\n\n/**\n * MCP Prompts Manager\n *\n * Manages registration, storage, and execution of MCP prompts\n */\nexport class McpPromptsManager {\n private prompts = new Map<string, McpPromptEntry>();\n private changeListeners = new Set<() => void>();\n\n /**\n * Register a new prompt\n */\n addPrompt(config: McpPromptConfig): void {\n // Validate configuration\n this.validatePromptConfig(config);\n\n // Store prompt\n this.prompts.set(config.name, {\n config,\n registeredAt: new Date(),\n });\n\n // Notify listeners of change\n this.notifyChange();\n }\n\n /**\n * Remove a prompt by name\n */\n removePrompt(name: string): boolean {\n const removed = this.prompts.delete(name);\n if (removed) {\n this.notifyChange();\n }\n return removed;\n }\n\n /**\n * Get all registered prompts\n */\n getPrompts(): McpPromptConfig[] {\n return Array.from(this.prompts.values()).map((entry) => entry.config);\n }\n\n /**\n * Get a specific prompt by name\n */\n getPrompt(name: string): McpPromptConfig | undefined {\n return this.prompts.get(name)?.config;\n }\n\n /**\n * Check if a prompt exists\n */\n hasPrompt(name: string): boolean {\n return this.prompts.has(name);\n }\n\n /**\n * Execute a prompt with given arguments\n */\n async executePrompt(name: string, args: any): Promise<McpPromptResponse> {\n const entry = this.prompts.get(name);\n if (!entry) {\n throw new Error(`Prompt '${name}' not found`);\n }\n\n // Validate arguments against schema\n try {\n const validatedArgs = entry.config.argsSchema.parse(args);\n return await entry.config.handler(validatedArgs);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new Error(\n `Invalid arguments for prompt '${name}': ${error.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Add change listener\n */\n onPromptsChange(listener: () => void): void {\n this.changeListeners.add(listener);\n }\n\n /**\n * Remove change listener\n */\n offPromptsChange(listener: () => void): void {\n this.changeListeners.delete(listener);\n }\n\n /**\n * Clear all prompts\n */\n clear(): void {\n const hadPrompts = this.prompts.size > 0;\n this.prompts.clear();\n if (hadPrompts) {\n this.notifyChange();\n }\n }\n\n /**\n * Get prompt count\n */\n count(): number {\n return this.prompts.size;\n }\n\n /**\n * Validate prompt configuration\n */\n private validatePromptConfig(config: McpPromptConfig): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new Error(\"Prompt name is required and must be a string\");\n }\n\n if (!config.argsSchema) {\n throw new Error(\"Prompt argsSchema is required\");\n }\n\n if (typeof config.handler !== \"function\") {\n throw new Error(\"Prompt handler is required and must be a function\");\n }\n\n if (this.prompts.has(config.name)) {\n throw new Error(`Prompt with name '${config.name}' already exists`);\n }\n }\n\n /**\n * Notify all listeners of changes\n */\n private notifyChange(): void {\n for (const listener of this.changeListeners) {\n try {\n listener();\n } catch (error) {\n logger.error(\"Error in prompt change listener:\", error);\n }\n }\n }\n}\n\n/**\n * Helper function to create common prompt configurations\n */\n\n/**\n * Create a code review prompt\n */\nexport const createCodeReviewPrompt = (): McpPromptConfig => ({\n name: \"code-review\",\n title: \"Code Review Assistant\",\n description: \"Generate prompts for code review with focus areas\",\n argsSchema: z.object({\n code: z.string().describe(\"The code to review\"),\n language: z.string().optional().describe(\"Programming language\"),\n focus: z\n .enum([\"security\", \"performance\", \"style\", \"bugs\", \"general\"])\n .optional()\n .describe(\"Review focus area\"),\n }),\n handler: ({ code, language, focus }) => ({\n description: `Code review prompt for ${language || \"code\"} focusing on ${focus || \"general best practices\"}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please review this ${language || \"code\"} focusing on ${focus || \"general best practices\"}:\\n\\n\\`\\`\\`${language || \"\"}\\n${code}\\n\\`\\`\\``,\n },\n },\n ],\n }),\n});\n\n/**\n * Create a text summarization prompt\n */\nexport const createSummarizationPrompt = (): McpPromptConfig => ({\n name: \"summarize\",\n title: \"Text Summarization\",\n description: \"Generate prompts for text summarization\",\n argsSchema: z.object({\n text: z.string().describe(\"The text to summarize\"),\n length: z\n .enum([\"brief\", \"medium\", \"detailed\"])\n .optional()\n .describe(\"Summary length\"),\n style: z\n .enum([\"bullet-points\", \"paragraph\", \"executive\"])\n .optional()\n .describe(\"Summary style\"),\n }),\n handler: ({ text, length, style }) => {\n const lengthInstruction =\n length === \"brief\"\n ? \"in 1-2 sentences\"\n : length === \"detailed\"\n ? \"in detail with key points\"\n : \"concisely\";\n\n const styleInstruction =\n style === \"bullet-points\"\n ? \"as bullet points\"\n : style === \"executive\"\n ? \"as an executive summary\"\n : \"in paragraph form\";\n\n return {\n description: `Summarization prompt for ${length || \"medium\"} ${style || \"paragraph\"} summary`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please summarize the following text ${lengthInstruction} ${styleInstruction}:\\n\\n${text}`,\n },\n },\n ],\n };\n },\n});\n\n/**\n * Create a translation prompt\n */\nexport const createTranslationPrompt = (): McpPromptConfig => ({\n name: \"translate\",\n title: \"Text Translation\",\n description: \"Generate prompts for text translation\",\n argsSchema: z.object({\n text: z.string().describe(\"The text to translate\"),\n targetLanguage: z.string().describe(\"Target language for translation\"),\n sourceLanguage: z\n .string()\n .optional()\n .describe(\"Source language (auto-detect if not specified)\"),\n tone: z\n .enum([\"formal\", \"casual\", \"professional\"])\n .optional()\n .describe(\"Translation tone\"),\n }),\n handler: ({ text, targetLanguage, sourceLanguage, tone }) => {\n const sourceInstruction = sourceLanguage\n ? `from ${sourceLanguage}`\n : \"(auto-detect source language)\";\n const toneInstruction = tone ? ` in a ${tone} tone` : \"\";\n\n return {\n description: `Translation prompt ${sourceInstruction} to ${targetLanguage}${toneInstruction}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please translate the following text ${sourceInstruction} to ${targetLanguage}${toneInstruction}:\\n\\n${text}`,\n },\n },\n ],\n };\n },\n});\n\n/**\n * Create a documentation prompt\n */\nexport const createDocumentationPrompt = (): McpPromptConfig => ({\n name: \"document-code\",\n title: \"Code Documentation\",\n description: \"Generate prompts for code documentation\",\n argsSchema: z.object({\n code: z.string().describe(\"The code to document\"),\n language: z.string().optional().describe(\"Programming language\"),\n style: z\n .enum([\"jsdoc\", \"sphinx\", \"markdown\", \"inline\"])\n .optional()\n .describe(\"Documentation style\"),\n includeExamples: z.boolean().optional().describe(\"Include usage examples\"),\n }),\n handler: ({ code, language, style, includeExamples }) => {\n const styleInstruction = style ? ` using ${style} format` : \"\";\n const examplesInstruction = includeExamples\n ? \" Include usage examples.\"\n : \"\";\n\n return {\n description: `Documentation prompt for ${language || \"code\"}${styleInstruction}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please generate documentation for this ${language || \"code\"}${styleInstruction}.${examplesInstruction}\\n\\n\\`\\`\\`${language || \"\"}\\n${code}\\n\\`\\`\\``,\n },\n },\n ],\n };\n },\n});\n","/**\n * MCP Resources Management\n *\n * This module provides functionality for managing MCP resources - server-side data sources\n * that clients can access using URI templates. Resources are similar to GET endpoints\n * in a REST API and should provide data without significant computation or side effects.\n */\n\n// Note: zod imports removed as they're not used in this file\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"MCP Resources\");\n\n/**\n * Resource response content item\n */\nexport interface McpResourceContent {\n uri: string;\n text?: string;\n blob?: Uint8Array;\n mimeType?: string;\n}\n\n/**\n * Resource response structure\n */\nexport interface McpResourceResponse {\n contents: McpResourceContent[];\n}\n\n/**\n * Resource handler function type\n */\nexport type McpResourceHandler = (\n uri: URL,\n params: Record<string, string>,\n) => Promise<McpResourceResponse>;\n\n/**\n * Resource configuration for registration\n */\nexport interface McpResourceConfig {\n name: string;\n uriTemplate: string;\n title?: string;\n description?: string;\n mimeType?: string;\n handler: McpResourceHandler;\n}\n\n/**\n * Internal resource storage structure\n */\nexport interface McpResourceEntry {\n config: McpResourceConfig;\n registeredAt: Date;\n}\n\n/**\n * Resource template parser for URI patterns like \"users://{userId}/profile\"\n */\nexport class ResourceTemplateParser {\n private pattern: RegExp;\n private paramNames: string[];\n\n constructor(template: string) {\n // Extract parameter names from template like \"users://{userId}/profile\"\n const paramMatches = template.match(/\\{([^}]+)\\}/g) || [];\n this.paramNames = paramMatches.map((match) => match.slice(1, -1));\n\n // Create regex pattern to match URIs\n const regexPattern = template.replace(/\\{[^}]+\\}/g, \"([^/]+)\");\n this.pattern = new RegExp(`^${regexPattern}$`);\n }\n\n /**\n * Parse a URI against this template and extract parameters\n */\n parse(uri: string): Record<string, string> | null {\n const match = uri.match(this.pattern);\n if (!match) return null;\n\n const params: Record<string, string> = {};\n for (let i = 0; i < this.paramNames.length; i++) {\n params[this.paramNames[i]] = match[i + 1];\n }\n return params;\n }\n\n /**\n * Check if a URI matches this template\n */\n matches(uri: string): boolean {\n return this.pattern.test(uri);\n }\n\n /**\n * Get the parameter names for this template\n */\n getParameterNames(): string[] {\n return [...this.paramNames];\n }\n}\n\n/**\n * MCP Resources Manager\n *\n * Manages registration, storage, and retrieval of MCP resources\n */\nexport class McpResourcesManager {\n private resources = new Map<string, McpResourceEntry>();\n private changeListeners = new Set<() => void>();\n\n /**\n * Register a new resource\n */\n addResource(config: McpResourceConfig): void {\n // Validate configuration\n this.validateResourceConfig(config);\n\n // Store resource\n this.resources.set(config.name, {\n config,\n registeredAt: new Date(),\n });\n\n // Notify listeners of change\n this.notifyChange();\n }\n\n /**\n * Remove a resource by name\n */\n removeResource(name: string): boolean {\n const removed = this.resources.delete(name);\n if (removed) {\n this.notifyChange();\n }\n return removed;\n }\n\n /**\n * Get all registered resources\n */\n getResources(): McpResourceConfig[] {\n return Array.from(this.resources.values()).map((entry) => entry.config);\n }\n\n /**\n * Get a specific resource by name\n */\n getResource(name: string): McpResourceConfig | undefined {\n return this.resources.get(name)?.config;\n }\n\n /**\n * Check if a resource exists\n */\n hasResource(name: string): boolean {\n return this.resources.has(name);\n }\n\n /**\n * Find resource that matches a URI\n */\n findResourceForUri(\n uri: string,\n ): { config: McpResourceConfig; params: Record<string, string> } | null {\n for (const entry of this.resources.values()) {\n const parser = new ResourceTemplateParser(entry.config.uriTemplate);\n const params = parser.parse(uri);\n if (params !== null) {\n return { config: entry.config, params };\n }\n }\n return null;\n }\n\n /**\n * Add change listener\n */\n onResourcesChange(listener: () => void): void {\n this.changeListeners.add(listener);\n }\n\n /**\n * Remove change listener\n */\n offResourcesChange(listener: () => void): void {\n this.changeListeners.delete(listener);\n }\n\n /**\n * Clear all resources\n */\n clear(): void {\n const hadResources = this.resources.size > 0;\n this.resources.clear();\n if (hadResources) {\n this.notifyChange();\n }\n }\n\n /**\n * Get resource count\n */\n count(): number {\n return this.resources.size;\n }\n\n /**\n * Validate resource configuration\n */\n private validateResourceConfig(config: McpResourceConfig): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new Error(\"Resource name is required and must be a string\");\n }\n\n if (!config.uriTemplate || typeof config.uriTemplate !== \"string\") {\n throw new Error(\"Resource uriTemplate is required and must be a string\");\n }\n\n if (typeof config.handler !== \"function\") {\n throw new Error(\"Resource handler is required and must be a function\");\n }\n\n if (this.resources.has(config.name)) {\n throw new Error(`Resource with name '${config.name}' already exists`);\n }\n\n // Validate URI template format\n try {\n new ResourceTemplateParser(config.uriTemplate);\n } catch (error) {\n throw new Error(\n `Invalid URI template '${config.uriTemplate}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Notify all listeners of changes\n */\n private notifyChange(): void {\n for (const listener of this.changeListeners) {\n try {\n listener();\n } catch (error) {\n logger.error(\"Error in resource change listener:\", error);\n }\n }\n }\n}\n\n/**\n * Helper function to create common resource configurations\n */\nexport const createFileResource = (\n basePath: string = \"\",\n): McpResourceConfig => ({\n name: \"file-content\",\n uriTemplate: \"file://{path}\",\n title: \"File Content\",\n description: \"Read file contents from the filesystem\",\n mimeType: \"text/plain\",\n handler: async (uri, { path }) => {\n const fs = await import(\"node:fs/promises\");\n const fullPath = basePath ? `${basePath}/${path}` : path;\n\n try {\n const content = await fs.readFile(fullPath, \"utf8\");\n return {\n contents: [\n {\n uri: uri.href,\n text: content,\n mimeType: \"text/plain\",\n },\n ],\n };\n } catch (error) {\n throw new Error(\n `Failed to read file '${fullPath}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n});\n\n/**\n * Helper function to create JSON data resource\n */\nexport const createJsonResource = (\n name: string,\n data: any,\n): McpResourceConfig => ({\n name,\n uriTemplate: `${name}://data`,\n title: `${name} Data`,\n description: `Access ${name} data as JSON`,\n mimeType: \"application/json\",\n handler: async (uri) => ({\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(data, null, 2),\n mimeType: \"application/json\",\n },\n ],\n }),\n});\n","import { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\n/**\n * Debug utility for conditional logging based on environment variables\n *\n * This utility provides clean debug logging without scattered conditional statements.\n * Debug output is controlled by the DEBUG environment variable.\n */\n\n/**\n * Check if debug mode is enabled\n */\nconst isDebugEnabled = (): boolean => {\n try {\n // Safe access to process.env that works in all JavaScript environments\n return Boolean(\n typeof process !== \"undefined\" && process.env && process.env[\"DEBUG\"],\n );\n } catch {\n // Fallback for environments where process is not available\n return false;\n }\n};\n\nconst logger = createMcpLogger(\"DEBUG\");\n\n/**\n * Debug logger that only outputs when DEBUG environment variable is set\n */\nexport const debug = {\n /**\n * Log a debug message to stderr (only when DEBUG=true)\n */\n log: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.error(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log an error debug message to stderr (only when DEBUG=true)\n */\n error: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.error(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log a warning debug message to stderr (only when DEBUG=true)\n */\n warn: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.warn(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log an info debug message to stderr (only when DEBUG=true)\n */\n info: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.info(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log a debug message with a custom prefix (only when DEBUG=true)\n */\n prefixed: (prefix: string, ...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.info(\n `[${prefix}] ${typeof msg === \"string\" ? msg : String(msg)}`,\n ...rest,\n );\n }\n },\n\n /**\n * Check if debug mode is currently enabled\n */\n get enabled(): boolean {\n return isDebugEnabled();\n },\n};\n\n/**\n * Default export for convenience\n */\nexport default debug;\n","import { zodFlagSchema } from \"./types\";\nimport type { IFlag, ProcessedFlag } from \"./types\";\n\nexport class FlagManager {\n #_flags: Map<string, ProcessedFlag> = new Map();\n #throwForDuplicateFlags: boolean;\n\n constructor(\n options: { throwForDuplicateFlags?: boolean } = {},\n initialFlags: readonly IFlag[] = [],\n ) {\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags ?? false;\n this.addFlags(initialFlags);\n }\n\n static _safeFlag(flag: IFlag): ProcessedFlag {\n const parsedFromZod = zodFlagSchema.parse(flag);\n\n let resolvedType: ProcessedFlag[\"type\"];\n const inputTypeFromZod = parsedFromZod[\"type\"];\n\n if (typeof inputTypeFromZod === \"string\") {\n switch (inputTypeFromZod.toLowerCase()) {\n case \"boolean\":\n resolvedType = Boolean;\n break;\n case \"string\":\n resolvedType = String;\n break;\n case \"number\":\n resolvedType = Number;\n break;\n case \"array\":\n resolvedType = Array;\n break;\n case \"object\":\n resolvedType = Object;\n break;\n default:\n throw new Error(`Invalid type string: ${inputTypeFromZod}`);\n }\n } else {\n resolvedType = inputTypeFromZod as ProcessedFlag[\"type\"];\n }\n\n return {\n ...parsedFromZod,\n options: parsedFromZod[\"options\"],\n type: resolvedType,\n validate: parsedFromZod[\"validate\"],\n enum: parsedFromZod[\"enum\"],\n mandatory: parsedFromZod[\"mandatory\"],\n env: parsedFromZod[\"env\"],\n dxtOptions: parsedFromZod[\"dxtOptions\"],\n };\n }\n\n addFlag(flag: IFlag): this {\n const safeFlag = FlagManager._safeFlag(flag);\n\n if (this.#_flags.has(safeFlag[\"name\"])) {\n if (this.#throwForDuplicateFlags) {\n throw new Error(\n `FlagManager: Flag '${safeFlag[\"name\"]}' already exists.`,\n );\n } else {\n console.warn(\n `Warning: FlagManager: Flag '${safeFlag[\"name\"]}' already exists. Duplicate not added.`,\n );\n return this;\n }\n }\n\n this.#_flags.set(safeFlag[\"name\"], safeFlag);\n return this;\n }\n\n _setProcessedFlagForInheritance(processedFlag: ProcessedFlag): this {\n if (this.#_flags.has(processedFlag[\"name\"])) {\n return this;\n }\n this.#_flags.set(processedFlag[\"name\"], processedFlag);\n return this;\n }\n\n addFlags(flags: readonly IFlag[]): this {\n for (const flag of flags) {\n this.addFlag(flag);\n }\n return this;\n }\n\n hasFlag(name: string): boolean {\n return this.#_flags.has(name);\n }\n\n removeFlag(name: string): boolean {\n return this.#_flags.delete(name);\n }\n\n getFlag(name: string): ProcessedFlag | undefined {\n return this.#_flags.get(name);\n }\n\n get flags(): ProcessedFlag[] {\n return Array.from(this.#_flags.values());\n }\n\n get flagNames(): string[] {\n return Array.from(this.#_flags.values()).map((flag) => flag[\"name\"]);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport dotenv from \"dotenv\";\nimport { anyOf, char, createRegExp, oneOrMore } from \"magic-regexp\";\nimport { type ZodTypeAny } from \"zod\";\nimport chalk from \"@alcyone-labs/simple-chalk\";\nimport { createMcpLogger, type Logger } from \"@alcyone-labs/simple-mcp-logger\";\nimport { ConfigurationManager } from \"../config/ConfigurationManager\";\nimport { DxtGenerator } from \"../dxt/DxtGenerator\";\nimport {\n McpNotificationsManager,\n type McpChangeType,\n} from \"../mcp/mcp-notifications.js\";\nimport { McpPromptsManager, type McpPromptConfig } from \"../mcp/mcp-prompts.js\";\nimport {\n McpResourcesManager,\n type McpResourceConfig,\n} from \"../mcp/mcp-resources.js\";\nimport { debug } from \"../utils/debug-utils\";\nimport { FlagManager } from \"./FlagManager\";\nimport { resolveLogPath } from \"./log-path-utils\";\nimport { FlagInheritance } from \"./types\";\nimport type {\n IArgParser,\n IFlag,\n IHandlerContext,\n IMcpServerMethods,\n ISubCommand,\n ParseResult,\n ProcessedFlag,\n TFlagInheritance,\n TParsedArgs,\n} from \"./types\";\n\nexport class ArgParserError extends Error {\n public commandChain: string[];\n constructor(\n message: string,\n public cmdChain: string[] = [],\n ) {\n super(message);\n this.name = \"ArgParserError\";\n this.commandChain = cmdChain;\n }\n}\n\nexport interface IArgParserParams<THandlerReturn = any> {\n /**\n * This is the display name of the app, used in help text\n */\n appName?: string;\n subCommands?: ISubCommand[];\n handler?: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>;\n\n /**\n * Add an extra new line between each flag group,\n * makes the text more readable but uses more space\n *\n * Default: true\n */\n extraNewLine?: boolean;\n /**\n * Wraps the line at width, if shorter, wrapping will be more\n * aggressive. Wrapping is based on words.\n *\n * Default: 50\n * Minimum: 30\n */\n wrapAtWidth?: number;\n /**\n * Controls the placing of right text on the screen.\n * The higher the value, the more to the right the text will be.\n *\n * Default: 30\n * Minimum: 20\n */\n blankSpaceWidth?: number;\n /**\n * Character to display next to the flag to express mandatory fields.\n *\n * Default: *\n */\n mandatoryCharacter?: string;\n /**\n * Throw an error if a flag is added more than once\n * @default false\n */\n throwForDuplicateFlags?: boolean;\n description?: string; // New property for the description\n /**\n * Automatically handle ArgParserErrors by printing a formatted message\n * and exiting. Set to false to catch ArgParserError manually.\n * @default true\n */\n handleErrors?: boolean;\n /**\n * Whether to automatically call process.exit() based on ParseResult.\n * When true (default), maintains backward compatibility with CLI behavior.\n * When false, returns ParseResult objects for programmatic use.\n * @default true\n */\n autoExit?: boolean;\n /**\n * The command name to display in help suggestions (e.g., 'dabl').\n * If not provided, it falls back to guessing from the script path.\n */\n appCommandName?: string;\n /**\n * If true, when this parser is added as a sub-command, it will inherit\n * flags from its direct parent *unless* a flag with the same name\n * already exists in this parser. Child flags take precedence.\n * @default false\n */\n inheritParentFlags?: TFlagInheritance;\n /**\n * If true, when no handler is provided for a command (root or sub-command),\n * the help message will be automatically displayed.\n * @default false\n */\n triggerAutoHelpIfNoHandler?: boolean;\n /**\n * Optional logger instance to use.\n * If not provided, a default one will be created.\n */\n logger?: Logger;\n}\n\nexport interface IParseOptions {\n /**\n * When true, skips help flag processing (doesn't exit or show help)\n * @default false\n */\n skipHelpHandling?: boolean;\n /**\n * When true, skips the execution of any command handlers.\n * @default false\n */\n skipHandlers?: boolean;\n /**\n * When true (default), automatically awaits async handlers before returning.\n * When false, returns immediately with _asyncHandlerPromise for manual handling.\n * @default true\n */\n deep?: boolean;\n /**\n * When true, indicates this is being called from MCP mode\n * @default false\n * @internal\n */\n isMcp?: boolean;\n /**\n * Internal: when true, this parse call is only for dynamic flag preloading for help\n * Suppresses side effects and handler execution\n * @internal\n */\n dynamicHelpPreload?: boolean;\n /**\n * When true, automatically executes the CLI if the script is being run directly (not imported).\n * When false, disables auto-execution detection even if importMetaUrl is provided.\n * Uses robust detection that works across different environments and sandboxes.\n * Only takes effect when importMetaUrl is also provided.\n * @default true (when importMetaUrl is provided)\n */\n autoExecute?: boolean;\n /**\n * The import.meta.url from the calling script, required for reliable auto-execution detection.\n * Only used when autoExecute is true.\n */\n importMetaUrl?: string;\n}\n\ntype TParsedArgsWithRouting<T = any> = T & {\n $commandChain?: string[];\n handlerToExecute?: { handler: Function; context: IHandlerContext };\n};\n\ntype InternalParsedArgs<T = any> = TParsedArgsWithRouting<T> & {\n _asyncHandlerPromise?: Promise<any>;\n _asyncHandlerInfo?: { handler: Function; context: IHandlerContext };\n _originalInputArgs?: string[] | string;\n handlerResponse?: any;\n};\n\ntype RecursiveParseResult = {\n finalArgs: InternalParsedArgs<any>; // Changed from TParsedArgsWithRouting<any>\n handlerToExecute?: { handler: Function; context: IHandlerContext };\n};\n\nexport class ArgParserBase<\n THandlerReturn = any,\n> implements IArgParser<THandlerReturn> {\n #appName: string = \"Argument Parser\";\n #appCommandName?: string;\n #subCommandName: string = \"\";\n #parameters: IArgParserParams<THandlerReturn> = {\n extraNewLine: true,\n wrapAtWidth: 50,\n blankSpaceWidth: 30,\n mandatoryCharacter: \"*\",\n };\n #handler?: (ctx: IHandlerContext) => void;\n #throwForDuplicateFlags: boolean = false;\n #description?: string;\n #handleErrors: boolean = true;\n #autoExit: boolean = true;\n #parentParser?: ArgParserBase;\n #lastParseResult: TParsedArgs<ProcessedFlag[]> = {};\n #inheritParentFlags: TFlagInheritance = false;\n #subCommands: Map<string, ISubCommand> = new Map();\n #flagManager: FlagManager;\n #dxtGenerator: DxtGenerator;\n #configurationManager: ConfigurationManager;\n #fuzzyMode: boolean = false;\n #triggerAutoHelpIfNoHandler: boolean = false;\n #logger: Logger;\n\n // Track dynamically added flags so we can clean them between parses\n #dynamicFlagNames: Set<string> = new Set();\n\n // MCP-related managers\n #mcpResourcesManager: McpResourcesManager = new McpResourcesManager();\n #mcpPromptsManager: McpPromptsManager = new McpPromptsManager();\n #mcpNotificationsManager: McpNotificationsManager =\n new McpNotificationsManager();\n\n // Working directory management\n /** The effective working directory for this parser instance */\n #effectiveWorkingDirectory: string | null = null;\n\n /** The original root path from user's CLI invocation */\n #rootPath: string | null = null;\n\n /** Tracks if effective working directory has been resolved */\n #workingDirectoryResolved = false;\n\n constructor(\n options: IArgParserParams<THandlerReturn> = {},\n initialFlags?: readonly IFlag[],\n ) {\n this.#appName = options.appName || \"app\";\n if (\n options.blankSpaceWidth &&\n !isNaN(Number(options.blankSpaceWidth)) &&\n Number(options.blankSpaceWidth) > 20\n )\n this.#parameters.blankSpaceWidth = Number(options.blankSpaceWidth);\n\n if (\n options.wrapAtWidth &&\n !isNaN(Number(options.wrapAtWidth)) &&\n Number(options.wrapAtWidth) > 30\n )\n this.#parameters.wrapAtWidth = Number(options.wrapAtWidth);\n\n if (typeof options.extraNewLine === \"boolean\")\n this.#parameters.extraNewLine = Boolean(options.extraNewLine);\n\n if (typeof options.mandatoryCharacter === \"string\")\n this.#parameters.mandatoryCharacter = options.mandatoryCharacter;\n\n if (typeof options.throwForDuplicateFlags === \"boolean\")\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags;\n\n this.#flagManager = new FlagManager(\n {\n throwForDuplicateFlags: this.#throwForDuplicateFlags,\n },\n initialFlags || [],\n );\n\n this.#handleErrors = options.handleErrors ?? true;\n this.#autoExit = options.autoExit ?? true;\n this.#inheritParentFlags = options.inheritParentFlags ?? false;\n this.#triggerAutoHelpIfNoHandler =\n options.triggerAutoHelpIfNoHandler ?? false;\n this.#description = options.description;\n this.#handler = options.handler;\n this.#appCommandName = options.appCommandName;\n this.#logger =\n options.logger ||\n createMcpLogger({\n prefix: this.#appName,\n mcpMode: false,\n });\n\n const helpFlag: IFlag = {\n name: \"help\",\n description: \"Display this help message and exits\",\n mandatory: false,\n type: Boolean,\n options: [\"-h\", \"--help\"],\n defaultValue: undefined,\n allowLigature: false,\n allowMultiple: false,\n flagOnly: true,\n enum: [],\n validate: (_value?: any, _parsedArgs?: any) => true, // Ensure signature matches Zod schema for .args()\n };\n this.#flagManager.addFlag(helpFlag); // Add the help flag via FlagManager\n\n // Initialize DXT generator\n this.#dxtGenerator = new DxtGenerator(this);\n\n // Initialize Configuration manager\n this.#configurationManager = new ConfigurationManager(this);\n\n if (options.subCommands) {\n for (const sub of options.subCommands) {\n this.addSubCommand(sub);\n }\n }\n }\n\n get flags(): ProcessedFlag[] {\n return this.#flagManager.flags;\n }\n\n get flagNames(): string[] {\n return this.#flagManager.flagNames;\n }\n\n public getAppName(): string | undefined {\n return this.#appName;\n }\n\n public getAppCommandName(): string | undefined {\n return this.#appCommandName;\n }\n\n /**\n * Access to the logger\n */\n public get logger(): Logger {\n return this.#logger;\n }\n\n public getSubCommandName(): string {\n return this.#subCommandName;\n }\n\n public getDescription(): string | undefined {\n return this.#description;\n }\n\n public getAutoExit(): boolean {\n return this.#autoExit;\n }\n\n /**\n * Helper method to handle exit logic based on autoExit setting\n * Returns a ParseResult instead of calling process.exit() when autoExit is false\n */\n private _handleExit(\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ): ParseResult | never {\n const result: ParseResult = {\n success: exitCode === 0,\n exitCode,\n message,\n type: type || (exitCode === 0 ? \"success\" : \"error\"),\n shouldExit: true,\n data,\n };\n\n if (\n this.#autoExit &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(exitCode as never);\n }\n\n return result;\n }\n\n public getHandler(): ((ctx: IHandlerContext) => void) | undefined {\n return this.#handler;\n }\n\n public getSubCommands(): Map<string, ISubCommand> {\n return this.#subCommands;\n }\n\n private async _addToOutput(\n flag: ProcessedFlag, // Changed from Flags[number]\n arg: any,\n output: TParsedArgs<ProcessedFlag[]>,\n _parseOptions?: IParseOptions,\n ) {\n let value: unknown = arg;\n\n if (flag[\"type\"] === Boolean) {\n if (typeof arg === \"boolean\") {\n value = arg;\n } else if (typeof arg === \"string\") {\n value = /(true|yes|1)/i.test(arg);\n } else {\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n } else if (typeof flag[\"type\"] === \"function\") {\n const result = (flag[\"type\"] as Function)(value as string);\n // Handle both sync and async custom parser functions\n value =\n result && typeof result.then === \"function\" ? await result : result;\n } else if (typeof flag[\"type\"] === \"object\") {\n // Check if it's a Zod schema\n if (flag[\"type\"] && (flag[\"type\"] as ZodTypeAny)._def) {\n // It's a Zod schema - parse JSON and validate\n try {\n const parsedJson =\n typeof value === \"string\" ? JSON.parse(value as string) : value;\n value = (flag[\"type\"] as ZodTypeAny).parse(parsedJson);\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `Invalid JSON for flag '${flag[\"name\"]}': ${error.message}`,\n );\n } else {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `Validation failed for flag '${flag[\"name\"]}': ${errorMessage}`,\n );\n }\n }\n } else {\n // Regular object constructor\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n }\n\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n const allowedValues = flag[\"enum\"]\n .map((v: any) => (typeof v === \"string\" ? `'${v}'` : v))\n .join(\", \");\n\n if (!flag[\"enum\"].includes(value)) {\n throw new ArgParserError(\n `Invalid value '${value}' for flag '${chalk.yellow(flag[\"name\"])}'. ` +\n `Allowed values: ${allowedValues}`,\n this.getCommandChain(),\n );\n }\n }\n\n if (flag[\"validate\"]) {\n const validationResult = flag[\"validate\"](value, output);\n if (validationResult === false) {\n throw new ArgParserError(\n `Validation failed for flag '${chalk.yellow(flag[\"name\"])}' with value '${value}'`,\n this.getCommandChain(),\n );\n } else if (typeof validationResult === \"string\") {\n throw new ArgParserError(validationResult, this.getCommandChain());\n }\n }\n\n if (flag[\"allowMultiple\"] && !Array.isArray(output[flag[\"name\"]])) {\n output[flag[\"name\"]] = [] as any;\n }\n\n return flag[\"allowMultiple\"]\n ? (output[flag[\"name\"]] as any[]).push(value)\n : (output[flag[\"name\"]] = value as any);\n }\n\n // Register flags coming from dynamic loaders and track them for cleanup\n #registerDynamicFlags(flags: readonly IFlag[]): void {\n if (!Array.isArray(flags) || flags.length === 0) return;\n for (const flag of flags) {\n const name = (flag as any)[\"name\"] as string;\n const existed = this.#flagManager.hasFlag(name);\n this.#flagManager.addFlag(flag);\n if (!existed) this.#dynamicFlagNames.add(name);\n }\n }\n\n // Remove dynamically registered flags on this parser and all sub-parsers\n #resetDynamicFlagsRecursive(parser: ArgParserBase = this): void {\n for (const name of parser.#dynamicFlagNames) {\n parser.#flagManager.removeFlag(name);\n }\n parser.#dynamicFlagNames.clear();\n for (const [, sub] of parser.#subCommands) {\n if (sub && sub.parser instanceof ArgParserBase) {\n sub.parser.#resetDynamicFlagsRecursive();\n }\n }\n }\n\n // Preload dynamic flags for help display without executing handlers\n async #_preloadDynamicFlagsForHelp(processArgs: string[]): Promise<void> {\n let currentParser: ArgParserBase = this;\n let remaining = [...processArgs];\n\n while (true) {\n // Find first index that matches a sub-command of currentParser\n let subIndex = -1;\n for (let i = 0; i < remaining.length; i++) {\n if (currentParser.#subCommands.has(remaining[i]!)) {\n subIndex = i;\n break;\n }\n }\n\n const segment =\n subIndex === -1 ? remaining : remaining.slice(0, subIndex);\n try {\n await currentParser.#parseFlags(segment, {\n skipHelpHandling: true,\n dynamicHelpPreload: true,\n });\n } catch {\n // ignore errors during help preloading\n }\n\n if (subIndex === -1) break;\n const nextName = remaining[subIndex]!;\n const sub = currentParser.#subCommands.get(nextName);\n if (!sub || !(sub.parser instanceof ArgParserBase)) break;\n currentParser = sub.parser;\n remaining = remaining.slice(subIndex + 1);\n }\n }\n\n addFlags(flags: readonly IFlag[]): this {\n this.#flagManager.addFlags(flags);\n return this;\n }\n\n addFlag(flag: IFlag): this {\n this.#flagManager.addFlag(flag);\n return this;\n }\n\n addSubCommand(subCommandConfig: ISubCommand): this {\n if (this.#subCommands.has(subCommandConfig.name)) {\n throw new Error(`Sub-command '${subCommandConfig.name}' already exists`);\n }\n\n const subParser = subCommandConfig.parser;\n\n if (!(subParser instanceof ArgParserBase)) {\n throw new Error(\n `Parser for subcommand '${subCommandConfig.name}' is not an instance of ArgParserBase. ` +\n `Please provide 'new ArgParserBase(...)' for the 'parser' property of an ISubCommand.`,\n );\n }\n\n subParser.#parentParser = this;\n subParser.#subCommandName = subCommandConfig.name;\n if (!subParser.#appCommandName && this.#appCommandName) {\n subParser.#appCommandName = this.#appCommandName;\n }\n\n // Copy description from config to sub-parser if provided\n if (subCommandConfig.description) {\n subParser.#description = subCommandConfig.description;\n }\n\n // Inherit autoExit setting from parent to ensure consistent error handling\n // across the parser hierarchy. Child parsers should follow parent's exit behavior.\n subParser.#autoExit = this.#autoExit;\n subParser.#triggerAutoHelpIfNoHandler = this.#triggerAutoHelpIfNoHandler;\n\n // Initial inheritance (Snapshot behavior)\n // If inheritParentFlags is true or DirectParentOnly or AllParents, we copy current parent flags.\n const shouldInherit =\n subParser.#inheritParentFlags === true ||\n subParser.#inheritParentFlags === FlagInheritance.DirectParentOnly ||\n subParser.#inheritParentFlags === FlagInheritance.AllParents;\n\n if (shouldInherit) {\n const parentFlags = this.#flagManager.flags;\n for (const parentFlag of parentFlags) {\n if (!subParser.#flagManager.hasFlag(parentFlag[\"name\"])) {\n subParser.#flagManager._setProcessedFlagForInheritance(parentFlag);\n }\n }\n }\n\n this.#subCommands.set(subCommandConfig.name, subCommandConfig);\n // We trigger a propagation from the subParser downwards.\n // This ensures that if subParser just acquired flags from 'this',\n // any existing children of subParser properly inherit them.\n this.#propagateFlagsRecursive(subParser);\n\n if (subCommandConfig.handler) {\n subParser.setHandler(subCommandConfig.handler);\n }\n\n return this;\n }\n\n /**\n * Propagates available flags from the current parser to its subcommands,\n * if those subcommands are configured to inherit recursively (AllParents).\n */\n #propagateFlagsRecursive(parser: ArgParserBase): void {\n // We iterate over all children of 'parser'\n for (const [_, subConfig] of parser.getSubCommands()) {\n const childParser = subConfig.parser;\n if (!(childParser instanceof ArgParserBase)) continue;\n\n // Check if child wants multiple levels of inheritance\n const isAllParents =\n childParser.#inheritParentFlags === FlagInheritance.AllParents;\n\n if (isAllParents) {\n // Copy flags from 'parser' (which is the parent of childParser) to 'childParser'\n const parentFlags = parser.#flagManager.flags;\n let flagsAdded = false;\n\n for (const parentFlag of parentFlags) {\n if (!childParser.#flagManager.hasFlag(parentFlag[\"name\"])) {\n childParser.#flagManager._setProcessedFlagForInheritance(\n parentFlag,\n );\n flagsAdded = true;\n }\n }\n\n // If we added new flags to the child, we must recurse deeper\n if (flagsAdded) {\n this.#propagateFlagsRecursive(childParser);\n }\n }\n }\n }\n\n /**\n * Sets the handler function for this specific parser instance.\n * This handler will be executed if this parser is the final one\n * in the command chain and `executeHandlers` is enabled on the root parser.\n *\n * @param handler - The function to execute.\n * @returns The ArgParser instance for chaining.\n */\n setHandler(\n handler: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>,\n ): this {\n this.#handler = handler;\n return this;\n }\n\n printAll(filePath?: string): void {\n if (filePath) {\n try {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n if (filePath.toLowerCase().endsWith(\".json\")) {\n const outputObject = this.#_buildRecursiveJson(this);\n const jsonString = JSON.stringify(outputObject, null, 2);\n fs.writeFileSync(filePath, jsonString);\n this.#logger.info(\n `ArgParser configuration JSON dumped to: ${filePath}`,\n );\n } else {\n const outputString = this.#_buildRecursiveString(this, 0);\n const plainText = outputString.replace(\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n \"\",\n );\n fs.writeFileSync(filePath, plainText);\n this.#logger.info(\n `ArgParser configuration text dumped to: ${filePath}`,\n );\n }\n } catch (error) {\n this.#logger.error(\n `Error writing ArgParser configuration to file '${filePath}':`,\n error,\n );\n }\n } else {\n this.#logger.info(\"\\n--- ArgParser Configuration Dump ---\");\n this.#_printRecursiveToConsole(this, 0);\n this.#logger.info(\"--- End Configuration Dump ---\\\\n\");\n }\n }\n\n #_identifyCommandChainAndParsers(\n argsToParse: string[],\n currentParser: ArgParserBase,\n commandChainSoFar: string[],\n parserChainSoFar: ArgParserBase[],\n ): {\n finalParser: ArgParserBase;\n commandChain: string[];\n parserChain: ArgParserBase[];\n remainingArgs: string[];\n } {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n if (subCommandIndex === -1 || subCommandName === null) {\n return {\n finalParser: currentParser,\n commandChain: commandChainSoFar,\n parserChain: parserChainSoFar,\n remainingArgs: argsToParse,\n };\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName);\n if (\n !subCommandConfig ||\n !(subCommandConfig.parser instanceof ArgParserBase)\n ) {\n throw new Error(\n `Internal error: Subcommand '${subCommandName!}' configuration is invalid or parser is missing.`,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const nextParserChain = [...parserChainSoFar, nextParser];\n\n return this.#_identifyCommandChainAndParsers(\n nextArgs,\n nextParser,\n nextCommandChain,\n nextParserChain,\n );\n }\n\n #_resolveWorkingDirectory(\n processArgs: string[],\n parserChain: ArgParserBase[],\n ): { effectiveCwd: string; rootPath: string } {\n // 1. Store the original root path once\n if (!this.#rootPath) {\n this.#rootPath = process.cwd();\n }\n\n // 2. Scan for flags with setWorkingDirectory in reverse order\n // (last one in command chain wins)\n let foundCwd: string | null = null;\n\n for (let i = parserChain.length - 1; i >= 0; i--) {\n const parser = parserChain[i];\n const chdirFlags = parser.#flagManager.flags.filter(\n (flag: ProcessedFlag) => flag[\"setWorkingDirectory\"],\n );\n\n for (const flag of chdirFlags) {\n // Simple pattern matching for flag presence\n for (const option of flag[\"options\"]) {\n // Find flag in processArgs\n const flagIndex = processArgs.indexOf(option);\n if (flagIndex !== -1 && flagIndex + 1 < processArgs.length) {\n const value = processArgs[flagIndex + 1];\n if (!value || value.startsWith(\"-\")) continue;\n\n // Resolve path relative to current effective working directory\n const resolvedPath = path.resolve(\n this.#effectiveWorkingDirectory || this.#rootPath,\n value,\n );\n\n // Validate path exists and is a directory\n if (!fs.existsSync(resolvedPath)) {\n // Use console.warn directly for user-facing warnings\n console.warn(\n chalk.yellow(\n `Warning: Working directory '${resolvedPath}' specified by ${option} does not exist. Using current directory instead.`,\n ),\n );\n continue;\n }\n\n if (!fs.statSync(resolvedPath).isDirectory()) {\n // Use console.warn directly for user-facing warnings\n console.warn(\n chalk.yellow(\n `Warning: Path '${resolvedPath}' specified by ${option} is not a directory. Using current directory instead.`,\n ),\n );\n continue;\n }\n\n foundCwd = resolvedPath;\n\n // Actually change the working directory\n process.chdir(resolvedPath);\n\n // Check for multiple chdir flags\n const allChdirIndices: { index: number; flag: string }[] = [];\n for (let j = 0; j < processArgs.length; j++) {\n for (const p of parserChain) {\n for (const f of p.#flagManager.flags) {\n if (\n f[\"setWorkingDirectory\"] &&\n f[\"options\"].includes(processArgs[j])\n ) {\n allChdirIndices.push({ index: j, flag: processArgs[j] });\n }\n }\n }\n }\n\n if (allChdirIndices.length > 1) {\n this.#logger.warn(\n chalk.yellow(\n `Warning: Multiple working directory flags detected. Using '${option}' (last one in command chain).`,\n ),\n );\n }\n\n break; // Use the first found flag in this parser\n }\n }\n\n if (foundCwd) break; // Found valid chdir flag, stop searching\n }\n\n if (foundCwd) break; // Found valid chdir flag, stop searching parsers\n }\n\n // 3. Return effective working directory\n return {\n effectiveCwd: foundCwd || this.#rootPath,\n rootPath: this.#rootPath,\n };\n }\n\n async #_handleGlobalChecks(\n processArgs: string[],\n options?: IParseOptions,\n ): Promise<boolean | ParseResult> {\n // Resolve working directory FIRST\n const { finalParser: parserChainParser } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const { effectiveCwd, rootPath } = this.#_resolveWorkingDirectory(\n processArgs,\n parserChainParser ? [this, parserChainParser] : [this],\n );\n\n this.#effectiveWorkingDirectory = effectiveCwd;\n this.#rootPath = rootPath;\n this.#workingDirectoryResolved = true;\n\n // Auto-help should only trigger for root parsers that are intended as main CLI entry points\n // A parser is considered a \"root CLI parser\" if it has appCommandName explicitly set\n // This ensures that only parsers intended as main CLI tools trigger auto-help\n const isRootCliParser = !this.#parentParser && !!this.#appCommandName;\n\n if (\n processArgs.length === 0 &&\n isRootCliParser &&\n !this.#handler &&\n !options?.skipHelpHandling\n ) {\n this.#logger.info(this.helpText());\n return this._handleExit(0, \"Help displayed\", \"help\");\n }\n\n if (processArgs.includes(\"--s-debug-print\")) {\n this.printAll(\"ArgParser.full.json\");\n return this._handleExit(0, \"Debug information printed\", \"debug\");\n }\n\n // Handle --s-enable-fuzzy system flag to enable fuzzy testing mode\n if (processArgs.includes(\"--s-enable-fuzzy\")) {\n this.#_enableFuzzyMode();\n // Remove the flag from processArgs so it doesn't interfere with parsing\n const fuzzyIndex = processArgs.indexOf(\"--s-enable-fuzzy\");\n processArgs.splice(fuzzyIndex, 1);\n }\n\n // Handle --s-with-env system flag early to modify processArgs before parsing\n const withEnvIndex = processArgs.findIndex((arg) => arg === \"--s-with-env\");\n if (withEnvIndex !== -1) {\n let envFilePath: string | null = null;\n let shouldAutoDiscover: boolean;\n\n // Auto-discovery: Check if we should auto-discover .env files\n // Auto-discover when: (1) setWorkingDirectory is set AND (2) --s-with-env is NOT provided (no file path)\n shouldAutoDiscover =\n this.#workingDirectoryResolved &&\n this.#effectiveWorkingDirectory !== this.#rootPath &&\n withEnvIndex + 1 >= processArgs.length;\n\n // Check if a file path is provided\n if (withEnvIndex + 1 < processArgs.length) {\n const providedPath = processArgs[withEnvIndex + 1];\n if (providedPath && !providedPath.startsWith(\"-\")) {\n // Use effective working directory (or current cwd if not set)\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = path.resolve(basePath, providedPath);\n } else if (shouldAutoDiscover) {\n // No file path provided, but shouldAutoDiscover is true\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (!envFilePath) {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n // Remove flag and continue\n processArgs.splice(withEnvIndex, 1);\n }\n }\n } else if (shouldAutoDiscover) {\n // --s-with-env is NOT provided, but setWorkingDirectory is set\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (envFilePath) {\n console.warn(`Auto-discovered env file: ${envFilePath}`);\n } else {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n }\n }\n\n // Load env file if found (this processes both explicit and auto-discovered files)\n if (envFilePath) {\n try {\n // Identify to final parser and parser chain for loading configuration\n const {\n finalParser: identifiedFinalParser,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(\n processArgs,\n this,\n [],\n [this],\n );\n\n const envConfigArgs =\n identifiedFinalParser.#configurationManager.loadEnvFile(\n envFilePath,\n identifiedParserChain,\n );\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs =\n identifiedFinalParser.#configurationManager.mergeEnvConfigWithArgs(\n envConfigArgs,\n processArgs,\n identifiedParserChain,\n );\n\n // Replace to original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n\n // Remove to --s-with-env flag and its file path argument from processArgs\n // This must be done after merging to avoid interfering with to merge process\n const finalWithEnvIndex = processArgs.findIndex(\n (arg) => arg === \"--s-with-env\",\n );\n if (finalWithEnvIndex !== -1) {\n // Check if there's a file path argument after to flag\n if (\n finalWithEnvIndex + 1 < processArgs.length &&\n !processArgs[finalWithEnvIndex + 1].startsWith(\"-\")\n ) {\n processArgs.splice(finalWithEnvIndex, 2); // Remove both flag and file path\n } else {\n processArgs.splice(finalWithEnvIndex, 1); // Remove only to flag\n }\n }\n } catch (error) {\n console.error(\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n );\n return this._handleExit(\n 1,\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n // Auto-discovery: If no file path provided, check if we should auto-discover\n if (shouldAutoDiscover) {\n // No file path provided, but shouldAutoDiscover is true\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (envFilePath) {\n console.warn(`Auto-discovered env file: ${envFilePath}`);\n } else {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n }\n }\n\n // Load env file if found (this processes both explicit and auto-discovered files)\n if (envFilePath) {\n try {\n // Identify to final parser and parser chain for loading configuration\n const {\n finalParser: identifiedFinalParser,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(\n processArgs,\n this,\n [],\n [this],\n );\n\n const envConfigArgs =\n identifiedFinalParser.#configurationManager.loadEnvFile(\n envFilePath,\n identifiedParserChain,\n );\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs =\n identifiedFinalParser.#configurationManager.mergeEnvConfigWithArgs(\n envConfigArgs,\n processArgs,\n identifiedParserChain,\n );\n\n // Replace to original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return this._handleExit(\n 1,\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n // Auto-discovery: Check if we should auto-discover .env files\n // Auto-discover when: (1) setWorkingDirectory is set AND (2) --s-with-env is NOT provided (no file path)\n shouldAutoDiscover =\n this.#workingDirectoryResolved &&\n this.#effectiveWorkingDirectory !== this.#rootPath &&\n withEnvIndex + 1 >= processArgs.length;\n\n if (shouldAutoDiscover) {\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (envFilePath) {\n console.warn(`Auto-discovered env file: ${envFilePath}`);\n } else {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n }\n // Remove --s-with-env flag if no env file was found\n if (!envFilePath) {\n processArgs.splice(withEnvIndex, 1);\n }\n }\n }\n\n // Auto-discovery: When setWorkingDirectory flag was used (cwd changed) but --s-with-env was NOT provided,\n // automatically discover and load .env files from the new working directory\n const withEnvWasProvided = processArgs.some(\n (arg) => arg === \"--s-with-env\",\n );\n const shouldAutoDiscoverWithoutFlag =\n this.#workingDirectoryResolved &&\n this.#effectiveWorkingDirectory !== this.#rootPath &&\n !withEnvWasProvided;\n\n if (shouldAutoDiscoverWithoutFlag) {\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n const autoDiscoveredEnvFile =\n this.#configurationManager.discoverEnvFile(basePath);\n\n if (autoDiscoveredEnvFile) {\n console.warn(`Auto-discovered env file: ${autoDiscoveredEnvFile}`);\n\n // Load env file into process.env using dotenv (dotenv-style behavior)\n dotenv.config({\n path: autoDiscoveredEnvFile,\n quiet: true,\n override: true,\n });\n\n try {\n // Identify the final parser and parser chain for loading configuration\n const { finalParser: envFinalParser, parserChain: envParserChain } =\n this.#_identifyCommandChainAndParsers(\n processArgs,\n this,\n [],\n [this],\n );\n\n const envConfigArgs =\n envFinalParser.#configurationManager.loadEnvFile(\n autoDiscoveredEnvFile,\n envParserChain,\n );\n\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs =\n envFinalParser.#configurationManager.mergeEnvConfigWithArgs(\n envConfigArgs,\n processArgs,\n envParserChain,\n );\n\n // Replace the original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n } catch (error) {\n console.error(\n `Error loading auto-discovered environment file: ${error instanceof Error ? error.message : String(error)}`,\n );\n // Don't exit on auto-discovery errors, just warn and continue\n }\n }\n }\n\n const { finalParser: identifiedFinalParser } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const buildDxtIndex = processArgs.findIndex(\n (arg) => (arg ?? \"\").toLowerCase() === \"--s-build-dxt\",\n );\n if (buildDxtIndex !== -1) {\n const dxtResult = await this.#_handleBuildDxtFlag(\n processArgs,\n buildDxtIndex,\n );\n if (dxtResult !== false) {\n return dxtResult === true ? true : dxtResult;\n }\n }\n\n // Handle --s-mcp-serve system flag to start all MCP servers\n debug.log(\"Checking for --s-mcp-serve flag in args:\", processArgs);\n const mcpServeIndex = processArgs.findIndex(\n (arg) => arg === \"--s-mcp-serve\",\n );\n debug.log(\"mcpServeIndex:\", mcpServeIndex);\n if (mcpServeIndex !== -1) {\n debug.log(\"Found --s-mcp-serve flag, calling handler\");\n const mcpServeResult = await this.#_handleMcpServeFlag(\n processArgs,\n mcpServeIndex,\n );\n debug.log(\"MCP serve handler returned:\", typeof mcpServeResult);\n if (mcpServeResult !== false) {\n return mcpServeResult === true ? true : mcpServeResult;\n }\n }\n\n if (processArgs.includes(\"--s-debug\")) {\n console.log(\n chalk.yellow.bold(\"\\n--- ArgParser --s-debug Runtime Context ---\"),\n );\n\n const {\n commandChain: identifiedCommandChain,\n parserChain: _identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n console.log(\n `Identified Command Chain: ${chalk.cyan(identifiedCommandChain.join(\" -> \") || \"(root)\")}`,\n );\n console.log(\n `Identified Final Parser: ${chalk.cyan(identifiedFinalParser.#subCommandName || identifiedFinalParser.#appName)}`,\n );\n\n let currentParser: ArgParserBase = this;\n let remainingArgs = [...processArgs];\n let accumulatedArgs: TParsedArgs<any> = {};\n const parsingSteps: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n }[] = [];\n\n const rootSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const rootArgsSlice =\n rootSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, rootSubCommandIndex);\n parsingSteps.push({ level: \"(root)\", argsSlice: rootArgsSlice });\n try {\n const { parsedArgs: rootParsedArgs } = await currentParser.#parseFlags(\n rootArgsSlice,\n { skipHelpHandling: true },\n );\n parsingSteps[0].parsed = rootParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...rootParsedArgs };\n } catch (e: any) {\n parsingSteps[0].error = e.message;\n }\n remainingArgs =\n rootSubCommandIndex === -1\n ? []\n : remainingArgs.slice(rootSubCommandIndex);\n\n for (let i = 0; i < identifiedCommandChain.length; i++) {\n const subCommandName = identifiedCommandChain[i];\n if (!currentParser.#subCommands.has(subCommandName)) {\n parsingSteps.push({\n level: `Error`,\n argsSlice: [],\n error: `Could not find sub-command parser for '${subCommandName}'`,\n });\n break;\n }\n currentParser = (currentParser as any).#subCommands.get(\n subCommandName,\n )?.parser;\n remainingArgs = remainingArgs.slice(1);\n\n const nextSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const currentLevelArgsSlice =\n nextSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, nextSubCommandIndex);\n const stepInfo: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n } = {\n level: subCommandName,\n argsSlice: currentLevelArgsSlice,\n };\n parsingSteps.push(stepInfo);\n\n try {\n const { parsedArgs: currentLevelParsedArgs } =\n await currentParser.#parseFlags(currentLevelArgsSlice, {\n skipHelpHandling: true,\n });\n stepInfo.parsed = currentLevelParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...currentLevelParsedArgs };\n } catch (e: any) {\n stepInfo.error = e.message;\n }\n remainingArgs =\n nextSubCommandIndex === -1\n ? []\n : remainingArgs.slice(nextSubCommandIndex);\n }\n\n this.#logger.info(chalk.yellow(\"\\nParsing Simulation Steps:\"));\n parsingSteps.forEach((step) => {\n this.#logger.info(` Level: ${chalk.cyan(step.level)}`);\n this.#logger.info(\n ` Args Slice Considered: ${JSON.stringify(step.argsSlice)}`,\n );\n if (step.parsed) {\n this.#logger.info(\n ` Parsed Args at this Level: ${JSON.stringify(step.parsed)}`,\n );\n }\n if (step.error) {\n this.#logger.info(\n ` ${chalk.red(\"Error during parse simulation:\")} ${step.error}`,\n );\n }\n });\n\n this.#logger.info(\n chalk.yellow(\n \"\\nFinal Accumulated Args State (before final validation):\",\n ),\n );\n this.#logger.info(JSON.stringify(accumulatedArgs, null, 2));\n\n this.#logger.info(\n chalk.yellow(\"\\nArguments Remaining After Simulation:\"),\n );\n this.#logger.info(JSON.stringify(remainingArgs, null, 2));\n\n this.#logger.info(\n chalk.yellow.bold(\n \"\\n--- ArgParser Static Configuration (Final Parser) ---\",\n ),\n );\n identifiedFinalParser.printAll();\n\n this.#logger.info(chalk.yellow.bold(\"--- End ArgParser --s-debug ---\"));\n return this._handleExit(0, \"Debug information displayed\", \"debug\");\n }\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n let parserNameForLog = \"undefined_parser\";\n if (identifiedFinalParser instanceof ArgParserBase) {\n // Access public getters instead of private fields\n parserNameForLog =\n identifiedFinalParser.getSubCommandName() ||\n identifiedFinalParser.getAppName() ||\n \"unknown\";\n } else if (identifiedFinalParser) {\n parserNameForLog =\n (identifiedFinalParser as any).name ||\n (identifiedFinalParser as any).appName ||\n \"unknown_type\";\n }\n // console.log(\n // `[ArgParser #_handleGlobalChecks Debug] identifiedFinalParser: constructor=${identifiedFinalParser ? 'defined' : 'undefined'}, isArgParser=${identifiedFinalParser instanceof ArgParser}, name=${parserNameForLog}`\n // );\n // ---- END ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n\n // ---- BEGIN GUARD FOR identifiedFinalParser ----\n if (!(identifiedFinalParser instanceof ArgParserBase)) {\n console.error(\n `[ArgParser #_handleGlobalChecks Critical Error] identifiedFinalParser is not an instance of ArgParser. Cannot process help. Name: ${parserNameForLog}, Constructor: ${identifiedFinalParser ? (identifiedFinalParser as any).constructor?.name : \"undefined\"}`,\n );\n // Returning false to prevent further processing with an invalid parser,\n // which could lead to more cryptic errors or incorrect behavior.\n return false;\n }\n // ---- END GUARD FOR identifiedFinalParser ----\n\n const helpFlagDefinition =\n identifiedFinalParser.#flagManager.getFlag(\"help\");\n if (helpFlagDefinition && !options?.skipHelpHandling) {\n const helpOptions = helpFlagDefinition[\"options\"];\n\n // ---- BEGIN ADDED DEBUG AND DEFENSIVE CHECK ----\n // if (!Array.isArray(helpOptions) || helpOptions.length === 0) {\n // console.warn(\n // `[ArgParser Debug] helpOptions is not a valid array or is empty. Value: ${JSON.stringify(helpOptions)}, Type: ${typeof helpOptions}`,\n // `Parser: ${parserNameForLog}`, // Use the determined parserNameForLog\n // );\n // // Potentially, we might even want to return false here or throw,\n // // as help cannot be processed correctly. For now, just log and continue.\n // } else {\n // // Optional: Log the valid helpOptions for debugging successful cases\n // // console.log(`[ArgParser Debug] Valid helpOptions: ${JSON.stringify(helpOptions)} for parser ${parserNameForLog}`);\n // }\n // ---- END ADDED DEBUG AND DEFENSIVE CHECK ----\n\n const helpRequested = processArgs.some((arg) =>\n helpOptions.includes(arg),\n );\n\n if (helpRequested) {\n await this.#_preloadDynamicFlagsForHelp(processArgs);\n console.log(identifiedFinalParser.helpText());\n return this._handleExit(0, \"Help displayed\", \"help\");\n }\n }\n\n return false;\n }\n\n #_validateMandatoryFlags(\n finalArgs: TParsedArgsWithRouting<any>,\n parserChain: ArgParserBase[],\n commandChain: string[],\n ): void {\n const finalMandatoryFlagsMissing: {\n name: string;\n parserName: string;\n commandChain: string[];\n }[] = [];\n const checkedFlagNames = new Set<string>();\n\n // For both MCP and regular subcommands, use the same inheritance-based validation logic\n // Validate all parsers except the root parser when it's not the final destination\n let parsersToValidate: ArgParserBase[] = [...parserChain];\n\n // If there are multiple parsers and the root parser is not the final destination,\n // remove the root parser from validation (unless its flags are inherited)\n if (parserChain.length > 1) {\n const immediateChild = parserChain[1];\n\n // If the immediate child doesn't inherit from root, don't validate root\n if (!immediateChild.#inheritParentFlags) {\n parsersToValidate = parsersToValidate.slice(1);\n }\n }\n\n for (let i = 0; i < parsersToValidate.length; i++) {\n const parser = parsersToValidate[i];\n const currentCommandChain = parser.getCommandChain();\n\n for (const flag of parser.#flagManager.flags) {\n // Use FlagManager\n if (flag[\"name\"] === \"help\" || checkedFlagNames.has(flag[\"name\"]))\n continue;\n\n // Check if this flag is inherited by the immediate child\n let flagIsInheritedByChild = false;\n\n if (i < parsersToValidate.length - 1) {\n const immediateChild = parsersToValidate[i + 1];\n\n // If the immediate child inherits parent flags AND has this flag,\n // then this flag is inherited and should be validated by the child\n if (\n immediateChild.#inheritParentFlags &&\n immediateChild.#flagManager.hasFlag(flag[\"name\"])\n ) {\n flagIsInheritedByChild = true;\n }\n }\n\n // Skip validation if this flag is inherited by a child (child will validate it)\n if (flagIsInheritedByChild) continue;\n\n const isMandatory =\n typeof flag[\"mandatory\"] === \"function\"\n ? flag[\"mandatory\"](finalArgs)\n : flag[\"mandatory\"];\n\n if (!isMandatory) continue;\n\n const value = finalArgs[flag[\"name\"] as keyof typeof finalArgs];\n let currentFlagIsMissing = false;\n\n if (flag[\"allowMultiple\"]) {\n // For allowMultiple, it's missing if undefined OR an empty array\n if (\n value === undefined ||\n (Array.isArray(value) && value.length === 0)\n ) {\n currentFlagIsMissing = true;\n }\n } else {\n // For non-allowMultiple, it's missing if undefined\n if (value === undefined) {\n currentFlagIsMissing = true;\n }\n }\n\n if (currentFlagIsMissing) {\n if (!checkedFlagNames.has(flag[\"name\"])) {\n finalMandatoryFlagsMissing.push({\n name: flag[\"name\"],\n parserName: parser.#subCommandName || parser.#appName,\n commandChain: currentCommandChain,\n });\n checkedFlagNames.add(flag[\"name\"]);\n }\n }\n }\n }\n\n if (finalMandatoryFlagsMissing.length > 0) {\n throw new ArgParserError(\n `Missing mandatory flags: ${finalMandatoryFlagsMissing\n .map((flag) => chalk.yellow(flag[\"name\"]))\n .join(\", \")}`,\n commandChain,\n );\n }\n }\n\n #_applyDefaultValues(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n // Use FlagManager\n const flagName = flag[\"name\"] as string;\n if (\n finalArgs[flagName] === undefined &&\n flag[\"defaultValue\"] !== undefined\n ) {\n if (flag[\"allowMultiple\"]) {\n finalArgs[flagName] = Array.isArray(flag[\"defaultValue\"])\n ? flag[\"defaultValue\"]\n : [flag[\"defaultValue\"]];\n } else {\n finalArgs[flagName] = flag[\"defaultValue\"];\n }\n }\n }\n }\n\n #_applyEnvFallback(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n const flagName = flag[\"name\"] as string;\n\n if (!flag[\"env\"]) continue;\n\n // Check if value is already set (by CLI).\n // If we move this call BEFORE defaults, then 'undefined' means truly \"not set by CLI\".\n if (finalArgs[flagName] !== undefined) {\n // If allowMultiple, we might append? Usually env var is just a fallback source.\n // If CLI provided check, we skip Env.\n continue;\n }\n\n const envVars = Array.isArray(flag[\"env\"]) ? flag[\"env\"] : [flag[\"env\"]];\n let foundVal: string | undefined;\n\n for (const envKey of envVars) {\n if (process.env[envKey] !== undefined) {\n foundVal = process.env[envKey];\n break; // First match wins\n }\n }\n\n if (foundVal !== undefined) {\n try {\n const typedVal = this.#configurationManager.convertValueToFlagType(\n foundVal,\n flag,\n );\n if (flag[\"allowMultiple\"]) {\n // If allowMultiple, convertValueToFlagType returns array or single.\n // We ensure it's set correctly.\n finalArgs[flagName] = Array.isArray(typedVal)\n ? typedVal\n : [typedVal];\n } else {\n finalArgs[flagName] = typedVal;\n }\n } catch (e) {\n console.warn(\n chalk.yellow(\n `Warning: Failed to parse env var for flag '${flagName}': ${e}`,\n ),\n );\n }\n }\n }\n }\n\n #_syncToEnv(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n if (!flag[\"env\"]) continue;\n\n const flagName = flag[\"name\"];\n const value = finalArgs[flagName];\n\n if (value !== undefined) {\n const envVars = Array.isArray(flag[\"env\"])\n ? flag[\"env\"]\n : [flag[\"env\"]];\n // Convert value to string for Env\n let strVal = \"\";\n if (typeof value === \"object\") {\n strVal = JSON.stringify(value);\n } else {\n strVal = String(value);\n }\n\n for (const envKey of envVars) {\n process.env[envKey] = strVal;\n }\n }\n }\n }\n\n #_prepareAndExecuteHandler(\n handlerToExecute: RecursiveParseResult[\"handlerToExecute\"],\n finalArgs: TParsedArgsWithRouting<any>,\n skipHandlers: boolean,\n ): void {\n // Skip handlers if explicitly requested, if no handler exists, or if in fuzzy mode\n if (skipHandlers || !handlerToExecute) {\n return;\n }\n\n // Log handler skipping in fuzzy mode for visibility\n if (this.#fuzzyMode) {\n const commandChain = handlerToExecute.context.commandChain || [];\n const args = handlerToExecute.context.args || {};\n\n // Try to get the original input arguments from the final args if available\n const inputArgs =\n (finalArgs as InternalParsedArgs)._originalInputArgs || \"unknown\";\n const inputArgsStr = Array.isArray(inputArgs)\n ? inputArgs.join(\" \")\n : inputArgs;\n\n console.log(\n `[--s-enable-fuzzy] handler() skipped for command chain: ${commandChain.join(\" \") || \"(root)\"}`,\n );\n console.log(` Input args: [${inputArgsStr}]`);\n console.log(` Parsed args: ${JSON.stringify(args)}`);\n return;\n }\n\n const finalParserWhoseHandlerWillRun = handlerToExecute.context.parser;\n const finalParserFlags = finalParserWhoseHandlerWillRun.flags;\n const handlerArgs = handlerToExecute.context.args;\n\n for (const flag of finalParserFlags) {\n const flagName = flag[\"name\"] as keyof typeof finalArgs;\n if (finalArgs.hasOwnProperty(flagName)) {\n (handlerArgs as any)[flagName] = finalArgs[flagName];\n } else if (\n flag[\"allowMultiple\"] &&\n !handlerArgs.hasOwnProperty(flagName)\n ) {\n (handlerArgs as any)[flagName] = [];\n }\n }\n handlerToExecute.context.args = handlerArgs;\n\n try {\n const handlerResult = handlerToExecute.handler(handlerToExecute.context);\n\n // Check if result is a Promise (async handler)\n if (handlerResult && typeof handlerResult.then === \"function\") {\n // Store async handler info for ArgParserWithMcp to handle\n (finalArgs as InternalParsedArgs)._asyncHandlerPromise = handlerResult;\n (finalArgs as InternalParsedArgs)._asyncHandlerInfo = handlerToExecute;\n\n // Add a catch handler to prevent unhandled rejection warnings\n // The actual error handling will be done in parseAsync()\n handlerResult.catch(() => {\n // Silently ignore - this will be handled properly in parseAsync()\n });\n\n return;\n }\n\n (finalArgs as InternalParsedArgs).handlerResponse = handlerResult;\n\n // Merge handler result into final args if it's an object\n if (\n handlerResult &&\n typeof handlerResult === \"object\" &&\n !Array.isArray(handlerResult)\n ) {\n Object.assign(finalArgs, handlerResult);\n }\n } catch (error) {\n // For synchronous handlers, we can handle sync errors\n if (this.#handleErrors) {\n this.#displayErrorAndExit(\n new ArgParserError(`Handler error: ${error}`, []),\n );\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Detects if the current script is being executed directly (not imported)\n * Uses a robust method that works across different environments and sandboxes\n * @param importMetaUrl The import.meta.url from the calling script (optional)\n * @returns true if the script is being executed directly, false if imported\n */\n private static isExecutedDirectly(importMetaUrl?: string): boolean {\n try {\n // Use import.meta.url if provided (most reliable for ES modules)\n if (importMetaUrl) {\n const currentFile = fileURLToPath(importMetaUrl);\n const executedFile = path.resolve(process.argv[1]);\n return currentFile === executedFile;\n }\n\n // Fallback\n if (typeof process !== \"undefined\" && process.argv && process.argv[1]) {\n // Conservative approach\n return false;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n async parse(\n processArgs?: string[],\n options?: IParseOptions,\n ): Promise<TParsedArgsWithRouting<any> | ParseResult> {\n debug.log(\"ArgParserBase.parse() called with args:\", processArgs);\n\n // Handle auto-execution: only run if script is executed directly (not imported)\n // Default to true unless explicitly disabled, but only when importMetaUrl is provided\n const shouldCheckAutoExecution =\n options?.importMetaUrl && options?.autoExecute !== false;\n if (shouldCheckAutoExecution) {\n const isDirectExecution = ArgParserBase.isExecutedDirectly(\n options.importMetaUrl,\n );\n if (!isDirectExecution) {\n // Script is being imported, not executed directly - return early without parsing\n debug.log(\n \"Auto-execution enabled but script is imported, skipping execution\",\n );\n return {} as TParsedArgsWithRouting<any>;\n }\n }\n\n // Handle automatic argument detection when no arguments provided\n if (processArgs === undefined) {\n // Check if we're in a Node.js environment\n if (\n typeof process !== \"undefined\" &&\n process.argv &&\n Array.isArray(process.argv)\n ) {\n processArgs = process.argv.slice(2);\n } else {\n // Not in Node.js environment, throw an error\n throw new Error(\n \"parse() called without arguments in non-Node.js environment. \" +\n \"Please provide arguments explicitly: parse(['--flag', 'value'])\",\n );\n }\n }\n\n // Reset dynamically registered flags before each parse to avoid accumulation\n this.#resetDynamicFlagsRecursive();\n\n // Store original args for fuzzy mode logging\n const originalProcessArgs = [...processArgs];\n\n // Check if fuzzy mode is enabled (global fuzzy mode detection)\n // This allows automatic prevention of parse() execution without requiring boilerplate\n // Prevent execution if:\n // 1. ARGPARSER_FUZZY_MODE environment variable is set (during fuzzy test imports)\n // 2. OR --s-enable-fuzzy is in process.argv but not in current processArgs (global fuzzy testing)\n // 3. AND skipHelpHandling is not true (not a programmatic call from fuzzy tester)\n const shouldPreventExecution =\n typeof process !== \"undefined\" &&\n (process.env[\"ARGPARSER_FUZZY_MODE\"] === \"true\" ||\n (process.argv &&\n process.argv.includes(\"--s-enable-fuzzy\") &&\n !processArgs.includes(\"--s-enable-fuzzy\"))) &&\n !options?.skipHelpHandling;\n\n if (shouldPreventExecution) {\n // Return a minimal result that indicates fuzzy mode prevented execution\n return {\n _fuzzyModePreventedExecution: true,\n _originalInputArgs: originalProcessArgs,\n } as TParsedArgsWithRouting<any>;\n }\n\n const globalCheckResult = await this.#_handleGlobalChecks(\n processArgs,\n options,\n );\n if (globalCheckResult !== false) {\n // If it's a ParseResult, return it; otherwise return empty object for backward compatibility\n return globalCheckResult === true\n ? ({} as TParsedArgsWithRouting<any>)\n : globalCheckResult;\n }\n\n try {\n const {\n finalParser: identifiedFinalParser,\n commandChain: identifiedCommandChain,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const saveToEnvResult = identifiedFinalParser.#_handleSaveToEnvFlag(\n processArgs,\n identifiedParserChain,\n );\n if (saveToEnvResult !== false) {\n return saveToEnvResult === true\n ? ({} as TParsedArgsWithRouting<any>)\n : saveToEnvResult;\n }\n\n const { finalArgs, handlerToExecute } = await this._parseRecursive(\n processArgs,\n this,\n {},\n [],\n options,\n undefined,\n );\n\n if (identifiedCommandChain.length > 0) {\n finalArgs.$commandChain = identifiedCommandChain;\n }\n\n // Store original args for fuzzy mode logging\n if (this.#fuzzyMode) {\n finalArgs._originalInputArgs = originalProcessArgs;\n }\n\n // Skip mandatory flag validation in fuzzy mode\n if (!this.#fuzzyMode) {\n this.#_validateMandatoryFlags(\n finalArgs,\n identifiedParserChain,\n identifiedCommandChain,\n );\n }\n\n this.#_applyDefaultValues(finalArgs, identifiedFinalParser);\n\n this.#_prepareAndExecuteHandler(\n handlerToExecute,\n finalArgs,\n options?.skipHandlers ?? false,\n );\n\n // Handle deep option for async handlers (default: true)\n const shouldAwaitHandlers = options?.deep !== false;\n if (shouldAwaitHandlers && finalArgs._asyncHandlerPromise) {\n try {\n const handlerResult = await finalArgs._asyncHandlerPromise;\n finalArgs.handlerResponse = handlerResult;\n\n // Merge handler result into final args if it's an object\n if (\n handlerResult &&\n typeof handlerResult === \"object\" &&\n !Array.isArray(handlerResult)\n ) {\n Object.assign(finalArgs, handlerResult);\n }\n\n // Clean up the async handler info since we've awaited it\n delete finalArgs._asyncHandlerPromise;\n delete finalArgs._asyncHandlerInfo;\n } catch (error) {\n // Handle async handler errors - respect the handleErrors setting\n if (this.#handleErrors) {\n this.#displayErrorAndExit(\n new ArgParserError(`Handler error: ${error}`, []),\n );\n } else {\n throw error;\n }\n }\n }\n\n return finalArgs;\n } catch (error) {\n if (error instanceof ArgParserError) {\n if (this.#handleErrors) {\n const errorResult = this.#displayErrorAndExit(error);\n // If autoExit is false, return the ParseResult; otherwise return empty object\n return this.#autoExit\n ? ({} as TParsedArgsWithRouting<any>)\n : errorResult;\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Alias for parse() method for backward compatibility\n * Since parse() is already async, this just calls parse()\n *\n * @deprecated Use parse() instead. This method will be removed in a future version.\n */\n public parseAsync(\n processArgs?: string[],\n options?: IParseOptions,\n ): Promise<TParsedArgsWithRouting<any> | ParseResult> {\n return this.parse(processArgs, options);\n }\n\n /**\n * Recursive helper for parsing arguments and handling sub-commands.\n * This method assumes the global help check has already been performed in `parse`.\n */\n private async _parseRecursive(\n argsToParse: string[],\n currentParser: ArgParserBase,\n accumulatedParentArgs: TParsedArgs<any>,\n commandChainSoFar: string[],\n options?: IParseOptions,\n parentParser?: ArgParserBase,\n ): Promise<RecursiveParseResult> {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n // Find the index of the first argument that matches a defined sub-command name\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n // Determine which arguments belong to the current parser level\n const argsForCurrentLevel =\n subCommandIndex === -1\n ? argsToParse\n : argsToParse.slice(0, subCommandIndex);\n\n // Parse flags for the current level using #parseFlags\n const { parsedArgs: currentLevelArgs, firstUnconsumedIndex } =\n await currentParser.#parseFlags(argsForCurrentLevel, options);\n\n // Apply environment variables fallback\n // Priority: CLI Flag > Env Var > Default Value\n // This runs after CLI flags are parsed (so CLI wins if present)\n // But BEFORE default values (so Env wins over Default)\n this.#_applyEnvFallback(currentLevelArgs, currentParser);\n\n // Apply default values for the current parser's flags to its args\n currentParser.#_applyDefaultValues(currentLevelArgs, currentParser);\n\n // Sync resolved values back to environment variables if configured\n this.#_syncToEnv(currentLevelArgs, currentParser);\n\n const combinedArgsFromThisAndParents = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n if (subCommandIndex === -1 || subCommandName === null) {\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const finalParseResultArgs = { ...combinedArgsFromThisAndParents };\n if (commandChainSoFar.length > 0) {\n finalParseResultArgs[\"$commandChain\"] = commandChainSoFar;\n }\n\n let handlerToExecute: RecursiveParseResult[\"handlerToExecute\"] =\n undefined;\n // Create context with displayHelp implementation\n const handlerContext: IHandlerContext<any, any> = {\n args: currentLevelArgs,\n parentArgs: accumulatedParentArgs,\n commandChain: commandChainSoFar,\n parser: currentParser,\n parentParser: parentParser,\n // displayHelp implementation that respects autoExit setting\n displayHelp: () => {\n // Use console.log directly for help text (this is user-facing output, not logging)\n console.log(currentParser.helpText());\n if (\n currentParser.getAutoExit() &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(0);\n }\n },\n\n // Add rootPath if working directory was resolved\n rootPath: this.#rootPath || undefined,\n logger: this.#logger,\n isMcp: options?.isMcp || false,\n };\n\n if (currentParser.#handler) {\n handlerToExecute = {\n handler: currentParser.#handler,\n context: handlerContext,\n };\n } else if (currentParser.#triggerAutoHelpIfNoHandler) {\n // Automatically provide a handler that displays help if configured\n handlerToExecute = {\n handler: (ctx: IHandlerContext) => ctx.displayHelp(),\n context: handlerContext,\n };\n }\n return { finalArgs: finalParseResultArgs, handlerToExecute };\n }\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName!);\n if (\n !subCommandConfig ||\n !(subCommandConfig.parser instanceof ArgParserBase)\n ) {\n // This should ideally not be reached if addSubCommand validated the parser instance\n throw new ArgParserError(\n `Internal error: Subcommand '${subCommandName!}' is misconfigured or its parser is not a valid ArgParser instance.`,\n commandChainSoFar,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const combinedArgsForNextLevel = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n return await this._parseRecursive(\n nextArgs,\n nextParser,\n combinedArgsForNextLevel,\n nextCommandChain,\n options,\n currentParser,\n );\n }\n\n async #parseFlags(\n args: string[],\n options?: IParseOptions,\n ): Promise<{\n parsedArgs: TParsedArgs<ProcessedFlag[]>;\n firstUnconsumedIndex: number;\n }> {\n let flags = this.#flagManager.flags;\n\n // Dynamic pre-pass: run loaders first to register new flags\n const dynamicCandidates = flags.filter(\n (f: any) => typeof (f as any)[\"dynamicRegister\"] === \"function\",\n );\n if (dynamicCandidates.length > 0) {\n const loaderOutput: TParsedArgs<ProcessedFlag[]> = Object.fromEntries(\n dynamicCandidates.map((f) => [\n f[\"name\"],\n f[\"allowMultiple\"] ? [] : undefined,\n ]),\n ) as TParsedArgs<ProcessedFlag[]>;\n const tmpConsumed = new Set<number>();\n\n // Ligature pre-pass\n for (const flagToCheck of dynamicCandidates) {\n if (flagToCheck[\"allowLigature\"] && !flagToCheck[\"flagOnly\"]) {\n const regex = createRegExp(\n anyOf(\n ...flagToCheck[\"options\"].map((option: string) => `${option}=`),\n ),\n oneOrMore(char).groupedAs(\"arg\"),\n );\n for (let i = 0; i < args.length; i++) {\n if (tmpConsumed.has(i)) continue;\n const matches = regex.exec(`${args[i]}`);\n if (matches?.groups?.[\"arg\"]) {\n await this._addToOutput(\n flagToCheck,\n matches.groups[\"arg\"],\n loaderOutput,\n options,\n );\n tmpConsumed.add(i);\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n }\n\n // Split pre-pass\n for (const flagToCheck of dynamicCandidates) {\n for (let index = 0; index < args.length; index++) {\n if (tmpConsumed.has(index)) continue;\n const value = args[index];\n const nextIndex = index + 1;\n const nextValueExists = nextIndex < args.length;\n const nextValue = nextValueExists ? args[nextIndex] : undefined;\n const nextValueIsFlag =\n typeof nextValue === \"string\" && nextValue.startsWith(\"-\");\n if (flagToCheck[\"options\"].includes(value)) {\n tmpConsumed.add(index);\n if (flagToCheck[\"flagOnly\"]) {\n await this._addToOutput(flagToCheck, true, loaderOutput, options);\n } else if (nextValueExists && !nextValueIsFlag) {\n await this._addToOutput(\n flagToCheck,\n nextValue,\n loaderOutput,\n options,\n );\n tmpConsumed.add(nextIndex);\n } else if (flagToCheck[\"type\"] === Boolean) {\n await this._addToOutput(flagToCheck, true, loaderOutput, options);\n }\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n\n // Invoke dynamicRegister per candidate\n for (const flagToCheck of dynamicCandidates) {\n const val = (loaderOutput as any)[flagToCheck[\"name\"]];\n const hasValue = flagToCheck[\"allowMultiple\"]\n ? Array.isArray(val) && val.length > 0\n : val !== undefined;\n if (!hasValue) continue;\n\n const registerFlags = (newFlags: readonly IFlag[]) => {\n if (Array.isArray(newFlags) && newFlags.length) {\n this.#registerDynamicFlags(newFlags);\n }\n };\n\n const dyn = (flagToCheck as any)[\"dynamicRegister\"];\n if (typeof dyn === \"function\") {\n const maybe = dyn({\n value: val,\n argsSoFar: loaderOutput,\n parser: this,\n processArgs: args,\n forHelp: !!options?.dynamicHelpPreload,\n registerFlags,\n });\n const awaited =\n maybe && typeof (maybe as any).then === \"function\"\n ? await maybe\n : maybe;\n if (Array.isArray(awaited)) registerFlags(awaited);\n }\n }\n\n // Refresh flags after dynamic registration\n flags = this.#flagManager.flags;\n }\n\n const output: TParsedArgs<ProcessedFlag[]> = Object.fromEntries(\n flags.map((flag) => [\n flag[\"name\"],\n flag[\"allowMultiple\"] ? [] : undefined,\n ]),\n ) as TParsedArgs<ProcessedFlag[]>;\n\n let consumedIndices = new Set<number>();\n\n for (const flagToCheck of flags) {\n if (flagToCheck[\"allowLigature\"] && !flagToCheck[\"flagOnly\"]) {\n const regex = createRegExp(\n anyOf(\n ...flagToCheck[\"options\"].map((option: string) => `${option}=`),\n ),\n oneOrMore(char).groupedAs(\"arg\"),\n );\n for (let i = 0; i < args.length; i++) {\n if (consumedIndices.has(i)) continue;\n const itemToCheck = args[i];\n const matches = regex.exec(`${itemToCheck}`);\n if (matches?.groups?.[\"arg\"]) {\n await this._addToOutput(\n flagToCheck,\n matches?.groups?.[\"arg\"],\n output,\n options,\n );\n consumedIndices.add(i);\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n }\n\n for (const flagToCheck of flags) {\n for (let index = 0; index < args.length; index++) {\n if (consumedIndices.has(index)) continue;\n\n const value = args[index];\n const nextIndex = index + 1;\n const nextValueExists = nextIndex < args.length;\n const nextValue = nextValueExists ? args[nextIndex] : undefined;\n const nextValueIsFlag =\n typeof nextValue === \"string\" && nextValue.startsWith(\"-\");\n\n if (flagToCheck[\"options\"].includes(value)) {\n // Mark the flag itself as consumed immediately\n consumedIndices.add(index);\n\n if (flagToCheck[\"flagOnly\"]) {\n await this._addToOutput(flagToCheck, true, output, options);\n } else if (nextValueExists && !nextValueIsFlag) {\n await this._addToOutput(flagToCheck, nextValue, output, options);\n consumedIndices.add(nextIndex);\n } else if (flagToCheck[\"type\"] === Boolean) {\n await this._addToOutput(flagToCheck, true, output, options);\n }\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n\n // === POSITIONAL ARGUMENT ASSIGNMENT ===\n // Collect unconsumed trailing args (not starting with \"-\")\n const trailingArgs: { index: number; value: string }[] = [];\n for (let i = 0; i < args.length; i++) {\n if (!consumedIndices.has(i)) {\n const arg = args[i];\n // Only capture non-flag values as positional\n if (!arg.startsWith(\"-\")) {\n trailingArgs.push({ index: i, value: arg });\n }\n }\n }\n\n // Get flags with positional property, sorted by positional index\n const positionalFlags = flags\n .filter(\n (f: ProcessedFlag) =>\n typeof f[\"positional\"] === \"number\" && f[\"positional\"] > 0,\n )\n .sort(\n (a: ProcessedFlag, b: ProcessedFlag) =>\n (a[\"positional\"] as number) - (b[\"positional\"] as number),\n );\n\n // Assign trailing args to positional flags\n for (const posFlag of positionalFlags) {\n const posIndex = (posFlag[\"positional\"] as number) - 1; // 0-indexed\n\n // Skip if this flag already has a value (from --flag syntax)\n const existingValue = (output as any)[posFlag[\"name\"]];\n const hasExistingValue = posFlag[\"allowMultiple\"]\n ? Array.isArray(existingValue) && existingValue.length > 0\n : existingValue !== undefined;\n\n if (hasExistingValue) continue;\n\n // Assign the trailing arg at this position\n if (posIndex < trailingArgs.length) {\n const trailing = trailingArgs[posIndex];\n await this._addToOutput(posFlag, trailing.value, output, options);\n consumedIndices.add(trailing.index);\n }\n }\n\n // Calculate firstUnconsumedIndex (after positional assignment)\n let firstUnconsumedIndex = args.length;\n for (let i = 0; i < args.length; i++) {\n if (!consumedIndices.has(i)) {\n firstUnconsumedIndex = i;\n break;\n }\n }\n\n return { parsedArgs: output, firstUnconsumedIndex };\n }\n\n helpText(): string {\n const cyan = chalk.cyan;\n const green = chalk.green;\n const white = chalk.white;\n const red = chalk.red;\n const dim = chalk.dim;\n\n let rootAppName = this.#appName;\n let current: ArgParserBase | undefined = this;\n while (current.#parentParser) {\n current = current.#parentParser;\n }\n if (current) {\n rootAppName = current.#appName;\n }\n\n const helpTitle = this.#subCommandName\n ? `${rootAppName} ${this.#subCommandName}`\n : rootAppName;\n\n let help = `${cyan(`${helpTitle} Help`)} (${this.#parameters.mandatoryCharacter} = Mandatory fields):\\n\\n`;\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG ----\n // console.log(\n // `[ArgParser helpText Debug] 'this' context: constructor.name = ${this?.constructor?.name}, is ArgParser instance = ${this instanceof ArgParser}, subCommandName = ${this.#subCommandName || '(root)'}`,\n // );\n // ---- END ADDED DIAGNOSTIC LOG ----\n\n if (this.#description) {\n help += `${white(this.#description)}\\n\\n`;\n }\n\n const indent = (level: number = 1) => \" \".repeat(level);\n\n // Build usage pattern with positional args\n const positionalFlagsForUsage = this.#flagManager.flags\n .filter(\n (f: ProcessedFlag) =>\n typeof f[\"positional\"] === \"number\" && f[\"positional\"] > 0,\n )\n .sort(\n (a: ProcessedFlag, b: ProcessedFlag) =>\n (a[\"positional\"] as number) - (b[\"positional\"] as number),\n );\n\n if (positionalFlagsForUsage.length > 0) {\n const commandName =\n this.#subCommandName || this.#appCommandName || this.#appName;\n const posArgs = positionalFlagsForUsage\n .map((f: ProcessedFlag) => {\n const isMandatory =\n typeof f[\"mandatory\"] === \"function\" ? true : f[\"mandatory\"];\n const argName = (f as any)[\"valueHint\"] || f[\"name\"].toUpperCase();\n return isMandatory ? `<${argName}>` : `[${argName}]`;\n })\n .join(\" \");\n\n help += `${cyan(\"Usage:\")} ${commandName} [OPTIONS] ${posArgs}\\n\\n`;\n }\n\n if (this.#subCommands.size > 0) {\n // Use Map.size\n help += `${cyan(\"Available sub-commands:\")}\\n`;\n // Iterate over Map entries, then sort\n help += Array.from(this.#subCommands.entries())\n .sort(([nameA], [nameB]) => nameA.localeCompare(nameB))\n .map(([name, subCommandConfig]) => {\n // subCommandConfig is an ISubCommand object from the map\n const actualSubParserInstance = subCommandConfig.parser;\n\n // Guard against misconfiguration, though addSubCommand should prevent non-ArgParser instances\n if (!(actualSubParserInstance instanceof ArgParserBase)) {\n return `${indent()}${green(name.padEnd(20))} [Error: Subcommand '${name}' has an invalid parser configuration]`;\n }\n\n // Build sub-command help with description on its own line for better visibility\n let subHelp = `${indent()}${green(name)}`;\n\n // Show description on a dedicated line if present\n const subDescription = actualSubParserInstance.#description;\n if (subDescription) {\n subHelp += `\\n${indent(2)}${white(subDescription)}`;\n }\n\n const flagsFromSubManager =\n actualSubParserInstance && actualSubParserInstance.#flagManager\n ? actualSubParserInstance.#flagManager.flags\n : undefined;\n const subFlags = (flagsFromSubManager || []).filter(\n (f: ProcessedFlag) => f[\"name\"] !== \"help\",\n );\n if (subFlags.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")}`;\n subFlags\n .sort((a: ProcessedFlag, b: ProcessedFlag) =>\n a[\"name\"].localeCompare(b[\"name\"]),\n )\n .forEach((f: ProcessedFlag) => {\n const flagOptions = f[\"options\"]\n .map((opt: string) => green(opt))\n .join(\", \");\n const flagDesc = Array.isArray(f[\"description\"])\n ? f[\"description\"][0]\n : f[\"description\"];\n subHelp += `\\n${indent(3)}${flagOptions} - ${dim(flagDesc)}`;\n });\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")} none`;\n }\n\n const subSubCommandNames = Array.from(\n actualSubParserInstance.#subCommands.keys(),\n ); // Get keys from actualSubParserInstance's Map\n if (subSubCommandNames.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} ${subSubCommandNames.join(\", \")}`;\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} none`;\n }\n\n return subHelp;\n })\n .join(\"\\n\\n\");\n help += \"\\n\";\n }\n\n help += `\\n${cyan(\"Flags:\")}\\n`;\n const localFlags = this.#flagManager.flags; // Use FlagManager for local flags\n if (localFlags.length > 0) {\n help += localFlags\n .sort((flagA, flagB) => flagA[\"name\"].localeCompare(flagB[\"name\"]))\n .map((flag: ProcessedFlag) => {\n // Flag type is ProcessedFlag\n const optionsText = flag[\"options\"]\n .slice() // Create a copy before sorting (toSorted only supported by Node 20+)\n .sort((a: string, b: string) => a.length - b.length) // Sort by length (shortest first)\n .map((opt: string) => green(opt))\n .join(\", \");\n const isMandatory =\n typeof flag.mandatory === \"function\" ? \"dynamic\" : flag.mandatory;\n const mandatoryIndicator =\n isMandatory === true\n ? ` ${red(this.#parameters.mandatoryCharacter || \"*\")}`\n : isMandatory === \"dynamic\"\n ? ` ${dim(\"(conditionally mandatory)\")}`\n : \"\";\n\n const descriptionLines = Array.isArray(flag[\"description\"])\n ? flag[\"description\"]\n : [flag[\"description\"]];\n\n const metaLines: string[] = [];\n\n // Determine the type name for display\n let typeName = \"unknown\";\n let typeDetails: string[] = [];\n\n if (\n flag[\"type\"] &&\n typeof flag[\"type\"] === \"object\" &&\n (flag[\"type\"] as ZodTypeAny)._def\n ) {\n // It's a Zod schema - show JSON object with structure\n typeName = \"JSON object\";\n try {\n // Try to generate a simple structure preview\n const zodSchema = flag[\"type\"] as ZodTypeAny;\n const def = zodSchema._def as any;\n\n // In Zod v4, check for object shape directly (typeName might be undefined)\n if (def.shape) {\n const shape =\n typeof def.shape === \"function\" ? def.shape() : def.shape;\n const properties = Object.keys(shape);\n if (properties.length > 0) {\n if (properties.length <= 4) {\n typeDetails.push(`Properties: ${properties.join(\", \")}`);\n } else {\n typeDetails.push(\n `Properties: ${properties.slice(0, 4).join(\", \")}, ... (${properties.length} total)`,\n );\n }\n }\n }\n\n // Add a hint about JSON format\n typeDetails.push(\"Expected: JSON string\");\n } catch (error) {\n // Fallback if schema introspection fails\n typeDetails.push(\"Expected: JSON string\");\n }\n } else if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n // Make the type names more user-friendly\n if (typeName === \"Boolean\") typeName = \"boolean\";\n if (typeName === \"String\") typeName = \"string\";\n if (typeName === \"Number\") typeName = \"number\";\n if (typeName === \"Array\") typeName = \"array\";\n if (typeName === \"Object\") typeName = \"object\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n }\n\n metaLines.push(`Type: ${typeName}`);\n\n // Usage/example hints. If repeatable, show repeat syntax; otherwise show single value.\n {\n let isRepeatable = false;\n try {\n if (\n typeof flag[\"type\"] === \"function\" &&\n flag[\"type\"].name === \"Array\"\n ) {\n isRepeatable = true;\n }\n const maybeZodSchema = flag[\"type\"] as ZodTypeAny;\n if (\n maybeZodSchema &&\n typeof maybeZodSchema === \"object\" &&\n maybeZodSchema._def &&\n (maybeZodSchema._def as any).typeName === \"ZodArray\"\n ) {\n isRepeatable = true;\n }\n if (flag[\"allowMultiple\"]) isRepeatable = true;\n } catch {}\n\n const primaryOpt =\n flag[\"options\"].find((o: string) => o.startsWith(\"--\")) ??\n flag[\"options\"][0];\n const valueHint = (flag as any)[\"valueHint\"] as string | undefined;\n\n if (!flag[\"flagOnly\"]) {\n if (isRepeatable) {\n metaLines.push(\"Multiple values allowed (repeat flag)\");\n const v1 = valueHint ?? \"value1\";\n const v2 = valueHint ?? \"value2\";\n metaLines.push(\n `Example: ${primaryOpt} ${v1} ${primaryOpt} ${v2}`,\n );\n } else {\n const v = valueHint ?? \"value\";\n metaLines.push(`Example: ${primaryOpt} ${v}`);\n }\n }\n }\n\n // Add type details for Zod schemas\n if (typeDetails.length > 0) {\n metaLines.push(...typeDetails);\n }\n\n if (flag[\"flagOnly\"]) {\n metaLines.push(\"Flag only (no value expected)\");\n }\n if (\n flag[\"defaultValue\"] !== undefined &&\n flag[\"defaultValue\"] !== null\n ) {\n metaLines.push(`Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n metaLines.push(\n `Allowed values: ${flag[\"enum\"].map((v: any) => `'${v}'`).join(\", \")}`,\n );\n }\n // Add positional indicator\n if (\n typeof flag[\"positional\"] === \"number\" &&\n flag[\"positional\"] > 0\n ) {\n metaLines.push(`Positional argument #${flag[\"positional\"]}`);\n }\n\n const maxOptionLength = Math.max(\n ...localFlags.map(\n (f: ProcessedFlag) => f[\"options\"].join(\", \").length,\n ),\n 0,\n );\n const formattedOptions =\n optionsText.padEnd(maxOptionLength + 5) + mandatoryIndicator;\n\n return `\n${indent()}${formattedOptions}\n${indent(2)}${white(descriptionLines[0])}\n${metaLines.map((line) => `${indent(3)}${dim(line)}`).join(\"\\n\")}\n${descriptionLines\n .slice(1)\n .map((line) => `\\n${indent(2)}${white(line)}`)\n .join(\"\")}\n `.trim();\n })\n .join(\"\\n\\n\");\n } else {\n help += `${indent()}${dim(\"none\")}`;\n }\n\n return help;\n }\n\n public getSubCommand(name: string): ISubCommand | undefined {\n return this.#subCommands.get(name);\n }\n\n public hasFlag(name: string): boolean {\n // Delegates to FlagManager\n return this.#flagManager.hasFlag(name);\n }\n\n /**\n * Get flag definition by name\n * @param name Flag name\n * @returns Flag definition or undefined if not found\n */\n public getFlagDefinition(name: string): ProcessedFlag | undefined {\n return this.#flagManager.getFlag(name);\n }\n\n public getCommandChain(): string[] {\n const chain = [];\n let currentParser: ArgParserBase | undefined = this;\n while (currentParser && currentParser.#parentParser) {\n chain.unshift(currentParser.#subCommandName);\n currentParser = currentParser.#parentParser;\n }\n return chain;\n }\n\n public getLastParseResult(): TParsedArgs<ProcessedFlag[]> {\n return this.#lastParseResult;\n }\n\n /**\n * Enables fuzzy testing mode by disabling error handling and making flags optional\n */\n #_enableFuzzyMode(): void {\n // Enable fuzzy mode flag\n this.#fuzzyMode = true;\n\n // Disable error handling to allow fuzzy tester to catch errors\n this.#handleErrors = false;\n\n // Recursively enable fuzzy mode for all subcommand parsers\n for (const [, subCommand] of this.#subCommands) {\n if (subCommand.parser instanceof ArgParserBase) {\n subCommand.parser.#_enableFuzzyMode();\n }\n }\n }\n\n #displayErrorAndExit(error: ArgParserError): ParseResult | never {\n let commandNameToSuggest = \"your-script\";\n\n if (this.#appCommandName) {\n commandNameToSuggest = this.#appCommandName;\n } else if (this.#appName && this.#appName !== \"Argument Parser\") {\n commandNameToSuggest = this.#appName;\n } else if (\n typeof process !== \"undefined\" &&\n process.argv &&\n process.argv[1]\n ) {\n try {\n commandNameToSuggest = path.basename(process.argv[1]);\n } catch {}\n }\n\n this.#logger.error(`\\n${chalk.red.bold(\"Error:\")} ${error.message}`);\n this.#logger.error(\n `\\n${chalk.dim(`Try '${commandNameToSuggest} --help' for usage details.`)}`,\n );\n\n if (this.#autoExit) {\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1 as never);\n } else {\n throw error;\n }\n } else {\n return {\n success: false,\n exitCode: 1,\n message: error.message,\n type: \"error\",\n shouldExit: true,\n };\n }\n }\n\n #_printRecursiveToConsole(\n parser: ArgParserBase,\n level: number,\n visited: Set<ArgParserBase> = new Set(),\n ): void {\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n this.#logger.info(\n `${indent}Parser: ${chalk.blueBright(parser.#subCommandName || parser.#appName)}`,\n );\n if (parser.#description) {\n this.#logger.info(`${subIndent}Description: ${parser.#description}`);\n }\n this.#logger.info(`${subIndent}Options:`);\n this.#logger.info(`${flagIndent}appName: ${parser.#appName}`);\n this.#logger.info(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? chalk.dim(\"undefined\")}`,\n );\n this.#logger.info(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n this.#logger.info(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n this.#logger.info(\n `${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`,\n );\n this.#logger.info(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n this.#logger.info(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n this.#logger.info(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n this.#logger.info(`${flagIndent}* ${chalk.green(flag[\"name\"])}:`);\n this.#logger.info(\n `${flagIndent} Options: ${flag[\"options\"].join(\", \")}`,\n );\n this.#logger.info(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Type: ${typeof flag[\"type\"] === \"function\" ? flag[\"type\"].name || \"custom function\" : flag[\"type\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n this.#logger.info(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n this.#logger.info(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n this.#logger.info(\n `${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n this.#logger.info(\n `${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`,\n );\n });\n } else {\n this.#logger.info(`${subIndent}Flags: ${chalk.dim(\"none\")}`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n this.#logger.info(\n `${subIndent}Sub-Commands (${subCommandParsers.length}):`,\n );\n subCommandParsers.forEach((subCommand: any) => {\n this.#_printRecursiveToConsole(subCommand.parser, level + 1, visited);\n });\n } else {\n this.#logger.info(`${subIndent}Sub-Commands: ${chalk.dim(\"none\")}`);\n }\n }\n\n #_buildRecursiveString(\n parser: ArgParserBase,\n level: number,\n visited = new Set<ArgParserBase>(),\n ): string {\n // Add visited set\n if (visited.has(parser)) return \"\"; // Prevent infinite loops for circular structures (if ever possible)\n visited.add(parser);\n\n let output = \"\";\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n const addLine = (line: string) => {\n output += line + \"\\\\n\";\n };\n\n addLine(\n `${indent}Parser: ${parser.#subCommandName || parser.#appName}`, // #appName is guaranteed\n );\n if (parser.#description) {\n addLine(`${subIndent}Description: ${parser.#description}`);\n }\n addLine(`${subIndent}Options:`);\n addLine(`${flagIndent}appName: ${parser.#appName}`);\n addLine(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? \"undefined\"}`,\n );\n addLine(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n addLine(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n addLine(`${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`);\n addLine(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n addLine(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n addLine(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n addLine(`${flagIndent}* ${flag[\"name\"]}:`);\n addLine(`${flagIndent} Options: ${flag[\"options\"].join(\", \")}`);\n addLine(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n let typeName = \"unknown\";\n if (\n flag[\"type\"] &&\n typeof flag[\"type\"] === \"object\" &&\n (flag[\"type\"] as any)._def\n ) {\n typeName = \"Zod schema\";\n } else if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n addLine(`${flagIndent} Type: ${typeName}`);\n addLine(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n addLine(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n addLine(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n addLine(`${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`);\n addLine(`${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`);\n addLine(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n addLine(`${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`);\n });\n } else {\n addLine(`${subIndent}Flags: none`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n addLine(`${subIndent}Sub-Commands (${subCommandParsers.length}):`);\n subCommandParsers.forEach((subCommand: any) => {\n output += this.#_buildRecursiveString(\n subCommand.parser,\n level + 1,\n visited,\n );\n });\n } else {\n addLine(`${subIndent}Sub-Commands: none`);\n }\n return output;\n }\n\n #_buildRecursiveJson(\n parser: ArgParserBase,\n visited = new Set<ArgParserBase>(),\n ): object {\n if (visited.has(parser))\n return {\n note: `Reference to already processed parser: ${parser.#subCommandName || parser.#appName}`,\n };\n visited.add(parser);\n\n const config: any = {\n parserName: parser.#subCommandName || parser.#appName, // #appName is guaranteed\n description: parser.#description,\n options: {\n appName: parser.#appName,\n appCommandName: parser.#appCommandName ?? undefined,\n handleErrors: parser.#handleErrors,\n throwForDuplicateFlags: parser.#throwForDuplicateFlags,\n inheritParentFlags: parser.#inheritParentFlags,\n },\n handlerDefined: !!parser.#handler,\n internalParams: parser.#parameters,\n flags: [],\n subCommands: {}, // Will be an object where keys are sub-command names\n };\n\n const flags = parser.#flagManager.flags;\n config.flags = flags.map((flag: ProcessedFlag) => {\n let typeName = \"unknown\";\n if (\n flag[\"type\"] &&\n typeof flag[\"type\"] === \"object\" &&\n (flag[\"type\"] as any)._def\n ) {\n typeName = \"Zod schema\";\n } else if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n\n return {\n name: flag[\"name\"],\n options: flag[\"options\"],\n description: flag[\"description\"],\n type: typeName,\n mandatory:\n typeof flag[\"mandatory\"] === \"function\"\n ? \"dynamic\"\n : (flag[\"mandatory\"] ?? false),\n defaultValue: flag[\"defaultValue\"],\n flagOnly: flag[\"flagOnly\"],\n allowMultiple: flag[\"allowMultiple\"],\n allowLigature: flag[\"allowLigature\"],\n enum: flag[\"enum\"],\n validatorDefined: !!flag[\"validate\"],\n };\n });\n\n const subCommands = Array.from(parser.#subCommands.values());\n if (subCommands.length > 0) {\n subCommands.forEach((sub: any) => {\n config.subCommands[sub.name] = this.#_buildRecursiveJson(\n sub.parser,\n visited,\n );\n });\n }\n\n return config;\n }\n\n // ===== MCP API Methods =====\n\n /**\n * Add an MCP resource to this parser\n */\n addMcpResource(config: McpResourceConfig): this {\n this.#mcpResourcesManager.addResource(config);\n this.#mcpNotificationsManager.notifyChange(\n \"resources\",\n \"added\",\n config.name,\n );\n return this;\n }\n\n /**\n * Remove an MCP resource by name\n */\n removeMcpResource(name: string): this {\n const removed = this.#mcpResourcesManager.removeResource(name);\n if (removed) {\n this.#mcpNotificationsManager.notifyChange(\"resources\", \"removed\", name);\n }\n return this;\n }\n\n /**\n * Get all registered MCP resources\n */\n getMcpResources(): McpResourceConfig[] {\n return this.#mcpResourcesManager.getResources();\n }\n\n /**\n * Add an MCP prompt to this parser\n */\n addMcpPrompt(config: McpPromptConfig): this {\n this.#mcpPromptsManager.addPrompt(config);\n this.#mcpNotificationsManager.notifyChange(\"prompts\", \"added\", config.name);\n return this;\n }\n\n /**\n * Remove an MCP prompt by name\n */\n removeMcpPrompt(name: string): this {\n const removed = this.#mcpPromptsManager.removePrompt(name);\n if (removed) {\n this.#mcpNotificationsManager.notifyChange(\"prompts\", \"removed\", name);\n }\n return this;\n }\n\n /**\n * Get all registered MCP prompts\n */\n getMcpPrompts(): McpPromptConfig[] {\n return this.#mcpPromptsManager.getPrompts();\n }\n\n /**\n * Add a change listener for MCP entities\n */\n onMcpChange(\n listener: (event: {\n type: McpChangeType;\n action: string;\n entityName?: string;\n }) => void,\n ): this {\n this.#mcpNotificationsManager.addGlobalListener(listener);\n return this;\n }\n\n /**\n * Remove a change listener for MCP entities\n */\n offMcpChange(\n listener: (event: {\n type: McpChangeType;\n action: string;\n entityName?: string;\n }) => void,\n ): this {\n this.#mcpNotificationsManager.removeGlobalListener(listener);\n return this;\n }\n\n /**\n * Get the MCP notifications manager (for advanced usage)\n */\n getMcpNotificationsManager(): McpNotificationsManager {\n return this.#mcpNotificationsManager;\n }\n\n /**\n * Get the MCP resources manager (for advanced usage)\n */\n getMcpResourcesManager(): McpResourcesManager {\n return this.#mcpResourcesManager;\n }\n\n /**\n * Get the MCP prompts manager (for advanced usage)\n */\n getMcpPromptsManager(): McpPromptsManager {\n return this.#mcpPromptsManager;\n }\n\n /**\n * Handles the --s-save-to-env system flag at the final parser level\n */\n #_handleSaveToEnvFlag(\n processArgs: string[],\n parserChain: ArgParserBase[],\n ): boolean | ParseResult {\n try {\n const result = this.#configurationManager.handleSaveToEnvFlag(\n processArgs,\n parserChain,\n );\n if (result) {\n // Configuration was saved successfully\n return this._handleExit(\n 0,\n \"Configuration saved successfully\",\n \"success\",\n );\n }\n return result;\n } catch (error) {\n // Configuration save failed\n return this._handleExit(\n 1,\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n }\n\n /**\n * Handles the --s-build-dxt system flag to generate DXT packages for MCP servers\n */\n async #_handleBuildDxtFlag(\n processArgs: string[],\n buildDxtIndex: number,\n ): Promise<boolean | ParseResult> {\n return await this.#dxtGenerator.handleBuildDxtFlag(\n processArgs,\n buildDxtIndex,\n );\n }\n\n /**\n * Handles the --s-mcp-serve system flag to start all MCP servers\n */\n async #_handleMcpServeFlag(\n processArgs: string[],\n _mcpServeIndex: number,\n ): Promise<boolean | ParseResult> {\n debug.log(\"#_handleMcpServeFlag started\");\n // Parse transport options from command line arguments first to get log path\n const transportOptions = this.#_parseMcpTransportOptions(processArgs);\n debug.log(\"Transport options parsed:\", JSON.stringify(transportOptions));\n\n // Get MCP server configuration early to access programmatic logPath\n const mcpServerConfig = this.#_getMcpServerConfiguration();\n debug.log(\"Got MCP server config:\", JSON.stringify(mcpServerConfig));\n\n // Determine log path: CLI flag > log.logToFile > logPath > default\n const effectiveLogPath =\n transportOptions.logPath ||\n (mcpServerConfig?.log && typeof mcpServerConfig.log === \"object\"\n ? mcpServerConfig.log.logToFile\n : null) ||\n mcpServerConfig?.logPath ||\n \"./logs/mcp.log\";\n debug.log(\"Effective log path:\", effectiveLogPath);\n const resolvedLogPath = resolveLogPath(effectiveLogPath);\n debug.log(\"Resolved log path:\", resolvedLogPath);\n\n // Setup MCP logger with console hijacking\n let mcpLogger: any;\n debug.log(\"About to import simple-mcp-logger\");\n try {\n // Try to import simple-mcp-logger if available\n const mcpLoggerModule = await import(\"@alcyone-labs/simple-mcp-logger\");\n debug.log(\"Successfully imported simple-mcp-logger\");\n\n // Resolve logger configuration from MCP server config\n const loggerConfig = this.#_resolveLoggerConfigForServe(\n mcpServerConfig,\n resolvedLogPath,\n );\n\n if (typeof loggerConfig === \"string\") {\n mcpLogger = mcpLoggerModule.createMcpLogger(\"MCP Serve\", loggerConfig);\n } else {\n // Use options-based API when full config is provided to honor level and mcpMode\n mcpLogger = mcpLoggerModule.createMcpLogger({\n prefix: loggerConfig.prefix || \"MCP Serve\",\n logToFile: loggerConfig.logToFile,\n level: loggerConfig.level,\n mcpMode: loggerConfig.mcpMode ?? true,\n });\n }\n\n debug.log(\"Created MCP logger, about to hijack console\");\n // Hijack console globally to prevent STDOUT contamination in MCP mode\n (globalThis as any).console = mcpLogger;\n this.#logger = mcpLogger;\n debug.log(\"Console hijacked successfully\");\n } catch {\n debug.log(\"Failed to import simple-mcp-logger, using fallback\");\n mcpLogger = {\n mcpError: (message: string) => console.error(`[MCP Serve] ${message}`),\n };\n }\n debug.log(\"MCP logger setup complete, starting MCP serve handler\");\n\n try {\n mcpLogger.mcpError(\n \"Starting --s-mcp-serve system flag handler - console hijacked for MCP safety\",\n );\n\n if (!mcpServerConfig) {\n mcpLogger.mcpError(\n \"No MCP server configuration found. Use withMcp() or addMcpSubCommand() to configure MCP server.\",\n );\n return this._handleExit(\n 1,\n \"No MCP server configuration found\",\n \"error\",\n );\n }\n\n mcpLogger.mcpError(\n `Found MCP server configuration: ${mcpServerConfig.serverInfo?.name || \"unnamed\"}`,\n );\n\n mcpLogger.mcpError(`Using log path: ${resolvedLogPath}`);\n\n mcpLogger.mcpError(\n `Transport options: ${JSON.stringify(transportOptions)}`,\n );\n\n // Start the unified MCP server\n try {\n debug.log(\"About to call #_startUnifiedMcpServer\");\n mcpLogger.mcpError(\"Starting unified MCP server with all tools\");\n await this.#_startUnifiedMcpServer(mcpServerConfig, {\n ...transportOptions,\n logPath: resolvedLogPath,\n });\n debug.log(\"#_startUnifiedMcpServer completed\");\n mcpLogger.mcpError(\"Successfully started unified MCP server\");\n } catch (error) {\n mcpLogger.mcpError(\n `Failed to start unified MCP server: ${error instanceof Error ? error.message : String(error)}`,\n );\n return this._handleExit(\n 1,\n `Failed to start MCP server: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n\n mcpLogger.mcpError(\n \"MCP server started successfully, keeping process alive\",\n );\n\n // Keep the process alive indefinitely\n return new Promise(() => {});\n } catch (error) {\n mcpLogger.mcpError(\n `Error in --s-mcp-serve handler: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n mcpLogger.mcpError(`Stack trace: ${error.stack}`);\n }\n return this._handleExit(\n 1,\n `MCP serve failed: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n /**\n * Resolve logger configuration for MCP serve with proper priority\n * @param mcpServerConfig MCP server configuration\n * @param resolvedLogPath Resolved log path from CLI flags and config priority\n * @returns Logger configuration object or string path\n */\n #_resolveLoggerConfigForServe(\n mcpServerConfig: any,\n resolvedLogPath: string,\n ): any {\n // Priority 1: CLI flag override (already resolved in resolvedLogPath)\n // Priority 2: New 'log' configuration from withMcp\n if (mcpServerConfig?.log) {\n if (typeof mcpServerConfig.log === \"string\") {\n // Simple string path - use resolved path\n return {\n prefix: \"MCP Serve\",\n logToFile: resolvedLogPath,\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n } else {\n // Full options object - merge with resolved path\n // The resolvedLogPath already includes the correct priority: CLI > log.logToFile > logPath > default\n return {\n prefix: \"MCP Serve\",\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n ...mcpServerConfig.log,\n // Use the resolved path which respects the proper priority order\n logToFile: resolvedLogPath,\n };\n }\n }\n\n // Priority 3: Legacy 'logPath' configuration or CLI flag\n // (resolvedLogPath already handles this priority)\n return resolvedLogPath;\n }\n\n /**\n * Get MCP server configuration from withMcp() or fallback to addMcpSubCommand()\n */\n #_getMcpServerConfiguration(): any {\n // First, check if this is an ArgParser instance with withMcp() configuration\n if ((this as unknown as IMcpServerMethods).getMcpServerConfig) {\n const mcpConfig = (\n this as unknown as IMcpServerMethods\n ).getMcpServerConfig();\n if (mcpConfig) {\n return mcpConfig;\n }\n }\n\n // Fallback: look for MCP subcommands for backward compatibility\n const mcpSubCommands = this.#_findAllMcpSubCommands();\n if (mcpSubCommands.length > 0) {\n // Use the first MCP subcommand configuration\n const firstMcpCmd = mcpSubCommands[0];\n return {\n serverInfo: firstMcpCmd.serverInfo,\n toolOptions: firstMcpCmd.toolOptions,\n // Extract transport options from subcommand if available\n defaultTransports: firstMcpCmd.subCommand.mcpOptions?.defaultTransports,\n defaultTransport: firstMcpCmd.subCommand.mcpOptions?.defaultTransport,\n };\n }\n\n return null;\n }\n\n /**\n * Start a unified MCP server with all tools from the parser\n */\n async #_startUnifiedMcpServer(\n mcpServerConfig: any,\n transportOptions: {\n transportType?: string;\n port?: number;\n host?: string;\n path?: string;\n transports?: string;\n logPath?: string;\n cors?: any;\n auth?: any;\n },\n ): Promise<void> {\n // We need to cast this to ArgParser to access MCP methods\n const mcpParser = this as unknown as IMcpServerMethods;\n\n if (\n !mcpParser.createMcpServer ||\n !mcpParser.startMcpServerWithTransport ||\n !mcpParser.startMcpServerWithMultipleTransports\n ) {\n throw new Error(\n \"MCP server methods not available. This parser may not support MCP functionality.\",\n );\n }\n\n const { serverInfo, toolOptions, defaultTransports, defaultTransport } =\n mcpServerConfig;\n\n // Determine which transport configuration to use - CLI flags take precedence over programmatic defaults\n if (transportOptions.transports) {\n // Multiple transports specified via CLI\n try {\n const transportConfigs = JSON.parse(transportOptions.transports);\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n transportConfigs,\n toolOptions,\n transportOptions.logPath,\n );\n } catch (error: any) {\n throw new Error(\n `Error parsing transports configuration: ${error.message}. Expected JSON format: '[{\"type\":\"stdio\"},{\"type\":\"sse\",\"port\":3001}]'`,\n );\n }\n } else if (transportOptions.transportType) {\n // Single transport specified via CLI flags - takes precedence over programmatic defaults\n const transportType = transportOptions.transportType as\n | \"stdio\"\n | \"sse\"\n | \"streamable-http\";\n const finalTransportOptions = {\n port: transportOptions.port,\n host: transportOptions.host || \"localhost\",\n path: transportOptions.path || \"/mcp\",\n // Pass-through for streamable-http only; harmlessly ignored for others\n cors: transportOptions.cors,\n auth: transportOptions.auth,\n };\n\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n transportType,\n finalTransportOptions,\n toolOptions,\n transportOptions.logPath,\n );\n } else if (defaultTransports && defaultTransports.length > 0) {\n // Use preset multiple transports configuration\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n defaultTransports,\n toolOptions,\n transportOptions.logPath,\n );\n } else if (defaultTransport) {\n // Use preset single transport configuration\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n defaultTransport.type,\n {\n port: defaultTransport.port,\n host: defaultTransport.host,\n path: defaultTransport.path,\n sessionIdGenerator: defaultTransport.sessionIdGenerator,\n },\n toolOptions,\n transportOptions.logPath,\n );\n } else {\n // Default fallback to stdio when no transport configuration is provided\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n \"stdio\",\n {},\n toolOptions,\n transportOptions.logPath,\n );\n }\n }\n\n /**\n * Find all MCP subcommands in the parser tree\n */\n #_findAllMcpSubCommands(): Array<{\n subCommand: any;\n serverInfo: any;\n toolOptions: any;\n }> {\n const mcpSubCommands: Array<{\n subCommand: any;\n serverInfo: any;\n toolOptions: any;\n }> = [];\n\n // Check current parser's subcommands\n for (const [_name, subCommand] of this.#subCommands.entries()) {\n if (subCommand.isMcp && subCommand.mcpServerInfo) {\n mcpSubCommands.push({\n subCommand: subCommand,\n serverInfo: subCommand.mcpServerInfo,\n toolOptions: subCommand.mcpToolOptions || {},\n });\n }\n }\n\n // Recursively check child parsers\n for (const [_name, subCommand] of this.#subCommands.entries()) {\n if (subCommand.parser) {\n const childMcpCommands = (\n subCommand.parser as ArgParserBase\n ).#_findAllMcpSubCommands();\n mcpSubCommands.push(...childMcpCommands);\n }\n }\n\n return mcpSubCommands;\n }\n\n /**\n * Parse MCP transport options from command line arguments\n * Uses system flags (--s-mcp-*) to avoid collisions with user flags\n */\n #_parseMcpTransportOptions(processArgs: string[]): {\n transportType?: string;\n port?: number;\n host?: string;\n path?: string;\n transports?: string;\n logPath?: string;\n cors?: any;\n auth?: any;\n } {\n const options: {\n transportType?: string;\n port?: number;\n host?: string;\n path?: string;\n transports?: string;\n logPath?: string;\n cors?: any;\n auth?: any;\n } = {};\n\n // Look for transport-related system flags\n for (let i = 0; i < processArgs.length; i++) {\n const arg = processArgs[i];\n const nextArg = processArgs[i + 1];\n\n switch (arg) {\n case \"--s-mcp-transport\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.transportType = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-port\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.port = parseInt(nextArg, 10);\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-host\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.host = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-path\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.path = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-transports\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.transports = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-log-path\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.logPath = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n // Streamable HTTP extras (accept JSON string)\n case \"--s-mcp-cors\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n try {\n options.cors = JSON.parse(nextArg);\n } catch {\n options.cors = nextArg;\n }\n i++;\n }\n break;\n case \"--s-mcp-auth\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n try {\n options.auth = JSON.parse(nextArg);\n } catch {\n options.auth = nextArg;\n }\n i++;\n }\n break;\n // Backward compatibility: support old flags but with deprecation warning\n case \"--transport\":\n case \"--port\":\n case \"--host\":\n case \"--path\":\n case \"--transports\":\n console.warn(\n `Warning: ${arg} is deprecated. Use --s-mcp-${arg.slice(2)} instead.`,\n );\n // Fall through to handle the old flag for now\n if (arg === \"--transport\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.transportType = nextArg;\n i++;\n } else if (arg === \"--port\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.port = parseInt(nextArg, 10);\n i++;\n } else if (arg === \"--host\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.host = nextArg;\n i++;\n } else if (arg === \"--path\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.path = nextArg;\n i++;\n } else if (\n arg === \"--transports\" &&\n nextArg &&\n !nextArg.startsWith(\"-\")\n ) {\n options.transports = nextArg;\n i++;\n }\n break;\n }\n }\n\n return options;\n }\n}\n\n/**\n * A reusable handler that simply displays help.\n * Can be used as a default handler for subcommands that act as containers.\n */\nexport const autoHelpHandler = async (ctx: IHandlerContext) => {\n ctx.displayHelp();\n};\n","/**\n * Utilities for MCP (Model Context Protocol) compatibility\n */\n\n/**\n * Sanitizes a tool name to comply with MCP naming requirements.\n * MCP tool names must match the pattern: ^[a-zA-Z0-9_-]{1,64}$\n *\n * @param name The original tool name\n * @returns A sanitized tool name that complies with MCP requirements\n */\nexport function sanitizeMcpToolName(name: string): string {\n if (!name || typeof name !== \"string\") {\n throw new Error(\"Tool name must be a non-empty string\");\n }\n\n // Replace invalid characters with underscores\n let sanitized = name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n\n // Ensure the name is not empty or only underscores after sanitization\n if (!sanitized || /^_+$/.test(sanitized)) {\n sanitized = \"tool\";\n }\n\n // Truncate to 64 characters if necessary\n if (sanitized.length > 64) {\n sanitized = sanitized.substring(0, 64);\n }\n\n return sanitized;\n}\n\n/**\n * Validates if a tool name complies with MCP naming requirements.\n * MCP tool names must match the pattern: ^[a-zA-Z0-9_-]{1,64}$\n *\n * @param name The tool name to validate\n * @returns True if the name is valid, false otherwise\n */\nexport function isValidMcpToolName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false;\n }\n\n const mcpNamePattern = /^[a-zA-Z0-9_-]{1,64}$/;\n return mcpNamePattern.test(name);\n}\n","import { z } from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\nimport { ArgParserBase } from \"../core/ArgParserBase\";\nimport type {\n IFlag,\n IHandlerContext,\n ProcessedFlag,\n TParsedArgs,\n} from \"../core/types\";\n// Import the centralized utility functions\nimport {\n createOutputSchema,\n getJsonSchemaTypeFromFlag,\n} from \"../core/types.js\";\nimport { sanitizeMcpToolName } from \"./mcp-utils\";\n\nconst logger = createMcpLogger(\"MCP Integration\");\n\n// Assuming these types are correctly exported from src/index.ts\n\n/**\n * Standard MCP response format\n */\nexport interface McpResponse {\n content: Array<{\n type: \"text\";\n text: string;\n }>;\n isError?: boolean;\n structuredContent?: any;\n}\n\n/**\n * Create a standardized MCP success response\n */\nexport function createMcpSuccessResponse(data: any): McpResponse {\n return {\n content: [\n {\n type: \"text\",\n text: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\n/**\n * Create a standardized MCP error response\n */\nexport function createMcpErrorResponse(error: string | Error): McpResponse {\n const errorMessage = error instanceof Error ? error.message : error;\n const errorData = { error: errorMessage, success: false };\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMessage}`,\n },\n ],\n structuredContent: errorData,\n };\n}\n\n/**\n * Convert a single ArgParser flag to JSON Schema property\n */\nexport function convertFlagToJsonSchemaProperty(flag: IFlag | ProcessedFlag): {\n property: any;\n isRequired: boolean;\n} {\n // Handle Zod schemas specially - use Zod v4's native JSON Schema support\n if (flag.type && typeof flag.type === \"object\" && flag.type._def) {\n const zodSchema = flag.type as ZodTypeAny;\n\n try {\n const property = z.toJSONSchema(zodSchema);\n\n if (flag.description) {\n property.description = flag.description;\n }\n\n const isRequired = !!(flag.mandatory || (flag as any).required);\n\n return { property, isRequired };\n } catch (error) {\n // Fallback if JSON Schema conversion fails\n logger.error(\n `Failed to convert Zod schema to JSON Schema for flag '${flag.name}':`,\n error,\n );\n const property = {\n type: \"object\" as const,\n description: flag.description || `${flag.name} parameter (Zod schema)`,\n };\n const isRequired = !!(flag.mandatory || (flag as any).required);\n return { property, isRequired };\n }\n }\n\n const property: any = {\n type: getJsonSchemaTypeFromFlag(flag.type),\n description: flag.description || `${flag.name} parameter`,\n };\n\n // Handle enums\n if (flag.enum && Array.isArray(flag.enum)) {\n property.enum = flag.enum;\n }\n\n // Handle default values\n const defaultValue = (flag as any).defaultValue || (flag as any).default;\n if (defaultValue !== undefined) {\n property.default = defaultValue;\n } else if (\n flag.flagOnly &&\n getJsonSchemaTypeFromFlag(flag.type) === \"boolean\"\n ) {\n // For flagOnly boolean flags, default to false when not explicitly set\n property.default = false;\n }\n\n // Handle array items\n if (flag.type === \"array\" && (flag as any).itemType) {\n property.items = {\n type: getJsonSchemaTypeFromFlag((flag as any).itemType),\n };\n }\n\n // Determine if required\n const isRequired = !!(flag.mandatory || (flag as any).required);\n\n return { property, isRequired };\n}\n\n/**\n * Convert ArgParser flags to MCP JSON Schema\n */\nexport function convertFlagsToJsonSchema(\n flags: readonly (IFlag | ProcessedFlag)[],\n): {\n type: \"object\";\n properties: Record<string, any>;\n required: string[];\n} {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const flag of flags) {\n // Skip help flag and system flags\n if (flag.name === \"help\" || flag.name.startsWith(\"s-\")) {\n continue;\n }\n\n const { property, isRequired } = convertFlagToJsonSchemaProperty(flag);\n properties[flag.name] = property;\n\n if (isRequired) {\n required.push(flag.name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n}\n\n/**\n * Convert ArgParser flags to Zod schema for MCP tools\n */\nexport function convertFlagsToZodSchema(\n flags: readonly (IFlag | ProcessedFlag)[],\n): ZodTypeAny {\n const zodProperties: Record<string, ZodTypeAny> = {};\n\n for (const flag of flags) {\n // Skip help flag and system flags\n if (flag.name === \"help\" || flag.name.startsWith(\"s-\")) {\n continue;\n }\n\n const zodSchema = mapArgParserFlagToZodSchema(flag);\n zodProperties[flag.name] = zodSchema;\n }\n\n return z.object(zodProperties);\n}\n\n/**\n * Simplified response format for testing and validation\n */\nexport interface SimplifiedToolResponse {\n success: boolean;\n data?: any;\n error?: string;\n message?: string;\n exitCode?: number;\n}\n\n/**\n * Extract simplified response from MCP protocol response\n */\nexport function extractSimplifiedResponse(\n mcpResponse: any,\n): SimplifiedToolResponse {\n // Handle responses that are already in simplified format\n if (\n typeof mcpResponse === \"object\" &&\n mcpResponse !== null &&\n \"success\" in mcpResponse\n ) {\n return {\n success: mcpResponse.success,\n data: mcpResponse.data,\n error: mcpResponse.error || mcpResponse.message, // Ensure error is populated\n message: mcpResponse.message || mcpResponse.error, // Ensure message is populated\n exitCode: mcpResponse.exitCode,\n };\n }\n\n // Handle error responses\n if (mcpResponse.isError) {\n const errorMessage = mcpResponse.content?.[0]?.text || \"Unknown error\";\n return {\n success: false,\n error: errorMessage,\n message: errorMessage, // Include message field for test compatibility\n data: { error: errorMessage }, // Include data field for test compatibility\n exitCode: 1,\n };\n }\n\n // Handle structured content (when output schema is used)\n if (mcpResponse.structuredContent) {\n return {\n success: true,\n data: mcpResponse.structuredContent,\n };\n }\n\n // Handle standard MCP content format\n if (mcpResponse.content && Array.isArray(mcpResponse.content)) {\n try {\n // Try to parse JSON from the text content\n const textContent = mcpResponse.content[0]?.text;\n if (textContent) {\n const parsedData = JSON.parse(textContent);\n return {\n success: true,\n data: parsedData,\n };\n }\n } catch {\n // If parsing fails, return the raw text\n return {\n success: true,\n data: mcpResponse.content[0]?.text || \"No content\",\n };\n }\n }\n\n // Fallback for unexpected formats\n return {\n success: false,\n error: \"Unexpected response format\",\n exitCode: 1,\n };\n}\n\n// Structural type for what MCP server.tool() expects\nexport interface IMcpToolStructure {\n name: string;\n description?: string;\n inputSchema: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n execute: (args: any) => Promise<any>;\n executeForTesting?: (args: any) => Promise<SimplifiedToolResponse>;\n}\n\nfunction mapArgParserFlagToZodSchema(flag: IFlag | ProcessedFlag): ZodTypeAny {\n const flagTypeOpt = flag[\"type\"];\n\n // Handle Zod schemas directly - return them as-is\n if (flagTypeOpt && typeof flagTypeOpt === \"object\" && flagTypeOpt._def) {\n return flagTypeOpt as ZodTypeAny;\n }\n\n let zodSchema: ZodTypeAny = z.string(); // Initialize with default value\n let typeName: string;\n\n if (typeof flagTypeOpt === \"function\") {\n typeName = flagTypeOpt.name.toLowerCase().replace(\"constructor\", \"\");\n } else {\n typeName = String(flagTypeOpt).toLowerCase();\n }\n\n const flagEnum = flag[\"enum\"];\n const allowMultiple = flag[\"allowMultiple\"];\n\n // Handle array flags (allowMultiple: true)\n if (allowMultiple) {\n let itemSchema: ZodTypeAny;\n\n if (flagEnum && Array.isArray(flagEnum) && flagEnum.length > 0) {\n if (flagEnum.every((e) => typeof e === \"string\")) {\n itemSchema = z.enum(flagEnum as [string, ...string[]]);\n } else if (flagEnum.every((e) => typeof e === \"number\")) {\n const literalSchemas = flagEnum.map((val) => z.literal(val));\n if (literalSchemas.length === 1) {\n itemSchema = literalSchemas[0];\n } else {\n itemSchema = z.union(\n literalSchemas as unknown as [\n ZodTypeAny,\n ZodTypeAny,\n ...ZodTypeAny[],\n ],\n );\n }\n } else {\n itemSchema = z.string();\n }\n } else {\n // Default item type based on flag type\n switch (typeName) {\n case \"number\":\n itemSchema = z.number();\n break;\n case \"boolean\":\n itemSchema = z.boolean();\n break;\n default:\n itemSchema = z.string();\n break;\n }\n }\n\n zodSchema = z.array(itemSchema);\n } else {\n // Handle non-array flags\n switch (typeName) {\n case \"string\":\n zodSchema =\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"string\")\n ? z.enum(flagEnum as [string, ...string[]])\n : z.string();\n break;\n case \"number\":\n if (\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"number\")\n ) {\n const literalSchemas = flagEnum.map((val) => z.literal(val));\n if (literalSchemas.length === 1) {\n zodSchema = literalSchemas[0];\n } else if (literalSchemas.length >= 2) {\n zodSchema = z.union(\n literalSchemas as unknown as [\n ZodTypeAny,\n ZodTypeAny,\n ...ZodTypeAny[],\n ],\n );\n } else {\n zodSchema = z.number();\n }\n } else {\n zodSchema = z.number();\n }\n break;\n case \"boolean\":\n zodSchema = z.boolean();\n break;\n case \"array\":\n const itemSchema =\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"string\")\n ? z.enum(flagEnum as [string, ...string[]])\n : z.string(); // Default item type for arrays\n zodSchema = z.array(itemSchema);\n break;\n case \"object\":\n zodSchema = z.record(z.string(), z.any());\n break;\n default:\n logger.error(\n `Flag '${flag[\"name\"]}' has an unknown type '${typeName}'. Defaulting to z.string().`,\n );\n zodSchema = z.string();\n break;\n }\n }\n\n const description = flag[\"description\"];\n if (description) {\n zodSchema = zodSchema.describe(\n Array.isArray(description) ? description.join(\"\\n\") : description,\n );\n }\n\n const defaultValue = flag[\"defaultValue\"];\n if (defaultValue !== undefined) {\n zodSchema = zodSchema.default(defaultValue);\n } else if (!flag[\"mandatory\"]) {\n zodSchema = zodSchema.optional();\n }\n return zodSchema;\n}\n\nexport interface GenerateMcpToolsOptions {\n outputSchemaMap?: Record<string, ZodTypeAny>;\n defaultOutputSchema?: ZodTypeAny;\n /** Automatically generate output schemas for tools that don't have explicit schemas */\n autoGenerateOutputSchema?:\n | boolean\n | keyof typeof import(\"../core/types\").OutputSchemaPatterns;\n generateToolName?: (commandPath: string[], appName?: string) => string;\n includeSubCommands?: boolean;\n toolNamePrefix?: string;\n toolNameSuffix?: string;\n}\n\ninterface ISpecialParseResultProps {\n $commandChain?: string[];\n $error?: { type: string; message: string; details?: any };\n handlerResponse?: any;\n}\nexport type IParseExecutionResult = TParsedArgs<ProcessedFlag[]> &\n ISpecialParseResultProps;\n\nexport function generateMcpToolsFromArgParser(\n rootParser: ArgParserBase,\n options?: GenerateMcpToolsOptions,\n): IMcpToolStructure[] {\n const tools: IMcpToolStructure[] = [];\n const visitedParsers = new Set<ArgParserBase>();\n\n function buildToolsRecursively(\n currentParser: ArgParserBase,\n commandPathParts: string[],\n ) {\n if (visitedParsers.has(currentParser)) return;\n visitedParsers.add(currentParser);\n\n const typedRootParser = rootParser as any;\n const typedCurrentParser = currentParser as any;\n\n const appName = typedRootParser.getAppName\n ? typedRootParser.getAppName()\n : typedRootParser[\"#appName\"];\n const currentParserDescription = typedCurrentParser.getDescription\n ? typedCurrentParser.getDescription()\n : typedCurrentParser[\"#description\"];\n const currentParserHandler = typedCurrentParser.getHandler\n ? typedCurrentParser.getHandler()\n : typedCurrentParser[\"#handler\"];\n\n // ArgParser.ts (line 196) has a public getter `get flags()`\n const currentParserFlags = typedCurrentParser.flags as (\n | IFlag\n | ProcessedFlag\n )[];\n\n const subCommandsMap = typedCurrentParser.getSubCommands\n ? typedCurrentParser.getSubCommands()\n : typedCurrentParser[\"#subCommands\"];\n const currentParserSubCommands = subCommandsMap\n ? Array.from(subCommandsMap.values())\n : [];\n\n let currentParserCommandName = typedCurrentParser.getAppCommandName\n ? typedCurrentParser.getAppCommandName()\n : typedCurrentParser[\"#appCommandName\"];\n if (!currentParserCommandName && currentParser !== rootParser) {\n currentParserCommandName = typedCurrentParser.getSubCommandName\n ? typedCurrentParser.getSubCommandName()\n : typedCurrentParser[\"#subCommandName\"];\n }\n\n // For sub-commands, prefer the command path over the inherited command name\n if (currentParser !== rootParser && commandPathParts.length > 0) {\n currentParserCommandName = commandPathParts[commandPathParts.length - 1];\n }\n const currentParserCommandNameOrAppName =\n currentParserCommandName || appName;\n\n const effectiveCommandName =\n currentParserCommandName ||\n (commandPathParts.length > 0\n ? commandPathParts[commandPathParts.length - 1]\n : appName);\n\n let toolName: string;\n if (options?.generateToolName) {\n toolName = options.generateToolName(commandPathParts, appName);\n } else {\n // For root parser, use the command name directly\n if (currentParser === rootParser) {\n toolName = currentParserCommandNameOrAppName || appName || \"root_cmd\";\n } else {\n // For sub-parsers, use the effective command name or the last part of the path\n toolName = effectiveCommandName || \"cmd\";\n }\n\n // Clean up the tool name for MCP compatibility\n toolName = sanitizeMcpToolName(toolName);\n }\n if (!toolName)\n toolName = currentParser === rootParser && appName ? appName : \"cmd\";\n\n // Apply prefix and suffix if provided\n if (options?.toolNamePrefix) {\n toolName = options.toolNamePrefix + toolName;\n }\n if (options?.toolNameSuffix) {\n toolName = toolName + options.toolNameSuffix;\n }\n\n if (currentParserHandler) {\n const flags = currentParserFlags as ProcessedFlag[];\n const zodProperties: Record<string, ZodTypeAny> = {};\n const hasHelpFlag = flags.some((flag) => flag[\"name\"] === \"help\");\n\n for (const flag of flags) {\n // Skip help flag - it doesn't make sense in MCP tool context\n if (flag[\"name\"] === \"help\") continue;\n\n let flagSchema = mapArgParserFlagToZodSchema(flag);\n\n // If there's a help flag, make mandatory fields optional to allow help to work\n // This is necessary because MCP SDK validates the schema before our execute function runs\n if (hasHelpFlag && flag[\"mandatory\"]) {\n flagSchema = flagSchema.optional();\n }\n\n zodProperties[flag[\"name\"]] = flagSchema;\n }\n const inputSchema = z.object(zodProperties);\n\n let outputSchema: ZodTypeAny | undefined;\n\n // Priority order: explicit schema map > default schema > auto-generated schema\n if (options?.outputSchemaMap && options.outputSchemaMap[toolName]) {\n const customSchema = options.outputSchemaMap[toolName];\n outputSchema =\n typeof customSchema === \"object\" &&\n customSchema !== null &&\n !customSchema._def\n ? z.object(customSchema as unknown as ZodRawShape)\n : customSchema;\n } else if (options?.defaultOutputSchema) {\n outputSchema = options.defaultOutputSchema;\n } else if (options?.autoGenerateOutputSchema) {\n // Auto-generate output schema based on the option value\n if (typeof options.autoGenerateOutputSchema === \"string\") {\n // Use specific pattern\n outputSchema = createOutputSchema(options.autoGenerateOutputSchema);\n } else if (options.autoGenerateOutputSchema === true) {\n // Use default success/error pattern\n outputSchema = createOutputSchema(\"successWithData\");\n }\n }\n\n const tool: IMcpToolStructure = {\n name: toolName,\n description:\n currentParserDescription || `Executes the ${toolName} command.`,\n inputSchema: inputSchema,\n outputSchema: outputSchema,\n async execute(mcpInputArgs: Record<string, any>) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Starting execution for tool '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Input args:`,\n JSON.stringify(mcpInputArgs, null, 2),\n );\n }\n\n // Check if help is requested first, before any other processing\n if (mcpInputArgs[\"help\"] === true) {\n // Generate help text for the specific command path\n let helpParser = rootParser;\n const pathParts = [...commandPathParts];\n\n // Navigate to the correct parser for help\n for (const part of pathParts) {\n const subCmd = (helpParser as any).getSubCommand\n ? (helpParser as any).getSubCommand(part)\n : undefined;\n if (subCmd && subCmd.parser) {\n helpParser = subCmd.parser;\n } else {\n break;\n }\n }\n\n const helpText = (helpParser as any).helpText\n ? (helpParser as any).helpText()\n : \"Help not available\";\n\n if (options?.outputSchemaMap?.[toolName]) {\n const helpData = {\n success: true,\n help: helpText,\n files: [],\n commandExecuted: null,\n stderrOutput: null,\n };\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(helpData, null, 2),\n },\n ],\n structuredContent: helpData,\n };\n }\n return { success: true, message: helpText };\n }\n\n // The ArgParser will handle validation based on its flag definitions during parse.\n // The MCP Server uses these Zod schemas directly.\n const argv: string[] = [...commandPathParts];\n const parserFlags = currentParserFlags as ProcessedFlag[];\n\n for (const flagDef of parserFlags) {\n const flagName = flagDef[\"name\"];\n if (mcpInputArgs.hasOwnProperty(flagName)) {\n const value = mcpInputArgs[flagName];\n const flagType = flagDef[\"type\"];\n const flagOptions = flagDef[\"options\"];\n const isFlagOnly = flagDef[\"flagOnly\"];\n const allowMultiple = flagDef[\"allowMultiple\"];\n let flagTypeName =\n typeof flagType === \"function\"\n ? flagType.name.toLowerCase().replace(\"constructor\", \"\")\n : String(flagType).toLowerCase();\n\n argv.push(flagOptions[0]);\n\n if (flagTypeName === \"boolean\") {\n if (value === true && isFlagOnly === false)\n argv.push(String(value));\n else if (value === false && isFlagOnly === false)\n argv.push(String(value));\n } else if (flagTypeName === \"array\") {\n if (Array.isArray(value)) {\n if (allowMultiple) {\n const originalArgvLength = argv.length;\n value.forEach((item) => {\n argv.push(flagOptions[0]);\n argv.push(String(item));\n });\n if (\n value.length > 0 &&\n argv[originalArgvLength - 1] === flagOptions[0]\n ) {\n argv.splice(originalArgvLength - 1, 1);\n }\n } else {\n argv.push(value.join(\",\"));\n }\n } else if (value != null) argv.push(String(value));\n } else if (value !== null && value !== undefined)\n argv.push(String(value));\n }\n }\n\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Starting try block for tool '${toolName}'`,\n );\n }\n\n // Check if this is a unified tool - if so, handle it directly without recursive parsing\n const rootParserTyped = rootParser as any;\n const unifiedTools = rootParserTyped._tools;\n const isUnifiedTool = unifiedTools && unifiedTools.has(toolName);\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Checking tool '${toolName}' for unified execution`,\n );\n logger.error(`[MCP Tool Debug] Has _tools:`, !!unifiedTools);\n logger.error(\n `[MCP Tool Debug] Available tools:`,\n unifiedTools ? Array.from(unifiedTools.keys()) : [],\n );\n logger.error(`[MCP Tool Debug] Is unified tool:`, isUnifiedTool);\n }\n\n let parseResult: IParseExecutionResult;\n\n if (isUnifiedTool) {\n // For unified tools, bypass the recursive parse call and execute directly\n const toolConfig = unifiedTools.get(toolName);\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Found unified tool config:`,\n !!toolConfig,\n );\n logger.error(\n `[MCP Tool Debug] Has handler:`,\n !!(toolConfig && toolConfig.handler),\n );\n }\n if (toolConfig && toolConfig.handler) {\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Executing unified tool handler for '${toolName}'`,\n );\n logger.error(\n `[MCP Tool Debug] Handler args:`,\n JSON.stringify(mcpInputArgs, null, 2),\n );\n }\n const getFlag = (name: string): any => {\n if (mcpInputArgs && mcpInputArgs[name] !== undefined) {\n return mcpInputArgs[name];\n }\n\n if (rootParser) {\n const flagDef = rootParser.getFlagDefinition(name);\n if (flagDef) {\n const envVar = flagDef[\"env\"];\n if (envVar) {\n const envKey = Array.isArray(envVar)\n ? envVar[0]\n : envVar;\n if (envKey && process.env[envKey]) {\n return process.env[envKey];\n }\n }\n return flagDef[\"defaultValue\"];\n }\n }\n\n return undefined;\n };\n\n const handlerContext: IHandlerContext<any, any> = {\n args: mcpInputArgs,\n commandChain: [toolName],\n parser: rootParser,\n parentArgs: undefined,\n isMcp: true,\n getFlag,\n logger, // Add logger to context\n displayHelp: () => {\n logger.error(\n \"Help display is not supported in MCP mode.\",\n );\n },\n };\n\n const handlerResult =\n await toolConfig.handler(handlerContext);\n\n // Create a mock parse result that mimics successful execution\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Handler result:`,\n JSON.stringify(handlerResult, null, 2),\n );\n }\n parseResult = {\n handlerResponse: handlerResult,\n $commandChain: [toolName],\n ...mcpInputArgs,\n } as IParseExecutionResult;\n } catch (handlerError: any) {\n // Create error parse result\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Handler error:`,\n handlerError,\n );\n }\n parseResult = {\n $error: {\n type: \"handler_error\",\n message:\n handlerError instanceof Error\n ? handlerError.message\n : String(handlerError),\n details: handlerError,\n },\n ...mcpInputArgs,\n } as IParseExecutionResult;\n }\n } else {\n // Tool not found error\n parseResult = {\n $error: {\n type: \"tool_not_found\",\n message: `Unified tool '${toolName}' not found or has no handler`,\n details: { toolName },\n },\n ...mcpInputArgs,\n } as IParseExecutionResult;\n }\n } else {\n // For CLI-generated tools, use the original parse approach\n // ArgParser instance (rootParser) should be configured with handleErrors: false in its constructor.\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Using CLI-generated tool parsing for '${toolName}'`,\n );\n logger.error(\n `[MCP Tool Debug] Parse argv:`,\n JSON.stringify(argv, null, 2),\n );\n }\n parseResult = (await rootParser.parse(\n argv,\n )) as IParseExecutionResult;\n }\n\n if (parseResult[\"$error\"]) {\n const errorDetails = parseResult[\"$error\"]!;\n const errPayload = {\n message: `Cmd error: ${errorDetails.type} - ${errorDetails.message}`,\n details: errorDetails.details,\n };\n // For tools with output schemas, we need to provide structured content even for errors\n if (outputSchema) {\n // Try to create a structured error response that matches the output schema\n // We need to provide all required fields from the schema\n const structuredError: any = {\n success: false,\n error: errPayload.message,\n message: errPayload.message,\n };\n\n // Try to extract schema requirements and provide default values\n try {\n if (\n outputSchema &&\n typeof outputSchema === \"object\" &&\n outputSchema !== null &&\n outputSchema._def\n ) {\n const zodSchema = outputSchema as any;\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Output schema type:`,\n zodSchema._def?.typeName || zodSchema._def?.type,\n );\n }\n if (\n zodSchema._def?.typeName === \"ZodObject\" ||\n zodSchema._def?.type === \"object\"\n ) {\n const shapeGetter = zodSchema._def?.shape;\n if (shapeGetter) {\n const shape =\n typeof shapeGetter === \"function\"\n ? shapeGetter()\n : shapeGetter;\n\n if (shape && typeof shape === \"object\") {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Schema shape keys:`,\n Object.keys(shape),\n );\n }\n\n // Provide default values for required fields\n Object.keys(shape).forEach((key) => {\n if (!(key in structuredError)) {\n const fieldSchema = shape[key];\n if (fieldSchema && fieldSchema._def) {\n switch (\n fieldSchema._def.typeName ||\n fieldSchema._def.type\n ) {\n case \"ZodString\":\n case \"string\":\n structuredError[key] = \"\";\n break;\n case \"ZodNumber\":\n case \"number\":\n structuredError[key] = 0;\n break;\n case \"ZodBoolean\":\n case \"boolean\":\n structuredError[key] = false;\n break;\n case \"ZodArray\":\n case \"array\":\n structuredError[key] = [];\n break;\n case \"ZodObject\":\n case \"object\":\n structuredError[key] = {};\n break;\n default:\n structuredError[key] = null;\n }\n }\n }\n });\n }\n }\n }\n }\n } catch (schemaError) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Error processing output schema for structured error:`,\n schemaError,\n );\n }\n // Continue with basic structured error if schema processing fails\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Final structured error:`,\n JSON.stringify(structuredError, null, 2),\n );\n }\n\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Error: ${errPayload.message}`,\n },\n ],\n structuredContent: structuredError,\n };\n }\n\n // Always return standard MCP error response format for errors\n // Custom output schemas only apply to successful responses\n return createMcpErrorResponse(errPayload.message);\n }\n\n let handlerResponse = parseResult[\"handlerResponse\"];\n\n // Check if there's an async handler that needs to be awaited\n if (!handlerResponse && parseResult[\"_asyncHandlerPromise\"]) {\n try {\n handlerResponse = await parseResult[\"_asyncHandlerPromise\"];\n } catch (error: any) {\n // Use standardized MCP error response for async handler errors\n return createMcpErrorResponse(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n\n // Check if we need to execute or re-execute the handler with proper MCP context\n // This happens when:\n // 1. No handler was executed (handlerResponse === undefined)\n // 2. Handler was executed but not with MCP context (need to re-execute with isMcp: true)\n\n // For root commands, the $commandChain might be undefined, so we need to construct it\n let commandChain = parseResult[\"$commandChain\"];\n if (!commandChain) {\n // For root commands, use the app command name\n const appCommandName = (rootParser as any).getAppCommandName\n ? (rootParser as any).getAppCommandName()\n : (rootParser as any)[\"#appCommandName\"];\n if (appCommandName) {\n commandChain = [appCommandName];\n }\n }\n\n const needsHandlerExecution =\n handlerResponse === undefined ||\n (handlerResponse !== undefined && commandChain);\n\n if (needsHandlerExecution && commandChain) {\n let finalParser: ArgParserBase | undefined = rootParser;\n let currentArgs: Record<string, any> = { ...parseResult };\n let resolvedParentArgs: Record<string, any> | undefined =\n undefined;\n const chain = commandChain;\n\n // Clean up special properties from currentArgs\n delete currentArgs[\"handlerResponse\"];\n delete currentArgs[\"$commandChain\"];\n delete currentArgs[\"$error\"];\n delete currentArgs[\"_originalInputArgs\"];\n delete currentArgs[\"_asyncHandlerPromise\"];\n delete currentArgs[\"_asyncHandlerInfo\"];\n delete currentArgs[\"_fuzzyModePreventedExecution\"];\n delete currentArgs[\"help\"]; // Remove help flag as well\n\n for (let i = 0; i < chain.length; i++) {\n const cmdName = chain[i];\n // Use ArgParser's public getSubCommand method\n const subCmdInfo = finalParser?.getSubCommand\n ? finalParser.getSubCommand(cmdName)\n : undefined;\n\n if (subCmdInfo && subCmdInfo.parser) {\n // For sub-commands, we need to pass the arguments that belong to the sub-command\n // Since the parseResult contains all the arguments, we'll use them directly\n // and filter out the special properties\n resolvedParentArgs = { ...currentArgs };\n currentArgs = { ...currentArgs };\n // Remove special properties to get clean sub-command args\n delete currentArgs[\"handlerResponse\"];\n delete currentArgs[\"$commandChain\"];\n delete currentArgs[\"$error\"];\n delete currentArgs[\"_originalInputArgs\"];\n delete currentArgs[\"_asyncHandlerPromise\"];\n delete currentArgs[\"_asyncHandlerInfo\"];\n delete currentArgs[\"_fuzzyModePreventedExecution\"];\n delete currentArgs[\"help\"];\n\n finalParser = subCmdInfo.parser as ArgParserBase;\n } else if (\n i === 0 &&\n finalParser &&\n cmdName ===\n ((finalParser as any).getAppCommandName\n ? (finalParser as any).getAppCommandName()\n : (finalParser as any)[\"#appCommandName\"] ||\n ((finalParser as any).getAppName\n ? (finalParser as any).getAppName()\n : (finalParser as any)[\"#appName\"]))\n ) {\n currentArgs = { ...parseResult };\n // Clean up special properties again after resetting from parseResult\n delete currentArgs[\"handlerResponse\"];\n delete currentArgs[\"$commandChain\"];\n delete currentArgs[\"$error\"];\n delete currentArgs[\"_originalInputArgs\"];\n delete currentArgs[\"_asyncHandlerPromise\"];\n delete currentArgs[\"_asyncHandlerInfo\"];\n delete currentArgs[\"_fuzzyModePreventedExecution\"];\n delete currentArgs[\"help\"];\n break;\n } else {\n finalParser = undefined;\n break;\n }\n }\n\n const finalParserTyped = finalParser as any;\n const finalHandler = finalParserTyped.getHandler\n ? finalParserTyped.getHandler()\n : finalParserTyped[\"#handler\"];\n\n if (finalParser && finalHandler) {\n const handlerToCall = finalHandler as Function;\n\n // For MCP execution, use the original MCP input args instead of the merged parse result\n // This prevents the nested args issue where handler response gets merged into args\n const cleanArgs = { ...mcpInputArgs };\n delete cleanArgs[\"help\"]; // Remove help flag\n\n const getFlag = (name: string): any => {\n if (cleanArgs && cleanArgs[name] !== undefined) {\n return cleanArgs[name];\n }\n\n if (finalParser) {\n const flagDef = finalParser.getFlagDefinition(name);\n if (flagDef) {\n const envVar = flagDef[\"env\"];\n if (envVar) {\n const envKey = Array.isArray(envVar)\n ? envVar[0]\n : envVar;\n if (envKey && process.env[envKey]) {\n return process.env[envKey];\n }\n }\n return flagDef[\"defaultValue\"];\n }\n }\n\n return undefined;\n };\n\n const handlerContext: IHandlerContext<any, any> = {\n args: cleanArgs,\n commandChain: chain,\n parser: finalParser,\n parentArgs: resolvedParentArgs,\n isMcp: true,\n getFlag,\n displayHelp: () => {\n logger.error(\"Help display is not supported in MCP mode.\");\n },\n logger,\n };\n try {\n handlerResponse = await handlerToCall(handlerContext);\n } catch (handlerError: any) {\n // Use standardized MCP error response\n return createMcpErrorResponse(handlerError);\n }\n }\n }\n\n // Automatically format response for MCP\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Formatting response for tool '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Handler response:`,\n JSON.stringify(handlerResponse, null, 2),\n );\n }\n\n if (handlerResponse && typeof handlerResponse === \"object\") {\n try {\n require(\"fs\").appendFileSync(\n \"/tmp/mcp-debug.log\",\n `[DEBUG] Handler response: ${JSON.stringify(handlerResponse, null, 2)}\\n`,\n );\n } catch (e) {} // Ignore errors during debug logging\n // If handler already returned MCP format with content field, use it\n if (\n handlerResponse.content &&\n Array.isArray(handlerResponse.content)\n ) {\n // If tool has output schema, ensure structuredContent is present\n if (outputSchema && !handlerResponse.structuredContent) {\n handlerResponse.structuredContent = handlerResponse;\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Returning MCP format response for '${toolName}'`,\n );\n }\n return handlerResponse;\n } else {\n // Handler returned plain data, wrap it in MCP format\n // Always include structuredContent for object responses to ensure MCP compliance\n // This is safe because structuredContent is optional in the MCP spec\n const mcpResponse = {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(handlerResponse, null, 2),\n },\n ],\n structuredContent: handlerResponse,\n };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Wrapping plain response in MCP format for '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Final MCP response:`,\n JSON.stringify(mcpResponse, null, 2),\n );\n }\n return mcpResponse;\n }\n }\n\n // For non-object responses, wrap in MCP format\n const defaultResponse = handlerResponse || { success: true };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Using default response for tool '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Default response:`,\n JSON.stringify(defaultResponse, null, 2),\n );\n }\n\n // Always include structuredContent for object responses to ensure MCP compliance\n if (typeof defaultResponse === \"object\") {\n const finalResponse = {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(defaultResponse, null, 2),\n },\n ],\n structuredContent: defaultResponse,\n };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Returning structured default response for '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Final response:`,\n JSON.stringify(finalResponse, null, 2),\n );\n }\n return finalResponse;\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Returning success response for '${toolName}'`,\n );\n }\n return createMcpSuccessResponse(defaultResponse);\n } catch (e: any) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Exception caught in tool '${toolName}':`,\n e,\n );\n }\n\n // Check if this is a handler error that was thrown due to handleErrors: false\n // In this case, we want to format it consistently with the $error handling above\n let errorMsg: string;\n\n if (e instanceof Error && e.message) {\n // This is likely a handler error thrown when handleErrors: false\n errorMsg = `Cmd error: handler_error - ${e.message}`;\n } else {\n // Other types of errors (parsing errors, etc.)\n errorMsg = `MCP tool exec failed: ${e.message || String(e)}`;\n }\n\n // For tools with output schemas, we need to provide structured content even for errors\n // to satisfy MCP SDK validation requirements\n if (outputSchema) {\n // Try to create a structured error response that matches the output schema\n const structuredError: any = {\n success: false,\n error: errorMsg,\n message: errorMsg,\n };\n\n // Try to extract schema requirements and provide default values\n try {\n if (\n outputSchema &&\n typeof outputSchema === \"object\" &&\n outputSchema !== null &&\n outputSchema._def\n ) {\n const zodSchema = outputSchema as any;\n if (\n zodSchema._def?.typeName === \"ZodObject\" ||\n zodSchema._def?.type === \"object\"\n ) {\n const shapeGetter = zodSchema._def?.shape;\n if (shapeGetter) {\n const shape =\n typeof shapeGetter === \"function\"\n ? shapeGetter()\n : shapeGetter;\n\n if (shape && typeof shape === \"object\") {\n // Provide default values for required fields\n Object.keys(shape).forEach((key) => {\n if (!(key in structuredError)) {\n const fieldSchema = shape[key];\n if (fieldSchema && fieldSchema._def) {\n const typeName =\n fieldSchema._def.typeName ||\n fieldSchema._def.type;\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n structuredError[key] = \"\";\n break;\n case \"ZodNumber\":\n case \"number\":\n structuredError[key] = 0;\n break;\n case \"ZodBoolean\":\n case \"boolean\":\n structuredError[key] = false;\n break;\n case \"ZodArray\":\n case \"array\":\n structuredError[key] = [];\n break;\n case \"ZodObject\":\n case \"object\":\n structuredError[key] = {};\n break;\n default:\n structuredError[key] = null;\n }\n }\n }\n });\n }\n }\n }\n }\n } catch (schemaError) {\n // Ignore schema processing errors during error handling\n }\n\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMsg}`,\n },\n ],\n structuredContent: structuredError,\n };\n }\n\n // Always return standard MCP error response format for errors\n // Custom output schemas only apply to successful responses\n return createMcpErrorResponse(errorMsg);\n }\n },\n async executeForTesting(\n mcpInputArgs: Record<string, any>,\n ): Promise<SimplifiedToolResponse> {\n try {\n const mcpResponse = await this.execute(mcpInputArgs);\n return extractSimplifiedResponse(mcpResponse);\n } catch (error: any) {\n return {\n success: false,\n error: error.message || String(error),\n exitCode: 1,\n };\n }\n },\n };\n tools.push(tool);\n }\n\n const subCommands = currentParserSubCommands;\n if (subCommands && options?.includeSubCommands !== false) {\n for (const subCmdObj of subCommands) {\n // Skip MCP server sub-commands to avoid infinite recursion\n if ((subCmdObj as any).isMcp === true) {\n continue;\n }\n\n const nextPathParts = [...commandPathParts, (subCmdObj as any).name];\n buildToolsRecursively(\n (subCmdObj as any).parser as ArgParserBase,\n nextPathParts.filter((p) => p),\n );\n }\n }\n }\n buildToolsRecursively(rootParser, []);\n return tools;\n}\n","/**\n * MCP Protocol Version Configuration\n *\n * This module defines the supported MCP protocol versions and provides\n * utilities for version negotiation according to the MCP specification.\n *\n * Version Negotiation Rules (per MCP specification):\n * 1. If server supports the requested protocol version, it MUST respond with the same version\n * 2. Otherwise, server MUST respond with another protocol version it supports\n * 3. Server SHOULD respond with the latest version it supports\n * 4. If client doesn't support the server's response version, it SHOULD disconnect\n */\n\n/**\n * Official MCP protocol versions in chronological order\n * Based on the official MCP specification releases found in docs/MCP/modelcontextprotocol/docs/specification/\n *\n * According to versioning.mdx:\n * - 2025-06-18 is the **current** protocol version\n * - Previous versions are marked as **final** (complete, no changes)\n * - Draft versions are in-progress specifications\n */\nexport const MCP_PROTOCOL_VERSIONS = [\n \"2024-11-05\", // Final - Initial stable release\n \"2025-03-26\", // Final - Updated transport specifications\n \"2025-06-18\", // Current - Latest stable specification\n] as const;\n\n/**\n * Draft protocol versions (in-progress specifications)\n * These are not yet ready for production use\n */\nexport const MCP_DRAFT_VERSIONS = [\n \"draft\", // Draft - In-progress specification\n] as const;\n\n/**\n * All available protocol versions (stable + draft)\n */\nexport const ALL_MCP_VERSIONS = [\n ...MCP_PROTOCOL_VERSIONS,\n ...MCP_DRAFT_VERSIONS,\n] as const;\n\n/**\n * Type for stable MCP protocol versions\n */\nexport type McpProtocolVersion = (typeof MCP_PROTOCOL_VERSIONS)[number];\n\n/**\n * Type for draft MCP protocol versions\n */\nexport type McpDraftVersion = (typeof MCP_DRAFT_VERSIONS)[number];\n\n/**\n * Type for all MCP protocol versions (stable + draft)\n */\nexport type McpAnyVersion = (typeof ALL_MCP_VERSIONS)[number];\n\n/**\n * Current protocol version according to the official MCP specification\n * This is marked as \"current\" in versioning.mdx and should be the preferred version\n */\nexport const CURRENT_MCP_PROTOCOL_VERSION: McpProtocolVersion = \"2025-06-18\";\n\n/**\n * Default protocol version used by this implementation for backward compatibility\n * We start with this version but can negotiate to newer versions\n *\n * Note: The official MCP SDK may support newer versions automatically.\n * This constant represents our fallback/minimum version.\n */\nexport const DEFAULT_MCP_PROTOCOL_VERSION: McpProtocolVersion = \"2024-11-05\";\n\n/**\n * Latest stable protocol version (highest version number from stable versions)\n */\nexport const LATEST_MCP_PROTOCOL_VERSION: McpProtocolVersion =\n MCP_PROTOCOL_VERSIONS[MCP_PROTOCOL_VERSIONS.length - 1];\n\n/**\n * Minimum supported protocol version (oldest stable version)\n */\nexport const MINIMUM_MCP_PROTOCOL_VERSION: McpProtocolVersion =\n MCP_PROTOCOL_VERSIONS[0];\n\n/**\n * Validates if a protocol version string follows the MCP format (YYYY-MM-DD or 'draft')\n */\nexport function isValidMcpVersionFormat(version: string): boolean {\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(version) || version === \"draft\";\n}\n\n/**\n * Checks if a protocol version is an official stable MCP version\n */\nexport function isOfficialMcpVersion(\n version: string,\n): version is McpProtocolVersion {\n return MCP_PROTOCOL_VERSIONS.includes(version as McpProtocolVersion);\n}\n\n/**\n * Checks if a protocol version is a draft MCP version\n */\nexport function isDraftMcpVersion(version: string): version is McpDraftVersion {\n return MCP_DRAFT_VERSIONS.includes(version as McpDraftVersion);\n}\n\n/**\n * Checks if a protocol version is any valid MCP version (stable or draft)\n */\nexport function isAnyMcpVersion(version: string): version is McpAnyVersion {\n return ALL_MCP_VERSIONS.includes(version as McpAnyVersion);\n}\n\n/**\n * Checks if a protocol version is supported by this implementation\n * Note: The official MCP SDK may support additional versions automatically\n */\nexport function isSupportedByImplementation(version: string): boolean {\n // We support all official stable versions and can handle draft versions\n // The official SDK likely supports all of these automatically\n return isAnyMcpVersion(version);\n}\n\n/**\n * Checks if a protocol version is recommended for production use\n */\nexport function isProductionReady(version: string): boolean {\n // Only stable versions are recommended for production\n return isOfficialMcpVersion(version);\n}\n\n/**\n * Performs version negotiation according to MCP specification\n *\n * @param requestedVersion The protocol version requested by the client\n * @returns The protocol version the server should respond with\n *\n * According to MCP specification:\n * - If server supports requested version → return SAME version (MUST)\n * - If server doesn't support requested version → return different supported version (MUST)\n * - Server SHOULD return latest version it supports\n *\n * Note: The actual MCP SDK may implement its own version negotiation.\n */\nexport function negotiateProtocolVersion(\n requestedVersion: string,\n): McpAnyVersion {\n // Validate format first\n if (!isValidMcpVersionFormat(requestedVersion)) {\n // If format is invalid, return the current/latest stable version\n return CURRENT_MCP_PROTOCOL_VERSION;\n }\n\n // If we support the requested version, return it (MUST per spec)\n if (isSupportedByImplementation(requestedVersion)) {\n // For draft versions, we might want to negotiate to stable version in production\n if (isDraftMcpVersion(requestedVersion)) {\n // In production, prefer stable version over draft\n return CURRENT_MCP_PROTOCOL_VERSION;\n }\n return requestedVersion as McpAnyVersion;\n }\n\n // If we don't support the requested version, return our current/latest version (SHOULD per spec)\n return CURRENT_MCP_PROTOCOL_VERSION;\n}\n\n/**\n * Gets comprehensive version compatibility information\n */\nexport function getVersionCompatibilityInfo() {\n return {\n // Stable versions\n stableVersions: [...MCP_PROTOCOL_VERSIONS],\n currentVersion: CURRENT_MCP_PROTOCOL_VERSION,\n defaultVersion: DEFAULT_MCP_PROTOCOL_VERSION,\n latestStableVersion: LATEST_MCP_PROTOCOL_VERSION,\n minimumVersion: MINIMUM_MCP_PROTOCOL_VERSION,\n\n // Draft versions\n draftVersions: [...MCP_DRAFT_VERSIONS],\n\n // All versions\n allSupportedVersions: [...ALL_MCP_VERSIONS],\n\n // Version status\n versionStatus: {\n \"2024-11-05\": \"final\",\n \"2025-03-26\": \"final\",\n \"2025-06-18\": \"current\",\n draft: \"draft\",\n },\n };\n}\n\n/**\n * Compares two MCP protocol versions\n * Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: string, v2: string): number {\n if (v1 === v2) return 0;\n return v1 < v2 ? -1 : 1;\n}\n\n/**\n * Finds the highest version from a list of versions\n */\nexport function getHighestVersion(versions: string[]): string | null {\n if (versions.length === 0) return null;\n\n return versions.reduce((highest, current) => {\n return compareVersions(current, highest) > 0 ? current : highest;\n });\n}\n\n/**\n * Comprehensive test data for version negotiation testing\n */\nexport const VERSION_TEST_DATA = {\n // All supported stable versions\n stableVersions: [...MCP_PROTOCOL_VERSIONS],\n\n // Draft versions (may not be suitable for production)\n draftVersions: [...MCP_DRAFT_VERSIONS],\n\n // All supported versions\n allSupportedVersions: [...ALL_MCP_VERSIONS],\n\n // Versions that should be rejected/negotiated\n unsupportedVersions: [\n \"2020-01-01\", // Too old (before MCP existed)\n \"2023-01-01\", // Before first official release\n \"2024-01-01\", // Before first official release\n \"2030-12-31\", // Future version\n \"2026-01-01\", // Future version\n ],\n\n // Malformed version strings\n malformedVersions: [\n \"\", // Empty string\n \"invalid\", // Non-date format\n \"2024\", // Incomplete date\n \"2024-13-01\", // Invalid month\n \"2024-01-32\", // Invalid day\n \"v2024-11-05\", // With prefix\n \"2024.11.05\", // Wrong separator\n \"24-11-05\", // Wrong year format\n \"2024-11-5\", // Wrong day format\n \"beta\", // Invalid draft name\n \"v1.0.0\", // Semantic versioning format\n ],\n\n // Expected negotiation results for testing\n expectedNegotiations: {\n \"2024-11-05\": \"2024-11-05\", // Should return same\n \"2025-03-26\": \"2025-03-26\", // Should return same\n \"2025-06-18\": \"2025-06-18\", // Should return same (current)\n draft: \"2025-06-18\", // Should negotiate to stable\n \"2020-01-01\": \"2025-06-18\", // Should negotiate to current\n \"2030-12-31\": \"2025-06-18\", // Should negotiate to current\n invalid: \"2025-06-18\", // Should negotiate to current\n },\n} as const;\n","/**\n * Zod v3/v4 compatibility layer for MCP SDK integration\n *\n * The MCP SDK currently expects Zod v3 \"raw shape\" types for input schemas,\n * but this project uses Zod v4. This module provides compatibility functions\n * to convert Zod v4 schemas to formats that the MCP SDK can understand.\n */\n\nimport { z, type ZodObject, type ZodRawShape, type ZodTypeAny } from \"zod\";\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"Zod Compatibility\");\n\n/**\n * Type representing a Zod v3 compatible raw shape\n */\ntype ZodV3CompatibleShape = Record<string, ZodTypeAny>;\n\n/**\n * Type representing what the MCP SDK expects for tool registration\n */\ninterface McpSdkCompatibleSchema {\n shape?: ZodV3CompatibleShape;\n _def?: any;\n _zod?: any; // MCP SDK may look for this property\n parse?: (input: any) => any;\n safeParse?: (input: any) => any;\n}\n\n/**\n * Converts a Zod v4 schema to a format compatible with the MCP SDK's expectations\n * for Zod v3 raw shape types.\n *\n * @param zodSchema - The Zod v4 schema to convert\n * @returns A schema format compatible with MCP SDK\n */\nexport function convertToMcpCompatibleSchema(\n zodSchema: ZodTypeAny,\n): McpSdkCompatibleSchema {\n // Helper to get def property from either _def (v3) or def (v4)\n const getDefProperty = (schema: any) => schema._def || schema.def;\n\n // If it's already a ZodObject, try to extract the shape\n if (zodSchema instanceof z.ZodObject) {\n try {\n // In Zod v4, the shape is accessible via the shape property\n const shape = (zodSchema as any).shape;\n if (shape && typeof shape === \"object\") {\n return {\n shape,\n _def: getDefProperty(zodSchema),\n _zod: zodSchema, // Include reference to original Zod schema\n parse: zodSchema.parse.bind(zodSchema),\n safeParse: zodSchema.safeParse.bind(zodSchema),\n };\n }\n } catch (error) {\n logger.error(\n \"[Zod Compatibility] Failed to extract shape from ZodObject:\",\n error,\n );\n }\n }\n\n // Try to extract shape from _def (v3) or def (v4) if available\n const defProperty = getDefProperty(zodSchema);\n if (defProperty && defProperty.shape) {\n try {\n const shapeGetter = defProperty.shape;\n const shape =\n typeof shapeGetter === \"function\" ? shapeGetter() : shapeGetter;\n return {\n shape: shape,\n _def: defProperty,\n _zod: zodSchema, // Include reference to original Zod schema\n parse: zodSchema.parse.bind(zodSchema),\n safeParse: zodSchema.safeParse.bind(zodSchema),\n };\n } catch (error) {\n logger.error(\n \"[Zod Compatibility] Failed to extract shape from def property:\",\n error,\n );\n }\n }\n\n // Fallback: create a wrapper that mimics Zod v3 behavior\n return {\n shape: {},\n _def: getDefProperty(zodSchema) || {},\n _zod: zodSchema, // Include reference to original Zod schema\n parse: zodSchema.parse.bind(zodSchema),\n safeParse: zodSchema.safeParse.bind(zodSchema),\n };\n}\n\n/**\n * Creates an empty schema compatible with MCP SDK for tools with no parameters\n */\nexport function createEmptyMcpSchema(): McpSdkCompatibleSchema {\n const emptySchema = z.object({});\n return convertToMcpCompatibleSchema(emptySchema);\n}\n\n/**\n * Extracts the raw shape from a Zod v4 object schema in a way that's\n * compatible with what MCP SDK expects from Zod v3.\n *\n * @param zodObjectSchema - A Zod object schema\n * @returns The raw shape or empty object if extraction fails\n */\nexport function extractRawShape(\n zodObjectSchema: ZodObject<ZodRawShape>,\n): ZodV3CompatibleShape {\n try {\n // Try multiple methods to extract the shape\n\n // Method 1: Direct shape property access (Zod v4)\n if ((zodObjectSchema as any).shape) {\n return (zodObjectSchema as any).shape;\n }\n\n // Method 2: Shape from _def (fallback for Zod v3)\n if (\n (zodObjectSchema as any)._def &&\n typeof (zodObjectSchema as any)._def.shape === \"function\"\n ) {\n return (zodObjectSchema as any)._def.shape();\n }\n\n // Method 3: Shape from def (Zod v4)\n if (\n (zodObjectSchema as any).def &&\n typeof (zodObjectSchema as any).def.shape === \"function\"\n ) {\n return (zodObjectSchema as any).def.shape();\n }\n\n // Method 4: Static shape property from _def (Zod v3)\n if ((zodObjectSchema as any)._def && (zodObjectSchema as any)._def.shape) {\n const shapeValue = (zodObjectSchema as any)._def.shape;\n return typeof shapeValue === \"function\" ? shapeValue() : shapeValue;\n }\n\n // Method 5: Static shape property from def (Zod v4)\n if ((zodObjectSchema as any).def && (zodObjectSchema as any).def.shape) {\n const shapeValue = (zodObjectSchema as any).def.shape;\n return typeof shapeValue === \"function\" ? shapeValue() : shapeValue;\n }\n\n logger.warn(\n \"[Zod Compatibility] Could not extract raw shape, returning empty object\",\n );\n return {};\n } catch (error) {\n logger.error(\"[Zod Compatibility] Error extracting raw shape:\", error);\n return {};\n }\n}\n\n/**\n * Checks if a schema is a Zod object schema\n */\nexport function isZodObjectSchema(\n schema: any,\n): schema is ZodObject<ZodRawShape> {\n return (\n schema instanceof z.ZodObject ||\n (schema &&\n ((schema._def &&\n (schema._def.typeName === \"ZodObject\" ||\n schema._def.type === \"object\")) ||\n (schema.def &&\n (schema.def.typeName === \"ZodObject\" ||\n schema.def.type === \"object\"))))\n );\n}\n\n/**\n * Converts Zod v4 schemas to the specific format expected by MCP SDK tool registration.\n * This function handles the conversion for the server.registerTool() call.\n *\n * @param zodSchema - The Zod v4 schema to convert\n * @returns A schema format that MCP SDK can work with\n */\nexport function prepareMcpToolSchema(zodSchema: ZodTypeAny): any {\n // For MCP SDK compatibility, we need to provide something that looks like Zod v3\n\n // Add null/undefined check at the beginning\n if (!zodSchema) {\n logger.error(\n \"[prepareMcpToolSchema] ERROR: zodSchema is null or undefined!\",\n );\n logger.error(\"[prepareMcpToolSchema] Stack trace:\", new Error().stack);\n throw new Error(\n \"prepareMcpToolSchema called with null or undefined zodSchema\",\n );\n }\n\n // Helper to get def property from either _def (v3) or def (v4)\n const getDefProperty = (schema: any) => schema._def || schema.def;\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Input schema:\");\n logger.error(` - Type: ${typeof zodSchema}`);\n logger.error(` - Constructor: ${zodSchema?.constructor?.name}`);\n logger.error(` - Has _def: ${!!zodSchema?._def}`);\n logger.error(` - Has def: ${!!zodSchema?.def}`);\n logger.error(` - _def content:`, zodSchema?._def);\n logger.error(` - def content:`, zodSchema?.def);\n logger.error(` - Has shape: ${!!(zodSchema as any)?.shape}`);\n }\n\n if (isZodObjectSchema(zodSchema)) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Processing as ZodObject schema\");\n }\n // For object schemas, try to return the raw shape or a compatible wrapper\n const rawShape = extractRawShape(zodSchema);\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Extracted raw shape:\", rawShape);\n logger.error(\n \"[prepareMcpToolSchema] Raw shape keys:\",\n Object.keys(rawShape || {}),\n );\n }\n\n // Create a completely clean Zod v3-like object that MCP SDK can understand\n const defProperty = getDefProperty(zodSchema);\n\n // Create object with clean prototype to avoid any Zod v4 properties\n const compatibleSchema = Object.create(null);\n\n // Only add the essential properties that MCP SDK expects\n compatibleSchema._def = defProperty;\n compatibleSchema.shape = rawShape;\n\n // Essential methods\n compatibleSchema.parse = zodSchema.parse.bind(zodSchema);\n compatibleSchema.safeParse = zodSchema.safeParse.bind(zodSchema);\n\n // Optional methods (only if they exist)\n if (zodSchema.optional) {\n compatibleSchema.optional = zodSchema.optional.bind(zodSchema);\n }\n if (zodSchema.nullable) {\n compatibleSchema.nullable = zodSchema.nullable.bind(zodSchema);\n }\n\n // Store reference for debugging (but not as _zod to avoid conflicts)\n compatibleSchema._originalSchema = zodSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Created compatible schema:\");\n logger.error(` - Has _def: ${!!compatibleSchema._def}`);\n logger.error(` - Has shape: ${!!compatibleSchema.shape}`);\n logger.error(\n ` - Shape keys: ${Object.keys(compatibleSchema.shape || {})}`,\n );\n }\n\n return compatibleSchema;\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Processing as non-object schema\");\n }\n\n // For non-object schemas, return minimal compatible object\n const defProperty = getDefProperty(zodSchema);\n\n // Create clean object without any Zod v4 properties\n const result = Object.create(null);\n\n // Only add essential properties\n result._def = defProperty;\n result.parse = zodSchema.parse.bind(zodSchema);\n result.safeParse = zodSchema.safeParse.bind(zodSchema);\n\n // Optional methods (only if they exist)\n if (zodSchema.optional) {\n result.optional = zodSchema.optional.bind(zodSchema);\n }\n if (zodSchema.nullable) {\n result.nullable = zodSchema.nullable.bind(zodSchema);\n }\n\n // Store reference for debugging\n result._originalSchema = zodSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Non-object result:\");\n logger.error(` - Has _def: ${!!result._def}`);\n logger.error(` - Type: ${typeof result}`);\n }\n\n return result;\n}\n\n/**\n * Simple approach: Create a clean copy of Zod schema without v4-specific properties\n * This is a non-recursive version to avoid infinite loops\n */\nexport function createCleanZodSchema(zodSchema: ZodTypeAny): any {\n if (!zodSchema) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n \"[createCleanZodSchema] ERROR: zodSchema is null or undefined!\",\n );\n }\n // Return a simple default schema\n return z.object({});\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[createCleanZodSchema] Input schema:\");\n logger.error(` - Type: ${typeof zodSchema}`);\n logger.error(` - Constructor: ${zodSchema?.constructor?.name}`);\n logger.error(` - Has ~standard: ${!!(zodSchema as any)[\"~standard\"]}`);\n logger.error(` - Has def: ${!!(zodSchema as any).def}`);\n logger.error(` - Has _def: ${!!(zodSchema as any)._def}`);\n }\n\n // Create a minimal Zod-like object with just the essential properties\n const cleanSchema: any = {};\n\n // Copy essential properties that MCP SDK needs\n cleanSchema._def = (zodSchema as any)._def || (zodSchema as any).def;\n cleanSchema.parse = (zodSchema as any).parse?.bind(zodSchema);\n cleanSchema.safeParse = (zodSchema as any).safeParse?.bind(zodSchema);\n\n // Copy shape if it exists (for object schemas)\n if ((zodSchema as any).shape) {\n cleanSchema.shape = (zodSchema as any).shape;\n }\n\n // Set the prototype to match the original schema\n Object.setPrototypeOf(cleanSchema, Object.getPrototypeOf(zodSchema));\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[createCleanZodSchema] Clean schema created:\");\n logger.error(` - Has ~standard: ${!!(cleanSchema as any)[\"~standard\"]}`);\n logger.error(` - Has def: ${!!(cleanSchema as any).def}`);\n logger.error(` - Has _def: ${!!(cleanSchema as any)._def}`);\n logger.error(` - Has parse: ${typeof cleanSchema.parse}`);\n logger.error(` - Has safeParse: ${typeof cleanSchema.safeParse}`);\n logger.error(` - Has shape: ${!!(cleanSchema as any).shape}`);\n }\n\n return cleanSchema;\n}\n\n/**\n * Convert a Zod schema to a JSON Schema object that the MCP SDK expects\n * This is the correct approach - the MCP SDK expects JSON Schema, not Zod schemas\n */\nexport function zodToJsonSchema(zodSchema: ZodTypeAny): any {\n if (!zodSchema) {\n return { type: \"object\", properties: {} };\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[zodToJsonSchema] Converting Zod schema to JSON Schema\");\n logger.error(` - Input type: ${typeof zodSchema}`);\n logger.error(` - Constructor: ${zodSchema?.constructor?.name}`);\n }\n\n // For now, create a basic JSON Schema structure\n // This is a simplified implementation - we can enhance it later\n const def = (zodSchema as any)._def || (zodSchema as any).def;\n\n if (def?.typeName === \"ZodObject\") {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n // Get the shape\n const shape = typeof def.shape === \"function\" ? def.shape() : def.shape;\n\n for (const [key, value] of Object.entries(shape || {})) {\n const fieldDef = (value as any)?._def || (value as any)?.def;\n\n if (fieldDef?.typeName === \"ZodString\") {\n properties[key] = { type: \"string\" };\n if (fieldDef.description) {\n properties[key].description = fieldDef.description;\n }\n } else if (fieldDef?.typeName === \"ZodNumber\") {\n properties[key] = { type: \"number\" };\n } else if (fieldDef?.typeName === \"ZodBoolean\") {\n properties[key] = { type: \"boolean\" };\n } else {\n // Fallback for unknown types\n properties[key] = { type: \"string\" };\n }\n\n // Check if field is required (not optional)\n if (fieldDef?.typeName && !fieldDef?.typeName?.includes(\"Optional\")) {\n required.push(key);\n }\n }\n\n const jsonSchema = {\n type: \"object\" as const,\n properties,\n ...(required.length > 0 && { required }),\n };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n \"[zodToJsonSchema] Generated JSON Schema:\",\n JSON.stringify(jsonSchema, null, 2),\n );\n }\n\n return jsonSchema;\n }\n\n // Fallback for non-object schemas\n return { type: \"object\", properties: {} };\n}\n\n/**\n * Debug function to log schema structure for troubleshooting\n */\nexport function debugSchemaStructure(\n schema: any,\n label: string = \"Schema\",\n): void {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(`[Zod Compatibility Debug] ${label} structure:`);\n logger.error(` - Type: ${typeof schema}`);\n logger.error(` - Constructor: ${schema?.constructor?.name}`);\n logger.error(` - Has shape: ${!!schema?.shape}`);\n logger.error(` - Has _def: ${!!schema?._def}`);\n logger.error(` - _def.typeName: ${schema?._def?.typeName}`);\n logger.error(` - _def.type: ${schema?._def?.type}`);\n logger.error(` - Has parse: ${typeof schema?.parse}`);\n logger.error(` - Has safeParse: ${typeof schema?.safeParse}`);\n\n if (schema?.shape) {\n logger.error(` - Shape keys: ${Object.keys(schema.shape)}`);\n }\n }\n}\n\n/**\n * Validates that a schema is compatible with MCP SDK expectations\n */\nexport function validateMcpSchemaCompatibility(schema: any): boolean {\n try {\n // Check for required methods\n if (typeof schema?.parse !== \"function\") {\n logger.warn(\"[Zod Compatibility] Schema missing parse method\");\n return false;\n }\n\n if (typeof schema?.safeParse !== \"function\") {\n logger.warn(\"[Zod Compatibility] Schema missing safeParse method\");\n return false;\n }\n\n // For object schemas, check for shape\n if (\n (schema?._def?.typeName === \"ZodObject\" ||\n schema?._def?.type === \"object\") &&\n !schema?.shape\n ) {\n logger.warn(\n \"[Zod Compatibility] ZodObject schema missing shape property\",\n );\n return false;\n }\n\n return true;\n } catch (error) {\n logger.error(\n \"[Zod Compatibility] Error validating schema compatibility:\",\n error,\n );\n return false;\n }\n}\n","import type { Application as ExpressApplication } from \"express\";\nimport { z, type ZodTypeAny } from \"zod\";\nimport {\n createMcpLogger,\n type McpLoggerOptions,\n} from \"@alcyone-labs/simple-mcp-logger\";\nimport {\n convertFlagsToZodSchema,\n createMcpErrorResponse,\n createMcpSuccessResponse,\n generateMcpToolsFromArgParser,\n} from \"../mcp/mcp-integration\";\nimport type {\n GenerateMcpToolsOptions,\n IMcpToolStructure,\n} from \"../mcp/mcp-integration\";\nimport type { McpLifecycleEvents } from \"../mcp/mcp-lifecycle\";\nimport {\n compareVersions,\n CURRENT_MCP_PROTOCOL_VERSION,\n} from \"../mcp/mcp-protocol-versions\";\nimport { sanitizeMcpToolName } from \"../mcp/mcp-utils\";\nimport {\n debugSchemaStructure,\n validateMcpSchemaCompatibility,\n} from \"../mcp/zod-compatibility\";\nimport { debug } from \"../utils/debug-utils\";\nimport { ArgParserBase, type IArgParserParams } from \"./ArgParserBase\";\nimport { resolveLogPath, type LogPath } from \"./log-path-utils\";\nimport { createOutputSchema, type IMcpServerMethods } from \"./types\";\nimport type {\n IFlag,\n IHandlerContext,\n OutputSchemaConfig,\n ParseResult,\n} from \"./types\";\n\nexport type { Application as ExpressApplication } from \"express\";\n\n/**\n * Configuration for a single MCP transport\n */\nexport type CorsOptions = {\n origins?: \"*\" | string | RegExp | Array<string | RegExp>;\n methods?: string[];\n headers?: string[];\n exposedHeaders?: string[];\n credentials?: boolean;\n maxAge?: number;\n};\n\nexport type JwtVerifyOptions = {\n algorithms?: (\"HS256\" | \"RS256\")[];\n secret?: string; // for HS256\n publicKey?: string; // for RS256\n getPublicKey?: (\n header: Record<string, unknown>,\n payload: Record<string, unknown>,\n ) => Promise<string> | string;\n audience?: string | string[];\n issuer?: string | string[];\n clockToleranceSec?: number;\n};\n\nexport type AuthOptions = {\n required?: boolean; // default true for MCP endpoint\n scheme?: \"bearer\" | \"jwt\";\n allowedTokens?: string[]; // simple bearer allowlist\n validator?: (\n req: any,\n token: string | undefined,\n ) => boolean | Promise<boolean>;\n jwt?: JwtVerifyOptions;\n publicPaths?: string[]; // paths that skip auth\n protectedPaths?: string[]; // if provided, only these paths require auth\n customMiddleware?: (req: any, res: any, next: any) => any; // full control hook\n};\n\nexport type McpTransportConfig = {\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions; // streamable-http only\n auth?: AuthOptions; // streamable-http only\n};\n\n/**\n * Configuration options for MCP sub-command\n */\nexport type McpSubCommandOptions = {\n /** Preset transport configurations to use when no CLI flags are provided */\n defaultTransports?: McpTransportConfig[];\n /** Single preset transport configuration (alternative to defaultTransports) */\n defaultTransport?: McpTransportConfig;\n};\n\n/**\n * Extended server information for DXT package generation and MCP server metadata\n * This type includes logo support for MCP servers and DXT packages\n */\nexport type DxtServerInfo = {\n name: string;\n version: string;\n description?: string;\n /** Author information for DXT manifest */\n author?: {\n name: string;\n email?: string;\n url?: string;\n };\n /** Repository information for DXT manifest */\n repository?: {\n type: string;\n url: string;\n };\n /** License identifier for DXT manifest */\n license?: string;\n /** Homepage URL for DXT manifest */\n homepage?: string;\n /** Documentation URL for DXT manifest */\n documentation?: string;\n /** Support/issues URL for DXT manifest */\n support?: string;\n /** Keywords for DXT manifest */\n keywords?: string[];\n /**\n * Logo/icon for DXT manifest and MCP server - can be a local file path or URL\n * This is where logo support is provided for MCP-enabled ArgParser instances\n */\n logo?: string;\n};\n\n/**\n * Copy entry for DXT package bundling, compatible with TSDown's copy options\n */\nexport type DxtCopyEntry = {\n from: string;\n to: string;\n};\n\n/**\n * Copy options for DXT package bundling, compatible with TSDown's copy options\n * @example\n * ```ts\n * [\n * 'migrations',\n * { from: 'migrations', to: 'migrations' },\n * { from: 'config/default.json', to: 'config/default.json' }\n * ]\n * ```\n */\nexport type DxtCopyOptions = Array<string | DxtCopyEntry>;\n\n/**\n * DXT-specific configuration options\n */\nexport type DxtOptions = {\n /**\n * Additional files and directories to include in the DXT package.\n * Paths are relative to the project root (where package.json/tsconfig.json are located).\n *\n * @example\n * ```ts\n * include: [\n * 'migrations', // Copy entire migrations folder\n * { from: 'config/prod.json', to: 'config.json' }, // Copy and rename file\n * 'assets/logo.png' // Copy specific file\n * ]\n * ```\n */\n include?: DxtCopyOptions;\n};\n\n/**\n * MCP server configuration options for withMcp() method\n * This centralizes MCP server metadata that was previously scattered across addMcpSubCommand calls\n */\nexport type HttpServerOptions = {\n configureExpress?: (app: ExpressApplication) => void;\n};\n\nexport type McpServerOptions = {\n /** MCP server metadata */\n serverInfo?: DxtServerInfo;\n /** Default transport configurations for the MCP server */\n defaultTransports?: McpTransportConfig[];\n /** Single default transport configuration (alternative to defaultTransports) */\n defaultTransport?: McpTransportConfig;\n /** Tool generation options for the MCP server */\n toolOptions?: GenerateMcpToolsOptions;\n /**\n * Custom log file path for MCP server logs (default: \"./logs/mcp.log\" relative to entry point)\n *\n * @deprecated Use 'log' property instead for more comprehensive logging configuration\n *\n * Can be:\n * - Simple string: \"./logs/app.log\" (relative to entry point)\n * - Absolute path: \"/tmp/app.log\"\n * - Explicit cwd: \"cwd:./logs/app.log\" (relative to process.cwd())\n * - Config object: { path: \"./logs/app.log\", relativeTo: \"entry\" | \"cwd\" | \"absolute\" }\n */\n logPath?: LogPath;\n /**\n * MCP logger configuration options\n *\n * Can be:\n * - Simple string: \"./logs/app.log\" (equivalent to logPath for backward compatibility)\n * - Full options object: { level: \"debug\", logToFile: \"./logs/app.log\", prefix: \"MyServer\" }\n *\n * When both 'log' and 'logPath' are specified, they are merged intelligently:\n * - 'log' provides logger options (level, prefix, mcpMode)\n * - 'logPath' provides flexible path resolution (relativeTo, basePath)\n * - If 'log' has logToFile, 'logPath' still takes precedence for path resolution\n */\n log?: string | McpLoggerOptions;\n /**\n * Lifecycle event handlers for MCP server operations\n * These provide hooks for initialization, cleanup, and other lifecycle events\n */\n lifecycle?: McpLifecycleEvents;\n /** DXT package configuration options */\n dxt?: DxtOptions;\n /** Optional HTTP server configuration hooks */\n httpServer?: HttpServerOptions;\n};\n\n/**\n * Combined options for withMcp() method\n */\nexport type WithMcpOptions<THandlerReturn = any> =\n IArgParserParams<THandlerReturn> & {\n /** MCP-specific server configuration */\n mcp?: McpServerOptions;\n };\n\n/**\n * Type alias for clarity - ArgParser options with MCP capabilities\n * This provides a clearer name for WithMcpOptions\n */\nexport type ArgParserWithMcpOptions<THandlerReturn = any> =\n WithMcpOptions<THandlerReturn>;\n\n/**\n * Configuration for an individual MCP tool (deprecated - use ToolConfig instead)\n * @deprecated Use ToolConfig and addTool() instead. Will be removed in v2.0.\n */\nexport type McpToolConfig = {\n /**\n * Tool name (must be unique within the server)\n * Note: For MCP compatibility, names will be automatically sanitized to match ^[a-zA-Z0-9_-]{1,64}$\n * Invalid characters will be replaced with underscores\n */\n name: string;\n /** Tool description */\n description?: string;\n /** Input schema for the tool (Zod schema) */\n inputSchema?: any; // ZodTypeAny from zod\n /** Output schema for the tool (Zod schema) */\n outputSchema?: any; // ZodTypeAny from zod\n /** Handler function for the tool */\n handler: (args: any) => Promise<any> | any;\n};\n\n/**\n * Configuration for a unified tool that works in both CLI and MCP modes\n */\nexport type ToolConfig = {\n /**\n * Tool name (CLI subcommand name & MCP tool name)\n * Note: For MCP compatibility, names will be automatically sanitized to match ^[a-zA-Z0-9_-]{1,64}$\n * Invalid characters will be replaced with underscores\n */\n name: string;\n /** Tool description */\n description?: string;\n /** Flags for this tool (auto-converted to MCP schema) */\n flags: readonly IFlag[];\n /** Handler function for the tool */\n handler: (ctx: IHandlerContext) => Promise<any> | any;\n /** Output schema for this tool (predefined pattern, Zod schema, or schema definition object) */\n outputSchema?: OutputSchemaConfig;\n};\n\n/**\n * ArgParser with Model Context Protocol (MCP) integration capabilities.\n *\n * This class adds MCP server functionality on top of the standard ArgParser,\n * allowing CLI tools to be easily exposed as MCP tools with minimal boilerplate.\n *\n * @example\n * ```typescript\n * const parser = new ArgParser({\n * appName: \"My CLI\",\n * appCommandName: \"my-cli\",\n * handler: async (ctx) => ({ result: \"success\" })\n * })\n * .addFlags([...])\n * .addMcpSubCommand(\"serve\", {\n * name: \"my-cli-mcp-server\",\n * version: \"1.0.0\"\n * });\n * ```\n */\nexport class ArgParser<THandlerReturn = any>\n extends ArgParserBase<THandlerReturn>\n implements IMcpServerMethods\n{\n /** Stored MCP server configuration from withMcp() */\n private _mcpServerConfig?: McpServerOptions;\n\n /** Registered MCP tools (deprecated) */\n private _mcpTools: Map<string, McpToolConfig> = new Map();\n\n /** Registered unified tools */\n private _tools: Map<string, ToolConfig> = new Map();\n\n /** Output schema management */\n private _defaultOutputSchema?: import(\"zod\").ZodTypeAny;\n private _outputSchemaMap: Map<string, import(\"zod\").ZodTypeAny> = new Map();\n private _autoGenerateOutputSchema?:\n | boolean\n | keyof typeof import(\"./types\").OutputSchemaPatterns;\n\n /** MCP version for output schema compatibility */\n private _mcpProtocolVersion: string = CURRENT_MCP_PROTOCOL_VERSION;\n\n /**\n * Get the stored MCP server configuration\n * @returns MCP server configuration if set via withMcp(), undefined otherwise\n */\n public getMcpServerConfig(): McpServerOptions | undefined {\n return this._mcpServerConfig;\n }\n\n /**\n * Resolve logger configuration from various sources with proper priority\n * @param logPathOverride Optional log path override parameter\n * @returns Logger configuration object for createMcpLogger\n */\n #_resolveLoggerConfig(logPathOverride?: LogPath): McpLoggerOptions | string {\n const mcpConfig = this._mcpServerConfig;\n\n // Priority 1: Parameter override (for backward compatibility)\n if (logPathOverride) {\n const resolvedPath = resolveLogPath(logPathOverride);\n return {\n prefix: \"MCP Server Creation\",\n logToFile: resolvedPath,\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n }\n\n // Enhanced logic: Merge 'log' configuration with 'logPath' for flexible path resolution\n const hasLogConfig = mcpConfig?.log;\n const hasLogPath = mcpConfig?.logPath;\n\n if (hasLogConfig || hasLogPath) {\n // Start with base configuration\n let config: McpLoggerOptions = {\n prefix: \"MCP Server Creation\",\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n\n // Apply log configuration if present\n if (hasLogConfig && mcpConfig.log) {\n if (typeof mcpConfig.log === \"string\") {\n // Simple string path - use it as logToFile\n config.logToFile = resolveLogPath(mcpConfig.log);\n } else {\n // Full options object - merge with defaults\n config = {\n ...config,\n ...mcpConfig.log,\n // Resolve logToFile path if provided in log config\n ...(mcpConfig.log.logToFile && {\n logToFile: resolveLogPath(mcpConfig.log.logToFile),\n }),\n };\n }\n }\n\n // Apply logPath configuration if present and no logToFile was set by log config\n if (hasLogPath && mcpConfig.logPath && !config.logToFile) {\n config.logToFile = resolveLogPath(mcpConfig.logPath);\n }\n\n // If logPath is present but log config also specified a logToFile,\n // use logPath for more flexible path resolution (this preserves the nice LogPath features)\n if (\n hasLogPath &&\n mcpConfig.logPath &&\n hasLogConfig &&\n mcpConfig.log &&\n typeof mcpConfig.log === \"object\" &&\n mcpConfig.log.logToFile\n ) {\n // Use logPath for path resolution, but keep the logToFile from log config as fallback\n config.logToFile = resolveLogPath(mcpConfig.logPath);\n }\n\n return config;\n }\n\n // Priority 4: Default fallback\n const defaultPath = resolveLogPath(\"./logs/mcp.log\");\n return {\n prefix: \"MCP Server Creation\",\n logToFile: defaultPath,\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n }\n\n /**\n * Set a default output schema for all MCP tools generated from this parser\n * @param schema - Predefined pattern name, Zod schema, or schema definition object\n * @returns This ArgParser instance for chaining\n */\n public setDefaultOutputSchema(schema: OutputSchemaConfig): this {\n this._defaultOutputSchema = createOutputSchema(schema);\n return this;\n }\n\n /**\n * Set an output schema for a specific tool/command\n * @param toolName - Name of the tool/command\n * @param schema - Predefined pattern name, Zod schema, or schema definition object\n * @returns This ArgParser instance for chaining\n */\n public setOutputSchema(toolName: string, schema: OutputSchemaConfig): this {\n this._outputSchemaMap.set(toolName, createOutputSchema(schema));\n return this;\n }\n\n /**\n * Enable automatic output schema generation for MCP tools\n * @param pattern - True for default pattern, or specific pattern name\n * @returns This ArgParser instance for chaining\n */\n public enableAutoOutputSchema(\n pattern:\n | boolean\n | keyof typeof import(\"./types\").OutputSchemaPatterns = true,\n ): this {\n this._autoGenerateOutputSchema = pattern;\n return this;\n }\n\n /**\n * Set the MCP protocol version for compatibility checks\n * @param version - MCP protocol version (e.g., \"2025-06-18\")\n * @returns This ArgParser instance for chaining\n */\n public setMcpProtocolVersion(version: string): this {\n this._mcpProtocolVersion = version;\n return this;\n }\n\n /**\n * Check if the current MCP protocol version supports output schemas\n * Output schemas were introduced in MCP version 2025-06-18\n * @returns true if output schemas are supported\n */\n private supportsOutputSchemas(): boolean {\n // Output schemas were introduced in MCP version 2025-06-18\n return compareVersions(this._mcpProtocolVersion, \"2025-06-18\") >= 0;\n }\n\n /**\n * Add a unified tool that works in both CLI and MCP modes\n * In CLI mode, the tool becomes a subcommand with its own flags\n * In MCP mode, the tool becomes an MCP tool with auto-generated schema\n *\n * @param toolConfig Configuration for the tool\n * @returns This ArgParser instance for chaining\n */\n public addTool(toolConfig: ToolConfig): this {\n // Validate tool configuration\n if (!toolConfig.name || typeof toolConfig.name !== \"string\") {\n throw new Error(\"Tool name is required and must be a string\");\n }\n\n if (!toolConfig.handler || typeof toolConfig.handler !== \"function\") {\n throw new Error(\"Tool handler is required and must be a function\");\n }\n\n // Sanitize the tool name for MCP compatibility\n const sanitizedName = sanitizeMcpToolName(toolConfig.name);\n\n // Log sanitization warnings via console.warn (user-facing, not data-safe logging)\n if (sanitizedName !== toolConfig.name) {\n console.warn(\n `[ArgParser] Tool name '${toolConfig.name}' was sanitized to '${sanitizedName}' for MCP compatibility`,\n );\n }\n\n if (this._tools.has(sanitizedName)) {\n throw new Error(`Tool with name '${sanitizedName}' already exists`);\n }\n\n if (!Array.isArray(toolConfig.flags)) {\n throw new Error(\"Tool flags must be an array\");\n }\n\n // Create a new tool config with the sanitized name\n const sanitizedToolConfig: ToolConfig = {\n ...toolConfig,\n name: sanitizedName,\n };\n\n // Store the tool configuration with sanitized name\n this._tools.set(sanitizedName, sanitizedToolConfig);\n\n // Register the tool as a CLI subcommand (using original name for CLI)\n this.#registerToolAsSubCommand(toolConfig);\n\n return this;\n }\n\n /**\n * Register a tool as a CLI subcommand\n * @private\n */\n #registerToolAsSubCommand(toolConfig: ToolConfig): void {\n // Create a new ArgParser instance for this tool's subcommand\n const toolParser = new ArgParserBase(\n {\n appName: `${this.getAppName()} ${toolConfig.name}`,\n description:\n toolConfig.description || `Execute ${toolConfig.name} tool`,\n handler: toolConfig.handler,\n },\n toolConfig.flags,\n );\n\n // Add the subcommand to this parser\n this.addSubCommand({\n name: toolConfig.name,\n description: toolConfig.description || `Execute ${toolConfig.name} tool`,\n parser: toolParser,\n handler: toolConfig.handler,\n });\n }\n\n /**\n * Add an MCP tool to this parser (deprecated)\n * @deprecated Use addTool() instead. This method will be removed in v2.0.\n * @param toolConfig Configuration for the MCP tool\n * @returns This ArgParser instance for chaining\n */\n public addMcpTool(toolConfig: McpToolConfig): this {\n // Use console.warn directly for deprecation warnings (user-facing, not logging)\n console.warn(`[DEPRECATED] addMcpTool() is deprecated and will be removed in v2.0.\nPlease use addTool() instead for a unified CLI/MCP experience.\nMigration guide: https://github.com/alcyone-labs/arg-parser/blob/main/docs/MCP-MIGRATION.md`);\n\n // Sanitize the tool name for MCP compatibility\n const sanitizedName = sanitizeMcpToolName(toolConfig.name);\n\n // Log sanitization warnings via console.warn (user-facing, not data-safe logging)\n if (sanitizedName !== toolConfig.name) {\n console.warn(\n `[ArgParser] Tool name '${toolConfig.name}' was sanitized to '${sanitizedName}' for MCP compatibility`,\n );\n }\n\n if (this._mcpTools.has(sanitizedName)) {\n throw new Error(`MCP tool with name '${sanitizedName}' already exists`);\n }\n\n // Create a new tool config with the sanitized name\n const sanitizedToolConfig: McpToolConfig = {\n ...toolConfig,\n name: sanitizedName,\n };\n\n this._mcpTools.set(sanitizedName, sanitizedToolConfig);\n return this;\n }\n\n /**\n * Get all registered unified tools\n * @returns Map of tool names to tool configurations\n */\n public getTools(): Map<string, ToolConfig> {\n return new Map(this._tools);\n }\n\n /**\n * Get all registered MCP tools (deprecated)\n * @deprecated Use getTools() instead\n * @returns Map of tool names to tool configurations\n */\n public getMcpTools(): Map<string, McpToolConfig> {\n return new Map(this._mcpTools);\n }\n\n /**\n * Get information about all available tools (unified, legacy MCP, and CLI-generated)\n * @param options Optional configuration for MCP tool generation\n * @returns Object with tool counts and names for debugging\n */\n public getToolInfo(options?: GenerateMcpToolsOptions): {\n unifiedTools: string[];\n legacyMcpTools: string[];\n cliTools: string[];\n totalTools: number;\n duplicates: string[];\n } {\n const cliTools = generateMcpToolsFromArgParser(this, options);\n const unifiedToolNames = Array.from(this._tools.keys());\n const legacyMcpToolNames = Array.from(this._mcpTools.keys());\n const cliToolNames = cliTools.map((t) => t.name);\n\n // Find duplicates (tools that exist in multiple categories)\n const allToolNames = [\n ...unifiedToolNames,\n ...legacyMcpToolNames,\n ...cliToolNames,\n ];\n const duplicates = allToolNames.filter(\n (name, index) => allToolNames.indexOf(name) !== index,\n );\n\n // Calculate total unique tools (unified tools take precedence)\n const uniqueToolNames = new Set(allToolNames);\n\n return {\n unifiedTools: unifiedToolNames,\n legacyMcpTools: legacyMcpToolNames,\n cliTools: cliToolNames,\n totalTools: uniqueToolNames.size,\n duplicates: Array.from(new Set(duplicates)),\n };\n }\n\n /**\n * Get information about all available MCP tools (legacy method)\n * @deprecated Use getToolInfo() instead\n * @param options Optional configuration for MCP tool generation\n * @returns Object with tool counts and names for debugging\n */\n public getMcpToolInfo(options?: GenerateMcpToolsOptions): {\n manualTools: string[];\n cliTools: string[];\n totalTools: number;\n duplicates: string[];\n } {\n const toolInfo = this.getToolInfo(options);\n return {\n manualTools: [...toolInfo.unifiedTools, ...toolInfo.legacyMcpTools],\n cliTools: toolInfo.cliTools,\n totalTools: toolInfo.totalTools,\n duplicates: toolInfo.duplicates,\n };\n }\n\n /**\n * Validate that all tools are properly registered and routable\n * @returns Validation results\n */\n public validateToolRouting(): {\n isValid: boolean;\n issues: string[];\n cliSubcommands: string[];\n mcpTools: string[];\n } {\n const issues: string[] = [];\n const cliSubcommands: string[] = [];\n const mcpTools: string[] = [];\n\n // Check CLI subcommand registration\n const subCommands = this.getSubCommands();\n if (subCommands) {\n for (const [name] of subCommands) {\n cliSubcommands.push(name);\n }\n }\n\n // Check MCP tool registration\n const mcpToolStructures = this.toMcpTools();\n for (const tool of mcpToolStructures) {\n mcpTools.push(tool.name);\n }\n\n // Validate that unified tools are registered in both CLI and MCP\n for (const [toolName] of this._tools) {\n if (!cliSubcommands.includes(toolName)) {\n issues.push(\n `Unified tool '${toolName}' is not registered as CLI subcommand`,\n );\n }\n if (!mcpTools.includes(toolName)) {\n issues.push(`Unified tool '${toolName}' is not registered as MCP tool`);\n }\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n cliSubcommands,\n mcpTools,\n };\n }\n\n /**\n * Test tool routing by simulating a tool call\n * This is useful for debugging and ensuring tools are properly registered\n * @param toolName Name of the tool to test\n * @param args Arguments to pass to the tool\n * @returns Promise with the tool execution result or error\n */\n public async testMcpToolRouting(\n toolName: string,\n args: any = {},\n ): Promise<{\n success: boolean;\n result?: any;\n error?: string;\n executionTime?: number;\n }> {\n try {\n const tools = this.toMcpTools();\n const tool = tools.find((t) => t.name === toolName);\n\n if (!tool) {\n return {\n success: false,\n error: `Tool '${toolName}' not found. Available tools: ${tools.map((t) => t.name).join(\", \")}`,\n };\n }\n\n const startTime = Date.now();\n const result = await tool.execute(args);\n const executionTime = Date.now() - startTime;\n\n return {\n success: true,\n result,\n executionTime,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Generate MCP tools from this ArgParser instance\n * @param options Optional configuration for MCP tool generation\n * @returns Array of MCP tool structures ready for server registration\n */\n public toMcpTools(options?: GenerateMcpToolsOptions): IMcpToolStructure[] {\n // Merge instance-level output schema settings with options\n const mergedOptions: GenerateMcpToolsOptions = {\n ...options,\n // Merge output schema maps (options take precedence)\n outputSchemaMap: {\n ...Object.fromEntries(this._outputSchemaMap),\n ...options?.outputSchemaMap,\n },\n // Use instance default if not specified in options\n defaultOutputSchema:\n options?.defaultOutputSchema || this._defaultOutputSchema,\n // Use instance auto-generate setting if not specified in options\n autoGenerateOutputSchema:\n options?.autoGenerateOutputSchema ?? this._autoGenerateOutputSchema,\n };\n\n // Generate tools from CLI structure (legacy approach)\n const cliTools = generateMcpToolsFromArgParser(this, mergedOptions);\n\n // Convert unified tools to MCP tool structures\n const unifiedTools: IMcpToolStructure[] = Array.from(\n this._tools.values(),\n ).map((toolConfig) => {\n // Determine output schema for this tool\n let outputSchema: import(\"zod\").ZodTypeAny | undefined;\n\n // Priority: explicit schema map > tool-level schema > default schema > auto-generated schema\n if (mergedOptions.outputSchemaMap?.[toolConfig.name]) {\n outputSchema = mergedOptions.outputSchemaMap[toolConfig.name];\n } else if (toolConfig.outputSchema) {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Tool '${toolConfig.name}' has outputSchema:`,\n typeof toolConfig.outputSchema,\n );\n this.logger.error(\n `[MCP Debug] outputSchema has _def:`,\n !!(\n toolConfig.outputSchema &&\n typeof toolConfig.outputSchema === \"object\" &&\n \"_def\" in toolConfig.outputSchema\n ),\n );\n }\n outputSchema = createOutputSchema(toolConfig.outputSchema);\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Created output schema for '${toolConfig.name}':`,\n !!outputSchema,\n );\n }\n } else if (mergedOptions.defaultOutputSchema) {\n outputSchema = mergedOptions.defaultOutputSchema;\n } else if (mergedOptions.autoGenerateOutputSchema) {\n if (typeof mergedOptions.autoGenerateOutputSchema === \"string\") {\n outputSchema = createOutputSchema(\n mergedOptions.autoGenerateOutputSchema,\n );\n } else if (mergedOptions.autoGenerateOutputSchema === true) {\n outputSchema = createOutputSchema(\"successWithData\");\n }\n }\n\n // Only include output schema if the MCP protocol version supports it\n if (outputSchema && !this.supportsOutputSchemas()) {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Output schema for '${toolConfig.name}' removed due to MCP version ${this._mcpProtocolVersion} not supporting output schemas`,\n );\n }\n outputSchema = undefined;\n }\n\n return {\n name: toolConfig.name,\n description:\n toolConfig.description || `Executes the ${toolConfig.name} tool.`,\n inputSchema: convertFlagsToZodSchema(toolConfig.flags),\n outputSchema,\n execute: async (args: any) => {\n // Hijack console for MCP mode to prevent STDOUT contamination\n const originalConsole = globalThis.console;\n let mcpLogger: any = null;\n\n try {\n // Try to import and setup MCP logger for this tool execution\n try {\n const mcpLoggerModule = await Function(\n 'return import(\"@alcyone-labs/simple-mcp-logger\")',\n )();\n mcpLogger = mcpLoggerModule.createMcpLogger(\n `MCP-Tool-${toolConfig.name}`,\n );\n // Hijack console globally to prevent STDOUT contamination\n (globalThis as any).console = mcpLogger;\n } catch {\n // Fallback: create a minimal logger that redirects to stderr\n // Use originalConsole to avoid circular reference\n mcpLogger = {\n log: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n info: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n warn: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n error: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n debug: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n };\n (globalThis as any).console = mcpLogger;\n }\n\n // Create handler context similar to CLI mode\n const context: IHandlerContext = {\n args,\n parentArgs: {},\n commandChain: [toolConfig.name],\n parser: this as any,\n isMcp: true,\n logger: this.logger,\n displayHelp: () => {\n this.logger.error(\"Help display is not supported in MCP mode.\");\n },\n };\n\n const startTime = Date.now();\n const result = await toolConfig.handler(context);\n const executionTime = Date.now() - startTime;\n\n // Log successful execution for debugging\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Tool] '${toolConfig.name}' executed successfully in ${executionTime}ms`,\n );\n }\n\n // Ensure the result is properly formatted for MCP\n if (result && typeof result === \"object\" && \"content\" in result) {\n // Already in MCP format - ensure structuredContent is present if output schema exists and is supported\n if (\n outputSchema &&\n this.supportsOutputSchemas() &&\n !result.structuredContent\n ) {\n result.structuredContent = result;\n }\n return result;\n } else {\n // Format response consistently - include structuredContent when output schema is present and supported\n if (\n outputSchema &&\n this.supportsOutputSchemas() &&\n result &&\n typeof result === \"object\"\n ) {\n // Include structuredContent when output schema is present and version supports it\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result,\n };\n } else {\n // Wrap in standard MCP response format\n return createMcpSuccessResponse(result);\n }\n }\n } catch (error) {\n // Enhanced error handling with proper MCP error response format\n const errorMessage = `Tool '${toolConfig.name}' execution failed: ${error instanceof Error ? error.message : String(error)}`;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(`[MCP Tool Error] ${errorMessage}`);\n if (error instanceof Error && error.stack) {\n this.logger.error(`[MCP Tool Stack] ${error.stack}`);\n }\n }\n\n // Return MCP-compliant error response\n return createMcpErrorResponse(errorMessage);\n } finally {\n // Restore original console\n globalThis.console = originalConsole;\n }\n },\n };\n });\n\n // Convert legacy MCP tools to MCP tool structures (deprecated)\n const legacyMcpTools: IMcpToolStructure[] = Array.from(\n this._mcpTools.values(),\n ).map((toolConfig) => ({\n name: toolConfig.name,\n description:\n toolConfig.description || `Executes the ${toolConfig.name} tool.`,\n inputSchema: toolConfig.inputSchema || z.object({}),\n outputSchema: toolConfig.outputSchema,\n execute: async (args: any) => {\n try {\n const startTime = Date.now();\n const result = await toolConfig.handler(args);\n const executionTime = Date.now() - startTime;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Tool] '${toolConfig.name}' (legacy) executed successfully in ${executionTime}ms`,\n );\n }\n\n if (result && typeof result === \"object\" && \"content\" in result) {\n // If tool has output schema and version supports it, ensure structuredContent is present\n if (\n toolConfig.outputSchema &&\n this.supportsOutputSchemas() &&\n !result.structuredContent\n ) {\n result.structuredContent = result;\n }\n return result;\n } else {\n // Format response consistently with CLI-generated tools\n if (\n toolConfig.outputSchema &&\n this.supportsOutputSchemas() &&\n result &&\n typeof result === \"object\"\n ) {\n // Include structuredContent when output schema is present and version supports it\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result,\n };\n } else {\n return createMcpSuccessResponse(result);\n }\n }\n } catch (error) {\n const errorMessage = `Tool '${toolConfig.name}' execution failed: ${error instanceof Error ? error.message : String(error)}`;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(`[MCP Tool Error] ${errorMessage}`);\n }\n\n return createMcpErrorResponse(errorMessage);\n }\n },\n }));\n\n // Combine all tools (unified tools take precedence over legacy tools, which take precedence over CLI-generated tools)\n const allTools = [...unifiedTools, ...legacyMcpTools, ...cliTools];\n const uniqueTools = allTools.reduce((acc, tool) => {\n const existingTool = acc.find((t) => t.name === tool.name);\n if (!existingTool) {\n acc.push(tool);\n } else {\n // Log when a tool is being overridden\n const toolSource = unifiedTools.find((t) => t.name === tool.name)\n ? \"unified\"\n : legacyMcpTools.find((t) => t.name === tool.name)\n ? \"legacy MCP\"\n : \"CLI-generated\";\n console.warn(\n `[MCP Tool Registration] ${toolSource} tool '${tool.name}' overrides other tool definitions`,\n );\n }\n return acc;\n }, [] as IMcpToolStructure[]);\n\n return uniqueTools;\n }\n\n /**\n * Create an MCP server with tools generated from this ArgParser\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options\n * @param logPath Optional log path (deprecated, use log config in withMcp instead)\n * @returns Configured MCP server instance\n */\n public async createMcpServer(\n serverInfo?: DxtServerInfo,\n toolOptions?: GenerateMcpToolsOptions,\n logPath?: LogPath,\n ): Promise<any> {\n // Resolve logger configuration with priority: parameter > log config > logPath config > default\n const loggerConfig = this.#_resolveLoggerConfig(logPath);\n\n // Use the appropriate createMcpLogger API based on configuration type\n // Note: Current version only supports legacy API (prefix, logToFile)\n const logger =\n typeof loggerConfig === \"string\"\n ? createMcpLogger(\"MCP Server Creation\", loggerConfig)\n : createMcpLogger(\n loggerConfig.prefix || \"MCP Server Creation\",\n loggerConfig.logToFile,\n );\n\n try {\n // Use provided serverInfo or fall back to internal MCP configuration\n const effectiveServerInfo =\n serverInfo || this._mcpServerConfig?.serverInfo;\n\n if (!effectiveServerInfo) {\n throw new Error(\n \"No MCP server configuration found. Use withMcp() to configure server info or provide serverInfo parameter.\",\n );\n }\n\n logger.mcpError(\n `Creating MCP server: ${effectiveServerInfo.name} v${effectiveServerInfo.version}`,\n );\n\n // Dynamic import to avoid circular dependencies and support ES modules\n const { McpServer, ResourceTemplate } =\n await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n logger.mcpError(\n \"Successfully imported McpServer and ResourceTemplate from SDK\",\n );\n\n const server = new McpServer({\n name: effectiveServerInfo.name,\n version: effectiveServerInfo.version,\n description: effectiveServerInfo.description,\n });\n\n logger.mcpError(\"Successfully created McpServer instance\");\n\n // Set up lifecycle manager if lifecycle events are configured\n // Skip lifecycle setup during MCP server creation to prevent infinite recursion\n const isInMcpServeMode = process.argv.includes(\"--s-mcp-serve\");\n if (this._mcpServerConfig?.lifecycle && !isInMcpServeMode) {\n const { McpLifecycleManager } = await import(\"../mcp/mcp-lifecycle\");\n\n const lifecycleManager = new McpLifecycleManager(\n this._mcpServerConfig.lifecycle,\n logger,\n effectiveServerInfo,\n this,\n );\n\n // Parse the current process arguments to provide to lifecycle manager\n try {\n // Parse arguments without executing handlers to get flag values\n // Filter out system flags that could cause infinite recursion during server creation\n const filteredArgs = process.argv\n .slice(2)\n .filter(\n (arg) => !arg.startsWith(\"--s-mcp-\") && arg !== \"--s-mcp-serve\",\n );\n const parsedResult = await this.parse(filteredArgs, {\n skipHandlerExecution: true,\n isMcp: true,\n });\n\n // Extract the parsed arguments from the result\n const parsedArgs = (parsedResult as any)?.args || parsedResult || {};\n lifecycleManager.setParsedArgs(parsedArgs);\n\n logger.mcpError(\n `Lifecycle manager initialized with parsed args: ${Object.keys(parsedArgs).join(\", \")}`,\n );\n } catch (parseError) {\n logger.mcpError(\n `Warning: Could not parse arguments for lifecycle manager: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n );\n // Continue without parsed args - will fall back to environment variables\n }\n\n // Wrap the server's connect method to trigger lifecycle events\n const originalConnect = server.connect.bind(server);\n server.connect = async (transport: any) => {\n logger.mcpError(\"MCP server connecting with lifecycle events...\");\n\n // Call the original connect method\n const result = await originalConnect(transport);\n\n // Trigger onInitialize event immediately after connection\n // This simulates the initialize request since we can't intercept it directly\n try {\n await lifecycleManager.handleInitialize(\n { name: \"mcp-client\", version: \"1.0.0\" }, // Default client info\n \"2024-11-05\", // Default protocol version\n {}, // Default capabilities\n );\n\n // Trigger onInitialized event after a short delay\n setTimeout(async () => {\n try {\n await lifecycleManager.handleInitialized();\n } catch (error) {\n logger.mcpError(\n `Lifecycle onInitialized error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }, 100);\n } catch (error) {\n logger.mcpError(\n `Lifecycle onInitialize error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return result;\n };\n\n // Store lifecycle manager for shutdown handling\n (server as any)._lifecycleManager = lifecycleManager;\n\n logger.mcpError(\"Successfully set up MCP lifecycle manager\");\n }\n\n // Note: We now register actual resources and prompts below, so no need for internal handlers\n logger.mcpError(\n \"MCP server will register actual resources and prompts for full capability support\",\n );\n\n // Generate tools from this ArgParser instance\n logger.mcpError(\"Generating MCP tools from ArgParser\");\n const tools = this.toMcpTools(toolOptions);\n logger.mcpError(`Generated ${tools.length} MCP tools`);\n\n // Deduplicate tools by name to avoid registration conflicts\n const uniqueTools = tools.reduce((acc, tool) => {\n if (!acc.find((t) => t.name === tool.name)) {\n acc.push(tool);\n }\n return acc;\n }, [] as IMcpToolStructure[]);\n\n logger.mcpError(\n `After deduplication: ${uniqueTools.length} unique tools`,\n );\n\n // Register tools\n uniqueTools.forEach((tool) => {\n logger.mcpError(`Registering tool: ${tool.name}`);\n\n // MCP SDK expects Zod v3 compatible schemas\n let zodSchema: ZodTypeAny;\n\n // Find the tool configuration to get the flags\n const toolFromUnified = Array.from(this._tools.values()).find(\n (t) => t.name === tool.name,\n );\n const toolFromLegacy = Array.from(this._mcpTools.values()).find(\n (t) => t.name === tool.name,\n );\n\n if (toolFromUnified && toolFromUnified.flags) {\n // Convert flags to Zod schema for unified tools\n zodSchema = convertFlagsToZodSchema(toolFromUnified.flags);\n } else if (toolFromLegacy && toolFromLegacy.inputSchema) {\n // For legacy tools, use the existing Zod schema directly\n zodSchema = toolFromLegacy.inputSchema;\n } else {\n // Fallback for tools with no input parameters - create empty Zod object\n zodSchema = z.object({});\n }\n\n // Convert Zod schema to JSON Schema for MCP SDK\n let mcpCompatibleSchema;\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Preparing schema for tool ${tool.name}`,\n );\n this.logger.error(`[MCP Debug] Input zodSchema:`, zodSchema);\n }\n\n // Use the original Zod v4 schema directly (MCP SDK now supports v4)\n mcpCompatibleSchema = zodSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Successfully prepared schema for tool ${tool.name}`,\n );\n }\n } catch (schemaError) {\n this.logger.error(\n `[MCP Debug] Error preparing schema for tool ${tool.name}:`,\n schemaError,\n );\n throw schemaError;\n }\n\n // Add detailed debug logging for the prepared schema\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Prepared mcpCompatibleSchema for tool ${tool.name}:`,\n JSON.stringify(mcpCompatibleSchema, null, 2),\n );\n this.logger.error(\n `[MCP Debug] Schema properties:`,\n Object.keys(mcpCompatibleSchema || {}),\n );\n this.logger.error(\n `[MCP Debug] Schema def:`,\n (mcpCompatibleSchema as any)?.def,\n );\n this.logger.error(\n `[MCP Debug] Schema shape:`,\n (mcpCompatibleSchema as any)?.shape,\n );\n this.logger.error(\n `[MCP Debug] Schema parse function:`,\n typeof mcpCompatibleSchema?.parse,\n );\n }\n\n // Add debug logging before schema preparation\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] About to prepare schema for tool ${tool.name}`,\n );\n this.logger.error(`[MCP Debug] zodSchema type:`, typeof zodSchema);\n this.logger.error(`[MCP Debug] zodSchema:`, zodSchema);\n this.logger.error(\n `[MCP Debug] zodSchema constructor:`,\n zodSchema?.constructor?.name,\n );\n }\n\n // Debug schema structure if MCP_DEBUG is enabled\n debugSchemaStructure(mcpCompatibleSchema, `Tool ${tool.name} schema`);\n\n // Validate compatibility\n if (!validateMcpSchemaCompatibility(mcpCompatibleSchema)) {\n logger.mcpError(\n `Warning: Schema for tool ${tool.name} may not be fully compatible with MCP SDK`,\n );\n }\n\n const toolConfig: any = {\n title: tool.name, // MCP SDK requires title field\n description: tool.description || \"No description provided.\",\n inputSchema: mcpCompatibleSchema, // Use Zod v3 compatible schema for MCP SDK\n };\n\n // Debug the final toolConfig being passed to registerTool\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Final toolConfig for ${tool.name}:`,\n JSON.stringify(toolConfig, null, 2),\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema type:`,\n typeof toolConfig.inputSchema,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema constructor:`,\n toolConfig.inputSchema?.constructor?.name,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema._def:`,\n toolConfig.inputSchema?._def,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema.shape:`,\n toolConfig.inputSchema?.shape,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema._zod:`,\n toolConfig.inputSchema?._zod,\n );\n this.logger.error(\n `[MCP Debug] Schema keys:`,\n Object.keys(mcpCompatibleSchema || {}),\n );\n this.logger.error(\n `[MCP Debug] About to call server.registerTool with:`,\n {\n name: tool.name,\n description: tool.description,\n inputSchema: mcpCompatibleSchema,\n },\n );\n }\n\n // Include output schema in MCP tool registration for MCP 2025-06-18+ clients\n // The Alcyone Labs MCP SDK fork v1.16.0+ supports outputSchema in registerTool\n // This is conditionally enabled based on negotiated protocol version\n // Output schemas must be converted to Zod schema objects before passing to MCP SDK\n if (tool.outputSchema && this.supportsOutputSchemas()) {\n // Convert outputSchema to Zod schema (handles plain objects, patterns, and existing Zod schemas)\n const convertedOutputSchema = createOutputSchema(tool.outputSchema);\n toolConfig.outputSchema = convertedOutputSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Including outputSchema for tool '${tool.name}':`,\n typeof tool.outputSchema,\n );\n this.logger.error(\n `[MCP Debug] Converted outputSchema constructor:`,\n convertedOutputSchema?.constructor?.name,\n );\n this.logger.error(\n `[MCP Debug] supportsOutputSchemas():`,\n this.supportsOutputSchemas(),\n );\n }\n } else if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] NOT including outputSchema for tool '${tool.name}':`,\n `hasOutputSchema=${!!tool.outputSchema}, supportsOutputSchemas=${this.supportsOutputSchemas()}`,\n );\n }\n\n // Simple tool execution that matches the working minimal MCP server pattern\n const simpleExecute = async (args: any) => {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Simple Execute] 🎯 TOOL CALLED: '${tool.name}' with args:`,\n JSON.stringify(args, null, 2),\n );\n }\n\n try {\n // Call the tool's execute method directly\n const result = await tool.execute(args);\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Simple Execute] Tool '${tool.name}' returned:`,\n JSON.stringify(result, null, 2),\n );\n }\n\n // If result already has content field, return as-is\n if (\n result &&\n typeof result === \"object\" &&\n result.content &&\n Array.isArray(result.content)\n ) {\n return result;\n }\n\n // Otherwise, wrap in MCP content format\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n typeof result === \"string\"\n ? result\n : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Simple Execute] Tool '${tool.name}' error:`,\n errorMessage,\n );\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${errorMessage}`,\n },\n ],\n isError: true,\n };\n }\n };\n\n server.registerTool(tool.name, toolConfig, simpleExecute);\n });\n\n logger.mcpError(\"Successfully registered all tools with MCP server\");\n\n // Register MCP resources\n const resources = this.getMcpResources();\n logger.mcpError(`Registering ${resources.length} MCP resources`);\n\n resources.forEach((resource) => {\n try {\n const resourceConfig = {\n title: resource.title || resource.name,\n description: resource.description || `Resource: ${resource.name}`,\n mimeType: resource.mimeType || \"application/json\",\n };\n\n // Handle different URI template types\n if (resource.uriTemplate.includes(\"{\")) {\n // URI template with parameters\n const resourceTemplate = new ResourceTemplate(\n resource.uriTemplate,\n { list: undefined },\n );\n const templateHandler = async (uri: any, params: any = {}) => {\n try {\n const result = await resource.handler(\n new URL(uri.href || uri),\n params,\n );\n // Convert our format to MCP SDK format\n return {\n contents: result.contents.map((content) => {\n const mcpContent: any = {\n uri: content.uri,\n };\n if (content.text !== undefined) {\n mcpContent.text = content.text;\n }\n if (content.blob !== undefined) {\n mcpContent.blob = content.blob;\n }\n if (content.mimeType !== undefined) {\n mcpContent.mimeType = content.mimeType;\n }\n return mcpContent;\n }),\n };\n } catch (error) {\n logger.mcpError(\n `Resource template handler error for ${resource.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n };\n server.registerResource(\n resource.name,\n resourceTemplate,\n resourceConfig,\n templateHandler,\n );\n } else {\n // Simple URI string\n const resourceHandler = async (uri: any) => {\n try {\n const result = await resource.handler(\n new URL(uri.href || uri),\n {},\n );\n // Convert our format to MCP SDK format\n return {\n contents: result.contents.map((content) => {\n const mcpContent: any = {\n uri: content.uri,\n };\n if (content.text !== undefined) {\n mcpContent.text = content.text;\n }\n if (content.blob !== undefined) {\n mcpContent.blob = content.blob;\n }\n if (content.mimeType !== undefined) {\n mcpContent.mimeType = content.mimeType;\n }\n return mcpContent;\n }),\n };\n } catch (error) {\n logger.mcpError(\n `Resource handler error for ${resource.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n };\n server.registerResource(\n resource.name,\n resource.uriTemplate,\n resourceConfig,\n resourceHandler,\n );\n }\n\n logger.mcpError(`Successfully registered resource: ${resource.name}`);\n } catch (error) {\n logger.mcpError(\n `Failed to register resource ${resource.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n });\n\n logger.mcpError(\"Successfully registered all resources with MCP server\");\n\n // Register MCP prompts\n const prompts = this.getMcpPrompts();\n logger.mcpError(`Registering ${prompts.length} MCP prompts`);\n\n prompts.forEach((prompt) => {\n try {\n // Convert Zod v4 schema to MCP SDK compatible format (Zod v3 style)\n let mcpCompatibleSchema;\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Preparing schema for prompt ${prompt.name}`,\n );\n this.logger.error(\n `[MCP Debug] Input argsSchema:`,\n prompt.argsSchema,\n );\n }\n mcpCompatibleSchema = prompt.argsSchema;\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Successfully prepared schema for prompt ${prompt.name}`,\n );\n }\n } catch (schemaError) {\n this.logger.error(\n `[MCP Debug] Error preparing schema for prompt ${prompt.name}:`,\n schemaError,\n );\n throw schemaError;\n }\n\n // Validate the converted schema\n if (!validateMcpSchemaCompatibility(mcpCompatibleSchema)) {\n throw new Error(\n `Schema validation failed for prompt ${prompt.name}`,\n );\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n debugSchemaStructure(mcpCompatibleSchema, `prompt ${prompt.name}`);\n }\n\n const promptConfig: any = {\n title: prompt.title || prompt.name, // MCP SDK requires title field\n description: prompt.description || \"No description provided.\",\n argsSchema: mcpCompatibleSchema, // Use Zod v3 compatible schema for MCP SDK\n };\n\n // Create prompt handler that wraps the original handler\n const promptHandler = async (args: any) => {\n try {\n // Validate arguments using the original Zod v4 schema\n const validatedArgs = prompt.argsSchema.parse(args);\n\n // Call the original handler with validated arguments\n const result = await prompt.handler(validatedArgs);\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Prompt '${prompt.name}' executed successfully`,\n );\n }\n\n return result;\n } catch (error) {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Prompt '${prompt.name}' execution error:`,\n error,\n );\n }\n throw error;\n }\n };\n\n server.registerPrompt(\n prompt.name,\n promptConfig,\n promptHandler as any,\n );\n\n logger.mcpError(`Successfully registered prompt: ${prompt.name}`);\n } catch (error) {\n logger.mcpError(\n `Failed to register prompt ${prompt.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n });\n\n logger.mcpError(\"Successfully registered all prompts with MCP server\");\n\n // Set up change notifications\n this.setupMcpChangeNotifications(server);\n logger.mcpError(\"Successfully set up MCP change notifications\");\n\n // Add shutdown handler for lifecycle cleanup\n if ((server as any)._lifecycleManager) {\n const originalClose = server.close?.bind(server);\n server.close = async () => {\n logger.mcpError(\"MCP server shutdown initiated\");\n try {\n await (server as any)._lifecycleManager.handleShutdown(\n \"server_shutdown\",\n );\n } catch (error) {\n logger.mcpError(\n `Error during lifecycle shutdown: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (originalClose) {\n await originalClose();\n }\n };\n }\n\n return server;\n } catch (error) {\n logger.mcpError(\n `Error creating MCP server: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n logger.mcpError(`Stack trace: ${error.stack}`);\n }\n throw error;\n }\n }\n\n /**\n * Set up change notifications for the MCP server\n * @param _server The MCP server instance (unused for now, but reserved for future client connection tracking)\n */\n private setupMcpChangeNotifications(_server: any): void {\n // Set up connection tracking (this would be enhanced with actual client connections)\n // For now, we'll set up the infrastructure for future client management\n\n // Add listeners for resource/prompt changes to notify the server\n this.onMcpChange((event) => {\n // When resources/prompts change, we could notify connected clients\n // The actual notification sending would happen when clients are connected\n const logger = createMcpLogger(\"MCP Change Notifications\");\n logger.mcpError(\n `MCP ${event.type} ${event.action}: ${event.entityName || \"unknown\"}`,\n );\n });\n }\n\n /**\n * Start an MCP server using stdio transport\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when server is connected\n */\n public async startMcpServer(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n toolOptions?: GenerateMcpToolsOptions,\n ): Promise<void> {\n return this.startMcpServerWithTransport(\n serverInfo,\n \"stdio\",\n {},\n toolOptions,\n );\n }\n\n /**\n * Start an MCP server with multiple transport types simultaneously\n * @param serverInfo Server configuration\n * @param transports Array of transport configurations\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when all servers are started\n */\n public async startMcpServerWithMultipleTransports(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n transports: Array<{\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions;\n auth?: AuthOptions;\n }>,\n toolOptions?: GenerateMcpToolsOptions,\n logPath?: LogPath,\n ): Promise<void> {\n const server = await this.createMcpServer(serverInfo, toolOptions, logPath);\n const startPromises: Promise<void>[] = [];\n\n for (const transportConfig of transports) {\n const promise = this.#_startSingleTransport(\n server,\n serverInfo,\n transportConfig,\n logPath,\n );\n startPromises.push(promise);\n }\n\n await Promise.all(startPromises);\n }\n\n /**\n * Start an MCP server with a specific transport type\n * @param serverInfo Server configuration\n * @param transportType Type of transport to use\n * @param transportOptions Transport-specific options\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when server is connected\n */\n public async startMcpServerWithTransport(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n transportType: \"stdio\" | \"sse\" | \"streamable-http\",\n transportOptions: {\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions;\n auth?: AuthOptions;\n } = {},\n toolOptions?: GenerateMcpToolsOptions,\n logPath?: LogPath,\n ): Promise<void> {\n const server = await this.createMcpServer(serverInfo, toolOptions, logPath);\n await this.#_startSingleTransport(\n server,\n serverInfo,\n {\n type: transportType,\n ...transportOptions,\n },\n logPath,\n );\n }\n\n /**\n * Private helper method to start a single transport\n */\n async #_startSingleTransport(\n server: any,\n serverInfo: { name: string; version: string; description?: string },\n transportConfig: {\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions;\n auth?: AuthOptions;\n },\n logPath?: LogPath,\n ): Promise<void> {\n const resolvedLogPath = resolveLogPath(logPath || \"./logs/mcp.log\");\n const logger = createMcpLogger(\"MCP Transport\", resolvedLogPath);\n\n try {\n logger.mcpError(\n `Starting ${transportConfig.type} transport for server: ${serverInfo.name}`,\n );\n\n switch (transportConfig.type) {\n case \"stdio\": {\n logger.mcpError(\"Importing StdioServerTransport from SDK\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n logger.mcpError(\"Creating StdioServerTransport instance\");\n const transport = new StdioServerTransport();\n logger.mcpError(\"Connecting server to stdio transport\");\n await server.connect(transport);\n logger.mcpError(\"Successfully connected to stdio transport\");\n break;\n }\n\n case \"sse\": {\n const { SSEServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/sse.js\");\n const express = (await import(\"express\")).default;\n\n const app = express();\n app.use(express.json());\n\n const port = transportConfig.port || 3000;\n const path = transportConfig.path || \"/sse\";\n\n app.get(path, (_req: any, res: any) => {\n const transport = new SSEServerTransport(path, res);\n server.connect(transport);\n });\n\n await new Promise<void>((resolve) => {\n app.listen(port, transportConfig.host || \"localhost\", () => {\n this.logger.error(\n `[${serverInfo.name}] MCP Server listening on http://${transportConfig.host || \"localhost\"}:${port}${path} (SSE)`,\n );\n resolve();\n });\n });\n break;\n }\n\n case \"streamable-http\": {\n const { StreamableHTTPServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const express = (await import(\"express\")).default;\n\n const app = express();\n app.disable(\"x-powered-by\");\n app.use(express.json());\n\n // Add a simple favicon to prevent 404 errors\n app.get(\"/favicon.ico\", (_req, res) => {\n // Simple red dot on white background as SVG\n const favicon = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n <circle cx=\"8\" cy=\"8\" r=\"4\" fill=\"red\"/>\n </svg>`;\n res.setHeader(\"Content-Type\", \"image/svg+xml\");\n res.setHeader(\"Cache-Control\", \"public, max-age=86400\"); // Cache for 1 day\n res.send(favicon);\n });\n\n // Allow user to customize Express before we register routes\n try {\n this._mcpServerConfig?.httpServer?.configureExpress?.(app);\n } catch (e) {\n // ignore hook errors to avoid breaking server start\n }\n\n const port = transportConfig.port || 3000;\n const path = transportConfig.path || \"/mcp\";\n\n // CORS middleware (optional)\n if (transportConfig.cors) {\n const cors = transportConfig.cors;\n const allowMethods =\n cors.methods?.join(\", \") || \"GET,POST,PUT,PATCH,DELETE,OPTIONS\";\n const allowHeaders = (req: any) =>\n cors.headers?.join(\", \") ||\n req.headers[\"access-control-request-headers\"] ||\n \"Content-Type, Authorization, MCP-Session-Id\";\n const exposed = cors.exposedHeaders?.join(\", \") || undefined;\n\n const resolveOrigin = (req: any): string | undefined => {\n const reqOrigin = req.headers.origin as string | undefined;\n const origins = cors.origins ?? \"*\";\n if (origins === \"*\") return cors.credentials ? reqOrigin : \"*\";\n if (!reqOrigin) return undefined;\n const list = Array.isArray(origins) ? origins : [origins];\n for (const o of list) {\n if (typeof o === \"string\" && o === reqOrigin) return reqOrigin;\n if (o instanceof RegExp && o.test(reqOrigin)) return reqOrigin;\n }\n return undefined;\n };\n\n const applyCorsHeaders = (req: any, res: any) => {\n const origin = resolveOrigin(req);\n if (origin) res.setHeader(\"Access-Control-Allow-Origin\", origin);\n if (cors.credentials)\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n res.setHeader(\"Vary\", \"Origin\");\n res.setHeader(\"Access-Control-Allow-Methods\", allowMethods);\n const hdrs = allowHeaders(req);\n if (hdrs) res.setHeader(\"Access-Control-Allow-Headers\", hdrs);\n if (exposed)\n res.setHeader(\"Access-Control-Expose-Headers\", exposed);\n if (typeof cors.maxAge === \"number\")\n res.setHeader(\"Access-Control-Max-Age\", String(cors.maxAge));\n };\n\n app.options(path, (req: any, res: any) => {\n applyCorsHeaders(req, res);\n res.status(204).end();\n });\n\n app.use((req: any, res: any, next: any) => {\n if (req.path === path) applyCorsHeaders(req, res);\n next();\n });\n }\n\n // Custom auth middleware hook (optional)\n if (transportConfig.auth?.customMiddleware) {\n app.use(transportConfig.auth.customMiddleware);\n }\n\n // Built-in auth (optional)\n const authOpts = transportConfig.auth;\n const shouldRequireAuthFor = (req: any): boolean => {\n if (!authOpts) return false;\n const reqPath = req.path;\n const pub = authOpts.publicPaths || [];\n const prot = authOpts.protectedPaths;\n if (pub.includes(reqPath)) return false;\n if (prot && !prot.includes(reqPath)) return false;\n return authOpts.required !== false; // default true\n };\n\n // Minimal JWT verifier supporting HS256 and RS256\n const base64urlDecode = (s: string) =>\n Buffer.from(s.replace(/-/g, \"+\").replace(/_/g, \"/\"), \"base64\");\n const verifyJwt = async (token: string): Promise<boolean> => {\n if (!authOpts?.jwt) return false;\n const [h, p, sig] = token.split(\".\");\n if (!h || !p || !sig) return false;\n const header = JSON.parse(base64urlDecode(h).toString(\"utf8\"));\n const payload = JSON.parse(base64urlDecode(p).toString(\"utf8\"));\n const alg = header.alg as \"HS256\" | \"RS256\";\n if (\n authOpts.jwt.algorithms &&\n !authOpts.jwt.algorithms.includes(alg)\n )\n return false;\n const data = Buffer.from(`${h}.${p}`);\n const signature = base64urlDecode(sig);\n if (alg === \"HS256\") {\n const secret = authOpts.jwt.secret;\n if (!secret) return false;\n const hmac = (await import(\"node:crypto\"))\n .createHmac(\"sha256\", secret)\n .update(data)\n .digest();\n if (!hmac.equals(signature)) return false;\n } else if (alg === \"RS256\") {\n const crypto = await import(\"node:crypto\");\n let key = authOpts.jwt.publicKey;\n if (!key && authOpts.jwt.getPublicKey) {\n key = await authOpts.jwt.getPublicKey(header, payload);\n }\n if (!key) return false;\n const verify = crypto.createVerify(\"RSA-SHA256\");\n verify.update(data);\n verify.end();\n const ok = verify.verify(key, signature);\n if (!ok) return false;\n } else {\n return false;\n }\n // Optional audience/issuer checks\n if (authOpts.jwt.audience) {\n const allowed = Array.isArray(authOpts.jwt.audience)\n ? authOpts.jwt.audience\n : [authOpts.jwt.audience];\n if (!allowed.includes(payload.aud)) return false;\n }\n if (authOpts.jwt.issuer) {\n const allowed = Array.isArray(authOpts.jwt.issuer)\n ? authOpts.jwt.issuer\n : [authOpts.jwt.issuer];\n if (!allowed.includes(payload.iss)) return false;\n }\n const nowSec = Math.floor(Date.now() / 1000);\n const tol = authOpts.jwt.clockToleranceSec || 0;\n if (payload.nbf && nowSec + tol < payload.nbf) return false;\n if (payload.exp && nowSec - tol >= payload.exp) return false;\n return true;\n };\n\n const authenticate = async (req: any): Promise<boolean> => {\n if (!authOpts) return true;\n const authz = req.headers.authorization as string | undefined;\n const token = authz?.startsWith(\"Bearer \")\n ? authz.slice(7)\n : undefined;\n if (!token) {\n // allow custom validator to decide on missing token\n if (authOpts.validator)\n return !!(await authOpts.validator(req, token));\n return false;\n }\n if (authOpts.scheme === \"jwt\" || authOpts.jwt) {\n const ok = await verifyJwt(token);\n if (!ok) return false;\n } else if (authOpts.scheme === \"bearer\" || !authOpts.scheme) {\n if (\n authOpts.allowedTokens &&\n !authOpts.allowedTokens.includes(token)\n ) {\n // fall through to validator if provided\n if (authOpts.validator)\n return !!(await authOpts.validator(req, token));\n return false;\n }\n }\n if (authOpts.validator) {\n const ok = await authOpts.validator(req, token);\n if (!ok) return false;\n }\n return true;\n };\n\n const transports: { [sessionId: string]: any } = {};\n\n app.all(path, async (req: any, res: any) => {\n if (shouldRequireAuthFor(req)) {\n const ok = await authenticate(req);\n if (!ok) {\n res.status(401).json({ error: \"Unauthorized\" });\n return;\n }\n }\n\n const sessionId = req.headers[\"mcp-session-id\"] as\n | string\n | undefined;\n let transport: any;\n\n if (sessionId && transports[sessionId]) {\n transport = transports[sessionId];\n } else {\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator:\n transportConfig.sessionIdGenerator ||\n (() => Math.random().toString(36).substring(7)),\n onsessioninitialized: (sessionId: string) => {\n transports[sessionId] = transport;\n },\n });\n\n transport.onclose = () => {\n if (transport.sessionId) delete transports[transport.sessionId];\n };\n\n await server.connect(transport);\n }\n\n await transport.handleRequest(req, res, req.body);\n });\n\n await new Promise<void>((resolve) => {\n app.listen(port, transportConfig.host || \"localhost\", () => {\n resolve();\n });\n });\n break;\n }\n\n default:\n logger.mcpError(\n `Unsupported transport type: ${transportConfig.type}`,\n );\n throw new Error(\n `Unsupported transport type: ${transportConfig.type}`,\n );\n }\n\n logger.mcpError(`Successfully started ${transportConfig.type} transport`);\n } catch (error) {\n logger.mcpError(\n `Error starting ${transportConfig.type} transport: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n logger.mcpError(`Stack trace: ${error.stack}`);\n }\n throw error;\n }\n }\n\n public async parse(processArgs?: string[], options?: any): Promise<any> {\n debug.log(\"ArgParser.parse() called with args:\", processArgs);\n // Call the base class parse method directly to avoid any override issues\n debug.log(\"About to call ArgParserBase.prototype.parse.call()\");\n let result = await ArgParserBase.prototype.parse.call(\n this,\n processArgs,\n options,\n );\n debug.log(\"ArgParserBase.prototype.parse.call() returned:\", typeof result);\n\n // If fuzzy mode prevented execution, return the result as-is\n const anyResult = result as any;\n if (anyResult._fuzzyModePreventedExecution) {\n return result;\n }\n\n // Only process async handler promise if deep option is true (default) and ArgParserBase didn't handle it\n // When deep is false, leave _asyncHandlerPromise for manual handling\n const shouldAutoProcess = options?.deep !== false;\n if (shouldAutoProcess && (result as any)._asyncHandlerPromise) {\n result = await this.#processAsyncHandlerPromise(result);\n }\n\n return result;\n }\n\n /**\n * CLI-friendly parse method that automatically handles ParseResult objects\n * When autoExit is false, this method will call process.exit() based on ParseResult\n * This ensures backward compatibility for CLI applications\n */\n public parseForCli(processArgs?: string[], options?: any): any {\n const result = this.parse(processArgs, options);\n\n // Handle ParseResult objects when autoExit is false\n if (\n result &&\n typeof result === \"object\" &&\n \"success\" in result &&\n \"exitCode\" in result\n ) {\n const parseResult = result as ParseResult;\n if (\n parseResult.shouldExit &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(parseResult.exitCode as never);\n }\n }\n\n return result;\n }\n\n /**\n * Alias for parse() method for backward compatibility\n * Since parse() is already async, this just calls parse()\n *\n * @deprecated Use parse() instead. This method will be removed in a future version.\n */\n public parseAsync(processArgs?: string[], options?: any): Promise<any> {\n return this.parse(processArgs, options);\n }\n\n /**\n * Convenience method for auto-execution: only runs if the script is executed directly (not imported).\n * This eliminates the need for boilerplate code to check if the script is being run directly.\n *\n * @param importMetaUrl Pass import.meta.url from your script for reliable detection\n * @param processArgs Optional arguments to parse (defaults to process.argv.slice(2))\n * @param options Additional parse options\n * @returns Promise that resolves to the parse result, or empty object if script is imported\n *\n * @example\n * ```typescript\n * // At the bottom of your CLI script:\n * await cli.parseIfExecutedDirectly(import.meta.url);\n *\n * // With error handling:\n * await cli.parseIfExecutedDirectly(import.meta.url).catch((error) => {\n * this.logger.error(\"Fatal error:\", error instanceof Error ? error.message : String(error));\n * process.exit(1);\n * });\n * ```\n */\n public async parseIfExecutedDirectly(\n importMetaUrl: string,\n processArgs?: string[],\n options?: any,\n ): Promise<any> {\n return this.parse(processArgs, {\n ...options,\n autoExecute: true,\n importMetaUrl,\n });\n }\n\n async #processAsyncHandlerPromise(result: any): Promise<any> {\n const anyResult = result as any;\n\n // Check if there's an async handler that needs to be awaited\n if (anyResult._asyncHandlerPromise) {\n try {\n const handlerResult = await anyResult._asyncHandlerPromise;\n anyResult.handlerResponse = handlerResult;\n\n // Merge handler result into final args if it's an object\n if (\n handlerResult &&\n typeof handlerResult === \"object\" &&\n !Array.isArray(handlerResult)\n ) {\n Object.assign(anyResult, handlerResult);\n }\n } catch (error) {\n // Handle async handler errors - respect the handleErrors setting\n if ((this as any)[\"#handleErrors\"]) {\n // When handleErrors is true, catch and wrap the error\n anyResult.$error = {\n type: \"handler_error\",\n message: error instanceof Error ? error.message : String(error),\n details: error,\n };\n } else {\n // When handleErrors is false, throw the error (consistent with sync behavior)\n throw error;\n }\n }\n\n // Clean up the async handler info\n delete anyResult._asyncHandlerPromise;\n delete anyResult._asyncHandlerInfo;\n }\n\n return result;\n }\n\n /**\n * Add an MCP sub-command that starts an MCP server exposing this parser's functionality\n * @param subCommandName Name of the sub-command (default: \"mcp-server\")\n * @param serverInfo Server configuration (supports extended DXT fields)\n * @param options Optional configuration including preset transports and tool options\n * @returns This ArgParserWithMcp instance for chaining\n * @deprecated Use withMcp() to configure server metadata and --s-mcp-serve system flag instead. This method will be removed in v2.0.\n */\n public addMcpSubCommand(\n subCommandName: string | undefined,\n serverInfo: DxtServerInfo,\n options?: McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions },\n ): this;\n\n /**\n * Add an MCP sub-command that starts an MCP server exposing this parser's functionality\n * @param subCommandName Name of the sub-command (default: \"mcp-server\")\n * @param serverInfo Server configuration (supports extended DXT fields)\n * @param toolOptions Optional MCP tool generation options (backward compatibility)\n * @returns This ArgParserWithMcp instance for chaining\n * @deprecated Use withMcp() to configure server metadata and --s-mcp-serve system flag instead. This method will be removed in v2.0.\n */\n public addMcpSubCommand(\n subCommandName: string | undefined,\n serverInfo: DxtServerInfo,\n toolOptions?: GenerateMcpToolsOptions,\n ): this;\n\n public addMcpSubCommand(\n subCommandName: string | undefined = \"mcp-server\",\n serverInfo: DxtServerInfo,\n optionsOrToolOptions?:\n | (McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions })\n | GenerateMcpToolsOptions,\n ): this {\n // Emit deprecation warning\n console.warn(`[DEPRECATED] addMcpSubCommand() is deprecated and will be removed in v2.0.\nPlease use withMcp() to configure server metadata and the --s-mcp-serve system flag instead.\nMigration guide: https://github.com/alcyone-labs/arg-parser/blob/main/docs/MCP-MIGRATION.md`);\n\n // Handle backward compatibility: if the third parameter is a GenerateMcpToolsOptions object\n // (detected by checking if it has properties that only exist in GenerateMcpToolsOptions)\n let options: McpSubCommandOptions & {\n toolOptions?: GenerateMcpToolsOptions;\n };\n\n if (\n optionsOrToolOptions &&\n typeof optionsOrToolOptions === \"object\" &&\n (\"includeSubCommands\" in optionsOrToolOptions ||\n \"toolNamePrefix\" in optionsOrToolOptions ||\n \"toolNameSuffix\" in optionsOrToolOptions)\n ) {\n // This is the old GenerateMcpToolsOptions format\n options = {\n toolOptions: optionsOrToolOptions as GenerateMcpToolsOptions,\n };\n } else {\n // This is the new options format or undefined\n options =\n (optionsOrToolOptions as McpSubCommandOptions & {\n toolOptions?: GenerateMcpToolsOptions;\n }) || {};\n }\n\n const { defaultTransports, defaultTransport, toolOptions } = options;\n\n // Store server configuration for backward compatibility with --s-mcp-serve\n if (!this._mcpServerConfig) {\n this._mcpServerConfig = {\n serverInfo,\n defaultTransports,\n defaultTransport,\n toolOptions,\n };\n }\n\n const mcpHandler = async (ctx: IHandlerContext): Promise<void> => {\n // Hijack console globally to prevent STDOUT contamination in MCP mode\n // TODO: upgrade to options-based API\n const logger = createMcpLogger(\"MCP Handler\");\n // Ensure the logger is properly cast as Console interface\n (globalThis as any).console = logger;\n\n try {\n logger.mcpError(\n \"MCP handler started - console hijacked for MCP safety\",\n );\n logger.mcpError(`Handler context args: ${JSON.stringify(ctx.args)}`);\n\n if (!ctx.parentParser) {\n logger.mcpError(\n \"Critical: MCP server handler called without a parent parser context.\",\n );\n process.exit(1);\n }\n\n logger.mcpError(\"Parent parser found, casting to ArgParser\");\n // Cast parent parser to ArgParser to access MCP methods\n const mcpParser = ctx.parentParser as ArgParser;\n\n // Check if multiple transports are specified via CLI\n logger.mcpError(\"Checking transport configuration\");\n const transports = ctx.args[\"transports\"] as string;\n\n if (transports) {\n logger.mcpError(\n `Multiple transports specified via CLI: ${transports}`,\n );\n // Parse multiple transports configuration from CLI\n try {\n const transportConfigs = JSON.parse(transports);\n logger.mcpError(\n `Parsed transport configs: ${JSON.stringify(transportConfigs)}`,\n );\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n transportConfigs,\n toolOptions,\n );\n } catch (error: any) {\n logger.mcpError(\n `Error parsing transports configuration: ${error.message}`,\n );\n logger.mcpError(\n 'Expected JSON format: \\'[{\"type\":\"stdio\"},{\"type\":\"sse\",\"port\":3001}]\\'',\n );\n process.exit(1);\n }\n } else if (defaultTransports && defaultTransports.length > 0) {\n logger.mcpError(\n `Using preset multiple transports: ${JSON.stringify(defaultTransports)}`,\n );\n // Use preset multiple transports configuration\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n defaultTransports,\n toolOptions,\n );\n } else if (defaultTransport) {\n logger.mcpError(\n `Using preset single transport: ${JSON.stringify(defaultTransport)}`,\n );\n // Use preset single transport configuration\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n defaultTransport.type,\n {\n port: defaultTransport.port,\n host: defaultTransport.host,\n path: defaultTransport.path,\n sessionIdGenerator: defaultTransport.sessionIdGenerator,\n },\n toolOptions,\n );\n } else {\n // Single transport mode from CLI flags (backwards compatibility)\n const transportType =\n (ctx.args[\"transport\"] as \"stdio\" | \"sse\" | \"streamable-http\") ||\n \"stdio\";\n const transportOptions = {\n port: ctx.args[\"port\"] as number,\n host: ctx.args[\"host\"] as string,\n path: ctx.args[\"path\"] as string,\n };\n\n logger.mcpError(\n `Using single transport mode: ${transportType} with options: ${JSON.stringify(transportOptions)}`,\n );\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n transportType,\n transportOptions,\n toolOptions,\n );\n }\n\n logger.mcpError(\"MCP server setup completed, keeping process alive\");\n // Keep the process alive\n return new Promise(() => {});\n } catch (error) {\n logger.mcpError(\n `Error in MCP handler: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n logger.mcpError(`Stack trace: ${error.stack}`);\n }\n process.exit(1);\n }\n };\n\n // Create sub-command parser without transport options (now handled as system flags)\n const mcpSubParser = new ArgParserBase({}, []);\n\n this.addSubCommand({\n name: subCommandName,\n description: `Start ${serverInfo.name} as an MCP server`,\n handler: mcpHandler,\n parser: mcpSubParser,\n isMcp: true,\n mcpServerInfo: serverInfo,\n mcpToolOptions: toolOptions,\n });\n\n return this;\n }\n\n /**\n * Factory method to create an ArgParser instance with MCP capabilities\n * This provides a clean API for users who want MCP functionality from the start\n * Automatically sets handleErrors: false for MCP compatibility\n *\n * @param options Combined ArgParser and MCP server configuration options\n * @param initialFlags Optional array of initial flags to add\n * @returns ArgParser instance with MCP capabilities and stored server metadata\n */\n public static withMcp<T = any>(\n options?: WithMcpOptions<T>,\n initialFlags?: readonly IFlag[],\n ): ArgParser<T> {\n // Extract MCP-specific options\n const { mcp: mcpConfig, ...argParserOptions } = options || {};\n\n // Ensure handleErrors is false for MCP compatibility unless explicitly overridden\n const mcpOptions = {\n handleErrors: false,\n ...argParserOptions,\n };\n\n const parser = new ArgParser<T>(mcpOptions as any, initialFlags);\n\n // Store MCP server configuration for later use\n if (mcpConfig) {\n (parser as any)._mcpServerConfig = mcpConfig;\n }\n\n return parser;\n }\n\n /**\n * Create an ArgParser instance optimized for CLI usage\n * This sets autoExit: true by default for traditional CLI behavior\n */\n public static forCli<T = any>(\n options?: ConstructorParameters<typeof ArgParserBase>[0],\n initialFlags?: ConstructorParameters<typeof ArgParserBase>[1],\n ): ArgParser<T> {\n const cliOptions = {\n autoExit: true,\n handleErrors: true,\n ...options,\n };\n return new ArgParser<T>(cliOptions as any, initialFlags);\n }\n\n /**\n * Create an ArgParser instance optimized for library usage\n * This sets autoExit: false by default for programmatic control\n */\n public static forLibrary<T = any>(\n options?: ConstructorParameters<typeof ArgParserBase>[0],\n initialFlags?: ConstructorParameters<typeof ArgParserBase>[1],\n ): ArgParser<T> {\n const libraryOptions = {\n autoExit: false,\n handleErrors: false,\n ...options,\n };\n return new ArgParser<T>(libraryOptions as any, initialFlags);\n }\n\n public static fromArgParser<T = any>(parser: ArgParserBase<T>): ArgParser<T> {\n const originalParser = parser as any;\n\n const mcpParser = new ArgParser<T>({\n appName: originalParser.getAppName(),\n appCommandName: originalParser.getAppCommandName(),\n description: originalParser.getDescription(),\n handler: originalParser.getHandler(),\n handleErrors: originalParser[\"#handleErrors\"],\n throwForDuplicateFlags: originalParser[\"#throwForDuplicateFlags\"],\n });\n\n // Copy flags from original parser (excluding help flag which is auto-added)\n const originalFlags = originalParser.flags.filter(\n (flag: any) => flag.name !== \"help\",\n );\n if (originalFlags.length > 0) {\n mcpParser.addFlags(originalFlags);\n }\n\n // Copy additional private fields that aren't in constructor options\n const newParser = mcpParser as any;\n newParser[\"#subCommandName\"] = originalParser[\"#subCommandName\"];\n newParser[\"#parameters\"] = originalParser[\"#parameters\"];\n newParser[\"#parentParser\"] = originalParser[\"#parentParser\"];\n newParser[\"#lastParseResult\"] = originalParser[\"#lastParseResult\"];\n newParser[\"#inheritParentFlags\"] = originalParser[\"#inheritParentFlags\"];\n newParser[\"#subCommands\"] = originalParser[\"#subCommands\"];\n\n return mcpParser;\n }\n}\n","import { ArgParser } from \"../core/ArgParser\";\nimport type { IArgParserParams } from \"../core/ArgParserBase\";\nimport type { IFlag } from \"../core/types\";\n\n/**\n * MCP-optimized ArgParser that excludes config file functionality\n * This version doesn't load any config plugins, making it suitable for\n * autonomous builds where TOML/YAML dependencies cause bundling issues.\n */\nexport class ArgParserMcp<\n THandlerReturn = any,\n> extends ArgParser<THandlerReturn> {\n constructor(\n params?: IArgParserParams<THandlerReturn>,\n initialFlags?: IFlag[],\n ) {\n // Set a flag to indicate this is MCP mode (no config plugins)\n const mcpParams = {\n ...params,\n _mcpMode: true, // Internal flag to disable config functionality\n };\n super(mcpParams as any, initialFlags);\n }\n\n /**\n * Override parse to skip config file processing\n */\n public parse(processArgs: string[], options?: any): any {\n // Filter out config-related system flags before parsing\n const filteredArgs = processArgs.filter(\n (arg) =>\n !arg.startsWith(\"--s-with-env\") &&\n !arg.startsWith(\"--s-save-to-env\") &&\n !arg.startsWith(\"--s-load-env\"),\n );\n\n return super.parse(filteredArgs, options);\n }\n}\n\n/**\n * Convenience function to create MCP-optimized ArgParser\n * This is the recommended way to create ArgParser instances for MCP servers\n */\nexport function createMcpArgParser<THandlerReturn = any>(\n params?: IArgParserParams<THandlerReturn>,\n initialFlags?: IFlag[],\n): ArgParserMcp<THandlerReturn> {\n return ArgParserMcp.withMcp(params, initialFlags);\n}\n","import { ConfigPlugin } from \"./ConfigPlugin\";\n\n/**\n * TOML configuration plugin (requires smol-toml dependency)\n * This plugin is optional and only loaded when TOML support is needed\n */\nexport class TomlConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".toml\", \".tml\"];\n readonly name = \"toml\";\n\n private tomlModule: any = null;\n\n constructor(tomlModule?: any) {\n super();\n if (tomlModule) {\n this.tomlModule = tomlModule;\n } else {\n this.loadTomlModule();\n }\n }\n\n private loadTomlModule(): void {\n try {\n // Dynamic import to avoid bundling issues\n if (typeof require !== \"undefined\") {\n this.tomlModule = require(\"smol-toml\");\n } else {\n // For ESM environments, we need to use dynamic import\n // This will be handled asynchronously in the factory function\n throw new Error(\"TOML module not available in this environment\");\n }\n } catch (error) {\n throw new Error(\n \"TOML plugin requires smol-toml dependency. \" +\n \"Install it with: npm install smol-toml\",\n );\n }\n }\n\n parse(content: string): Record<string, any> {\n if (!this.tomlModule) {\n // Fallback to simple parsing if module not available\n return this.parseTomlSimple(content);\n }\n\n try {\n const parsed = this.tomlModule.parse(content);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"TOML file must contain an object at the root level\");\n }\n return parsed;\n } catch (error) {\n throw new Error(\n `Failed to parse TOML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration generated by ArgParser\");\n lines.push(\"# Format: TOML\");\n lines.push(\"\");\n\n const configWithValues: Record<string, any> = {};\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n lines.push(`# ${flag.description || flag.name}`);\n lines.push(`# Type: ${this.getTypeString(flag.type)}`);\n\n if (flag.defaultValue !== undefined) {\n lines.push(`# Default: ${flag.defaultValue}`);\n }\n\n if (isSet) {\n configWithValues[flag.name] = flagValue;\n } else if (isMandatory) {\n configWithValues[flag.name] =\n flag.defaultValue !== undefined ? flag.defaultValue : null;\n }\n\n lines.push(\"\");\n }\n\n if (!this.tomlModule) {\n // Simple TOML generation if module not available\n for (const [key, value] of Object.entries(configWithValues)) {\n if (typeof value === \"string\") {\n lines.push(`${key} = \"${value}\"`);\n } else {\n lines.push(`${key} = ${JSON.stringify(value)}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n try {\n const tomlContent = this.tomlModule.stringify(configWithValues);\n return lines.join(\"\\n\") + \"\\n\" + tomlContent;\n } catch (error) {\n throw new Error(\n `Failed to generate TOML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Simple TOML parsing fallback for basic key-value pairs\n */\n private parseTomlSimple(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n private getTypeString(type: any): string {\n if (typeof type === \"function\") {\n return type.name || \"custom function\";\n }\n return String(type).toLowerCase();\n }\n}\n\n/**\n * Factory function to create TOML plugin safely\n * Returns null if TOML dependency is not available\n */\nexport function createTomlPlugin(): TomlConfigPlugin | null {\n try {\n return new TomlConfigPlugin();\n } catch (error) {\n console.warn(\n \"TOML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n\n/**\n * Async factory function to create TOML plugin with ESM support\n * Returns null if TOML dependency is not available\n */\nexport async function createTomlPluginAsync(): Promise<TomlConfigPlugin | null> {\n try {\n // Try CommonJS first\n if (typeof require !== \"undefined\") {\n try {\n const tomlModule = require(\"smol-toml\");\n return new TomlConfigPlugin(tomlModule);\n } catch (error) {\n // Fall through to ESM import\n }\n }\n\n // Try ESM dynamic import\n const tomlModule = await import(\"smol-toml\");\n return new TomlConfigPlugin(tomlModule);\n } catch (error) {\n console.warn(\n \"TOML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n","import { ConfigPlugin } from \"./ConfigPlugin\";\n\n/**\n * YAML configuration plugin (requires js-yaml dependency)\n * This plugin is optional and only loaded when YAML support is needed\n */\nexport class YamlConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".yaml\", \".yml\"];\n readonly name = \"yaml\";\n\n private yamlModule: any = null;\n\n constructor(yamlModule?: any) {\n super();\n if (yamlModule) {\n this.yamlModule = yamlModule;\n } else {\n this.loadYamlModule();\n }\n }\n\n private loadYamlModule(): void {\n try {\n // Dynamic import to avoid bundling issues\n if (typeof require !== \"undefined\") {\n this.yamlModule = require(\"js-yaml\");\n } else {\n throw new Error(\"YAML module not available in this environment\");\n }\n } catch (error) {\n throw new Error(\n \"YAML plugin requires js-yaml dependency. \" +\n \"Install it with: npm install js-yaml\",\n );\n }\n }\n\n parse(content: string): Record<string, any> {\n if (!this.yamlModule) {\n // Fallback to simple parsing if module not available\n return this.parseYamlSimple(content);\n }\n\n try {\n const parsed = this.yamlModule.load(content);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"YAML file must contain an object at the root level\");\n }\n return parsed;\n } catch (error) {\n throw new Error(\n `Failed to parse YAML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration generated by ArgParser\");\n lines.push(\"# Format: YAML\");\n lines.push(\"\");\n\n const configWithValues: Record<string, any> = {};\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n if (isSet) {\n configWithValues[flag.name] = flagValue;\n } else if (isMandatory) {\n configWithValues[flag.name] =\n flag.defaultValue !== undefined ? flag.defaultValue : null;\n }\n }\n\n if (!this.yamlModule) {\n // Simple YAML generation if module not available\n for (const [key, value] of Object.entries(configWithValues)) {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n return lines.join(\"\\n\");\n }\n\n try {\n const yamlContent = this.yamlModule.dump(configWithValues, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n });\n return lines.join(\"\\n\") + \"\\n\" + yamlContent;\n } catch (error) {\n throw new Error(\n `Failed to generate YAML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Simple YAML parsing fallback for basic key-value pairs\n */\n private parseYamlSimple(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > 0) {\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n}\n\n/**\n * Factory function to create YAML plugin safely\n * Returns null if YAML dependency is not available\n */\nexport function createYamlPlugin(): YamlConfigPlugin | null {\n try {\n return new YamlConfigPlugin();\n } catch (error) {\n console.warn(\n \"YAML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n\n/**\n * Async factory function to create YAML plugin with ESM support\n * Returns null if YAML dependency is not available\n */\nexport async function createYamlPluginAsync(): Promise<YamlConfigPlugin | null> {\n try {\n // Try CommonJS first\n if (typeof require !== \"undefined\") {\n try {\n const yamlModule = require(\"js-yaml\");\n return new YamlConfigPlugin(yamlModule);\n } catch (error) {\n // Fall through to ESM import\n }\n }\n\n // Try ESM dynamic import\n const yamlModule = await import(\"js-yaml\");\n return new YamlConfigPlugin(yamlModule);\n } catch (error) {\n console.warn(\n \"YAML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n","import type { IArgParser, ISubCommand, ProcessedFlag } from \"../core/types\";\n\nexport interface FuzzyTestOptions {\n /** Maximum depth for command path exploration */\n maxDepth?: number;\n /** Number of random test cases to generate per command path */\n randomTestCases?: number;\n /** Include performance timing in results */\n includePerformance?: boolean;\n /** Test invalid combinations to verify error handling */\n testErrorCases?: boolean;\n /** Verbose output for debugging */\n verbose?: boolean;\n}\n\nexport interface TestResult {\n commandPath: string[];\n args: string[];\n success: boolean;\n error?: string;\n executionTime?: number;\n parsedResult?: any;\n}\n\nexport interface FuzzyTestReport {\n totalTests: number;\n successfulTests: number;\n failedTests: number;\n commandPaths: string[][];\n results: TestResult[];\n summary: {\n coverageByPath: Record<string, { total: number; passed: number }>;\n errorTypes: Record<string, number>;\n };\n}\n\nexport class ArgParserFuzzyTester {\n private parser: IArgParser;\n private options: Required<FuzzyTestOptions>;\n\n constructor(parser: IArgParser, options: FuzzyTestOptions = {}) {\n this.parser = parser;\n this.options = {\n maxDepth: options.maxDepth ?? 5,\n randomTestCases: options.randomTestCases ?? 10,\n includePerformance: options.includePerformance ?? true,\n testErrorCases: options.testErrorCases ?? true,\n verbose: options.verbose ?? false,\n };\n }\n\n /**\n * Run comprehensive fuzzy testing on the ArgParser instance\n */\n async runFuzzyTest(): Promise<FuzzyTestReport> {\n const commandPaths = this.discoverCommandPaths();\n const results: TestResult[] = [];\n\n if (this.options.verbose) {\n this.parser.logger.info(\n `Discovered ${commandPaths.length} command paths:`,\n );\n commandPaths.forEach((path) =>\n this.parser.logger.info(` ${path.join(\" \") || \"(root)\"}`),\n );\n }\n\n for (const commandPath of commandPaths) {\n const pathResults = await this.testCommandPath(commandPath);\n results.push(...pathResults);\n }\n\n return this.generateReport(commandPaths, results);\n }\n\n /**\n * Discover all possible command paths in the parser\n */\n private discoverCommandPaths(): string[][] {\n const paths: string[][] = [];\n\n // Add root path\n paths.push([]);\n\n // Recursively discover subcommand paths\n this.discoverSubCommandPaths(this.parser, [], paths, 0);\n\n return paths;\n }\n\n /**\n * Recursively discover subcommand paths\n */\n private discoverSubCommandPaths(\n parser: IArgParser,\n currentPath: string[],\n allPaths: string[][],\n depth: number,\n ): void {\n if (depth >= this.options.maxDepth) return;\n\n const subCommands = this.getSubCommands(parser);\n\n for (const [subCommandName, subCommand] of subCommands) {\n const newPath = [...currentPath, subCommandName];\n allPaths.push(newPath);\n\n // Recursively explore this subcommand's subcommands\n this.discoverSubCommandPaths(\n subCommand.parser,\n newPath,\n allPaths,\n depth + 1,\n );\n }\n }\n\n /**\n * Get subcommands from a parser instance\n */\n private getSubCommands(parser: IArgParser): Map<string, ISubCommand> {\n return parser.getSubCommands();\n }\n\n /**\n * Get flags from a parser instance\n */\n private getFlags(parser: IArgParser): ProcessedFlag[] {\n return parser.flags;\n }\n\n /**\n * Test a specific command path with various flag combinations\n */\n private async testCommandPath(commandPath: string[]): Promise<TestResult[]> {\n const results: TestResult[] = [];\n const targetParser = this.getParserForPath(commandPath);\n const flags = this.getFlags(targetParser);\n\n if (this.options.verbose) {\n this.parser.logger.info(\n `Testing command path: ${commandPath.join(\" \") || \"(root)\"}`,\n );\n }\n\n // Test valid combinations\n const validCombinations = this.generateValidFlagCombinations(flags);\n for (const flagArgs of validCombinations) {\n const fullArgs = [...commandPath, ...flagArgs];\n const result = await this.executeTest(fullArgs, commandPath);\n results.push(result);\n }\n\n // Test random combinations\n for (let i = 0; i < this.options.randomTestCases; i++) {\n const randomArgs = this.generateRandomFlagCombination(flags);\n const fullArgs = [...commandPath, ...randomArgs];\n const result = await this.executeTest(fullArgs, commandPath);\n results.push(result);\n }\n\n // Test error cases if enabled\n if (this.options.testErrorCases) {\n const errorCases = this.generateErrorCases(flags);\n for (const errorArgs of errorCases) {\n const fullArgs = [...commandPath, ...errorArgs];\n const result = await this.executeTest(fullArgs, commandPath, true);\n results.push(result);\n }\n }\n\n return results;\n }\n\n /**\n * Get the parser instance for a specific command path\n */\n private getParserForPath(commandPath: string[]): IArgParser {\n let currentParser = this.parser;\n\n for (const command of commandPath) {\n const subCommands = this.getSubCommands(currentParser);\n const subCommand = subCommands.get(command);\n if (!subCommand) {\n throw new Error(`Command path not found: ${commandPath.join(\" \")}`);\n }\n currentParser = subCommand.parser;\n }\n\n return currentParser;\n }\n\n /**\n * Generate valid flag combinations for testing\n */\n private generateValidFlagCombinations(flags: ProcessedFlag[]): string[][] {\n const combinations: string[][] = [];\n\n // Separate mandatory and optional flags\n const mandatoryFlags = flags.filter(\n (f) =>\n f[\"name\"] !== \"help\" &&\n (typeof f[\"mandatory\"] === \"boolean\" ? f[\"mandatory\"] : false),\n );\n const optionalFlags = flags.filter(\n (f) =>\n f[\"name\"] !== \"help\" &&\n (typeof f[\"mandatory\"] === \"boolean\" ? !f[\"mandatory\"] : true),\n );\n\n // Generate base combination with all mandatory flags\n const mandatoryArgs: string[] = [];\n for (const flag of mandatoryFlags) {\n const flagArgs = this.generateFlagArgs(flag, \"valid\");\n mandatoryArgs.push(...flagArgs);\n }\n\n // Test with just mandatory flags\n if (mandatoryArgs.length > 0) {\n combinations.push([...mandatoryArgs]);\n } else {\n // Test with no flags if no mandatory flags exist\n combinations.push([]);\n }\n\n // Test each optional flag individually (with mandatory flags)\n for (const flag of optionalFlags) {\n const flagArgs = this.generateFlagArgs(flag, \"valid\");\n if (flagArgs.length > 0) {\n combinations.push([...mandatoryArgs, ...flagArgs]);\n }\n }\n\n // Test combinations of optional flags (with mandatory flags)\n if (optionalFlags.length > 1) {\n // Test pairs of optional flags\n for (let i = 0; i < optionalFlags.length - 1; i++) {\n for (let j = i + 1; j < optionalFlags.length; j++) {\n const flag1Args = this.generateFlagArgs(optionalFlags[i], \"valid\");\n const flag2Args = this.generateFlagArgs(optionalFlags[j], \"valid\");\n if (flag1Args.length > 0 && flag2Args.length > 0) {\n combinations.push([...mandatoryArgs, ...flag1Args, ...flag2Args]);\n }\n }\n }\n }\n\n return combinations;\n }\n\n /**\n * Generate random flag combination\n */\n private generateRandomFlagCombination(flags: ProcessedFlag[]): string[] {\n const args: string[] = [];\n const availableFlags = flags.filter((f) => f[\"name\"] !== \"help\");\n\n // Randomly select flags to include\n for (const flag of availableFlags) {\n if (Math.random() < 0.3) {\n // 30% chance to include each flag\n const flagArgs = this.generateFlagArgs(flag, \"random\");\n args.push(...flagArgs);\n }\n }\n\n return args;\n }\n\n /**\n * Generate error test cases\n */\n private generateErrorCases(flags: ProcessedFlag[]): string[][] {\n const errorCases: string[][] = [];\n\n // Test invalid flag names\n errorCases.push([\"--invalid-flag\"]);\n errorCases.push([\"--nonexistent\", \"value\"]);\n\n // Test flags with wrong types\n for (const flag of flags) {\n if (flag[\"name\"] === \"help\") continue;\n\n const invalidArgs = this.generateFlagArgs(flag, \"invalid\");\n if (invalidArgs.length > 0) {\n errorCases.push(invalidArgs);\n }\n }\n\n return errorCases;\n }\n\n /**\n * Generate arguments for a specific flag\n */\n private generateFlagArgs(\n flag: ProcessedFlag,\n mode: \"valid\" | \"invalid\" | \"random\",\n ): string[] {\n const option = flag[\"options\"][0]; // Use first option\n if (!option) return [];\n\n if (flag[\"flagOnly\"]) {\n return [option];\n }\n\n const values = this.generateFlagValues(flag, mode);\n const args: string[] = [];\n\n for (const value of values) {\n if (flag[\"allowLigature\"] && Math.random() < 0.5) {\n args.push(`${option}=${value}`);\n } else {\n args.push(option, value);\n }\n }\n\n return args;\n }\n\n /**\n * Generate values for a flag based on its type and constraints\n */\n private generateFlagValues(\n flag: ProcessedFlag,\n mode: \"valid\" | \"invalid\" | \"random\",\n ): string[] {\n const count =\n flag[\"allowMultiple\"] && mode !== \"invalid\"\n ? Math.floor(Math.random() * 3) + 1\n : 1;\n\n const values: string[] = [];\n\n for (let i = 0; i < count; i++) {\n values.push(this.generateSingleFlagValue(flag, mode));\n }\n\n return values;\n }\n\n /**\n * Generate a single value for a flag\n */\n private generateSingleFlagValue(\n flag: ProcessedFlag,\n mode: \"valid\" | \"invalid\" | \"random\",\n ): string {\n if (mode === \"invalid\") {\n // Generate intentionally invalid values\n if (flag[\"type\"] === Number) return \"not-a-number\";\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) return \"invalid-enum-value\";\n if (flag[\"type\"] === Boolean) return \"not-boolean\";\n return \"invalid-value\";\n }\n\n // Handle enum values\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n const randomIndex = Math.floor(Math.random() * flag[\"enum\"].length);\n return String(flag[\"enum\"][randomIndex]);\n }\n\n // Generate values based on type\n if (flag[\"type\"] === Number) {\n return String(Math.floor(Math.random() * 1000));\n }\n\n if (flag[\"type\"] === Boolean) {\n return Math.random() < 0.5 ? \"true\" : \"false\";\n }\n\n // Default to string\n const testStrings = [\n \"test-value\",\n \"hello-world\",\n \"file.txt\",\n \"/path/to/file\",\n \"user@example.com\",\n \"123\",\n \"special-chars-!@#\",\n ];\n\n return testStrings[Math.floor(Math.random() * testStrings.length)];\n }\n\n /**\n * Execute a single test case\n */\n private async executeTest(\n args: string[],\n commandPath: string[],\n expectError: boolean = false,\n ): Promise<TestResult> {\n const startTime = this.options.includePerformance ? Date.now() : 0;\n\n try {\n // Store the original input arguments for logging visibility\n const originalArgs = [...args];\n\n const testResult = this.parser.parse(args, {\n skipHelpHandling: true,\n });\n\n // Store original args in the result for logging\n if (testResult && typeof testResult === \"object\") {\n (testResult as any)._originalInputArgs = originalArgs;\n }\n\n const executionTime = this.options.includePerformance\n ? Date.now() - startTime\n : undefined;\n\n return {\n commandPath,\n args,\n success: !expectError,\n parsedResult: testResult,\n executionTime,\n };\n } catch (error) {\n const executionTime = this.options.includePerformance\n ? Date.now() - startTime\n : undefined;\n\n return {\n commandPath,\n args,\n success: expectError,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n };\n }\n }\n\n /**\n * Generate comprehensive test report\n */\n private generateReport(\n commandPaths: string[][],\n results: TestResult[],\n ): FuzzyTestReport {\n const totalTests = results.length;\n const successfulTests = results.filter((r) => r.success).length;\n const failedTests = totalTests - successfulTests;\n\n // Coverage by path\n const coverageByPath: Record<string, { total: number; passed: number }> =\n {};\n for (const path of commandPaths) {\n const pathKey = path.join(\" \") || \"(root)\";\n const pathResults = results.filter(\n (r) => JSON.stringify(r.commandPath) === JSON.stringify(path),\n );\n coverageByPath[pathKey] = {\n total: pathResults.length,\n passed: pathResults.filter((r) => r.success).length,\n };\n }\n\n // Error types\n const errorTypes: Record<string, number> = {};\n for (const result of results) {\n if (result.error) {\n const errorType = result.error.split(\":\")[0] || \"Unknown\";\n errorTypes[errorType] = (errorTypes[errorType] || 0) + 1;\n }\n }\n\n return {\n totalTests,\n successfulTests,\n failedTests,\n commandPaths,\n results,\n summary: {\n coverageByPath,\n errorTypes,\n },\n };\n }\n}\n","/**\n * MCP Lifecycle Events System\n *\n * This module provides lifecycle event hooks for MCP servers, allowing applications\n * to perform initialization, cleanup, and other lifecycle-related operations at\n * specific points in the MCP protocol flow.\n */\n\n/**\n * Base context interface shared by all lifecycle events\n */\nexport interface McpLifecycleBaseContext {\n /** Get a parsed flag value by name */\n getFlag(name: string): any;\n /** MCP logger instance for this context */\n logger: any;\n /** Server information */\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n };\n}\n\n/**\n * Context provided during the MCP initialize request\n * This is called when a client sends the \"initialize\" request\n */\nexport interface McpInitializeContext extends McpLifecycleBaseContext {\n /** Client information from the initialize request */\n clientInfo: {\n name: string;\n version: string;\n title?: string;\n };\n /** Protocol version being used */\n protocolVersion: string;\n /** Client capabilities */\n clientCapabilities: Record<string, any>;\n}\n\n/**\n * Context provided after the MCP initialized notification\n * This is called when a client sends the \"initialized\" notification\n */\nexport interface McpInitializedContext extends McpLifecycleBaseContext {\n /** Client information from the previous initialize request */\n clientInfo: {\n name: string;\n version: string;\n title?: string;\n };\n /** Protocol version being used */\n protocolVersion: string;\n}\n\n/**\n * Context provided during server shutdown\n * This is called when the MCP server is being shut down\n */\nexport interface McpShutdownContext extends McpLifecycleBaseContext {\n /** Reason for shutdown */\n reason: \"client_disconnect\" | \"server_shutdown\" | \"error\" | \"signal\";\n /** Optional error if shutdown was due to an error */\n error?: Error;\n}\n\n/**\n * Lifecycle event handlers interface\n */\nexport interface McpLifecycleEvents {\n /**\n * Called when a client sends an \"initialize\" request\n * This is the first lifecycle event and is ideal for:\n * - Database connection setup\n * - Resource initialization\n * - Configuration validation\n * - Authentication setup\n */\n onInitialize?: (context: McpInitializeContext) => Promise<void>;\n\n /**\n * Called when a client sends an \"initialized\" notification\n * This indicates the client is ready for normal operations\n * This is ideal for:\n * - Final setup steps\n * - Background task initialization\n * - Health checks\n */\n onInitialized?: (context: McpInitializedContext) => Promise<void>;\n\n /**\n * Called when the MCP server is shutting down\n * This is ideal for:\n * - Database connection cleanup\n * - Resource disposal\n * - Graceful shutdown procedures\n */\n onShutdown?: (context: McpShutdownContext) => Promise<void>;\n}\n\n/**\n * Internal state tracking for lifecycle events\n */\nexport interface McpLifecycleState {\n /** Whether the initialize event has been called */\n initialized: boolean;\n /** Whether the initialized event has been called */\n ready: boolean;\n /** Whether shutdown has been initiated */\n shuttingDown: boolean;\n /** Stored client info from initialize */\n clientInfo?: {\n name: string;\n version: string;\n title?: string;\n };\n /** Protocol version being used */\n protocolVersion?: string;\n /** Client capabilities */\n clientCapabilities?: Record<string, any>;\n}\n\n/**\n * Lifecycle manager class for handling MCP lifecycle events\n */\nexport class McpLifecycleManager {\n private state: McpLifecycleState = {\n initialized: false,\n ready: false,\n shuttingDown: false,\n };\n\n private parsedArgs: any = {};\n\n constructor(\n private events: McpLifecycleEvents,\n private logger: any,\n private serverInfo: { name: string; version: string; description?: string },\n private argParser?: any,\n ) {}\n\n /**\n * Set the parsed arguments for flag access\n */\n setParsedArgs(parsedArgs: any): void {\n this.parsedArgs = parsedArgs;\n }\n\n /**\n * Get a flag value from parsed arguments or environment variables\n */\n private getFlag(name: string): any {\n // First try parsed arguments if available\n if (this.parsedArgs && this.parsedArgs[name] !== undefined) {\n return this.parsedArgs[name];\n }\n\n // Fall back to environment variables if arg parser is available\n if (this.argParser) {\n const flagDef = this.argParser.getFlagDefinition(name);\n if (flagDef) {\n // Try environment variable\n if (flagDef.env && process.env[flagDef.env]) {\n return process.env[flagDef.env];\n }\n // Fall back to default value\n return flagDef.defaultValue;\n }\n }\n\n return undefined;\n }\n\n /**\n * Handle the initialize request\n */\n async handleInitialize(\n clientInfo: { name: string; version: string; title?: string },\n protocolVersion: string,\n clientCapabilities: Record<string, any>,\n ): Promise<void> {\n if (this.state.initialized) {\n this.logger.mcpError(\"Initialize called multiple times\");\n return;\n }\n\n this.state.clientInfo = clientInfo;\n this.state.protocolVersion = protocolVersion;\n this.state.clientCapabilities = clientCapabilities;\n this.state.initialized = true;\n\n if (this.events.onInitialize) {\n const context: McpInitializeContext = {\n getFlag: (name: string) => this.getFlag(name),\n logger: this.logger,\n serverInfo: this.serverInfo,\n clientInfo,\n protocolVersion,\n clientCapabilities,\n };\n\n try {\n await this.events.onInitialize(context);\n this.logger.mcpError(\"Lifecycle onInitialize completed successfully\");\n } catch (error) {\n this.logger.mcpError(\n `Lifecycle onInitialize failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n }\n\n /**\n * Handle the initialized notification\n */\n async handleInitialized(): Promise<void> {\n if (!this.state.initialized) {\n this.logger.mcpError(\"Initialized called before initialize\");\n return;\n }\n\n if (this.state.ready) {\n this.logger.mcpError(\"Initialized called multiple times\");\n return;\n }\n\n this.state.ready = true;\n\n if (this.events.onInitialized && this.state.clientInfo) {\n const context: McpInitializedContext = {\n getFlag: (name: string) => this.getFlag(name),\n logger: this.logger,\n serverInfo: this.serverInfo,\n clientInfo: this.state.clientInfo,\n protocolVersion: this.state.protocolVersion!,\n };\n\n try {\n await this.events.onInitialized(context);\n this.logger.mcpError(\"Lifecycle onInitialized completed successfully\");\n } catch (error) {\n this.logger.mcpError(\n `Lifecycle onInitialized failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n }\n\n /**\n * Handle server shutdown\n */\n async handleShutdown(\n reason: \"client_disconnect\" | \"server_shutdown\" | \"error\" | \"signal\",\n error?: Error,\n ): Promise<void> {\n if (this.state.shuttingDown) {\n return; // Already shutting down\n }\n\n this.state.shuttingDown = true;\n\n if (this.events.onShutdown) {\n const context: McpShutdownContext = {\n getFlag: (name: string) => this.getFlag(name),\n logger: this.logger,\n serverInfo: this.serverInfo,\n reason,\n error,\n };\n\n try {\n await this.events.onShutdown(context);\n this.logger.mcpError(\"Lifecycle onShutdown completed successfully\");\n } catch (shutdownError) {\n this.logger.mcpError(\n `Lifecycle onShutdown failed: ${shutdownError instanceof Error ? shutdownError.message : String(shutdownError)}`,\n );\n // Don't throw during shutdown - just log the error\n }\n }\n }\n\n /**\n * Get current lifecycle state\n */\n getState(): Readonly<McpLifecycleState> {\n return { ...this.state };\n }\n\n /**\n * Check if the server is ready for operations\n */\n isReady(): boolean {\n return this.state.ready && !this.state.shuttingDown;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parse } from './parse.js';\nimport { stringify } from './stringify.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nexport default { parse, stringify, TomlDate, TomlError };\nexport { parse, stringify, TomlDate, TomlError };\n"],"names":["RESET","BOLD","DIM","UNDERLINE","CLEAR","BLACK","RED","GREEN","YELLOW","BLUE","MAGENTA","CYAN","WHITE","GRAY","supportsColor","isBrowser","colorEnabled","format","createTomlPlugin","createYamlPlugin","createTomlPluginAsync","createYamlPluginAsync","chalk","path","fs","pathWithVariables","normalizedPath","z","currentDir","getTsconfig","createPathsMatcher","extensions","testPath","logger","createMcpLogger","identifiedFinalParser","fileURLToPath","createRegExp","anyOf","oneOrMore","char","index","property","isRequired","args","McpLifecycleManager","sessionId","tomlModule","yamlModule","endPtr"],"mappings":"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","x_google_ignoreList":[0,1,2,27,28,29,30,31,32,33,34,35]}
1
+ {"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/@alcyone-labs+simple-chalk@1.0.2/node_modules/@alcyone-labs/simple-chalk/dist/esm/SimpleChalk.js","../node_modules/.pnpm/@alcyone-labs+simple-chalk@1.0.2/node_modules/@alcyone-labs/simple-chalk/dist/esm/SimpleChalkFast.js","../node_modules/.pnpm/@alcyone-labs+simple-chalk@1.0.2/node_modules/@alcyone-labs/simple-chalk/dist/esm/SimpleChalkBrowser.js","../src/config/plugins/ConfigPlugin.ts","../src/config/plugins/ConfigPluginRegistry.ts","../src/config/ConfigurationManager.ts","../src/core/log-path-utils.ts","../src/core/dxt-path-resolver.ts","../src/core/types.ts","../src/dxt/DxtGenerator-testUtils.ts","../src/dxt/DxtGenerator.ts","../src/mcp/mcp-notifications.ts","../src/mcp/mcp-prompts.ts","../src/mcp/mcp-resources.ts","../src/utils/debug-utils.ts","../src/core/FlagManager.ts","../src/core/ArgParserBase.ts","../src/mcp/mcp-utils.ts","../src/mcp/mcp-integration.ts","../src/mcp/mcp-protocol-versions.ts","../src/mcp/zod-compatibility.ts","../src/core/ArgParser.ts","../src/mcp/ArgParserMcp.ts","../src/config/plugins/TomlConfigPlugin.ts","../src/config/plugins/YamlConfigPlugin.ts","../src/testing/fuzzy-tester.ts","../src/mcp/mcp-lifecycle.ts","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/index.js"],"sourcesContent":["/**\n * Simple chalk replacement for basic terminal colors\n * Provides the same API as chalk but without dynamic requires or complex dependencies\n * Perfect for bundling in autonomous builds\n */\n// ANSI codes\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst UNDERLINE = '\\x1b[4m';\nconst CLEAR = '\\x1b[2J\\x1b[3J\\x1b[H';\n// Colors\nconst BLACK = '\\x1b[30m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst MAGENTA = '\\x1b[35m';\nconst CYAN = '\\x1b[36m';\nconst WHITE = '\\x1b[37m';\nconst GRAY = '\\x1b[90m';\n// Check if colors should be enabled\nfunction supportsColor() {\n // Browser environment detection\n const isBrowser = typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined';\n if (isBrowser) {\n // In browsers, enable colors by default (modern browsers support ANSI in console)\n // But respect NO_COLOR if somehow set in browser environment\n return !globalThis.NO_COLOR;\n }\n // Node.js environment\n if (typeof process !== 'undefined') {\n // In MCP mode or when NO_COLOR is set, disable colors\n if (process.env['NO_COLOR'] || process.env['MCP_MODE']) {\n return false;\n }\n // Enable colors if FORCE_COLOR is set\n if (process.env['FORCE_COLOR']) {\n return true;\n }\n // Check if we're in a TTY\n if (process.stdout && process.stdout.isTTY) {\n return true;\n }\n }\n return false;\n}\nconst colorEnabled = supportsColor();\nfunction colorize(text, ...codes) {\n if (!colorEnabled || codes.length === 0) {\n return text;\n }\n return codes.join('') + text + RESET;\n}\n// Helper function to add a property to a chalk function\nfunction addChalkProperty(fn, name, code, codes) {\n Object.defineProperty(fn, name, {\n get: () => createColorFunction([...codes, code]),\n configurable: true\n });\n}\n// Create a chainable color function\nfunction createColorFunction(codes) {\n const fn = ((text) => colorize(text, ...codes));\n // Add modifier properties\n addChalkProperty(fn, 'bold', BOLD, codes);\n addChalkProperty(fn, 'dim', DIM, codes);\n addChalkProperty(fn, 'underline', UNDERLINE, codes);\n // Add color properties\n addChalkProperty(fn, 'black', BLACK, codes);\n addChalkProperty(fn, 'red', RED, codes);\n addChalkProperty(fn, 'green', GREEN, codes);\n addChalkProperty(fn, 'yellow', YELLOW, codes);\n addChalkProperty(fn, 'blue', BLUE, codes);\n addChalkProperty(fn, 'magenta', MAGENTA, codes);\n addChalkProperty(fn, 'cyan', CYAN, codes);\n addChalkProperty(fn, 'white', WHITE, codes);\n addChalkProperty(fn, 'gray', GRAY, codes);\n addChalkProperty(fn, 'grey', GRAY, codes);\n addChalkProperty(fn, 'blueBright', CYAN, codes);\n // Add clear property\n Object.defineProperty(fn, 'clear', {\n get: () => colorEnabled ? CLEAR : '',\n configurable: true\n });\n return fn;\n}\n// Create the main chalk object\nconst simpleChalk = createColorFunction([]);\nexport default simpleChalk;\n//# sourceMappingURL=SimpleChalk.js.map","/**\n * Fast SimpleChalk implementation - no chaining, maximum performance\n * Similar to picocolors approach\n */\n// ANSI color codes\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst UNDERLINE = '\\x1b[4m';\nconst CLEAR = '\\x1b[2J\\x1b[3J\\x1b[H';\n// Colors\nconst BLACK = '\\x1b[30m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst BLUE = '\\x1b[34m';\nconst MAGENTA = '\\x1b[35m';\nconst CYAN = '\\x1b[36m';\nconst WHITE = '\\x1b[37m';\nconst GRAY = '\\x1b[90m';\n// Check if colors should be enabled\nfunction supportsColor() {\n // Browser environment detection\n const isBrowser = typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined';\n if (isBrowser) {\n // In browsers, enable colors by default (modern browsers support ANSI in console)\n // But respect NO_COLOR if somehow set in browser environment\n return !globalThis.NO_COLOR;\n }\n // Node.js environment\n if (typeof process !== 'undefined') {\n // In MCP mode or when NO_COLOR is set, disable colors\n if (process.env['NO_COLOR'] || process.env['MCP_MODE']) {\n return false;\n }\n // Enable colors if FORCE_COLOR is set\n if (process.env['FORCE_COLOR']) {\n return true;\n }\n // Check if we're in a TTY\n if (process.stdout && process.stdout.isTTY) {\n return true;\n }\n }\n return false;\n}\nconst colorEnabled = supportsColor();\n// Simple formatter function\nconst format = (code) => colorEnabled\n ? (text) => code + text + RESET\n : (text) => text;\n// Pre-created functions - no dynamic creation\nconst simpleChalkFast = {\n // Colors\n black: format(BLACK),\n red: format(RED),\n green: format(GREEN),\n yellow: format(YELLOW),\n blue: format(BLUE),\n magenta: format(MAGENTA),\n cyan: format(CYAN),\n white: format(WHITE),\n gray: format(GRAY),\n grey: format(GRAY), // alias\n blueBright: format(CYAN), // alias\n // Modifiers\n bold: format(BOLD),\n dim: format(DIM),\n underline: format(UNDERLINE),\n /**\n * [NON-CHALK EXTENSION] Returns an ANSI escape sequence that clears the screen\n * and the scrollback buffer (equivalent to CMD+K).\n *\n * @example\n * ```javascript\n * process.stdout.write(fast.clear);\n * ```\n */\n clear: colorEnabled ? CLEAR : '',\n // Pre-created common combinations for some chaining support\n redBold: format(RED + BOLD),\n greenBold: format(GREEN + BOLD),\n blueBold: format(BLUE + BOLD),\n yellowBold: format(YELLOW + BOLD),\n redUnderline: format(RED + UNDERLINE),\n greenUnderline: format(GREEN + UNDERLINE),\n blueUnderline: format(BLUE + UNDERLINE),\n boldRed: format(BOLD + RED),\n boldGreen: format(BOLD + GREEN),\n boldBlue: format(BOLD + BLUE),\n boldYellow: format(BOLD + YELLOW),\n};\n// Make it callable as a function\nconst callableChalk = Object.assign((text) => text, simpleChalkFast);\nexport default callableChalk;\n//# sourceMappingURL=SimpleChalkFast.js.map","/**\n * Browser-optimized SimpleChalk implementation\n * Uses CSS styling for browsers, ANSI codes for Node.js\n */\n// Check if we're in a browser environment\nconst isBrowser = typeof globalThis.window !== 'undefined' && typeof globalThis.document !== 'undefined';\n// CSS styles for browser console\nconst browserStyles = {\n reset: '',\n bold: 'font-weight: bold;',\n dim: 'opacity: 0.5;',\n underline: 'text-decoration: underline;',\n black: 'color: #000000;',\n red: 'color: #ff0000;',\n green: 'color: #00ff00;',\n yellow: 'color: #ffff00;',\n blue: 'color: #0000ff;',\n magenta: 'color: #ff00ff;',\n cyan: 'color: #00ffff;',\n white: 'color: #ffffff;',\n gray: 'color: #808080;',\n};\n// ANSI codes for Node.js\nconst ansiCodes = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n underline: '\\x1b[4m',\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n// Check if colors should be enabled (dynamic check)\nfunction supportsColor() {\n if (isBrowser) {\n // In browsers, enable colors by default\n return !globalThis.NO_COLOR;\n }\n // Node.js environment\n if (typeof process !== 'undefined') {\n if (process.env['NO_COLOR'] || process.env['MCP_MODE']) {\n return false;\n }\n if (process.env['FORCE_COLOR']) {\n return true;\n }\n if (process.stdout && process.stdout.isTTY) {\n return true;\n }\n }\n return false;\n}\n// Browser-specific formatter using CSS\nfunction formatBrowser(styles, text) {\n if (!supportsColor() || styles.length === 0) {\n return [text];\n }\n const cssStyle = styles.join(' ');\n return [`%c${text}`, cssStyle];\n}\n// Node.js formatter using ANSI codes\nfunction formatNode(codes, text) {\n if (!supportsColor() || codes.length === 0) {\n return text;\n }\n return codes.join('') + text + ansiCodes.reset;\n}\n// Universal formatter that works in both environments\nfunction format(styleKey) {\n return (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles[styleKey]], text);\n }\n else {\n return formatNode([ansiCodes[styleKey]], text);\n }\n };\n}\n// Create the browser-optimized chalk object\nconst simpleChalkBrowser = {\n // Colors\n black: format('black'),\n red: format('red'),\n green: format('green'),\n yellow: format('yellow'),\n blue: format('blue'),\n magenta: format('magenta'),\n cyan: format('cyan'),\n white: format('white'),\n gray: format('gray'),\n grey: format('gray'), // alias\n blueBright: format('cyan'), // alias\n // Modifiers\n bold: format('bold'),\n dim: format('dim'),\n underline: format('underline'),\n /**\n * [NON-CHALK EXTENSION] Clears the screen and scrollback buffer.\n * In a browser environment, this calls console.clear().\n * In a Node environment, it returns the ANSI clear/scrollback sequence.\n *\n * @example\n * ```javascript\n * // In browser: console.clear() will be called immediately\n * // In node: will return ANSI string\n * console.log(...browser.clear);\n * ```\n */\n clear: (() => {\n if (!supportsColor())\n return '';\n if (isBrowser) {\n console.clear();\n return '';\n }\n else {\n return '\\x1b[2J\\x1b[3J\\x1b[H';\n }\n })(),\n // Browser-specific combinations (CSS can combine styles)\n redBold: (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles.red, browserStyles.bold], text);\n }\n else {\n return formatNode([ansiCodes.red, ansiCodes.bold], text);\n }\n },\n greenBold: (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles.green, browserStyles.bold], text);\n }\n else {\n return formatNode([ansiCodes.green, ansiCodes.bold], text);\n }\n },\n blueBold: (text) => {\n if (isBrowser) {\n return formatBrowser([browserStyles.blue, browserStyles.bold], text);\n }\n else {\n return formatNode([ansiCodes.blue, ansiCodes.bold], text);\n }\n },\n};\n// Make it callable as a function\nconst callableChalk = Object.assign((text) => text, simpleChalkBrowser);\nexport default callableChalk;\n//# sourceMappingURL=SimpleChalkBrowser.js.map","/**\n * Plugin interface for configuration file format support\n */\nexport interface IConfigPlugin {\n /**\n * File extensions this plugin supports (e.g., ['.toml', '.tml'])\n */\n readonly supportedExtensions: string[];\n\n /**\n * Plugin name for identification\n */\n readonly name: string;\n\n /**\n * Parse configuration file content\n * @param content File content as string\n * @returns Parsed configuration object\n */\n parse(content: string): Record<string, any>;\n\n /**\n * Generate configuration file content\n * @param config Configuration object\n * @param flags Flag definitions for metadata\n * @param parsedArgs Parsed arguments for values\n * @returns Generated file content\n */\n generate(config: Record<string, any>, flags: any[], parsedArgs: any): string;\n}\n\n/**\n * Base class for configuration plugins\n */\nexport abstract class ConfigPlugin implements IConfigPlugin {\n abstract readonly supportedExtensions: string[];\n abstract readonly name: string;\n\n abstract parse(content: string): Record<string, any>;\n abstract generate(\n config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string;\n\n /**\n * Check if this plugin supports a given file extension\n */\n public supportsExtension(extension: string): boolean {\n return this.supportedExtensions.includes(extension.toLowerCase());\n }\n}\n\n/**\n * Built-in JSON configuration plugin (no external dependencies)\n */\nexport class JsonConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".json\", \".jsonc\"];\n readonly name = \"json\";\n\n parse(content: string): Record<string, any> {\n try {\n const parsed = JSON.parse(content);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"JSON file must contain an object at the root level\");\n }\n // Remove metadata if present\n const { _meta, ...config } = parsed;\n return config;\n } catch (error) {\n throw new Error(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const metadata = {\n _meta: {\n generated: new Date().toISOString(),\n generator: \"ArgParser\",\n format: \"json\",\n },\n };\n\n const configWithValues: Record<string, any> = {};\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n if (isSet) {\n configWithValues[flag.name] = flagValue;\n } else if (isMandatory) {\n configWithValues[flag.name] =\n flag.defaultValue !== undefined ? flag.defaultValue : null;\n }\n }\n\n const result = { ...metadata, ...configWithValues };\n return JSON.stringify(result, null, 2);\n }\n}\n\n/**\n * Built-in ENV configuration plugin (no external dependencies)\n */\nexport class EnvConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".env\"];\n readonly name = \"env\";\n\n parse(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration generated by ArgParser\");\n lines.push(\"# Format: ENV\");\n lines.push(\"\");\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n lines.push(`# ${flag.description || flag.name}`);\n lines.push(`# Type: ${this.getTypeString(flag.type)}`);\n\n if (flag.defaultValue !== undefined) {\n lines.push(`# Default: ${flag.defaultValue}`);\n }\n\n if (isSet) {\n lines.push(`${flag.name.toUpperCase()}=${flagValue}`);\n } else if (isMandatory) {\n const defaultVal =\n flag.defaultValue !== undefined ? flag.defaultValue : \"\";\n lines.push(`${flag.name.toUpperCase()}=${defaultVal}`);\n } else {\n lines.push(`# ${flag.name.toUpperCase()}=`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n private getTypeString(type: any): string {\n if (typeof type === \"function\") {\n return type.name || \"custom function\";\n }\n return String(type).toLowerCase();\n }\n}\n","import type { IConfigPlugin } from \"./ConfigPlugin\";\nimport { EnvConfigPlugin, JsonConfigPlugin } from \"./ConfigPlugin\";\n\n/**\n * Registry for configuration plugins\n * Manages available config format plugins and provides plugin lookup\n */\nexport class ConfigPluginRegistry {\n private plugins: Map<string, IConfigPlugin> = new Map();\n private extensionMap: Map<string, IConfigPlugin> = new Map();\n\n constructor() {\n // Register built-in plugins (no external dependencies)\n this.registerPlugin(new JsonConfigPlugin());\n this.registerPlugin(new EnvConfigPlugin());\n }\n\n /**\n * Register a configuration plugin\n */\n public registerPlugin(plugin: IConfigPlugin): void {\n this.plugins.set(plugin.name, plugin);\n\n // Map extensions to plugin\n for (const ext of plugin.supportedExtensions) {\n this.extensionMap.set(ext.toLowerCase(), plugin);\n }\n }\n\n /**\n * Get plugin by name\n */\n public getPlugin(name: string): IConfigPlugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get plugin by file extension\n */\n public getPluginByExtension(extension: string): IConfigPlugin | undefined {\n return this.extensionMap.get(extension.toLowerCase());\n }\n\n /**\n * Check if a file extension is supported\n */\n public isExtensionSupported(extension: string): boolean {\n return this.extensionMap.has(extension.toLowerCase());\n }\n\n /**\n * Get all registered plugin names\n */\n public getRegisteredPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * Get all supported extensions\n */\n public getSupportedExtensions(): string[] {\n return Array.from(this.extensionMap.keys());\n }\n\n /**\n * Unregister a plugin\n */\n public unregisterPlugin(name: string): boolean {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n return false;\n }\n\n // Remove from plugins map\n this.plugins.delete(name);\n\n // Remove extensions from extension map\n for (const ext of plugin.supportedExtensions) {\n this.extensionMap.delete(ext.toLowerCase());\n }\n\n return true;\n }\n\n /**\n * Clear all plugins (useful for testing)\n */\n public clear(): void {\n this.plugins.clear();\n this.extensionMap.clear();\n }\n\n /**\n * Auto-register optional plugins if their dependencies are available\n * This method attempts to load TOML and YAML plugins without throwing errors\n */\n public autoRegisterOptionalPlugins(): void {\n // Try to register TOML plugin\n try {\n const { createTomlPlugin } = require(\"./TomlConfigPlugin\");\n const tomlPlugin = createTomlPlugin();\n if (tomlPlugin) {\n this.registerPlugin(tomlPlugin);\n }\n } catch (error) {\n // TOML plugin not available, continue without it\n }\n\n // Try to register YAML plugin\n try {\n const { createYamlPlugin } = require(\"./YamlConfigPlugin\");\n const yamlPlugin = createYamlPlugin();\n if (yamlPlugin) {\n this.registerPlugin(yamlPlugin);\n }\n } catch (error) {\n // YAML plugin not available, continue without it\n }\n }\n\n /**\n * Async version of auto-register optional plugins with ESM support\n * This method attempts to load TOML and YAML plugins without throwing errors\n */\n public async autoRegisterOptionalPluginsAsync(): Promise<void> {\n // Try to register TOML plugin\n try {\n const { createTomlPluginAsync } = await import(\"./TomlConfigPlugin\");\n const tomlPlugin = await createTomlPluginAsync();\n if (tomlPlugin) {\n this.registerPlugin(tomlPlugin);\n }\n } catch (error) {\n // TOML plugin not available, continue without it\n }\n\n // Try to register YAML plugin\n try {\n const { createYamlPluginAsync } = await import(\"./YamlConfigPlugin\");\n const yamlPlugin = await createYamlPluginAsync();\n if (yamlPlugin) {\n this.registerPlugin(yamlPlugin);\n }\n } catch (error) {\n // YAML plugin not available, continue without it\n }\n }\n}\n\n/**\n * Global plugin registry instance\n * This can be used throughout the application\n */\nexport const globalConfigPluginRegistry = new ConfigPluginRegistry();\n\n/**\n * Convenience function to register optional plugins\n * Call this once at application startup if you want TOML/YAML support\n */\nexport function enableOptionalConfigPlugins(): void {\n globalConfigPluginRegistry.autoRegisterOptionalPlugins();\n}\n\n/**\n * Async convenience function to register optional plugins with ESM support\n * Call this once at application startup if you want TOML/YAML support in ESM environments\n */\nexport async function enableOptionalConfigPluginsAsync(): Promise<void> {\n await globalConfigPluginRegistry.autoRegisterOptionalPluginsAsync();\n}\n\n/**\n * Convenience function to register only specific plugins\n */\nexport function enableConfigPlugins(pluginNames: string[]): void {\n for (const pluginName of pluginNames) {\n switch (pluginName.toLowerCase()) {\n case \"toml\":\n try {\n const { createTomlPlugin } = require(\"./TomlConfigPlugin\");\n const tomlPlugin = createTomlPlugin();\n if (tomlPlugin) {\n globalConfigPluginRegistry.registerPlugin(tomlPlugin);\n }\n } catch (error) {\n console.warn(\n `Failed to enable TOML plugin: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n break;\n\n case \"yaml\":\n try {\n const { createYamlPlugin } = require(\"./YamlConfigPlugin\");\n const yamlPlugin = createYamlPlugin();\n if (yamlPlugin) {\n globalConfigPluginRegistry.registerPlugin(yamlPlugin);\n }\n } catch (error) {\n console.warn(\n `Failed to enable YAML plugin: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n break;\n\n default:\n console.warn(`Unknown config plugin: ${pluginName}`);\n }\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport chalk from \"@alcyone-labs/simple-chalk\";\nimport type { ProcessedFlag, TParsedArgs } from \"../core/types\";\nimport { globalConfigPluginRegistry } from \"./plugins/ConfigPluginRegistry\";\n\n/**\n * ConfigurationManager handles environment file operations, format conversion,\n * and configuration merging for ArgParser instances.\n */\nexport class ConfigurationManager {\n private argParserInstance: any;\n\n constructor(argParserInstance: any) {\n this.argParserInstance = argParserInstance;\n\n // Auto-register built-in plugins (JSON and ENV only by default)\n // TOML and YAML plugins are optional and must be explicitly enabled\n }\n\n /**\n * Generates a default environment file name based on app configuration\n */\n public generateDefaultEnvFileName(): string {\n let baseName = \"config\";\n\n const appCommandName = this.argParserInstance.getAppCommandName();\n const appName = this.argParserInstance.getAppName();\n\n if (appCommandName) {\n baseName = appCommandName;\n } else if (appName && appName !== \"Argument Parser\") {\n baseName = appName;\n }\n\n // Convert to a safe filename format (PascalCase for .env files)\n baseName = baseName\n .split(/[\\s\\-_]+/)\n .map(\n (word: string) =>\n word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(),\n )\n .join(\"\");\n\n return `${baseName}.env`;\n }\n\n /**\n * Handles the --s-save-to-env system flag at the final parser level\n */\n public handleSaveToEnvFlag(\n processArgs: string[],\n parserChain: any[],\n ): boolean {\n const saveToEnvIndex = processArgs.findIndex(\n (arg) => arg === \"--s-save-to-env\",\n );\n if (saveToEnvIndex !== -1) {\n let filePath: string;\n\n // Check if a filename is provided\n if (saveToEnvIndex + 1 < processArgs.length) {\n const nextArg = processArgs[saveToEnvIndex + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n filePath = nextArg;\n } else {\n // No filename provided, auto-generate one\n filePath = this.generateDefaultEnvFileName();\n }\n } else {\n // No filename provided, auto-generate one\n filePath = this.generateDefaultEnvFileName();\n }\n\n this.saveToEnvFile(filePath, processArgs, parserChain);\n return true;\n }\n return false;\n }\n\n /**\n * Saves current configuration to an environment file\n */\n public saveToEnvFile(\n filePath: string,\n _processArgs: string[],\n parserChain: any[],\n ): void {\n try {\n // Parse the current arguments to get the values\n const finalParser = parserChain[parserChain.length - 1];\n const parsedArgs = finalParser.getLastParseResult();\n\n if (!parsedArgs || !parsedArgs.data) {\n console.log(\n chalk.yellow(\n \"No parsed arguments available. Run the command first to generate configuration.\",\n ),\n );\n return;\n }\n\n // Collect all flags from the parser chain\n const allFlags: ProcessedFlag[] = [];\n for (const parser of parserChain) {\n allFlags.push(...parser.flags);\n }\n\n // Determine file format based on extension\n const ext = path.extname(filePath).toLowerCase();\n let content: string;\n\n // Try to use plugin system first\n const plugin = globalConfigPluginRegistry.getPluginByExtension(ext);\n if (plugin) {\n content = plugin.generate({}, allFlags, parsedArgs.data);\n } else {\n // Fallback to legacy methods for unsupported formats\n switch (ext) {\n case \".yaml\":\n case \".yml\":\n content = this.generateYamlFormat(allFlags, parsedArgs);\n break;\n case \".json\":\n content = this.generateJsonFormat(allFlags, parsedArgs);\n break;\n case \".toml\":\n content = this.generateTomlFormat(allFlags, parsedArgs);\n break;\n case \".env\":\n default:\n content = this.generateEnvFormat(allFlags, parsedArgs);\n break;\n }\n }\n\n // Write the file\n fs.writeFileSync(filePath, content, \"utf8\");\n\n console.log(chalk.green(`✅ Configuration saved to: ${filePath}`));\n console.log(chalk.gray(`Format: ${ext || \".env\"}`));\n console.log(\n chalk.gray(`Flags saved: ${Object.keys(parsedArgs.data).length}`),\n );\n } catch (error) {\n console.error(\n chalk.red(\n `❌ Failed to save configuration: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n throw new Error(\n `Failed to save configuration: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Loads configuration from an environment file\n */\n public loadEnvFile(\n filePath: string,\n parserChain: any[],\n ): Record<string, any> {\n try {\n if (!fs.existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, \"utf8\");\n const ext = path.extname(filePath).toLowerCase();\n\n let rawConfig: Record<string, any>;\n\n // Try to use plugin system first\n const plugin = globalConfigPluginRegistry.getPluginByExtension(ext);\n if (plugin) {\n rawConfig = plugin.parse(content);\n } else {\n // Fallback to legacy methods for unsupported formats\n switch (ext) {\n case \".yaml\":\n case \".yml\":\n rawConfig = this.parseYamlFile(content);\n break;\n case \".json\":\n rawConfig = this.parseJsonFile(content);\n break;\n case \".toml\":\n rawConfig = this.parseTomlFile(content);\n break;\n case \".env\":\n default:\n rawConfig = this.parseEnvFile(content);\n break;\n }\n }\n\n // Convert the raw config to flag values\n return this.convertConfigToFlagValues(rawConfig, parserChain);\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return {};\n }\n }\n\n /**\n * Parses environment file content\n */\n public parseEnvFile(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n /**\n * Parses YAML file content (legacy method - now uses plugin system)\n */\n public parseYamlFile(content: string): Record<string, any> {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".yaml\");\n if (plugin) {\n return plugin.parse(content);\n }\n\n // Fallback: Simple YAML parsing for basic key-value pairs and arrays\n console.warn(\n \"YAML plugin not available, using simple parser. Install js-yaml and enable YAML plugin for full support.\",\n );\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n let currentKey: string | null = null;\n let currentArray: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue;\n }\n\n // Check if this is an array item\n if (trimmed.startsWith(\"- \")) {\n if (currentKey) {\n const arrayValue = trimmed.substring(2).trim();\n // Remove quotes if present\n const cleanValue =\n (arrayValue.startsWith('\"') && arrayValue.endsWith('\"')) ||\n (arrayValue.startsWith(\"'\") && arrayValue.endsWith(\"'\"))\n ? arrayValue.slice(1, -1)\n : arrayValue;\n currentArray.push(cleanValue);\n }\n continue;\n }\n\n // Check if this is a key-value pair\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > 0) {\n // If we were building an array, save it\n if (currentKey && currentArray.length > 0) {\n config[currentKey] = currentArray;\n currentArray = [];\n }\n\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n\n // If value is empty, this might be the start of an array\n if (!value) {\n currentKey = key;\n currentArray = [];\n continue;\n }\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n currentKey = null;\n }\n }\n\n // Handle any remaining array\n if (currentKey && currentArray.length > 0) {\n config[currentKey] = currentArray;\n }\n\n return config;\n }\n\n /**\n * Discovers .env files in a specified directory\n * Searches in priority order: .env.local, .env.dev/.env.test, .env\n *\n * @param searchDir - The directory to search for .env files\n * @returns Path to found .env file, or null if none is found\n */\n public discoverEnvFile(searchDir: string): string | null {\n const envFilesToCheck: string[] = [\".env.local\"];\n\n // Add environment-specific files based on NODE_ENV\n const nodeEnv = process.env[\"NODE_ENV\"]?.toLowerCase();\n if (nodeEnv === \"development\" || nodeEnv === \"dev\") {\n envFilesToCheck.push(\".env.dev\");\n } else if (nodeEnv === \"test\") {\n envFilesToCheck.push(\".env.test\");\n }\n\n envFilesToCheck.push(\".env\");\n\n // Check each file in priority order\n for (const envFile of envFilesToCheck) {\n const envPath = path.join(searchDir, envFile);\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n return null;\n }\n\n /**\n * Parses JSON file content\n */\n public parseJsonFile(content: string): Record<string, any> {\n try {\n return JSON.parse(content) || {};\n } catch (error) {\n throw new Error(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Parses TOML file content (legacy method - now uses plugin system)\n */\n public parseTomlFile(content: string): Record<string, any> {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".toml\");\n if (plugin) {\n return plugin.parse(content);\n }\n\n // Fallback: Simple TOML parsing for basic key-value pairs\n console.warn(\n \"TOML plugin not available, using simple parser. Install smol-toml and enable TOML plugin for full support.\",\n );\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n /**\n * Converts raw configuration to flag values with proper type conversion\n */\n public convertConfigToFlagValues(\n rawConfig: Record<string, any>,\n parserChain: any[],\n ): Record<string, any> {\n const flagValues: Record<string, any> = {};\n\n // Collect all flags from the parser chain\n const allFlags: ProcessedFlag[] = [];\n for (const parser of parserChain) {\n allFlags.push(...parser.flags);\n }\n\n /**\n * Normalizes a key for comparison by converting to lowercase and removing underscores/hyphens.\n * This allows matching between SCREAMING_SNAKE_CASE (env vars) and camelCase (flag names).\n * E.g., \"TEST_VAR\" -> \"testvar\", \"testVar\" -> \"testvar\", \"test-var\" -> \"testvar\"\n */\n const normalizeKey = (key: string): string => {\n return key.toLowerCase().replace(/[-_]/g, \"\");\n };\n\n // Convert each config value to the appropriate flag type\n for (const [key, value] of Object.entries(rawConfig)) {\n // Try exact match first\n let flag = allFlags.find((f) => f[\"name\"] === key);\n\n // Try case-insensitive match\n if (!flag) {\n flag = allFlags.find(\n (f) => f[\"name\"].toLowerCase() === key.toLowerCase(),\n );\n }\n\n // Try normalized match (handles SCREAMING_SNAKE_CASE to camelCase)\n if (!flag) {\n const normalizedKey = normalizeKey(key);\n flag = allFlags.find((f) => normalizeKey(f[\"name\"]) === normalizedKey);\n }\n\n if (flag) {\n try {\n // Use the actual flag name (not the config key) for consistency\n flagValues[flag[\"name\"]] = this.convertValueToFlagType(value, flag);\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not convert config value for flag '${key}': ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n }\n }\n\n return flagValues;\n }\n\n /**\n * Converts a value to the appropriate flag type\n */\n public convertValueToFlagType(value: any, flag: ProcessedFlag): any {\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle both string literal and String constructor function\n const flagType = flag[\"type\"];\n const isStringType = flagType === \"string\" || flagType === String;\n const isNumberType = flagType === \"number\" || flagType === Number;\n const isBooleanType = flagType === \"boolean\" || flagType === Boolean;\n\n if (isStringType) {\n // Handle allowMultiple flags that expect arrays\n if (flag[\"allowMultiple\"]) {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") {\n try {\n // Try to parse as JSON array\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) return parsed;\n } catch (e) {\n // Try to split by comma\n return value.split(\",\").map((v) => v.trim());\n }\n }\n return [String(value)];\n }\n return String(value);\n } else if (isNumberType) {\n // If it's already a number, return it as-is\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (isNaN(num)) {\n throw new Error(\n `Cannot convert '${value}' to number for flag '${flag[\"name\"]}'`,\n );\n }\n return num;\n } else if (isBooleanType) {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (\n lower === \"true\" ||\n lower === \"1\" ||\n lower === \"yes\" ||\n lower === \"on\"\n )\n return true;\n if (\n lower === \"false\" ||\n lower === \"0\" ||\n lower === \"no\" ||\n lower === \"off\"\n )\n return false;\n }\n throw new Error(\n `Cannot convert '${value}' to boolean for flag '${flag[\"name\"]}'`,\n );\n } else if (flagType === \"table\") {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") {\n try {\n // Try to parse as JSON array\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) return parsed;\n } catch (e) {\n // Try to split by comma\n return value.split(\",\").map((v) => v.trim());\n }\n }\n throw new Error(\n `Cannot convert '${value}' to table for flag '${flag[\"name\"]}'`,\n );\n } else {\n // Handle custom type functions or fallback to string\n if (typeof flagType === \"function\") {\n try {\n return flagType(value);\n } catch (error) {\n throw new Error(\n `Custom type conversion failed for flag '${flag[\"name\"]}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return String(value);\n }\n }\n\n /**\n * Merges environment configuration with command line arguments\n */\n public mergeEnvConfigWithArgs(\n envConfig: Record<string, any>,\n processArgs: string[],\n parserChain?: any[],\n ): string[] {\n const mergedArgs = [...processArgs];\n\n // Collect all flags from the parser chain for option lookup\n const allFlags: ProcessedFlag[] = [];\n if (parserChain) {\n for (const parser of parserChain) {\n allFlags.push(...parser.flags);\n }\n }\n\n // Helper to get the primary flag option (e.g., \"--test-var\") for a flag name (e.g., \"testVar\")\n const getFlagOption = (flagName: string): string => {\n const flag = allFlags.find((f) => f[\"name\"] === flagName);\n if (\n flag &&\n Array.isArray(flag[\"options\"]) &&\n flag[\"options\"].length > 0\n ) {\n // Get the first option that starts with \"--\" (prefer long form)\n const longOption = flag[\"options\"].find((opt: string) =>\n opt.startsWith(\"--\"),\n );\n return longOption || flag[\"options\"][0];\n }\n // Fallback to default format if flag not found\n return `--${flagName}`;\n };\n\n // Add environment config values as flags if they're not already present\n for (const [key, value] of Object.entries(envConfig)) {\n const flagOption = getFlagOption(key);\n\n // Check if this flag is already present in the args\n // Check both the flag option and variations (e.g., --test-var and --testVar)\n const flagOptionWithoutDashes = flagOption.replace(/^--?/, \"\");\n const hasFlag = mergedArgs.some((arg) => {\n const argWithoutDashes = arg.replace(/^--?/, \"\").split(\"=\")[0];\n return (\n argWithoutDashes === flagOptionWithoutDashes ||\n argWithoutDashes === key\n );\n });\n\n if (!hasFlag) {\n if (typeof value === \"boolean\") {\n if (value) {\n mergedArgs.push(flagOption);\n }\n } else if (Array.isArray(value)) {\n // For table/array values, add multiple flags\n for (const item of value) {\n mergedArgs.push(flagOption, String(item));\n }\n } else {\n mergedArgs.push(flagOption, String(value));\n }\n }\n }\n\n return mergedArgs;\n }\n\n /**\n * Generates environment file format\n */\n public generateEnvFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration file\");\n lines.push(`# Generated on ${new Date().toISOString()}`);\n lines.push(\"\");\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n lines.push(`# ${flag[\"description\"] || flag[\"name\"]} `);\n lines.push(`# Type: ${this.getTypeString(flag[\"type\"])}`);\n\n if (Array.isArray(value)) {\n lines.push(`${flag[\"name\"].toUpperCase()}=${JSON.stringify(value)}`);\n } else if (typeof value === \"string\" && value.includes(\" \")) {\n lines.push(`${flag[\"name\"].toUpperCase()}=\"${value}\"`);\n } else {\n lines.push(`${flag[\"name\"].toUpperCase()}=${value}`);\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generates YAML file format (legacy method - now uses plugin system)\n */\n public generateYamlFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".yaml\");\n if (plugin) {\n // Plugin expects raw data object, not TParsedArgs\n return plugin.generate({}, flags, parsedArgs[\"data\"] || parsedArgs);\n }\n\n // Fallback: Simple YAML generation\n const lines: string[] = [];\n lines.push(\"# YAML configuration file\");\n lines.push(`# Generated on ${new Date().toISOString()}`);\n lines.push(\"\");\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n lines.push(`# ${flag[\"description\"] || flag[\"name\"]} `);\n lines.push(`# Type: ${this.getTypeString(flag[\"type\"])}`);\n\n if (Array.isArray(value)) {\n lines.push(`${flag[\"name\"]}:`);\n for (const item of value) {\n lines.push(\n ` - ${typeof item === \"string\" && item.includes(\" \") ? `\"${item}\"` : item}`,\n );\n }\n } else if (typeof value === \"string\" && value.includes(\" \")) {\n lines.push(`${flag[\"name\"]}: \"${value}\"`);\n } else {\n lines.push(`${flag[\"name\"]}: ${value}`);\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generates JSON file format\n */\n public generateJsonFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const config: Record<string, any> = {};\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n config[flag[\"name\"]] = value;\n }\n }\n\n return JSON.stringify(config, null, 2);\n }\n\n /**\n * Generates TOML file format (legacy method - now uses plugin system)\n */\n public generateTomlFormat(\n flags: ProcessedFlag[],\n parsedArgs: TParsedArgs<any>,\n ): string {\n const plugin = globalConfigPluginRegistry.getPluginByExtension(\".toml\");\n if (plugin) {\n // Plugin expects raw data object, not TParsedArgs\n return plugin.generate({}, flags, parsedArgs[\"data\"] || parsedArgs);\n }\n\n // Fallback: Simple TOML generation\n const lines: string[] = [];\n lines.push(\"# TOML configuration file\");\n lines.push(`# Generated on ${new Date().toISOString()}`);\n lines.push(\"\");\n\n for (const flag of flags) {\n const value = parsedArgs[\"data\"][flag[\"name\"]];\n if (value !== undefined) {\n lines.push(`# ${flag[\"description\"] || flag[\"name\"]} `);\n lines.push(`# Type: ${this.getTypeString(flag[\"type\"])}`);\n\n if (Array.isArray(value)) {\n const arrayStr = value\n .map((item) =>\n typeof item === \"string\" ? `\"${item}\"` : String(item),\n )\n .join(\", \");\n lines.push(`${flag[\"name\"]} = [${arrayStr}]`);\n } else if (typeof value === \"string\") {\n lines.push(`${flag[\"name\"]} = \"${value}\"`);\n } else {\n lines.push(`${flag[\"name\"]} = ${value}`);\n }\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Gets a string representation of a flag type\n */\n private getTypeString(type: any): string {\n if (typeof type === \"string\") {\n return type;\n } else if (typeof type === \"function\") {\n return type.name || \"function\";\n } else {\n return \"unknown\";\n }\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { DxtPathResolver } from \"./dxt-path-resolver\";\n\n/**\n * Configuration object for log path with explicit relative base\n */\nexport interface LogPathConfig {\n /** The log file path */\n path: string;\n /** What the path should be relative to */\n relativeTo?: \"entry\" | \"cwd\" | \"absolute\";\n /** Manual base path override (used with relativeTo: 'absolute') */\n basePath?: string;\n}\n\n/**\n * Log path can be a simple string or a configuration object\n */\nexport type LogPath = string | LogPathConfig;\n\n/**\n * Attempts to detect the entry point script using multiple methods\n * @returns The detected entry point path or null if detection fails\n */\nexport function detectEntryPoint(): string | null {\n try {\n // Method 1: Check process.argv[1] (most reliable for direct execution)\n if (process.argv[1] && fs.existsSync(process.argv[1])) {\n return process.argv[1];\n }\n\n // Method 2: ES modules - import.meta.url (when available)\n // Note: This needs to be handled by the caller since import.meta is not available in all contexts\n\n // Method 3: CommonJS - __filename (when available)\n // Note: This also needs to be handled by the caller since __filename is not available in ES modules\n\n // Method 4: Try to find main module from require.main (CommonJS)\n if (\n typeof require !== \"undefined\" &&\n require.main &&\n require.main.filename\n ) {\n return require.main.filename;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Helper to get entry point from import.meta.url when in ES module context\n * @param importMetaUrl The import.meta.url value\n * @returns The file path\n */\nexport function getEntryPointFromImportMeta(importMetaUrl: string): string {\n // Simple URL to path conversion for file:// URLs\n if (importMetaUrl.startsWith(\"file://\")) {\n return decodeURIComponent(importMetaUrl.replace(\"file://\", \"\"));\n }\n return importMetaUrl;\n}\n\n/**\n * Helper to validate and normalize a log path string\n * @param path The path to validate\n * @returns The normalized path\n */\nfunction normalizePath(path: string): string {\n // Remove any trailing/leading whitespace\n return path.trim();\n}\n\n/**\n * Resolves a log path configuration to an absolute file path\n * @param logPath The log path configuration (string or object)\n * @param fallbackEntryPoint Optional fallback entry point if detection fails\n * @returns Absolute path to the log file\n */\nexport function resolveLogPath(\n logPath: LogPath,\n fallbackEntryPoint?: string,\n): string {\n // Handle string inputs\n if (typeof logPath === \"string\") {\n // First, substitute any DXT variables in the path\n const pathWithVariables = DxtPathResolver.substituteVariables(\n logPath,\n DxtPathResolver.detectContext(),\n );\n const normalizedPath = normalizePath(pathWithVariables);\n\n // Absolute paths - return as-is\n if (path.isAbsolute(normalizedPath)) {\n return normalizedPath;\n }\n\n // Explicit process.cwd() relative paths\n if (normalizedPath.startsWith(\"cwd:\")) {\n const relativePath = normalizedPath.slice(4); // Remove \"cwd:\" prefix\n return path.resolve(process.cwd(), relativePath);\n }\n\n // Default behavior: relative to entry point\n const entryPoint = detectEntryPoint() || fallbackEntryPoint;\n if (entryPoint) {\n return path.resolve(path.dirname(entryPoint), normalizedPath);\n }\n\n // Fallback to process.cwd() if entry point detection fails\n console.warn(\n `Warning: Could not detect entry point for log path resolution. ` +\n `Using process.cwd() as fallback. Path: ${normalizedPath}`,\n );\n return path.resolve(process.cwd(), normalizedPath);\n }\n\n // Handle object form\n const { path: logFilePath, relativeTo = \"entry\", basePath } = logPath;\n // Substitute DXT variables in the path\n const pathWithVariables = DxtPathResolver.substituteVariables(\n logFilePath,\n DxtPathResolver.detectContext(),\n );\n const normalizedPath = normalizePath(pathWithVariables);\n\n switch (relativeTo) {\n case \"absolute\":\n if (basePath) {\n // Substitute DXT variables in basePath as well\n const resolvedBasePath = DxtPathResolver.substituteVariables(\n basePath,\n DxtPathResolver.detectContext(),\n );\n return path.resolve(resolvedBasePath, normalizedPath);\n }\n if (path.isAbsolute(normalizedPath)) {\n return normalizedPath;\n }\n // If no basePath provided and path is not absolute, fall back to process.cwd()\n console.warn(\n `Warning: relativeTo 'absolute' specified but no basePath provided and path is not absolute. ` +\n `Using process.cwd() as fallback. Path: ${normalizedPath}`,\n );\n return path.resolve(process.cwd(), normalizedPath);\n\n case \"cwd\":\n return path.resolve(process.cwd(), normalizedPath);\n\n case \"entry\":\n default:\n const entryPoint = detectEntryPoint() || fallbackEntryPoint;\n if (entryPoint) {\n return path.resolve(path.dirname(entryPoint), normalizedPath);\n }\n\n // Fallback to process.cwd() if entry point detection fails\n console.warn(\n `Warning: Could not detect entry point for log path resolution. ` +\n `Using process.cwd() as fallback. Path: ${normalizedPath}`,\n );\n return path.resolve(process.cwd(), normalizedPath);\n }\n}\n\n/**\n * Creates a log path configuration for entry-point relative logging\n * @param path The relative path from the entry point\n * @returns LogPathConfig object\n */\nexport function entryRelative(path: string): LogPathConfig {\n return {\n path,\n relativeTo: \"entry\",\n };\n}\n\n/**\n * Creates a log path configuration for process.cwd() relative logging\n * @param path The relative path from process.cwd()\n * @returns LogPathConfig object\n */\nexport function cwdRelative(path: string): LogPathConfig {\n return {\n path,\n relativeTo: \"cwd\",\n };\n}\n\n/**\n * Creates a log path configuration for absolute path logging\n * @param path The absolute path or relative path\n * @param basePath Optional base path to resolve relative paths against\n * @returns LogPathConfig object\n */\nexport function absolutePath(path: string, basePath?: string): LogPathConfig {\n return {\n path,\n relativeTo: \"absolute\",\n basePath,\n };\n}\n\n/**\n * Utility to help migrate from old relative-to-cwd behavior\n * @param path The path that was previously relative to cwd\n * @returns String with explicit cwd: prefix\n */\nexport function legacyCwdPath(path: string): string {\n return `cwd:${path}`;\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { detectEntryPoint } from \"./log-path-utils\";\n\n/**\n * Context information for path resolution\n */\nexport interface IPathContext {\n /** Whether the code is running in a DXT environment */\n isDxt: boolean;\n /** DXT extension directory (when running in DXT) */\n extensionDir?: string;\n /** User's home directory */\n userHome?: string;\n /** Current working directory */\n cwd?: string;\n /** Entry point directory */\n entryDir?: string;\n}\n\n/**\n * Configuration for DXT variable substitution\n */\nexport interface IDxtVariableConfig {\n /** Custom variable values to override defaults */\n customVariables?: Record<string, string>;\n /** Whether to allow undefined variables (default: false) */\n allowUndefined?: boolean;\n}\n\n/**\n * DXT-aware path resolver with context detection and variable substitution\n */\nexport class DxtPathResolver {\n private static _cachedContext: IPathContext | null = null;\n\n /**\n * Detects the current execution context\n * @param forceRefresh - Force refresh of cached context\n * @returns Path context information\n */\n public static detectContext(forceRefresh = false): IPathContext {\n if (!forceRefresh && this._cachedContext) {\n return this._cachedContext;\n }\n\n const context: IPathContext = {\n isDxt: this.isDxtEnvironment(),\n userHome: typeof os.homedir === \"function\" ? os.homedir() : undefined,\n cwd:\n typeof process !== \"undefined\" && typeof process.cwd === \"function\"\n ? process.cwd()\n : undefined,\n };\n\n // Detect entry point directory\n const entryPoint = detectEntryPoint();\n if (entryPoint) {\n context.entryDir = path.dirname(entryPoint);\n }\n\n // Detect DXT extension directory if in DXT environment\n if (context.isDxt) {\n context.extensionDir = this.detectDxtExtensionDir();\n }\n\n this._cachedContext = context;\n return context;\n }\n\n /**\n * Checks if the current environment is a DXT environment\n * @returns True if running in DXT, false otherwise\n */\n public static isDxtEnvironment(): boolean {\n // Check for DXT-specific environment variables\n if (process.env[\"DXT_EXTENSION_DIR\"] || process.env[\"CLAUDE_DESKTOP_DXT\"]) {\n return true;\n }\n\n // Check for DXT-specific file patterns in the current directory\n const dxtIndicators = [\n \"manifest.json\", // DXT packages have manifest.json\n \".dxt\", // DXT marker file\n ];\n\n for (const indicator of dxtIndicators) {\n const indicatorPath = path.join(process.cwd(), indicator);\n if (fs.existsSync(indicatorPath)) {\n // Additional validation for manifest.json to ensure it's a DXT manifest\n if (indicator === \"manifest.json\") {\n try {\n const manifest = JSON.parse(\n fs.readFileSync(indicatorPath, \"utf-8\"),\n );\n if (manifest.server && manifest.user_config) {\n return true;\n }\n } catch {\n // Not a valid DXT manifest, continue checking\n }\n } else {\n return true;\n }\n }\n }\n\n // Check if running from a path that looks like a DXT extension\n const cwd = process.cwd();\n if (cwd.includes(\"claude-desktop\") || cwd.includes(\"extensions\")) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Detects the DXT extension directory\n * @returns DXT extension directory path or undefined\n */\n private static detectDxtExtensionDir(): string | undefined {\n // Check environment variable first\n if (process.env[\"DXT_EXTENSION_DIR\"]) {\n return process.env[\"DXT_EXTENSION_DIR\"];\n }\n\n // Try to detect from current working directory\n const cwd = process.cwd();\n\n // If we're in a DXT package, the extension dir is typically the parent or current directory\n if (fs.existsSync(path.join(cwd, \"manifest.json\"))) {\n return cwd;\n }\n\n // Look for parent directories that might be the extension dir\n let currentDir = cwd;\n for (let i = 0; i < 3; i++) {\n // Check up to 3 levels up\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n\n if (fs.existsSync(path.join(parentDir, \"manifest.json\"))) {\n return parentDir;\n }\n currentDir = parentDir;\n }\n\n return undefined;\n }\n\n /**\n * Resolves a path with DXT variable substitution\n * @param inputPath - Path that may contain DXT variables\n * @param context - Optional context (will be detected if not provided)\n * @param config - Optional configuration for variable substitution\n * @returns Resolved absolute path\n */\n public static resolvePath(\n inputPath: string,\n context?: IPathContext,\n config?: IDxtVariableConfig,\n ): string {\n const ctx = context || this.detectContext();\n const resolvedPath = this.substituteVariables(inputPath, ctx, config);\n\n // If already absolute, return as-is\n if (path.isAbsolute(resolvedPath)) {\n return resolvedPath;\n }\n\n // Resolve relative paths based on context\n if (ctx.isDxt && ctx.extensionDir) {\n return path.resolve(ctx.extensionDir, resolvedPath);\n } else if (ctx.entryDir) {\n return path.resolve(ctx.entryDir, resolvedPath);\n } else {\n return path.resolve(ctx.cwd || process.cwd(), resolvedPath);\n }\n }\n\n /**\n * Substitutes DXT variables in a path string\n * @param inputPath - Path containing variables like ${HOME}, ${__dirname}, etc.\n * @param context - Path context\n * @param config - Variable substitution configuration\n * @returns Path with variables substituted\n */\n public static substituteVariables(\n inputPath: string,\n context: IPathContext,\n config?: IDxtVariableConfig,\n ): string {\n const safeHomedir = () =>\n typeof os.homedir === \"function\" ? os.homedir() : \"/tmp\";\n const homeDir = context.userHome || safeHomedir();\n\n const variables: Record<string, string> = {\n // Standard DXT variables\n HOME: homeDir,\n DOCUMENTS: path.join(homeDir, \"Documents\"),\n DOWNLOADS: path.join(homeDir, \"Downloads\"),\n DESKTOP: path.join(homeDir, \"Desktop\"),\n pathSeparator: path.sep,\n\n // Context-specific variables\n __dirname:\n context.isDxt && context.extensionDir\n ? context.extensionDir\n : context.entryDir || context.cwd || process.cwd(),\n\n // DXT-specific variables\n ...(context.isDxt &&\n context.extensionDir && {\n DXT_DIR: context.extensionDir,\n EXTENSION_DIR: context.extensionDir,\n }),\n\n // Custom variables override defaults\n ...config?.customVariables,\n };\n\n // Replace variables in the format ${VARIABLE_NAME}\n return inputPath.replace(/\\$\\{([^}]*)\\}/g, (match, variableName) => {\n // Handle empty variable names\n if (!variableName.trim()) {\n if (config?.allowUndefined) {\n return match;\n }\n throw new Error(\n `Undefined DXT variable: ${variableName}. Available variables: ${Object.keys(variables).join(\", \")}`,\n );\n }\n\n const value = variables[variableName];\n\n if (value !== undefined) {\n return value;\n }\n\n if (config?.allowUndefined) {\n return match; // Keep the original variable if undefined is allowed\n }\n\n throw new Error(\n `Undefined DXT variable: ${variableName}. Available variables: ${Object.keys(variables).join(\", \")}`,\n );\n });\n }\n\n /**\n * Creates a path for user data storage\n * @param filename - Name of the file or subdirectory\n * @param context - Optional context (will be detected if not provided)\n * @returns Absolute path for user data\n */\n public static createUserDataPath(\n filename: string,\n context?: IPathContext,\n ): string {\n const ctx = context || this.detectContext();\n\n if (ctx.isDxt && ctx.extensionDir) {\n // In DXT environment, store in extension directory\n return path.join(ctx.extensionDir, \"data\", filename);\n } else {\n // In development, store in user's data directory\n const safeHomedir = () =>\n typeof os.homedir === \"function\" ? os.homedir() : \"/tmp\";\n const userDataDir =\n process.env[\"XDG_DATA_HOME\"] ||\n path.join(ctx.userHome || safeHomedir(), \".local\", \"share\");\n const appName = this.getAppName(ctx);\n return path.join(userDataDir, appName, filename);\n }\n }\n\n /**\n * Creates a path for temporary files\n * @param filename - Name of the temporary file\n * @param context - Optional context (will be detected if not provided)\n * @returns Absolute path for temporary file\n */\n public static createTempPath(\n filename: string,\n context?: IPathContext,\n ): string {\n const ctx = context || this.detectContext();\n\n if (ctx.isDxt && ctx.extensionDir) {\n // In DXT environment, use extension temp directory\n return path.join(ctx.extensionDir, \"temp\", filename);\n } else {\n // In development, use system temp directory\n const safeTmpdir = () =>\n typeof os.tmpdir === \"function\" ? os.tmpdir() : \"/tmp\";\n const appName = this.getAppName(ctx);\n return path.join(safeTmpdir(), appName, filename);\n }\n }\n\n /**\n * Creates a path for configuration files\n * @param filename - Name of the configuration file\n * @param context - Optional context (will be detected if not provided)\n * @returns Absolute path for configuration file\n */\n public static createConfigPath(\n filename: string,\n context?: IPathContext,\n ): string {\n const ctx = context || this.detectContext();\n\n if (ctx.isDxt && ctx.extensionDir) {\n // In DXT environment, store in extension directory\n return path.join(ctx.extensionDir, \"config\", filename);\n } else {\n // In development, store in user's config directory\n const safeHomedir = () =>\n typeof os.homedir === \"function\" ? os.homedir() : \"/tmp\";\n const configDir =\n process.env[\"XDG_CONFIG_HOME\"] ||\n path.join(ctx.userHome || safeHomedir(), \".config\");\n const appName = this.getAppName(ctx);\n return path.join(configDir, appName, filename);\n }\n }\n\n /**\n * Gets the application name for directory creation\n * @param context - Path context\n * @returns Application name or default\n */\n private static getAppName(context: IPathContext): string {\n // Try to get app name from package.json\n try {\n const packageJsonPath = path.join(\n context.entryDir || context.cwd || process.cwd(),\n \"package.json\",\n );\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, \"utf-8\"),\n );\n return packageJson.name || \"argparser-app\";\n }\n } catch {\n // Ignore errors\n }\n\n return \"argparser-app\";\n }\n\n /**\n * Ensures a directory exists, creating it if necessary\n * @param dirPath - Directory path to ensure\n * @returns True if directory exists or was created successfully\n */\n public static ensureDirectory(dirPath: string): boolean {\n try {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n return true;\n } catch (error) {\n console.warn(`Failed to create directory: ${dirPath}`, error);\n return false;\n }\n }\n\n /**\n * Clears the cached context (useful for testing)\n */\n public static clearCache(): void {\n this._cachedContext = null;\n }\n}\n","import { z, type ZodTypeAny } from \"zod\";\n\n// Forward declaration for ArgParser to avoid circular dependency in HandlerContext\n// This will be replaced or refined once ArgParser.ts is updated to use these types.\nexport type ArgParserInstance = IArgParser;\n\n/**\n * Interface defining the MCP server methods expected by ArgParserBase.\n * This allows ArgParserBase to use these methods without depending on the concrete ArgParser class.\n */\nexport interface IMcpServerMethods {\n createMcpServer(\n serverInfo?: any,\n toolOptions?: any,\n logPath?: any,\n ): Promise<any>;\n\n startMcpServerWithTransport(\n serverInfo: any,\n transportType: string,\n transportOptions: any,\n toolOptions: any,\n logPath?: string,\n ): Promise<void>;\n\n startMcpServerWithMultipleTransports(\n serverInfo: any,\n transports: any[],\n toolOptions: any,\n logPath?: string,\n ): Promise<void>;\n\n getMcpServerConfig(): any;\n}\n\n/**\n * Interface representing the public API of ArgParser/ArgParserBase.\n */\nexport interface IArgParser<THandlerReturn = any> {\n // Common methods from ArgParserBase\n getAppName(): string | undefined;\n getAppCommandName(): string | undefined;\n getSubCommandName(): string;\n getDescription(): string | undefined;\n getAutoExit(): boolean;\n getHandler(): ((ctx: IHandlerContext) => void) | undefined;\n getSubCommands(): Map<string, ISubCommand>;\n get logger(): any;\n\n // Flag methods\n get flags(): ProcessedFlag[];\n get flagNames(): string[];\n addFlag(flag: IFlag): this;\n addFlags(flags: readonly IFlag[]): this;\n hasFlag(name: string): boolean;\n getFlagDefinition(name: string): ProcessedFlag | undefined;\n\n // Subcommand methods\n addSubCommand(subCommandConfig: ISubCommand): this;\n getSubCommand(name: string): ISubCommand | undefined;\n\n // Parsing methods\n parse(processArgs?: string[], options?: any): Promise<any>;\n\n // Configuration methods\n setHandler(\n handler: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>,\n ): this;\n\n // Help\n helpText(): string;\n printAll(filePath?: string): void;\n getCommandChain(): string[];\n\n // MCP methods (optional or requires casting)\n addMcpResource(config: any): this;\n removeMcpResource(name: string): this;\n getMcpResources(): any[];\n addMcpPrompt(config: any): this;\n removeMcpPrompt(name: string): this;\n getMcpPrompts(): any[];\n\n // MCP methods from ArgParser subclass (optional in interface but present at runtime)\n getMcpServerConfig?(): any;\n}\n\n/**\n * Defines the behavior for flag inheritance in sub-commands.\n */\nexport const FlagInheritance = {\n /**\n * No flags are inherited from the parent.\n */\n NONE: \"none\",\n /**\n * Inherits flags only from the direct parent at the time of attachment (Snapshot behavior).\n * Equivalent to `true` in legacy boolean config.\n */\n DirectParentOnly: \"direct-parent-only\",\n /**\n * Inherits flags from the entire parent chain, ensuring grandchildren receive root flags\n * even in bottom-up construction scenarios.\n */\n AllParents: \"all-parents\",\n} as const;\n\nexport type TFlagInheritance =\n | (typeof FlagInheritance)[keyof typeof FlagInheritance]\n | boolean;\n\n/**\n * Zod schema for validating DXT-specific options\n */\nexport const zodDxtOptionsSchema = z\n .object({\n sensitive: z\n .boolean()\n .optional()\n .describe(\n \"Whether this field should be marked as sensitive in DXT user_config\",\n ),\n localDefault: z\n .string()\n .optional()\n .describe(\"Default value specific to DXT sandbox environment\"),\n type: z\n .enum([\"string\", \"directory\", \"file\", \"boolean\", \"number\"])\n .optional()\n .describe(\"DXT input type - determines UI component in DXT clients\"),\n multiple: z\n .boolean()\n .optional()\n .describe(\"Allow multiple values (for arrays)\"),\n min: z.number().optional().describe(\"Minimum value (for number type)\"),\n max: z.number().optional().describe(\"Maximum value (for number type)\"),\n default: z\n .any()\n .optional()\n .describe(\n \"DXT-specific default value (overrides localDefault if provided)\",\n ),\n title: z\n .string()\n .optional()\n .describe(\"Custom title for the user_config field\"),\n })\n .strict()\n .refine(\n (data) => {\n // If min or max are provided, type should be \"number\"\n if (\n (data.min !== undefined || data.max !== undefined) &&\n data.type !== \"number\"\n ) {\n return false;\n }\n // If min and max are both provided, min should be <= max\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.min > data.max\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"Invalid dxtOptions: min/max can only be used with type 'number', and min must be <= max\",\n },\n );\n\nexport const zodFlagSchema = z\n .object({\n name: z\n .string()\n .min(1, \"Flag name cannot be empty\")\n .describe(\n \"The output property name, used as a return key `{name: value}`. Must be unique.\",\n ),\n allowLigature: z\n .boolean()\n .default(true)\n .describe(\n \"Enable both forms of flag input, e.g., `./script.js -f=value` and `-f value`.\",\n ),\n allowMultiple: z\n .boolean()\n .default(false)\n .describe(\n \"Allow passing the same flag multiple times, e.g., `-f val1 -f val2` results in an array.\",\n ),\n description: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\"Textual description for help messages.\"),\n valueHint: z\n .string()\n .optional()\n .describe(\"Hint/example value shown in help and examples.\"),\n options: z\n .array(z.string().min(1))\n .min(1, \"Flag must have at least one option (e.g., ['-f', '--flag'])\")\n .describe(\"Array of option strings, e.g., ['-f', '--flag'].\"),\n defaultValue: z\n .any()\n .optional()\n .describe(\"Default value if the flag is not provided.\"),\n type: z\n .union([\n z.any().refine((val) => val === String, {\n message: \"Must be String constructor\",\n }),\n z.any().refine((val) => val === Number, {\n message: \"Must be Number constructor\",\n }),\n z.any().refine((val) => val === Boolean, {\n message: \"Must be Boolean constructor\",\n }),\n z.any().refine((val) => val === Array, {\n // Native Array constructor\n message: \"Must be Array constructor\",\n }),\n z.any().refine((val) => val === Object, {\n // Native Object constructor\n message: \"Must be Object constructor\",\n }),\n z.custom<(value: string) => any | Promise<any>>(\n (val) => typeof val === \"function\",\n \"Must be a custom parser function\",\n ), // Custom parser function (value: string) => any | Promise<any>\n z.custom<ZodTypeAny>(\n (val) => val && typeof val === \"object\" && (val as any)._def,\n \"Must be a Zod schema\",\n ), // Zod schema for structured JSON validation\n z.string().refine(\n // String literal types\n (value) =>\n [\"boolean\", \"string\", \"number\", \"array\", \"object\"].includes(\n value.toLowerCase(),\n ),\n {\n message:\n \"Invalid type string. Must be one of 'boolean', 'string', 'number', 'array', 'object'.\",\n },\n ),\n ])\n .default(\"string\") // Default type is string if not specified\n .describe(\n \"Expected data type (constructor, string literal, custom parser function, or Zod schema). Defaults to 'string'.\",\n ),\n mandatory: z\n .union([\n z.boolean(),\n z.custom<(value?: any, parsedArgs?: any) => boolean>(\n (val) => typeof val === \"function\",\n \"Must be a boolean or function\",\n ),\n ]) // `z.any()` for parsedArgs flexibility\n .optional()\n .describe(\n \"Makes the flag mandatory, can be a boolean or a function conditional on other args.\",\n ),\n flagOnly: z\n .boolean()\n .default(false)\n .describe(\n \"If true, the flag's presence is noted (true/false), and any subsequent value is not consumed by this flag.\",\n ),\n validate: z // User-provided validation function\n .custom<\n (\n value?: any,\n parsedArgs?: any,\n ) => boolean | string | void | Promise<boolean | string | void>\n >((val) => typeof val === \"function\", \"Must be a validation function\")\n .optional()\n .describe(\n \"Custom validation function for the flag's value (receives value, parsedArgs).\",\n ),\n enum: z // User-provided enum values\n .array(z.any())\n .optional()\n .describe(\"Array of allowed values for the flag.\"),\n env: z // Environment variables mapping\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe(\n \"Environment variable(s) to map to this flag. Logic: Fallback (Env -> Flag) and Sync (Flag -> Env). Precedence: Flag > Env > Default.\",\n ),\n dxtOptions: zodDxtOptionsSchema\n .optional()\n .describe(\n \"DXT-specific configuration options for enhanced DXT manifest generation\",\n ),\n dynamicRegister: z\n .custom<DynamicRegisterFn>((val) => typeof val === \"function\")\n .optional()\n .describe(\n \"Optional callback that can register additional flags dynamically when this flag is present.\",\n ),\n setWorkingDirectory: z\n .boolean()\n .optional()\n .describe(\n \"If true, this flag's value becomes the effective working directory for file operations.\",\n ),\n positional: z\n .number()\n .int()\n .positive(\"Positional index must be a positive integer (1, 2, 3...)\")\n .optional()\n .describe(\n \"If set, this flag captures the Nth trailing positional argument (1-indexed). \" +\n \"Multiple flags can have different positional values to capture multiple trailing args in order.\",\n ),\n })\n // Allow unrecognized properties by default in Zod v4\n .transform((obj) => {\n // Alias handling for 'default' and 'required'\n const newObj: { [key: string]: any } = { ...obj };\n if (\n \"default\" in newObj &&\n newObj[\"default\"] !== undefined &&\n !(\"defaultValue\" in newObj)\n ) {\n newObj[\"defaultValue\"] = newObj[\"default\"];\n }\n if (\n \"required\" in newObj &&\n newObj[\"required\"] !== undefined &&\n !(\"mandatory\" in newObj)\n ) {\n newObj[\"mandatory\"] = newObj[\"required\"] as\n | boolean\n | ((parsedArgs: any) => boolean);\n }\n return newObj;\n });\n\n/**\n * The raw input type for defining a flag, before Zod processing (aliases, defaults).\n */\nexport type IFlagCore = z.input<typeof zodFlagSchema>;\n\n/**\n * The type of the `type` property in a ProcessedFlagCore object.\n * This represents all valid forms the `type` property can take after Zod processing.\n */\nexport type TParsedArgsTypeFromFlagDef =\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor\n | ((value: string) => any) // Sync custom parser function\n | ((value: string) => Promise<any>) // Async custom parser function\n | ZodTypeAny // Zod schema for structured JSON validation\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"array\"\n | \"object\"; // String literal types\n\n/**\n * The core type of a flag after Zod processing (defaults applied, aliases resolved),\n * but before some properties are made more specific (like `type` constructor to actual type).\n * This type is output by `zodFlagSchema.parse()`.\n */\nexport type ProcessedFlagCore = Omit<z.output<typeof zodFlagSchema>, \"type\"> & {\n type: TParsedArgsTypeFromFlagDef;\n};\n\n/**\n * DXT-specific configuration options for flags that will be included in DXT manifests.\n * These options control how the flag appears in DXT user_config and how it behaves in DXT environments.\n */\nexport interface IDxtOptions {\n /** Whether this field should be marked as sensitive in DXT user_config (default: true for ENV-linked flags) */\n sensitive?: boolean;\n\n /** Default value specific to DXT sandbox environment (different from regular default) */\n localDefault?: string;\n\n /** DXT input type - determines UI component in DXT clients (default: inferred from IFlag.type) */\n type?: \"string\" | \"directory\" | \"file\" | \"boolean\" | \"number\";\n\n /** Allow multiple values (for arrays) */\n multiple?: boolean;\n\n /** Minimum value (for number type) */\n min?: number;\n\n /** Maximum value (for number type) */\n max?: number;\n\n /** DXT-specific default value (overrides localDefault if provided) */\n default?: any;\n\n /** Custom title for the user_config field (overrides auto-generated title) */\n title?: string;\n}\n\n/**\n * The user-facing type for defining a flag. It includes aliases like `default` and `required`.\n * The `handler` property is removed as handlers are typically associated with commands/subcommands, not individual flags.\n */\nexport type IFlag = IFlagCore & {\n /** @alias defaultValue */\n default?: any;\n /** @alias mandatory */\n required?: boolean | ((parsedArgs: TParsedArgs<any>) => boolean);\n /** Environment variables that should be set from this flag's value in DXT packages */\n env?: string | string[];\n /** DXT-specific configuration options for enhanced DXT manifest generation */\n dxtOptions?: IDxtOptions;\n /** Optional callback to dynamically register additional flags when this flag is present */\n dynamicRegister?: DynamicRegisterFn;\n /**\n * If true, this flag's value becomes the effective working directory.\n * When set, all file operations (including .env loading) will be relative to this path.\n * Last flag with this property in the command chain wins.\n *\n * @alias chdir\n *\n * @example\n * ```typescript\n * .addFlag({\n * name: \"workspace\",\n * description: \"Workspace directory to operate in\",\n * options: [\"--workspace\", \"-w\"],\n * type: \"string\",\n * setWorkingDirectory: true,\n * })\n * ```\n *\n * @example\n * ```typescript\n * // User runs: my-cli --workspace ./packages/my-app\n * // Effective cwd becomes: /repo/packages/my-app/\n * // All .env files are loaded from: /repo/packages/my-app/\n * ```\n */\n setWorkingDirectory?: boolean;\n /**\n * Captures the Nth trailing positional argument (1-indexed).\n *\n * - `positional: 1` captures the first trailing arg\n * - `positional: 2` captures the second trailing arg\n * - etc.\n *\n * Positional args are assigned AFTER all flags and subcommands are parsed.\n * The flag's `options` array still works as a fallback (e.g., `--id xxx`).\n *\n * @example\n * ```typescript\n * .addFlag({\n * name: \"id\",\n * type: \"string\",\n * mandatory: true,\n * options: [\"--id\"], // Fallback: --id xxx\n * positional: 1, // Primary: workflow show xxx\n * description: \"Workflow ID to show\",\n * })\n * ```\n */\n positional?: number;\n};\n\n/**\n * Context for dynamic flag registration callbacks.\n */\nexport type DynamicRegisterContext = {\n value: any | any[];\n argsSoFar: Record<string, any>;\n parser: ArgParserInstance;\n processArgs: string[];\n forHelp?: boolean;\n registerFlags: (flags: readonly IFlag[]) => void;\n};\n\n/**\n * Function signature for dynamic flag loader/registrar.\n */\nexport type DynamicRegisterFn = (\n ctx: DynamicRegisterContext,\n) => Promise<readonly IFlag[] | void> | readonly IFlag[] | void;\n\n/**\n * A more refined type for a flag after it has been fully processed by ArgParser,\n * particularly its `type` property and validation/enum/mandatory functions.\n * This is the type that ArgParser would internally work with for parsing and type extraction.\n */\nexport type ProcessedFlag = Omit<\n ProcessedFlagCore,\n \"validate\" | \"enum\" | \"mandatory\"\n> & {\n // `type` is already correctly typed via ProcessedFlagCore.\n validate?: (\n value: any,\n parsedArgs?: TParsedArgs<ProcessedFlag[]>, // Parsed args up to this point\n ) => boolean | string | void | Promise<boolean | string | void>;\n enum?: any[]; // Enum values, type-checked by user or ArgParser\n mandatory?: boolean | ((parsedArgs: TParsedArgs<ProcessedFlag[]>) => boolean);\n env?: string | string[]; // Environment variables for DXT packages\n dynamicRegister?: DynamicRegisterFn;\n positional?: number; // Captures Nth trailing positional argument (1-indexed)\n};\n\n/**\n * Resolves the TypeScript type from a flag's `type` definition.\n */\nexport type ResolveType<T extends TParsedArgsTypeFromFlagDef> =\n T extends StringConstructor\n ? string\n : T extends NumberConstructor\n ? number\n : T extends BooleanConstructor\n ? boolean\n : T extends ArrayConstructor\n ? any[] // Default to array of any if not further specified\n : T extends ObjectConstructor\n ? Record<string, any> // Default to object with any properties\n : T extends ZodTypeAny\n ? z.infer<T> // Infer TypeScript type from Zod schema\n : T extends \"string\"\n ? string\n : T extends \"number\"\n ? number\n : T extends \"boolean\"\n ? boolean\n : T extends \"array\"\n ? any[] // Default for string literal 'array'\n : T extends \"object\"\n ? Record<string, any> // Default for string literal 'object'\n : T extends (value: string) => infer R // Custom parser function\n ? R // The return type of the custom parser\n : any; // Fallback type\n\n/**\n * Extracts the final TypeScript type for a flag's value based on its definition,\n * considering `flagOnly` and `allowMultiple` properties.\n */\nexport type ExtractFlagType<TFlag extends ProcessedFlag> =\n TFlag[\"flagOnly\"] extends true // If the flag is a \"flag-only\" (presence) type\n ? TFlag[\"allowMultiple\"] extends true\n ? boolean[] // Multiple presence flags result in an array of booleans\n : boolean // Single presence flag results in a boolean\n : TFlag[\"allowMultiple\"] extends true // If the flag can have multiple values\n ? Array<ResolveType<TFlag[\"type\"]>> // Results in an array of the resolved type\n : ResolveType<TFlag[\"type\"]>; // Single value of the resolved type\n\n/**\n * Represents the structured object of parsed arguments.\n * Keys are flag names, and values are their parsed and typed values.\n * `TFlags` should be the array of `ProcessedFlag` definitions for the specific command.\n */\nexport type TParsedArgs<TFlags extends readonly ProcessedFlag[]> = {\n [K in TFlags[number][\"name\"]]: ExtractFlagType<\n Extract<TFlags[number], { name: K }>\n >;\n};\n\n/**\n * Generic context object passed to command handlers.\n * @template TCurrentCommandArgs Shape of `args` for the current command, derived from its flags.\n * @template TParentCommandArgs Shape of `parentArgs` from the parent command, if any.\n */\nexport type IHandlerContext<\n TCurrentCommandArgs = any,\n TParentCommandArgs = any,\n> = {\n /** Parsed arguments specific to the current command. */\n args: TCurrentCommandArgs;\n /** Parsed arguments from the parent command, if this is a subcommand. */\n parentArgs?: TParentCommandArgs;\n /** The sequence of command names that led to this handler. */\n commandChain: string[];\n /** The `ArgParser` instance that invoked this handler (could be a subcommand's parser). */\n parser: ArgParserInstance;\n /** The parent `ArgParser` instance, if this is a subcommand handler. */\n parentParser?: ArgParserInstance;\n /** Optional: The root `ArgParser` instance of the CLI. */\n // rootParser?: ArgParserInstance;\n /** Indicates if the handler is being called from MCP mode (true) or CLI mode (false). */\n isMcp?: boolean;\n /**\n * Get a flag value with proper resolution priority (CLI flag > ENV > default).\n * Only available in MCP mode when isMcp is true.\n */\n getFlag?: (name: string) => any;\n /**\n * Display the help message for the current command context.\n */\n displayHelp: () => void;\n /**\n * The root path from the user's CLI command perspective.\n * This is the original current working directory when the CLI was invoked.\n *\n * Use this when you need to reference paths relative to where the user ran the command,\n * as opposed to the effective working directory (which may have been changed by\n * flags with `setWorkingDirectory`).\n *\n * @example\n * // User runs: my-cli --workspace ./packages/app --input ./data/file.txt\n * // From /repo/ directory\n *\n * // In handler:\n * console.log(ctx.rootPath); // \"/repo/\" (where user ran command)\n * console.log(process.cwd()); // \"/repo/packages/app/\" (effective cwd)\n * console.log(ctx.args.input); // \"./data/file.txt\" (relative to effective cwd)\n *\n * // To resolve ctx.args.input relative to user's cwd:\n * const userInputPath = path.resolve(ctx.rootPath, ctx.args.input);\n */\n rootPath?: string;\n /**\n * Data-safe logger instance.\n * In MCP mode, this logger ensures STDOUT safety by routing logs to STDERR or a file.\n */\n logger: any; // Using any to avoid circular dependency or complex type imports in types.ts\n};\n\n/**\n * Generic type for the collection of processed flags that an ArgParser instance manages.\n */\nexport type FlagsArray = readonly ProcessedFlag[];\n\n/**\n * Converts a flag type to a JSON Schema type string.\n * This function handles all possible flag type formats and returns a valid JSON Schema type.\n *\n * @param flagType - The flag type from IFlag or ProcessedFlag\n * @returns A JSON Schema type string: \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\"\n *\n * @example\n * ```typescript\n * getJsonSchemaTypeFromFlag(String) // returns \"string\"\n * getJsonSchemaTypeFromFlag(\"number\") // returns \"number\"\n * getJsonSchemaTypeFromFlag((val) => parseInt(val)) // returns \"string\" (fallback for custom functions)\n * ```\n */\nexport function getJsonSchemaTypeFromFlag(\n flagType: TParsedArgsTypeFromFlagDef,\n): \"string\" | \"number\" | \"boolean\" | \"array\" | \"object\" {\n // Handle Zod schemas first\n if (flagType && typeof flagType === \"object\" && flagType._def) {\n // For Zod schemas, we'll return \"object\" as they represent structured data\n // The actual JSON Schema will be generated by the MCP integration layer\n return \"object\";\n }\n\n // Handle constructor functions\n if (typeof flagType === \"function\") {\n // Check if it's a built-in constructor\n if (flagType === String) return \"string\";\n if (flagType === Number) return \"number\";\n if (flagType === Boolean) return \"boolean\";\n if (flagType === Array) return \"array\";\n if (flagType === Object) return \"object\";\n\n // For custom parser functions, we can't determine the return type at compile time\n // so we default to \"string\" as the safest fallback for JSON Schema\n return \"string\";\n }\n\n // Handle string literals\n if (typeof flagType === \"string\") {\n const normalizedType = flagType.toLowerCase();\n switch (normalizedType) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n default:\n // Unknown string type, default to string\n return \"string\";\n }\n }\n\n // Fallback for any other type\n return \"string\";\n}\n\n/**\n * Common output schema patterns for typical CLI/MCP tool responses\n */\nexport const OutputSchemaPatterns = {\n /**\n * Simple success/error response pattern\n * @example { success: true, message: \"Operation completed\" }\n */\n successError: () =>\n z.object({\n success: z.boolean().describe(\"Whether the operation was successful\"),\n message: z\n .string()\n .optional()\n .describe(\"Optional message about the operation\"),\n error: z\n .string()\n .optional()\n .describe(\"Error message if operation failed\"),\n }),\n\n /**\n * Success response with data payload\n * @example { success: true, data: {...}, message: \"Data retrieved\" }\n */\n successWithData: (dataSchema?: z.ZodTypeAny) =>\n z.object({\n success: z.boolean().describe(\"Whether the operation was successful\"),\n data: dataSchema || z.any().describe(\"The response data\"),\n message: z\n .string()\n .optional()\n .describe(\"Optional message about the operation\"),\n error: z\n .string()\n .optional()\n .describe(\"Error message if operation failed\"),\n }),\n\n /**\n * List/array response pattern\n * @example { items: [...], count: 5, hasMore: false }\n */\n list: (itemSchema?: z.ZodTypeAny) =>\n z.object({\n items: z.array(itemSchema || z.any()).describe(\"Array of items\"),\n count: z.number().optional().describe(\"Total number of items\"),\n hasMore: z\n .boolean()\n .optional()\n .describe(\"Whether there are more items available\"),\n }),\n\n /**\n * File operation response pattern\n * @example { path: \"/path/to/file\", size: 1024, created: true }\n */\n fileOperation: () =>\n z.object({\n path: z.string().describe(\"File path\"),\n size: z.number().optional().describe(\"File size in bytes\"),\n created: z.boolean().optional().describe(\"Whether the file was created\"),\n modified: z\n .boolean()\n .optional()\n .describe(\"Whether the file was modified\"),\n exists: z.boolean().optional().describe(\"Whether the file exists\"),\n }),\n\n /**\n * Process execution response pattern\n * @example { exitCode: 0, stdout: \"output\", stderr: \"\", duration: 1500 }\n */\n processExecution: () =>\n z.object({\n exitCode: z.number().describe(\"Process exit code\"),\n stdout: z.string().optional().describe(\"Standard output\"),\n stderr: z.string().optional().describe(\"Standard error output\"),\n duration: z\n .number()\n .optional()\n .describe(\"Execution duration in milliseconds\"),\n command: z.string().optional().describe(\"The command that was executed\"),\n }),\n} as const;\n\n/**\n * Type for output schema pattern names with auto-completion support\n */\nexport type OutputSchemaPatternName = keyof typeof OutputSchemaPatterns;\n\n/**\n * Type for output schema configuration - supports pattern names, Zod schemas, or schema definition objects\n */\nexport type OutputSchemaConfig =\n | OutputSchemaPatternName\n | z.ZodTypeAny\n | Record<string, z.ZodTypeAny>;\n\n/**\n * Creates a Zod output schema from a pattern or custom definition\n *\n * @param pattern - Either a predefined pattern name, a Zod schema, or a schema definition object\n * @returns A Zod schema for output validation\n *\n * @example\n * ```typescript\n * // Using a predefined pattern\n * const schema1 = createOutputSchema('successError');\n *\n * // Using a custom Zod schema\n * const schema2 = createOutputSchema(z.object({ result: z.string() }));\n *\n * // Using a schema definition object\n * const schema3 = createOutputSchema({\n * result: z.string().describe(\"The result\"),\n * timestamp: z.string().describe(\"When the operation completed\")\n * });\n * ```\n */\nexport function createOutputSchema(pattern: OutputSchemaConfig): z.ZodTypeAny {\n // Handle predefined patterns\n if (typeof pattern === \"string\" && pattern in OutputSchemaPatterns) {\n return OutputSchemaPatterns[pattern]();\n }\n\n // Handle Zod schema directly\n if (pattern && typeof pattern === \"object\" && \"_def\" in pattern) {\n return pattern as z.ZodTypeAny;\n }\n\n // Handle schema definition object\n if (pattern && typeof pattern === \"object\") {\n return z.object(pattern as Record<string, z.ZodTypeAny>);\n }\n\n // Fallback to a generic success pattern\n return OutputSchemaPatterns.successError();\n}\n\n/**\n * Defines a subcommand within an ArgParser setup.\n * @template TSubCommandFlags Flags defined specifically FOR this subcommand.\n * @template TParentCommandFlags Flags defined for the PARENT of this subcommand.\n * @template THandlerReturn The expected return type of the subcommand's handler.\n */\nexport interface ISubCommand<\n TSubCommandFlags extends FlagsArray = FlagsArray,\n TParentCommandFlags extends FlagsArray = FlagsArray,\n THandlerReturn = any,\n> {\n name: string;\n description?: string;\n /** The ArgParser instance for this subcommand, typed with its own flags. */\n // Ideally: parser: ArgParser<TSubCommandFlags>; (if ArgParser class is made generic)\n parser: ArgParserInstance;\n /** Handler function for this subcommand. */\n handler?: (\n ctx: IHandlerContext<\n TParsedArgs<TSubCommandFlags>,\n TParsedArgs<TParentCommandFlags>\n >,\n ) => THandlerReturn | Promise<THandlerReturn>;\n /** Internal flag to identify MCP subcommands for proper exclusion from tool generation */\n isMcp?: boolean;\n /** MCP server information for DXT generation */\n mcpServerInfo?: {\n name: string;\n version: string;\n description?: string;\n };\n /** MCP tool generation options for DXT generation */\n mcpToolOptions?: any;\n}\n\n/**\n * Result of parsing operations that replaces process.exit() calls.\n * Provides structured information about the parsing outcome.\n */\nexport interface ParseResult<T = any> {\n /** Whether the parsing was successful */\n success: boolean;\n /** Exit code that would have been used with process.exit() */\n exitCode: number;\n /** The parsed data/result when successful */\n data?: T;\n /** Human-readable message about the result */\n message?: string;\n /** Whether the process should exit (for help, version, etc.) */\n shouldExit?: boolean;\n /** Type of result for better handling */\n type?: \"success\" | \"error\" | \"help\" | \"version\" | \"debug\";\n}\n\n/**\n * Configuration options for ArgParser behavior\n * @deprecated Use IArgParserParams for full configuration options. This interface will be removed in v3.0.\n */\nexport interface ArgParserOptions {\n /** Whether to automatically call process.exit() based on ParseResult (default: true for backward compatibility) */\n autoExit?: boolean;\n /** Whether to handle errors by exiting or throwing (default: true for backward compatibility) */\n handleErrors?: boolean;\n}\n\n/**\n * Configuration options for ArgParser runtime behavior\n * This is a more clearly named version of ArgParserOptions\n */\nexport interface ArgParserBehaviorOptions {\n /** Whether to automatically call process.exit() based on ParseResult (default: true for backward compatibility) */\n autoExit?: boolean;\n /** Whether to handle errors by exiting or throwing (default: true for backward compatibility) */\n handleErrors?: boolean;\n}\n\n/**\n * Type for the main handler of an ArgParser instance (root command or a command defined by an ArgParser).\n * @template TParserFlags Flags defined for this ArgParser instance.\n * @template TParentParserFlags Flags of the parent parser, if this parser is used as a subcommand.\n * @template THandlerReturn The expected return type of the handler.\n */\nexport type MainHandler<\n TParserFlags extends FlagsArray = FlagsArray,\n TParentParserFlags extends FlagsArray = FlagsArray,\n THandlerReturn = any,\n> = (\n ctx: IHandlerContext<\n TParsedArgs<TParserFlags>,\n TParsedArgs<TParentParserFlags>\n >,\n) => THandlerReturn | Promise<THandlerReturn>;\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ParseResult } from \"../core/types\";\n\n/**\n * Test utilities for DxtGenerator\n * Contains methods that are only used during testing\n */\nexport class DxtGeneratorTestUtils {\n private argParserInstance: any;\n private extractMcpServerInfo: () => any;\n private handleExit: (\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ) => ParseResult | never;\n\n constructor(\n argParserInstance: any,\n extractMcpServerInfo: () => any,\n handleExit: (\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ) => ParseResult | never,\n ) {\n this.argParserInstance = argParserInstance;\n this.extractMcpServerInfo = extractMcpServerInfo;\n this.handleExit = handleExit;\n }\n\n /**\n * Handles DXT generation in test mode by creating mock DXT package structure\n * This method creates simplified mock files for testing purposes\n */\n public async handleTestModeDxtGeneration(\n processArgs: string[],\n buildDxtIndex: number,\n ): Promise<ParseResult> {\n try {\n // Get output directory from arguments (test mode expects directory argument)\n const outputDir = processArgs[buildDxtIndex + 1] || \"./dxt-packages\";\n\n // Check if we have MCP configuration\n const mcpTools = this.argParserInstance.toMcpTools();\n if (mcpTools.length === 0) {\n return this.handleExit(0, \"No MCP servers found\", \"success\");\n }\n\n // Extract server info from the unified MCP configuration\n const serverInfo = this.extractMcpServerInfo();\n\n // Create mock DXT package structure for testing\n const folderName = `${serverInfo.name.replace(/[^a-zA-Z0-9_-]/g, \"_\")}-dxt`;\n const buildDir = path.join(outputDir, folderName);\n\n // Ensure build directory exists\n if (!fs.existsSync(buildDir)) {\n fs.mkdirSync(buildDir, { recursive: true });\n }\n\n // Create mock manifest.json with DXT-compliant structure\n const manifest = {\n dxt_version: \"0.1\",\n name: serverInfo.name,\n version: serverInfo.version,\n description: serverInfo.description,\n author: serverInfo.author,\n server: {\n type: \"node\",\n entry_point: \"server/index.mjs\",\n mcp_config: {\n command: \"node\",\n args: [\"${__dirname}/server/index.mjs\", \"--s-mcp-serve\"],\n env: {},\n },\n },\n tools: mcpTools.map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n })),\n icon: \"logo.jpg\",\n };\n\n fs.writeFileSync(\n path.join(buildDir, \"manifest.json\"),\n JSON.stringify(manifest, null, 2),\n );\n\n // Create mock package.json\n const packageJson = {\n name: serverInfo.name,\n version: serverInfo.version,\n description: serverInfo.description,\n main: \"index.mjs\",\n type: \"module\",\n };\n fs.writeFileSync(\n path.join(buildDir, \"package.json\"),\n JSON.stringify(packageJson, null, 2),\n );\n\n // Create mock README.md\n const readme = `# ${serverInfo.name}\\n\\n${serverInfo.description}\\n\\nGenerated by @alcyone-labs/arg-parser`;\n fs.writeFileSync(path.join(buildDir, \"README.md\"), readme);\n\n // Create mock build script\n const buildScript = `#!/bin/bash\\necho \"Mock DXT build script for ${serverInfo.name}\"`;\n fs.writeFileSync(\n path.join(buildDir, \"build-dxt-package.sh\"),\n buildScript,\n );\n\n return this.handleExit(0, \"DXT package generation completed\", \"success\", {\n entryPoint: \"test-mode\",\n outputDir: buildDir,\n });\n } catch (error) {\n return this.handleExit(\n 1,\n `Test mode DXT generation failed: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n /**\n * Checks if the current environment is in test mode\n * Used to determine whether to use test utilities or production code\n */\n public static isTestMode(): boolean {\n return (\n process.env[\"NODE_ENV\"] === \"test\" ||\n process.argv[0]?.includes(\"vitest\") ||\n process.argv[1]?.includes(\"vitest\") ||\n process.argv[1]?.includes(\"tinypool\")\n );\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createPathsMatcher, getTsconfig } from \"get-tsconfig\";\nimport chalk from \"@alcyone-labs/simple-chalk\";\nimport { DxtPathResolver } from \"../core/dxt-path-resolver\";\nimport type { ParseResult } from \"../core/types\";\nimport { getJsonSchemaTypeFromFlag } from \"../core/types\";\nimport { DxtGeneratorTestUtils } from \"./DxtGenerator-testUtils\";\n\n// tsdown types - Options type is not exported, using any for now\ntype TsdownOptions = any;\n\n/**\n * DxtGenerator handles the generation of DXT (Desktop Extension) packages\n * for MCP servers created from ArgParser instances.\n */\nexport class DxtGenerator {\n private argParserInstance: any;\n\n constructor(argParserInstance: any) {\n this.argParserInstance = argParserInstance;\n }\n\n /**\n * Helper method to handle exit logic based on autoExit setting\n */\n private _handleExit(\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ): ParseResult | never {\n const result: ParseResult = {\n success: exitCode === 0,\n exitCode,\n message,\n type: type || (exitCode === 0 ? \"success\" : \"error\"),\n shouldExit: true,\n data,\n };\n\n if (\n this.argParserInstance.getAutoExit() &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(exitCode as never);\n }\n\n return result;\n }\n\n /**\n * Handles the --s-build-dxt system flag to generate DXT packages for MCP servers\n */\n public async handleBuildDxtFlag(\n processArgs: string[],\n buildDxtIndex: number,\n ): Promise<boolean | ParseResult> {\n try {\n // Check if we're in test mode (vitest/jest environment)\n if (DxtGeneratorTestUtils.isTestMode()) {\n // In test mode, generate a mock DXT package structure\n const testUtils = new DxtGeneratorTestUtils(\n this.argParserInstance,\n () => this.extractMcpServerInfo(),\n (exitCode, message, type, data) =>\n this._handleExit(exitCode, message, type, data),\n );\n return await testUtils.handleTestModeDxtGeneration(\n processArgs,\n buildDxtIndex,\n );\n }\n\n // Check for --s-with-node-modules flag\n const withNodeModules = processArgs.includes(\"--s-with-node-modules\");\n if (withNodeModules) {\n console.log(\n chalk.yellow(\n \"🗂️ --s-with-node-modules detected: will include node_modules in bundle\",\n ),\n );\n\n // Validate that node_modules exists and looks properly set up\n const nodeModulesPath = path.resolve(\"./node_modules\");\n if (!fs.existsSync(nodeModulesPath)) {\n console.error(\n chalk.red(\n \"❌ Error: node_modules directory not found. Please run the installation command first.\",\n ),\n );\n console.log(\n chalk.cyan(\n \"💡 Required command: pnpm install --prod --node-linker=hoisted\",\n ),\n );\n return this._handleExit(\n 1,\n \"node_modules directory not found\",\n \"error\",\n );\n }\n\n // Check if node_modules looks properly hoisted (no nested node_modules in immediate subdirs)\n try {\n const nodeModulesContents = fs.readdirSync(nodeModulesPath);\n const hasNestedNodeModules = nodeModulesContents\n .filter((item) => !item.startsWith(\".\") && !item.startsWith(\"@\"))\n .some((item) => {\n const itemPath = path.join(nodeModulesPath, item);\n try {\n return (\n fs.statSync(itemPath).isDirectory() &&\n fs.existsSync(path.join(itemPath, \"node_modules\"))\n );\n } catch {\n return false;\n }\n });\n\n if (hasNestedNodeModules) {\n console.warn(\n chalk.yellow(\n \"⚠️ Warning: Detected nested node_modules. For best results, ensure hoisted installation:\",\n ),\n );\n console.log(\n chalk.cyan(\n \" rm -rf node_modules && pnpm install --prod --node-linker=hoisted\",\n ),\n );\n } else {\n console.log(\n chalk.green(\n \"✅ node_modules appears properly hoisted and ready for bundling\",\n ),\n );\n }\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠️ Could not validate node_modules structure: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n\n console.log(\n chalk.gray(\n \"💡 This will create a fully autonomous DXT with all native dependencies included\",\n ),\n );\n }\n\n // The entry point is the script that called this flag (process.argv[1])\n const entryPointFile = process.argv[1];\n\n if (!entryPointFile || !fs.existsSync(entryPointFile)) {\n console.error(\n chalk.red(`Error: Entry point file not found: ${entryPointFile}`),\n );\n return this._handleExit(1, \"Entry point file not found\", \"error\");\n }\n\n // Get the output directory from arguments (defaults to './dxt')\n let outputDir = processArgs[buildDxtIndex + 1] || \"./dxt\";\n // If the output folder was not specified but other system flags were.\n if (outputDir.startsWith(\"--s-\")) outputDir = \"./dxt\";\n\n console.log(\n chalk.cyan(\n `\\n🔧 Building DXT package for entry point: ${entryPointFile}`,\n ),\n );\n console.log(chalk.gray(`Output directory: ${outputDir}`));\n console.log(chalk.gray(`Entrypoint file: ${entryPointFile}`));\n\n // Build the DXT package using TSDown\n await this.buildDxtWithTsdown(entryPointFile, outputDir, withNodeModules);\n\n console.log(chalk.green(`\\n✅ DXT package generation completed!`));\n\n return this._handleExit(\n 0,\n \"DXT package generation completed\",\n \"success\",\n { entryPoint: entryPointFile, outputDir },\n );\n } catch (error) {\n console.error(\n chalk.red(\n `Error generating DXT package: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return this._handleExit(\n 1,\n `Error generating DXT package: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n /**\n * Extracts server information from MCP configuration\n * Now supports both withMcp() configuration and legacy addMcpSubCommand()\n */\n private extractMcpServerInfo(mcpSubCommand?: any): any {\n // First, try to get server info from withMcp() configuration\n if ((this.argParserInstance as any).getMcpServerConfig) {\n const mcpConfig = (this.argParserInstance as any).getMcpServerConfig();\n if (mcpConfig?.serverInfo) {\n return mcpConfig.serverInfo;\n }\n }\n\n // Fallback: Use the stored server info from addMcpSubCommand if available\n if (mcpSubCommand?.mcpServerInfo) {\n return mcpSubCommand.mcpServerInfo;\n }\n\n // Final fallback: Generate default info from ArgParser instance\n const appName = this.argParserInstance.getAppName();\n const appCommandName = this.argParserInstance.getAppCommandName();\n const description =\n (this.argParserInstance as any).getDescription?.() ||\n \"MCP server generated from ArgParser\";\n\n const defaultInfo = {\n name:\n appCommandName ||\n appName?.toLowerCase().replace(/[^a-zA-Z0-9_-]/g, \"_\") ||\n \"mcp-server\",\n version: \"1.0.0\",\n description: description,\n };\n\n return defaultInfo;\n }\n\n // Additional methods will be added in subsequent edits...\n\n private generateMcpToolsForDxt(\n mcpSubCommand?: any,\n ): Array<{ name: string; description?: string }> {\n try {\n // Check if this is an ArgParser instance with MCP capabilities\n if (typeof (this.argParserInstance as any).toMcpTools === \"function\") {\n // Get tool options from withMcp() configuration or fallback to subcommand\n let toolOptions = mcpSubCommand?.mcpToolOptions;\n\n // Try to get tool options from withMcp() configuration\n if ((this.argParserInstance as any).getMcpServerConfig) {\n const mcpConfig = (\n this.argParserInstance as any\n ).getMcpServerConfig();\n if (mcpConfig?.toolOptions) {\n toolOptions = mcpConfig.toolOptions;\n }\n }\n\n // Use the unified MCP tool generation (includes both CLI-generated and manual tools)\n const mcpTools = (this.argParserInstance as any).toMcpTools(\n toolOptions,\n );\n\n return mcpTools.map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n }));\n }\n\n // Fallback: create simplified tool list based on parser structure (DXT-compliant)\n const tools: Array<{ name: string; description?: string }> = [];\n\n // Add main command tool if there's a handler\n if (\n this.argParserInstance.getHandler &&\n this.argParserInstance.getHandler()\n ) {\n const appName = this.argParserInstance.getAppName() || \"main\";\n const commandName =\n this.argParserInstance.getAppCommandName() ||\n appName.toLowerCase().replace(/[^a-zA-Z0-9_-]/g, \"_\");\n\n tools.push({\n name: commandName,\n description:\n this.argParserInstance.getDescription() ||\n `Execute ${appName} command`,\n });\n }\n\n // Add subcommand tools (excluding MCP subcommands to avoid recursion)\n for (const [name, subCmd] of this.argParserInstance.getSubCommands()) {\n if (!(subCmd as any).isMcp) {\n const commandName =\n this.argParserInstance.getAppCommandName() ||\n this.argParserInstance\n .getAppName()\n ?.toLowerCase()\n .replace(/[^a-zA-Z0-9_-]/g, \"_\") ||\n \"main\";\n tools.push({\n name: `${commandName}_${name}`,\n description:\n (subCmd as any).description || `Execute ${name} subcommand`,\n });\n }\n }\n\n return tools.length > 0\n ? tools\n : [\n {\n name: \"main\",\n description: \"Main command tool\",\n },\n ];\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not generate detailed tool list: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return [\n {\n name: \"main\",\n description: \"Main command tool\",\n },\n ];\n }\n }\n\n /**\n * Maps ArgParser flag types to DXT user config types\n */\n /**\n * Adds the logo to the build folder if available\n * @returns The filename of the logo that was added, or undefined if no logo was added\n */\n private async addLogoToFolder(\n buildDir: string,\n serverInfo?: any,\n entryPointFile?: string,\n ): Promise<string | undefined> {\n try {\n let logoBuffer: Buffer | null = null;\n let logoFilename = \"logo.jpg\";\n\n // First, try to use custom logo from serverInfo\n if (serverInfo?.logo) {\n const customLogo = serverInfo.logo;\n\n if (\n customLogo.startsWith(\"http://\") ||\n customLogo.startsWith(\"https://\")\n ) {\n // Download logo from URL\n try {\n console.log(`📥 Downloading logo from: ${customLogo}`);\n const response = await fetch(customLogo);\n if (response.ok) {\n logoBuffer = Buffer.from(await response.arrayBuffer());\n // Extract extension from URL and normalize to logo.ext format\n const urlPath = new URL(customLogo).pathname;\n const urlFilename = path.basename(urlPath);\n if (urlFilename && urlFilename.includes(\".\")) {\n const ext = path.extname(urlFilename);\n logoFilename = `logo${ext}`;\n } else {\n logoFilename = \"logo.jpg\"; // fallback if no extension detected\n }\n console.log(\"✓ Downloaded logo from URL\");\n } else {\n console.warn(\n `⚠ Failed to download logo: HTTP ${response.status}`,\n );\n }\n } catch (error) {\n console.warn(\n \"⚠ Failed to download logo from URL:\",\n error instanceof Error ? error.message : String(error),\n );\n }\n } else {\n // Try to read logo from local file path\n // If entryPointFile is provided and customLogo is relative, resolve relative to entry point\n let logoPath: string;\n if (entryPointFile && !path.isAbsolute(customLogo)) {\n // Resolve relative to the directory containing the entry point file\n const entryDir = path.dirname(entryPointFile);\n logoPath = path.resolve(entryDir, customLogo);\n console.log(\n `📍 Resolving logo path relative to entry point: ${logoPath}`,\n );\n } else {\n // Absolute path or no entry point provided - resolve relative to cwd\n logoPath = path.resolve(customLogo);\n }\n\n if (fs.existsSync(logoPath)) {\n logoBuffer = fs.readFileSync(logoPath);\n const ext = path.extname(logoPath);\n logoFilename = `logo${ext}`;\n console.log(\"✓ Added custom logo from local file\");\n } else {\n console.warn(`⚠ Custom logo file not found: ${logoPath}`);\n }\n }\n }\n\n // Fallback to default logo if no custom logo was loaded\n if (!logoBuffer) {\n // Get current directory equivalent for ES modules\n const currentDir = path.dirname(new URL(import.meta.url).pathname);\n\n // Try to find the default logo in the dist/assets folder (built version)\n let logoPath = path.join(currentDir, \"assets\", \"logo_1_small.jpg\");\n\n // If not found, try the source location (development)\n if (!fs.existsSync(logoPath)) {\n logoPath = path.join(\n currentDir,\n \"..\",\n \"docs\",\n \"MCP\",\n \"icons\",\n \"logo_1_small.jpg\",\n );\n }\n\n // If still not found, try relative to process.cwd()\n if (!fs.existsSync(logoPath)) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n logoPath = path.join(\n currentDir,\n \"docs\",\n \"MCP\",\n \"icons\",\n \"logo_1_small.jpg\",\n );\n }\n\n // If still not found, try node_modules (when package is installed)\n if (!fs.existsSync(logoPath)) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n logoPath = path.join(\n currentDir,\n \"node_modules\",\n \"@alcyone-labs\",\n \"arg-parser\",\n \"dist\",\n \"assets\",\n \"logo_1_small.jpg\",\n );\n }\n\n // If still not found, try package root dist/assets (for local build)\n if (!fs.existsSync(logoPath)) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n logoPath = path.join(\n currentDir,\n \"dist\",\n \"assets\",\n \"logo_1_small.jpg\",\n );\n }\n\n if (fs.existsSync(logoPath)) {\n logoBuffer = fs.readFileSync(logoPath);\n const ext = path.extname(logoPath);\n logoFilename = `logo${ext}`;\n console.log(\"✓ Added default logo to build folder\");\n } else {\n console.warn(\n \"⚠ No logo found (custom or default), build folder will be created without icon\",\n );\n return undefined;\n }\n }\n\n // Write logo to build folder\n if (logoBuffer) {\n fs.writeFileSync(path.join(buildDir, logoFilename), logoBuffer);\n return logoFilename;\n }\n\n return undefined;\n } catch (error) {\n console.warn(\n \"⚠ Failed to add logo to build folder:\",\n error instanceof Error ? error.message : String(error),\n );\n return undefined;\n }\n }\n\n /**\n * Builds a complete DXT package using TSDown CLI for autonomous execution\n */\n private async buildDxtWithTsdown(\n entryPointFile: string,\n outputDir: string = \"./dxt\",\n withNodeModules: boolean = false,\n ): Promise<void> {\n try {\n console.log(chalk.cyan(\"🔧 Building DXT package with TSDown...\"));\n\n // Find project root and calculate relative entry path\n const projectRoot = this.findProjectRoot(entryPointFile);\n const absoluteEntryPath = path.resolve(entryPointFile);\n const relativeEntryPath = path.relative(projectRoot, absoluteEntryPath);\n\n console.log(chalk.gray(`Entry point: ${entryPointFile}`));\n console.log(chalk.gray(`Project root: ${projectRoot}`));\n console.log(chalk.gray(`Relative entry path: ${relativeEntryPath}`));\n\n // Copy .dxtignore template\n const dxtIgnorePath = this.getDxtIgnoreTemplatePath();\n if (fs.existsSync(dxtIgnorePath)) {\n fs.copyFileSync(dxtIgnorePath, path.join(projectRoot, \".dxtignore\"));\n }\n\n // Handle logo copying/downloading to working directory\n const serverInfo = this.extractMcpServerInfo();\n const logoFilename = await this.addLogoToFolder(\n projectRoot,\n serverInfo,\n entryPointFile,\n );\n console.log(\n logoFilename\n ? chalk.gray(`✓ Logo prepared: ${logoFilename}`)\n : chalk.gray(\"⚠ No logo available\"),\n );\n\n // Run TSDown build from the project root directory\n const originalCwd =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n try {\n // process.chdir(projectRoot);\n\n // Dynamic import TSDown to handle optional dependency\n const { build } = await import(\"tsdown\");\n\n console.log(chalk.gray(`Building with TSDown: ${relativeEntryPath}`));\n console.log(\n chalk.green(\n `${withNodeModules ? \"with node_modules\" : \"without node_modules\"}`,\n ),\n );\n\n // Extract MCP config for use in copy function\n const mcpConfig = (\n this.argParserInstance as any\n ).getMcpServerConfig?.();\n\n // Preserve directory structure by including the entry directory in outDir\n const entryDir = path.dirname(relativeEntryPath);\n const preservedOutDir =\n entryDir !== \".\" && entryDir !== \"\"\n ? path.resolve(originalCwd, outputDir, entryDir)\n : path.resolve(originalCwd, outputDir);\n\n const buildConfig: TsdownOptions = {\n entry: [relativeEntryPath],\n outDir: preservedOutDir,\n format: [\"es\"],\n target: \"node22\",\n define: {\n // Define any compile-time constants\n NODE_ENV: \"production\",\n },\n dts: true,\n minify: false,\n sourcemap: false,\n // Remove all output folders and artefacts\n clean: [outputDir, \"./.dxtignore\", `${outputDir}.dxt`],\n silent: process.env[\"NO_SILENCE\"] !== \"1\",\n unbundle: true,\n external: (id: string, importer?: string) => {\n try {\n const external = this.shouldModuleBeExternal(\n id,\n importer,\n withNodeModules,\n );\n\n if (Boolean(process.env[\"DEBUG\"]))\n console.log(\n `[${chalk.blue(\"External\")}] ${chalk.yellow(external ? \"true\" : \"false\")} for module: (${chalk.green(id)}), path: '${chalk.grey(importer ?? \"\")}'`,\n );\n\n return Boolean(external);\n } catch (error) {\n console.warn(\n `Warning: Error in external function for ${id}:`,\n error,\n );\n return true; // Default to external on error\n }\n },\n noExternal: (id: string, importer?: string) => {\n try {\n const external = this.shouldModuleBeExternal(\n id,\n importer,\n withNodeModules,\n );\n\n if (Boolean(process.env[\"DEBUG\"]))\n console.log(\n `[${chalk.yellow(\"noExternal\")}] ${chalk.yellow(external === false ? \"true\" : \"false\")} for module: (${chalk.green(id)}), path: '${chalk.grey(importer ?? \"\")}'`,\n );\n\n return Boolean(external === false);\n } catch (error) {\n console.warn(\n `Warning: Error in noExternal function for ${id}:`,\n error,\n );\n return false; // Default to not noExternal on error\n }\n },\n copy: async (\n options: any,\n ): Promise<Array<string | { from: string; to: string }>> => {\n try {\n const outputPaths: Array<string | { from: string; to: string }> =\n [\"package.json\"];\n\n // Only include node_modules if --s-with-node-modules flag is set\n if (withNodeModules) {\n console.log(\n chalk.gray(\n \"📦 Including node_modules in bundle (may take longer)...\",\n ),\n );\n outputPaths.push(\"node_modules\");\n }\n\n // Calculate the DXT package root (parent of outDir when preserving structure)\n const dxtPackageRoot =\n entryDir !== \".\" && entryDir !== \"\"\n ? path.dirname(options.outDir)\n : options.outDir;\n\n // Add logo if it was successfully prepared\n if (logoFilename) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n const logoPath = path.join(currentDir, logoFilename);\n if (fs.existsSync(logoPath)) {\n console.log(chalk.gray(`Adding logo from: ${logoPath}`));\n outputPaths.push({\n from: logoPath,\n to: path.join(dxtPackageRoot, logoFilename),\n });\n }\n }\n\n // Add user-specified include files from DXT configuration\n if (mcpConfig?.dxt?.include) {\n console.log(\n chalk.gray(\n \"📁 Including additional files from DXT configuration...\",\n ),\n );\n\n for (const includeItem of mcpConfig.dxt.include) {\n if (typeof includeItem === \"string\") {\n // Simple string path - copy to same relative location in DXT package root\n // First substitute any DXT variables in the path\n const resolvedIncludePath =\n DxtPathResolver.substituteVariables(\n includeItem,\n DxtPathResolver.detectContext(),\n { allowUndefined: true }, // Allow undefined variables for flexibility\n );\n const sourcePath = path.resolve(\n projectRoot,\n resolvedIncludePath,\n );\n if (fs.existsSync(sourcePath)) {\n console.log(chalk.gray(` • ${resolvedIncludePath}`));\n outputPaths.push({\n from: sourcePath,\n to: path.join(dxtPackageRoot, resolvedIncludePath),\n });\n } else {\n console.warn(\n chalk.yellow(\n ` ⚠ File not found: ${resolvedIncludePath} (resolved to ${sourcePath})`,\n ),\n );\n }\n } else {\n // Object with from/to mapping - copy to specified location in DXT package root\n // Substitute DXT variables in both from and to paths\n const resolvedFromPath =\n DxtPathResolver.substituteVariables(\n includeItem.from,\n DxtPathResolver.detectContext(),\n { allowUndefined: true },\n );\n const resolvedToPath = DxtPathResolver.substituteVariables(\n includeItem.to,\n DxtPathResolver.detectContext(),\n { allowUndefined: true },\n );\n const sourcePath = path.resolve(\n projectRoot,\n resolvedFromPath,\n );\n if (fs.existsSync(sourcePath)) {\n console.log(\n chalk.gray(\n ` • ${resolvedFromPath} → ${resolvedToPath}`,\n ),\n );\n outputPaths.push({\n from: sourcePath,\n to: path.join(dxtPackageRoot, resolvedToPath),\n });\n } else {\n console.warn(\n chalk.yellow(\n ` ⚠ File not found: ${resolvedFromPath} (resolved to ${sourcePath})`,\n ),\n );\n }\n }\n }\n }\n\n return outputPaths;\n } catch (error) {\n console.warn(`Warning: Error in copy function:`, error);\n return [\"package.json\"]; // Return minimal copy list on error\n }\n },\n platform: \"node\" as const,\n plugins: [],\n };\n\n // Debug output and config file generation\n if (process.env[\"DEBUG\"] === \"1\") {\n console.log(chalk.cyan(\"🐛 DEBUG: TSDown build configuration:\"));\n console.log(JSON.stringify(buildConfig, null, 2));\n\n // Create dxt directory if it doesn't exist\n if (!fs.existsSync(\"dxt\")) {\n fs.mkdirSync(\"dxt\", { recursive: true });\n }\n\n // Write config to file for debugging\n const configContent = `// TSDown configuration used for DXT build\n// Generated on ${new Date().toISOString()}\nimport { build } from 'tsdown';\n\nexport default ${JSON.stringify(buildConfig, null, 2)};\n\n// To run manually:\n// npx tsdown -c tsdown.config.dxt.ts\n`;\n fs.writeFileSync(\n path.join(\"dxt\", \"tsdown.config.dxt.ts\"),\n configContent,\n );\n console.log(\n chalk.gray(\"📝 Debug config written to dxt/tsdown.config.dxt.ts\"),\n );\n }\n\n try {\n await build(buildConfig as any);\n console.log(chalk.green(\"✅ TSDown bundling completed\"));\n } catch (buildError) {\n console.error(chalk.red(\"❌ TSDown build failed with error:\"));\n console.error(buildError);\n if (buildError instanceof Error) {\n console.error(chalk.red(\"Error message:\"), buildError.message);\n console.error(chalk.red(\"Error stack:\"), buildError.stack);\n }\n throw new Error(\n `TSDown DXT build failed: ${buildError instanceof Error ? buildError.message : String(buildError)}`,\n );\n }\n\n // Determine the actual output filename from TSDown\n const detectedOutputFile = this.detectTsdownOutputFile(\n outputDir,\n relativeEntryPath.replace(/\\.ts$/, \".js\"),\n );\n\n // Copy manifest and logo to the output directory\n await this.setupDxtPackageFiles(\n entryPointFile,\n outputDir,\n detectedOutputFile ?? undefined,\n logoFilename ?? \"logo.jpg\",\n );\n\n // Run dxt pack (temporarily disabled due to dynamic import issues)\n console.log(chalk.cyan(\"📦 DXT package ready for packing\"));\n console.log(\n chalk.gray(\n `To complete the process, run: npx @anthropic-ai/dxt pack ${outputDir}/`,\n ),\n );\n // await this.packDxtPackage();\n } finally {\n process.chdir(originalCwd);\n }\n } catch (error) {\n throw new Error(\n `TSDown DXT build failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Checks if a module ID is a Node.js built-in\n */\n public isNodeBuiltin(id: string): boolean {\n const nodeBuiltins = [\n \"stream\",\n \"fs\",\n \"path\",\n \"url\",\n \"util\",\n \"events\",\n \"child_process\",\n \"os\",\n \"tty\",\n \"process\",\n \"crypto\",\n \"http\",\n \"https\",\n \"net\",\n \"zlib\",\n \"fs/promises\",\n \"timers\",\n \"timers/promises\",\n \"perf_hooks\",\n \"async_hooks\",\n \"inspector\",\n \"v8\",\n \"vm\",\n \"assert\",\n \"constants\",\n \"module\",\n \"repl\",\n \"string_decoder\",\n \"punycode\",\n \"domain\",\n \"querystring\",\n \"readline\",\n \"worker_threads\",\n \"cluster\",\n \"dgram\",\n \"dns\",\n \"buffer\",\n ];\n\n return nodeBuiltins.includes(id) || id.startsWith(\"node:\");\n }\n\n /**\n * Determines if a module should be treated as external based on bundling configuration.\n * This logic is shared between external and noExternal configurations.\n *\n * @param id - The module identifier (e.g., 'lodash', '@types/node', './utils')\n * @param importer - The file path that is importing this module (undefined for entry points)\n * @param withNodeModules - Whether to include node_modules in the bundle\n * @returns true if the module should be external (not bundled), false if it should be bundled\n *\n * Logic flow:\n * 1. Node built-ins (fs, path, etc.) are always external\n * 2. If no importer (entry point), always bundle\n * 3. If withNodeModules is false, bundle everything except Node built-ins\n * 4. If withNodeModules is true:\n * - If importer is from node_modules, make external\n * - If module resolves to a project file (via TS paths or regular paths), bundle it\n * - Otherwise, make external (likely npm package)\n *\n * @example\n * // Node built-in - always external\n * shouldModuleBeExternal('fs', './src/main.ts', true) // returns true\n *\n * // Project file via TS paths or regular paths - bundle it\n * shouldModuleBeExternal('@/utils', './src/main.ts', true) // returns false\n *\n * // NPM package - external when withNodeModules=true\n * shouldModuleBeExternal('lodash', './src/main.ts', true) // returns true\n */\n private shouldModuleBeExternal(\n id: string,\n importer: string | undefined,\n withNodeModules: boolean,\n ): boolean {\n if (this.isNodeBuiltin(id)) {\n // Node built-ins are always external\n return true;\n }\n\n if (importer) {\n if (withNodeModules) {\n if (importer.includes(\"node_modules\")) {\n return true;\n } else {\n const resolvedPath = this.resolveModulePath(id, importer);\n // If the path was resolved (via TS paths or regular file resolution)\n // We consider it to be a project file, so we bundle it\n if (resolvedPath) {\n return false;\n } else {\n return true;\n }\n }\n } else {\n // We bundle everything\n return false;\n }\n } else {\n // If no importer, it's the entrypoint\n return false;\n }\n }\n\n /**\n * Checks if a package ID exists in the local node_modules folder.\n * Only checks the folder or parent folder that contains the nearest package.json file.\n * Returns false if no package.json file is found after 3 parent directory traversals.\n *\n * Alternative approach using require.resolve():\n * ```ts\n * public isNodeModulesPackageWithResolve(packageId: string): boolean {\n * try {\n * require.resolve(packageId);\n * return true;\n * } catch {\n * return false;\n * }\n * }\n * ```\n *\n * Filesystem approach is preferred for bundler context because:\n * - Faster (no module resolution overhead)\n * - No side effects during build\n * - Predictable behavior in build vs runtime contexts\n */\n public isNodeModulesPackage(packageId: string): boolean {\n try {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n let searchDir = currentDir;\n let attempts = 0;\n const maxAttempts = 3;\n\n while (attempts < maxAttempts) {\n const packageJsonPath = path.join(searchDir, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n const nodeModulesPath = path.join(searchDir, \"node_modules\");\n if (!fs.existsSync(nodeModulesPath)) {\n return false;\n }\n\n const packagePath = path.join(nodeModulesPath, packageId);\n if (fs.existsSync(packagePath)) {\n const packagePackageJsonPath = path.join(\n packagePath,\n \"package.json\",\n );\n return fs.existsSync(packagePackageJsonPath);\n }\n\n return false;\n }\n\n const parentDir = path.dirname(searchDir);\n if (parentDir === searchDir) {\n break;\n }\n searchDir = parentDir;\n attempts++;\n }\n\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Get the path to the .dxtignore template file\n */\n private getDxtIgnoreTemplatePath(): string {\n // Try multiple locations for the .dxtignore template\n const possiblePaths = [\n // 1. From the built library assets (when installed via npm)\n path.join(\n path.dirname(new URL(import.meta.url).pathname),\n \"..\",\n \"assets\",\n \".dxtignore.template\",\n ),\n\n // 2. From node_modules/@alcyone-labs/arg-parser/dist/assets (when installed via npm)\n path.join(\n typeof process !== \"undefined\" ? process.cwd() : \"/test\",\n \"node_modules\",\n \"@alcyone-labs\",\n \"arg-parser\",\n \"dist\",\n \"assets\",\n \".dxtignore.template\",\n ),\n\n // 3. From the root directory (development/local build)\n path.join(\n typeof process !== \"undefined\" ? process.cwd() : \"/test\",\n \".dxtignore.template\",\n ),\n\n // 4. From the library root (when using local file dependency)\n path.join(\n typeof process !== \"undefined\" ? process.cwd() : \"/test\",\n \"..\",\n \"..\",\n \"..\",\n \".dxtignore.template\",\n ),\n ];\n\n for (const ignorePath of possiblePaths) {\n if (fs.existsSync(ignorePath)) {\n console.log(chalk.gray(`Found .dxtignore template at: ${ignorePath}`));\n return ignorePath;\n }\n }\n\n // Return empty string if not found - we'll skip copying the template\n console.log(chalk.yellow(\"⚠ .dxtignore template not found, skipping\"));\n return \"\";\n }\n\n /**\n * Sets up DXT package files (manifest.json) in the output directory\n */\n private async setupDxtPackageFiles(\n entryPointFile: string,\n outputDir: string = \"./dxt\",\n actualOutputFilename?: string,\n logoFilename: string = \"logo.jpg\",\n ): Promise<void> {\n const currentDir = typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n const dxtDir = path.resolve(currentDir, outputDir);\n if (!fs.existsSync(dxtDir)) {\n throw new Error(`TSDown output directory (${outputDir}) not found`);\n }\n\n // Read package.json for project information\n const packageJsonPath = path.join(currentDir, \"package.json\");\n let packageInfo: any = {};\n if (fs.existsSync(packageJsonPath)) {\n try {\n packageInfo = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\"));\n } catch (error) {\n console.warn(chalk.yellow(\"Warning: Could not read package.json\"));\n }\n }\n\n // Generate tools using the unified approach (DXT-compliant: only name and description)\n let tools: Array<{ name: string; description?: string }> = [];\n\n try {\n // Use the unified tool generation that includes both CLI and manual tools\n const mcpTools = this.generateMcpToolsForDxt();\n tools = mcpTools.map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n }));\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Could not generate unified tool list: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n\n // Fallback: Generate tools from main parser flags\n const mainFlags = this.argParserInstance.flags;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const flag of mainFlags) {\n // Skip help flag and system flags\n if (flag.name === \"help\" || flag.name.startsWith(\"s-\")) continue;\n\n properties[flag.name] = {\n type: getJsonSchemaTypeFromFlag(flag.type as any),\n description: flag.description || `${flag.name} parameter`,\n };\n\n if (flag.enum) {\n properties[flag.name].enum = flag.enum;\n }\n\n if (\n flag.defaultValue !== undefined &&\n typeof flag.defaultValue !== \"function\"\n ) {\n properties[flag.name].default = flag.defaultValue;\n }\n\n if (flag.mandatory) {\n required.push(flag.name);\n }\n }\n\n // Create fallback tool from the parser's configuration (DXT-compliant)\n const commandName = this.argParserInstance.getAppCommandName();\n tools = [\n {\n name: commandName || packageInfo.name || \"cli-tool\",\n description:\n packageInfo.description ||\n this.argParserInstance.getDescription() ||\n \"CLI tool\",\n },\n ];\n }\n\n // Extract environment variables and user config from the ArgParser instance\n const { envVars, userConfig } = this.generateEnvAndUserConfig();\n\n // Get server info from withMcp() configuration or fallback to package.json\n const serverInfo = this.extractMcpServerInfo();\n\n // Create DXT manifest using server info and package.json data\n let entryFileName: string;\n if (actualOutputFilename) {\n entryFileName = actualOutputFilename;\n } else {\n // Find project root and calculate relative path\n const projectRoot = this.findProjectRoot(entryPointFile);\n const absoluteEntryPath = path.resolve(entryPointFile);\n const relativeEntryPath = path.relative(projectRoot, absoluteEntryPath);\n entryFileName = relativeEntryPath.replace(/\\.ts$/, \".js\");\n }\n\n // Use server info if available, otherwise fallback to package.json (DXT-compliant)\n const manifest = {\n dxt_version: \"0.1\",\n name: serverInfo.name || packageInfo.name || \"mcp-server\",\n version: serverInfo.version || packageInfo.version || \"1.0.0\",\n description:\n serverInfo.description ||\n packageInfo.description ||\n \"MCP server generated by @alcyone-labs/arg-parser\",\n author: serverInfo.author || {\n name:\n packageInfo.author?.name ||\n packageInfo.author ||\n \"@alcyone-labs/arg-parser\",\n ...(packageInfo.author?.email && { email: packageInfo.author.email }),\n url:\n packageInfo.author?.url ||\n packageInfo.homepage ||\n packageInfo.repository?.url ||\n \"https://github.com/alcyone-labs/arg-parser\",\n },\n server: {\n type: \"node\",\n entry_point: entryFileName,\n mcp_config: {\n command: \"node\",\n args: [\n `\\${__dirname}/${entryFileName}`,\n \"--s-mcp-serve\",\n // Overwrite the CLI config to only use stdio to avoid conflicts\n \"--s-mcp-transport\",\n \"stdio\",\n ],\n env: envVars,\n },\n },\n tools: tools,\n icon: logoFilename,\n ...(Object.keys(userConfig).length > 0 && { user_config: userConfig }),\n repository: packageInfo.repository?.url\n ? {\n type: \"git\",\n url: packageInfo.repository?.url,\n }\n : undefined,\n license: packageInfo.license || \"MIT\",\n };\n\n fs.writeFileSync(\n path.join(dxtDir, \"manifest.json\"),\n JSON.stringify(manifest, null, 2),\n );\n\n console.log(chalk.gray(\"✅ DXT package files set up\"));\n }\n\n /**\n * Detects the actual output filename generated by TSDown\n */\n private detectTsdownOutputFile(\n outputDir: string,\n expectedBaseName: string,\n ): string | null {\n try {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n const dxtDir = path.resolve(currentDir, outputDir);\n if (!fs.existsSync(dxtDir)) {\n console.warn(\n chalk.yellow(`⚠ Output directory (${outputDir}) not found`),\n );\n return null;\n }\n\n // List all .js and .mjs files in the output directory (including subdirectories)\n const files: string[] = [];\n\n function findJsFiles(dir: string, relativePath: string = \"\"): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and other non-source directories\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) {\n continue;\n }\n // Recursively search subdirectories\n findJsFiles(fullPath, relativeFilePath);\n } else if (\n (entry.name.endsWith(\".js\") || entry.name.endsWith(\".mjs\")) &&\n !entry.name.includes(\"chunk-\") &&\n !entry.name.includes(\"dist-\") &&\n !entry.name.startsWith(\".\")\n ) {\n files.push(relativeFilePath);\n }\n }\n }\n\n findJsFiles(dxtDir);\n\n // First, try to find exact match based on the expected filename\n // expectedBaseName might be \"src/cli.js\" so we need to handle the full path\n const expectedJsFile = expectedBaseName.endsWith(\".js\")\n ? expectedBaseName\n : expectedBaseName.replace(/\\.ts$/, \".js\");\n const expectedMjsFile = expectedBaseName.endsWith(\".mjs\")\n ? expectedBaseName\n : expectedBaseName.replace(/\\.ts$/, \".mjs\");\n\n // Look for exact matches first (including directory structure)\n if (files.includes(expectedJsFile)) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${expectedJsFile}`));\n return expectedJsFile;\n }\n\n if (files.includes(expectedMjsFile)) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${expectedMjsFile}`));\n return expectedMjsFile;\n }\n\n // Fallback: try to match just the basename for backward compatibility\n const baseNameWithoutExt = path.parse(expectedBaseName).name;\n for (const ext of [\".js\", \".mjs\"]) {\n const exactMatch = `${baseNameWithoutExt}${ext}`;\n if (files.includes(exactMatch)) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${exactMatch}`));\n return exactMatch;\n }\n }\n\n // If no exact match, look for the largest non-chunk file (likely the main entry)\n const mainFiles = files.filter(\n (file) =>\n !file.includes(\"chunk\") &&\n !file.includes(\"dist\") &&\n file !== \"logo.jpg\" &&\n file !== \"manifest.json\",\n );\n\n if (mainFiles.length === 1) {\n console.log(chalk.gray(`✓ Detected TSDown output: ${mainFiles[0]}`));\n return mainFiles[0];\n }\n\n // If multiple candidates, pick the one with the most similar name or largest size\n if (mainFiles.length > 1) {\n let bestMatch = mainFiles[0];\n let bestScore = 0;\n\n for (const file of mainFiles) {\n const filePath = path.join(dxtDir, file);\n const stats = fs.statSync(filePath);\n\n // Score based on name similarity and file size\n const nameScore = file.includes(baseNameWithoutExt) ? 100 : 0;\n const sizeScore = Math.min(stats.size / 1000, 50); // Cap at 50KB for scoring\n const totalScore = nameScore + sizeScore;\n\n if (totalScore > bestScore) {\n bestScore = totalScore;\n bestMatch = file;\n }\n }\n\n console.log(\n chalk.gray(\n `✓ Detected TSDown output: ${bestMatch} (best match from ${mainFiles.length} candidates)`,\n ),\n );\n return bestMatch;\n }\n\n console.warn(\n chalk.yellow(`⚠ Could not detect TSDown output file in ${outputDir}`),\n );\n return null;\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠ Error detecting TSDown output: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return null;\n }\n }\n\n private findProjectRoot(entryPointFile: string): string {\n let currentDir = path.dirname(path.resolve(entryPointFile));\n let attempts = 0;\n const maxAttempts = 5;\n\n while (attempts < maxAttempts) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n attempts++;\n }\n\n throw new Error(\n `Could not find package.json within ${maxAttempts} directories up from ${entryPointFile}. ` +\n `Please ensure your entry point is within a project that has a package.json file.`,\n );\n }\n\n /**\n * Validate dxtOptions for common mistakes and security issues\n * @param flag The flag with dxtOptions to validate\n * @param envVar The environment variable name for context\n */\n private validateDxtOptions(flag: any, envVar: string): void {\n const dxtOptions = flag.dxtOptions;\n if (!dxtOptions) return;\n\n // Critical validations (throw errors)\n if (dxtOptions.min !== undefined && dxtOptions.max !== undefined) {\n if (dxtOptions.min > dxtOptions.max) {\n throw new Error(\n `Invalid dxtOptions for ${envVar}: min (${dxtOptions.min}) cannot be greater than max (${dxtOptions.max})`,\n );\n }\n }\n\n if (dxtOptions.type !== undefined) {\n const validTypes = [\"string\", \"directory\", \"file\", \"boolean\", \"number\"];\n if (!validTypes.includes(dxtOptions.type)) {\n throw new Error(\n `Invalid dxtOptions.type for ${envVar}: \"${dxtOptions.type}\". Must be one of: ${validTypes.join(\", \")}`,\n );\n }\n }\n\n // Type consistency check for default values\n if (dxtOptions.default !== undefined && dxtOptions.type !== undefined) {\n const defaultType = typeof dxtOptions.default;\n if (dxtOptions.type === \"number\" && defaultType !== \"number\") {\n throw new Error(\n `Invalid dxtOptions.default for ${envVar}: expected number, got ${defaultType}`,\n );\n }\n if (dxtOptions.type === \"boolean\" && defaultType !== \"boolean\") {\n throw new Error(\n `Invalid dxtOptions.default for ${envVar}: expected boolean, got ${defaultType}`,\n );\n }\n }\n\n // Security warnings (log but continue)\n const sensitiveKeywords = [\"key\", \"token\", \"password\", \"secret\", \"auth\"];\n const envLower = envVar.toLowerCase();\n const hasSensitiveKeyword = sensitiveKeywords.some((keyword) =>\n envLower.includes(keyword),\n );\n\n if (hasSensitiveKeyword && dxtOptions.sensitive === false) {\n console.warn(\n `⚠️ Security Warning: ${envVar} contains sensitive keyword but dxtOptions.sensitive is false`,\n );\n }\n\n if (flag.mandatory === true && dxtOptions.sensitive !== false) {\n console.warn(\n `⚠️ Security Warning: ${envVar} is required and sensitive - consider providing a secure default or making it optional`,\n );\n }\n }\n\n /**\n * Generate environment variables and user configuration from ArgParser flags\n * @returns Object containing envVars and userConfig\n */\n public generateEnvAndUserConfig(): {\n envVars: Record<string, string>;\n userConfig: Record<string, any>;\n } {\n const envVars: Record<string, string> = {};\n const userConfig: Record<string, any> = {};\n\n // Helper function to determine if a flag should be required in user_config\n const shouldBeRequired = (flag: any): boolean => {\n // If the flag has mandatory property, respect it\n if (typeof flag.mandatory === \"boolean\") {\n return flag.mandatory;\n }\n // If the flag has a mandatory function, we can't evaluate it here, so default to false\n if (typeof flag.mandatory === \"function\") {\n return false;\n }\n // Default to false for top-level flags (non-sensitive, non-mandatory by default)\n return false;\n };\n\n // Helper function to determine if a flag should be sensitive\n const shouldBeSensitive = (flag: any): boolean => {\n // Check if dxtOptions explicitly sets sensitivity\n if (flag.dxtOptions?.sensitive !== undefined) {\n return flag.dxtOptions.sensitive;\n }\n // Default: If a flag is tied to an ENV, it should be sensitive\n const envVar = (flag as any).env || (flag as any).envVar;\n return !!envVar;\n };\n\n // Helper function to determine DXT type from flag\n const getDxtType = (flag: any): string => {\n // Check if dxtOptions explicitly sets type\n if (flag.dxtOptions?.type) {\n return flag.dxtOptions.type;\n }\n // Try to infer from IFlag.type\n if (typeof flag.type === \"string\") {\n const lowerType = flag.type.toLowerCase();\n if ([\"string\", \"boolean\", \"number\"].includes(lowerType)) {\n return lowerType;\n }\n } else if (flag.type === String) {\n return \"string\";\n } else if (flag.type === Boolean) {\n return \"boolean\";\n } else if (flag.type === Number) {\n return \"number\";\n }\n // Default to string\n return \"string\";\n };\n\n // Helper function to get title for user_config\n const getDxtTitle = (flag: any, envVar: string): string => {\n // Check if dxtOptions explicitly sets title\n if (flag.dxtOptions?.title) {\n return flag.dxtOptions.title;\n }\n // Default: Convert env var to title case (first letter of each word capitalized)\n return envVar\n .replace(/_/g, \" \")\n .toLowerCase()\n .replace(/\\b\\w/g, (l: string) => l.toUpperCase());\n };\n\n // Helper function to get description with default value\n const getDxtDescription = (flag: any, envVar: string): string => {\n let baseDescription =\n flag.description || `${envVar} environment variable`;\n\n // Add default value to description if available\n const defaultValue =\n flag.dxtOptions?.default ??\n flag.dxtOptions?.localDefault ??\n flag.defaultValue;\n if (defaultValue !== undefined && typeof defaultValue !== \"function\") {\n baseDescription += ` (default: ${defaultValue})`;\n }\n\n return baseDescription;\n };\n\n // Get all flags from the main ArgParser to find environment variables\n const mainFlags = this.argParserInstance.flags;\n\n for (const flag of mainFlags) {\n const envVar = (flag as any).env || (flag as any).envVar;\n if (envVar) {\n // Validate dxtOptions before processing\n this.validateDxtOptions(flag, envVar);\n\n // Add to server env - use the original env var name so process.env.CANNY_API_KEY works\n envVars[envVar] = `\\${user_config.${envVar}}`;\n\n // Add to user_config - use the original env var name to maintain compatibility\n const userConfigEntry: any = {\n type: getDxtType(flag),\n title: getDxtTitle(flag, envVar),\n description: getDxtDescription(flag, envVar),\n required: shouldBeRequired(flag), // Respect the flag's mandatory setting\n sensitive: shouldBeSensitive(flag), // Use dxtOptions or default logic\n };\n\n // Add DXT-specific properties if available\n if (flag.dxtOptions?.multiple !== undefined) {\n userConfigEntry.multiple = flag.dxtOptions.multiple;\n }\n if (flag.dxtOptions?.min !== undefined) {\n userConfigEntry.min = flag.dxtOptions.min;\n }\n if (flag.dxtOptions?.max !== undefined) {\n userConfigEntry.max = flag.dxtOptions.max;\n }\n if (\n flag.dxtOptions?.default !== undefined &&\n typeof flag.dxtOptions.default !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.default;\n } else if (\n flag.dxtOptions?.localDefault !== undefined &&\n typeof flag.dxtOptions.localDefault !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.localDefault;\n }\n\n userConfig[envVar] = userConfigEntry;\n }\n }\n\n // Also check unified tools for environment variables\n if (typeof (this.argParserInstance as any).getTools === \"function\") {\n const tools = (this.argParserInstance as any).getTools();\n for (const [, toolConfig] of tools) {\n const toolFlags = (toolConfig as any).flags || [];\n for (const flag of toolFlags) {\n const envVar = (flag as any).env || (flag as any).envVar;\n if (envVar && !envVars[envVar]) {\n // Only add if not already present\n // Validate dxtOptions before processing\n this.validateDxtOptions(flag, envVar);\n\n // Add to server env - use the original env var name so process.env.CANNY_API_KEY works\n envVars[envVar] = `\\${user_config.${envVar}}`;\n\n // Add to user_config - use the original env var name to maintain compatibility\n const userConfigEntry: any = {\n type: getDxtType(flag),\n title: getDxtTitle(flag, envVar),\n description: getDxtDescription(flag, envVar),\n required: shouldBeRequired(flag), // Respect the flag's mandatory setting\n sensitive: shouldBeSensitive(flag), // Use dxtOptions or default logic\n };\n\n // Add DXT-specific properties if available\n if (flag.dxtOptions?.multiple !== undefined) {\n userConfigEntry.multiple = flag.dxtOptions.multiple;\n }\n if (flag.dxtOptions?.min !== undefined) {\n userConfigEntry.min = flag.dxtOptions.min;\n }\n if (flag.dxtOptions?.max !== undefined) {\n userConfigEntry.max = flag.dxtOptions.max;\n }\n if (\n flag.dxtOptions?.default !== undefined &&\n typeof flag.dxtOptions.default !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.default;\n } else if (\n flag.dxtOptions?.localDefault !== undefined &&\n typeof flag.dxtOptions.localDefault !== \"function\"\n ) {\n userConfigEntry.default = flag.dxtOptions.localDefault;\n }\n\n userConfig[envVar] = userConfigEntry;\n }\n }\n }\n }\n\n return { envVars, userConfig };\n }\n\n private resolveModulePath(id: string, importer: string): string | null {\n try {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"module-resolve\")}> Resolving '${chalk.green(id)}' from '${chalk.gray(importer)}'`,\n );\n }\n\n // Get tsconfig for the importing file\n const tsconfig = getTsconfig(importer);\n if (!tsconfig?.config.compilerOptions?.paths) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"ts-paths\")}> No tsconfig or paths found for '${importer}'`,\n );\n }\n // Fall through to regular file resolution\n } else {\n if (Boolean(process.env[\"DEBUG\"])) {\n const currentDir =\n typeof process !== \"undefined\" ? process.cwd() : \"/test\";\n console.log(\n ` <${chalk.gray(\"ts-paths\")}> Found tsconfig at '${path.relative(currentDir, tsconfig.path)}' with paths:`,\n Object.keys(tsconfig.config.compilerOptions.paths),\n );\n }\n\n // Create paths matcher\n const pathsMatcher = createPathsMatcher(tsconfig);\n if (!pathsMatcher || typeof pathsMatcher !== \"function\") {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"ts-paths\")}> Failed to create paths matcher or matcher is not a function`,\n );\n }\n // Fall through to regular file resolution\n } else {\n const possiblePaths = pathsMatcher(id);\n\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> Possible paths for '${id}':`,\n possiblePaths,\n );\n }\n\n // Try to resolve each possible path\n for (const possiblePath of possiblePaths) {\n const resolvedPath = path.resolve(\n path.dirname(tsconfig.path),\n possiblePath,\n );\n\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> Trying resolved path: '${resolvedPath}'`,\n );\n }\n\n // Try common extensions\n const extensions = [\".ts\", \".js\", \".tsx\", \".jsx\", \".mjs\", \".cjs\"];\n\n // Check if it's a file (with or without extension)\n // 1. Try the resolved path as-is\n if (\n fs.existsSync(resolvedPath) &&\n fs.statSync(resolvedPath).isFile()\n ) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${resolvedPath}'`,\n );\n }\n return resolvedPath;\n }\n\n // 2. If it has a .js extension, try replacing with TypeScript extensions\n if (resolvedPath.endsWith(\".js\")) {\n const basePath = resolvedPath.slice(0, -3); // Remove .js\n for (const ext of [\".ts\", \".tsx\"]) {\n const testPath = basePath + ext;\n if (fs.existsSync(testPath) && fs.statSync(testPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${testPath}' (replaced .js)`,\n );\n }\n return testPath;\n }\n }\n }\n\n // 3. Try adding extensions to the path (in case no extension)\n for (const ext of extensions) {\n const testPath = resolvedPath + ext;\n if (fs.existsSync(testPath) && fs.statSync(testPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${testPath}' (added extension)`,\n );\n }\n return testPath;\n }\n }\n\n // Check if it's a directory with index file\n if (\n fs.existsSync(resolvedPath) &&\n fs.statSync(resolvedPath).isDirectory()\n ) {\n for (const ext of extensions) {\n const indexPath = path.join(resolvedPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.grey(\"ts-paths\")}> ✓ Resolved '${id}' to '${indexPath}' (index)`,\n );\n }\n return indexPath;\n }\n }\n }\n }\n }\n }\n\n // TypeScript path resolution failed, try regular file resolution\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> Trying regular file resolution for '${id}'`,\n );\n }\n\n // Try to resolve as a regular file path relative to the importer\n let testPath: string;\n if (path.isAbsolute(id)) {\n testPath = id;\n } else {\n testPath = path.resolve(path.dirname(importer), id);\n }\n\n const extensions = [\".ts\", \".js\", \".tsx\", \".jsx\", \".mjs\", \".cjs\"];\n\n // Check if it's a file (with or without extension)\n // 1. Try the path as-is\n if (fs.existsSync(testPath) && fs.statSync(testPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${testPath}'`,\n );\n }\n return testPath;\n }\n\n // 2. If it has a .js extension, try replacing with TypeScript extensions\n if (testPath.endsWith(\".js\")) {\n const basePath = testPath.slice(0, -3); // Remove .js\n for (const ext of [\".ts\", \".tsx\"]) {\n const tsPath = basePath + ext;\n if (fs.existsSync(tsPath) && fs.statSync(tsPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${tsPath}' (replaced .js)`,\n );\n }\n return tsPath;\n }\n }\n }\n\n // 3. Try adding extensions to the path (in case no extension)\n for (const ext of extensions) {\n const extPath = testPath + ext;\n if (fs.existsSync(extPath) && fs.statSync(extPath).isFile()) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${extPath}' (added extension)`,\n );\n }\n return extPath;\n }\n }\n\n // Check if it's a directory with index file\n if (fs.existsSync(testPath) && fs.statSync(testPath).isDirectory()) {\n for (const ext of extensions) {\n const indexPath = path.join(testPath, `index${ext}`);\n if (fs.existsSync(indexPath)) {\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"file-resolve\")}> ✓ Resolved '${id}' to '${indexPath}' (index)`,\n );\n }\n return indexPath;\n }\n }\n }\n\n if (Boolean(process.env[\"DEBUG\"])) {\n console.log(\n ` <${chalk.gray(\"module-resolve\")}> ✗ Could not resolve '${id}'`,\n );\n }\n } catch (error) {\n console.warn(\n chalk.yellow(\n `Warning: Failed to resolve module path '${id}': ${error}`,\n ),\n );\n }\n\n return null;\n }\n}\n","/**\n * MCP Change Notifications System\n *\n * This module provides functionality for managing MCP change notifications,\n * allowing clients to subscribe to changes in tools, resources, and prompts.\n */\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"MCP Notifications\");\n\n/**\n * Types of MCP entities that can change\n */\nexport type McpChangeType = \"tools\" | \"resources\" | \"prompts\";\n\n/**\n * Change notification event\n */\nexport interface McpChangeEvent {\n type: McpChangeType;\n timestamp: Date;\n action: \"added\" | \"removed\" | \"updated\";\n entityName?: string;\n}\n\n/**\n * Change listener function type\n */\nexport type McpChangeListener = (event: McpChangeEvent) => void;\n\n/**\n * Client subscription information\n */\nexport interface McpClientSubscription {\n clientId: string;\n subscriptions: Set<McpChangeType>;\n connection: any; // MCP server connection object\n}\n\n/**\n * MCP Change Notifications Manager\n *\n * Manages client subscriptions and change notifications for MCP entities\n */\nexport class McpNotificationsManager {\n private clients = new Map<string, McpClientSubscription>();\n private globalListeners = new Set<McpChangeListener>();\n private changeHistory: McpChangeEvent[] = [];\n private maxHistorySize = 100;\n\n /**\n * Add a client connection\n */\n addClient(clientId: string, connection: any): void {\n this.clients.set(clientId, {\n clientId,\n subscriptions: new Set(),\n connection,\n });\n }\n\n /**\n * Remove a client connection\n */\n removeClient(clientId: string): void {\n this.clients.delete(clientId);\n }\n\n /**\n * Subscribe a client to changes of a specific type\n */\n subscribe(clientId: string, type: McpChangeType): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.add(type);\n }\n }\n\n /**\n * Unsubscribe a client from changes of a specific type\n */\n unsubscribe(clientId: string, type: McpChangeType): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.delete(type);\n }\n }\n\n /**\n * Subscribe a client to all change types\n */\n subscribeToAll(clientId: string): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.add(\"tools\");\n client.subscriptions.add(\"resources\");\n client.subscriptions.add(\"prompts\");\n }\n }\n\n /**\n * Unsubscribe a client from all change types\n */\n unsubscribeFromAll(clientId: string): void {\n const client = this.clients.get(clientId);\n if (client) {\n client.subscriptions.clear();\n }\n }\n\n /**\n * Get client subscription status\n */\n getClientSubscriptions(clientId: string): Set<McpChangeType> | undefined {\n return this.clients.get(clientId)?.subscriptions;\n }\n\n /**\n * Check if a client is subscribed to a specific change type\n */\n isClientSubscribed(clientId: string, type: McpChangeType): boolean {\n const client = this.clients.get(clientId);\n return client ? client.subscriptions.has(type) : false;\n }\n\n /**\n * Notify all subscribed clients of a change\n */\n notifyChange(\n type: McpChangeType,\n action: \"added\" | \"removed\" | \"updated\",\n entityName?: string,\n ): void {\n const event: McpChangeEvent = {\n type,\n timestamp: new Date(),\n action,\n entityName,\n };\n\n // Add to history\n this.addToHistory(event);\n\n // Notify global listeners\n for (const listener of this.globalListeners) {\n try {\n listener(event);\n } catch (error) {\n logger.error(\"Error in global change listener:\", error);\n }\n }\n\n // Notify subscribed clients\n for (const client of this.clients.values()) {\n if (client.subscriptions.has(type)) {\n this.sendNotificationToClient(client, type);\n }\n }\n }\n\n /**\n * Add a global change listener (not client-specific)\n */\n addGlobalListener(listener: McpChangeListener): void {\n this.globalListeners.add(listener);\n }\n\n /**\n * Remove a global change listener\n */\n removeGlobalListener(listener: McpChangeListener): void {\n this.globalListeners.delete(listener);\n }\n\n /**\n * Get change history\n */\n getChangeHistory(limit?: number): McpChangeEvent[] {\n const history = [...this.changeHistory];\n return limit ? history.slice(-limit) : history;\n }\n\n /**\n * Clear change history\n */\n clearHistory(): void {\n this.changeHistory = [];\n }\n\n /**\n * Get connected client count\n */\n getClientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get subscription statistics\n */\n getSubscriptionStats(): Record<McpChangeType, number> {\n const stats: Record<McpChangeType, number> = {\n tools: 0,\n resources: 0,\n prompts: 0,\n };\n\n for (const client of this.clients.values()) {\n for (const type of client.subscriptions) {\n stats[type]++;\n }\n }\n\n return stats;\n }\n\n /**\n * Send notification to a specific client\n */\n private sendNotificationToClient(\n client: McpClientSubscription,\n type: McpChangeType,\n ): void {\n try {\n // Send MCP notification using the connection\n if (\n client.connection &&\n typeof client.connection.sendNotification === \"function\"\n ) {\n client.connection.sendNotification(\n `notifications/${type}/list_changed`,\n {},\n );\n }\n } catch (error) {\n logger.error(\n `Error sending notification to client ${client.clientId}:`,\n error,\n );\n // Consider removing the client if connection is broken\n this.removeClient(client.clientId);\n }\n }\n\n /**\n * Add event to change history\n */\n private addToHistory(event: McpChangeEvent): void {\n this.changeHistory.push(event);\n\n // Trim history if it exceeds max size\n if (this.changeHistory.length > this.maxHistorySize) {\n this.changeHistory = this.changeHistory.slice(-this.maxHistorySize);\n }\n }\n\n /**\n * Set maximum history size\n */\n setMaxHistorySize(size: number): void {\n this.maxHistorySize = Math.max(0, size);\n\n // Trim current history if needed\n if (this.changeHistory.length > this.maxHistorySize) {\n this.changeHistory = this.changeHistory.slice(-this.maxHistorySize);\n }\n }\n\n /**\n * Clear all subscriptions and clients\n */\n clear(): void {\n this.clients.clear();\n this.globalListeners.clear();\n this.changeHistory = [];\n }\n}\n\n/**\n * Utility functions for working with change notifications\n */\n\n/**\n * Create a debounced change notifier to batch rapid changes\n */\nexport function createDebouncedNotifier(\n manager: McpNotificationsManager,\n delay: number = 100,\n): (\n type: McpChangeType,\n action: \"added\" | \"removed\" | \"updated\",\n entityName?: string,\n) => void {\n const pending = new Map<\n string,\n {\n type: McpChangeType;\n action: \"added\" | \"removed\" | \"updated\";\n entityName?: string;\n }\n >();\n let timeoutId: NodeJS.Timeout | null = null;\n\n return (\n type: McpChangeType,\n action: \"added\" | \"removed\" | \"updated\",\n entityName?: string,\n ) => {\n const key = `${type}:${action}:${entityName || \"\"}`;\n pending.set(key, { type, action, entityName });\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n for (const { type, action, entityName } of pending.values()) {\n manager.notifyChange(type, action, entityName);\n }\n pending.clear();\n timeoutId = null;\n }, delay);\n };\n}\n\n/**\n * Create a filtered change listener that only responds to specific types\n */\nexport function createFilteredListener(\n types: McpChangeType[],\n listener: McpChangeListener,\n): McpChangeListener {\n return (event: McpChangeEvent) => {\n if (types.includes(event.type)) {\n listener(event);\n }\n };\n}\n\n/**\n * Create a logging change listener for debugging\n */\nexport function createLoggingListener(\n prefix: string = \"[MCP]\",\n): McpChangeListener {\n return (event: McpChangeEvent) => {\n const entityInfo = event.entityName ? ` (${event.entityName})` : \"\";\n // Use console.log directly for debugging output (not MCP-safe, but this is a debug utility)\n console.log(\n `${prefix} ${event.type} ${event.action}${entityInfo} at ${event.timestamp.toISOString()}`,\n );\n };\n}\n\n/**\n * Default global notifications manager instance\n */\nexport const globalNotificationsManager = new McpNotificationsManager();\n","/**\n * MCP Prompts Management\n *\n * This module provides functionality for managing MCP prompts - server-side prompt templates\n * that clients can discover and execute with custom parameters for dynamic text generation.\n */\n\nimport { z, type ZodTypeAny } from \"zod\";\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"MCP Prompts\");\n\n/**\n * Prompt message content types\n */\nexport interface McpPromptTextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface McpPromptImageContent {\n type: \"image\";\n data: string; // base64 encoded\n mimeType: string;\n}\n\nexport type McpPromptContent = McpPromptTextContent | McpPromptImageContent;\n\n/**\n * Prompt message structure\n */\nexport interface McpPromptMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: McpPromptContent;\n}\n\n/**\n * Prompt response structure\n */\nexport interface McpPromptResponse {\n description?: string;\n messages: McpPromptMessage[];\n}\n\n/**\n * Prompt handler function type\n */\nexport type McpPromptHandler = (\n args: any,\n) => McpPromptResponse | Promise<McpPromptResponse>;\n\n/**\n * Prompt configuration for registration\n */\nexport interface McpPromptConfig {\n name: string;\n title?: string;\n description?: string;\n argsSchema: ZodTypeAny;\n handler: McpPromptHandler;\n}\n\n/**\n * Internal prompt storage structure\n */\nexport interface McpPromptEntry {\n config: McpPromptConfig;\n registeredAt: Date;\n}\n\n/**\n * MCP Prompts Manager\n *\n * Manages registration, storage, and execution of MCP prompts\n */\nexport class McpPromptsManager {\n private prompts = new Map<string, McpPromptEntry>();\n private changeListeners = new Set<() => void>();\n\n /**\n * Register a new prompt\n */\n addPrompt(config: McpPromptConfig): void {\n // Validate configuration\n this.validatePromptConfig(config);\n\n // Store prompt\n this.prompts.set(config.name, {\n config,\n registeredAt: new Date(),\n });\n\n // Notify listeners of change\n this.notifyChange();\n }\n\n /**\n * Remove a prompt by name\n */\n removePrompt(name: string): boolean {\n const removed = this.prompts.delete(name);\n if (removed) {\n this.notifyChange();\n }\n return removed;\n }\n\n /**\n * Get all registered prompts\n */\n getPrompts(): McpPromptConfig[] {\n return Array.from(this.prompts.values()).map((entry) => entry.config);\n }\n\n /**\n * Get a specific prompt by name\n */\n getPrompt(name: string): McpPromptConfig | undefined {\n return this.prompts.get(name)?.config;\n }\n\n /**\n * Check if a prompt exists\n */\n hasPrompt(name: string): boolean {\n return this.prompts.has(name);\n }\n\n /**\n * Execute a prompt with given arguments\n */\n async executePrompt(name: string, args: any): Promise<McpPromptResponse> {\n const entry = this.prompts.get(name);\n if (!entry) {\n throw new Error(`Prompt '${name}' not found`);\n }\n\n // Validate arguments against schema\n try {\n const validatedArgs = entry.config.argsSchema.parse(args);\n return await entry.config.handler(validatedArgs);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new Error(\n `Invalid arguments for prompt '${name}': ${error.message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Add change listener\n */\n onPromptsChange(listener: () => void): void {\n this.changeListeners.add(listener);\n }\n\n /**\n * Remove change listener\n */\n offPromptsChange(listener: () => void): void {\n this.changeListeners.delete(listener);\n }\n\n /**\n * Clear all prompts\n */\n clear(): void {\n const hadPrompts = this.prompts.size > 0;\n this.prompts.clear();\n if (hadPrompts) {\n this.notifyChange();\n }\n }\n\n /**\n * Get prompt count\n */\n count(): number {\n return this.prompts.size;\n }\n\n /**\n * Validate prompt configuration\n */\n private validatePromptConfig(config: McpPromptConfig): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new Error(\"Prompt name is required and must be a string\");\n }\n\n if (!config.argsSchema) {\n throw new Error(\"Prompt argsSchema is required\");\n }\n\n if (typeof config.handler !== \"function\") {\n throw new Error(\"Prompt handler is required and must be a function\");\n }\n\n if (this.prompts.has(config.name)) {\n throw new Error(`Prompt with name '${config.name}' already exists`);\n }\n }\n\n /**\n * Notify all listeners of changes\n */\n private notifyChange(): void {\n for (const listener of this.changeListeners) {\n try {\n listener();\n } catch (error) {\n logger.error(\"Error in prompt change listener:\", error);\n }\n }\n }\n}\n\n/**\n * Helper function to create common prompt configurations\n */\n\n/**\n * Create a code review prompt\n */\nexport const createCodeReviewPrompt = (): McpPromptConfig => ({\n name: \"code-review\",\n title: \"Code Review Assistant\",\n description: \"Generate prompts for code review with focus areas\",\n argsSchema: z.object({\n code: z.string().describe(\"The code to review\"),\n language: z.string().optional().describe(\"Programming language\"),\n focus: z\n .enum([\"security\", \"performance\", \"style\", \"bugs\", \"general\"])\n .optional()\n .describe(\"Review focus area\"),\n }),\n handler: ({ code, language, focus }) => ({\n description: `Code review prompt for ${language || \"code\"} focusing on ${focus || \"general best practices\"}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please review this ${language || \"code\"} focusing on ${focus || \"general best practices\"}:\\n\\n\\`\\`\\`${language || \"\"}\\n${code}\\n\\`\\`\\``,\n },\n },\n ],\n }),\n});\n\n/**\n * Create a text summarization prompt\n */\nexport const createSummarizationPrompt = (): McpPromptConfig => ({\n name: \"summarize\",\n title: \"Text Summarization\",\n description: \"Generate prompts for text summarization\",\n argsSchema: z.object({\n text: z.string().describe(\"The text to summarize\"),\n length: z\n .enum([\"brief\", \"medium\", \"detailed\"])\n .optional()\n .describe(\"Summary length\"),\n style: z\n .enum([\"bullet-points\", \"paragraph\", \"executive\"])\n .optional()\n .describe(\"Summary style\"),\n }),\n handler: ({ text, length, style }) => {\n const lengthInstruction =\n length === \"brief\"\n ? \"in 1-2 sentences\"\n : length === \"detailed\"\n ? \"in detail with key points\"\n : \"concisely\";\n\n const styleInstruction =\n style === \"bullet-points\"\n ? \"as bullet points\"\n : style === \"executive\"\n ? \"as an executive summary\"\n : \"in paragraph form\";\n\n return {\n description: `Summarization prompt for ${length || \"medium\"} ${style || \"paragraph\"} summary`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please summarize the following text ${lengthInstruction} ${styleInstruction}:\\n\\n${text}`,\n },\n },\n ],\n };\n },\n});\n\n/**\n * Create a translation prompt\n */\nexport const createTranslationPrompt = (): McpPromptConfig => ({\n name: \"translate\",\n title: \"Text Translation\",\n description: \"Generate prompts for text translation\",\n argsSchema: z.object({\n text: z.string().describe(\"The text to translate\"),\n targetLanguage: z.string().describe(\"Target language for translation\"),\n sourceLanguage: z\n .string()\n .optional()\n .describe(\"Source language (auto-detect if not specified)\"),\n tone: z\n .enum([\"formal\", \"casual\", \"professional\"])\n .optional()\n .describe(\"Translation tone\"),\n }),\n handler: ({ text, targetLanguage, sourceLanguage, tone }) => {\n const sourceInstruction = sourceLanguage\n ? `from ${sourceLanguage}`\n : \"(auto-detect source language)\";\n const toneInstruction = tone ? ` in a ${tone} tone` : \"\";\n\n return {\n description: `Translation prompt ${sourceInstruction} to ${targetLanguage}${toneInstruction}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please translate the following text ${sourceInstruction} to ${targetLanguage}${toneInstruction}:\\n\\n${text}`,\n },\n },\n ],\n };\n },\n});\n\n/**\n * Create a documentation prompt\n */\nexport const createDocumentationPrompt = (): McpPromptConfig => ({\n name: \"document-code\",\n title: \"Code Documentation\",\n description: \"Generate prompts for code documentation\",\n argsSchema: z.object({\n code: z.string().describe(\"The code to document\"),\n language: z.string().optional().describe(\"Programming language\"),\n style: z\n .enum([\"jsdoc\", \"sphinx\", \"markdown\", \"inline\"])\n .optional()\n .describe(\"Documentation style\"),\n includeExamples: z.boolean().optional().describe(\"Include usage examples\"),\n }),\n handler: ({ code, language, style, includeExamples }) => {\n const styleInstruction = style ? ` using ${style} format` : \"\";\n const examplesInstruction = includeExamples\n ? \" Include usage examples.\"\n : \"\";\n\n return {\n description: `Documentation prompt for ${language || \"code\"}${styleInstruction}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Please generate documentation for this ${language || \"code\"}${styleInstruction}.${examplesInstruction}\\n\\n\\`\\`\\`${language || \"\"}\\n${code}\\n\\`\\`\\``,\n },\n },\n ],\n };\n },\n});\n","/**\n * MCP Resources Management\n *\n * This module provides functionality for managing MCP resources - server-side data sources\n * that clients can access using URI templates. Resources are similar to GET endpoints\n * in a REST API and should provide data without significant computation or side effects.\n */\n\n// Note: zod imports removed as they're not used in this file\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"MCP Resources\");\n\n/**\n * Resource response content item\n */\nexport interface McpResourceContent {\n uri: string;\n text?: string;\n blob?: Uint8Array;\n mimeType?: string;\n}\n\n/**\n * Resource response structure\n */\nexport interface McpResourceResponse {\n contents: McpResourceContent[];\n}\n\n/**\n * Resource handler function type\n */\nexport type McpResourceHandler = (\n uri: URL,\n params: Record<string, string>,\n) => Promise<McpResourceResponse>;\n\n/**\n * Resource configuration for registration\n */\nexport interface McpResourceConfig {\n name: string;\n uriTemplate: string;\n title?: string;\n description?: string;\n mimeType?: string;\n handler: McpResourceHandler;\n}\n\n/**\n * Internal resource storage structure\n */\nexport interface McpResourceEntry {\n config: McpResourceConfig;\n registeredAt: Date;\n}\n\n/**\n * Resource template parser for URI patterns like \"users://{userId}/profile\"\n */\nexport class ResourceTemplateParser {\n private pattern: RegExp;\n private paramNames: string[];\n\n constructor(template: string) {\n // Extract parameter names from template like \"users://{userId}/profile\"\n const paramMatches = template.match(/\\{([^}]+)\\}/g) || [];\n this.paramNames = paramMatches.map((match) => match.slice(1, -1));\n\n // Create regex pattern to match URIs\n const regexPattern = template.replace(/\\{[^}]+\\}/g, \"([^/]+)\");\n this.pattern = new RegExp(`^${regexPattern}$`);\n }\n\n /**\n * Parse a URI against this template and extract parameters\n */\n parse(uri: string): Record<string, string> | null {\n const match = uri.match(this.pattern);\n if (!match) return null;\n\n const params: Record<string, string> = {};\n for (let i = 0; i < this.paramNames.length; i++) {\n params[this.paramNames[i]] = match[i + 1];\n }\n return params;\n }\n\n /**\n * Check if a URI matches this template\n */\n matches(uri: string): boolean {\n return this.pattern.test(uri);\n }\n\n /**\n * Get the parameter names for this template\n */\n getParameterNames(): string[] {\n return [...this.paramNames];\n }\n}\n\n/**\n * MCP Resources Manager\n *\n * Manages registration, storage, and retrieval of MCP resources\n */\nexport class McpResourcesManager {\n private resources = new Map<string, McpResourceEntry>();\n private changeListeners = new Set<() => void>();\n\n /**\n * Register a new resource\n */\n addResource(config: McpResourceConfig): void {\n // Validate configuration\n this.validateResourceConfig(config);\n\n // Store resource\n this.resources.set(config.name, {\n config,\n registeredAt: new Date(),\n });\n\n // Notify listeners of change\n this.notifyChange();\n }\n\n /**\n * Remove a resource by name\n */\n removeResource(name: string): boolean {\n const removed = this.resources.delete(name);\n if (removed) {\n this.notifyChange();\n }\n return removed;\n }\n\n /**\n * Get all registered resources\n */\n getResources(): McpResourceConfig[] {\n return Array.from(this.resources.values()).map((entry) => entry.config);\n }\n\n /**\n * Get a specific resource by name\n */\n getResource(name: string): McpResourceConfig | undefined {\n return this.resources.get(name)?.config;\n }\n\n /**\n * Check if a resource exists\n */\n hasResource(name: string): boolean {\n return this.resources.has(name);\n }\n\n /**\n * Find resource that matches a URI\n */\n findResourceForUri(\n uri: string,\n ): { config: McpResourceConfig; params: Record<string, string> } | null {\n for (const entry of this.resources.values()) {\n const parser = new ResourceTemplateParser(entry.config.uriTemplate);\n const params = parser.parse(uri);\n if (params !== null) {\n return { config: entry.config, params };\n }\n }\n return null;\n }\n\n /**\n * Add change listener\n */\n onResourcesChange(listener: () => void): void {\n this.changeListeners.add(listener);\n }\n\n /**\n * Remove change listener\n */\n offResourcesChange(listener: () => void): void {\n this.changeListeners.delete(listener);\n }\n\n /**\n * Clear all resources\n */\n clear(): void {\n const hadResources = this.resources.size > 0;\n this.resources.clear();\n if (hadResources) {\n this.notifyChange();\n }\n }\n\n /**\n * Get resource count\n */\n count(): number {\n return this.resources.size;\n }\n\n /**\n * Validate resource configuration\n */\n private validateResourceConfig(config: McpResourceConfig): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new Error(\"Resource name is required and must be a string\");\n }\n\n if (!config.uriTemplate || typeof config.uriTemplate !== \"string\") {\n throw new Error(\"Resource uriTemplate is required and must be a string\");\n }\n\n if (typeof config.handler !== \"function\") {\n throw new Error(\"Resource handler is required and must be a function\");\n }\n\n if (this.resources.has(config.name)) {\n throw new Error(`Resource with name '${config.name}' already exists`);\n }\n\n // Validate URI template format\n try {\n new ResourceTemplateParser(config.uriTemplate);\n } catch (error) {\n throw new Error(\n `Invalid URI template '${config.uriTemplate}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Notify all listeners of changes\n */\n private notifyChange(): void {\n for (const listener of this.changeListeners) {\n try {\n listener();\n } catch (error) {\n logger.error(\"Error in resource change listener:\", error);\n }\n }\n }\n}\n\n/**\n * Helper function to create common resource configurations\n */\nexport const createFileResource = (\n basePath: string = \"\",\n): McpResourceConfig => ({\n name: \"file-content\",\n uriTemplate: \"file://{path}\",\n title: \"File Content\",\n description: \"Read file contents from the filesystem\",\n mimeType: \"text/plain\",\n handler: async (uri, { path }) => {\n const fs = await import(\"node:fs/promises\");\n const fullPath = basePath ? `${basePath}/${path}` : path;\n\n try {\n const content = await fs.readFile(fullPath, \"utf8\");\n return {\n contents: [\n {\n uri: uri.href,\n text: content,\n mimeType: \"text/plain\",\n },\n ],\n };\n } catch (error) {\n throw new Error(\n `Failed to read file '${fullPath}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n },\n});\n\n/**\n * Helper function to create JSON data resource\n */\nexport const createJsonResource = (\n name: string,\n data: any,\n): McpResourceConfig => ({\n name,\n uriTemplate: `${name}://data`,\n title: `${name} Data`,\n description: `Access ${name} data as JSON`,\n mimeType: \"application/json\",\n handler: async (uri) => ({\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(data, null, 2),\n mimeType: \"application/json\",\n },\n ],\n }),\n});\n","import { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\n/**\n * Debug utility for conditional logging based on environment variables\n *\n * This utility provides clean debug logging without scattered conditional statements.\n * Debug output is controlled by the DEBUG environment variable.\n */\n\n/**\n * Check if debug mode is enabled\n */\nconst isDebugEnabled = (): boolean => {\n try {\n // Safe access to process.env that works in all JavaScript environments\n return Boolean(\n typeof process !== \"undefined\" && process.env && process.env[\"DEBUG\"],\n );\n } catch {\n // Fallback for environments where process is not available\n return false;\n }\n};\n\nconst logger = createMcpLogger(\"DEBUG\");\n\n/**\n * Debug logger that only outputs when DEBUG environment variable is set\n */\nexport const debug = {\n /**\n * Log a debug message to stderr (only when DEBUG=true)\n */\n log: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.error(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log an error debug message to stderr (only when DEBUG=true)\n */\n error: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.error(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log a warning debug message to stderr (only when DEBUG=true)\n */\n warn: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.warn(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log an info debug message to stderr (only when DEBUG=true)\n */\n info: (...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.info(typeof msg === \"string\" ? msg : String(msg), ...rest);\n }\n },\n\n /**\n * Log a debug message with a custom prefix (only when DEBUG=true)\n */\n prefixed: (prefix: string, ...args: any[]): void => {\n if (isDebugEnabled()) {\n const [msg, ...rest] = args;\n logger.info(\n `[${prefix}] ${typeof msg === \"string\" ? msg : String(msg)}`,\n ...rest,\n );\n }\n },\n\n /**\n * Check if debug mode is currently enabled\n */\n get enabled(): boolean {\n return isDebugEnabled();\n },\n};\n\n/**\n * Default export for convenience\n */\nexport default debug;\n","import { zodFlagSchema } from \"./types\";\nimport type { IFlag, ProcessedFlag } from \"./types\";\n\nexport class FlagManager {\n #_flags: Map<string, ProcessedFlag> = new Map();\n #throwForDuplicateFlags: boolean;\n\n constructor(\n options: { throwForDuplicateFlags?: boolean } = {},\n initialFlags: readonly IFlag[] = [],\n ) {\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags ?? false;\n this.addFlags(initialFlags);\n }\n\n static _safeFlag(flag: IFlag): ProcessedFlag {\n const parsedFromZod = zodFlagSchema.parse(flag);\n\n let resolvedType: ProcessedFlag[\"type\"];\n const inputTypeFromZod = parsedFromZod[\"type\"];\n\n if (typeof inputTypeFromZod === \"string\") {\n switch (inputTypeFromZod.toLowerCase()) {\n case \"boolean\":\n resolvedType = Boolean;\n break;\n case \"string\":\n resolvedType = String;\n break;\n case \"number\":\n resolvedType = Number;\n break;\n case \"array\":\n resolvedType = Array;\n break;\n case \"object\":\n resolvedType = Object;\n break;\n default:\n throw new Error(`Invalid type string: ${inputTypeFromZod}`);\n }\n } else {\n resolvedType = inputTypeFromZod as ProcessedFlag[\"type\"];\n }\n\n return {\n ...parsedFromZod,\n options: parsedFromZod[\"options\"],\n type: resolvedType,\n validate: parsedFromZod[\"validate\"],\n enum: parsedFromZod[\"enum\"],\n mandatory: parsedFromZod[\"mandatory\"],\n env: parsedFromZod[\"env\"],\n dxtOptions: parsedFromZod[\"dxtOptions\"],\n };\n }\n\n addFlag(flag: IFlag): this {\n const safeFlag = FlagManager._safeFlag(flag);\n\n if (this.#_flags.has(safeFlag[\"name\"])) {\n if (this.#throwForDuplicateFlags) {\n throw new Error(\n `FlagManager: Flag '${safeFlag[\"name\"]}' already exists.`,\n );\n } else {\n console.warn(\n `Warning: FlagManager: Flag '${safeFlag[\"name\"]}' already exists. Duplicate not added.`,\n );\n return this;\n }\n }\n\n this.#_flags.set(safeFlag[\"name\"], safeFlag);\n return this;\n }\n\n _setProcessedFlagForInheritance(processedFlag: ProcessedFlag): this {\n if (this.#_flags.has(processedFlag[\"name\"])) {\n return this;\n }\n this.#_flags.set(processedFlag[\"name\"], processedFlag);\n return this;\n }\n\n addFlags(flags: readonly IFlag[]): this {\n for (const flag of flags) {\n this.addFlag(flag);\n }\n return this;\n }\n\n hasFlag(name: string): boolean {\n return this.#_flags.has(name);\n }\n\n removeFlag(name: string): boolean {\n return this.#_flags.delete(name);\n }\n\n getFlag(name: string): ProcessedFlag | undefined {\n return this.#_flags.get(name);\n }\n\n get flags(): ProcessedFlag[] {\n return Array.from(this.#_flags.values());\n }\n\n get flagNames(): string[] {\n return Array.from(this.#_flags.values()).map((flag) => flag[\"name\"]);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport dotenv from \"dotenv\";\nimport { anyOf, char, createRegExp, oneOrMore } from \"magic-regexp\";\nimport { type ZodTypeAny } from \"zod\";\nimport chalk from \"@alcyone-labs/simple-chalk\";\nimport { createMcpLogger, type Logger } from \"@alcyone-labs/simple-mcp-logger\";\nimport { ConfigurationManager } from \"../config/ConfigurationManager\";\nimport { DxtGenerator } from \"../dxt/DxtGenerator\";\nimport {\n McpNotificationsManager,\n type McpChangeType,\n} from \"../mcp/mcp-notifications.js\";\nimport { McpPromptsManager, type McpPromptConfig } from \"../mcp/mcp-prompts.js\";\nimport {\n McpResourcesManager,\n type McpResourceConfig,\n} from \"../mcp/mcp-resources.js\";\nimport { debug } from \"../utils/debug-utils\";\nimport { FlagManager } from \"./FlagManager\";\nimport { resolveLogPath } from \"./log-path-utils\";\nimport { FlagInheritance } from \"./types\";\nimport type {\n IArgParser,\n IFlag,\n IHandlerContext,\n IMcpServerMethods,\n ISubCommand,\n ParseResult,\n ProcessedFlag,\n TFlagInheritance,\n TParsedArgs,\n} from \"./types\";\n\nexport class ArgParserError extends Error {\n public commandChain: string[];\n constructor(\n message: string,\n public cmdChain: string[] = [],\n ) {\n super(message);\n this.name = \"ArgParserError\";\n this.commandChain = cmdChain;\n }\n}\n\nexport interface IArgParserParams<THandlerReturn = any> {\n /**\n * This is the display name of the app, used in help text\n */\n appName?: string;\n subCommands?: ISubCommand[];\n handler?: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>;\n\n /**\n * Add an extra new line between each flag group,\n * makes the text more readable but uses more space\n *\n * Default: true\n */\n extraNewLine?: boolean;\n /**\n * Wraps the line at width, if shorter, wrapping will be more\n * aggressive. Wrapping is based on words.\n *\n * Default: 50\n * Minimum: 30\n */\n wrapAtWidth?: number;\n /**\n * Controls the placing of right text on the screen.\n * The higher the value, the more to the right the text will be.\n *\n * Default: 30\n * Minimum: 20\n */\n blankSpaceWidth?: number;\n /**\n * Character to display next to the flag to express mandatory fields.\n *\n * Default: *\n */\n mandatoryCharacter?: string;\n /**\n * Throw an error if a flag is added more than once\n * @default false\n */\n throwForDuplicateFlags?: boolean;\n description?: string; // New property for the description\n /**\n * Automatically handle ArgParserErrors by printing a formatted message\n * and exiting. Set to false to catch ArgParserError manually.\n * @default true\n */\n handleErrors?: boolean;\n /**\n * Whether to automatically call process.exit() based on ParseResult.\n * When true (default), maintains backward compatibility with CLI behavior.\n * When false, returns ParseResult objects for programmatic use.\n * @default true\n */\n autoExit?: boolean;\n /**\n * The command name to display in help suggestions (e.g., 'dabl').\n * If not provided, it falls back to guessing from the script path.\n */\n appCommandName?: string;\n /**\n * If true, when this parser is added as a sub-command, it will inherit\n * flags from its direct parent *unless* a flag with the same name\n * already exists in this parser. Child flags take precedence.\n * @default false\n */\n inheritParentFlags?: TFlagInheritance;\n /**\n * If true, when no handler is provided for a command (root or sub-command),\n * the help message will be automatically displayed.\n * @default false\n */\n triggerAutoHelpIfNoHandler?: boolean;\n /**\n * Optional logger instance to use.\n * If not provided, a default one will be created.\n */\n logger?: Logger;\n}\n\nexport interface IParseOptions {\n /**\n * When true, skips help flag processing (doesn't exit or show help)\n * @default false\n */\n skipHelpHandling?: boolean;\n /**\n * When true, skips the execution of any command handlers.\n * @default false\n */\n skipHandlers?: boolean;\n /**\n * When true (default), automatically awaits async handlers before returning.\n * When false, returns immediately with _asyncHandlerPromise for manual handling.\n * @default true\n */\n deep?: boolean;\n /**\n * When true, indicates this is being called from MCP mode\n * @default false\n * @internal\n */\n isMcp?: boolean;\n /**\n * Internal: when true, this parse call is only for dynamic flag preloading for help\n * Suppresses side effects and handler execution\n * @internal\n */\n dynamicHelpPreload?: boolean;\n /**\n * When true, automatically executes the CLI if the script is being run directly (not imported).\n * When false, disables auto-execution detection even if importMetaUrl is provided.\n * Uses robust detection that works across different environments and sandboxes.\n * Only takes effect when importMetaUrl is also provided.\n * @default true (when importMetaUrl is provided)\n */\n autoExecute?: boolean;\n /**\n * The import.meta.url from the calling script, required for reliable auto-execution detection.\n * Only used when autoExecute is true.\n */\n importMetaUrl?: string;\n}\n\ntype TParsedArgsWithRouting<T = any> = T & {\n $commandChain?: string[];\n handlerToExecute?: { handler: Function; context: IHandlerContext };\n};\n\ntype InternalParsedArgs<T = any> = TParsedArgsWithRouting<T> & {\n _asyncHandlerPromise?: Promise<any>;\n _asyncHandlerInfo?: { handler: Function; context: IHandlerContext };\n _originalInputArgs?: string[] | string;\n handlerResponse?: any;\n};\n\ntype RecursiveParseResult = {\n finalArgs: InternalParsedArgs<any>; // Changed from TParsedArgsWithRouting<any>\n handlerToExecute?: { handler: Function; context: IHandlerContext };\n};\n\nexport class ArgParserBase<\n THandlerReturn = any,\n> implements IArgParser<THandlerReturn> {\n #appName: string = \"Argument Parser\";\n #appCommandName?: string;\n #subCommandName: string = \"\";\n #parameters: IArgParserParams<THandlerReturn> = {\n extraNewLine: true,\n wrapAtWidth: 50,\n blankSpaceWidth: 30,\n mandatoryCharacter: \"*\",\n };\n #handler?: (ctx: IHandlerContext) => void;\n #throwForDuplicateFlags: boolean = false;\n #description?: string;\n #handleErrors: boolean = true;\n #autoExit: boolean = true;\n #parentParser?: ArgParserBase;\n #lastParseResult: TParsedArgs<ProcessedFlag[]> = {};\n #inheritParentFlags: TFlagInheritance = false;\n #subCommands: Map<string, ISubCommand> = new Map();\n #flagManager: FlagManager;\n #dxtGenerator: DxtGenerator;\n #configurationManager: ConfigurationManager;\n #fuzzyMode: boolean = false;\n #triggerAutoHelpIfNoHandler: boolean = false;\n #logger: Logger;\n\n // Track dynamically added flags so we can clean them between parses\n #dynamicFlagNames: Set<string> = new Set();\n\n // MCP-related managers\n #mcpResourcesManager: McpResourcesManager = new McpResourcesManager();\n #mcpPromptsManager: McpPromptsManager = new McpPromptsManager();\n #mcpNotificationsManager: McpNotificationsManager =\n new McpNotificationsManager();\n\n // Working directory management\n /** The effective working directory for this parser instance */\n #effectiveWorkingDirectory: string | null = null;\n\n /** The original root path from user's CLI invocation */\n #rootPath: string | null = null;\n\n /** Tracks if effective working directory has been resolved */\n #workingDirectoryResolved = false;\n\n constructor(\n options: IArgParserParams<THandlerReturn> = {},\n initialFlags?: readonly IFlag[],\n ) {\n this.#appName = options.appName || \"app\";\n if (\n options.blankSpaceWidth &&\n !isNaN(Number(options.blankSpaceWidth)) &&\n Number(options.blankSpaceWidth) > 20\n )\n this.#parameters.blankSpaceWidth = Number(options.blankSpaceWidth);\n\n if (\n options.wrapAtWidth &&\n !isNaN(Number(options.wrapAtWidth)) &&\n Number(options.wrapAtWidth) > 30\n )\n this.#parameters.wrapAtWidth = Number(options.wrapAtWidth);\n\n if (typeof options.extraNewLine === \"boolean\")\n this.#parameters.extraNewLine = Boolean(options.extraNewLine);\n\n if (typeof options.mandatoryCharacter === \"string\")\n this.#parameters.mandatoryCharacter = options.mandatoryCharacter;\n\n if (typeof options.throwForDuplicateFlags === \"boolean\")\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags;\n\n this.#flagManager = new FlagManager(\n {\n throwForDuplicateFlags: this.#throwForDuplicateFlags,\n },\n initialFlags || [],\n );\n\n this.#handleErrors = options.handleErrors ?? true;\n this.#autoExit = options.autoExit ?? true;\n this.#inheritParentFlags = options.inheritParentFlags ?? false;\n this.#triggerAutoHelpIfNoHandler =\n options.triggerAutoHelpIfNoHandler ?? false;\n this.#description = options.description;\n this.#handler = options.handler;\n this.#appCommandName = options.appCommandName;\n this.#logger =\n options.logger ||\n createMcpLogger({\n prefix: this.#appName,\n mcpMode: false,\n });\n\n const helpFlag: IFlag = {\n name: \"help\",\n description: \"Display this help message and exits\",\n mandatory: false,\n type: Boolean,\n options: [\"-h\", \"--help\"],\n defaultValue: undefined,\n allowLigature: false,\n allowMultiple: false,\n flagOnly: true,\n enum: [],\n validate: (_value?: any, _parsedArgs?: any) => true, // Ensure signature matches Zod schema for .args()\n };\n this.#flagManager.addFlag(helpFlag); // Add the help flag via FlagManager\n\n // Initialize DXT generator\n this.#dxtGenerator = new DxtGenerator(this);\n\n // Initialize Configuration manager\n this.#configurationManager = new ConfigurationManager(this);\n\n if (options.subCommands) {\n for (const sub of options.subCommands) {\n this.addSubCommand(sub);\n }\n }\n }\n\n get flags(): ProcessedFlag[] {\n return this.#flagManager.flags;\n }\n\n get flagNames(): string[] {\n return this.#flagManager.flagNames;\n }\n\n public getAppName(): string | undefined {\n return this.#appName;\n }\n\n public getAppCommandName(): string | undefined {\n return this.#appCommandName;\n }\n\n /**\n * Access to the logger\n */\n public get logger(): Logger {\n return this.#logger;\n }\n\n public getSubCommandName(): string {\n return this.#subCommandName;\n }\n\n public getDescription(): string | undefined {\n return this.#description;\n }\n\n public getAutoExit(): boolean {\n return this.#autoExit;\n }\n\n /**\n * Helper method to handle exit logic based on autoExit setting\n * Returns a ParseResult instead of calling process.exit() when autoExit is false\n */\n private _handleExit(\n exitCode: number,\n message?: string,\n type?: ParseResult[\"type\"],\n data?: any,\n ): ParseResult | never {\n const result: ParseResult = {\n success: exitCode === 0,\n exitCode,\n message,\n type: type || (exitCode === 0 ? \"success\" : \"error\"),\n shouldExit: true,\n data,\n };\n\n if (\n this.#autoExit &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(exitCode as never);\n }\n\n return result;\n }\n\n public getHandler(): ((ctx: IHandlerContext) => void) | undefined {\n return this.#handler;\n }\n\n public getSubCommands(): Map<string, ISubCommand> {\n return this.#subCommands;\n }\n\n private async _addToOutput(\n flag: ProcessedFlag, // Changed from Flags[number]\n arg: any,\n output: TParsedArgs<ProcessedFlag[]>,\n _parseOptions?: IParseOptions,\n ) {\n let value: unknown = arg;\n\n if (flag[\"type\"] === Boolean) {\n if (typeof arg === \"boolean\") {\n value = arg;\n } else if (typeof arg === \"string\") {\n value = /(true|yes|1)/i.test(arg);\n } else {\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n } else if (typeof flag[\"type\"] === \"function\") {\n const result = (flag[\"type\"] as Function)(value as string);\n // Handle both sync and async custom parser functions\n value =\n result && typeof result.then === \"function\" ? await result : result;\n } else if (typeof flag[\"type\"] === \"object\") {\n // Check if it's a Zod schema\n if (flag[\"type\"] && (flag[\"type\"] as ZodTypeAny)._def) {\n // It's a Zod schema - parse JSON and validate\n try {\n const parsedJson =\n typeof value === \"string\" ? JSON.parse(value as string) : value;\n value = (flag[\"type\"] as ZodTypeAny).parse(parsedJson);\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `Invalid JSON for flag '${flag[\"name\"]}': ${error.message}`,\n );\n } else {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n throw new Error(\n `Validation failed for flag '${flag[\"name\"]}': ${errorMessage}`,\n );\n }\n }\n } else {\n // Regular object constructor\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n }\n\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n const allowedValues = flag[\"enum\"]\n .map((v: any) => (typeof v === \"string\" ? `'${v}'` : v))\n .join(\", \");\n\n if (!flag[\"enum\"].includes(value)) {\n throw new ArgParserError(\n `Invalid value '${value}' for flag '${chalk.yellow(flag[\"name\"])}'. ` +\n `Allowed values: ${allowedValues}`,\n this.getCommandChain(),\n );\n }\n }\n\n if (flag[\"validate\"]) {\n const validationResult = flag[\"validate\"](value, output);\n if (validationResult === false) {\n throw new ArgParserError(\n `Validation failed for flag '${chalk.yellow(flag[\"name\"])}' with value '${value}'`,\n this.getCommandChain(),\n );\n } else if (typeof validationResult === \"string\") {\n throw new ArgParserError(validationResult, this.getCommandChain());\n }\n }\n\n if (flag[\"allowMultiple\"] && !Array.isArray(output[flag[\"name\"]])) {\n output[flag[\"name\"]] = [] as any;\n }\n\n return flag[\"allowMultiple\"]\n ? (output[flag[\"name\"]] as any[]).push(value)\n : (output[flag[\"name\"]] = value as any);\n }\n\n // Register flags coming from dynamic loaders and track them for cleanup\n #registerDynamicFlags(flags: readonly IFlag[]): void {\n if (!Array.isArray(flags) || flags.length === 0) return;\n for (const flag of flags) {\n const name = (flag as any)[\"name\"] as string;\n const existed = this.#flagManager.hasFlag(name);\n this.#flagManager.addFlag(flag);\n if (!existed) this.#dynamicFlagNames.add(name);\n }\n }\n\n // Remove dynamically registered flags on this parser and all sub-parsers\n #resetDynamicFlagsRecursive(parser: ArgParserBase = this): void {\n for (const name of parser.#dynamicFlagNames) {\n parser.#flagManager.removeFlag(name);\n }\n parser.#dynamicFlagNames.clear();\n for (const [, sub] of parser.#subCommands) {\n if (sub && sub.parser instanceof ArgParserBase) {\n sub.parser.#resetDynamicFlagsRecursive();\n }\n }\n }\n\n // Preload dynamic flags for help display without executing handlers\n async #_preloadDynamicFlagsForHelp(processArgs: string[]): Promise<void> {\n let currentParser: ArgParserBase = this;\n let remaining = [...processArgs];\n\n while (true) {\n // Find first index that matches a sub-command of currentParser\n let subIndex = -1;\n for (let i = 0; i < remaining.length; i++) {\n if (currentParser.#subCommands.has(remaining[i]!)) {\n subIndex = i;\n break;\n }\n }\n\n const segment =\n subIndex === -1 ? remaining : remaining.slice(0, subIndex);\n try {\n await currentParser.#parseFlags(segment, {\n skipHelpHandling: true,\n dynamicHelpPreload: true,\n });\n } catch {\n // ignore errors during help preloading\n }\n\n if (subIndex === -1) break;\n const nextName = remaining[subIndex]!;\n const sub = currentParser.#subCommands.get(nextName);\n if (!sub || !(sub.parser instanceof ArgParserBase)) break;\n currentParser = sub.parser;\n remaining = remaining.slice(subIndex + 1);\n }\n }\n\n addFlags(flags: readonly IFlag[]): this {\n this.#flagManager.addFlags(flags);\n return this;\n }\n\n addFlag(flag: IFlag): this {\n this.#flagManager.addFlag(flag);\n return this;\n }\n\n addSubCommand(subCommandConfig: ISubCommand): this {\n if (this.#subCommands.has(subCommandConfig.name)) {\n throw new Error(`Sub-command '${subCommandConfig.name}' already exists`);\n }\n\n const subParser = subCommandConfig.parser;\n\n if (!(subParser instanceof ArgParserBase)) {\n throw new Error(\n `Parser for subcommand '${subCommandConfig.name}' is not an instance of ArgParserBase. ` +\n `Please provide 'new ArgParserBase(...)' for the 'parser' property of an ISubCommand.`,\n );\n }\n\n subParser.#parentParser = this;\n subParser.#subCommandName = subCommandConfig.name;\n if (!subParser.#appCommandName && this.#appCommandName) {\n subParser.#appCommandName = this.#appCommandName;\n }\n\n // Copy description from config to sub-parser if provided\n if (subCommandConfig.description) {\n subParser.#description = subCommandConfig.description;\n }\n\n // Inherit autoExit setting from parent to ensure consistent error handling\n // across the parser hierarchy. Child parsers should follow parent's exit behavior.\n subParser.#autoExit = this.#autoExit;\n subParser.#triggerAutoHelpIfNoHandler = this.#triggerAutoHelpIfNoHandler;\n\n // Initial inheritance (Snapshot behavior)\n // If inheritParentFlags is true or DirectParentOnly or AllParents, we copy current parent flags.\n const shouldInherit =\n subParser.#inheritParentFlags === true ||\n subParser.#inheritParentFlags === FlagInheritance.DirectParentOnly ||\n subParser.#inheritParentFlags === FlagInheritance.AllParents;\n\n if (shouldInherit) {\n const parentFlags = this.#flagManager.flags;\n for (const parentFlag of parentFlags) {\n if (!subParser.#flagManager.hasFlag(parentFlag[\"name\"])) {\n subParser.#flagManager._setProcessedFlagForInheritance(parentFlag);\n }\n }\n }\n\n this.#subCommands.set(subCommandConfig.name, subCommandConfig);\n // We trigger a propagation from the subParser downwards.\n // This ensures that if subParser just acquired flags from 'this',\n // any existing children of subParser properly inherit them.\n this.#propagateFlagsRecursive(subParser);\n\n if (subCommandConfig.handler) {\n subParser.setHandler(subCommandConfig.handler);\n }\n\n return this;\n }\n\n /**\n * Propagates available flags from the current parser to its subcommands,\n * if those subcommands are configured to inherit recursively (AllParents).\n */\n #propagateFlagsRecursive(parser: ArgParserBase): void {\n // We iterate over all children of 'parser'\n for (const [_, subConfig] of parser.getSubCommands()) {\n const childParser = subConfig.parser;\n if (!(childParser instanceof ArgParserBase)) continue;\n\n // Check if child wants multiple levels of inheritance\n const isAllParents =\n childParser.#inheritParentFlags === FlagInheritance.AllParents;\n\n if (isAllParents) {\n // Copy flags from 'parser' (which is the parent of childParser) to 'childParser'\n const parentFlags = parser.#flagManager.flags;\n let flagsAdded = false;\n\n for (const parentFlag of parentFlags) {\n if (!childParser.#flagManager.hasFlag(parentFlag[\"name\"])) {\n childParser.#flagManager._setProcessedFlagForInheritance(\n parentFlag,\n );\n flagsAdded = true;\n }\n }\n\n // If we added new flags to the child, we must recurse deeper\n if (flagsAdded) {\n this.#propagateFlagsRecursive(childParser);\n }\n }\n }\n }\n\n /**\n * Sets the handler function for this specific parser instance.\n * This handler will be executed if this parser is the final one\n * in the command chain and `executeHandlers` is enabled on the root parser.\n *\n * @param handler - The function to execute.\n * @returns The ArgParser instance for chaining.\n */\n setHandler(\n handler: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>,\n ): this {\n this.#handler = handler;\n return this;\n }\n\n printAll(filePath?: string): void {\n if (filePath) {\n try {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n if (filePath.toLowerCase().endsWith(\".json\")) {\n const outputObject = this.#_buildRecursiveJson(this);\n const jsonString = JSON.stringify(outputObject, null, 2);\n fs.writeFileSync(filePath, jsonString);\n this.#logger.info(\n `ArgParser configuration JSON dumped to: ${filePath}`,\n );\n } else {\n const outputString = this.#_buildRecursiveString(this, 0);\n const plainText = outputString.replace(\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n \"\",\n );\n fs.writeFileSync(filePath, plainText);\n this.#logger.info(\n `ArgParser configuration text dumped to: ${filePath}`,\n );\n }\n } catch (error) {\n this.#logger.error(\n `Error writing ArgParser configuration to file '${filePath}':`,\n error,\n );\n }\n } else {\n this.#logger.info(\"\\n--- ArgParser Configuration Dump ---\");\n this.#_printRecursiveToConsole(this, 0);\n this.#logger.info(\"--- End Configuration Dump ---\\\\n\");\n }\n }\n\n #_identifyCommandChainAndParsers(\n argsToParse: string[],\n currentParser: ArgParserBase,\n commandChainSoFar: string[],\n parserChainSoFar: ArgParserBase[],\n ): {\n finalParser: ArgParserBase;\n commandChain: string[];\n parserChain: ArgParserBase[];\n remainingArgs: string[];\n } {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n if (subCommandIndex === -1 || subCommandName === null) {\n return {\n finalParser: currentParser,\n commandChain: commandChainSoFar,\n parserChain: parserChainSoFar,\n remainingArgs: argsToParse,\n };\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName);\n if (\n !subCommandConfig ||\n !(subCommandConfig.parser instanceof ArgParserBase)\n ) {\n throw new Error(\n `Internal error: Subcommand '${subCommandName!}' configuration is invalid or parser is missing.`,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const nextParserChain = [...parserChainSoFar, nextParser];\n\n return this.#_identifyCommandChainAndParsers(\n nextArgs,\n nextParser,\n nextCommandChain,\n nextParserChain,\n );\n }\n\n #_resolveWorkingDirectory(\n processArgs: string[],\n parserChain: ArgParserBase[],\n ): { effectiveCwd: string; rootPath: string } {\n // 1. Store the original root path once\n if (!this.#rootPath) {\n this.#rootPath = process.cwd();\n }\n\n // 2. Scan for flags with setWorkingDirectory in reverse order\n // (last one in command chain wins)\n let foundCwd: string | null = null;\n\n for (let i = parserChain.length - 1; i >= 0; i--) {\n const parser = parserChain[i];\n const chdirFlags = parser.#flagManager.flags.filter(\n (flag: ProcessedFlag) => flag[\"setWorkingDirectory\"],\n );\n\n for (const flag of chdirFlags) {\n // Simple pattern matching for flag presence\n for (const option of flag[\"options\"]) {\n // Find flag in processArgs\n const flagIndex = processArgs.indexOf(option);\n if (flagIndex !== -1 && flagIndex + 1 < processArgs.length) {\n const value = processArgs[flagIndex + 1];\n if (!value || value.startsWith(\"-\")) continue;\n\n // Resolve path relative to current effective working directory\n const resolvedPath = path.resolve(\n this.#effectiveWorkingDirectory || this.#rootPath,\n value,\n );\n\n // Validate path exists and is a directory\n if (!fs.existsSync(resolvedPath)) {\n // Use console.warn directly for user-facing warnings\n console.warn(\n chalk.yellow(\n `Warning: Working directory '${resolvedPath}' specified by ${option} does not exist. Using current directory instead.`,\n ),\n );\n continue;\n }\n\n if (!fs.statSync(resolvedPath).isDirectory()) {\n // Use console.warn directly for user-facing warnings\n console.warn(\n chalk.yellow(\n `Warning: Path '${resolvedPath}' specified by ${option} is not a directory. Using current directory instead.`,\n ),\n );\n continue;\n }\n\n foundCwd = resolvedPath;\n\n // Actually change the working directory\n process.chdir(resolvedPath);\n\n // Check for multiple chdir flags\n const allChdirIndices: { index: number; flag: string }[] = [];\n for (let j = 0; j < processArgs.length; j++) {\n for (const p of parserChain) {\n for (const f of p.#flagManager.flags) {\n if (\n f[\"setWorkingDirectory\"] &&\n f[\"options\"].includes(processArgs[j])\n ) {\n allChdirIndices.push({ index: j, flag: processArgs[j] });\n }\n }\n }\n }\n\n if (allChdirIndices.length > 1) {\n this.#logger.warn(\n chalk.yellow(\n `Warning: Multiple working directory flags detected. Using '${option}' (last one in command chain).`,\n ),\n );\n }\n\n break; // Use the first found flag in this parser\n }\n }\n\n if (foundCwd) break; // Found valid chdir flag, stop searching\n }\n\n if (foundCwd) break; // Found valid chdir flag, stop searching parsers\n }\n\n // 3. Return effective working directory\n return {\n effectiveCwd: foundCwd || this.#rootPath,\n rootPath: this.#rootPath,\n };\n }\n\n async #_handleGlobalChecks(\n processArgs: string[],\n options?: IParseOptions,\n ): Promise<boolean | ParseResult> {\n // Resolve working directory FIRST\n const { finalParser: parserChainParser } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const { effectiveCwd, rootPath } = this.#_resolveWorkingDirectory(\n processArgs,\n parserChainParser ? [this, parserChainParser] : [this],\n );\n\n this.#effectiveWorkingDirectory = effectiveCwd;\n this.#rootPath = rootPath;\n this.#workingDirectoryResolved = true;\n\n // Auto-help should only trigger for root parsers that are intended as main CLI entry points\n // A parser is considered a \"root CLI parser\" if it has appCommandName explicitly set\n // This ensures that only parsers intended as main CLI tools trigger auto-help\n const isRootCliParser = !this.#parentParser && !!this.#appCommandName;\n\n if (\n processArgs.length === 0 &&\n isRootCliParser &&\n !this.#handler &&\n !options?.skipHelpHandling\n ) {\n this.#logger.info(this.helpText());\n return this._handleExit(0, \"Help displayed\", \"help\");\n }\n\n if (processArgs.includes(\"--s-debug-print\")) {\n this.printAll(\"ArgParser.full.json\");\n return this._handleExit(0, \"Debug information printed\", \"debug\");\n }\n\n // Handle --s-enable-fuzzy system flag to enable fuzzy testing mode\n if (processArgs.includes(\"--s-enable-fuzzy\")) {\n this.#_enableFuzzyMode();\n // Remove the flag from processArgs so it doesn't interfere with parsing\n const fuzzyIndex = processArgs.indexOf(\"--s-enable-fuzzy\");\n processArgs.splice(fuzzyIndex, 1);\n }\n\n // Handle --s-with-env system flag early to modify processArgs before parsing\n const withEnvIndex = processArgs.findIndex((arg) => arg === \"--s-with-env\");\n if (withEnvIndex !== -1) {\n let envFilePath: string | null = null;\n let shouldAutoDiscover: boolean;\n\n // Auto-discovery: Check if we should auto-discover .env files\n // Auto-discover when: (1) setWorkingDirectory is set AND (2) --s-with-env is NOT provided (no file path)\n shouldAutoDiscover =\n this.#workingDirectoryResolved &&\n this.#effectiveWorkingDirectory !== this.#rootPath &&\n withEnvIndex + 1 >= processArgs.length;\n\n // Check if a file path is provided\n if (withEnvIndex + 1 < processArgs.length) {\n const providedPath = processArgs[withEnvIndex + 1];\n if (providedPath && !providedPath.startsWith(\"-\")) {\n // Use effective working directory (or current cwd if not set)\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = path.resolve(basePath, providedPath);\n } else if (shouldAutoDiscover) {\n // No file path provided, but shouldAutoDiscover is true\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (!envFilePath) {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n // Remove flag and continue\n processArgs.splice(withEnvIndex, 1);\n }\n }\n } else if (shouldAutoDiscover) {\n // --s-with-env is NOT provided, but setWorkingDirectory is set\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (envFilePath) {\n console.warn(`Auto-discovered env file: ${envFilePath}`);\n } else {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n }\n }\n\n // Load env file if found (this processes both explicit and auto-discovered files)\n if (envFilePath) {\n try {\n // Identify to final parser and parser chain for loading configuration\n const {\n finalParser: identifiedFinalParser,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(\n processArgs,\n this,\n [],\n [this],\n );\n\n const envConfigArgs =\n identifiedFinalParser.#configurationManager.loadEnvFile(\n envFilePath,\n identifiedParserChain,\n );\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs =\n identifiedFinalParser.#configurationManager.mergeEnvConfigWithArgs(\n envConfigArgs,\n processArgs,\n identifiedParserChain,\n );\n\n // Replace to original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n\n // Remove to --s-with-env flag and its file path argument from processArgs\n // This must be done after merging to avoid interfering with to merge process\n const finalWithEnvIndex = processArgs.findIndex(\n (arg) => arg === \"--s-with-env\",\n );\n if (finalWithEnvIndex !== -1) {\n // Check if there's a file path argument after to flag\n if (\n finalWithEnvIndex + 1 < processArgs.length &&\n !processArgs[finalWithEnvIndex + 1].startsWith(\"-\")\n ) {\n processArgs.splice(finalWithEnvIndex, 2); // Remove both flag and file path\n } else {\n processArgs.splice(finalWithEnvIndex, 1); // Remove only to flag\n }\n }\n } catch (error) {\n console.error(\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n );\n return this._handleExit(\n 1,\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n // Auto-discovery: If no file path provided, check if we should auto-discover\n if (shouldAutoDiscover) {\n // No file path provided, but shouldAutoDiscover is true\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (envFilePath) {\n console.warn(`Auto-discovered env file: ${envFilePath}`);\n } else {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n }\n }\n\n // Load env file if found (this processes both explicit and auto-discovered files)\n if (envFilePath) {\n try {\n // Identify to final parser and parser chain for loading configuration\n const {\n finalParser: identifiedFinalParser,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(\n processArgs,\n this,\n [],\n [this],\n );\n\n const envConfigArgs =\n identifiedFinalParser.#configurationManager.loadEnvFile(\n envFilePath,\n identifiedParserChain,\n );\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs =\n identifiedFinalParser.#configurationManager.mergeEnvConfigWithArgs(\n envConfigArgs,\n processArgs,\n identifiedParserChain,\n );\n\n // Replace to original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n return this._handleExit(\n 1,\n `Error loading environment file: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n // Auto-discovery: Check if we should auto-discover .env files\n // Auto-discover when: (1) setWorkingDirectory is set AND (2) --s-with-env is NOT provided (no file path)\n shouldAutoDiscover =\n this.#workingDirectoryResolved &&\n this.#effectiveWorkingDirectory !== this.#rootPath &&\n withEnvIndex + 1 >= processArgs.length;\n\n if (shouldAutoDiscover) {\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n envFilePath = this.#configurationManager.discoverEnvFile(basePath);\n\n if (envFilePath) {\n console.warn(`Auto-discovered env file: ${envFilePath}`);\n } else {\n console.warn(\n \"Warning: No .env file found in working directory. Continuing without environment configuration.\",\n );\n }\n // Remove --s-with-env flag if no env file was found\n if (!envFilePath) {\n processArgs.splice(withEnvIndex, 1);\n }\n }\n }\n\n // Auto-discovery: When setWorkingDirectory flag was used (cwd changed) but --s-with-env was NOT provided,\n // automatically discover and load .env files from the new working directory\n const withEnvWasProvided = processArgs.some(\n (arg) => arg === \"--s-with-env\",\n );\n const shouldAutoDiscoverWithoutFlag =\n this.#workingDirectoryResolved &&\n this.#effectiveWorkingDirectory !== this.#rootPath &&\n !withEnvWasProvided;\n\n if (shouldAutoDiscoverWithoutFlag) {\n const basePath = this.#effectiveWorkingDirectory || process.cwd();\n const autoDiscoveredEnvFile =\n this.#configurationManager.discoverEnvFile(basePath);\n\n if (autoDiscoveredEnvFile) {\n console.warn(`Auto-discovered env file: ${autoDiscoveredEnvFile}`);\n\n // Load env file into process.env using dotenv (dotenv-style behavior)\n dotenv.config({\n path: autoDiscoveredEnvFile,\n quiet: true,\n override: true,\n });\n\n try {\n // Identify the final parser and parser chain for loading configuration\n const { finalParser: envFinalParser, parserChain: envParserChain } =\n this.#_identifyCommandChainAndParsers(\n processArgs,\n this,\n [],\n [this],\n );\n\n const envConfigArgs =\n envFinalParser.#configurationManager.loadEnvFile(\n autoDiscoveredEnvFile,\n envParserChain,\n );\n\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs =\n envFinalParser.#configurationManager.mergeEnvConfigWithArgs(\n envConfigArgs,\n processArgs,\n envParserChain,\n );\n\n // Replace the original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n } catch (error) {\n console.error(\n `Error loading auto-discovered environment file: ${error instanceof Error ? error.message : String(error)}`,\n );\n // Don't exit on auto-discovery errors, just warn and continue\n }\n }\n }\n\n const { finalParser: identifiedFinalParser } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const buildDxtIndex = processArgs.findIndex(\n (arg) => (arg ?? \"\").toLowerCase() === \"--s-build-dxt\",\n );\n if (buildDxtIndex !== -1) {\n const dxtResult = await this.#_handleBuildDxtFlag(\n processArgs,\n buildDxtIndex,\n );\n if (dxtResult !== false) {\n return dxtResult === true ? true : dxtResult;\n }\n }\n\n // Handle --s-mcp-serve system flag to start all MCP servers\n debug.log(\"Checking for --s-mcp-serve flag in args:\", processArgs);\n const mcpServeIndex = processArgs.findIndex(\n (arg) => arg === \"--s-mcp-serve\",\n );\n debug.log(\"mcpServeIndex:\", mcpServeIndex);\n if (mcpServeIndex !== -1) {\n debug.log(\"Found --s-mcp-serve flag, calling handler\");\n const mcpServeResult = await this.#_handleMcpServeFlag(\n processArgs,\n mcpServeIndex,\n );\n debug.log(\"MCP serve handler returned:\", typeof mcpServeResult);\n if (mcpServeResult !== false) {\n return mcpServeResult === true ? true : mcpServeResult;\n }\n }\n\n if (processArgs.includes(\"--s-debug\")) {\n console.log(\n chalk.yellow.bold(\"\\n--- ArgParser --s-debug Runtime Context ---\"),\n );\n\n const {\n commandChain: identifiedCommandChain,\n parserChain: _identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n console.log(\n `Identified Command Chain: ${chalk.cyan(identifiedCommandChain.join(\" -> \") || \"(root)\")}`,\n );\n console.log(\n `Identified Final Parser: ${chalk.cyan(identifiedFinalParser.#subCommandName || identifiedFinalParser.#appName)}`,\n );\n\n let currentParser: ArgParserBase = this;\n let remainingArgs = [...processArgs];\n let accumulatedArgs: TParsedArgs<any> = {};\n const parsingSteps: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n }[] = [];\n\n const rootSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const rootArgsSlice =\n rootSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, rootSubCommandIndex);\n parsingSteps.push({ level: \"(root)\", argsSlice: rootArgsSlice });\n try {\n const { parsedArgs: rootParsedArgs } = await currentParser.#parseFlags(\n rootArgsSlice,\n { skipHelpHandling: true },\n );\n parsingSteps[0].parsed = rootParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...rootParsedArgs };\n } catch (e: any) {\n parsingSteps[0].error = e.message;\n }\n remainingArgs =\n rootSubCommandIndex === -1\n ? []\n : remainingArgs.slice(rootSubCommandIndex);\n\n for (let i = 0; i < identifiedCommandChain.length; i++) {\n const subCommandName = identifiedCommandChain[i];\n if (!currentParser.#subCommands.has(subCommandName)) {\n parsingSteps.push({\n level: `Error`,\n argsSlice: [],\n error: `Could not find sub-command parser for '${subCommandName}'`,\n });\n break;\n }\n currentParser = (currentParser as any).#subCommands.get(\n subCommandName,\n )?.parser;\n remainingArgs = remainingArgs.slice(1);\n\n const nextSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const currentLevelArgsSlice =\n nextSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, nextSubCommandIndex);\n const stepInfo: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n } = {\n level: subCommandName,\n argsSlice: currentLevelArgsSlice,\n };\n parsingSteps.push(stepInfo);\n\n try {\n const { parsedArgs: currentLevelParsedArgs } =\n await currentParser.#parseFlags(currentLevelArgsSlice, {\n skipHelpHandling: true,\n });\n stepInfo.parsed = currentLevelParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...currentLevelParsedArgs };\n } catch (e: any) {\n stepInfo.error = e.message;\n }\n remainingArgs =\n nextSubCommandIndex === -1\n ? []\n : remainingArgs.slice(nextSubCommandIndex);\n }\n\n this.#logger.info(chalk.yellow(\"\\nParsing Simulation Steps:\"));\n parsingSteps.forEach((step) => {\n this.#logger.info(` Level: ${chalk.cyan(step.level)}`);\n this.#logger.info(\n ` Args Slice Considered: ${JSON.stringify(step.argsSlice)}`,\n );\n if (step.parsed) {\n this.#logger.info(\n ` Parsed Args at this Level: ${JSON.stringify(step.parsed)}`,\n );\n }\n if (step.error) {\n this.#logger.info(\n ` ${chalk.red(\"Error during parse simulation:\")} ${step.error}`,\n );\n }\n });\n\n this.#logger.info(\n chalk.yellow(\n \"\\nFinal Accumulated Args State (before final validation):\",\n ),\n );\n this.#logger.info(JSON.stringify(accumulatedArgs, null, 2));\n\n this.#logger.info(\n chalk.yellow(\"\\nArguments Remaining After Simulation:\"),\n );\n this.#logger.info(JSON.stringify(remainingArgs, null, 2));\n\n this.#logger.info(\n chalk.yellow.bold(\n \"\\n--- ArgParser Static Configuration (Final Parser) ---\",\n ),\n );\n identifiedFinalParser.printAll();\n\n this.#logger.info(chalk.yellow.bold(\"--- End ArgParser --s-debug ---\"));\n return this._handleExit(0, \"Debug information displayed\", \"debug\");\n }\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n let parserNameForLog = \"undefined_parser\";\n if (identifiedFinalParser instanceof ArgParserBase) {\n // Access public getters instead of private fields\n parserNameForLog =\n identifiedFinalParser.getSubCommandName() ||\n identifiedFinalParser.getAppName() ||\n \"unknown\";\n } else if (identifiedFinalParser) {\n parserNameForLog =\n (identifiedFinalParser as any).name ||\n (identifiedFinalParser as any).appName ||\n \"unknown_type\";\n }\n // console.log(\n // `[ArgParser #_handleGlobalChecks Debug] identifiedFinalParser: constructor=${identifiedFinalParser ? 'defined' : 'undefined'}, isArgParser=${identifiedFinalParser instanceof ArgParser}, name=${parserNameForLog}`\n // );\n // ---- END ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n\n // ---- BEGIN GUARD FOR identifiedFinalParser ----\n if (!(identifiedFinalParser instanceof ArgParserBase)) {\n console.error(\n `[ArgParser #_handleGlobalChecks Critical Error] identifiedFinalParser is not an instance of ArgParser. Cannot process help. Name: ${parserNameForLog}, Constructor: ${identifiedFinalParser ? (identifiedFinalParser as any).constructor?.name : \"undefined\"}`,\n );\n // Returning false to prevent further processing with an invalid parser,\n // which could lead to more cryptic errors or incorrect behavior.\n return false;\n }\n // ---- END GUARD FOR identifiedFinalParser ----\n\n const helpFlagDefinition =\n identifiedFinalParser.#flagManager.getFlag(\"help\");\n if (helpFlagDefinition && !options?.skipHelpHandling) {\n const helpOptions = helpFlagDefinition[\"options\"];\n\n // ---- BEGIN ADDED DEBUG AND DEFENSIVE CHECK ----\n // if (!Array.isArray(helpOptions) || helpOptions.length === 0) {\n // console.warn(\n // `[ArgParser Debug] helpOptions is not a valid array or is empty. Value: ${JSON.stringify(helpOptions)}, Type: ${typeof helpOptions}`,\n // `Parser: ${parserNameForLog}`, // Use the determined parserNameForLog\n // );\n // // Potentially, we might even want to return false here or throw,\n // // as help cannot be processed correctly. For now, just log and continue.\n // } else {\n // // Optional: Log the valid helpOptions for debugging successful cases\n // // console.log(`[ArgParser Debug] Valid helpOptions: ${JSON.stringify(helpOptions)} for parser ${parserNameForLog}`);\n // }\n // ---- END ADDED DEBUG AND DEFENSIVE CHECK ----\n\n const helpRequested = processArgs.some((arg) =>\n helpOptions.includes(arg),\n );\n\n if (helpRequested) {\n await this.#_preloadDynamicFlagsForHelp(processArgs);\n console.log(identifiedFinalParser.helpText());\n return this._handleExit(0, \"Help displayed\", \"help\");\n }\n }\n\n return false;\n }\n\n #_validateMandatoryFlags(\n finalArgs: TParsedArgsWithRouting<any>,\n parserChain: ArgParserBase[],\n commandChain: string[],\n ): void {\n const finalMandatoryFlagsMissing: {\n name: string;\n parserName: string;\n commandChain: string[];\n }[] = [];\n const checkedFlagNames = new Set<string>();\n\n // For both MCP and regular subcommands, use the same inheritance-based validation logic\n // Validate all parsers except the root parser when it's not the final destination\n let parsersToValidate: ArgParserBase[] = [...parserChain];\n\n // If there are multiple parsers and the root parser is not the final destination,\n // remove the root parser from validation (unless its flags are inherited)\n if (parserChain.length > 1) {\n const immediateChild = parserChain[1];\n\n // If the immediate child doesn't inherit from root, don't validate root\n if (!immediateChild.#inheritParentFlags) {\n parsersToValidate = parsersToValidate.slice(1);\n }\n }\n\n for (let i = 0; i < parsersToValidate.length; i++) {\n const parser = parsersToValidate[i];\n const currentCommandChain = parser.getCommandChain();\n\n for (const flag of parser.#flagManager.flags) {\n // Use FlagManager\n if (flag[\"name\"] === \"help\" || checkedFlagNames.has(flag[\"name\"]))\n continue;\n\n // Check if this flag is inherited by the immediate child\n let flagIsInheritedByChild = false;\n\n if (i < parsersToValidate.length - 1) {\n const immediateChild = parsersToValidate[i + 1];\n\n // If the immediate child inherits parent flags AND has this flag,\n // then this flag is inherited and should be validated by the child\n if (\n immediateChild.#inheritParentFlags &&\n immediateChild.#flagManager.hasFlag(flag[\"name\"])\n ) {\n flagIsInheritedByChild = true;\n }\n }\n\n // Skip validation if this flag is inherited by a child (child will validate it)\n if (flagIsInheritedByChild) continue;\n\n const isMandatory =\n typeof flag[\"mandatory\"] === \"function\"\n ? flag[\"mandatory\"](finalArgs)\n : flag[\"mandatory\"];\n\n if (!isMandatory) continue;\n\n const value = finalArgs[flag[\"name\"] as keyof typeof finalArgs];\n let currentFlagIsMissing = false;\n\n if (flag[\"allowMultiple\"]) {\n // For allowMultiple, it's missing if undefined OR an empty array\n if (\n value === undefined ||\n (Array.isArray(value) && value.length === 0)\n ) {\n currentFlagIsMissing = true;\n }\n } else {\n // For non-allowMultiple, it's missing if undefined\n if (value === undefined) {\n currentFlagIsMissing = true;\n }\n }\n\n if (currentFlagIsMissing) {\n if (!checkedFlagNames.has(flag[\"name\"])) {\n finalMandatoryFlagsMissing.push({\n name: flag[\"name\"],\n parserName: parser.#subCommandName || parser.#appName,\n commandChain: currentCommandChain,\n });\n checkedFlagNames.add(flag[\"name\"]);\n }\n }\n }\n }\n\n if (finalMandatoryFlagsMissing.length > 0) {\n throw new ArgParserError(\n `Missing mandatory flags: ${finalMandatoryFlagsMissing\n .map((flag) => chalk.yellow(flag[\"name\"]))\n .join(\", \")}`,\n commandChain,\n );\n }\n }\n\n #_applyDefaultValues(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n // Use FlagManager\n const flagName = flag[\"name\"] as string;\n if (\n finalArgs[flagName] === undefined &&\n flag[\"defaultValue\"] !== undefined\n ) {\n if (flag[\"allowMultiple\"]) {\n finalArgs[flagName] = Array.isArray(flag[\"defaultValue\"])\n ? flag[\"defaultValue\"]\n : [flag[\"defaultValue\"]];\n } else {\n finalArgs[flagName] = flag[\"defaultValue\"];\n }\n }\n }\n }\n\n #_applyEnvFallback(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n const flagName = flag[\"name\"] as string;\n\n if (!flag[\"env\"]) continue;\n\n // Check if value is already set (by CLI).\n // If we move this call BEFORE defaults, then 'undefined' means truly \"not set by CLI\".\n if (finalArgs[flagName] !== undefined) {\n // If allowMultiple, we might append? Usually env var is just a fallback source.\n // If CLI provided check, we skip Env.\n continue;\n }\n\n const envVars = Array.isArray(flag[\"env\"]) ? flag[\"env\"] : [flag[\"env\"]];\n let foundVal: string | undefined;\n\n for (const envKey of envVars) {\n if (process.env[envKey] !== undefined) {\n foundVal = process.env[envKey];\n break; // First match wins\n }\n }\n\n if (foundVal !== undefined) {\n try {\n const typedVal = this.#configurationManager.convertValueToFlagType(\n foundVal,\n flag,\n );\n if (flag[\"allowMultiple\"]) {\n // If allowMultiple, convertValueToFlagType returns array or single.\n // We ensure it's set correctly.\n finalArgs[flagName] = Array.isArray(typedVal)\n ? typedVal\n : [typedVal];\n } else {\n finalArgs[flagName] = typedVal;\n }\n } catch (e) {\n console.warn(\n chalk.yellow(\n `Warning: Failed to parse env var for flag '${flagName}': ${e}`,\n ),\n );\n }\n }\n }\n }\n\n #_syncToEnv(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n if (!flag[\"env\"]) continue;\n\n const flagName = flag[\"name\"];\n const value = finalArgs[flagName];\n\n if (value !== undefined) {\n const envVars = Array.isArray(flag[\"env\"])\n ? flag[\"env\"]\n : [flag[\"env\"]];\n // Convert value to string for Env\n let strVal = \"\";\n if (typeof value === \"object\") {\n strVal = JSON.stringify(value);\n } else {\n strVal = String(value);\n }\n\n for (const envKey of envVars) {\n process.env[envKey] = strVal;\n }\n }\n }\n }\n\n #_prepareAndExecuteHandler(\n handlerToExecute: RecursiveParseResult[\"handlerToExecute\"],\n finalArgs: TParsedArgsWithRouting<any>,\n skipHandlers: boolean,\n ): void {\n // Skip handlers if explicitly requested, if no handler exists, or if in fuzzy mode\n if (skipHandlers || !handlerToExecute) {\n return;\n }\n\n // Log handler skipping in fuzzy mode for visibility\n if (this.#fuzzyMode) {\n const commandChain = handlerToExecute.context.commandChain || [];\n const args = handlerToExecute.context.args || {};\n\n // Try to get the original input arguments from the final args if available\n const inputArgs =\n (finalArgs as InternalParsedArgs)._originalInputArgs || \"unknown\";\n const inputArgsStr = Array.isArray(inputArgs)\n ? inputArgs.join(\" \")\n : inputArgs;\n\n console.log(\n `[--s-enable-fuzzy] handler() skipped for command chain: ${commandChain.join(\" \") || \"(root)\"}`,\n );\n console.log(` Input args: [${inputArgsStr}]`);\n console.log(` Parsed args: ${JSON.stringify(args)}`);\n return;\n }\n\n const finalParserWhoseHandlerWillRun = handlerToExecute.context.parser;\n const finalParserFlags = finalParserWhoseHandlerWillRun.flags;\n const handlerArgs = handlerToExecute.context.args;\n\n for (const flag of finalParserFlags) {\n const flagName = flag[\"name\"] as keyof typeof finalArgs;\n if (finalArgs.hasOwnProperty(flagName)) {\n (handlerArgs as any)[flagName] = finalArgs[flagName];\n } else if (\n flag[\"allowMultiple\"] &&\n !handlerArgs.hasOwnProperty(flagName)\n ) {\n (handlerArgs as any)[flagName] = [];\n }\n }\n handlerToExecute.context.args = handlerArgs;\n\n try {\n const handlerResult = handlerToExecute.handler(handlerToExecute.context);\n\n // Check if result is a Promise (async handler)\n if (handlerResult && typeof handlerResult.then === \"function\") {\n // Store async handler info for ArgParserWithMcp to handle\n (finalArgs as InternalParsedArgs)._asyncHandlerPromise = handlerResult;\n (finalArgs as InternalParsedArgs)._asyncHandlerInfo = handlerToExecute;\n\n // Add a catch handler to prevent unhandled rejection warnings\n // The actual error handling will be done in parseAsync()\n handlerResult.catch(() => {\n // Silently ignore - this will be handled properly in parseAsync()\n });\n\n return;\n }\n\n (finalArgs as InternalParsedArgs).handlerResponse = handlerResult;\n\n // Merge handler result into final args if it's an object\n if (\n handlerResult &&\n typeof handlerResult === \"object\" &&\n !Array.isArray(handlerResult)\n ) {\n Object.assign(finalArgs, handlerResult);\n }\n } catch (error) {\n // For synchronous handlers, we can handle sync errors\n if (this.#handleErrors) {\n this.#displayErrorAndExit(\n new ArgParserError(`Handler error: ${error}`, []),\n );\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Detects if the current script is being executed directly (not imported)\n * Uses a robust method that works across different environments and sandboxes\n * @param importMetaUrl The import.meta.url from the calling script (optional)\n * @returns true if the script is being executed directly, false if imported\n */\n private static isExecutedDirectly(importMetaUrl?: string): boolean {\n try {\n // Use import.meta.url if provided (most reliable for ES modules)\n if (importMetaUrl) {\n const currentFile = fileURLToPath(importMetaUrl);\n const executedFile = path.resolve(process.argv[1]);\n return currentFile === executedFile;\n }\n\n // Fallback\n if (typeof process !== \"undefined\" && process.argv && process.argv[1]) {\n // Conservative approach\n return false;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n async parse(\n processArgs?: string[],\n options?: IParseOptions,\n ): Promise<TParsedArgsWithRouting<any> | ParseResult> {\n debug.log(\"ArgParserBase.parse() called with args:\", processArgs);\n\n // Handle auto-execution: only run if script is executed directly (not imported)\n // Default to true unless explicitly disabled, but only when importMetaUrl is provided\n const shouldCheckAutoExecution =\n options?.importMetaUrl && options?.autoExecute !== false;\n if (shouldCheckAutoExecution) {\n const isDirectExecution = ArgParserBase.isExecutedDirectly(\n options.importMetaUrl,\n );\n if (!isDirectExecution) {\n // Script is being imported, not executed directly - return early without parsing\n debug.log(\n \"Auto-execution enabled but script is imported, skipping execution\",\n );\n return {} as TParsedArgsWithRouting<any>;\n }\n }\n\n // Handle automatic argument detection when no arguments provided\n if (processArgs === undefined) {\n // Check if we're in a Node.js environment\n if (\n typeof process !== \"undefined\" &&\n process.argv &&\n Array.isArray(process.argv)\n ) {\n processArgs = process.argv.slice(2);\n } else {\n // Not in Node.js environment, throw an error\n throw new Error(\n \"parse() called without arguments in non-Node.js environment. \" +\n \"Please provide arguments explicitly: parse(['--flag', 'value'])\",\n );\n }\n }\n\n // Reset dynamically registered flags before each parse to avoid accumulation\n this.#resetDynamicFlagsRecursive();\n\n // Store original args for fuzzy mode logging\n const originalProcessArgs = [...processArgs];\n\n // Check if fuzzy mode is enabled (global fuzzy mode detection)\n // This allows automatic prevention of parse() execution without requiring boilerplate\n // Prevent execution if:\n // 1. ARGPARSER_FUZZY_MODE environment variable is set (during fuzzy test imports)\n // 2. OR --s-enable-fuzzy is in process.argv but not in current processArgs (global fuzzy testing)\n // 3. AND skipHelpHandling is not true (not a programmatic call from fuzzy tester)\n const shouldPreventExecution =\n typeof process !== \"undefined\" &&\n (process.env[\"ARGPARSER_FUZZY_MODE\"] === \"true\" ||\n (process.argv &&\n process.argv.includes(\"--s-enable-fuzzy\") &&\n !processArgs.includes(\"--s-enable-fuzzy\"))) &&\n !options?.skipHelpHandling;\n\n if (shouldPreventExecution) {\n // Return a minimal result that indicates fuzzy mode prevented execution\n return {\n _fuzzyModePreventedExecution: true,\n _originalInputArgs: originalProcessArgs,\n } as TParsedArgsWithRouting<any>;\n }\n\n const globalCheckResult = await this.#_handleGlobalChecks(\n processArgs,\n options,\n );\n if (globalCheckResult !== false) {\n // If it's a ParseResult, return it; otherwise return empty object for backward compatibility\n return globalCheckResult === true\n ? ({} as TParsedArgsWithRouting<any>)\n : globalCheckResult;\n }\n\n try {\n const {\n finalParser: identifiedFinalParser,\n commandChain: identifiedCommandChain,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const saveToEnvResult = identifiedFinalParser.#_handleSaveToEnvFlag(\n processArgs,\n identifiedParserChain,\n );\n if (saveToEnvResult !== false) {\n return saveToEnvResult === true\n ? ({} as TParsedArgsWithRouting<any>)\n : saveToEnvResult;\n }\n\n const { finalArgs, handlerToExecute } = await this._parseRecursive(\n processArgs,\n this,\n {},\n [],\n options,\n undefined,\n );\n\n if (identifiedCommandChain.length > 0) {\n finalArgs.$commandChain = identifiedCommandChain;\n }\n\n // Store original args for fuzzy mode logging\n if (this.#fuzzyMode) {\n finalArgs._originalInputArgs = originalProcessArgs;\n }\n\n // Skip mandatory flag validation in fuzzy mode\n if (!this.#fuzzyMode) {\n this.#_validateMandatoryFlags(\n finalArgs,\n identifiedParserChain,\n identifiedCommandChain,\n );\n }\n\n this.#_applyDefaultValues(finalArgs, identifiedFinalParser);\n\n this.#_prepareAndExecuteHandler(\n handlerToExecute,\n finalArgs,\n options?.skipHandlers ?? false,\n );\n\n // Handle deep option for async handlers (default: true)\n const shouldAwaitHandlers = options?.deep !== false;\n if (shouldAwaitHandlers && finalArgs._asyncHandlerPromise) {\n try {\n const handlerResult = await finalArgs._asyncHandlerPromise;\n finalArgs.handlerResponse = handlerResult;\n\n // Merge handler result into final args if it's an object\n if (\n handlerResult &&\n typeof handlerResult === \"object\" &&\n !Array.isArray(handlerResult)\n ) {\n Object.assign(finalArgs, handlerResult);\n }\n\n // Clean up the async handler info since we've awaited it\n delete finalArgs._asyncHandlerPromise;\n delete finalArgs._asyncHandlerInfo;\n } catch (error) {\n // Handle async handler errors - respect the handleErrors setting\n if (this.#handleErrors) {\n this.#displayErrorAndExit(\n new ArgParserError(`Handler error: ${error}`, []),\n );\n } else {\n throw error;\n }\n }\n }\n\n return finalArgs;\n } catch (error) {\n if (error instanceof ArgParserError) {\n if (this.#handleErrors) {\n const errorResult = this.#displayErrorAndExit(error);\n // If autoExit is false, return the ParseResult; otherwise return empty object\n return this.#autoExit\n ? ({} as TParsedArgsWithRouting<any>)\n : errorResult;\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Alias for parse() method for backward compatibility\n * Since parse() is already async, this just calls parse()\n *\n * @deprecated Use parse() instead. This method will be removed in a future version.\n */\n public parseAsync(\n processArgs?: string[],\n options?: IParseOptions,\n ): Promise<TParsedArgsWithRouting<any> | ParseResult> {\n return this.parse(processArgs, options);\n }\n\n /**\n * Recursive helper for parsing arguments and handling sub-commands.\n * This method assumes the global help check has already been performed in `parse`.\n */\n private async _parseRecursive(\n argsToParse: string[],\n currentParser: ArgParserBase,\n accumulatedParentArgs: TParsedArgs<any>,\n commandChainSoFar: string[],\n options?: IParseOptions,\n parentParser?: ArgParserBase,\n ): Promise<RecursiveParseResult> {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n // Find the index of the first argument that matches a defined sub-command name\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n // Determine which arguments belong to the current parser level\n const argsForCurrentLevel =\n subCommandIndex === -1\n ? argsToParse\n : argsToParse.slice(0, subCommandIndex);\n\n // Parse flags for the current level using #parseFlags\n const { parsedArgs: currentLevelArgs, firstUnconsumedIndex } =\n await currentParser.#parseFlags(argsForCurrentLevel, options);\n\n // Apply environment variables fallback\n // Priority: CLI Flag > Env Var > Default Value\n // This runs after CLI flags are parsed (so CLI wins if present)\n // But BEFORE default values (so Env wins over Default)\n this.#_applyEnvFallback(currentLevelArgs, currentParser);\n\n // Apply default values for the current parser's flags to its args\n currentParser.#_applyDefaultValues(currentLevelArgs, currentParser);\n\n // Sync resolved values back to environment variables if configured\n this.#_syncToEnv(currentLevelArgs, currentParser);\n\n const combinedArgsFromThisAndParents = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n if (subCommandIndex === -1 || subCommandName === null) {\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const finalParseResultArgs = { ...combinedArgsFromThisAndParents };\n if (commandChainSoFar.length > 0) {\n finalParseResultArgs[\"$commandChain\"] = commandChainSoFar;\n }\n\n let handlerToExecute: RecursiveParseResult[\"handlerToExecute\"] =\n undefined;\n // Create context with displayHelp implementation\n const handlerContext: IHandlerContext<any, any> = {\n args: currentLevelArgs,\n parentArgs: accumulatedParentArgs,\n commandChain: commandChainSoFar,\n parser: currentParser,\n parentParser: parentParser,\n // displayHelp implementation that respects autoExit setting\n displayHelp: () => {\n // Use console.log directly for help text (this is user-facing output, not logging)\n console.log(currentParser.helpText());\n if (\n currentParser.getAutoExit() &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(0);\n }\n },\n\n // Add rootPath if working directory was resolved\n rootPath: this.#rootPath || undefined,\n logger: this.#logger,\n isMcp: options?.isMcp || false,\n };\n\n if (currentParser.#handler) {\n handlerToExecute = {\n handler: currentParser.#handler,\n context: handlerContext,\n };\n } else if (currentParser.#triggerAutoHelpIfNoHandler) {\n // Automatically provide a handler that displays help if configured\n handlerToExecute = {\n handler: (ctx: IHandlerContext) => ctx.displayHelp(),\n context: handlerContext,\n };\n }\n return { finalArgs: finalParseResultArgs, handlerToExecute };\n }\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName!);\n if (\n !subCommandConfig ||\n !(subCommandConfig.parser instanceof ArgParserBase)\n ) {\n // This should ideally not be reached if addSubCommand validated the parser instance\n throw new ArgParserError(\n `Internal error: Subcommand '${subCommandName!}' is misconfigured or its parser is not a valid ArgParser instance.`,\n commandChainSoFar,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const combinedArgsForNextLevel = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n return await this._parseRecursive(\n nextArgs,\n nextParser,\n combinedArgsForNextLevel,\n nextCommandChain,\n options,\n currentParser,\n );\n }\n\n async #parseFlags(\n args: string[],\n options?: IParseOptions,\n ): Promise<{\n parsedArgs: TParsedArgs<ProcessedFlag[]>;\n firstUnconsumedIndex: number;\n }> {\n let flags = this.#flagManager.flags;\n\n // Dynamic pre-pass: run loaders first to register new flags\n const dynamicCandidates = flags.filter(\n (f: any) => typeof (f as any)[\"dynamicRegister\"] === \"function\",\n );\n if (dynamicCandidates.length > 0) {\n const loaderOutput: TParsedArgs<ProcessedFlag[]> = Object.fromEntries(\n dynamicCandidates.map((f) => [\n f[\"name\"],\n f[\"allowMultiple\"] ? [] : undefined,\n ]),\n ) as TParsedArgs<ProcessedFlag[]>;\n const tmpConsumed = new Set<number>();\n\n // Ligature pre-pass\n for (const flagToCheck of dynamicCandidates) {\n if (flagToCheck[\"allowLigature\"] && !flagToCheck[\"flagOnly\"]) {\n const regex = createRegExp(\n anyOf(\n ...flagToCheck[\"options\"].map((option: string) => `${option}=`),\n ),\n oneOrMore(char).groupedAs(\"arg\"),\n );\n for (let i = 0; i < args.length; i++) {\n if (tmpConsumed.has(i)) continue;\n const matches = regex.exec(`${args[i]}`);\n if (matches?.groups?.[\"arg\"]) {\n await this._addToOutput(\n flagToCheck,\n matches.groups[\"arg\"],\n loaderOutput,\n options,\n );\n tmpConsumed.add(i);\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n }\n\n // Split pre-pass\n for (const flagToCheck of dynamicCandidates) {\n for (let index = 0; index < args.length; index++) {\n if (tmpConsumed.has(index)) continue;\n const value = args[index];\n const nextIndex = index + 1;\n const nextValueExists = nextIndex < args.length;\n const nextValue = nextValueExists ? args[nextIndex] : undefined;\n const nextValueIsFlag =\n typeof nextValue === \"string\" && nextValue.startsWith(\"-\");\n if (flagToCheck[\"options\"].includes(value)) {\n tmpConsumed.add(index);\n if (flagToCheck[\"flagOnly\"]) {\n await this._addToOutput(flagToCheck, true, loaderOutput, options);\n } else if (nextValueExists && !nextValueIsFlag) {\n await this._addToOutput(\n flagToCheck,\n nextValue,\n loaderOutput,\n options,\n );\n tmpConsumed.add(nextIndex);\n } else if (flagToCheck[\"type\"] === Boolean) {\n await this._addToOutput(flagToCheck, true, loaderOutput, options);\n }\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n\n // Invoke dynamicRegister per candidate\n for (const flagToCheck of dynamicCandidates) {\n const val = (loaderOutput as any)[flagToCheck[\"name\"]];\n const hasValue = flagToCheck[\"allowMultiple\"]\n ? Array.isArray(val) && val.length > 0\n : val !== undefined;\n if (!hasValue) continue;\n\n const registerFlags = (newFlags: readonly IFlag[]) => {\n if (Array.isArray(newFlags) && newFlags.length) {\n this.#registerDynamicFlags(newFlags);\n }\n };\n\n const dyn = (flagToCheck as any)[\"dynamicRegister\"];\n if (typeof dyn === \"function\") {\n const maybe = dyn({\n value: val,\n argsSoFar: loaderOutput,\n parser: this,\n processArgs: args,\n forHelp: !!options?.dynamicHelpPreload,\n registerFlags,\n });\n const awaited =\n maybe && typeof (maybe as any).then === \"function\"\n ? await maybe\n : maybe;\n if (Array.isArray(awaited)) registerFlags(awaited);\n }\n }\n\n // Refresh flags after dynamic registration\n flags = this.#flagManager.flags;\n }\n\n const output: TParsedArgs<ProcessedFlag[]> = Object.fromEntries(\n flags.map((flag) => [\n flag[\"name\"],\n flag[\"allowMultiple\"] ? [] : undefined,\n ]),\n ) as TParsedArgs<ProcessedFlag[]>;\n\n let consumedIndices = new Set<number>();\n\n for (const flagToCheck of flags) {\n if (flagToCheck[\"allowLigature\"] && !flagToCheck[\"flagOnly\"]) {\n const regex = createRegExp(\n anyOf(\n ...flagToCheck[\"options\"].map((option: string) => `${option}=`),\n ),\n oneOrMore(char).groupedAs(\"arg\"),\n );\n for (let i = 0; i < args.length; i++) {\n if (consumedIndices.has(i)) continue;\n const itemToCheck = args[i];\n const matches = regex.exec(`${itemToCheck}`);\n if (matches?.groups?.[\"arg\"]) {\n await this._addToOutput(\n flagToCheck,\n matches?.groups?.[\"arg\"],\n output,\n options,\n );\n consumedIndices.add(i);\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n }\n\n for (const flagToCheck of flags) {\n for (let index = 0; index < args.length; index++) {\n if (consumedIndices.has(index)) continue;\n\n const value = args[index];\n const nextIndex = index + 1;\n const nextValueExists = nextIndex < args.length;\n const nextValue = nextValueExists ? args[nextIndex] : undefined;\n const nextValueIsFlag =\n typeof nextValue === \"string\" && nextValue.startsWith(\"-\");\n\n if (flagToCheck[\"options\"].includes(value)) {\n // Mark the flag itself as consumed immediately\n consumedIndices.add(index);\n\n if (flagToCheck[\"flagOnly\"]) {\n await this._addToOutput(flagToCheck, true, output, options);\n } else if (nextValueExists && !nextValueIsFlag) {\n await this._addToOutput(flagToCheck, nextValue, output, options);\n consumedIndices.add(nextIndex);\n } else if (flagToCheck[\"type\"] === Boolean) {\n await this._addToOutput(flagToCheck, true, output, options);\n }\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n\n // === POSITIONAL ARGUMENT ASSIGNMENT ===\n // Collect unconsumed trailing args (not starting with \"-\")\n const trailingArgs: { index: number; value: string }[] = [];\n for (let i = 0; i < args.length; i++) {\n if (!consumedIndices.has(i)) {\n const arg = args[i];\n // Only capture non-flag values as positional\n if (!arg.startsWith(\"-\")) {\n trailingArgs.push({ index: i, value: arg });\n }\n }\n }\n\n // Get flags with positional property, sorted by positional index\n const positionalFlags = flags\n .filter(\n (f: ProcessedFlag) =>\n typeof f[\"positional\"] === \"number\" && f[\"positional\"] > 0,\n )\n .sort(\n (a: ProcessedFlag, b: ProcessedFlag) =>\n (a[\"positional\"] as number) - (b[\"positional\"] as number),\n );\n\n // Assign trailing args to positional flags\n for (const posFlag of positionalFlags) {\n const posIndex = (posFlag[\"positional\"] as number) - 1; // 0-indexed\n\n // Skip if this flag already has a value (from --flag syntax)\n const existingValue = (output as any)[posFlag[\"name\"]];\n const hasExistingValue = posFlag[\"allowMultiple\"]\n ? Array.isArray(existingValue) && existingValue.length > 0\n : existingValue !== undefined;\n\n if (hasExistingValue) continue;\n\n // Assign the trailing arg at this position\n if (posIndex < trailingArgs.length) {\n const trailing = trailingArgs[posIndex];\n await this._addToOutput(posFlag, trailing.value, output, options);\n consumedIndices.add(trailing.index);\n }\n }\n\n // Calculate firstUnconsumedIndex (after positional assignment)\n let firstUnconsumedIndex = args.length;\n for (let i = 0; i < args.length; i++) {\n if (!consumedIndices.has(i)) {\n firstUnconsumedIndex = i;\n break;\n }\n }\n\n return { parsedArgs: output, firstUnconsumedIndex };\n }\n\n helpText(): string {\n const cyan = chalk.cyan;\n const green = chalk.green;\n const white = chalk.white;\n const red = chalk.red;\n const dim = chalk.dim;\n\n let rootAppName = this.#appName;\n let current: ArgParserBase | undefined = this;\n while (current.#parentParser) {\n current = current.#parentParser;\n }\n if (current) {\n rootAppName = current.#appName;\n }\n\n const helpTitle = this.#subCommandName\n ? `${rootAppName} ${this.#subCommandName}`\n : rootAppName;\n\n let help = `${cyan(`${helpTitle} Help`)} (${this.#parameters.mandatoryCharacter} = Mandatory fields):\\n\\n`;\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG ----\n // console.log(\n // `[ArgParser helpText Debug] 'this' context: constructor.name = ${this?.constructor?.name}, is ArgParser instance = ${this instanceof ArgParser}, subCommandName = ${this.#subCommandName || '(root)'}`,\n // );\n // ---- END ADDED DIAGNOSTIC LOG ----\n\n if (this.#description) {\n help += `${white(this.#description)}\\n\\n`;\n }\n\n const indent = (level: number = 1) => \" \".repeat(level);\n\n // Build usage pattern with positional args\n const positionalFlagsForUsage = this.#flagManager.flags\n .filter(\n (f: ProcessedFlag) =>\n typeof f[\"positional\"] === \"number\" && f[\"positional\"] > 0,\n )\n .sort(\n (a: ProcessedFlag, b: ProcessedFlag) =>\n (a[\"positional\"] as number) - (b[\"positional\"] as number),\n );\n\n if (positionalFlagsForUsage.length > 0) {\n const commandName =\n this.#subCommandName || this.#appCommandName || this.#appName;\n const posArgs = positionalFlagsForUsage\n .map((f: ProcessedFlag) => {\n const isMandatory =\n typeof f[\"mandatory\"] === \"function\" ? true : f[\"mandatory\"];\n const argName = (f as any)[\"valueHint\"] || f[\"name\"].toUpperCase();\n return isMandatory ? `<${argName}>` : `[${argName}]`;\n })\n .join(\" \");\n\n help += `${cyan(\"Usage:\")} ${commandName} [OPTIONS] ${posArgs}\\n\\n`;\n }\n\n if (this.#subCommands.size > 0) {\n // Use Map.size\n help += `${cyan(\"Available sub-commands:\")}\\n`;\n // Iterate over Map entries, then sort\n help += Array.from(this.#subCommands.entries())\n .sort(([nameA], [nameB]) => nameA.localeCompare(nameB))\n .map(([name, subCommandConfig]) => {\n // subCommandConfig is an ISubCommand object from the map\n const actualSubParserInstance = subCommandConfig.parser;\n\n // Guard against misconfiguration, though addSubCommand should prevent non-ArgParser instances\n if (!(actualSubParserInstance instanceof ArgParserBase)) {\n return `${indent()}${green(name.padEnd(20))} [Error: Subcommand '${name}' has an invalid parser configuration]`;\n }\n\n // Build sub-command help with description on its own line for better visibility\n let subHelp = `${indent()}${green(name)}`;\n\n // Show description on a dedicated line if present\n const subDescription = actualSubParserInstance.#description;\n if (subDescription) {\n subHelp += `\\n${indent(2)}${white(subDescription)}`;\n }\n\n const flagsFromSubManager =\n actualSubParserInstance && actualSubParserInstance.#flagManager\n ? actualSubParserInstance.#flagManager.flags\n : undefined;\n const subFlags = (flagsFromSubManager || []).filter(\n (f: ProcessedFlag) => f[\"name\"] !== \"help\",\n );\n if (subFlags.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")}`;\n subFlags\n .sort((a: ProcessedFlag, b: ProcessedFlag) =>\n a[\"name\"].localeCompare(b[\"name\"]),\n )\n .forEach((f: ProcessedFlag) => {\n const flagOptions = f[\"options\"]\n .map((opt: string) => green(opt))\n .join(\", \");\n const flagDesc = Array.isArray(f[\"description\"])\n ? f[\"description\"][0]\n : f[\"description\"];\n subHelp += `\\n${indent(3)}${flagOptions} - ${dim(flagDesc)}`;\n });\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")} none`;\n }\n\n const subSubCommandNames = Array.from(\n actualSubParserInstance.#subCommands.keys(),\n ); // Get keys from actualSubParserInstance's Map\n if (subSubCommandNames.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} ${subSubCommandNames.join(\", \")}`;\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} none`;\n }\n\n return subHelp;\n })\n .join(\"\\n\\n\");\n help += \"\\n\";\n }\n\n help += `\\n${cyan(\"Flags:\")}\\n`;\n const localFlags = this.#flagManager.flags; // Use FlagManager for local flags\n if (localFlags.length > 0) {\n help += localFlags\n .sort((flagA, flagB) => flagA[\"name\"].localeCompare(flagB[\"name\"]))\n .map((flag: ProcessedFlag) => {\n // Flag type is ProcessedFlag\n const optionsText = flag[\"options\"]\n .slice() // Create a copy before sorting (toSorted only supported by Node 20+)\n .sort((a: string, b: string) => a.length - b.length) // Sort by length (shortest first)\n .map((opt: string) => green(opt))\n .join(\", \");\n const isMandatory =\n typeof flag.mandatory === \"function\" ? \"dynamic\" : flag.mandatory;\n const mandatoryIndicator =\n isMandatory === true\n ? ` ${red(this.#parameters.mandatoryCharacter || \"*\")}`\n : isMandatory === \"dynamic\"\n ? ` ${dim(\"(conditionally mandatory)\")}`\n : \"\";\n\n const descriptionLines = Array.isArray(flag[\"description\"])\n ? flag[\"description\"]\n : [flag[\"description\"]];\n\n const metaLines: string[] = [];\n\n // Determine the type name for display\n let typeName = \"unknown\";\n let typeDetails: string[] = [];\n\n if (\n flag[\"type\"] &&\n typeof flag[\"type\"] === \"object\" &&\n (flag[\"type\"] as ZodTypeAny)._def\n ) {\n // It's a Zod schema - show JSON object with structure\n typeName = \"JSON object\";\n try {\n // Try to generate a simple structure preview\n const zodSchema = flag[\"type\"] as ZodTypeAny;\n const def = zodSchema._def as any;\n\n // In Zod v4, check for object shape directly (typeName might be undefined)\n if (def.shape) {\n const shape =\n typeof def.shape === \"function\" ? def.shape() : def.shape;\n const properties = Object.keys(shape);\n if (properties.length > 0) {\n if (properties.length <= 4) {\n typeDetails.push(`Properties: ${properties.join(\", \")}`);\n } else {\n typeDetails.push(\n `Properties: ${properties.slice(0, 4).join(\", \")}, ... (${properties.length} total)`,\n );\n }\n }\n }\n\n // Add a hint about JSON format\n typeDetails.push(\"Expected: JSON string\");\n } catch (error) {\n // Fallback if schema introspection fails\n typeDetails.push(\"Expected: JSON string\");\n }\n } else if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n // Make the type names more user-friendly\n if (typeName === \"Boolean\") typeName = \"boolean\";\n if (typeName === \"String\") typeName = \"string\";\n if (typeName === \"Number\") typeName = \"number\";\n if (typeName === \"Array\") typeName = \"array\";\n if (typeName === \"Object\") typeName = \"object\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n }\n\n metaLines.push(`Type: ${typeName}`);\n\n // Usage/example hints. If repeatable, show repeat syntax; otherwise show single value.\n {\n let isRepeatable = false;\n try {\n if (\n typeof flag[\"type\"] === \"function\" &&\n flag[\"type\"].name === \"Array\"\n ) {\n isRepeatable = true;\n }\n const maybeZodSchema = flag[\"type\"] as ZodTypeAny;\n if (\n maybeZodSchema &&\n typeof maybeZodSchema === \"object\" &&\n maybeZodSchema._def &&\n (maybeZodSchema._def as any).typeName === \"ZodArray\"\n ) {\n isRepeatable = true;\n }\n if (flag[\"allowMultiple\"]) isRepeatable = true;\n } catch {}\n\n const primaryOpt =\n flag[\"options\"].find((o: string) => o.startsWith(\"--\")) ??\n flag[\"options\"][0];\n const valueHint = (flag as any)[\"valueHint\"] as string | undefined;\n\n if (!flag[\"flagOnly\"]) {\n if (isRepeatable) {\n metaLines.push(\"Multiple values allowed (repeat flag)\");\n const v1 = valueHint ?? \"value1\";\n const v2 = valueHint ?? \"value2\";\n metaLines.push(\n `Example: ${primaryOpt} ${v1} ${primaryOpt} ${v2}`,\n );\n } else {\n const v = valueHint ?? \"value\";\n metaLines.push(`Example: ${primaryOpt} ${v}`);\n }\n }\n }\n\n // Add type details for Zod schemas\n if (typeDetails.length > 0) {\n metaLines.push(...typeDetails);\n }\n\n if (flag[\"flagOnly\"]) {\n metaLines.push(\"Flag only (no value expected)\");\n }\n if (\n flag[\"defaultValue\"] !== undefined &&\n flag[\"defaultValue\"] !== null\n ) {\n metaLines.push(`Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n metaLines.push(\n `Allowed values: ${flag[\"enum\"].map((v: any) => `'${v}'`).join(\", \")}`,\n );\n }\n // Add positional indicator\n if (\n typeof flag[\"positional\"] === \"number\" &&\n flag[\"positional\"] > 0\n ) {\n metaLines.push(`Positional argument #${flag[\"positional\"]}`);\n }\n\n const maxOptionLength = Math.max(\n ...localFlags.map(\n (f: ProcessedFlag) => f[\"options\"].join(\", \").length,\n ),\n 0,\n );\n const formattedOptions =\n optionsText.padEnd(maxOptionLength + 5) + mandatoryIndicator;\n\n return `\n${indent()}${formattedOptions}\n${indent(2)}${white(descriptionLines[0])}\n${metaLines.map((line) => `${indent(3)}${dim(line)}`).join(\"\\n\")}\n${descriptionLines\n .slice(1)\n .map((line) => `\\n${indent(2)}${white(line)}`)\n .join(\"\")}\n `.trim();\n })\n .join(\"\\n\\n\");\n } else {\n help += `${indent()}${dim(\"none\")}`;\n }\n\n return help;\n }\n\n public getSubCommand(name: string): ISubCommand | undefined {\n return this.#subCommands.get(name);\n }\n\n public hasFlag(name: string): boolean {\n // Delegates to FlagManager\n return this.#flagManager.hasFlag(name);\n }\n\n /**\n * Get flag definition by name\n * @param name Flag name\n * @returns Flag definition or undefined if not found\n */\n public getFlagDefinition(name: string): ProcessedFlag | undefined {\n return this.#flagManager.getFlag(name);\n }\n\n public getCommandChain(): string[] {\n const chain = [];\n let currentParser: ArgParserBase | undefined = this;\n while (currentParser && currentParser.#parentParser) {\n chain.unshift(currentParser.#subCommandName);\n currentParser = currentParser.#parentParser;\n }\n return chain;\n }\n\n public getLastParseResult(): TParsedArgs<ProcessedFlag[]> {\n return this.#lastParseResult;\n }\n\n /**\n * Enables fuzzy testing mode by disabling error handling and making flags optional\n */\n #_enableFuzzyMode(): void {\n // Enable fuzzy mode flag\n this.#fuzzyMode = true;\n\n // Disable error handling to allow fuzzy tester to catch errors\n this.#handleErrors = false;\n\n // Recursively enable fuzzy mode for all subcommand parsers\n for (const [, subCommand] of this.#subCommands) {\n if (subCommand.parser instanceof ArgParserBase) {\n subCommand.parser.#_enableFuzzyMode();\n }\n }\n }\n\n #displayErrorAndExit(error: ArgParserError): ParseResult | never {\n let commandNameToSuggest = \"your-script\";\n\n if (this.#appCommandName) {\n commandNameToSuggest = this.#appCommandName;\n } else if (this.#appName && this.#appName !== \"Argument Parser\") {\n commandNameToSuggest = this.#appName;\n } else if (\n typeof process !== \"undefined\" &&\n process.argv &&\n process.argv[1]\n ) {\n try {\n commandNameToSuggest = path.basename(process.argv[1]);\n } catch {}\n }\n\n this.#logger.error(`\\n${chalk.red.bold(\"Error:\")} ${error.message}`);\n this.#logger.error(\n `\\n${chalk.dim(`Try '${commandNameToSuggest} --help' for usage details.`)}`,\n );\n\n if (this.#autoExit) {\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1 as never);\n } else {\n throw error;\n }\n } else {\n return {\n success: false,\n exitCode: 1,\n message: error.message,\n type: \"error\",\n shouldExit: true,\n };\n }\n }\n\n #_printRecursiveToConsole(\n parser: ArgParserBase,\n level: number,\n visited: Set<ArgParserBase> = new Set(),\n ): void {\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n this.#logger.info(\n `${indent}Parser: ${chalk.blueBright(parser.#subCommandName || parser.#appName)}`,\n );\n if (parser.#description) {\n this.#logger.info(`${subIndent}Description: ${parser.#description}`);\n }\n this.#logger.info(`${subIndent}Options:`);\n this.#logger.info(`${flagIndent}appName: ${parser.#appName}`);\n this.#logger.info(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? chalk.dim(\"undefined\")}`,\n );\n this.#logger.info(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n this.#logger.info(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n this.#logger.info(\n `${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`,\n );\n this.#logger.info(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n this.#logger.info(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n this.#logger.info(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n this.#logger.info(`${flagIndent}* ${chalk.green(flag[\"name\"])}:`);\n this.#logger.info(\n `${flagIndent} Options: ${flag[\"options\"].join(\", \")}`,\n );\n this.#logger.info(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Type: ${typeof flag[\"type\"] === \"function\" ? flag[\"type\"].name || \"custom function\" : flag[\"type\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n this.#logger.info(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n this.#logger.info(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n this.#logger.info(\n `${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`,\n );\n this.#logger.info(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n this.#logger.info(\n `${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`,\n );\n });\n } else {\n this.#logger.info(`${subIndent}Flags: ${chalk.dim(\"none\")}`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n this.#logger.info(\n `${subIndent}Sub-Commands (${subCommandParsers.length}):`,\n );\n subCommandParsers.forEach((subCommand: any) => {\n this.#_printRecursiveToConsole(subCommand.parser, level + 1, visited);\n });\n } else {\n this.#logger.info(`${subIndent}Sub-Commands: ${chalk.dim(\"none\")}`);\n }\n }\n\n #_buildRecursiveString(\n parser: ArgParserBase,\n level: number,\n visited = new Set<ArgParserBase>(),\n ): string {\n // Add visited set\n if (visited.has(parser)) return \"\"; // Prevent infinite loops for circular structures (if ever possible)\n visited.add(parser);\n\n let output = \"\";\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n const addLine = (line: string) => {\n output += line + \"\\\\n\";\n };\n\n addLine(\n `${indent}Parser: ${parser.#subCommandName || parser.#appName}`, // #appName is guaranteed\n );\n if (parser.#description) {\n addLine(`${subIndent}Description: ${parser.#description}`);\n }\n addLine(`${subIndent}Options:`);\n addLine(`${flagIndent}appName: ${parser.#appName}`);\n addLine(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? \"undefined\"}`,\n );\n addLine(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n addLine(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n addLine(`${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`);\n addLine(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n addLine(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n addLine(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n addLine(`${flagIndent}* ${flag[\"name\"]}:`);\n addLine(`${flagIndent} Options: ${flag[\"options\"].join(\", \")}`);\n addLine(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n let typeName = \"unknown\";\n if (\n flag[\"type\"] &&\n typeof flag[\"type\"] === \"object\" &&\n (flag[\"type\"] as any)._def\n ) {\n typeName = \"Zod schema\";\n } else if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n addLine(`${flagIndent} Type: ${typeName}`);\n addLine(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n addLine(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n addLine(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n addLine(`${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`);\n addLine(`${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`);\n addLine(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n addLine(`${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`);\n });\n } else {\n addLine(`${subIndent}Flags: none`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n addLine(`${subIndent}Sub-Commands (${subCommandParsers.length}):`);\n subCommandParsers.forEach((subCommand: any) => {\n output += this.#_buildRecursiveString(\n subCommand.parser,\n level + 1,\n visited,\n );\n });\n } else {\n addLine(`${subIndent}Sub-Commands: none`);\n }\n return output;\n }\n\n #_buildRecursiveJson(\n parser: ArgParserBase,\n visited = new Set<ArgParserBase>(),\n ): object {\n if (visited.has(parser))\n return {\n note: `Reference to already processed parser: ${parser.#subCommandName || parser.#appName}`,\n };\n visited.add(parser);\n\n const config: any = {\n parserName: parser.#subCommandName || parser.#appName, // #appName is guaranteed\n description: parser.#description,\n options: {\n appName: parser.#appName,\n appCommandName: parser.#appCommandName ?? undefined,\n handleErrors: parser.#handleErrors,\n throwForDuplicateFlags: parser.#throwForDuplicateFlags,\n inheritParentFlags: parser.#inheritParentFlags,\n },\n handlerDefined: !!parser.#handler,\n internalParams: parser.#parameters,\n flags: [],\n subCommands: {}, // Will be an object where keys are sub-command names\n };\n\n const flags = parser.#flagManager.flags;\n config.flags = flags.map((flag: ProcessedFlag) => {\n let typeName = \"unknown\";\n if (\n flag[\"type\"] &&\n typeof flag[\"type\"] === \"object\" &&\n (flag[\"type\"] as any)._def\n ) {\n typeName = \"Zod schema\";\n } else if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n\n return {\n name: flag[\"name\"],\n options: flag[\"options\"],\n description: flag[\"description\"],\n type: typeName,\n mandatory:\n typeof flag[\"mandatory\"] === \"function\"\n ? \"dynamic\"\n : (flag[\"mandatory\"] ?? false),\n defaultValue: flag[\"defaultValue\"],\n flagOnly: flag[\"flagOnly\"],\n allowMultiple: flag[\"allowMultiple\"],\n allowLigature: flag[\"allowLigature\"],\n enum: flag[\"enum\"],\n validatorDefined: !!flag[\"validate\"],\n };\n });\n\n const subCommands = Array.from(parser.#subCommands.values());\n if (subCommands.length > 0) {\n subCommands.forEach((sub: any) => {\n config.subCommands[sub.name] = this.#_buildRecursiveJson(\n sub.parser,\n visited,\n );\n });\n }\n\n return config;\n }\n\n // ===== MCP API Methods =====\n\n /**\n * Add an MCP resource to this parser\n */\n addMcpResource(config: McpResourceConfig): this {\n this.#mcpResourcesManager.addResource(config);\n this.#mcpNotificationsManager.notifyChange(\n \"resources\",\n \"added\",\n config.name,\n );\n return this;\n }\n\n /**\n * Remove an MCP resource by name\n */\n removeMcpResource(name: string): this {\n const removed = this.#mcpResourcesManager.removeResource(name);\n if (removed) {\n this.#mcpNotificationsManager.notifyChange(\"resources\", \"removed\", name);\n }\n return this;\n }\n\n /**\n * Get all registered MCP resources\n */\n getMcpResources(): McpResourceConfig[] {\n return this.#mcpResourcesManager.getResources();\n }\n\n /**\n * Add an MCP prompt to this parser\n */\n addMcpPrompt(config: McpPromptConfig): this {\n this.#mcpPromptsManager.addPrompt(config);\n this.#mcpNotificationsManager.notifyChange(\"prompts\", \"added\", config.name);\n return this;\n }\n\n /**\n * Remove an MCP prompt by name\n */\n removeMcpPrompt(name: string): this {\n const removed = this.#mcpPromptsManager.removePrompt(name);\n if (removed) {\n this.#mcpNotificationsManager.notifyChange(\"prompts\", \"removed\", name);\n }\n return this;\n }\n\n /**\n * Get all registered MCP prompts\n */\n getMcpPrompts(): McpPromptConfig[] {\n return this.#mcpPromptsManager.getPrompts();\n }\n\n /**\n * Add a change listener for MCP entities\n */\n onMcpChange(\n listener: (event: {\n type: McpChangeType;\n action: string;\n entityName?: string;\n }) => void,\n ): this {\n this.#mcpNotificationsManager.addGlobalListener(listener);\n return this;\n }\n\n /**\n * Remove a change listener for MCP entities\n */\n offMcpChange(\n listener: (event: {\n type: McpChangeType;\n action: string;\n entityName?: string;\n }) => void,\n ): this {\n this.#mcpNotificationsManager.removeGlobalListener(listener);\n return this;\n }\n\n /**\n * Get the MCP notifications manager (for advanced usage)\n */\n getMcpNotificationsManager(): McpNotificationsManager {\n return this.#mcpNotificationsManager;\n }\n\n /**\n * Get the MCP resources manager (for advanced usage)\n */\n getMcpResourcesManager(): McpResourcesManager {\n return this.#mcpResourcesManager;\n }\n\n /**\n * Get the MCP prompts manager (for advanced usage)\n */\n getMcpPromptsManager(): McpPromptsManager {\n return this.#mcpPromptsManager;\n }\n\n /**\n * Handles the --s-save-to-env system flag at the final parser level\n */\n #_handleSaveToEnvFlag(\n processArgs: string[],\n parserChain: ArgParserBase[],\n ): boolean | ParseResult {\n try {\n const result = this.#configurationManager.handleSaveToEnvFlag(\n processArgs,\n parserChain,\n );\n if (result) {\n // Configuration was saved successfully\n return this._handleExit(\n 0,\n \"Configuration saved successfully\",\n \"success\",\n );\n }\n return result;\n } catch (error) {\n // Configuration save failed\n return this._handleExit(\n 1,\n error instanceof Error ? error.message : String(error),\n \"error\",\n );\n }\n }\n\n /**\n * Handles the --s-build-dxt system flag to generate DXT packages for MCP servers\n */\n async #_handleBuildDxtFlag(\n processArgs: string[],\n buildDxtIndex: number,\n ): Promise<boolean | ParseResult> {\n return await this.#dxtGenerator.handleBuildDxtFlag(\n processArgs,\n buildDxtIndex,\n );\n }\n\n /**\n * Handles the --s-mcp-serve system flag to start all MCP servers\n */\n async #_handleMcpServeFlag(\n processArgs: string[],\n _mcpServeIndex: number,\n ): Promise<boolean | ParseResult> {\n debug.log(\"#_handleMcpServeFlag started\");\n // Parse transport options from command line arguments first to get log path\n const transportOptions = this.#_parseMcpTransportOptions(processArgs);\n debug.log(\"Transport options parsed:\", JSON.stringify(transportOptions));\n\n // Get MCP server configuration early to access programmatic logPath\n const mcpServerConfig = this.#_getMcpServerConfiguration();\n debug.log(\"Got MCP server config:\", JSON.stringify(mcpServerConfig));\n\n // Determine log path: CLI flag > log.logToFile > logPath > default\n const effectiveLogPath =\n transportOptions.logPath ||\n (mcpServerConfig?.log && typeof mcpServerConfig.log === \"object\"\n ? mcpServerConfig.log.logToFile\n : null) ||\n mcpServerConfig?.logPath ||\n \"./logs/mcp.log\";\n debug.log(\"Effective log path:\", effectiveLogPath);\n const resolvedLogPath = resolveLogPath(effectiveLogPath);\n debug.log(\"Resolved log path:\", resolvedLogPath);\n\n // Setup MCP logger with console hijacking\n let mcpLogger: any;\n debug.log(\"About to import simple-mcp-logger\");\n try {\n // Try to import simple-mcp-logger if available\n const mcpLoggerModule = await import(\"@alcyone-labs/simple-mcp-logger\");\n debug.log(\"Successfully imported simple-mcp-logger\");\n\n // Resolve logger configuration from MCP server config\n const loggerConfig = this.#_resolveLoggerConfigForServe(\n mcpServerConfig,\n resolvedLogPath,\n );\n\n if (typeof loggerConfig === \"string\") {\n mcpLogger = mcpLoggerModule.createMcpLogger(\"MCP Serve\", loggerConfig);\n } else {\n // Use options-based API when full config is provided to honor level and mcpMode\n mcpLogger = mcpLoggerModule.createMcpLogger({\n prefix: loggerConfig.prefix || \"MCP Serve\",\n logToFile: loggerConfig.logToFile,\n level: loggerConfig.level,\n mcpMode: loggerConfig.mcpMode ?? true,\n });\n }\n\n debug.log(\"Created MCP logger, about to hijack console\");\n // Hijack console globally to prevent STDOUT contamination in MCP mode\n (globalThis as any).console = mcpLogger;\n this.#logger = mcpLogger;\n debug.log(\"Console hijacked successfully\");\n } catch {\n debug.log(\"Failed to import simple-mcp-logger, using fallback\");\n mcpLogger = {\n mcpError: (message: string) => console.error(`[MCP Serve] ${message}`),\n };\n }\n debug.log(\"MCP logger setup complete, starting MCP serve handler\");\n\n try {\n mcpLogger.mcpError(\n \"Starting --s-mcp-serve system flag handler - console hijacked for MCP safety\",\n );\n\n if (!mcpServerConfig) {\n mcpLogger.mcpError(\n \"No MCP server configuration found. Use withMcp() or addMcpSubCommand() to configure MCP server.\",\n );\n return this._handleExit(\n 1,\n \"No MCP server configuration found\",\n \"error\",\n );\n }\n\n mcpLogger.mcpError(\n `Found MCP server configuration: ${mcpServerConfig.serverInfo?.name || \"unnamed\"}`,\n );\n\n mcpLogger.mcpError(`Using log path: ${resolvedLogPath}`);\n\n mcpLogger.mcpError(\n `Transport options: ${JSON.stringify(transportOptions)}`,\n );\n\n // Start the unified MCP server\n try {\n debug.log(\"About to call #_startUnifiedMcpServer\");\n mcpLogger.mcpError(\"Starting unified MCP server with all tools\");\n await this.#_startUnifiedMcpServer(mcpServerConfig, {\n ...transportOptions,\n logPath: resolvedLogPath,\n });\n debug.log(\"#_startUnifiedMcpServer completed\");\n mcpLogger.mcpError(\"Successfully started unified MCP server\");\n } catch (error) {\n mcpLogger.mcpError(\n `Failed to start unified MCP server: ${error instanceof Error ? error.message : String(error)}`,\n );\n return this._handleExit(\n 1,\n `Failed to start MCP server: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n\n mcpLogger.mcpError(\n \"MCP server started successfully, keeping process alive\",\n );\n\n // Keep the process alive indefinitely\n return new Promise(() => {});\n } catch (error) {\n mcpLogger.mcpError(\n `Error in --s-mcp-serve handler: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n mcpLogger.mcpError(`Stack trace: ${error.stack}`);\n }\n return this._handleExit(\n 1,\n `MCP serve failed: ${error instanceof Error ? error.message : String(error)}`,\n \"error\",\n );\n }\n }\n\n /**\n * Resolve logger configuration for MCP serve with proper priority\n * @param mcpServerConfig MCP server configuration\n * @param resolvedLogPath Resolved log path from CLI flags and config priority\n * @returns Logger configuration object or string path\n */\n #_resolveLoggerConfigForServe(\n mcpServerConfig: any,\n resolvedLogPath: string,\n ): any {\n // Priority 1: CLI flag override (already resolved in resolvedLogPath)\n // Priority 2: New 'log' configuration from withMcp\n if (mcpServerConfig?.log) {\n if (typeof mcpServerConfig.log === \"string\") {\n // Simple string path - use resolved path\n return {\n prefix: \"MCP Serve\",\n logToFile: resolvedLogPath,\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n } else {\n // Full options object - merge with resolved path\n // The resolvedLogPath already includes the correct priority: CLI > log.logToFile > logPath > default\n return {\n prefix: \"MCP Serve\",\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n ...mcpServerConfig.log,\n // Use the resolved path which respects the proper priority order\n logToFile: resolvedLogPath,\n };\n }\n }\n\n // Priority 3: Legacy 'logPath' configuration or CLI flag\n // (resolvedLogPath already handles this priority)\n return resolvedLogPath;\n }\n\n /**\n * Get MCP server configuration from withMcp() or fallback to addMcpSubCommand()\n */\n #_getMcpServerConfiguration(): any {\n // First, check if this is an ArgParser instance with withMcp() configuration\n if ((this as unknown as IMcpServerMethods).getMcpServerConfig) {\n const mcpConfig = (\n this as unknown as IMcpServerMethods\n ).getMcpServerConfig();\n if (mcpConfig) {\n return mcpConfig;\n }\n }\n\n // Fallback: look for MCP subcommands for backward compatibility\n const mcpSubCommands = this.#_findAllMcpSubCommands();\n if (mcpSubCommands.length > 0) {\n // Use the first MCP subcommand configuration\n const firstMcpCmd = mcpSubCommands[0];\n return {\n serverInfo: firstMcpCmd.serverInfo,\n toolOptions: firstMcpCmd.toolOptions,\n // Extract transport options from subcommand if available\n defaultTransports: firstMcpCmd.subCommand.mcpOptions?.defaultTransports,\n defaultTransport: firstMcpCmd.subCommand.mcpOptions?.defaultTransport,\n };\n }\n\n return null;\n }\n\n /**\n * Start a unified MCP server with all tools from the parser\n */\n async #_startUnifiedMcpServer(\n mcpServerConfig: any,\n transportOptions: {\n transportType?: string;\n port?: number;\n host?: string;\n path?: string;\n transports?: string;\n logPath?: string;\n cors?: any;\n auth?: any;\n },\n ): Promise<void> {\n // We need to cast this to ArgParser to access MCP methods\n const mcpParser = this as unknown as IMcpServerMethods;\n\n if (\n !mcpParser.createMcpServer ||\n !mcpParser.startMcpServerWithTransport ||\n !mcpParser.startMcpServerWithMultipleTransports\n ) {\n throw new Error(\n \"MCP server methods not available. This parser may not support MCP functionality.\",\n );\n }\n\n const { serverInfo, toolOptions, defaultTransports, defaultTransport } =\n mcpServerConfig;\n\n // Determine which transport configuration to use - CLI flags take precedence over programmatic defaults\n if (transportOptions.transports) {\n // Multiple transports specified via CLI\n try {\n const transportConfigs = JSON.parse(transportOptions.transports);\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n transportConfigs,\n toolOptions,\n transportOptions.logPath,\n );\n } catch (error: any) {\n throw new Error(\n `Error parsing transports configuration: ${error.message}. Expected JSON format: '[{\"type\":\"stdio\"},{\"type\":\"sse\",\"port\":3001}]'`,\n );\n }\n } else if (transportOptions.transportType) {\n // Single transport specified via CLI flags - takes precedence over programmatic defaults\n const transportType = transportOptions.transportType as\n | \"stdio\"\n | \"sse\"\n | \"streamable-http\";\n const finalTransportOptions = {\n port: transportOptions.port,\n host: transportOptions.host || \"localhost\",\n path: transportOptions.path || \"/mcp\",\n // Pass-through for streamable-http only; harmlessly ignored for others\n cors: transportOptions.cors,\n auth: transportOptions.auth,\n };\n\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n transportType,\n finalTransportOptions,\n toolOptions,\n transportOptions.logPath,\n );\n } else if (defaultTransports && defaultTransports.length > 0) {\n // Use preset multiple transports configuration\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n defaultTransports,\n toolOptions,\n transportOptions.logPath,\n );\n } else if (defaultTransport) {\n // Use preset single transport configuration\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n defaultTransport.type,\n {\n port: defaultTransport.port,\n host: defaultTransport.host,\n path: defaultTransport.path,\n sessionIdGenerator: defaultTransport.sessionIdGenerator,\n },\n toolOptions,\n transportOptions.logPath,\n );\n } else {\n // Default fallback to stdio when no transport configuration is provided\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n \"stdio\",\n {},\n toolOptions,\n transportOptions.logPath,\n );\n }\n }\n\n /**\n * Find all MCP subcommands in the parser tree\n */\n #_findAllMcpSubCommands(): Array<{\n subCommand: any;\n serverInfo: any;\n toolOptions: any;\n }> {\n const mcpSubCommands: Array<{\n subCommand: any;\n serverInfo: any;\n toolOptions: any;\n }> = [];\n\n // Check current parser's subcommands\n for (const [_name, subCommand] of this.#subCommands.entries()) {\n if (subCommand.isMcp && subCommand.mcpServerInfo) {\n mcpSubCommands.push({\n subCommand: subCommand,\n serverInfo: subCommand.mcpServerInfo,\n toolOptions: subCommand.mcpToolOptions || {},\n });\n }\n }\n\n // Recursively check child parsers\n for (const [_name, subCommand] of this.#subCommands.entries()) {\n if (subCommand.parser) {\n const childMcpCommands = (\n subCommand.parser as ArgParserBase\n ).#_findAllMcpSubCommands();\n mcpSubCommands.push(...childMcpCommands);\n }\n }\n\n return mcpSubCommands;\n }\n\n /**\n * Parse MCP transport options from command line arguments\n * Uses system flags (--s-mcp-*) to avoid collisions with user flags\n */\n #_parseMcpTransportOptions(processArgs: string[]): {\n transportType?: string;\n port?: number;\n host?: string;\n path?: string;\n transports?: string;\n logPath?: string;\n cors?: any;\n auth?: any;\n } {\n const options: {\n transportType?: string;\n port?: number;\n host?: string;\n path?: string;\n transports?: string;\n logPath?: string;\n cors?: any;\n auth?: any;\n } = {};\n\n // Look for transport-related system flags\n for (let i = 0; i < processArgs.length; i++) {\n const arg = processArgs[i];\n const nextArg = processArgs[i + 1];\n\n switch (arg) {\n case \"--s-mcp-transport\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.transportType = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-port\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.port = parseInt(nextArg, 10);\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-host\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.host = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-path\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.path = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-transports\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.transports = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n case \"--s-mcp-log-path\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n options.logPath = nextArg;\n i++; // Skip next arg since we consumed it\n }\n break;\n // Streamable HTTP extras (accept JSON string)\n case \"--s-mcp-cors\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n try {\n options.cors = JSON.parse(nextArg);\n } catch {\n options.cors = nextArg;\n }\n i++;\n }\n break;\n case \"--s-mcp-auth\":\n if (nextArg && !nextArg.startsWith(\"-\")) {\n try {\n options.auth = JSON.parse(nextArg);\n } catch {\n options.auth = nextArg;\n }\n i++;\n }\n break;\n // Backward compatibility: support old flags but with deprecation warning\n case \"--transport\":\n case \"--port\":\n case \"--host\":\n case \"--path\":\n case \"--transports\":\n console.warn(\n `Warning: ${arg} is deprecated. Use --s-mcp-${arg.slice(2)} instead.`,\n );\n // Fall through to handle the old flag for now\n if (arg === \"--transport\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.transportType = nextArg;\n i++;\n } else if (arg === \"--port\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.port = parseInt(nextArg, 10);\n i++;\n } else if (arg === \"--host\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.host = nextArg;\n i++;\n } else if (arg === \"--path\" && nextArg && !nextArg.startsWith(\"-\")) {\n options.path = nextArg;\n i++;\n } else if (\n arg === \"--transports\" &&\n nextArg &&\n !nextArg.startsWith(\"-\")\n ) {\n options.transports = nextArg;\n i++;\n }\n break;\n }\n }\n\n return options;\n }\n}\n\n/**\n * A reusable handler that simply displays help.\n * Can be used as a default handler for subcommands that act as containers.\n */\nexport const autoHelpHandler = async (ctx: IHandlerContext) => {\n ctx.displayHelp();\n};\n","/**\n * Utilities for MCP (Model Context Protocol) compatibility\n */\n\n/**\n * Sanitizes a tool name to comply with MCP naming requirements.\n * MCP tool names must match the pattern: ^[a-zA-Z0-9_-]{1,64}$\n *\n * @param name The original tool name\n * @returns A sanitized tool name that complies with MCP requirements\n */\nexport function sanitizeMcpToolName(name: string): string {\n if (!name || typeof name !== \"string\") {\n throw new Error(\"Tool name must be a non-empty string\");\n }\n\n // Replace invalid characters with underscores\n let sanitized = name.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n\n // Ensure the name is not empty or only underscores after sanitization\n if (!sanitized || /^_+$/.test(sanitized)) {\n sanitized = \"tool\";\n }\n\n // Truncate to 64 characters if necessary\n if (sanitized.length > 64) {\n sanitized = sanitized.substring(0, 64);\n }\n\n return sanitized;\n}\n\n/**\n * Validates if a tool name complies with MCP naming requirements.\n * MCP tool names must match the pattern: ^[a-zA-Z0-9_-]{1,64}$\n *\n * @param name The tool name to validate\n * @returns True if the name is valid, false otherwise\n */\nexport function isValidMcpToolName(name: string): boolean {\n if (!name || typeof name !== \"string\") {\n return false;\n }\n\n const mcpNamePattern = /^[a-zA-Z0-9_-]{1,64}$/;\n return mcpNamePattern.test(name);\n}\n","import { z } from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\nimport { ArgParserBase } from \"../core/ArgParserBase\";\nimport type {\n IFlag,\n IHandlerContext,\n ProcessedFlag,\n TParsedArgs,\n} from \"../core/types\";\n// Import the centralized utility functions\nimport {\n createOutputSchema,\n getJsonSchemaTypeFromFlag,\n} from \"../core/types.js\";\nimport { sanitizeMcpToolName } from \"./mcp-utils\";\n\nconst logger = createMcpLogger(\"MCP Integration\");\n\n// Assuming these types are correctly exported from src/index.ts\n\n/**\n * Standard MCP response format\n */\nexport interface McpResponse {\n content: Array<{\n type: \"text\";\n text: string;\n }>;\n isError?: boolean;\n structuredContent?: any;\n}\n\n/**\n * Create a standardized MCP success response\n */\nexport function createMcpSuccessResponse(data: any): McpResponse {\n return {\n content: [\n {\n type: \"text\",\n text: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\n/**\n * Create a standardized MCP error response\n */\nexport function createMcpErrorResponse(error: string | Error): McpResponse {\n const errorMessage = error instanceof Error ? error.message : error;\n const errorData = { error: errorMessage, success: false };\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMessage}`,\n },\n ],\n structuredContent: errorData,\n };\n}\n\n/**\n * Convert a single ArgParser flag to JSON Schema property\n */\nexport function convertFlagToJsonSchemaProperty(flag: IFlag | ProcessedFlag): {\n property: any;\n isRequired: boolean;\n} {\n // Handle Zod schemas specially - use Zod v4's native JSON Schema support\n if (flag.type && typeof flag.type === \"object\" && flag.type._def) {\n const zodSchema = flag.type as ZodTypeAny;\n\n try {\n const property = z.toJSONSchema(zodSchema);\n\n if (flag.description) {\n property.description = flag.description;\n }\n\n const isRequired = !!(flag.mandatory || (flag as any).required);\n\n return { property, isRequired };\n } catch (error) {\n // Fallback if JSON Schema conversion fails\n logger.error(\n `Failed to convert Zod schema to JSON Schema for flag '${flag.name}':`,\n error,\n );\n const property = {\n type: \"object\" as const,\n description: flag.description || `${flag.name} parameter (Zod schema)`,\n };\n const isRequired = !!(flag.mandatory || (flag as any).required);\n return { property, isRequired };\n }\n }\n\n const property: any = {\n type: getJsonSchemaTypeFromFlag(flag.type),\n description: flag.description || `${flag.name} parameter`,\n };\n\n // Handle enums\n if (flag.enum && Array.isArray(flag.enum)) {\n property.enum = flag.enum;\n }\n\n // Handle default values\n const defaultValue = (flag as any).defaultValue || (flag as any).default;\n if (defaultValue !== undefined) {\n property.default = defaultValue;\n } else if (\n flag.flagOnly &&\n getJsonSchemaTypeFromFlag(flag.type) === \"boolean\"\n ) {\n // For flagOnly boolean flags, default to false when not explicitly set\n property.default = false;\n }\n\n // Handle array items\n if (flag.type === \"array\" && (flag as any).itemType) {\n property.items = {\n type: getJsonSchemaTypeFromFlag((flag as any).itemType),\n };\n }\n\n // Determine if required\n const isRequired = !!(flag.mandatory || (flag as any).required);\n\n return { property, isRequired };\n}\n\n/**\n * Convert ArgParser flags to MCP JSON Schema\n */\nexport function convertFlagsToJsonSchema(\n flags: readonly (IFlag | ProcessedFlag)[],\n): {\n type: \"object\";\n properties: Record<string, any>;\n required: string[];\n} {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const flag of flags) {\n // Skip help flag and system flags\n if (flag.name === \"help\" || flag.name.startsWith(\"s-\")) {\n continue;\n }\n\n const { property, isRequired } = convertFlagToJsonSchemaProperty(flag);\n properties[flag.name] = property;\n\n if (isRequired) {\n required.push(flag.name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n}\n\n/**\n * Convert ArgParser flags to Zod schema for MCP tools\n */\nexport function convertFlagsToZodSchema(\n flags: readonly (IFlag | ProcessedFlag)[],\n): ZodTypeAny {\n const zodProperties: Record<string, ZodTypeAny> = {};\n\n for (const flag of flags) {\n // Skip help flag and system flags\n if (flag.name === \"help\" || flag.name.startsWith(\"s-\")) {\n continue;\n }\n\n const zodSchema = mapArgParserFlagToZodSchema(flag);\n zodProperties[flag.name] = zodSchema;\n }\n\n return z.object(zodProperties);\n}\n\n/**\n * Simplified response format for testing and validation\n */\nexport interface SimplifiedToolResponse {\n success: boolean;\n data?: any;\n error?: string;\n message?: string;\n exitCode?: number;\n}\n\n/**\n * Extract simplified response from MCP protocol response\n */\nexport function extractSimplifiedResponse(\n mcpResponse: any,\n): SimplifiedToolResponse {\n // Handle responses that are already in simplified format\n if (\n typeof mcpResponse === \"object\" &&\n mcpResponse !== null &&\n \"success\" in mcpResponse\n ) {\n return {\n success: mcpResponse.success,\n data: mcpResponse.data,\n error: mcpResponse.error || mcpResponse.message, // Ensure error is populated\n message: mcpResponse.message || mcpResponse.error, // Ensure message is populated\n exitCode: mcpResponse.exitCode,\n };\n }\n\n // Handle error responses\n if (mcpResponse.isError) {\n const errorMessage = mcpResponse.content?.[0]?.text || \"Unknown error\";\n return {\n success: false,\n error: errorMessage,\n message: errorMessage, // Include message field for test compatibility\n data: { error: errorMessage }, // Include data field for test compatibility\n exitCode: 1,\n };\n }\n\n // Handle structured content (when output schema is used)\n if (mcpResponse.structuredContent) {\n return {\n success: true,\n data: mcpResponse.structuredContent,\n };\n }\n\n // Handle standard MCP content format\n if (mcpResponse.content && Array.isArray(mcpResponse.content)) {\n try {\n // Try to parse JSON from the text content\n const textContent = mcpResponse.content[0]?.text;\n if (textContent) {\n const parsedData = JSON.parse(textContent);\n return {\n success: true,\n data: parsedData,\n };\n }\n } catch {\n // If parsing fails, return the raw text\n return {\n success: true,\n data: mcpResponse.content[0]?.text || \"No content\",\n };\n }\n }\n\n // Fallback for unexpected formats\n return {\n success: false,\n error: \"Unexpected response format\",\n exitCode: 1,\n };\n}\n\n// Structural type for what MCP server.tool() expects\nexport interface IMcpToolStructure {\n name: string;\n description?: string;\n inputSchema: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n execute: (args: any) => Promise<any>;\n executeForTesting?: (args: any) => Promise<SimplifiedToolResponse>;\n}\n\nfunction mapArgParserFlagToZodSchema(flag: IFlag | ProcessedFlag): ZodTypeAny {\n const flagTypeOpt = flag[\"type\"];\n\n // Handle Zod schemas directly - return them as-is\n if (flagTypeOpt && typeof flagTypeOpt === \"object\" && flagTypeOpt._def) {\n return flagTypeOpt as ZodTypeAny;\n }\n\n let zodSchema: ZodTypeAny = z.string(); // Initialize with default value\n let typeName: string;\n\n if (typeof flagTypeOpt === \"function\") {\n typeName = flagTypeOpt.name.toLowerCase().replace(\"constructor\", \"\");\n } else {\n typeName = String(flagTypeOpt).toLowerCase();\n }\n\n const flagEnum = flag[\"enum\"];\n const allowMultiple = flag[\"allowMultiple\"];\n\n // Handle array flags (allowMultiple: true)\n if (allowMultiple) {\n let itemSchema: ZodTypeAny;\n\n if (flagEnum && Array.isArray(flagEnum) && flagEnum.length > 0) {\n if (flagEnum.every((e) => typeof e === \"string\")) {\n itemSchema = z.enum(flagEnum as [string, ...string[]]);\n } else if (flagEnum.every((e) => typeof e === \"number\")) {\n const literalSchemas = flagEnum.map((val) => z.literal(val));\n if (literalSchemas.length === 1) {\n itemSchema = literalSchemas[0];\n } else {\n itemSchema = z.union(\n literalSchemas as unknown as [\n ZodTypeAny,\n ZodTypeAny,\n ...ZodTypeAny[],\n ],\n );\n }\n } else {\n itemSchema = z.string();\n }\n } else {\n // Default item type based on flag type\n switch (typeName) {\n case \"number\":\n itemSchema = z.number();\n break;\n case \"boolean\":\n itemSchema = z.boolean();\n break;\n default:\n itemSchema = z.string();\n break;\n }\n }\n\n zodSchema = z.array(itemSchema);\n } else {\n // Handle non-array flags\n switch (typeName) {\n case \"string\":\n zodSchema =\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"string\")\n ? z.enum(flagEnum as [string, ...string[]])\n : z.string();\n break;\n case \"number\":\n if (\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"number\")\n ) {\n const literalSchemas = flagEnum.map((val) => z.literal(val));\n if (literalSchemas.length === 1) {\n zodSchema = literalSchemas[0];\n } else if (literalSchemas.length >= 2) {\n zodSchema = z.union(\n literalSchemas as unknown as [\n ZodTypeAny,\n ZodTypeAny,\n ...ZodTypeAny[],\n ],\n );\n } else {\n zodSchema = z.number();\n }\n } else {\n zodSchema = z.number();\n }\n break;\n case \"boolean\":\n zodSchema = z.boolean();\n break;\n case \"array\":\n const itemSchema =\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"string\")\n ? z.enum(flagEnum as [string, ...string[]])\n : z.string(); // Default item type for arrays\n zodSchema = z.array(itemSchema);\n break;\n case \"object\":\n zodSchema = z.record(z.string(), z.any());\n break;\n default:\n logger.error(\n `Flag '${flag[\"name\"]}' has an unknown type '${typeName}'. Defaulting to z.string().`,\n );\n zodSchema = z.string();\n break;\n }\n }\n\n const description = flag[\"description\"];\n if (description) {\n zodSchema = zodSchema.describe(\n Array.isArray(description) ? description.join(\"\\n\") : description,\n );\n }\n\n const defaultValue = flag[\"defaultValue\"];\n if (defaultValue !== undefined) {\n zodSchema = zodSchema.default(defaultValue);\n } else if (!flag[\"mandatory\"]) {\n zodSchema = zodSchema.optional();\n }\n return zodSchema;\n}\n\nexport interface GenerateMcpToolsOptions {\n outputSchemaMap?: Record<string, ZodTypeAny>;\n defaultOutputSchema?: ZodTypeAny;\n /** Automatically generate output schemas for tools that don't have explicit schemas */\n autoGenerateOutputSchema?:\n | boolean\n | keyof typeof import(\"../core/types\").OutputSchemaPatterns;\n generateToolName?: (commandPath: string[], appName?: string) => string;\n includeSubCommands?: boolean;\n toolNamePrefix?: string;\n toolNameSuffix?: string;\n}\n\ninterface ISpecialParseResultProps {\n $commandChain?: string[];\n $error?: { type: string; message: string; details?: any };\n handlerResponse?: any;\n}\nexport type IParseExecutionResult = TParsedArgs<ProcessedFlag[]> &\n ISpecialParseResultProps;\n\nexport function generateMcpToolsFromArgParser(\n rootParser: ArgParserBase,\n options?: GenerateMcpToolsOptions,\n): IMcpToolStructure[] {\n const tools: IMcpToolStructure[] = [];\n const visitedParsers = new Set<ArgParserBase>();\n\n function buildToolsRecursively(\n currentParser: ArgParserBase,\n commandPathParts: string[],\n ) {\n if (visitedParsers.has(currentParser)) return;\n visitedParsers.add(currentParser);\n\n const typedRootParser = rootParser as any;\n const typedCurrentParser = currentParser as any;\n\n const appName = typedRootParser.getAppName\n ? typedRootParser.getAppName()\n : typedRootParser[\"#appName\"];\n const currentParserDescription = typedCurrentParser.getDescription\n ? typedCurrentParser.getDescription()\n : typedCurrentParser[\"#description\"];\n const currentParserHandler = typedCurrentParser.getHandler\n ? typedCurrentParser.getHandler()\n : typedCurrentParser[\"#handler\"];\n\n // ArgParser.ts (line 196) has a public getter `get flags()`\n const currentParserFlags = typedCurrentParser.flags as (\n | IFlag\n | ProcessedFlag\n )[];\n\n const subCommandsMap = typedCurrentParser.getSubCommands\n ? typedCurrentParser.getSubCommands()\n : typedCurrentParser[\"#subCommands\"];\n const currentParserSubCommands = subCommandsMap\n ? Array.from(subCommandsMap.values())\n : [];\n\n let currentParserCommandName = typedCurrentParser.getAppCommandName\n ? typedCurrentParser.getAppCommandName()\n : typedCurrentParser[\"#appCommandName\"];\n if (!currentParserCommandName && currentParser !== rootParser) {\n currentParserCommandName = typedCurrentParser.getSubCommandName\n ? typedCurrentParser.getSubCommandName()\n : typedCurrentParser[\"#subCommandName\"];\n }\n\n // For sub-commands, prefer the command path over the inherited command name\n if (currentParser !== rootParser && commandPathParts.length > 0) {\n currentParserCommandName = commandPathParts[commandPathParts.length - 1];\n }\n const currentParserCommandNameOrAppName =\n currentParserCommandName || appName;\n\n const effectiveCommandName =\n currentParserCommandName ||\n (commandPathParts.length > 0\n ? commandPathParts[commandPathParts.length - 1]\n : appName);\n\n let toolName: string;\n if (options?.generateToolName) {\n toolName = options.generateToolName(commandPathParts, appName);\n } else {\n // For root parser, use the command name directly\n if (currentParser === rootParser) {\n toolName = currentParserCommandNameOrAppName || appName || \"root_cmd\";\n } else {\n // For sub-parsers, use the effective command name or the last part of the path\n toolName = effectiveCommandName || \"cmd\";\n }\n\n // Clean up the tool name for MCP compatibility\n toolName = sanitizeMcpToolName(toolName);\n }\n if (!toolName)\n toolName = currentParser === rootParser && appName ? appName : \"cmd\";\n\n // Apply prefix and suffix if provided\n if (options?.toolNamePrefix) {\n toolName = options.toolNamePrefix + toolName;\n }\n if (options?.toolNameSuffix) {\n toolName = toolName + options.toolNameSuffix;\n }\n\n if (currentParserHandler) {\n const flags = currentParserFlags as ProcessedFlag[];\n const zodProperties: Record<string, ZodTypeAny> = {};\n const hasHelpFlag = flags.some((flag) => flag[\"name\"] === \"help\");\n\n for (const flag of flags) {\n // Skip help flag - it doesn't make sense in MCP tool context\n if (flag[\"name\"] === \"help\") continue;\n\n let flagSchema = mapArgParserFlagToZodSchema(flag);\n\n // If there's a help flag, make mandatory fields optional to allow help to work\n // This is necessary because MCP SDK validates the schema before our execute function runs\n if (hasHelpFlag && flag[\"mandatory\"]) {\n flagSchema = flagSchema.optional();\n }\n\n zodProperties[flag[\"name\"]] = flagSchema;\n }\n const inputSchema = z.object(zodProperties);\n\n let outputSchema: ZodTypeAny | undefined;\n\n // Priority order: explicit schema map > default schema > auto-generated schema\n if (options?.outputSchemaMap && options.outputSchemaMap[toolName]) {\n const customSchema = options.outputSchemaMap[toolName];\n outputSchema =\n typeof customSchema === \"object\" &&\n customSchema !== null &&\n !customSchema._def\n ? z.object(customSchema as unknown as ZodRawShape)\n : customSchema;\n } else if (options?.defaultOutputSchema) {\n outputSchema = options.defaultOutputSchema;\n } else if (options?.autoGenerateOutputSchema) {\n // Auto-generate output schema based on the option value\n if (typeof options.autoGenerateOutputSchema === \"string\") {\n // Use specific pattern\n outputSchema = createOutputSchema(options.autoGenerateOutputSchema);\n } else if (options.autoGenerateOutputSchema === true) {\n // Use default success/error pattern\n outputSchema = createOutputSchema(\"successWithData\");\n }\n }\n\n const tool: IMcpToolStructure = {\n name: toolName,\n description:\n currentParserDescription || `Executes the ${toolName} command.`,\n inputSchema: inputSchema,\n outputSchema: outputSchema,\n async execute(mcpInputArgs: Record<string, any>) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Starting execution for tool '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Input args:`,\n JSON.stringify(mcpInputArgs, null, 2),\n );\n }\n\n // Check if help is requested first, before any other processing\n if (mcpInputArgs[\"help\"] === true) {\n // Generate help text for the specific command path\n let helpParser = rootParser;\n const pathParts = [...commandPathParts];\n\n // Navigate to the correct parser for help\n for (const part of pathParts) {\n const subCmd = (helpParser as any).getSubCommand\n ? (helpParser as any).getSubCommand(part)\n : undefined;\n if (subCmd && subCmd.parser) {\n helpParser = subCmd.parser;\n } else {\n break;\n }\n }\n\n const helpText = (helpParser as any).helpText\n ? (helpParser as any).helpText()\n : \"Help not available\";\n\n if (options?.outputSchemaMap?.[toolName]) {\n const helpData = {\n success: true,\n help: helpText,\n files: [],\n commandExecuted: null,\n stderrOutput: null,\n };\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(helpData, null, 2),\n },\n ],\n structuredContent: helpData,\n };\n }\n return { success: true, message: helpText };\n }\n\n // The ArgParser will handle validation based on its flag definitions during parse.\n // The MCP Server uses these Zod schemas directly.\n const argv: string[] = [...commandPathParts];\n const parserFlags = currentParserFlags as ProcessedFlag[];\n\n for (const flagDef of parserFlags) {\n const flagName = flagDef[\"name\"];\n if (mcpInputArgs.hasOwnProperty(flagName)) {\n const value = mcpInputArgs[flagName];\n const flagType = flagDef[\"type\"];\n const flagOptions = flagDef[\"options\"];\n const isFlagOnly = flagDef[\"flagOnly\"];\n const allowMultiple = flagDef[\"allowMultiple\"];\n let flagTypeName =\n typeof flagType === \"function\"\n ? flagType.name.toLowerCase().replace(\"constructor\", \"\")\n : String(flagType).toLowerCase();\n\n argv.push(flagOptions[0]);\n\n if (flagTypeName === \"boolean\") {\n if (value === true && isFlagOnly === false)\n argv.push(String(value));\n else if (value === false && isFlagOnly === false)\n argv.push(String(value));\n } else if (flagTypeName === \"array\") {\n if (Array.isArray(value)) {\n if (allowMultiple) {\n const originalArgvLength = argv.length;\n value.forEach((item) => {\n argv.push(flagOptions[0]);\n argv.push(String(item));\n });\n if (\n value.length > 0 &&\n argv[originalArgvLength - 1] === flagOptions[0]\n ) {\n argv.splice(originalArgvLength - 1, 1);\n }\n } else {\n argv.push(value.join(\",\"));\n }\n } else if (value != null) argv.push(String(value));\n } else if (value !== null && value !== undefined)\n argv.push(String(value));\n }\n }\n\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Starting try block for tool '${toolName}'`,\n );\n }\n\n // Check if this is a unified tool - if so, handle it directly without recursive parsing\n const rootParserTyped = rootParser as any;\n const unifiedTools = rootParserTyped._tools;\n const isUnifiedTool = unifiedTools && unifiedTools.has(toolName);\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Checking tool '${toolName}' for unified execution`,\n );\n logger.error(`[MCP Tool Debug] Has _tools:`, !!unifiedTools);\n logger.error(\n `[MCP Tool Debug] Available tools:`,\n unifiedTools ? Array.from(unifiedTools.keys()) : [],\n );\n logger.error(`[MCP Tool Debug] Is unified tool:`, isUnifiedTool);\n }\n\n let parseResult: IParseExecutionResult;\n\n if (isUnifiedTool) {\n // For unified tools, bypass the recursive parse call and execute directly\n const toolConfig = unifiedTools.get(toolName);\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Found unified tool config:`,\n !!toolConfig,\n );\n logger.error(\n `[MCP Tool Debug] Has handler:`,\n !!(toolConfig && toolConfig.handler),\n );\n }\n if (toolConfig && toolConfig.handler) {\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Executing unified tool handler for '${toolName}'`,\n );\n logger.error(\n `[MCP Tool Debug] Handler args:`,\n JSON.stringify(mcpInputArgs, null, 2),\n );\n }\n const getFlag = (name: string): any => {\n if (mcpInputArgs && mcpInputArgs[name] !== undefined) {\n return mcpInputArgs[name];\n }\n\n if (rootParser) {\n const flagDef = rootParser.getFlagDefinition(name);\n if (flagDef) {\n const envVar = flagDef[\"env\"];\n if (envVar) {\n const envKey = Array.isArray(envVar)\n ? envVar[0]\n : envVar;\n if (envKey && process.env[envKey]) {\n return process.env[envKey];\n }\n }\n return flagDef[\"defaultValue\"];\n }\n }\n\n return undefined;\n };\n\n const handlerContext: IHandlerContext<any, any> = {\n args: mcpInputArgs,\n commandChain: [toolName],\n parser: rootParser,\n parentArgs: undefined,\n isMcp: true,\n getFlag,\n logger, // Add logger to context\n displayHelp: () => {\n logger.error(\n \"Help display is not supported in MCP mode.\",\n );\n },\n };\n\n const handlerResult =\n await toolConfig.handler(handlerContext);\n\n // Create a mock parse result that mimics successful execution\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Handler result:`,\n JSON.stringify(handlerResult, null, 2),\n );\n }\n parseResult = {\n handlerResponse: handlerResult,\n $commandChain: [toolName],\n ...mcpInputArgs,\n } as IParseExecutionResult;\n } catch (handlerError: any) {\n // Create error parse result\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Handler error:`,\n handlerError,\n );\n }\n parseResult = {\n $error: {\n type: \"handler_error\",\n message:\n handlerError instanceof Error\n ? handlerError.message\n : String(handlerError),\n details: handlerError,\n },\n ...mcpInputArgs,\n } as IParseExecutionResult;\n }\n } else {\n // Tool not found error\n parseResult = {\n $error: {\n type: \"tool_not_found\",\n message: `Unified tool '${toolName}' not found or has no handler`,\n details: { toolName },\n },\n ...mcpInputArgs,\n } as IParseExecutionResult;\n }\n } else {\n // For CLI-generated tools, use the original parse approach\n // ArgParser instance (rootParser) should be configured with handleErrors: false in its constructor.\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Tool Debug] Using CLI-generated tool parsing for '${toolName}'`,\n );\n logger.error(\n `[MCP Tool Debug] Parse argv:`,\n JSON.stringify(argv, null, 2),\n );\n }\n parseResult = (await rootParser.parse(\n argv,\n )) as IParseExecutionResult;\n }\n\n if (parseResult[\"$error\"]) {\n const errorDetails = parseResult[\"$error\"]!;\n const errPayload = {\n message: `Cmd error: ${errorDetails.type} - ${errorDetails.message}`,\n details: errorDetails.details,\n };\n // For tools with output schemas, we need to provide structured content even for errors\n if (outputSchema) {\n // Try to create a structured error response that matches the output schema\n // We need to provide all required fields from the schema\n const structuredError: any = {\n success: false,\n error: errPayload.message,\n message: errPayload.message,\n };\n\n // Try to extract schema requirements and provide default values\n try {\n if (\n outputSchema &&\n typeof outputSchema === \"object\" &&\n outputSchema !== null &&\n outputSchema._def\n ) {\n const zodSchema = outputSchema as any;\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Output schema type:`,\n zodSchema._def?.typeName || zodSchema._def?.type,\n );\n }\n if (\n zodSchema._def?.typeName === \"ZodObject\" ||\n zodSchema._def?.type === \"object\"\n ) {\n const shapeGetter = zodSchema._def?.shape;\n if (shapeGetter) {\n const shape =\n typeof shapeGetter === \"function\"\n ? shapeGetter()\n : shapeGetter;\n\n if (shape && typeof shape === \"object\") {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Schema shape keys:`,\n Object.keys(shape),\n );\n }\n\n // Provide default values for required fields\n Object.keys(shape).forEach((key) => {\n if (!(key in structuredError)) {\n const fieldSchema = shape[key];\n if (fieldSchema && fieldSchema._def) {\n switch (\n fieldSchema._def.typeName ||\n fieldSchema._def.type\n ) {\n case \"ZodString\":\n case \"string\":\n structuredError[key] = \"\";\n break;\n case \"ZodNumber\":\n case \"number\":\n structuredError[key] = 0;\n break;\n case \"ZodBoolean\":\n case \"boolean\":\n structuredError[key] = false;\n break;\n case \"ZodArray\":\n case \"array\":\n structuredError[key] = [];\n break;\n case \"ZodObject\":\n case \"object\":\n structuredError[key] = {};\n break;\n default:\n structuredError[key] = null;\n }\n }\n }\n });\n }\n }\n }\n }\n } catch (schemaError) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Error processing output schema for structured error:`,\n schemaError,\n );\n }\n // Continue with basic structured error if schema processing fails\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Debug] Final structured error:`,\n JSON.stringify(structuredError, null, 2),\n );\n }\n\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Error: ${errPayload.message}`,\n },\n ],\n structuredContent: structuredError,\n };\n }\n\n // Always return standard MCP error response format for errors\n // Custom output schemas only apply to successful responses\n return createMcpErrorResponse(errPayload.message);\n }\n\n let handlerResponse = parseResult[\"handlerResponse\"];\n\n // Check if there's an async handler that needs to be awaited\n if (!handlerResponse && parseResult[\"_asyncHandlerPromise\"]) {\n try {\n handlerResponse = await parseResult[\"_asyncHandlerPromise\"];\n } catch (error: any) {\n // Use standardized MCP error response for async handler errors\n return createMcpErrorResponse(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n }\n\n // Check if we need to execute or re-execute the handler with proper MCP context\n // This happens when:\n // 1. No handler was executed (handlerResponse === undefined)\n // 2. Handler was executed but not with MCP context (need to re-execute with isMcp: true)\n\n // For root commands, the $commandChain might be undefined, so we need to construct it\n let commandChain = parseResult[\"$commandChain\"];\n if (!commandChain) {\n // For root commands, use the app command name\n const appCommandName = (rootParser as any).getAppCommandName\n ? (rootParser as any).getAppCommandName()\n : (rootParser as any)[\"#appCommandName\"];\n if (appCommandName) {\n commandChain = [appCommandName];\n }\n }\n\n const needsHandlerExecution =\n handlerResponse === undefined ||\n (handlerResponse !== undefined && commandChain);\n\n if (needsHandlerExecution && commandChain) {\n let finalParser: ArgParserBase | undefined = rootParser;\n let currentArgs: Record<string, any> = { ...parseResult };\n let resolvedParentArgs: Record<string, any> | undefined =\n undefined;\n const chain = commandChain;\n\n // Clean up special properties from currentArgs\n delete currentArgs[\"handlerResponse\"];\n delete currentArgs[\"$commandChain\"];\n delete currentArgs[\"$error\"];\n delete currentArgs[\"_originalInputArgs\"];\n delete currentArgs[\"_asyncHandlerPromise\"];\n delete currentArgs[\"_asyncHandlerInfo\"];\n delete currentArgs[\"_fuzzyModePreventedExecution\"];\n delete currentArgs[\"help\"]; // Remove help flag as well\n\n for (let i = 0; i < chain.length; i++) {\n const cmdName = chain[i];\n // Use ArgParser's public getSubCommand method\n const subCmdInfo = finalParser?.getSubCommand\n ? finalParser.getSubCommand(cmdName)\n : undefined;\n\n if (subCmdInfo && subCmdInfo.parser) {\n // For sub-commands, we need to pass the arguments that belong to the sub-command\n // Since the parseResult contains all the arguments, we'll use them directly\n // and filter out the special properties\n resolvedParentArgs = { ...currentArgs };\n currentArgs = { ...currentArgs };\n // Remove special properties to get clean sub-command args\n delete currentArgs[\"handlerResponse\"];\n delete currentArgs[\"$commandChain\"];\n delete currentArgs[\"$error\"];\n delete currentArgs[\"_originalInputArgs\"];\n delete currentArgs[\"_asyncHandlerPromise\"];\n delete currentArgs[\"_asyncHandlerInfo\"];\n delete currentArgs[\"_fuzzyModePreventedExecution\"];\n delete currentArgs[\"help\"];\n\n finalParser = subCmdInfo.parser as ArgParserBase;\n } else if (\n i === 0 &&\n finalParser &&\n cmdName ===\n ((finalParser as any).getAppCommandName\n ? (finalParser as any).getAppCommandName()\n : (finalParser as any)[\"#appCommandName\"] ||\n ((finalParser as any).getAppName\n ? (finalParser as any).getAppName()\n : (finalParser as any)[\"#appName\"]))\n ) {\n currentArgs = { ...parseResult };\n // Clean up special properties again after resetting from parseResult\n delete currentArgs[\"handlerResponse\"];\n delete currentArgs[\"$commandChain\"];\n delete currentArgs[\"$error\"];\n delete currentArgs[\"_originalInputArgs\"];\n delete currentArgs[\"_asyncHandlerPromise\"];\n delete currentArgs[\"_asyncHandlerInfo\"];\n delete currentArgs[\"_fuzzyModePreventedExecution\"];\n delete currentArgs[\"help\"];\n break;\n } else {\n finalParser = undefined;\n break;\n }\n }\n\n const finalParserTyped = finalParser as any;\n const finalHandler = finalParserTyped.getHandler\n ? finalParserTyped.getHandler()\n : finalParserTyped[\"#handler\"];\n\n if (finalParser && finalHandler) {\n const handlerToCall = finalHandler as Function;\n\n // For MCP execution, use the original MCP input args instead of the merged parse result\n // This prevents the nested args issue where handler response gets merged into args\n const cleanArgs = { ...mcpInputArgs };\n delete cleanArgs[\"help\"]; // Remove help flag\n\n const getFlag = (name: string): any => {\n if (cleanArgs && cleanArgs[name] !== undefined) {\n return cleanArgs[name];\n }\n\n if (finalParser) {\n const flagDef = finalParser.getFlagDefinition(name);\n if (flagDef) {\n const envVar = flagDef[\"env\"];\n if (envVar) {\n const envKey = Array.isArray(envVar)\n ? envVar[0]\n : envVar;\n if (envKey && process.env[envKey]) {\n return process.env[envKey];\n }\n }\n return flagDef[\"defaultValue\"];\n }\n }\n\n return undefined;\n };\n\n const handlerContext: IHandlerContext<any, any> = {\n args: cleanArgs,\n commandChain: chain,\n parser: finalParser,\n parentArgs: resolvedParentArgs,\n isMcp: true,\n getFlag,\n displayHelp: () => {\n logger.error(\"Help display is not supported in MCP mode.\");\n },\n logger,\n };\n try {\n handlerResponse = await handlerToCall(handlerContext);\n } catch (handlerError: any) {\n // Use standardized MCP error response\n return createMcpErrorResponse(handlerError);\n }\n }\n }\n\n // Automatically format response for MCP\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Formatting response for tool '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Handler response:`,\n JSON.stringify(handlerResponse, null, 2),\n );\n }\n\n if (handlerResponse && typeof handlerResponse === \"object\") {\n try {\n require(\"fs\").appendFileSync(\n \"/tmp/mcp-debug.log\",\n `[DEBUG] Handler response: ${JSON.stringify(handlerResponse, null, 2)}\\n`,\n );\n } catch (e) {} // Ignore errors during debug logging\n // If handler already returned MCP format with content field, use it\n if (\n handlerResponse.content &&\n Array.isArray(handlerResponse.content)\n ) {\n // If tool has output schema, ensure structuredContent is present\n if (outputSchema && !handlerResponse.structuredContent) {\n handlerResponse.structuredContent = handlerResponse;\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Returning MCP format response for '${toolName}'`,\n );\n }\n return handlerResponse;\n } else {\n // Handler returned plain data, wrap it in MCP format\n // Always include structuredContent for object responses to ensure MCP compliance\n // This is safe because structuredContent is optional in the MCP spec\n const mcpResponse = {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(handlerResponse, null, 2),\n },\n ],\n structuredContent: handlerResponse,\n };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Wrapping plain response in MCP format for '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Final MCP response:`,\n JSON.stringify(mcpResponse, null, 2),\n );\n }\n return mcpResponse;\n }\n }\n\n // For non-object responses, wrap in MCP format\n const defaultResponse = handlerResponse || { success: true };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Using default response for tool '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Default response:`,\n JSON.stringify(defaultResponse, null, 2),\n );\n }\n\n // Always include structuredContent for object responses to ensure MCP compliance\n if (typeof defaultResponse === \"object\") {\n const finalResponse = {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(defaultResponse, null, 2),\n },\n ],\n structuredContent: defaultResponse,\n };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Returning structured default response for '${toolName}'`,\n );\n logger.error(\n `[MCP Execute] Final response:`,\n JSON.stringify(finalResponse, null, 2),\n );\n }\n return finalResponse;\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Returning success response for '${toolName}'`,\n );\n }\n return createMcpSuccessResponse(defaultResponse);\n } catch (e: any) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n `[MCP Execute] Exception caught in tool '${toolName}':`,\n e,\n );\n }\n\n // Check if this is a handler error that was thrown due to handleErrors: false\n // In this case, we want to format it consistently with the $error handling above\n let errorMsg: string;\n\n if (e instanceof Error && e.message) {\n // This is likely a handler error thrown when handleErrors: false\n errorMsg = `Cmd error: handler_error - ${e.message}`;\n } else {\n // Other types of errors (parsing errors, etc.)\n errorMsg = `MCP tool exec failed: ${e.message || String(e)}`;\n }\n\n // For tools with output schemas, we need to provide structured content even for errors\n // to satisfy MCP SDK validation requirements\n if (outputSchema) {\n // Try to create a structured error response that matches the output schema\n const structuredError: any = {\n success: false,\n error: errorMsg,\n message: errorMsg,\n };\n\n // Try to extract schema requirements and provide default values\n try {\n if (\n outputSchema &&\n typeof outputSchema === \"object\" &&\n outputSchema !== null &&\n outputSchema._def\n ) {\n const zodSchema = outputSchema as any;\n if (\n zodSchema._def?.typeName === \"ZodObject\" ||\n zodSchema._def?.type === \"object\"\n ) {\n const shapeGetter = zodSchema._def?.shape;\n if (shapeGetter) {\n const shape =\n typeof shapeGetter === \"function\"\n ? shapeGetter()\n : shapeGetter;\n\n if (shape && typeof shape === \"object\") {\n // Provide default values for required fields\n Object.keys(shape).forEach((key) => {\n if (!(key in structuredError)) {\n const fieldSchema = shape[key];\n if (fieldSchema && fieldSchema._def) {\n const typeName =\n fieldSchema._def.typeName ||\n fieldSchema._def.type;\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n structuredError[key] = \"\";\n break;\n case \"ZodNumber\":\n case \"number\":\n structuredError[key] = 0;\n break;\n case \"ZodBoolean\":\n case \"boolean\":\n structuredError[key] = false;\n break;\n case \"ZodArray\":\n case \"array\":\n structuredError[key] = [];\n break;\n case \"ZodObject\":\n case \"object\":\n structuredError[key] = {};\n break;\n default:\n structuredError[key] = null;\n }\n }\n }\n });\n }\n }\n }\n }\n } catch (schemaError) {\n // Ignore schema processing errors during error handling\n }\n\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMsg}`,\n },\n ],\n structuredContent: structuredError,\n };\n }\n\n // Always return standard MCP error response format for errors\n // Custom output schemas only apply to successful responses\n return createMcpErrorResponse(errorMsg);\n }\n },\n async executeForTesting(\n mcpInputArgs: Record<string, any>,\n ): Promise<SimplifiedToolResponse> {\n try {\n const mcpResponse = await this.execute(mcpInputArgs);\n return extractSimplifiedResponse(mcpResponse);\n } catch (error: any) {\n return {\n success: false,\n error: error.message || String(error),\n exitCode: 1,\n };\n }\n },\n };\n tools.push(tool);\n }\n\n const subCommands = currentParserSubCommands;\n if (subCommands && options?.includeSubCommands !== false) {\n for (const subCmdObj of subCommands) {\n // Skip MCP server sub-commands to avoid infinite recursion\n if ((subCmdObj as any).isMcp === true) {\n continue;\n }\n\n const nextPathParts = [...commandPathParts, (subCmdObj as any).name];\n buildToolsRecursively(\n (subCmdObj as any).parser as ArgParserBase,\n nextPathParts.filter((p) => p),\n );\n }\n }\n }\n buildToolsRecursively(rootParser, []);\n return tools;\n}\n","/**\n * MCP Protocol Version Configuration\n *\n * This module defines the supported MCP protocol versions and provides\n * utilities for version negotiation according to the MCP specification.\n *\n * Version Negotiation Rules (per MCP specification):\n * 1. If server supports the requested protocol version, it MUST respond with the same version\n * 2. Otherwise, server MUST respond with another protocol version it supports\n * 3. Server SHOULD respond with the latest version it supports\n * 4. If client doesn't support the server's response version, it SHOULD disconnect\n */\n\n/**\n * Official MCP protocol versions in chronological order\n * Based on the official MCP specification releases found in docs/MCP/modelcontextprotocol/docs/specification/\n *\n * According to versioning.mdx:\n * - 2025-06-18 is the **current** protocol version\n * - Previous versions are marked as **final** (complete, no changes)\n * - Draft versions are in-progress specifications\n */\nexport const MCP_PROTOCOL_VERSIONS = [\n \"2024-11-05\", // Final - Initial stable release\n \"2025-03-26\", // Final - Updated transport specifications\n \"2025-06-18\", // Current - Latest stable specification\n] as const;\n\n/**\n * Draft protocol versions (in-progress specifications)\n * These are not yet ready for production use\n */\nexport const MCP_DRAFT_VERSIONS = [\n \"draft\", // Draft - In-progress specification\n] as const;\n\n/**\n * All available protocol versions (stable + draft)\n */\nexport const ALL_MCP_VERSIONS = [\n ...MCP_PROTOCOL_VERSIONS,\n ...MCP_DRAFT_VERSIONS,\n] as const;\n\n/**\n * Type for stable MCP protocol versions\n */\nexport type McpProtocolVersion = (typeof MCP_PROTOCOL_VERSIONS)[number];\n\n/**\n * Type for draft MCP protocol versions\n */\nexport type McpDraftVersion = (typeof MCP_DRAFT_VERSIONS)[number];\n\n/**\n * Type for all MCP protocol versions (stable + draft)\n */\nexport type McpAnyVersion = (typeof ALL_MCP_VERSIONS)[number];\n\n/**\n * Current protocol version according to the official MCP specification\n * This is marked as \"current\" in versioning.mdx and should be the preferred version\n */\nexport const CURRENT_MCP_PROTOCOL_VERSION: McpProtocolVersion = \"2025-06-18\";\n\n/**\n * Default protocol version used by this implementation for backward compatibility\n * We start with this version but can negotiate to newer versions\n *\n * Note: The official MCP SDK may support newer versions automatically.\n * This constant represents our fallback/minimum version.\n */\nexport const DEFAULT_MCP_PROTOCOL_VERSION: McpProtocolVersion = \"2024-11-05\";\n\n/**\n * Latest stable protocol version (highest version number from stable versions)\n */\nexport const LATEST_MCP_PROTOCOL_VERSION: McpProtocolVersion =\n MCP_PROTOCOL_VERSIONS[MCP_PROTOCOL_VERSIONS.length - 1];\n\n/**\n * Minimum supported protocol version (oldest stable version)\n */\nexport const MINIMUM_MCP_PROTOCOL_VERSION: McpProtocolVersion =\n MCP_PROTOCOL_VERSIONS[0];\n\n/**\n * Validates if a protocol version string follows the MCP format (YYYY-MM-DD or 'draft')\n */\nexport function isValidMcpVersionFormat(version: string): boolean {\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(version) || version === \"draft\";\n}\n\n/**\n * Checks if a protocol version is an official stable MCP version\n */\nexport function isOfficialMcpVersion(\n version: string,\n): version is McpProtocolVersion {\n return MCP_PROTOCOL_VERSIONS.includes(version as McpProtocolVersion);\n}\n\n/**\n * Checks if a protocol version is a draft MCP version\n */\nexport function isDraftMcpVersion(version: string): version is McpDraftVersion {\n return MCP_DRAFT_VERSIONS.includes(version as McpDraftVersion);\n}\n\n/**\n * Checks if a protocol version is any valid MCP version (stable or draft)\n */\nexport function isAnyMcpVersion(version: string): version is McpAnyVersion {\n return ALL_MCP_VERSIONS.includes(version as McpAnyVersion);\n}\n\n/**\n * Checks if a protocol version is supported by this implementation\n * Note: The official MCP SDK may support additional versions automatically\n */\nexport function isSupportedByImplementation(version: string): boolean {\n // We support all official stable versions and can handle draft versions\n // The official SDK likely supports all of these automatically\n return isAnyMcpVersion(version);\n}\n\n/**\n * Checks if a protocol version is recommended for production use\n */\nexport function isProductionReady(version: string): boolean {\n // Only stable versions are recommended for production\n return isOfficialMcpVersion(version);\n}\n\n/**\n * Performs version negotiation according to MCP specification\n *\n * @param requestedVersion The protocol version requested by the client\n * @returns The protocol version the server should respond with\n *\n * According to MCP specification:\n * - If server supports requested version → return SAME version (MUST)\n * - If server doesn't support requested version → return different supported version (MUST)\n * - Server SHOULD return latest version it supports\n *\n * Note: The actual MCP SDK may implement its own version negotiation.\n */\nexport function negotiateProtocolVersion(\n requestedVersion: string,\n): McpAnyVersion {\n // Validate format first\n if (!isValidMcpVersionFormat(requestedVersion)) {\n // If format is invalid, return the current/latest stable version\n return CURRENT_MCP_PROTOCOL_VERSION;\n }\n\n // If we support the requested version, return it (MUST per spec)\n if (isSupportedByImplementation(requestedVersion)) {\n // For draft versions, we might want to negotiate to stable version in production\n if (isDraftMcpVersion(requestedVersion)) {\n // In production, prefer stable version over draft\n return CURRENT_MCP_PROTOCOL_VERSION;\n }\n return requestedVersion as McpAnyVersion;\n }\n\n // If we don't support the requested version, return our current/latest version (SHOULD per spec)\n return CURRENT_MCP_PROTOCOL_VERSION;\n}\n\n/**\n * Gets comprehensive version compatibility information\n */\nexport function getVersionCompatibilityInfo() {\n return {\n // Stable versions\n stableVersions: [...MCP_PROTOCOL_VERSIONS],\n currentVersion: CURRENT_MCP_PROTOCOL_VERSION,\n defaultVersion: DEFAULT_MCP_PROTOCOL_VERSION,\n latestStableVersion: LATEST_MCP_PROTOCOL_VERSION,\n minimumVersion: MINIMUM_MCP_PROTOCOL_VERSION,\n\n // Draft versions\n draftVersions: [...MCP_DRAFT_VERSIONS],\n\n // All versions\n allSupportedVersions: [...ALL_MCP_VERSIONS],\n\n // Version status\n versionStatus: {\n \"2024-11-05\": \"final\",\n \"2025-03-26\": \"final\",\n \"2025-06-18\": \"current\",\n draft: \"draft\",\n },\n };\n}\n\n/**\n * Compares two MCP protocol versions\n * Returns: -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2\n */\nexport function compareVersions(v1: string, v2: string): number {\n if (v1 === v2) return 0;\n return v1 < v2 ? -1 : 1;\n}\n\n/**\n * Finds the highest version from a list of versions\n */\nexport function getHighestVersion(versions: string[]): string | null {\n if (versions.length === 0) return null;\n\n return versions.reduce((highest, current) => {\n return compareVersions(current, highest) > 0 ? current : highest;\n });\n}\n\n/**\n * Comprehensive test data for version negotiation testing\n */\nexport const VERSION_TEST_DATA = {\n // All supported stable versions\n stableVersions: [...MCP_PROTOCOL_VERSIONS],\n\n // Draft versions (may not be suitable for production)\n draftVersions: [...MCP_DRAFT_VERSIONS],\n\n // All supported versions\n allSupportedVersions: [...ALL_MCP_VERSIONS],\n\n // Versions that should be rejected/negotiated\n unsupportedVersions: [\n \"2020-01-01\", // Too old (before MCP existed)\n \"2023-01-01\", // Before first official release\n \"2024-01-01\", // Before first official release\n \"2030-12-31\", // Future version\n \"2026-01-01\", // Future version\n ],\n\n // Malformed version strings\n malformedVersions: [\n \"\", // Empty string\n \"invalid\", // Non-date format\n \"2024\", // Incomplete date\n \"2024-13-01\", // Invalid month\n \"2024-01-32\", // Invalid day\n \"v2024-11-05\", // With prefix\n \"2024.11.05\", // Wrong separator\n \"24-11-05\", // Wrong year format\n \"2024-11-5\", // Wrong day format\n \"beta\", // Invalid draft name\n \"v1.0.0\", // Semantic versioning format\n ],\n\n // Expected negotiation results for testing\n expectedNegotiations: {\n \"2024-11-05\": \"2024-11-05\", // Should return same\n \"2025-03-26\": \"2025-03-26\", // Should return same\n \"2025-06-18\": \"2025-06-18\", // Should return same (current)\n draft: \"2025-06-18\", // Should negotiate to stable\n \"2020-01-01\": \"2025-06-18\", // Should negotiate to current\n \"2030-12-31\": \"2025-06-18\", // Should negotiate to current\n invalid: \"2025-06-18\", // Should negotiate to current\n },\n} as const;\n","/**\n * Zod v3/v4 compatibility layer for MCP SDK integration\n *\n * The MCP SDK currently expects Zod v3 \"raw shape\" types for input schemas,\n * but this project uses Zod v4. This module provides compatibility functions\n * to convert Zod v4 schemas to formats that the MCP SDK can understand.\n */\n\nimport { z, type ZodObject, type ZodRawShape, type ZodTypeAny } from \"zod\";\nimport { createMcpLogger } from \"@alcyone-labs/simple-mcp-logger\";\n\nconst logger = createMcpLogger(\"Zod Compatibility\");\n\n/**\n * Type representing a Zod v3 compatible raw shape\n */\ntype ZodV3CompatibleShape = Record<string, ZodTypeAny>;\n\n/**\n * Type representing what the MCP SDK expects for tool registration\n */\ninterface McpSdkCompatibleSchema {\n shape?: ZodV3CompatibleShape;\n _def?: any;\n _zod?: any; // MCP SDK may look for this property\n parse?: (input: any) => any;\n safeParse?: (input: any) => any;\n}\n\n/**\n * Converts a Zod v4 schema to a format compatible with the MCP SDK's expectations\n * for Zod v3 raw shape types.\n *\n * @param zodSchema - The Zod v4 schema to convert\n * @returns A schema format compatible with MCP SDK\n */\nexport function convertToMcpCompatibleSchema(\n zodSchema: ZodTypeAny,\n): McpSdkCompatibleSchema {\n // Helper to get def property from either _def (v3) or def (v4)\n const getDefProperty = (schema: any) => schema._def || schema.def;\n\n // If it's already a ZodObject, try to extract the shape\n if (zodSchema instanceof z.ZodObject) {\n try {\n // In Zod v4, the shape is accessible via the shape property\n const shape = (zodSchema as any).shape;\n if (shape && typeof shape === \"object\") {\n return {\n shape,\n _def: getDefProperty(zodSchema),\n _zod: zodSchema, // Include reference to original Zod schema\n parse: zodSchema.parse.bind(zodSchema),\n safeParse: zodSchema.safeParse.bind(zodSchema),\n };\n }\n } catch (error) {\n logger.error(\n \"[Zod Compatibility] Failed to extract shape from ZodObject:\",\n error,\n );\n }\n }\n\n // Try to extract shape from _def (v3) or def (v4) if available\n const defProperty = getDefProperty(zodSchema);\n if (defProperty && defProperty.shape) {\n try {\n const shapeGetter = defProperty.shape;\n const shape =\n typeof shapeGetter === \"function\" ? shapeGetter() : shapeGetter;\n return {\n shape: shape,\n _def: defProperty,\n _zod: zodSchema, // Include reference to original Zod schema\n parse: zodSchema.parse.bind(zodSchema),\n safeParse: zodSchema.safeParse.bind(zodSchema),\n };\n } catch (error) {\n logger.error(\n \"[Zod Compatibility] Failed to extract shape from def property:\",\n error,\n );\n }\n }\n\n // Fallback: create a wrapper that mimics Zod v3 behavior\n return {\n shape: {},\n _def: getDefProperty(zodSchema) || {},\n _zod: zodSchema, // Include reference to original Zod schema\n parse: zodSchema.parse.bind(zodSchema),\n safeParse: zodSchema.safeParse.bind(zodSchema),\n };\n}\n\n/**\n * Creates an empty schema compatible with MCP SDK for tools with no parameters\n */\nexport function createEmptyMcpSchema(): McpSdkCompatibleSchema {\n const emptySchema = z.object({});\n return convertToMcpCompatibleSchema(emptySchema);\n}\n\n/**\n * Extracts the raw shape from a Zod v4 object schema in a way that's\n * compatible with what MCP SDK expects from Zod v3.\n *\n * @param zodObjectSchema - A Zod object schema\n * @returns The raw shape or empty object if extraction fails\n */\nexport function extractRawShape(\n zodObjectSchema: ZodObject<ZodRawShape>,\n): ZodV3CompatibleShape {\n try {\n // Try multiple methods to extract the shape\n\n // Method 1: Direct shape property access (Zod v4)\n if ((zodObjectSchema as any).shape) {\n return (zodObjectSchema as any).shape;\n }\n\n // Method 2: Shape from _def (fallback for Zod v3)\n if (\n (zodObjectSchema as any)._def &&\n typeof (zodObjectSchema as any)._def.shape === \"function\"\n ) {\n return (zodObjectSchema as any)._def.shape();\n }\n\n // Method 3: Shape from def (Zod v4)\n if (\n (zodObjectSchema as any).def &&\n typeof (zodObjectSchema as any).def.shape === \"function\"\n ) {\n return (zodObjectSchema as any).def.shape();\n }\n\n // Method 4: Static shape property from _def (Zod v3)\n if ((zodObjectSchema as any)._def && (zodObjectSchema as any)._def.shape) {\n const shapeValue = (zodObjectSchema as any)._def.shape;\n return typeof shapeValue === \"function\" ? shapeValue() : shapeValue;\n }\n\n // Method 5: Static shape property from def (Zod v4)\n if ((zodObjectSchema as any).def && (zodObjectSchema as any).def.shape) {\n const shapeValue = (zodObjectSchema as any).def.shape;\n return typeof shapeValue === \"function\" ? shapeValue() : shapeValue;\n }\n\n logger.warn(\n \"[Zod Compatibility] Could not extract raw shape, returning empty object\",\n );\n return {};\n } catch (error) {\n logger.error(\"[Zod Compatibility] Error extracting raw shape:\", error);\n return {};\n }\n}\n\n/**\n * Checks if a schema is a Zod object schema\n */\nexport function isZodObjectSchema(\n schema: any,\n): schema is ZodObject<ZodRawShape> {\n return (\n schema instanceof z.ZodObject ||\n (schema &&\n ((schema._def &&\n (schema._def.typeName === \"ZodObject\" ||\n schema._def.type === \"object\")) ||\n (schema.def &&\n (schema.def.typeName === \"ZodObject\" ||\n schema.def.type === \"object\"))))\n );\n}\n\n/**\n * Converts Zod v4 schemas to the specific format expected by MCP SDK tool registration.\n * This function handles the conversion for the server.registerTool() call.\n *\n * @param zodSchema - The Zod v4 schema to convert\n * @returns A schema format that MCP SDK can work with\n */\nexport function prepareMcpToolSchema(zodSchema: ZodTypeAny): any {\n // For MCP SDK compatibility, we need to provide something that looks like Zod v3\n\n // Add null/undefined check at the beginning\n if (!zodSchema) {\n logger.error(\n \"[prepareMcpToolSchema] ERROR: zodSchema is null or undefined!\",\n );\n logger.error(\"[prepareMcpToolSchema] Stack trace:\", new Error().stack);\n throw new Error(\n \"prepareMcpToolSchema called with null or undefined zodSchema\",\n );\n }\n\n // Helper to get def property from either _def (v3) or def (v4)\n const getDefProperty = (schema: any) => schema._def || schema.def;\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Input schema:\");\n logger.error(` - Type: ${typeof zodSchema}`);\n logger.error(` - Constructor: ${zodSchema?.constructor?.name}`);\n logger.error(` - Has _def: ${!!zodSchema?._def}`);\n logger.error(` - Has def: ${!!zodSchema?.def}`);\n logger.error(` - _def content:`, zodSchema?._def);\n logger.error(` - def content:`, zodSchema?.def);\n logger.error(` - Has shape: ${!!(zodSchema as any)?.shape}`);\n }\n\n if (isZodObjectSchema(zodSchema)) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Processing as ZodObject schema\");\n }\n // For object schemas, try to return the raw shape or a compatible wrapper\n const rawShape = extractRawShape(zodSchema);\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Extracted raw shape:\", rawShape);\n logger.error(\n \"[prepareMcpToolSchema] Raw shape keys:\",\n Object.keys(rawShape || {}),\n );\n }\n\n // Create a completely clean Zod v3-like object that MCP SDK can understand\n const defProperty = getDefProperty(zodSchema);\n\n // Create object with clean prototype to avoid any Zod v4 properties\n const compatibleSchema = Object.create(null);\n\n // Only add the essential properties that MCP SDK expects\n compatibleSchema._def = defProperty;\n compatibleSchema.shape = rawShape;\n\n // Essential methods\n compatibleSchema.parse = zodSchema.parse.bind(zodSchema);\n compatibleSchema.safeParse = zodSchema.safeParse.bind(zodSchema);\n\n // Optional methods (only if they exist)\n if (zodSchema.optional) {\n compatibleSchema.optional = zodSchema.optional.bind(zodSchema);\n }\n if (zodSchema.nullable) {\n compatibleSchema.nullable = zodSchema.nullable.bind(zodSchema);\n }\n\n // Store reference for debugging (but not as _zod to avoid conflicts)\n compatibleSchema._originalSchema = zodSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Created compatible schema:\");\n logger.error(` - Has _def: ${!!compatibleSchema._def}`);\n logger.error(` - Has shape: ${!!compatibleSchema.shape}`);\n logger.error(\n ` - Shape keys: ${Object.keys(compatibleSchema.shape || {})}`,\n );\n }\n\n return compatibleSchema;\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Processing as non-object schema\");\n }\n\n // For non-object schemas, return minimal compatible object\n const defProperty = getDefProperty(zodSchema);\n\n // Create clean object without any Zod v4 properties\n const result = Object.create(null);\n\n // Only add essential properties\n result._def = defProperty;\n result.parse = zodSchema.parse.bind(zodSchema);\n result.safeParse = zodSchema.safeParse.bind(zodSchema);\n\n // Optional methods (only if they exist)\n if (zodSchema.optional) {\n result.optional = zodSchema.optional.bind(zodSchema);\n }\n if (zodSchema.nullable) {\n result.nullable = zodSchema.nullable.bind(zodSchema);\n }\n\n // Store reference for debugging\n result._originalSchema = zodSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[prepareMcpToolSchema] Non-object result:\");\n logger.error(` - Has _def: ${!!result._def}`);\n logger.error(` - Type: ${typeof result}`);\n }\n\n return result;\n}\n\n/**\n * Simple approach: Create a clean copy of Zod schema without v4-specific properties\n * This is a non-recursive version to avoid infinite loops\n */\nexport function createCleanZodSchema(zodSchema: ZodTypeAny): any {\n if (!zodSchema) {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n \"[createCleanZodSchema] ERROR: zodSchema is null or undefined!\",\n );\n }\n // Return a simple default schema\n return z.object({});\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[createCleanZodSchema] Input schema:\");\n logger.error(` - Type: ${typeof zodSchema}`);\n logger.error(` - Constructor: ${zodSchema?.constructor?.name}`);\n logger.error(` - Has ~standard: ${!!(zodSchema as any)[\"~standard\"]}`);\n logger.error(` - Has def: ${!!(zodSchema as any).def}`);\n logger.error(` - Has _def: ${!!(zodSchema as any)._def}`);\n }\n\n // Create a minimal Zod-like object with just the essential properties\n const cleanSchema: any = {};\n\n // Copy essential properties that MCP SDK needs\n cleanSchema._def = (zodSchema as any)._def || (zodSchema as any).def;\n cleanSchema.parse = (zodSchema as any).parse?.bind(zodSchema);\n cleanSchema.safeParse = (zodSchema as any).safeParse?.bind(zodSchema);\n\n // Copy shape if it exists (for object schemas)\n if ((zodSchema as any).shape) {\n cleanSchema.shape = (zodSchema as any).shape;\n }\n\n // Set the prototype to match the original schema\n Object.setPrototypeOf(cleanSchema, Object.getPrototypeOf(zodSchema));\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[createCleanZodSchema] Clean schema created:\");\n logger.error(` - Has ~standard: ${!!(cleanSchema as any)[\"~standard\"]}`);\n logger.error(` - Has def: ${!!(cleanSchema as any).def}`);\n logger.error(` - Has _def: ${!!(cleanSchema as any)._def}`);\n logger.error(` - Has parse: ${typeof cleanSchema.parse}`);\n logger.error(` - Has safeParse: ${typeof cleanSchema.safeParse}`);\n logger.error(` - Has shape: ${!!(cleanSchema as any).shape}`);\n }\n\n return cleanSchema;\n}\n\n/**\n * Convert a Zod schema to a JSON Schema object that the MCP SDK expects\n * This is the correct approach - the MCP SDK expects JSON Schema, not Zod schemas\n */\nexport function zodToJsonSchema(zodSchema: ZodTypeAny): any {\n if (!zodSchema) {\n return { type: \"object\", properties: {} };\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\"[zodToJsonSchema] Converting Zod schema to JSON Schema\");\n logger.error(` - Input type: ${typeof zodSchema}`);\n logger.error(` - Constructor: ${zodSchema?.constructor?.name}`);\n }\n\n // For now, create a basic JSON Schema structure\n // This is a simplified implementation - we can enhance it later\n const def = (zodSchema as any)._def || (zodSchema as any).def;\n\n if (def?.typeName === \"ZodObject\") {\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n // Get the shape\n const shape = typeof def.shape === \"function\" ? def.shape() : def.shape;\n\n for (const [key, value] of Object.entries(shape || {})) {\n const fieldDef = (value as any)?._def || (value as any)?.def;\n\n if (fieldDef?.typeName === \"ZodString\") {\n properties[key] = { type: \"string\" };\n if (fieldDef.description) {\n properties[key].description = fieldDef.description;\n }\n } else if (fieldDef?.typeName === \"ZodNumber\") {\n properties[key] = { type: \"number\" };\n } else if (fieldDef?.typeName === \"ZodBoolean\") {\n properties[key] = { type: \"boolean\" };\n } else {\n // Fallback for unknown types\n properties[key] = { type: \"string\" };\n }\n\n // Check if field is required (not optional)\n if (fieldDef?.typeName && !fieldDef?.typeName?.includes(\"Optional\")) {\n required.push(key);\n }\n }\n\n const jsonSchema = {\n type: \"object\" as const,\n properties,\n ...(required.length > 0 && { required }),\n };\n\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(\n \"[zodToJsonSchema] Generated JSON Schema:\",\n JSON.stringify(jsonSchema, null, 2),\n );\n }\n\n return jsonSchema;\n }\n\n // Fallback for non-object schemas\n return { type: \"object\", properties: {} };\n}\n\n/**\n * Debug function to log schema structure for troubleshooting\n */\nexport function debugSchemaStructure(\n schema: any,\n label: string = \"Schema\",\n): void {\n if (process.env[\"MCP_DEBUG\"]) {\n logger.error(`[Zod Compatibility Debug] ${label} structure:`);\n logger.error(` - Type: ${typeof schema}`);\n logger.error(` - Constructor: ${schema?.constructor?.name}`);\n logger.error(` - Has shape: ${!!schema?.shape}`);\n logger.error(` - Has _def: ${!!schema?._def}`);\n logger.error(` - _def.typeName: ${schema?._def?.typeName}`);\n logger.error(` - _def.type: ${schema?._def?.type}`);\n logger.error(` - Has parse: ${typeof schema?.parse}`);\n logger.error(` - Has safeParse: ${typeof schema?.safeParse}`);\n\n if (schema?.shape) {\n logger.error(` - Shape keys: ${Object.keys(schema.shape)}`);\n }\n }\n}\n\n/**\n * Validates that a schema is compatible with MCP SDK expectations\n */\nexport function validateMcpSchemaCompatibility(schema: any): boolean {\n try {\n // Check for required methods\n if (typeof schema?.parse !== \"function\") {\n logger.warn(\"[Zod Compatibility] Schema missing parse method\");\n return false;\n }\n\n if (typeof schema?.safeParse !== \"function\") {\n logger.warn(\"[Zod Compatibility] Schema missing safeParse method\");\n return false;\n }\n\n // For object schemas, check for shape\n if (\n (schema?._def?.typeName === \"ZodObject\" ||\n schema?._def?.type === \"object\") &&\n !schema?.shape\n ) {\n logger.warn(\n \"[Zod Compatibility] ZodObject schema missing shape property\",\n );\n return false;\n }\n\n return true;\n } catch (error) {\n logger.error(\n \"[Zod Compatibility] Error validating schema compatibility:\",\n error,\n );\n return false;\n }\n}\n","import type { Application as ExpressApplication } from \"express\";\nimport { z, type ZodTypeAny } from \"zod\";\nimport {\n createMcpLogger,\n type McpLoggerOptions,\n} from \"@alcyone-labs/simple-mcp-logger\";\nimport {\n convertFlagsToZodSchema,\n createMcpErrorResponse,\n createMcpSuccessResponse,\n generateMcpToolsFromArgParser,\n} from \"../mcp/mcp-integration\";\nimport type {\n GenerateMcpToolsOptions,\n IMcpToolStructure,\n} from \"../mcp/mcp-integration\";\nimport type { McpLifecycleEvents } from \"../mcp/mcp-lifecycle\";\nimport {\n compareVersions,\n CURRENT_MCP_PROTOCOL_VERSION,\n} from \"../mcp/mcp-protocol-versions\";\nimport { sanitizeMcpToolName } from \"../mcp/mcp-utils\";\nimport {\n debugSchemaStructure,\n validateMcpSchemaCompatibility,\n} from \"../mcp/zod-compatibility\";\nimport { debug } from \"../utils/debug-utils\";\nimport { ArgParserBase, type IArgParserParams } from \"./ArgParserBase\";\nimport { resolveLogPath, type LogPath } from \"./log-path-utils\";\nimport { createOutputSchema, type IMcpServerMethods } from \"./types\";\nimport type {\n IFlag,\n IHandlerContext,\n OutputSchemaConfig,\n ParseResult,\n} from \"./types\";\n\nexport type { Application as ExpressApplication } from \"express\";\n\n/**\n * Configuration for a single MCP transport\n */\nexport type CorsOptions = {\n origins?: \"*\" | string | RegExp | Array<string | RegExp>;\n methods?: string[];\n headers?: string[];\n exposedHeaders?: string[];\n credentials?: boolean;\n maxAge?: number;\n};\n\nexport type JwtVerifyOptions = {\n algorithms?: (\"HS256\" | \"RS256\")[];\n secret?: string; // for HS256\n publicKey?: string; // for RS256\n getPublicKey?: (\n header: Record<string, unknown>,\n payload: Record<string, unknown>,\n ) => Promise<string> | string;\n audience?: string | string[];\n issuer?: string | string[];\n clockToleranceSec?: number;\n};\n\nexport type AuthOptions = {\n required?: boolean; // default true for MCP endpoint\n scheme?: \"bearer\" | \"jwt\";\n allowedTokens?: string[]; // simple bearer allowlist\n validator?: (\n req: any,\n token: string | undefined,\n ) => boolean | Promise<boolean>;\n jwt?: JwtVerifyOptions;\n publicPaths?: string[]; // paths that skip auth\n protectedPaths?: string[]; // if provided, only these paths require auth\n customMiddleware?: (req: any, res: any, next: any) => any; // full control hook\n};\n\nexport type McpTransportConfig = {\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions; // streamable-http only\n auth?: AuthOptions; // streamable-http only\n};\n\n/**\n * Configuration options for MCP sub-command\n */\nexport type McpSubCommandOptions = {\n /** Preset transport configurations to use when no CLI flags are provided */\n defaultTransports?: McpTransportConfig[];\n /** Single preset transport configuration (alternative to defaultTransports) */\n defaultTransport?: McpTransportConfig;\n};\n\n/**\n * Extended server information for DXT package generation and MCP server metadata\n * This type includes logo support for MCP servers and DXT packages\n */\nexport type DxtServerInfo = {\n name: string;\n version: string;\n description?: string;\n /** Author information for DXT manifest */\n author?: {\n name: string;\n email?: string;\n url?: string;\n };\n /** Repository information for DXT manifest */\n repository?: {\n type: string;\n url: string;\n };\n /** License identifier for DXT manifest */\n license?: string;\n /** Homepage URL for DXT manifest */\n homepage?: string;\n /** Documentation URL for DXT manifest */\n documentation?: string;\n /** Support/issues URL for DXT manifest */\n support?: string;\n /** Keywords for DXT manifest */\n keywords?: string[];\n /**\n * Logo/icon for DXT manifest and MCP server - can be a local file path or URL\n * This is where logo support is provided for MCP-enabled ArgParser instances\n */\n logo?: string;\n};\n\n/**\n * Copy entry for DXT package bundling, compatible with TSDown's copy options\n */\nexport type DxtCopyEntry = {\n from: string;\n to: string;\n};\n\n/**\n * Copy options for DXT package bundling, compatible with TSDown's copy options\n * @example\n * ```ts\n * [\n * 'migrations',\n * { from: 'migrations', to: 'migrations' },\n * { from: 'config/default.json', to: 'config/default.json' }\n * ]\n * ```\n */\nexport type DxtCopyOptions = Array<string | DxtCopyEntry>;\n\n/**\n * DXT-specific configuration options\n */\nexport type DxtOptions = {\n /**\n * Additional files and directories to include in the DXT package.\n * Paths are relative to the project root (where package.json/tsconfig.json are located).\n *\n * @example\n * ```ts\n * include: [\n * 'migrations', // Copy entire migrations folder\n * { from: 'config/prod.json', to: 'config.json' }, // Copy and rename file\n * 'assets/logo.png' // Copy specific file\n * ]\n * ```\n */\n include?: DxtCopyOptions;\n};\n\n/**\n * MCP server configuration options for withMcp() method\n * This centralizes MCP server metadata that was previously scattered across addMcpSubCommand calls\n */\nexport type HttpServerOptions = {\n configureExpress?: (app: ExpressApplication) => void;\n};\n\nexport type McpServerOptions = {\n /** MCP server metadata */\n serverInfo?: DxtServerInfo;\n /** Default transport configurations for the MCP server */\n defaultTransports?: McpTransportConfig[];\n /** Single default transport configuration (alternative to defaultTransports) */\n defaultTransport?: McpTransportConfig;\n /** Tool generation options for the MCP server */\n toolOptions?: GenerateMcpToolsOptions;\n /**\n * Custom log file path for MCP server logs (default: \"./logs/mcp.log\" relative to entry point)\n *\n * @deprecated Use 'log' property instead for more comprehensive logging configuration\n *\n * Can be:\n * - Simple string: \"./logs/app.log\" (relative to entry point)\n * - Absolute path: \"/tmp/app.log\"\n * - Explicit cwd: \"cwd:./logs/app.log\" (relative to process.cwd())\n * - Config object: { path: \"./logs/app.log\", relativeTo: \"entry\" | \"cwd\" | \"absolute\" }\n */\n logPath?: LogPath;\n /**\n * MCP logger configuration options\n *\n * Can be:\n * - Simple string: \"./logs/app.log\" (equivalent to logPath for backward compatibility)\n * - Full options object: { level: \"debug\", logToFile: \"./logs/app.log\", prefix: \"MyServer\" }\n *\n * When both 'log' and 'logPath' are specified, they are merged intelligently:\n * - 'log' provides logger options (level, prefix, mcpMode)\n * - 'logPath' provides flexible path resolution (relativeTo, basePath)\n * - If 'log' has logToFile, 'logPath' still takes precedence for path resolution\n */\n log?: string | McpLoggerOptions;\n /**\n * Lifecycle event handlers for MCP server operations\n * These provide hooks for initialization, cleanup, and other lifecycle events\n */\n lifecycle?: McpLifecycleEvents;\n /** DXT package configuration options */\n dxt?: DxtOptions;\n /** Optional HTTP server configuration hooks */\n httpServer?: HttpServerOptions;\n};\n\n/**\n * Combined options for withMcp() method\n */\nexport type WithMcpOptions<THandlerReturn = any> =\n IArgParserParams<THandlerReturn> & {\n /** MCP-specific server configuration */\n mcp?: McpServerOptions;\n };\n\n/**\n * Type alias for clarity - ArgParser options with MCP capabilities\n * This provides a clearer name for WithMcpOptions\n */\nexport type ArgParserWithMcpOptions<THandlerReturn = any> =\n WithMcpOptions<THandlerReturn>;\n\n/**\n * Configuration for an individual MCP tool (deprecated - use ToolConfig instead)\n * @deprecated Use ToolConfig and addTool() instead. Will be removed in v2.0.\n */\nexport type McpToolConfig = {\n /**\n * Tool name (must be unique within the server)\n * Note: For MCP compatibility, names will be automatically sanitized to match ^[a-zA-Z0-9_-]{1,64}$\n * Invalid characters will be replaced with underscores\n */\n name: string;\n /** Tool description */\n description?: string;\n /** Input schema for the tool (Zod schema) */\n inputSchema?: any; // ZodTypeAny from zod\n /** Output schema for the tool (Zod schema) */\n outputSchema?: any; // ZodTypeAny from zod\n /** Handler function for the tool */\n handler: (args: any) => Promise<any> | any;\n};\n\n/**\n * Configuration for a unified tool that works in both CLI and MCP modes\n */\nexport type ToolConfig = {\n /**\n * Tool name (CLI subcommand name & MCP tool name)\n * Note: For MCP compatibility, names will be automatically sanitized to match ^[a-zA-Z0-9_-]{1,64}$\n * Invalid characters will be replaced with underscores\n */\n name: string;\n /** Tool description */\n description?: string;\n /** Flags for this tool (auto-converted to MCP schema) */\n flags: readonly IFlag[];\n /** Handler function for the tool */\n handler: (ctx: IHandlerContext) => Promise<any> | any;\n /** Output schema for this tool (predefined pattern, Zod schema, or schema definition object) */\n outputSchema?: OutputSchemaConfig;\n};\n\n/**\n * ArgParser with Model Context Protocol (MCP) integration capabilities.\n *\n * This class adds MCP server functionality on top of the standard ArgParser,\n * allowing CLI tools to be easily exposed as MCP tools with minimal boilerplate.\n *\n * @example\n * ```typescript\n * const parser = new ArgParser({\n * appName: \"My CLI\",\n * appCommandName: \"my-cli\",\n * handler: async (ctx) => ({ result: \"success\" })\n * })\n * .addFlags([...])\n * .addMcpSubCommand(\"serve\", {\n * name: \"my-cli-mcp-server\",\n * version: \"1.0.0\"\n * });\n * ```\n */\nexport class ArgParser<THandlerReturn = any>\n extends ArgParserBase<THandlerReturn>\n implements IMcpServerMethods\n{\n /** Stored MCP server configuration from withMcp() */\n private _mcpServerConfig?: McpServerOptions;\n\n /** Registered MCP tools (deprecated) */\n private _mcpTools: Map<string, McpToolConfig> = new Map();\n\n /** Registered unified tools */\n private _tools: Map<string, ToolConfig> = new Map();\n\n /** Output schema management */\n private _defaultOutputSchema?: import(\"zod\").ZodTypeAny;\n private _outputSchemaMap: Map<string, import(\"zod\").ZodTypeAny> = new Map();\n private _autoGenerateOutputSchema?:\n | boolean\n | keyof typeof import(\"./types\").OutputSchemaPatterns;\n\n /** MCP version for output schema compatibility */\n private _mcpProtocolVersion: string = CURRENT_MCP_PROTOCOL_VERSION;\n\n /**\n * Get the stored MCP server configuration\n * @returns MCP server configuration if set via withMcp(), undefined otherwise\n */\n public getMcpServerConfig(): McpServerOptions | undefined {\n return this._mcpServerConfig;\n }\n\n /**\n * Resolve logger configuration from various sources with proper priority\n * @param logPathOverride Optional log path override parameter\n * @returns Logger configuration object for createMcpLogger\n */\n #_resolveLoggerConfig(logPathOverride?: LogPath): McpLoggerOptions | string {\n const mcpConfig = this._mcpServerConfig;\n\n // Priority 1: Parameter override (for backward compatibility)\n if (logPathOverride) {\n const resolvedPath = resolveLogPath(logPathOverride);\n return {\n prefix: \"MCP Server Creation\",\n logToFile: resolvedPath,\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n }\n\n // Enhanced logic: Merge 'log' configuration with 'logPath' for flexible path resolution\n const hasLogConfig = mcpConfig?.log;\n const hasLogPath = mcpConfig?.logPath;\n\n if (hasLogConfig || hasLogPath) {\n // Start with base configuration\n let config: McpLoggerOptions = {\n prefix: \"MCP Server Creation\",\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n\n // Apply log configuration if present\n if (hasLogConfig && mcpConfig.log) {\n if (typeof mcpConfig.log === \"string\") {\n // Simple string path - use it as logToFile\n config.logToFile = resolveLogPath(mcpConfig.log);\n } else {\n // Full options object - merge with defaults\n config = {\n ...config,\n ...mcpConfig.log,\n // Resolve logToFile path if provided in log config\n ...(mcpConfig.log.logToFile && {\n logToFile: resolveLogPath(mcpConfig.log.logToFile),\n }),\n };\n }\n }\n\n // Apply logPath configuration if present and no logToFile was set by log config\n if (hasLogPath && mcpConfig.logPath && !config.logToFile) {\n config.logToFile = resolveLogPath(mcpConfig.logPath);\n }\n\n // If logPath is present but log config also specified a logToFile,\n // use logPath for more flexible path resolution (this preserves the nice LogPath features)\n if (\n hasLogPath &&\n mcpConfig.logPath &&\n hasLogConfig &&\n mcpConfig.log &&\n typeof mcpConfig.log === \"object\" &&\n mcpConfig.log.logToFile\n ) {\n // Use logPath for path resolution, but keep the logToFile from log config as fallback\n config.logToFile = resolveLogPath(mcpConfig.logPath);\n }\n\n return config;\n }\n\n // Priority 4: Default fallback\n const defaultPath = resolveLogPath(\"./logs/mcp.log\");\n return {\n prefix: \"MCP Server Creation\",\n logToFile: defaultPath,\n level: \"error\", // Default level for backward compatibility\n mcpMode: true,\n };\n }\n\n /**\n * Set a default output schema for all MCP tools generated from this parser\n * @param schema - Predefined pattern name, Zod schema, or schema definition object\n * @returns This ArgParser instance for chaining\n */\n public setDefaultOutputSchema(schema: OutputSchemaConfig): this {\n this._defaultOutputSchema = createOutputSchema(schema);\n return this;\n }\n\n /**\n * Set an output schema for a specific tool/command\n * @param toolName - Name of the tool/command\n * @param schema - Predefined pattern name, Zod schema, or schema definition object\n * @returns This ArgParser instance for chaining\n */\n public setOutputSchema(toolName: string, schema: OutputSchemaConfig): this {\n this._outputSchemaMap.set(toolName, createOutputSchema(schema));\n return this;\n }\n\n /**\n * Enable automatic output schema generation for MCP tools\n * @param pattern - True for default pattern, or specific pattern name\n * @returns This ArgParser instance for chaining\n */\n public enableAutoOutputSchema(\n pattern:\n | boolean\n | keyof typeof import(\"./types\").OutputSchemaPatterns = true,\n ): this {\n this._autoGenerateOutputSchema = pattern;\n return this;\n }\n\n /**\n * Set the MCP protocol version for compatibility checks\n * @param version - MCP protocol version (e.g., \"2025-06-18\")\n * @returns This ArgParser instance for chaining\n */\n public setMcpProtocolVersion(version: string): this {\n this._mcpProtocolVersion = version;\n return this;\n }\n\n /**\n * Check if the current MCP protocol version supports output schemas\n * Output schemas were introduced in MCP version 2025-06-18\n * @returns true if output schemas are supported\n */\n private supportsOutputSchemas(): boolean {\n // Output schemas were introduced in MCP version 2025-06-18\n return compareVersions(this._mcpProtocolVersion, \"2025-06-18\") >= 0;\n }\n\n /**\n * Add a unified tool that works in both CLI and MCP modes\n * In CLI mode, the tool becomes a subcommand with its own flags\n * In MCP mode, the tool becomes an MCP tool with auto-generated schema\n *\n * @param toolConfig Configuration for the tool\n * @returns This ArgParser instance for chaining\n */\n public addTool(toolConfig: ToolConfig): this {\n // Validate tool configuration\n if (!toolConfig.name || typeof toolConfig.name !== \"string\") {\n throw new Error(\"Tool name is required and must be a string\");\n }\n\n if (!toolConfig.handler || typeof toolConfig.handler !== \"function\") {\n throw new Error(\"Tool handler is required and must be a function\");\n }\n\n // Sanitize the tool name for MCP compatibility\n const sanitizedName = sanitizeMcpToolName(toolConfig.name);\n\n // Log sanitization warnings via console.warn (user-facing, not data-safe logging)\n if (sanitizedName !== toolConfig.name) {\n console.warn(\n `[ArgParser] Tool name '${toolConfig.name}' was sanitized to '${sanitizedName}' for MCP compatibility`,\n );\n }\n\n if (this._tools.has(sanitizedName)) {\n throw new Error(`Tool with name '${sanitizedName}' already exists`);\n }\n\n if (!Array.isArray(toolConfig.flags)) {\n throw new Error(\"Tool flags must be an array\");\n }\n\n // Create a new tool config with the sanitized name\n const sanitizedToolConfig: ToolConfig = {\n ...toolConfig,\n name: sanitizedName,\n };\n\n // Store the tool configuration with sanitized name\n this._tools.set(sanitizedName, sanitizedToolConfig);\n\n // Register the tool as a CLI subcommand (using original name for CLI)\n this.#registerToolAsSubCommand(toolConfig);\n\n return this;\n }\n\n /**\n * Register a tool as a CLI subcommand\n * @private\n */\n #registerToolAsSubCommand(toolConfig: ToolConfig): void {\n // Create a new ArgParser instance for this tool's subcommand\n const toolParser = new ArgParserBase(\n {\n appName: `${this.getAppName()} ${toolConfig.name}`,\n description:\n toolConfig.description || `Execute ${toolConfig.name} tool`,\n handler: toolConfig.handler,\n },\n toolConfig.flags,\n );\n\n // Add the subcommand to this parser\n this.addSubCommand({\n name: toolConfig.name,\n description: toolConfig.description || `Execute ${toolConfig.name} tool`,\n parser: toolParser,\n handler: toolConfig.handler,\n });\n }\n\n /**\n * Add an MCP tool to this parser (deprecated)\n * @deprecated Use addTool() instead. This method will be removed in v2.0.\n * @param toolConfig Configuration for the MCP tool\n * @returns This ArgParser instance for chaining\n */\n public addMcpTool(toolConfig: McpToolConfig): this {\n // Use console.warn directly for deprecation warnings (user-facing, not logging)\n console.warn(`[DEPRECATED] addMcpTool() is deprecated and will be removed in v2.0.\nPlease use addTool() instead for a unified CLI/MCP experience.\nMigration guide: https://github.com/alcyone-labs/arg-parser/blob/main/docs/MCP-MIGRATION.md`);\n\n // Sanitize the tool name for MCP compatibility\n const sanitizedName = sanitizeMcpToolName(toolConfig.name);\n\n // Log sanitization warnings via console.warn (user-facing, not data-safe logging)\n if (sanitizedName !== toolConfig.name) {\n console.warn(\n `[ArgParser] Tool name '${toolConfig.name}' was sanitized to '${sanitizedName}' for MCP compatibility`,\n );\n }\n\n if (this._mcpTools.has(sanitizedName)) {\n throw new Error(`MCP tool with name '${sanitizedName}' already exists`);\n }\n\n // Create a new tool config with the sanitized name\n const sanitizedToolConfig: McpToolConfig = {\n ...toolConfig,\n name: sanitizedName,\n };\n\n this._mcpTools.set(sanitizedName, sanitizedToolConfig);\n return this;\n }\n\n /**\n * Get all registered unified tools\n * @returns Map of tool names to tool configurations\n */\n public getTools(): Map<string, ToolConfig> {\n return new Map(this._tools);\n }\n\n /**\n * Get all registered MCP tools (deprecated)\n * @deprecated Use getTools() instead\n * @returns Map of tool names to tool configurations\n */\n public getMcpTools(): Map<string, McpToolConfig> {\n return new Map(this._mcpTools);\n }\n\n /**\n * Get information about all available tools (unified, legacy MCP, and CLI-generated)\n * @param options Optional configuration for MCP tool generation\n * @returns Object with tool counts and names for debugging\n */\n public getToolInfo(options?: GenerateMcpToolsOptions): {\n unifiedTools: string[];\n legacyMcpTools: string[];\n cliTools: string[];\n totalTools: number;\n duplicates: string[];\n } {\n const cliTools = generateMcpToolsFromArgParser(this, options);\n const unifiedToolNames = Array.from(this._tools.keys());\n const legacyMcpToolNames = Array.from(this._mcpTools.keys());\n const cliToolNames = cliTools.map((t) => t.name);\n\n // Find duplicates (tools that exist in multiple categories)\n const allToolNames = [\n ...unifiedToolNames,\n ...legacyMcpToolNames,\n ...cliToolNames,\n ];\n const duplicates = allToolNames.filter(\n (name, index) => allToolNames.indexOf(name) !== index,\n );\n\n // Calculate total unique tools (unified tools take precedence)\n const uniqueToolNames = new Set(allToolNames);\n\n return {\n unifiedTools: unifiedToolNames,\n legacyMcpTools: legacyMcpToolNames,\n cliTools: cliToolNames,\n totalTools: uniqueToolNames.size,\n duplicates: Array.from(new Set(duplicates)),\n };\n }\n\n /**\n * Get information about all available MCP tools (legacy method)\n * @deprecated Use getToolInfo() instead\n * @param options Optional configuration for MCP tool generation\n * @returns Object with tool counts and names for debugging\n */\n public getMcpToolInfo(options?: GenerateMcpToolsOptions): {\n manualTools: string[];\n cliTools: string[];\n totalTools: number;\n duplicates: string[];\n } {\n const toolInfo = this.getToolInfo(options);\n return {\n manualTools: [...toolInfo.unifiedTools, ...toolInfo.legacyMcpTools],\n cliTools: toolInfo.cliTools,\n totalTools: toolInfo.totalTools,\n duplicates: toolInfo.duplicates,\n };\n }\n\n /**\n * Validate that all tools are properly registered and routable\n * @returns Validation results\n */\n public validateToolRouting(): {\n isValid: boolean;\n issues: string[];\n cliSubcommands: string[];\n mcpTools: string[];\n } {\n const issues: string[] = [];\n const cliSubcommands: string[] = [];\n const mcpTools: string[] = [];\n\n // Check CLI subcommand registration\n const subCommands = this.getSubCommands();\n if (subCommands) {\n for (const [name] of subCommands) {\n cliSubcommands.push(name);\n }\n }\n\n // Check MCP tool registration\n const mcpToolStructures = this.toMcpTools();\n for (const tool of mcpToolStructures) {\n mcpTools.push(tool.name);\n }\n\n // Validate that unified tools are registered in both CLI and MCP\n for (const [toolName] of this._tools) {\n if (!cliSubcommands.includes(toolName)) {\n issues.push(\n `Unified tool '${toolName}' is not registered as CLI subcommand`,\n );\n }\n if (!mcpTools.includes(toolName)) {\n issues.push(`Unified tool '${toolName}' is not registered as MCP tool`);\n }\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n cliSubcommands,\n mcpTools,\n };\n }\n\n /**\n * Test tool routing by simulating a tool call\n * This is useful for debugging and ensuring tools are properly registered\n * @param toolName Name of the tool to test\n * @param args Arguments to pass to the tool\n * @returns Promise with the tool execution result or error\n */\n public async testMcpToolRouting(\n toolName: string,\n args: any = {},\n ): Promise<{\n success: boolean;\n result?: any;\n error?: string;\n executionTime?: number;\n }> {\n try {\n const tools = this.toMcpTools();\n const tool = tools.find((t) => t.name === toolName);\n\n if (!tool) {\n return {\n success: false,\n error: `Tool '${toolName}' not found. Available tools: ${tools.map((t) => t.name).join(\", \")}`,\n };\n }\n\n const startTime = Date.now();\n const result = await tool.execute(args);\n const executionTime = Date.now() - startTime;\n\n return {\n success: true,\n result,\n executionTime,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Generate MCP tools from this ArgParser instance\n * @param options Optional configuration for MCP tool generation\n * @returns Array of MCP tool structures ready for server registration\n */\n public toMcpTools(options?: GenerateMcpToolsOptions): IMcpToolStructure[] {\n // Merge instance-level output schema settings with options\n const mergedOptions: GenerateMcpToolsOptions = {\n ...options,\n // Merge output schema maps (options take precedence)\n outputSchemaMap: {\n ...Object.fromEntries(this._outputSchemaMap),\n ...options?.outputSchemaMap,\n },\n // Use instance default if not specified in options\n defaultOutputSchema:\n options?.defaultOutputSchema || this._defaultOutputSchema,\n // Use instance auto-generate setting if not specified in options\n autoGenerateOutputSchema:\n options?.autoGenerateOutputSchema ?? this._autoGenerateOutputSchema,\n };\n\n // Generate tools from CLI structure (legacy approach)\n const cliTools = generateMcpToolsFromArgParser(this, mergedOptions);\n\n // Convert unified tools to MCP tool structures\n const unifiedTools: IMcpToolStructure[] = Array.from(\n this._tools.values(),\n ).map((toolConfig) => {\n // Determine output schema for this tool\n let outputSchema: import(\"zod\").ZodTypeAny | undefined;\n\n // Priority: explicit schema map > tool-level schema > default schema > auto-generated schema\n if (mergedOptions.outputSchemaMap?.[toolConfig.name]) {\n outputSchema = mergedOptions.outputSchemaMap[toolConfig.name];\n } else if (toolConfig.outputSchema) {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Tool '${toolConfig.name}' has outputSchema:`,\n typeof toolConfig.outputSchema,\n );\n this.logger.error(\n `[MCP Debug] outputSchema has _def:`,\n !!(\n toolConfig.outputSchema &&\n typeof toolConfig.outputSchema === \"object\" &&\n \"_def\" in toolConfig.outputSchema\n ),\n );\n }\n outputSchema = createOutputSchema(toolConfig.outputSchema);\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Created output schema for '${toolConfig.name}':`,\n !!outputSchema,\n );\n }\n } else if (mergedOptions.defaultOutputSchema) {\n outputSchema = mergedOptions.defaultOutputSchema;\n } else if (mergedOptions.autoGenerateOutputSchema) {\n if (typeof mergedOptions.autoGenerateOutputSchema === \"string\") {\n outputSchema = createOutputSchema(\n mergedOptions.autoGenerateOutputSchema,\n );\n } else if (mergedOptions.autoGenerateOutputSchema === true) {\n outputSchema = createOutputSchema(\"successWithData\");\n }\n }\n\n // Only include output schema if the MCP protocol version supports it\n if (outputSchema && !this.supportsOutputSchemas()) {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Output schema for '${toolConfig.name}' removed due to MCP version ${this._mcpProtocolVersion} not supporting output schemas`,\n );\n }\n outputSchema = undefined;\n }\n\n return {\n name: toolConfig.name,\n description:\n toolConfig.description || `Executes the ${toolConfig.name} tool.`,\n inputSchema: convertFlagsToZodSchema(toolConfig.flags),\n outputSchema,\n execute: async (args: any) => {\n // Hijack console for MCP mode to prevent STDOUT contamination\n const originalConsole = globalThis.console;\n let mcpLogger: any = null;\n\n try {\n // Try to import and setup MCP logger for this tool execution\n try {\n const mcpLoggerModule = await Function(\n 'return import(\"@alcyone-labs/simple-mcp-logger\")',\n )();\n mcpLogger = mcpLoggerModule.createMcpLogger(\n `MCP-Tool-${toolConfig.name}`,\n );\n // Hijack console globally to prevent STDOUT contamination\n (globalThis as any).console = mcpLogger;\n } catch {\n // Fallback: create a minimal logger that redirects to stderr\n // Use originalConsole to avoid circular reference\n mcpLogger = {\n log: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n info: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n warn: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n error: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n debug: (...args: any[]) =>\n originalConsole.error(`[${toolConfig.name}]`, ...args),\n };\n (globalThis as any).console = mcpLogger;\n }\n\n // Create handler context similar to CLI mode\n const context: IHandlerContext = {\n args,\n parentArgs: {},\n commandChain: [toolConfig.name],\n parser: this as any,\n isMcp: true,\n logger: this.logger,\n displayHelp: () => {\n this.logger.error(\"Help display is not supported in MCP mode.\");\n },\n };\n\n const startTime = Date.now();\n const result = await toolConfig.handler(context);\n const executionTime = Date.now() - startTime;\n\n // Log successful execution for debugging\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Tool] '${toolConfig.name}' executed successfully in ${executionTime}ms`,\n );\n }\n\n // Ensure the result is properly formatted for MCP\n if (result && typeof result === \"object\" && \"content\" in result) {\n // Already in MCP format - ensure structuredContent is present if output schema exists and is supported\n if (\n outputSchema &&\n this.supportsOutputSchemas() &&\n !result.structuredContent\n ) {\n result.structuredContent = result;\n }\n return result;\n } else {\n // Format response consistently - include structuredContent when output schema is present and supported\n if (\n outputSchema &&\n this.supportsOutputSchemas() &&\n result &&\n typeof result === \"object\"\n ) {\n // Include structuredContent when output schema is present and version supports it\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result,\n };\n } else {\n // Wrap in standard MCP response format\n return createMcpSuccessResponse(result);\n }\n }\n } catch (error) {\n // Enhanced error handling with proper MCP error response format\n const errorMessage = `Tool '${toolConfig.name}' execution failed: ${error instanceof Error ? error.message : String(error)}`;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(`[MCP Tool Error] ${errorMessage}`);\n if (error instanceof Error && error.stack) {\n this.logger.error(`[MCP Tool Stack] ${error.stack}`);\n }\n }\n\n // Return MCP-compliant error response\n return createMcpErrorResponse(errorMessage);\n } finally {\n // Restore original console\n globalThis.console = originalConsole;\n }\n },\n };\n });\n\n // Convert legacy MCP tools to MCP tool structures (deprecated)\n const legacyMcpTools: IMcpToolStructure[] = Array.from(\n this._mcpTools.values(),\n ).map((toolConfig) => ({\n name: toolConfig.name,\n description:\n toolConfig.description || `Executes the ${toolConfig.name} tool.`,\n inputSchema: toolConfig.inputSchema || z.object({}),\n outputSchema: toolConfig.outputSchema,\n execute: async (args: any) => {\n try {\n const startTime = Date.now();\n const result = await toolConfig.handler(args);\n const executionTime = Date.now() - startTime;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Tool] '${toolConfig.name}' (legacy) executed successfully in ${executionTime}ms`,\n );\n }\n\n if (result && typeof result === \"object\" && \"content\" in result) {\n // If tool has output schema and version supports it, ensure structuredContent is present\n if (\n toolConfig.outputSchema &&\n this.supportsOutputSchemas() &&\n !result.structuredContent\n ) {\n result.structuredContent = result;\n }\n return result;\n } else {\n // Format response consistently with CLI-generated tools\n if (\n toolConfig.outputSchema &&\n this.supportsOutputSchemas() &&\n result &&\n typeof result === \"object\"\n ) {\n // Include structuredContent when output schema is present and version supports it\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result,\n };\n } else {\n return createMcpSuccessResponse(result);\n }\n }\n } catch (error) {\n const errorMessage = `Tool '${toolConfig.name}' execution failed: ${error instanceof Error ? error.message : String(error)}`;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(`[MCP Tool Error] ${errorMessage}`);\n }\n\n return createMcpErrorResponse(errorMessage);\n }\n },\n }));\n\n // Combine all tools (unified tools take precedence over legacy tools, which take precedence over CLI-generated tools)\n const allTools = [...unifiedTools, ...legacyMcpTools, ...cliTools];\n const uniqueTools = allTools.reduce((acc, tool) => {\n const existingTool = acc.find((t) => t.name === tool.name);\n if (!existingTool) {\n acc.push(tool);\n } else {\n // Log when a tool is being overridden\n const toolSource = unifiedTools.find((t) => t.name === tool.name)\n ? \"unified\"\n : legacyMcpTools.find((t) => t.name === tool.name)\n ? \"legacy MCP\"\n : \"CLI-generated\";\n console.warn(\n `[MCP Tool Registration] ${toolSource} tool '${tool.name}' overrides other tool definitions`,\n );\n }\n return acc;\n }, [] as IMcpToolStructure[]);\n\n return uniqueTools;\n }\n\n /**\n * Create an MCP server with tools generated from this ArgParser\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options\n * @param logPath Optional log path (deprecated, use log config in withMcp instead)\n * @returns Configured MCP server instance\n */\n public async createMcpServer(\n serverInfo?: DxtServerInfo,\n toolOptions?: GenerateMcpToolsOptions,\n logPath?: LogPath,\n ): Promise<any> {\n // Resolve logger configuration with priority: parameter > log config > logPath config > default\n const loggerConfig = this.#_resolveLoggerConfig(logPath);\n\n // Use the appropriate createMcpLogger API based on configuration type\n // Note: Current version only supports legacy API (prefix, logToFile)\n const logger =\n typeof loggerConfig === \"string\"\n ? createMcpLogger(\"MCP Server Creation\", loggerConfig)\n : createMcpLogger(\n loggerConfig.prefix || \"MCP Server Creation\",\n loggerConfig.logToFile,\n );\n\n try {\n // Use provided serverInfo or fall back to internal MCP configuration\n const effectiveServerInfo =\n serverInfo || this._mcpServerConfig?.serverInfo;\n\n if (!effectiveServerInfo) {\n throw new Error(\n \"No MCP server configuration found. Use withMcp() to configure server info or provide serverInfo parameter.\",\n );\n }\n\n logger.mcpError(\n `Creating MCP server: ${effectiveServerInfo.name} v${effectiveServerInfo.version}`,\n );\n\n // Dynamic import to avoid circular dependencies and support ES modules\n const { McpServer, ResourceTemplate } =\n await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n logger.mcpError(\n \"Successfully imported McpServer and ResourceTemplate from SDK\",\n );\n\n const server = new McpServer({\n name: effectiveServerInfo.name,\n version: effectiveServerInfo.version,\n description: effectiveServerInfo.description,\n });\n\n logger.mcpError(\"Successfully created McpServer instance\");\n\n // Set up lifecycle manager if lifecycle events are configured\n // Skip lifecycle setup during MCP server creation to prevent infinite recursion\n const isInMcpServeMode = process.argv.includes(\"--s-mcp-serve\");\n if (this._mcpServerConfig?.lifecycle && !isInMcpServeMode) {\n const { McpLifecycleManager } = await import(\"../mcp/mcp-lifecycle\");\n\n const lifecycleManager = new McpLifecycleManager(\n this._mcpServerConfig.lifecycle,\n logger,\n effectiveServerInfo,\n this,\n );\n\n // Parse the current process arguments to provide to lifecycle manager\n try {\n // Parse arguments without executing handlers to get flag values\n // Filter out system flags that could cause infinite recursion during server creation\n const filteredArgs = process.argv\n .slice(2)\n .filter(\n (arg) => !arg.startsWith(\"--s-mcp-\") && arg !== \"--s-mcp-serve\",\n );\n const parsedResult = await this.parse(filteredArgs, {\n skipHandlerExecution: true,\n isMcp: true,\n });\n\n // Extract the parsed arguments from the result\n const parsedArgs = (parsedResult as any)?.args || parsedResult || {};\n lifecycleManager.setParsedArgs(parsedArgs);\n\n logger.mcpError(\n `Lifecycle manager initialized with parsed args: ${Object.keys(parsedArgs).join(\", \")}`,\n );\n } catch (parseError) {\n logger.mcpError(\n `Warning: Could not parse arguments for lifecycle manager: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n );\n // Continue without parsed args - will fall back to environment variables\n }\n\n // Wrap the server's connect method to trigger lifecycle events\n const originalConnect = server.connect.bind(server);\n server.connect = async (transport: any) => {\n logger.mcpError(\"MCP server connecting with lifecycle events...\");\n\n // Call the original connect method\n const result = await originalConnect(transport);\n\n // Trigger onInitialize event immediately after connection\n // This simulates the initialize request since we can't intercept it directly\n try {\n await lifecycleManager.handleInitialize(\n { name: \"mcp-client\", version: \"1.0.0\" }, // Default client info\n \"2024-11-05\", // Default protocol version\n {}, // Default capabilities\n );\n\n // Trigger onInitialized event after a short delay\n setTimeout(async () => {\n try {\n await lifecycleManager.handleInitialized();\n } catch (error) {\n logger.mcpError(\n `Lifecycle onInitialized error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }, 100);\n } catch (error) {\n logger.mcpError(\n `Lifecycle onInitialize error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return result;\n };\n\n // Store lifecycle manager for shutdown handling\n (server as any)._lifecycleManager = lifecycleManager;\n\n logger.mcpError(\"Successfully set up MCP lifecycle manager\");\n }\n\n // Note: We now register actual resources and prompts below, so no need for internal handlers\n logger.mcpError(\n \"MCP server will register actual resources and prompts for full capability support\",\n );\n\n // Generate tools from this ArgParser instance\n logger.mcpError(\"Generating MCP tools from ArgParser\");\n const tools = this.toMcpTools(toolOptions);\n logger.mcpError(`Generated ${tools.length} MCP tools`);\n\n // Deduplicate tools by name to avoid registration conflicts\n const uniqueTools = tools.reduce((acc, tool) => {\n if (!acc.find((t) => t.name === tool.name)) {\n acc.push(tool);\n }\n return acc;\n }, [] as IMcpToolStructure[]);\n\n logger.mcpError(\n `After deduplication: ${uniqueTools.length} unique tools`,\n );\n\n // Register tools\n uniqueTools.forEach((tool) => {\n logger.mcpError(`Registering tool: ${tool.name}`);\n\n // MCP SDK expects Zod v3 compatible schemas\n let zodSchema: ZodTypeAny;\n\n // Find the tool configuration to get the flags\n const toolFromUnified = Array.from(this._tools.values()).find(\n (t) => t.name === tool.name,\n );\n const toolFromLegacy = Array.from(this._mcpTools.values()).find(\n (t) => t.name === tool.name,\n );\n\n if (toolFromUnified && toolFromUnified.flags) {\n // Convert flags to Zod schema for unified tools\n zodSchema = convertFlagsToZodSchema(toolFromUnified.flags);\n } else if (toolFromLegacy && toolFromLegacy.inputSchema) {\n // For legacy tools, use the existing Zod schema directly\n zodSchema = toolFromLegacy.inputSchema;\n } else {\n // Fallback for tools with no input parameters - create empty Zod object\n zodSchema = z.object({});\n }\n\n // Convert Zod schema to JSON Schema for MCP SDK\n let mcpCompatibleSchema;\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Preparing schema for tool ${tool.name}`,\n );\n this.logger.error(`[MCP Debug] Input zodSchema:`, zodSchema);\n }\n\n // Use the original Zod v4 schema directly (MCP SDK now supports v4)\n mcpCompatibleSchema = zodSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Successfully prepared schema for tool ${tool.name}`,\n );\n }\n } catch (schemaError) {\n this.logger.error(\n `[MCP Debug] Error preparing schema for tool ${tool.name}:`,\n schemaError,\n );\n throw schemaError;\n }\n\n // Add detailed debug logging for the prepared schema\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Prepared mcpCompatibleSchema for tool ${tool.name}:`,\n JSON.stringify(mcpCompatibleSchema, null, 2),\n );\n this.logger.error(\n `[MCP Debug] Schema properties:`,\n Object.keys(mcpCompatibleSchema || {}),\n );\n this.logger.error(\n `[MCP Debug] Schema def:`,\n (mcpCompatibleSchema as any)?.def,\n );\n this.logger.error(\n `[MCP Debug] Schema shape:`,\n (mcpCompatibleSchema as any)?.shape,\n );\n this.logger.error(\n `[MCP Debug] Schema parse function:`,\n typeof mcpCompatibleSchema?.parse,\n );\n }\n\n // Add debug logging before schema preparation\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] About to prepare schema for tool ${tool.name}`,\n );\n this.logger.error(`[MCP Debug] zodSchema type:`, typeof zodSchema);\n this.logger.error(`[MCP Debug] zodSchema:`, zodSchema);\n this.logger.error(\n `[MCP Debug] zodSchema constructor:`,\n zodSchema?.constructor?.name,\n );\n }\n\n // Debug schema structure if MCP_DEBUG is enabled\n debugSchemaStructure(mcpCompatibleSchema, `Tool ${tool.name} schema`);\n\n // Validate compatibility\n if (!validateMcpSchemaCompatibility(mcpCompatibleSchema)) {\n logger.mcpError(\n `Warning: Schema for tool ${tool.name} may not be fully compatible with MCP SDK`,\n );\n }\n\n const toolConfig: any = {\n title: tool.name, // MCP SDK requires title field\n description: tool.description || \"No description provided.\",\n inputSchema: mcpCompatibleSchema, // Use Zod v3 compatible schema for MCP SDK\n };\n\n // Debug the final toolConfig being passed to registerTool\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Final toolConfig for ${tool.name}:`,\n JSON.stringify(toolConfig, null, 2),\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema type:`,\n typeof toolConfig.inputSchema,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema constructor:`,\n toolConfig.inputSchema?.constructor?.name,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema._def:`,\n toolConfig.inputSchema?._def,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema.shape:`,\n toolConfig.inputSchema?.shape,\n );\n this.logger.error(\n `[MCP Debug] toolConfig.inputSchema._zod:`,\n toolConfig.inputSchema?._zod,\n );\n this.logger.error(\n `[MCP Debug] Schema keys:`,\n Object.keys(mcpCompatibleSchema || {}),\n );\n this.logger.error(\n `[MCP Debug] About to call server.registerTool with:`,\n {\n name: tool.name,\n description: tool.description,\n inputSchema: mcpCompatibleSchema,\n },\n );\n }\n\n // Include output schema in MCP tool registration for MCP 2025-06-18+ clients\n // The Alcyone Labs MCP SDK fork v1.16.0+ supports outputSchema in registerTool\n // This is conditionally enabled based on negotiated protocol version\n // Output schemas must be converted to Zod schema objects before passing to MCP SDK\n if (tool.outputSchema && this.supportsOutputSchemas()) {\n // Convert outputSchema to Zod schema (handles plain objects, patterns, and existing Zod schemas)\n const convertedOutputSchema = createOutputSchema(tool.outputSchema);\n toolConfig.outputSchema = convertedOutputSchema;\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Including outputSchema for tool '${tool.name}':`,\n typeof tool.outputSchema,\n );\n this.logger.error(\n `[MCP Debug] Converted outputSchema constructor:`,\n convertedOutputSchema?.constructor?.name,\n );\n this.logger.error(\n `[MCP Debug] supportsOutputSchemas():`,\n this.supportsOutputSchemas(),\n );\n }\n } else if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] NOT including outputSchema for tool '${tool.name}':`,\n `hasOutputSchema=${!!tool.outputSchema}, supportsOutputSchemas=${this.supportsOutputSchemas()}`,\n );\n }\n\n // Simple tool execution that matches the working minimal MCP server pattern\n const simpleExecute = async (args: any) => {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Simple Execute] 🎯 TOOL CALLED: '${tool.name}' with args:`,\n JSON.stringify(args, null, 2),\n );\n }\n\n try {\n // Call the tool's execute method directly\n const result = await tool.execute(args);\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Simple Execute] Tool '${tool.name}' returned:`,\n JSON.stringify(result, null, 2),\n );\n }\n\n // If result already has content field, return as-is\n if (\n result &&\n typeof result === \"object\" &&\n result.content &&\n Array.isArray(result.content)\n ) {\n return result;\n }\n\n // Otherwise, wrap in MCP content format\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n typeof result === \"string\"\n ? result\n : JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Simple Execute] Tool '${tool.name}' error:`,\n errorMessage,\n );\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error: ${errorMessage}`,\n },\n ],\n isError: true,\n };\n }\n };\n\n server.registerTool(tool.name, toolConfig, simpleExecute);\n });\n\n logger.mcpError(\"Successfully registered all tools with MCP server\");\n\n // Register MCP resources\n const resources = this.getMcpResources();\n logger.mcpError(`Registering ${resources.length} MCP resources`);\n\n resources.forEach((resource) => {\n try {\n const resourceConfig = {\n title: resource.title || resource.name,\n description: resource.description || `Resource: ${resource.name}`,\n mimeType: resource.mimeType || \"application/json\",\n };\n\n // Handle different URI template types\n if (resource.uriTemplate.includes(\"{\")) {\n // URI template with parameters\n const resourceTemplate = new ResourceTemplate(\n resource.uriTemplate,\n { list: undefined },\n );\n const templateHandler = async (uri: any, params: any = {}) => {\n try {\n const result = await resource.handler(\n new URL(uri.href || uri),\n params,\n );\n // Convert our format to MCP SDK format\n return {\n contents: result.contents.map((content) => {\n const mcpContent: any = {\n uri: content.uri,\n };\n if (content.text !== undefined) {\n mcpContent.text = content.text;\n }\n if (content.blob !== undefined) {\n mcpContent.blob = content.blob;\n }\n if (content.mimeType !== undefined) {\n mcpContent.mimeType = content.mimeType;\n }\n return mcpContent;\n }),\n };\n } catch (error) {\n logger.mcpError(\n `Resource template handler error for ${resource.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n };\n server.registerResource(\n resource.name,\n resourceTemplate,\n resourceConfig,\n templateHandler,\n );\n } else {\n // Simple URI string\n const resourceHandler = async (uri: any) => {\n try {\n const result = await resource.handler(\n new URL(uri.href || uri),\n {},\n );\n // Convert our format to MCP SDK format\n return {\n contents: result.contents.map((content) => {\n const mcpContent: any = {\n uri: content.uri,\n };\n if (content.text !== undefined) {\n mcpContent.text = content.text;\n }\n if (content.blob !== undefined) {\n mcpContent.blob = content.blob;\n }\n if (content.mimeType !== undefined) {\n mcpContent.mimeType = content.mimeType;\n }\n return mcpContent;\n }),\n };\n } catch (error) {\n logger.mcpError(\n `Resource handler error for ${resource.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n };\n server.registerResource(\n resource.name,\n resource.uriTemplate,\n resourceConfig,\n resourceHandler,\n );\n }\n\n logger.mcpError(`Successfully registered resource: ${resource.name}`);\n } catch (error) {\n logger.mcpError(\n `Failed to register resource ${resource.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n });\n\n logger.mcpError(\"Successfully registered all resources with MCP server\");\n\n // Register MCP prompts\n const prompts = this.getMcpPrompts();\n logger.mcpError(`Registering ${prompts.length} MCP prompts`);\n\n prompts.forEach((prompt) => {\n try {\n // Convert Zod v4 schema to MCP SDK compatible format (Zod v3 style)\n let mcpCompatibleSchema;\n try {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Preparing schema for prompt ${prompt.name}`,\n );\n this.logger.error(\n `[MCP Debug] Input argsSchema:`,\n prompt.argsSchema,\n );\n }\n mcpCompatibleSchema = prompt.argsSchema;\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Successfully prepared schema for prompt ${prompt.name}`,\n );\n }\n } catch (schemaError) {\n this.logger.error(\n `[MCP Debug] Error preparing schema for prompt ${prompt.name}:`,\n schemaError,\n );\n throw schemaError;\n }\n\n // Validate the converted schema\n if (!validateMcpSchemaCompatibility(mcpCompatibleSchema)) {\n throw new Error(\n `Schema validation failed for prompt ${prompt.name}`,\n );\n }\n\n if (process.env[\"MCP_DEBUG\"]) {\n debugSchemaStructure(mcpCompatibleSchema, `prompt ${prompt.name}`);\n }\n\n const promptConfig: any = {\n title: prompt.title || prompt.name, // MCP SDK requires title field\n description: prompt.description || \"No description provided.\",\n argsSchema: mcpCompatibleSchema, // Use Zod v3 compatible schema for MCP SDK\n };\n\n // Create prompt handler that wraps the original handler\n const promptHandler = async (args: any) => {\n try {\n // Validate arguments using the original Zod v4 schema\n const validatedArgs = prompt.argsSchema.parse(args);\n\n // Call the original handler with validated arguments\n const result = await prompt.handler(validatedArgs);\n\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Prompt '${prompt.name}' executed successfully`,\n );\n }\n\n return result;\n } catch (error) {\n if (process.env[\"MCP_DEBUG\"]) {\n this.logger.error(\n `[MCP Debug] Prompt '${prompt.name}' execution error:`,\n error,\n );\n }\n throw error;\n }\n };\n\n server.registerPrompt(\n prompt.name,\n promptConfig,\n promptHandler as any,\n );\n\n logger.mcpError(`Successfully registered prompt: ${prompt.name}`);\n } catch (error) {\n logger.mcpError(\n `Failed to register prompt ${prompt.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n });\n\n logger.mcpError(\"Successfully registered all prompts with MCP server\");\n\n // Set up change notifications\n this.setupMcpChangeNotifications(server);\n logger.mcpError(\"Successfully set up MCP change notifications\");\n\n // Add shutdown handler for lifecycle cleanup\n if ((server as any)._lifecycleManager) {\n const originalClose = server.close?.bind(server);\n server.close = async () => {\n logger.mcpError(\"MCP server shutdown initiated\");\n try {\n await (server as any)._lifecycleManager.handleShutdown(\n \"server_shutdown\",\n );\n } catch (error) {\n logger.mcpError(\n `Error during lifecycle shutdown: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (originalClose) {\n await originalClose();\n }\n };\n }\n\n return server;\n } catch (error) {\n logger.mcpError(\n `Error creating MCP server: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n logger.mcpError(`Stack trace: ${error.stack}`);\n }\n throw error;\n }\n }\n\n /**\n * Set up change notifications for the MCP server\n * @param _server The MCP server instance (unused for now, but reserved for future client connection tracking)\n */\n private setupMcpChangeNotifications(_server: any): void {\n // Set up connection tracking (this would be enhanced with actual client connections)\n // For now, we'll set up the infrastructure for future client management\n\n // Add listeners for resource/prompt changes to notify the server\n this.onMcpChange((event) => {\n // When resources/prompts change, we could notify connected clients\n // The actual notification sending would happen when clients are connected\n const logger = createMcpLogger(\"MCP Change Notifications\");\n logger.mcpError(\n `MCP ${event.type} ${event.action}: ${event.entityName || \"unknown\"}`,\n );\n });\n }\n\n /**\n * Start an MCP server using stdio transport\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when server is connected\n */\n public async startMcpServer(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n toolOptions?: GenerateMcpToolsOptions,\n ): Promise<void> {\n return this.startMcpServerWithTransport(\n serverInfo,\n \"stdio\",\n {},\n toolOptions,\n );\n }\n\n /**\n * Start an MCP server with multiple transport types simultaneously\n * @param serverInfo Server configuration\n * @param transports Array of transport configurations\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when all servers are started\n */\n public async startMcpServerWithMultipleTransports(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n transports: Array<{\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions;\n auth?: AuthOptions;\n }>,\n toolOptions?: GenerateMcpToolsOptions,\n logPath?: LogPath,\n ): Promise<void> {\n const server = await this.createMcpServer(serverInfo, toolOptions, logPath);\n const startPromises: Promise<void>[] = [];\n\n for (const transportConfig of transports) {\n const promise = this.#_startSingleTransport(\n server,\n serverInfo,\n transportConfig,\n logPath,\n );\n startPromises.push(promise);\n }\n\n await Promise.all(startPromises);\n }\n\n /**\n * Start an MCP server with a specific transport type\n * @param serverInfo Server configuration\n * @param transportType Type of transport to use\n * @param transportOptions Transport-specific options\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when server is connected\n */\n public async startMcpServerWithTransport(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n transportType: \"stdio\" | \"sse\" | \"streamable-http\",\n transportOptions: {\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions;\n auth?: AuthOptions;\n } = {},\n toolOptions?: GenerateMcpToolsOptions,\n logPath?: LogPath,\n ): Promise<void> {\n const server = await this.createMcpServer(serverInfo, toolOptions, logPath);\n await this.#_startSingleTransport(\n server,\n serverInfo,\n {\n type: transportType,\n ...transportOptions,\n },\n logPath,\n );\n }\n\n /**\n * Private helper method to start a single transport\n */\n async #_startSingleTransport(\n server: any,\n serverInfo: { name: string; version: string; description?: string },\n transportConfig: {\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n cors?: CorsOptions;\n auth?: AuthOptions;\n },\n logPath?: LogPath,\n ): Promise<void> {\n const resolvedLogPath = resolveLogPath(logPath || \"./logs/mcp.log\");\n const logger = createMcpLogger(\"MCP Transport\", resolvedLogPath);\n\n try {\n logger.mcpError(\n `Starting ${transportConfig.type} transport for server: ${serverInfo.name}`,\n );\n\n switch (transportConfig.type) {\n case \"stdio\": {\n logger.mcpError(\"Importing StdioServerTransport from SDK\");\n const { StdioServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n logger.mcpError(\"Creating StdioServerTransport instance\");\n const transport = new StdioServerTransport();\n logger.mcpError(\"Connecting server to stdio transport\");\n await server.connect(transport);\n logger.mcpError(\"Successfully connected to stdio transport\");\n break;\n }\n\n case \"sse\": {\n const { SSEServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/sse.js\");\n const express = (await import(\"express\")).default;\n\n const app = express();\n app.use(express.json());\n\n const port = transportConfig.port || 3000;\n const path = transportConfig.path || \"/sse\";\n\n app.get(path, (_req: any, res: any) => {\n const transport = new SSEServerTransport(path, res);\n server.connect(transport);\n });\n\n await new Promise<void>((resolve) => {\n app.listen(port, transportConfig.host || \"localhost\", () => {\n this.logger.error(\n `[${serverInfo.name}] MCP Server listening on http://${transportConfig.host || \"localhost\"}:${port}${path} (SSE)`,\n );\n resolve();\n });\n });\n break;\n }\n\n case \"streamable-http\": {\n const { StreamableHTTPServerTransport } =\n await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const express = (await import(\"express\")).default;\n\n const app = express();\n app.disable(\"x-powered-by\");\n app.use(express.json());\n\n // Add a simple favicon to prevent 404 errors\n app.get(\"/favicon.ico\", (_req, res) => {\n // Simple red dot on white background as SVG\n const favicon = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n <circle cx=\"8\" cy=\"8\" r=\"4\" fill=\"red\"/>\n </svg>`;\n res.setHeader(\"Content-Type\", \"image/svg+xml\");\n res.setHeader(\"Cache-Control\", \"public, max-age=86400\"); // Cache for 1 day\n res.send(favicon);\n });\n\n // Allow user to customize Express before we register routes\n try {\n this._mcpServerConfig?.httpServer?.configureExpress?.(app);\n } catch (e) {\n // ignore hook errors to avoid breaking server start\n }\n\n const port = transportConfig.port || 3000;\n const path = transportConfig.path || \"/mcp\";\n\n // CORS middleware (optional)\n if (transportConfig.cors) {\n const cors = transportConfig.cors;\n const allowMethods =\n cors.methods?.join(\", \") || \"GET,POST,PUT,PATCH,DELETE,OPTIONS\";\n const allowHeaders = (req: any) =>\n cors.headers?.join(\", \") ||\n req.headers[\"access-control-request-headers\"] ||\n \"Content-Type, Authorization, MCP-Session-Id\";\n const exposed = cors.exposedHeaders?.join(\", \") || undefined;\n\n const resolveOrigin = (req: any): string | undefined => {\n const reqOrigin = req.headers.origin as string | undefined;\n const origins = cors.origins ?? \"*\";\n if (origins === \"*\") return cors.credentials ? reqOrigin : \"*\";\n if (!reqOrigin) return undefined;\n const list = Array.isArray(origins) ? origins : [origins];\n for (const o of list) {\n if (typeof o === \"string\" && o === reqOrigin) return reqOrigin;\n if (o instanceof RegExp && o.test(reqOrigin)) return reqOrigin;\n }\n return undefined;\n };\n\n const applyCorsHeaders = (req: any, res: any) => {\n const origin = resolveOrigin(req);\n if (origin) res.setHeader(\"Access-Control-Allow-Origin\", origin);\n if (cors.credentials)\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n res.setHeader(\"Vary\", \"Origin\");\n res.setHeader(\"Access-Control-Allow-Methods\", allowMethods);\n const hdrs = allowHeaders(req);\n if (hdrs) res.setHeader(\"Access-Control-Allow-Headers\", hdrs);\n if (exposed)\n res.setHeader(\"Access-Control-Expose-Headers\", exposed);\n if (typeof cors.maxAge === \"number\")\n res.setHeader(\"Access-Control-Max-Age\", String(cors.maxAge));\n };\n\n app.options(path, (req: any, res: any) => {\n applyCorsHeaders(req, res);\n res.status(204).end();\n });\n\n app.use((req: any, res: any, next: any) => {\n if (req.path === path) applyCorsHeaders(req, res);\n next();\n });\n }\n\n // Custom auth middleware hook (optional)\n if (transportConfig.auth?.customMiddleware) {\n app.use(transportConfig.auth.customMiddleware);\n }\n\n // Built-in auth (optional)\n const authOpts = transportConfig.auth;\n const shouldRequireAuthFor = (req: any): boolean => {\n if (!authOpts) return false;\n const reqPath = req.path;\n const pub = authOpts.publicPaths || [];\n const prot = authOpts.protectedPaths;\n if (pub.includes(reqPath)) return false;\n if (prot && !prot.includes(reqPath)) return false;\n return authOpts.required !== false; // default true\n };\n\n // Minimal JWT verifier supporting HS256 and RS256\n const base64urlDecode = (s: string) =>\n Buffer.from(s.replace(/-/g, \"+\").replace(/_/g, \"/\"), \"base64\");\n const verifyJwt = async (token: string): Promise<boolean> => {\n if (!authOpts?.jwt) return false;\n const [h, p, sig] = token.split(\".\");\n if (!h || !p || !sig) return false;\n const header = JSON.parse(base64urlDecode(h).toString(\"utf8\"));\n const payload = JSON.parse(base64urlDecode(p).toString(\"utf8\"));\n const alg = header.alg as \"HS256\" | \"RS256\";\n if (\n authOpts.jwt.algorithms &&\n !authOpts.jwt.algorithms.includes(alg)\n )\n return false;\n const data = Buffer.from(`${h}.${p}`);\n const signature = base64urlDecode(sig);\n if (alg === \"HS256\") {\n const secret = authOpts.jwt.secret;\n if (!secret) return false;\n const hmac = (await import(\"node:crypto\"))\n .createHmac(\"sha256\", secret)\n .update(data)\n .digest();\n if (!hmac.equals(signature)) return false;\n } else if (alg === \"RS256\") {\n const crypto = await import(\"node:crypto\");\n let key = authOpts.jwt.publicKey;\n if (!key && authOpts.jwt.getPublicKey) {\n key = await authOpts.jwt.getPublicKey(header, payload);\n }\n if (!key) return false;\n const verify = crypto.createVerify(\"RSA-SHA256\");\n verify.update(data);\n verify.end();\n const ok = verify.verify(key, signature);\n if (!ok) return false;\n } else {\n return false;\n }\n // Optional audience/issuer checks\n if (authOpts.jwt.audience) {\n const allowed = Array.isArray(authOpts.jwt.audience)\n ? authOpts.jwt.audience\n : [authOpts.jwt.audience];\n if (!allowed.includes(payload.aud)) return false;\n }\n if (authOpts.jwt.issuer) {\n const allowed = Array.isArray(authOpts.jwt.issuer)\n ? authOpts.jwt.issuer\n : [authOpts.jwt.issuer];\n if (!allowed.includes(payload.iss)) return false;\n }\n const nowSec = Math.floor(Date.now() / 1000);\n const tol = authOpts.jwt.clockToleranceSec || 0;\n if (payload.nbf && nowSec + tol < payload.nbf) return false;\n if (payload.exp && nowSec - tol >= payload.exp) return false;\n return true;\n };\n\n const authenticate = async (req: any): Promise<boolean> => {\n if (!authOpts) return true;\n const authz = req.headers.authorization as string | undefined;\n const token = authz?.startsWith(\"Bearer \")\n ? authz.slice(7)\n : undefined;\n if (!token) {\n // allow custom validator to decide on missing token\n if (authOpts.validator)\n return !!(await authOpts.validator(req, token));\n return false;\n }\n if (authOpts.scheme === \"jwt\" || authOpts.jwt) {\n const ok = await verifyJwt(token);\n if (!ok) return false;\n } else if (authOpts.scheme === \"bearer\" || !authOpts.scheme) {\n if (\n authOpts.allowedTokens &&\n !authOpts.allowedTokens.includes(token)\n ) {\n // fall through to validator if provided\n if (authOpts.validator)\n return !!(await authOpts.validator(req, token));\n return false;\n }\n }\n if (authOpts.validator) {\n const ok = await authOpts.validator(req, token);\n if (!ok) return false;\n }\n return true;\n };\n\n const transports: { [sessionId: string]: any } = {};\n\n app.all(path, async (req: any, res: any) => {\n if (shouldRequireAuthFor(req)) {\n const ok = await authenticate(req);\n if (!ok) {\n res.status(401).json({ error: \"Unauthorized\" });\n return;\n }\n }\n\n const sessionId = req.headers[\"mcp-session-id\"] as\n | string\n | undefined;\n let transport: any;\n\n if (sessionId && transports[sessionId]) {\n transport = transports[sessionId];\n } else {\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator:\n transportConfig.sessionIdGenerator ||\n (() => Math.random().toString(36).substring(7)),\n onsessioninitialized: (sessionId: string) => {\n transports[sessionId] = transport;\n },\n });\n\n transport.onclose = () => {\n if (transport.sessionId) delete transports[transport.sessionId];\n };\n\n await server.connect(transport);\n }\n\n await transport.handleRequest(req, res, req.body);\n });\n\n await new Promise<void>((resolve) => {\n app.listen(port, transportConfig.host || \"localhost\", () => {\n resolve();\n });\n });\n break;\n }\n\n default:\n logger.mcpError(\n `Unsupported transport type: ${transportConfig.type}`,\n );\n throw new Error(\n `Unsupported transport type: ${transportConfig.type}`,\n );\n }\n\n logger.mcpError(`Successfully started ${transportConfig.type} transport`);\n } catch (error) {\n logger.mcpError(\n `Error starting ${transportConfig.type} transport: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n logger.mcpError(`Stack trace: ${error.stack}`);\n }\n throw error;\n }\n }\n\n public async parse(processArgs?: string[], options?: any): Promise<any> {\n debug.log(\"ArgParser.parse() called with args:\", processArgs);\n // Call the base class parse method directly to avoid any override issues\n debug.log(\"About to call ArgParserBase.prototype.parse.call()\");\n let result = await ArgParserBase.prototype.parse.call(\n this,\n processArgs,\n options,\n );\n debug.log(\"ArgParserBase.prototype.parse.call() returned:\", typeof result);\n\n // If fuzzy mode prevented execution, return the result as-is\n const anyResult = result as any;\n if (anyResult._fuzzyModePreventedExecution) {\n return result;\n }\n\n // Only process async handler promise if deep option is true (default) and ArgParserBase didn't handle it\n // When deep is false, leave _asyncHandlerPromise for manual handling\n const shouldAutoProcess = options?.deep !== false;\n if (shouldAutoProcess && (result as any)._asyncHandlerPromise) {\n result = await this.#processAsyncHandlerPromise(result);\n }\n\n return result;\n }\n\n /**\n * CLI-friendly parse method that automatically handles ParseResult objects\n * When autoExit is false, this method will call process.exit() based on ParseResult\n * This ensures backward compatibility for CLI applications\n */\n public parseForCli(processArgs?: string[], options?: any): any {\n const result = this.parse(processArgs, options);\n\n // Handle ParseResult objects when autoExit is false\n if (\n result &&\n typeof result === \"object\" &&\n \"success\" in result &&\n \"exitCode\" in result\n ) {\n const parseResult = result as ParseResult;\n if (\n parseResult.shouldExit &&\n typeof process === \"object\" &&\n typeof process.exit === \"function\"\n ) {\n process.exit(parseResult.exitCode as never);\n }\n }\n\n return result;\n }\n\n /**\n * Alias for parse() method for backward compatibility\n * Since parse() is already async, this just calls parse()\n *\n * @deprecated Use parse() instead. This method will be removed in a future version.\n */\n public parseAsync(processArgs?: string[], options?: any): Promise<any> {\n return this.parse(processArgs, options);\n }\n\n /**\n * Convenience method for auto-execution: only runs if the script is executed directly (not imported).\n * This eliminates the need for boilerplate code to check if the script is being run directly.\n *\n * @param importMetaUrl Pass import.meta.url from your script for reliable detection\n * @param processArgs Optional arguments to parse (defaults to process.argv.slice(2))\n * @param options Additional parse options\n * @returns Promise that resolves to the parse result, or empty object if script is imported\n *\n * @example\n * ```typescript\n * // At the bottom of your CLI script:\n * await cli.parseIfExecutedDirectly(import.meta.url);\n *\n * // With error handling:\n * await cli.parseIfExecutedDirectly(import.meta.url).catch((error) => {\n * this.logger.error(\"Fatal error:\", error instanceof Error ? error.message : String(error));\n * process.exit(1);\n * });\n * ```\n */\n public async parseIfExecutedDirectly(\n importMetaUrl: string,\n processArgs?: string[],\n options?: any,\n ): Promise<any> {\n return this.parse(processArgs, {\n ...options,\n autoExecute: true,\n importMetaUrl,\n });\n }\n\n async #processAsyncHandlerPromise(result: any): Promise<any> {\n const anyResult = result as any;\n\n // Check if there's an async handler that needs to be awaited\n if (anyResult._asyncHandlerPromise) {\n try {\n const handlerResult = await anyResult._asyncHandlerPromise;\n anyResult.handlerResponse = handlerResult;\n\n // Merge handler result into final args if it's an object\n if (\n handlerResult &&\n typeof handlerResult === \"object\" &&\n !Array.isArray(handlerResult)\n ) {\n Object.assign(anyResult, handlerResult);\n }\n } catch (error) {\n // Handle async handler errors - respect the handleErrors setting\n if ((this as any)[\"#handleErrors\"]) {\n // When handleErrors is true, catch and wrap the error\n anyResult.$error = {\n type: \"handler_error\",\n message: error instanceof Error ? error.message : String(error),\n details: error,\n };\n } else {\n // When handleErrors is false, throw the error (consistent with sync behavior)\n throw error;\n }\n }\n\n // Clean up the async handler info\n delete anyResult._asyncHandlerPromise;\n delete anyResult._asyncHandlerInfo;\n }\n\n return result;\n }\n\n /**\n * Add an MCP sub-command that starts an MCP server exposing this parser's functionality\n * @param subCommandName Name of the sub-command (default: \"mcp-server\")\n * @param serverInfo Server configuration (supports extended DXT fields)\n * @param options Optional configuration including preset transports and tool options\n * @returns This ArgParserWithMcp instance for chaining\n * @deprecated Use withMcp() to configure server metadata and --s-mcp-serve system flag instead. This method will be removed in v2.0.\n */\n public addMcpSubCommand(\n subCommandName: string | undefined,\n serverInfo: DxtServerInfo,\n options?: McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions },\n ): this;\n\n /**\n * Add an MCP sub-command that starts an MCP server exposing this parser's functionality\n * @param subCommandName Name of the sub-command (default: \"mcp-server\")\n * @param serverInfo Server configuration (supports extended DXT fields)\n * @param toolOptions Optional MCP tool generation options (backward compatibility)\n * @returns This ArgParserWithMcp instance for chaining\n * @deprecated Use withMcp() to configure server metadata and --s-mcp-serve system flag instead. This method will be removed in v2.0.\n */\n public addMcpSubCommand(\n subCommandName: string | undefined,\n serverInfo: DxtServerInfo,\n toolOptions?: GenerateMcpToolsOptions,\n ): this;\n\n public addMcpSubCommand(\n subCommandName: string | undefined = \"mcp-server\",\n serverInfo: DxtServerInfo,\n optionsOrToolOptions?:\n | (McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions })\n | GenerateMcpToolsOptions,\n ): this {\n // Emit deprecation warning\n console.warn(`[DEPRECATED] addMcpSubCommand() is deprecated and will be removed in v2.0.\nPlease use withMcp() to configure server metadata and the --s-mcp-serve system flag instead.\nMigration guide: https://github.com/alcyone-labs/arg-parser/blob/main/docs/MCP-MIGRATION.md`);\n\n // Handle backward compatibility: if the third parameter is a GenerateMcpToolsOptions object\n // (detected by checking if it has properties that only exist in GenerateMcpToolsOptions)\n let options: McpSubCommandOptions & {\n toolOptions?: GenerateMcpToolsOptions;\n };\n\n if (\n optionsOrToolOptions &&\n typeof optionsOrToolOptions === \"object\" &&\n (\"includeSubCommands\" in optionsOrToolOptions ||\n \"toolNamePrefix\" in optionsOrToolOptions ||\n \"toolNameSuffix\" in optionsOrToolOptions)\n ) {\n // This is the old GenerateMcpToolsOptions format\n options = {\n toolOptions: optionsOrToolOptions as GenerateMcpToolsOptions,\n };\n } else {\n // This is the new options format or undefined\n options =\n (optionsOrToolOptions as McpSubCommandOptions & {\n toolOptions?: GenerateMcpToolsOptions;\n }) || {};\n }\n\n const { defaultTransports, defaultTransport, toolOptions } = options;\n\n // Store server configuration for backward compatibility with --s-mcp-serve\n if (!this._mcpServerConfig) {\n this._mcpServerConfig = {\n serverInfo,\n defaultTransports,\n defaultTransport,\n toolOptions,\n };\n }\n\n const mcpHandler = async (ctx: IHandlerContext): Promise<void> => {\n // Hijack console globally to prevent STDOUT contamination in MCP mode\n // TODO: upgrade to options-based API\n const logger = createMcpLogger(\"MCP Handler\");\n // Ensure the logger is properly cast as Console interface\n (globalThis as any).console = logger;\n\n try {\n logger.mcpError(\n \"MCP handler started - console hijacked for MCP safety\",\n );\n logger.mcpError(`Handler context args: ${JSON.stringify(ctx.args)}`);\n\n if (!ctx.parentParser) {\n logger.mcpError(\n \"Critical: MCP server handler called without a parent parser context.\",\n );\n process.exit(1);\n }\n\n logger.mcpError(\"Parent parser found, casting to ArgParser\");\n // Cast parent parser to ArgParser to access MCP methods\n const mcpParser = ctx.parentParser as ArgParser;\n\n // Check if multiple transports are specified via CLI\n logger.mcpError(\"Checking transport configuration\");\n const transports = ctx.args[\"transports\"] as string;\n\n if (transports) {\n logger.mcpError(\n `Multiple transports specified via CLI: ${transports}`,\n );\n // Parse multiple transports configuration from CLI\n try {\n const transportConfigs = JSON.parse(transports);\n logger.mcpError(\n `Parsed transport configs: ${JSON.stringify(transportConfigs)}`,\n );\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n transportConfigs,\n toolOptions,\n );\n } catch (error: any) {\n logger.mcpError(\n `Error parsing transports configuration: ${error.message}`,\n );\n logger.mcpError(\n 'Expected JSON format: \\'[{\"type\":\"stdio\"},{\"type\":\"sse\",\"port\":3001}]\\'',\n );\n process.exit(1);\n }\n } else if (defaultTransports && defaultTransports.length > 0) {\n logger.mcpError(\n `Using preset multiple transports: ${JSON.stringify(defaultTransports)}`,\n );\n // Use preset multiple transports configuration\n await mcpParser.startMcpServerWithMultipleTransports(\n serverInfo,\n defaultTransports,\n toolOptions,\n );\n } else if (defaultTransport) {\n logger.mcpError(\n `Using preset single transport: ${JSON.stringify(defaultTransport)}`,\n );\n // Use preset single transport configuration\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n defaultTransport.type,\n {\n port: defaultTransport.port,\n host: defaultTransport.host,\n path: defaultTransport.path,\n sessionIdGenerator: defaultTransport.sessionIdGenerator,\n },\n toolOptions,\n );\n } else {\n // Single transport mode from CLI flags (backwards compatibility)\n const transportType =\n (ctx.args[\"transport\"] as \"stdio\" | \"sse\" | \"streamable-http\") ||\n \"stdio\";\n const transportOptions = {\n port: ctx.args[\"port\"] as number,\n host: ctx.args[\"host\"] as string,\n path: ctx.args[\"path\"] as string,\n };\n\n logger.mcpError(\n `Using single transport mode: ${transportType} with options: ${JSON.stringify(transportOptions)}`,\n );\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n transportType,\n transportOptions,\n toolOptions,\n );\n }\n\n logger.mcpError(\"MCP server setup completed, keeping process alive\");\n // Keep the process alive\n return new Promise(() => {});\n } catch (error) {\n logger.mcpError(\n `Error in MCP handler: ${error instanceof Error ? error.message : String(error)}`,\n );\n if (error instanceof Error && error.stack) {\n logger.mcpError(`Stack trace: ${error.stack}`);\n }\n process.exit(1);\n }\n };\n\n // Create sub-command parser without transport options (now handled as system flags)\n const mcpSubParser = new ArgParserBase({}, []);\n\n this.addSubCommand({\n name: subCommandName,\n description: `Start ${serverInfo.name} as an MCP server`,\n handler: mcpHandler,\n parser: mcpSubParser,\n isMcp: true,\n mcpServerInfo: serverInfo,\n mcpToolOptions: toolOptions,\n });\n\n return this;\n }\n\n /**\n * Factory method to create an ArgParser instance with MCP capabilities\n * This provides a clean API for users who want MCP functionality from the start\n * Automatically sets handleErrors: false for MCP compatibility\n *\n * @param options Combined ArgParser and MCP server configuration options\n * @param initialFlags Optional array of initial flags to add\n * @returns ArgParser instance with MCP capabilities and stored server metadata\n */\n public static withMcp<T = any>(\n options?: WithMcpOptions<T>,\n initialFlags?: readonly IFlag[],\n ): ArgParser<T> {\n // Extract MCP-specific options\n const { mcp: mcpConfig, ...argParserOptions } = options || {};\n\n // Ensure handleErrors is false for MCP compatibility unless explicitly overridden\n const mcpOptions = {\n handleErrors: false,\n ...argParserOptions,\n };\n\n const parser = new ArgParser<T>(mcpOptions as any, initialFlags);\n\n // Store MCP server configuration for later use\n if (mcpConfig) {\n (parser as any)._mcpServerConfig = mcpConfig;\n }\n\n return parser;\n }\n\n /**\n * Create an ArgParser instance optimized for CLI usage\n * This sets autoExit: true by default for traditional CLI behavior\n */\n public static forCli<T = any>(\n options?: ConstructorParameters<typeof ArgParserBase>[0],\n initialFlags?: ConstructorParameters<typeof ArgParserBase>[1],\n ): ArgParser<T> {\n const cliOptions = {\n autoExit: true,\n handleErrors: true,\n ...options,\n };\n return new ArgParser<T>(cliOptions as any, initialFlags);\n }\n\n /**\n * Create an ArgParser instance optimized for library usage\n * This sets autoExit: false by default for programmatic control\n */\n public static forLibrary<T = any>(\n options?: ConstructorParameters<typeof ArgParserBase>[0],\n initialFlags?: ConstructorParameters<typeof ArgParserBase>[1],\n ): ArgParser<T> {\n const libraryOptions = {\n autoExit: false,\n handleErrors: false,\n ...options,\n };\n return new ArgParser<T>(libraryOptions as any, initialFlags);\n }\n\n public static fromArgParser<T = any>(parser: ArgParserBase<T>): ArgParser<T> {\n const originalParser = parser as any;\n\n const mcpParser = new ArgParser<T>({\n appName: originalParser.getAppName(),\n appCommandName: originalParser.getAppCommandName(),\n description: originalParser.getDescription(),\n handler: originalParser.getHandler(),\n handleErrors: originalParser[\"#handleErrors\"],\n throwForDuplicateFlags: originalParser[\"#throwForDuplicateFlags\"],\n });\n\n // Copy flags from original parser (excluding help flag which is auto-added)\n const originalFlags = originalParser.flags.filter(\n (flag: any) => flag.name !== \"help\",\n );\n if (originalFlags.length > 0) {\n mcpParser.addFlags(originalFlags);\n }\n\n // Copy additional private fields that aren't in constructor options\n const newParser = mcpParser as any;\n newParser[\"#subCommandName\"] = originalParser[\"#subCommandName\"];\n newParser[\"#parameters\"] = originalParser[\"#parameters\"];\n newParser[\"#parentParser\"] = originalParser[\"#parentParser\"];\n newParser[\"#lastParseResult\"] = originalParser[\"#lastParseResult\"];\n newParser[\"#inheritParentFlags\"] = originalParser[\"#inheritParentFlags\"];\n newParser[\"#subCommands\"] = originalParser[\"#subCommands\"];\n\n return mcpParser;\n }\n}\n","import { ArgParser } from \"../core/ArgParser\";\nimport type { IArgParserParams } from \"../core/ArgParserBase\";\nimport type { IFlag } from \"../core/types\";\n\n/**\n * MCP-optimized ArgParser that excludes config file functionality\n * This version doesn't load any config plugins, making it suitable for\n * autonomous builds where TOML/YAML dependencies cause bundling issues.\n */\nexport class ArgParserMcp<\n THandlerReturn = any,\n> extends ArgParser<THandlerReturn> {\n constructor(\n params?: IArgParserParams<THandlerReturn>,\n initialFlags?: IFlag[],\n ) {\n // Set a flag to indicate this is MCP mode (no config plugins)\n const mcpParams = {\n ...params,\n _mcpMode: true, // Internal flag to disable config functionality\n };\n super(mcpParams as any, initialFlags);\n }\n\n /**\n * Override parse to skip config file processing\n */\n public parse(processArgs: string[], options?: any): any {\n // Filter out config-related system flags before parsing\n const filteredArgs = processArgs.filter(\n (arg) =>\n !arg.startsWith(\"--s-with-env\") &&\n !arg.startsWith(\"--s-save-to-env\") &&\n !arg.startsWith(\"--s-load-env\"),\n );\n\n return super.parse(filteredArgs, options);\n }\n}\n\n/**\n * Convenience function to create MCP-optimized ArgParser\n * This is the recommended way to create ArgParser instances for MCP servers\n */\nexport function createMcpArgParser<THandlerReturn = any>(\n params?: IArgParserParams<THandlerReturn>,\n initialFlags?: IFlag[],\n): ArgParserMcp<THandlerReturn> {\n return ArgParserMcp.withMcp(params, initialFlags);\n}\n","import { ConfigPlugin } from \"./ConfigPlugin\";\n\n/**\n * TOML configuration plugin (requires smol-toml dependency)\n * This plugin is optional and only loaded when TOML support is needed\n */\nexport class TomlConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".toml\", \".tml\"];\n readonly name = \"toml\";\n\n private tomlModule: any = null;\n\n constructor(tomlModule?: any) {\n super();\n if (tomlModule) {\n this.tomlModule = tomlModule;\n } else {\n this.loadTomlModule();\n }\n }\n\n private loadTomlModule(): void {\n try {\n // Dynamic import to avoid bundling issues\n if (typeof require !== \"undefined\") {\n this.tomlModule = require(\"smol-toml\");\n } else {\n // For ESM environments, we need to use dynamic import\n // This will be handled asynchronously in the factory function\n throw new Error(\"TOML module not available in this environment\");\n }\n } catch (error) {\n throw new Error(\n \"TOML plugin requires smol-toml dependency. \" +\n \"Install it with: npm install smol-toml\",\n );\n }\n }\n\n parse(content: string): Record<string, any> {\n if (!this.tomlModule) {\n // Fallback to simple parsing if module not available\n return this.parseTomlSimple(content);\n }\n\n try {\n const parsed = this.tomlModule.parse(content);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"TOML file must contain an object at the root level\");\n }\n return parsed;\n } catch (error) {\n throw new Error(\n `Failed to parse TOML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration generated by ArgParser\");\n lines.push(\"# Format: TOML\");\n lines.push(\"\");\n\n const configWithValues: Record<string, any> = {};\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n lines.push(`# ${flag.description || flag.name}`);\n lines.push(`# Type: ${this.getTypeString(flag.type)}`);\n\n if (flag.defaultValue !== undefined) {\n lines.push(`# Default: ${flag.defaultValue}`);\n }\n\n if (isSet) {\n configWithValues[flag.name] = flagValue;\n } else if (isMandatory) {\n configWithValues[flag.name] =\n flag.defaultValue !== undefined ? flag.defaultValue : null;\n }\n\n lines.push(\"\");\n }\n\n if (!this.tomlModule) {\n // Simple TOML generation if module not available\n for (const [key, value] of Object.entries(configWithValues)) {\n if (typeof value === \"string\") {\n lines.push(`${key} = \"${value}\"`);\n } else {\n lines.push(`${key} = ${JSON.stringify(value)}`);\n }\n }\n return lines.join(\"\\n\");\n }\n\n try {\n const tomlContent = this.tomlModule.stringify(configWithValues);\n return lines.join(\"\\n\") + \"\\n\" + tomlContent;\n } catch (error) {\n throw new Error(\n `Failed to generate TOML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Simple TOML parsing fallback for basic key-value pairs\n */\n private parseTomlSimple(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const equalIndex = trimmed.indexOf(\"=\");\n if (equalIndex > 0) {\n const key = trimmed.substring(0, equalIndex).trim();\n let value = trimmed.substring(equalIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n\n private getTypeString(type: any): string {\n if (typeof type === \"function\") {\n return type.name || \"custom function\";\n }\n return String(type).toLowerCase();\n }\n}\n\n/**\n * Factory function to create TOML plugin safely\n * Returns null if TOML dependency is not available\n */\nexport function createTomlPlugin(): TomlConfigPlugin | null {\n try {\n return new TomlConfigPlugin();\n } catch (error) {\n console.warn(\n \"TOML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n\n/**\n * Async factory function to create TOML plugin with ESM support\n * Returns null if TOML dependency is not available\n */\nexport async function createTomlPluginAsync(): Promise<TomlConfigPlugin | null> {\n try {\n // Try CommonJS first\n if (typeof require !== \"undefined\") {\n try {\n const tomlModule = require(\"smol-toml\");\n return new TomlConfigPlugin(tomlModule);\n } catch (error) {\n // Fall through to ESM import\n }\n }\n\n // Try ESM dynamic import\n const tomlModule = await import(\"smol-toml\");\n return new TomlConfigPlugin(tomlModule);\n } catch (error) {\n console.warn(\n \"TOML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n","import { ConfigPlugin } from \"./ConfigPlugin\";\n\n/**\n * YAML configuration plugin (requires js-yaml dependency)\n * This plugin is optional and only loaded when YAML support is needed\n */\nexport class YamlConfigPlugin extends ConfigPlugin {\n readonly supportedExtensions = [\".yaml\", \".yml\"];\n readonly name = \"yaml\";\n\n private yamlModule: any = null;\n\n constructor(yamlModule?: any) {\n super();\n if (yamlModule) {\n this.yamlModule = yamlModule;\n } else {\n this.loadYamlModule();\n }\n }\n\n private loadYamlModule(): void {\n try {\n // Dynamic import to avoid bundling issues\n if (typeof require !== \"undefined\") {\n this.yamlModule = require(\"js-yaml\");\n } else {\n throw new Error(\"YAML module not available in this environment\");\n }\n } catch (error) {\n throw new Error(\n \"YAML plugin requires js-yaml dependency. \" +\n \"Install it with: npm install js-yaml\",\n );\n }\n }\n\n parse(content: string): Record<string, any> {\n if (!this.yamlModule) {\n // Fallback to simple parsing if module not available\n return this.parseYamlSimple(content);\n }\n\n try {\n const parsed = this.yamlModule.load(content);\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"YAML file must contain an object at the root level\");\n }\n return parsed;\n } catch (error) {\n throw new Error(\n `Failed to parse YAML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n generate(\n _config: Record<string, any>,\n flags: any[],\n parsedArgs: any,\n ): string {\n const lines: string[] = [];\n lines.push(\"# Environment configuration generated by ArgParser\");\n lines.push(\"# Format: YAML\");\n lines.push(\"\");\n\n const configWithValues: Record<string, any> = {};\n\n for (const flag of flags) {\n if (flag.name === \"help\") continue;\n\n const flagValue = parsedArgs[flag.name];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = flag.mandatory === true;\n\n if (isSet) {\n configWithValues[flag.name] = flagValue;\n } else if (isMandatory) {\n configWithValues[flag.name] =\n flag.defaultValue !== undefined ? flag.defaultValue : null;\n }\n }\n\n if (!this.yamlModule) {\n // Simple YAML generation if module not available\n for (const [key, value] of Object.entries(configWithValues)) {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n return lines.join(\"\\n\");\n }\n\n try {\n const yamlContent = this.yamlModule.dump(configWithValues, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n });\n return lines.join(\"\\n\") + \"\\n\" + yamlContent;\n } catch (error) {\n throw new Error(\n `Failed to generate YAML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n /**\n * Simple YAML parsing fallback for basic key-value pairs\n */\n private parseYamlSimple(content: string): Record<string, any> {\n const config: Record<string, any> = {};\n const lines = content.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\")) {\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > 0) {\n const key = trimmed.substring(0, colonIndex).trim();\n let value = trimmed.substring(colonIndex + 1).trim();\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n config[key] = value;\n }\n }\n }\n\n return config;\n }\n}\n\n/**\n * Factory function to create YAML plugin safely\n * Returns null if YAML dependency is not available\n */\nexport function createYamlPlugin(): YamlConfigPlugin | null {\n try {\n return new YamlConfigPlugin();\n } catch (error) {\n console.warn(\n \"YAML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n\n/**\n * Async factory function to create YAML plugin with ESM support\n * Returns null if YAML dependency is not available\n */\nexport async function createYamlPluginAsync(): Promise<YamlConfigPlugin | null> {\n try {\n // Try CommonJS first\n if (typeof require !== \"undefined\") {\n try {\n const yamlModule = require(\"js-yaml\");\n return new YamlConfigPlugin(yamlModule);\n } catch (error) {\n // Fall through to ESM import\n }\n }\n\n // Try ESM dynamic import\n const yamlModule = await import(\"js-yaml\");\n return new YamlConfigPlugin(yamlModule);\n } catch (error) {\n console.warn(\n \"YAML plugin not available:\",\n error instanceof Error ? error.message : String(error),\n );\n return null;\n }\n}\n","import type { IArgParser, ISubCommand, ProcessedFlag } from \"../core/types\";\n\nexport interface FuzzyTestOptions {\n /** Maximum depth for command path exploration */\n maxDepth?: number;\n /** Number of random test cases to generate per command path */\n randomTestCases?: number;\n /** Include performance timing in results */\n includePerformance?: boolean;\n /** Test invalid combinations to verify error handling */\n testErrorCases?: boolean;\n /** Verbose output for debugging */\n verbose?: boolean;\n}\n\nexport interface TestResult {\n commandPath: string[];\n args: string[];\n success: boolean;\n error?: string;\n executionTime?: number;\n parsedResult?: any;\n}\n\nexport interface FuzzyTestReport {\n totalTests: number;\n successfulTests: number;\n failedTests: number;\n commandPaths: string[][];\n results: TestResult[];\n summary: {\n coverageByPath: Record<string, { total: number; passed: number }>;\n errorTypes: Record<string, number>;\n };\n}\n\nexport class ArgParserFuzzyTester {\n private parser: IArgParser;\n private options: Required<FuzzyTestOptions>;\n\n constructor(parser: IArgParser, options: FuzzyTestOptions = {}) {\n this.parser = parser;\n this.options = {\n maxDepth: options.maxDepth ?? 5,\n randomTestCases: options.randomTestCases ?? 10,\n includePerformance: options.includePerformance ?? true,\n testErrorCases: options.testErrorCases ?? true,\n verbose: options.verbose ?? false,\n };\n }\n\n /**\n * Run comprehensive fuzzy testing on the ArgParser instance\n */\n async runFuzzyTest(): Promise<FuzzyTestReport> {\n const commandPaths = this.discoverCommandPaths();\n const results: TestResult[] = [];\n\n if (this.options.verbose) {\n this.parser.logger.info(\n `Discovered ${commandPaths.length} command paths:`,\n );\n commandPaths.forEach((path) =>\n this.parser.logger.info(` ${path.join(\" \") || \"(root)\"}`),\n );\n }\n\n for (const commandPath of commandPaths) {\n const pathResults = await this.testCommandPath(commandPath);\n results.push(...pathResults);\n }\n\n return this.generateReport(commandPaths, results);\n }\n\n /**\n * Discover all possible command paths in the parser\n */\n private discoverCommandPaths(): string[][] {\n const paths: string[][] = [];\n\n // Add root path\n paths.push([]);\n\n // Recursively discover subcommand paths\n this.discoverSubCommandPaths(this.parser, [], paths, 0);\n\n return paths;\n }\n\n /**\n * Recursively discover subcommand paths\n */\n private discoverSubCommandPaths(\n parser: IArgParser,\n currentPath: string[],\n allPaths: string[][],\n depth: number,\n ): void {\n if (depth >= this.options.maxDepth) return;\n\n const subCommands = this.getSubCommands(parser);\n\n for (const [subCommandName, subCommand] of subCommands) {\n const newPath = [...currentPath, subCommandName];\n allPaths.push(newPath);\n\n // Recursively explore this subcommand's subcommands\n this.discoverSubCommandPaths(\n subCommand.parser,\n newPath,\n allPaths,\n depth + 1,\n );\n }\n }\n\n /**\n * Get subcommands from a parser instance\n */\n private getSubCommands(parser: IArgParser): Map<string, ISubCommand> {\n return parser.getSubCommands();\n }\n\n /**\n * Get flags from a parser instance\n */\n private getFlags(parser: IArgParser): ProcessedFlag[] {\n return parser.flags;\n }\n\n /**\n * Test a specific command path with various flag combinations\n */\n private async testCommandPath(commandPath: string[]): Promise<TestResult[]> {\n const results: TestResult[] = [];\n const targetParser = this.getParserForPath(commandPath);\n const flags = this.getFlags(targetParser);\n\n if (this.options.verbose) {\n this.parser.logger.info(\n `Testing command path: ${commandPath.join(\" \") || \"(root)\"}`,\n );\n }\n\n // Test valid combinations\n const validCombinations = this.generateValidFlagCombinations(flags);\n for (const flagArgs of validCombinations) {\n const fullArgs = [...commandPath, ...flagArgs];\n const result = await this.executeTest(fullArgs, commandPath);\n results.push(result);\n }\n\n // Test random combinations\n for (let i = 0; i < this.options.randomTestCases; i++) {\n const randomArgs = this.generateRandomFlagCombination(flags);\n const fullArgs = [...commandPath, ...randomArgs];\n const result = await this.executeTest(fullArgs, commandPath);\n results.push(result);\n }\n\n // Test error cases if enabled\n if (this.options.testErrorCases) {\n const errorCases = this.generateErrorCases(flags);\n for (const errorArgs of errorCases) {\n const fullArgs = [...commandPath, ...errorArgs];\n const result = await this.executeTest(fullArgs, commandPath, true);\n results.push(result);\n }\n }\n\n return results;\n }\n\n /**\n * Get the parser instance for a specific command path\n */\n private getParserForPath(commandPath: string[]): IArgParser {\n let currentParser = this.parser;\n\n for (const command of commandPath) {\n const subCommands = this.getSubCommands(currentParser);\n const subCommand = subCommands.get(command);\n if (!subCommand) {\n throw new Error(`Command path not found: ${commandPath.join(\" \")}`);\n }\n currentParser = subCommand.parser;\n }\n\n return currentParser;\n }\n\n /**\n * Generate valid flag combinations for testing\n */\n private generateValidFlagCombinations(flags: ProcessedFlag[]): string[][] {\n const combinations: string[][] = [];\n\n // Separate mandatory and optional flags\n const mandatoryFlags = flags.filter(\n (f) =>\n f[\"name\"] !== \"help\" &&\n (typeof f[\"mandatory\"] === \"boolean\" ? f[\"mandatory\"] : false),\n );\n const optionalFlags = flags.filter(\n (f) =>\n f[\"name\"] !== \"help\" &&\n (typeof f[\"mandatory\"] === \"boolean\" ? !f[\"mandatory\"] : true),\n );\n\n // Generate base combination with all mandatory flags\n const mandatoryArgs: string[] = [];\n for (const flag of mandatoryFlags) {\n const flagArgs = this.generateFlagArgs(flag, \"valid\");\n mandatoryArgs.push(...flagArgs);\n }\n\n // Test with just mandatory flags\n if (mandatoryArgs.length > 0) {\n combinations.push([...mandatoryArgs]);\n } else {\n // Test with no flags if no mandatory flags exist\n combinations.push([]);\n }\n\n // Test each optional flag individually (with mandatory flags)\n for (const flag of optionalFlags) {\n const flagArgs = this.generateFlagArgs(flag, \"valid\");\n if (flagArgs.length > 0) {\n combinations.push([...mandatoryArgs, ...flagArgs]);\n }\n }\n\n // Test combinations of optional flags (with mandatory flags)\n if (optionalFlags.length > 1) {\n // Test pairs of optional flags\n for (let i = 0; i < optionalFlags.length - 1; i++) {\n for (let j = i + 1; j < optionalFlags.length; j++) {\n const flag1Args = this.generateFlagArgs(optionalFlags[i], \"valid\");\n const flag2Args = this.generateFlagArgs(optionalFlags[j], \"valid\");\n if (flag1Args.length > 0 && flag2Args.length > 0) {\n combinations.push([...mandatoryArgs, ...flag1Args, ...flag2Args]);\n }\n }\n }\n }\n\n return combinations;\n }\n\n /**\n * Generate random flag combination\n */\n private generateRandomFlagCombination(flags: ProcessedFlag[]): string[] {\n const args: string[] = [];\n const availableFlags = flags.filter((f) => f[\"name\"] !== \"help\");\n\n // Randomly select flags to include\n for (const flag of availableFlags) {\n if (Math.random() < 0.3) {\n // 30% chance to include each flag\n const flagArgs = this.generateFlagArgs(flag, \"random\");\n args.push(...flagArgs);\n }\n }\n\n return args;\n }\n\n /**\n * Generate error test cases\n */\n private generateErrorCases(flags: ProcessedFlag[]): string[][] {\n const errorCases: string[][] = [];\n\n // Test invalid flag names\n errorCases.push([\"--invalid-flag\"]);\n errorCases.push([\"--nonexistent\", \"value\"]);\n\n // Test flags with wrong types\n for (const flag of flags) {\n if (flag[\"name\"] === \"help\") continue;\n\n const invalidArgs = this.generateFlagArgs(flag, \"invalid\");\n if (invalidArgs.length > 0) {\n errorCases.push(invalidArgs);\n }\n }\n\n return errorCases;\n }\n\n /**\n * Generate arguments for a specific flag\n */\n private generateFlagArgs(\n flag: ProcessedFlag,\n mode: \"valid\" | \"invalid\" | \"random\",\n ): string[] {\n const option = flag[\"options\"][0]; // Use first option\n if (!option) return [];\n\n if (flag[\"flagOnly\"]) {\n return [option];\n }\n\n const values = this.generateFlagValues(flag, mode);\n const args: string[] = [];\n\n for (const value of values) {\n if (flag[\"allowLigature\"] && Math.random() < 0.5) {\n args.push(`${option}=${value}`);\n } else {\n args.push(option, value);\n }\n }\n\n return args;\n }\n\n /**\n * Generate values for a flag based on its type and constraints\n */\n private generateFlagValues(\n flag: ProcessedFlag,\n mode: \"valid\" | \"invalid\" | \"random\",\n ): string[] {\n const count =\n flag[\"allowMultiple\"] && mode !== \"invalid\"\n ? Math.floor(Math.random() * 3) + 1\n : 1;\n\n const values: string[] = [];\n\n for (let i = 0; i < count; i++) {\n values.push(this.generateSingleFlagValue(flag, mode));\n }\n\n return values;\n }\n\n /**\n * Generate a single value for a flag\n */\n private generateSingleFlagValue(\n flag: ProcessedFlag,\n mode: \"valid\" | \"invalid\" | \"random\",\n ): string {\n if (mode === \"invalid\") {\n // Generate intentionally invalid values\n if (flag[\"type\"] === Number) return \"not-a-number\";\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) return \"invalid-enum-value\";\n if (flag[\"type\"] === Boolean) return \"not-boolean\";\n return \"invalid-value\";\n }\n\n // Handle enum values\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n const randomIndex = Math.floor(Math.random() * flag[\"enum\"].length);\n return String(flag[\"enum\"][randomIndex]);\n }\n\n // Generate values based on type\n if (flag[\"type\"] === Number) {\n return String(Math.floor(Math.random() * 1000));\n }\n\n if (flag[\"type\"] === Boolean) {\n return Math.random() < 0.5 ? \"true\" : \"false\";\n }\n\n // Default to string\n const testStrings = [\n \"test-value\",\n \"hello-world\",\n \"file.txt\",\n \"/path/to/file\",\n \"user@example.com\",\n \"123\",\n \"special-chars-!@#\",\n ];\n\n return testStrings[Math.floor(Math.random() * testStrings.length)];\n }\n\n /**\n * Execute a single test case\n */\n private async executeTest(\n args: string[],\n commandPath: string[],\n expectError: boolean = false,\n ): Promise<TestResult> {\n const startTime = this.options.includePerformance ? Date.now() : 0;\n\n try {\n // Store the original input arguments for logging visibility\n const originalArgs = [...args];\n\n const testResult = this.parser.parse(args, {\n skipHelpHandling: true,\n });\n\n // Store original args in the result for logging\n if (testResult && typeof testResult === \"object\") {\n (testResult as any)._originalInputArgs = originalArgs;\n }\n\n const executionTime = this.options.includePerformance\n ? Date.now() - startTime\n : undefined;\n\n return {\n commandPath,\n args,\n success: !expectError,\n parsedResult: testResult,\n executionTime,\n };\n } catch (error) {\n const executionTime = this.options.includePerformance\n ? Date.now() - startTime\n : undefined;\n\n return {\n commandPath,\n args,\n success: expectError,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n };\n }\n }\n\n /**\n * Generate comprehensive test report\n */\n private generateReport(\n commandPaths: string[][],\n results: TestResult[],\n ): FuzzyTestReport {\n const totalTests = results.length;\n const successfulTests = results.filter((r) => r.success).length;\n const failedTests = totalTests - successfulTests;\n\n // Coverage by path\n const coverageByPath: Record<string, { total: number; passed: number }> =\n {};\n for (const path of commandPaths) {\n const pathKey = path.join(\" \") || \"(root)\";\n const pathResults = results.filter(\n (r) => JSON.stringify(r.commandPath) === JSON.stringify(path),\n );\n coverageByPath[pathKey] = {\n total: pathResults.length,\n passed: pathResults.filter((r) => r.success).length,\n };\n }\n\n // Error types\n const errorTypes: Record<string, number> = {};\n for (const result of results) {\n if (result.error) {\n const errorType = result.error.split(\":\")[0] || \"Unknown\";\n errorTypes[errorType] = (errorTypes[errorType] || 0) + 1;\n }\n }\n\n return {\n totalTests,\n successfulTests,\n failedTests,\n commandPaths,\n results,\n summary: {\n coverageByPath,\n errorTypes,\n },\n };\n }\n}\n","/**\n * MCP Lifecycle Events System\n *\n * This module provides lifecycle event hooks for MCP servers, allowing applications\n * to perform initialization, cleanup, and other lifecycle-related operations at\n * specific points in the MCP protocol flow.\n */\n\n/**\n * Base context interface shared by all lifecycle events\n */\nexport interface McpLifecycleBaseContext {\n /** Get a parsed flag value by name */\n getFlag(name: string): any;\n /** MCP logger instance for this context */\n logger: any;\n /** Server information */\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n };\n}\n\n/**\n * Context provided during the MCP initialize request\n * This is called when a client sends the \"initialize\" request\n */\nexport interface McpInitializeContext extends McpLifecycleBaseContext {\n /** Client information from the initialize request */\n clientInfo: {\n name: string;\n version: string;\n title?: string;\n };\n /** Protocol version being used */\n protocolVersion: string;\n /** Client capabilities */\n clientCapabilities: Record<string, any>;\n}\n\n/**\n * Context provided after the MCP initialized notification\n * This is called when a client sends the \"initialized\" notification\n */\nexport interface McpInitializedContext extends McpLifecycleBaseContext {\n /** Client information from the previous initialize request */\n clientInfo: {\n name: string;\n version: string;\n title?: string;\n };\n /** Protocol version being used */\n protocolVersion: string;\n}\n\n/**\n * Context provided during server shutdown\n * This is called when the MCP server is being shut down\n */\nexport interface McpShutdownContext extends McpLifecycleBaseContext {\n /** Reason for shutdown */\n reason: \"client_disconnect\" | \"server_shutdown\" | \"error\" | \"signal\";\n /** Optional error if shutdown was due to an error */\n error?: Error;\n}\n\n/**\n * Lifecycle event handlers interface\n */\nexport interface McpLifecycleEvents {\n /**\n * Called when a client sends an \"initialize\" request\n * This is the first lifecycle event and is ideal for:\n * - Database connection setup\n * - Resource initialization\n * - Configuration validation\n * - Authentication setup\n */\n onInitialize?: (context: McpInitializeContext) => Promise<void>;\n\n /**\n * Called when a client sends an \"initialized\" notification\n * This indicates the client is ready for normal operations\n * This is ideal for:\n * - Final setup steps\n * - Background task initialization\n * - Health checks\n */\n onInitialized?: (context: McpInitializedContext) => Promise<void>;\n\n /**\n * Called when the MCP server is shutting down\n * This is ideal for:\n * - Database connection cleanup\n * - Resource disposal\n * - Graceful shutdown procedures\n */\n onShutdown?: (context: McpShutdownContext) => Promise<void>;\n}\n\n/**\n * Internal state tracking for lifecycle events\n */\nexport interface McpLifecycleState {\n /** Whether the initialize event has been called */\n initialized: boolean;\n /** Whether the initialized event has been called */\n ready: boolean;\n /** Whether shutdown has been initiated */\n shuttingDown: boolean;\n /** Stored client info from initialize */\n clientInfo?: {\n name: string;\n version: string;\n title?: string;\n };\n /** Protocol version being used */\n protocolVersion?: string;\n /** Client capabilities */\n clientCapabilities?: Record<string, any>;\n}\n\n/**\n * Lifecycle manager class for handling MCP lifecycle events\n */\nexport class McpLifecycleManager {\n private state: McpLifecycleState = {\n initialized: false,\n ready: false,\n shuttingDown: false,\n };\n\n private parsedArgs: any = {};\n\n constructor(\n private events: McpLifecycleEvents,\n private logger: any,\n private serverInfo: { name: string; version: string; description?: string },\n private argParser?: any,\n ) {}\n\n /**\n * Set the parsed arguments for flag access\n */\n setParsedArgs(parsedArgs: any): void {\n this.parsedArgs = parsedArgs;\n }\n\n /**\n * Get a flag value from parsed arguments or environment variables\n */\n private getFlag(name: string): any {\n // First try parsed arguments if available\n if (this.parsedArgs && this.parsedArgs[name] !== undefined) {\n return this.parsedArgs[name];\n }\n\n // Fall back to environment variables if arg parser is available\n if (this.argParser) {\n const flagDef = this.argParser.getFlagDefinition(name);\n if (flagDef) {\n // Try environment variable\n if (flagDef.env && process.env[flagDef.env]) {\n return process.env[flagDef.env];\n }\n // Fall back to default value\n return flagDef.defaultValue;\n }\n }\n\n return undefined;\n }\n\n /**\n * Handle the initialize request\n */\n async handleInitialize(\n clientInfo: { name: string; version: string; title?: string },\n protocolVersion: string,\n clientCapabilities: Record<string, any>,\n ): Promise<void> {\n if (this.state.initialized) {\n this.logger.mcpError(\"Initialize called multiple times\");\n return;\n }\n\n this.state.clientInfo = clientInfo;\n this.state.protocolVersion = protocolVersion;\n this.state.clientCapabilities = clientCapabilities;\n this.state.initialized = true;\n\n if (this.events.onInitialize) {\n const context: McpInitializeContext = {\n getFlag: (name: string) => this.getFlag(name),\n logger: this.logger,\n serverInfo: this.serverInfo,\n clientInfo,\n protocolVersion,\n clientCapabilities,\n };\n\n try {\n await this.events.onInitialize(context);\n this.logger.mcpError(\"Lifecycle onInitialize completed successfully\");\n } catch (error) {\n this.logger.mcpError(\n `Lifecycle onInitialize failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n }\n\n /**\n * Handle the initialized notification\n */\n async handleInitialized(): Promise<void> {\n if (!this.state.initialized) {\n this.logger.mcpError(\"Initialized called before initialize\");\n return;\n }\n\n if (this.state.ready) {\n this.logger.mcpError(\"Initialized called multiple times\");\n return;\n }\n\n this.state.ready = true;\n\n if (this.events.onInitialized && this.state.clientInfo) {\n const context: McpInitializedContext = {\n getFlag: (name: string) => this.getFlag(name),\n logger: this.logger,\n serverInfo: this.serverInfo,\n clientInfo: this.state.clientInfo,\n protocolVersion: this.state.protocolVersion!,\n };\n\n try {\n await this.events.onInitialized(context);\n this.logger.mcpError(\"Lifecycle onInitialized completed successfully\");\n } catch (error) {\n this.logger.mcpError(\n `Lifecycle onInitialized failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n }\n }\n }\n\n /**\n * Handle server shutdown\n */\n async handleShutdown(\n reason: \"client_disconnect\" | \"server_shutdown\" | \"error\" | \"signal\",\n error?: Error,\n ): Promise<void> {\n if (this.state.shuttingDown) {\n return; // Already shutting down\n }\n\n this.state.shuttingDown = true;\n\n if (this.events.onShutdown) {\n const context: McpShutdownContext = {\n getFlag: (name: string) => this.getFlag(name),\n logger: this.logger,\n serverInfo: this.serverInfo,\n reason,\n error,\n };\n\n try {\n await this.events.onShutdown(context);\n this.logger.mcpError(\"Lifecycle onShutdown completed successfully\");\n } catch (shutdownError) {\n this.logger.mcpError(\n `Lifecycle onShutdown failed: ${shutdownError instanceof Error ? shutdownError.message : String(shutdownError)}`,\n );\n // Don't throw during shutdown - just log the error\n }\n }\n }\n\n /**\n * Get current lifecycle state\n */\n getState(): Readonly<McpLifecycleState> {\n return { ...this.state };\n }\n\n /**\n * Check if the server is ready for operations\n */\n isReady(): boolean {\n return this.state.ready && !this.state.shuttingDown;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parse } from './parse.js';\nimport { stringify } from './stringify.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nexport default { parse, stringify, TomlDate, TomlError };\nexport { parse, stringify, TomlDate, TomlError };\n"],"names":["RESET","BOLD","DIM","UNDERLINE","CLEAR","BLACK","RED","GREEN","YELLOW","BLUE","MAGENTA","CYAN","WHITE","GRAY","supportsColor","isBrowser","colorEnabled","format","createTomlPlugin","createYamlPlugin","createTomlPluginAsync","createYamlPluginAsync","chalk","path","fs","pathWithVariables","normalizedPath","os","z","currentDir","getTsconfig","createPathsMatcher","extensions","testPath","logger","createMcpLogger","identifiedFinalParser","fileURLToPath","createRegExp","anyOf","oneOrMore","char","index","property","isRequired","args","McpLifecycleManager","sessionId","tomlModule","yamlModule","endPtr"],"mappings":"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","x_google_ignoreList":[0,1,2,27,28,29,30,31,32,33,34,35]}