@muggleai/mcp 1.0.19 → 1.0.20

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/config.ts","../src/shared/logger.ts","../src/shared/open-browser.ts","../src/local-qa/types/enums.ts","../src/local-qa/services/auth-service.ts","../src/local-qa/services/storage-service.ts","../src/local-qa/services/run-result-storage-service.ts","../src/local-qa/services/execution-service.ts","../src/shared/credentials.ts","../src/shared/auth.ts","../src/server/mcp-server.ts","../src/server/index.ts","../src/server/stdio-server.ts","../src/qa/index.ts","../src/qa/contracts/index.ts","../src/qa/types.ts","../src/qa/upstream-client.ts","../src/qa/tools/tool-registry.ts","../src/local-qa/index.ts","../src/local-qa/contracts/auth-schemas.ts","../src/local-qa/contracts/project-schemas.ts","../src/local-qa/contracts/session-schemas.ts","../src/local-qa/tools/tool-registry.ts"],"names":["fs","platform","logger","resolve","DeviceCodePollStatus","SessionStatus","LocalRunStatus","LocalRunType","LocalTestScriptStatus","LocalWorkflowRunStatus","CloudMappingEntityType","LocalWorkflowFileEntityType","ExecutionStatus","HealthStatus","TestResultStatus","path2","fs2","path3","serviceInstance","path4","fs4","path5","process","CREDENTIALS_FILE","path6","fs6","uuidv4","path","McpErrorCode","axios","AxiosError","AuthLoginInputSchema","AuthPollInputSchema","EmptyInputSchema","TestScriptGetInputSchema","TestScriptListInputSchema","z","createChildLogger"],"mappings":"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","file":"chunk-HOXCZIJC.js","sourcesContent":["/**\n * Configuration management for @muggleai/mcp.\n * Unified configuration for both QA Gateway and Local QA.\n */\n\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nimport type {\n IAuth0Config,\n IConfig,\n ILocalQaConfig,\n IMuggleConfig,\n IMuggleConfigChecksums,\n IQaConfig,\n} from \"./types.js\";\n\n/** Default prompt service URL (cloud API). */\nconst DEFAULT_PROMPT_SERVICE_URL = \"https://promptservice.muggle-ai.com\";\n\n/** Default web-service URL (local test execution). */\nconst DEFAULT_WEB_SERVICE_URL = \"http://localhost:3001\";\n\n/** Default data directory name. */\nconst DATA_DIR_NAME = \".muggle-ai\";\n\n/** Subdirectory for downloaded electron-app binaries. */\nconst ELECTRON_APP_DIR = \"electron-app\";\n\n/** Credentials file name. */\nconst CREDENTIALS_FILE = \"credentials.json\";\n\n/** Default Auth0 domain (custom domain for production). */\nconst DEFAULT_AUTH0_DOMAIN = \"login.muggle-ai.com\";\n\n/** Default Auth0 client ID (Native app with Device Code grant). */\nconst DEFAULT_AUTH0_CLIENT_ID = \"UgG5UjoyLksxMciWWKqVpwfWrJ4rFvtT\";\n\n/** Default Auth0 audience. */\nconst DEFAULT_AUTH0_AUDIENCE = \"https://muggleai.us.auth0.com/api/v2/\";\n\n/** Default Auth0 scopes. */\nconst DEFAULT_AUTH0_SCOPE = \"openid profile email offline_access\";\n\n/** Cached configuration instance. */\nlet configInstance: IConfig | null = null;\n\n/** Cached muggle config from package.json. */\nlet muggleConfigCache: IMuggleConfig | null = null;\n\n/**\n * Resolve the package root directory from the current module location.\n * @returns The package root directory path.\n */\nfunction getPackageRoot(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n const currentDir = path.dirname(currentFilePath);\n\n // Handle bundled (dist/) and development (src/) contexts\n // With tsup bundling, code is in dist/ directly (e.g., dist/cli.js)\n // With tsc, code is in dist/shared/ (e.g., dist/shared/config.js)\n \n if (currentDir.includes(path.join(\"dist\", \"shared\"))) {\n // Navigate up from dist/shared to package root (2 levels)\n return path.resolve(currentDir, \"..\", \"..\");\n }\n\n if (currentDir.endsWith(\"dist\")) {\n // Navigate up from dist to package root (1 level) - tsup bundled\n return path.resolve(currentDir, \"..\");\n }\n\n if (currentDir.includes(path.join(\"src\", \"shared\"))) {\n // Navigate up from src/shared to package root (2 levels)\n return path.resolve(currentDir, \"..\", \"..\");\n }\n\n return path.dirname(currentDir);\n}\n\n/**\n * Get the muggle config from package.json.\n * @returns The muggle config with electronAppVersion, downloadBaseUrl, and checksums.\n * @throws Error if package.json cannot be read or muggleConfig is missing/invalid.\n */\nfunction getMuggleConfig(): IMuggleConfig {\n if (muggleConfigCache) {\n return muggleConfigCache;\n }\n\n const packageRoot = getPackageRoot();\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n\n let packageJson: Record<string, unknown>;\n try {\n const content = fs.readFileSync(packageJsonPath, \"utf-8\");\n packageJson = JSON.parse(content);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to read package.json for muggleConfig.\\n` +\n ` Path: ${packageJsonPath}\\n` +\n ` Package root: ${packageRoot}\\n` +\n ` Error: ${errorMessage}\\n` +\n ` This is a bug - please report it.`\n );\n }\n\n const config = packageJson.muggleConfig as Record<string, unknown> | undefined;\n\n if (!config) {\n throw new Error(\n `Missing muggleConfig in package.json.\\n` +\n ` Path: ${packageJsonPath}\\n` +\n ` This is a bug - please report it.`\n );\n }\n\n if (!config.electronAppVersion || typeof config.electronAppVersion !== \"string\") {\n throw new Error(\n `Missing or invalid muggleConfig.electronAppVersion in package.json.\\n` +\n ` Path: ${packageJsonPath}\\n` +\n ` Value: ${JSON.stringify(config.electronAppVersion)}\\n` +\n ` This is a bug - please report it.`\n );\n }\n\n if (!config.downloadBaseUrl || typeof config.downloadBaseUrl !== \"string\") {\n throw new Error(\n `Missing or invalid muggleConfig.downloadBaseUrl in package.json.\\n` +\n ` Path: ${packageJsonPath}\\n` +\n ` Value: ${JSON.stringify(config.downloadBaseUrl)}\\n` +\n ` This is a bug - please report it.`\n );\n }\n\n muggleConfigCache = {\n electronAppVersion: config.electronAppVersion,\n downloadBaseUrl: config.downloadBaseUrl,\n checksums: (config.checksums as IMuggleConfigChecksums) || {},\n };\n\n return muggleConfigCache;\n}\n\n/**\n * Get the Muggle AI data directory path.\n * @returns Path to ~/.muggle-ai\n */\nexport function getDataDir(): string {\n return path.join(os.homedir(), DATA_DIR_NAME);\n}\n\n/**\n * Get the path to the downloaded electron-app binary for the current platform.\n * @returns The path to the downloaded binary, or null if not found.\n */\nfunction getDownloadedElectronAppPath(): string | null {\n const platform = os.platform();\n const config = getMuggleConfig();\n const version = config.electronAppVersion;\n\n const baseDir = path.join(getDataDir(), ELECTRON_APP_DIR, version);\n\n let binaryPath: string;\n\n switch (platform) {\n case \"darwin\":\n binaryPath = path.join(baseDir, \"MuggleAI.app\", \"Contents\", \"MacOS\", \"MuggleAI\");\n break;\n case \"win32\":\n binaryPath = path.join(baseDir, \"MuggleAI.exe\");\n break;\n case \"linux\":\n binaryPath = path.join(baseDir, \"MuggleAI\");\n break;\n default:\n return null;\n }\n\n if (fs.existsSync(binaryPath)) {\n return binaryPath;\n }\n\n return null;\n}\n\n/**\n * Get the path to the electron-app in well-known system locations.\n * @returns The path to the system-installed binary, or null if not found.\n */\nfunction getSystemElectronAppPath(): string | null {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n let binaryPath: string;\n\n switch (platform) {\n case \"darwin\":\n binaryPath = path.join(homeDir, \"Applications\", \"MuggleAI.app\", \"Contents\", \"MacOS\", \"MuggleAI\");\n break;\n case \"win32\":\n binaryPath = path.join(homeDir, \"AppData\", \"Local\", \"Programs\", \"MuggleAI\", \"MuggleAI.exe\");\n break;\n case \"linux\":\n binaryPath = path.join(homeDir, \".local\", \"share\", \"muggle-ai\", \"MuggleAI\");\n break;\n default:\n return null;\n }\n\n if (fs.existsSync(binaryPath)) {\n return binaryPath;\n }\n\n return null;\n}\n\n/**\n * Resolve the electron-app executable path if available.\n * @returns The path to the electron-app executable, or null when not installed.\n */\nfunction resolveElectronAppPathOrNull(): string | null {\n // 1. Check environment override\n const customPath = process.env.ELECTRON_APP_PATH;\n if (customPath && fs.existsSync(customPath)) {\n return customPath;\n }\n\n // 2. Check downloaded binary\n const downloadedPath = getDownloadedElectronAppPath();\n if (downloadedPath) {\n return downloadedPath;\n }\n\n // 3. Check system location\n const systemPath = getSystemElectronAppPath();\n if (systemPath) {\n return systemPath;\n }\n\n return null;\n}\n\n/**\n * Resolve the web-service entry point path.\n * @returns The path to the web-service index.js, or null if not found.\n */\nfunction resolveWebServicePath(): string | null {\n const customPath = process.env.WEB_SERVICE_PATH;\n if (customPath && fs.existsSync(customPath)) {\n return customPath;\n }\n\n // Check sibling package path (monorepo structure)\n const packageRoot = getPackageRoot();\n const siblingPath = path.resolve(packageRoot, \"..\", \"web-service\", \"dist\", \"src\", \"index.js\");\n\n if (fs.existsSync(siblingPath)) {\n return siblingPath;\n }\n\n return null;\n}\n\n/**\n * Parse an integer environment variable with a default value.\n * @param value - Environment variable value.\n * @param defaultValue - Default value if not set or invalid.\n * @returns Parsed integer.\n */\nfunction parseInteger(value: string | undefined, defaultValue: number): number {\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Build Auth0 configuration from environment.\n * @returns Auth0 configuration.\n */\nfunction buildAuth0Config(): IAuth0Config {\n return {\n domain: process.env.AUTH0_DOMAIN ?? DEFAULT_AUTH0_DOMAIN,\n clientId: process.env.AUTH0_CLIENT_ID ?? DEFAULT_AUTH0_CLIENT_ID,\n audience: process.env.AUTH0_AUDIENCE ?? DEFAULT_AUTH0_AUDIENCE,\n scope: process.env.AUTH0_SCOPE ?? DEFAULT_AUTH0_SCOPE,\n };\n}\n\n/**\n * Build QA Gateway configuration from environment.\n * @returns QA Gateway configuration.\n */\nfunction buildQaConfig(): IQaConfig {\n return {\n promptServiceBaseUrl: process.env.PROMPT_SERVICE_BASE_URL ?? DEFAULT_PROMPT_SERVICE_URL,\n requestTimeoutMs: parseInteger(process.env.REQUEST_TIMEOUT_MS, 30000),\n workflowTimeoutMs: parseInteger(process.env.WORKFLOW_TIMEOUT_MS, 120000),\n };\n}\n\n/**\n * Build Local QA configuration from environment.\n * @returns Local QA configuration.\n */\nfunction buildLocalQaConfig(): ILocalQaConfig {\n const dataDir = getDataDir();\n const auth0Scopes = (process.env.AUTH0_SCOPE ?? DEFAULT_AUTH0_SCOPE).split(\" \");\n\n return {\n webServiceUrl: process.env.WEB_SERVICE_URL ?? DEFAULT_WEB_SERVICE_URL,\n promptServiceUrl: process.env.PROMPT_SERVICE_BASE_URL ?? DEFAULT_PROMPT_SERVICE_URL,\n dataDir: dataDir,\n sessionsDir: path.join(dataDir, \"sessions\"),\n projectsDir: path.join(dataDir, \"projects\"),\n tempDir: path.join(dataDir, \"temp\"),\n credentialsFilePath: path.join(dataDir, CREDENTIALS_FILE),\n authFilePath: path.join(dataDir, \"auth.json\"),\n electronAppPath: resolveElectronAppPathOrNull(),\n webServicePath: resolveWebServicePath(),\n webServicePidFile: path.join(dataDir, \"web-service.pid\"),\n auth0: {\n domain: process.env.AUTH0_DOMAIN ?? DEFAULT_AUTH0_DOMAIN,\n clientId: process.env.AUTH0_CLIENT_ID ?? DEFAULT_AUTH0_CLIENT_ID,\n audience: process.env.AUTH0_AUDIENCE ?? DEFAULT_AUTH0_AUDIENCE,\n scopes: auth0Scopes,\n },\n };\n}\n\n/**\n * Get the unified application configuration.\n * @returns The application configuration.\n */\nexport function getConfig(): IConfig {\n if (configInstance) {\n return configInstance;\n }\n\n configInstance = {\n serverName: \"muggle-mcp\",\n serverVersion: \"1.0.0\",\n logLevel: process.env.LOG_LEVEL ?? \"info\",\n auth0: buildAuth0Config(),\n qa: buildQaConfig(),\n localQa: buildLocalQaConfig(),\n };\n\n return configInstance;\n}\n\n/**\n * Reset the configuration (for testing).\n */\nexport function resetConfig(): void {\n configInstance = null;\n muggleConfigCache = null;\n}\n\n/** Filename for storing the overridden electron-app version. */\nconst VERSION_OVERRIDE_FILE = \"electron-app-version-override.json\";\n\n/** Environment variable name for overriding electron-app version. */\nconst ELECTRON_APP_VERSION_ENV = \"ELECTRON_APP_VERSION\";\n\n/**\n * Get the effective electron-app version.\n * Priority order:\n * 1. ELECTRON_APP_VERSION env var (for testing/development)\n * 2. Override file (set by `muggle-mcp upgrade`)\n * 3. package.json muggleConfig.electronAppVersion (bundled default)\n * @returns The electron-app version string.\n */\nexport function getElectronAppVersion(): string {\n // Check environment variable first (highest priority)\n const envVersion = process.env[ELECTRON_APP_VERSION_ENV];\n if (envVersion && /^\\d+\\.\\d+\\.\\d+$/.test(envVersion)) {\n return envVersion;\n }\n\n // Check override file (set by muggle-mcp upgrade)\n const overridePath = path.join(getDataDir(), VERSION_OVERRIDE_FILE);\n\n if (fs.existsSync(overridePath)) {\n try {\n const content = JSON.parse(fs.readFileSync(overridePath, \"utf-8\"));\n if (content.version && typeof content.version === \"string\") {\n return content.version;\n }\n } catch {\n // Fall through to default\n }\n }\n\n // Fall back to bundled version\n return getMuggleConfig().electronAppVersion;\n}\n\n/**\n * Get the source of the current electron-app version.\n * @returns The version source: \"env\", \"override\", or \"bundled\".\n */\nexport function getElectronAppVersionSource(): \"env\" | \"override\" | \"bundled\" {\n // Check environment variable\n const envVersion = process.env[ELECTRON_APP_VERSION_ENV];\n if (envVersion && /^\\d+\\.\\d+\\.\\d+$/.test(envVersion)) {\n return \"env\";\n }\n\n // Check override file\n const overridePath = path.join(getDataDir(), VERSION_OVERRIDE_FILE);\n if (fs.existsSync(overridePath)) {\n try {\n const content = JSON.parse(fs.readFileSync(overridePath, \"utf-8\"));\n if (content.version && typeof content.version === \"string\") {\n return \"override\";\n }\n } catch {\n // Fall through\n }\n }\n\n return \"bundled\";\n}\n\n/**\n * Get the bundled electron-app version from package.json (ignores override).\n * @returns The bundled electron-app version string.\n */\nexport function getBundledElectronAppVersion(): string {\n return getMuggleConfig().electronAppVersion;\n}\n\n/**\n * Get the download base URL for electron-app binaries.\n * @returns The base URL for downloads.\n */\nexport function getDownloadBaseUrl(): string {\n return getMuggleConfig().downloadBaseUrl;\n}\n\n/**\n * Get the checksums for electron-app binaries.\n * @returns Checksums map by platform, or undefined if not configured.\n */\nexport function getElectronAppChecksums(): IMuggleConfigChecksums | undefined {\n return getMuggleConfig().checksums;\n}\n\n/**\n * Check if the electron-app binary is installed for the expected version.\n * @returns True if the binary is installed and accessible.\n */\nexport function isElectronAppInstalled(): boolean {\n return getDownloadedElectronAppPath() !== null;\n}\n\n/**\n * Get the electron-app directory path for a specific version.\n * @param version - Version string (defaults to configured version).\n * @returns Path to the electron-app version directory.\n */\nexport function getElectronAppDir(version?: string): string {\n const ver = version ?? getElectronAppVersion();\n return path.join(getDataDir(), ELECTRON_APP_DIR, ver);\n}\n","/**\n * Logger module for @muggleai/mcp.\n * Provides structured logging using Winston.\n */\n\nimport winston from \"winston\";\n\nimport { getConfig } from \"./config.js\";\n\n/** Cached logger instance. */\nlet loggerInstance: winston.Logger | null = null;\n\n/**\n * Create the Winston logger with appropriate configuration.\n * @returns Configured Winston logger.\n */\nfunction createLogger(): winston.Logger {\n const config = getConfig();\n\n // Use JSON format for structured logging to stderr (MCP-safe)\n const format = winston.format.combine(\n winston.format.timestamp(),\n winston.format.json(),\n );\n\n return winston.createLogger({\n level: config.logLevel,\n format: format,\n defaultMeta: {\n service: config.serverName,\n version: config.serverVersion,\n },\n transports: [\n // Log to stderr to avoid interfering with MCP stdio transport\n new winston.transports.Console({\n stderrLevels: [\"error\", \"warn\", \"info\", \"http\", \"verbose\", \"debug\", \"silly\"],\n }),\n ],\n });\n}\n\n/**\n * Get the logger instance (singleton).\n * @returns Winston logger.\n */\nexport function getLogger(): winston.Logger {\n if (!loggerInstance) {\n loggerInstance = createLogger();\n }\n return loggerInstance;\n}\n\n/**\n * Create a child logger with additional context.\n * @param correlationId - Request correlation ID.\n * @returns Child logger with correlation context.\n */\nexport function createChildLogger(correlationId: string): winston.Logger {\n const logger = getLogger();\n return logger.child({ correlationId: correlationId });\n}\n\n/**\n * Reset the logger (for testing).\n */\nexport function resetLogger(): void {\n loggerInstance = null;\n}\n","/**\n * Browser opening utility for @muggleai/mcp.\n * Opens URLs in the user's default browser.\n */\n\nimport { exec } from \"child_process\";\nimport { platform } from \"os\";\n\nimport { getLogger } from \"./logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Result of attempting to open a browser.\n */\nexport interface IBrowserOpenResult {\n /** Whether the browser was successfully opened. */\n opened: boolean;\n /** Error message if failed to open. */\n error?: string;\n}\n\n/**\n * Options for opening a browser.\n */\nexport interface IBrowserOpenOptions {\n /** URL to open. */\n url: string;\n}\n\n/**\n * Get the command to open a URL based on platform.\n * @param url - URL to open.\n * @returns Platform-specific command.\n */\nfunction getOpenCommand(url: string): string {\n const plat = platform();\n\n switch (plat) {\n case \"darwin\":\n return `open \"${url}\"`;\n case \"win32\":\n return `start \"\" \"${url}\"`;\n case \"linux\":\n return `xdg-open \"${url}\"`;\n default:\n throw new Error(`Unsupported platform: ${plat}`);\n }\n}\n\n/**\n * Open a URL in the user's default browser.\n * @param options - Options containing the URL to open.\n * @returns Result indicating success or failure.\n */\nexport async function openBrowserUrl(options: IBrowserOpenOptions): Promise<IBrowserOpenResult> {\n return new Promise((resolve) => {\n try {\n const command = getOpenCommand(options.url);\n\n logger.debug(\"[Browser] Opening URL\", { url: options.url, command: command });\n\n exec(command, (error) => {\n if (error) {\n logger.warn(\"[Browser] Failed to open URL\", {\n url: options.url,\n error: error.message,\n });\n resolve({\n opened: false,\n error: error.message,\n });\n } else {\n logger.info(\"[Browser] URL opened successfully\", { url: options.url });\n resolve({ opened: true });\n }\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\"[Browser] Failed to open URL\", {\n url: options.url,\n error: errorMessage,\n });\n resolve({\n opened: false,\n error: errorMessage,\n });\n }\n });\n}\n","/**\n * Enums for local QA module.\n */\n\n/**\n * Device code poll status values.\n */\nexport enum DeviceCodePollStatus {\n /** Authorization is still pending. */\n Pending = \"pending\",\n /** Authorization completed successfully. */\n Complete = \"complete\",\n /** The device code has expired. */\n Expired = \"expired\",\n /** An error occurred during polling. */\n Error = \"error\",\n}\n\n/**\n * Session status values.\n */\nexport enum SessionStatus {\n /** Session is currently running. */\n Running = \"running\",\n /** Session completed successfully. */\n Completed = \"completed\",\n /** Session failed. */\n Failed = \"failed\",\n}\n\n/**\n * Local run status values.\n */\nexport enum LocalRunStatus {\n /** Run is pending execution. */\n PENDING = \"pending\",\n /** Run is currently executing. */\n RUNNING = \"running\",\n /** Run passed successfully. */\n PASSED = \"passed\",\n /** Run failed. */\n FAILED = \"failed\",\n /** Run was cancelled. */\n CANCELLED = \"cancelled\",\n}\n\n/**\n * Local run type values.\n */\nexport enum LocalRunType {\n /** Test script generation run. */\n GENERATION = \"generation\",\n /** Test script replay run. */\n REPLAY = \"replay\",\n}\n\n/**\n * Local test script status values.\n */\nexport enum LocalTestScriptStatus {\n /** Draft test script (not yet generated). */\n DRAFT = \"draft\",\n /** Generated test script. */\n GENERATED = \"generated\",\n /** Validated test script. */\n VALIDATED = \"validated\",\n /** Failed test script. */\n FAILED = \"failed\",\n}\n\n/**\n * Local workflow run status values.\n */\nexport enum LocalWorkflowRunStatus {\n /** Workflow run is pending. */\n PENDING = \"pending\",\n /** Workflow run is currently running. */\n RUNNING = \"running\",\n /** Workflow run completed successfully. */\n COMPLETED = \"completed\",\n /** Workflow run failed. */\n FAILED = \"failed\",\n /** Workflow run was cancelled. */\n CANCELLED = \"cancelled\",\n}\n\n/**\n * Cloud ID mapping entity types.\n */\nexport enum CloudMappingEntityType {\n /** Project entity. */\n PROJECT = \"project\",\n /** Use case entity. */\n USE_CASE = \"use_case\",\n /** Test case entity. */\n TEST_CASE = \"test_case\",\n /** Test script entity. */\n TEST_SCRIPT = \"test_script\",\n}\n\n/**\n * Local workflow file entity types.\n */\nexport enum LocalWorkflowFileEntityType {\n /** Project-level workflow file. */\n PROJECT = \"project\",\n /** Use case-level workflow file. */\n USE_CASE = \"use_case\",\n /** Test case-level workflow file. */\n TEST_CASE = \"test_case\",\n}\n\n/**\n * Execution status values.\n */\nexport enum ExecutionStatus {\n /** Execution is pending. */\n Pending = \"pending\",\n /** Execution is running. */\n Running = \"running\",\n /** Execution completed successfully. */\n Completed = \"completed\",\n /** Execution failed. */\n Failed = \"failed\",\n /** Execution was cancelled. */\n Cancelled = \"cancelled\",\n}\n\n/**\n * Health status values.\n */\nexport enum HealthStatus {\n /** Service is healthy. */\n Healthy = \"healthy\",\n /** Service is degraded. */\n Degraded = \"degraded\",\n /** Service is unhealthy. */\n Unhealthy = \"unhealthy\",\n}\n\n/**\n * Test result status values.\n */\nexport enum TestResultStatus {\n /** Test passed. */\n Passed = \"passed\",\n /** Test failed. */\n Failed = \"failed\",\n /** Test was skipped. */\n Skipped = \"skipped\",\n}\n","/**\n * Auth service for Auth0 authentication in local QA.\n * Supports Device Code flow for user authentication.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport { getConfig } from \"../../shared/config.js\";\nimport { getLogger } from \"../../shared/logger.js\";\nimport { openBrowserUrl } from \"../../shared/open-browser.js\";\nimport type {\n IAuthStatus,\n IDeviceCodePollResult,\n IDeviceCodeResponse,\n IStoredAuth,\n ITokenResponse,\n} from \"../types/index.js\";\nimport { DeviceCodePollStatus } from \"../types/index.js\";\n\n/** Default timeout for waiting on browser login completion. */\nconst DEFAULT_LOGIN_WAIT_TIMEOUT_MS = 120000;\n\n/**\n * Service for handling Auth0 authentication.\n */\nexport class AuthService {\n /** Path to the auth file. */\n private readonly authFilePath: string;\n\n /** Path to the pending device code file. */\n private readonly pendingDeviceCodePath: string;\n\n /**\n * Create a new AuthService.\n */\n constructor() {\n const config = getConfig();\n this.authFilePath = config.localQa.authFilePath;\n this.pendingDeviceCodePath = path.join(\n path.dirname(config.localQa.authFilePath),\n \"pending-device-code.json\",\n );\n }\n\n /**\n * Get current authentication status.\n */\n getAuthStatus(): IAuthStatus {\n const logger = getLogger();\n const storedAuth = this.loadStoredAuth();\n\n if (!storedAuth) {\n logger.debug(\"No stored auth found\");\n return { authenticated: false };\n }\n\n const now = new Date();\n const expiresAt = new Date(storedAuth.expiresAt);\n const isExpired = now >= expiresAt;\n\n logger.debug(\"Auth status checked\", {\n email: storedAuth.email,\n isExpired: isExpired,\n expiresAt: storedAuth.expiresAt,\n });\n\n return {\n authenticated: !isExpired,\n email: storedAuth.email,\n userId: storedAuth.userId,\n expiresAt: storedAuth.expiresAt,\n isExpired: isExpired,\n };\n }\n\n /**\n * Start the device code flow.\n */\n async startDeviceCodeFlow(): Promise<IDeviceCodeResponse> {\n const logger = getLogger();\n const config = getConfig();\n const { domain, clientId, audience, scopes } = config.localQa.auth0;\n\n logger.info(\"Starting device code flow\");\n\n const url = `https://${domain}/oauth/device/code`;\n const body = new URLSearchParams({\n client_id: clientId,\n scope: scopes.join(\" \"),\n audience: audience,\n });\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.error(\"Device code request failed\", {\n status: response.status,\n error: errorText,\n });\n throw new Error(`Failed to start device code flow: ${response.status} ${errorText}`);\n }\n\n const data = (await response.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n };\n\n logger.info(\"Device code flow started\", {\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n expiresIn: data.expires_in,\n });\n\n this.storePendingDeviceCode({\n deviceCode: data.device_code,\n userCode: data.user_code,\n expiresAt: new Date(Date.now() + data.expires_in * 1000).toISOString(),\n });\n\n const browserOpenResult = await openBrowserUrl({\n url: data.verification_uri_complete,\n });\n\n if (browserOpenResult.opened) {\n logger.info(\"Browser opened for device code login\");\n } else {\n logger.warn(\"Failed to open browser for device code login\", {\n error: browserOpenResult.error,\n verificationUriComplete: data.verification_uri_complete,\n });\n }\n\n return {\n deviceCode: data.device_code,\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n verificationUriComplete: data.verification_uri_complete,\n expiresIn: data.expires_in,\n interval: data.interval,\n browserOpened: browserOpenResult.opened,\n browserOpenError: browserOpenResult.error,\n };\n }\n\n /**\n * Store a pending device code for later retrieval.\n */\n private storePendingDeviceCode(params: {\n deviceCode: string;\n userCode: string;\n expiresAt: string;\n }): void {\n const logger = getLogger();\n\n const dir = path.dirname(this.pendingDeviceCodePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(this.pendingDeviceCodePath, JSON.stringify(params, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n\n logger.debug(\"Pending device code stored\", { userCode: params.userCode });\n }\n\n /**\n * Get the pending device code if one exists and is not expired.\n */\n getPendingDeviceCode(): string | null {\n const logger = getLogger();\n\n if (!fs.existsSync(this.pendingDeviceCodePath)) {\n logger.debug(\"No pending device code found\");\n return null;\n }\n\n try {\n const content = fs.readFileSync(this.pendingDeviceCodePath, \"utf-8\");\n const data = JSON.parse(content) as {\n deviceCode: string;\n userCode: string;\n expiresAt: string;\n };\n\n const now = new Date();\n const expiresAt = new Date(data.expiresAt);\n\n if (now >= expiresAt) {\n logger.debug(\"Pending device code expired\");\n this.clearPendingDeviceCode();\n return null;\n }\n\n return data.deviceCode;\n } catch (error) {\n logger.warn(\"Failed to read pending device code\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n /**\n * Clear the pending device code file.\n */\n private clearPendingDeviceCode(): void {\n const logger = getLogger();\n\n if (fs.existsSync(this.pendingDeviceCodePath)) {\n try {\n fs.unlinkSync(this.pendingDeviceCodePath);\n logger.debug(\"Pending device code cleared\");\n } catch (error) {\n logger.warn(\"Failed to clear pending device code\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n /**\n * Poll for device code authorization completion.\n */\n async pollDeviceCode(deviceCode: string): Promise<IDeviceCodePollResult> {\n const logger = getLogger();\n const config = getConfig();\n const { domain, clientId } = config.localQa.auth0;\n\n logger.debug(\"Polling for device code authorization\");\n\n const url = `https://${domain}/oauth/token`;\n const body = new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n client_id: clientId,\n device_code: deviceCode,\n });\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n\n if (response.ok) {\n const tokenData = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in: number;\n };\n\n const tokenResponse: ITokenResponse = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n tokenType: tokenData.token_type,\n expiresIn: tokenData.expires_in,\n };\n\n const userInfo = await this.getUserInfo(tokenResponse.accessToken);\n\n await this.storeAuth({\n tokenResponse: tokenResponse,\n email: userInfo.email,\n userId: userInfo.sub,\n });\n\n this.clearPendingDeviceCode();\n\n logger.info(\"Device code authorization complete\", { email: userInfo.email });\n\n return {\n status: DeviceCodePollStatus.Complete,\n message: \"Authentication successful!\",\n email: userInfo.email,\n };\n }\n\n const errorData = (await response.json()) as { error: string; error_description?: string };\n\n if (errorData.error === \"authorization_pending\") {\n logger.debug(\"Authorization pending\");\n return {\n status: DeviceCodePollStatus.Pending,\n message: \"Waiting for user to complete authorization...\",\n };\n }\n\n if (errorData.error === \"slow_down\") {\n logger.debug(\"Polling too fast\");\n return {\n status: DeviceCodePollStatus.Pending,\n message: \"Polling too fast, slowing down...\",\n };\n }\n\n if (errorData.error === \"expired_token\") {\n logger.warn(\"Device code expired\");\n return {\n status: DeviceCodePollStatus.Expired,\n message: \"The authorization code has expired. Please start again.\",\n };\n }\n\n if (errorData.error === \"access_denied\") {\n logger.warn(\"Access denied\");\n return {\n status: DeviceCodePollStatus.Error,\n message: \"Access was denied by the user.\",\n error: errorData.error_description ?? errorData.error,\n };\n }\n\n logger.error(\"Unexpected error during polling\", { error: errorData });\n return {\n status: DeviceCodePollStatus.Error,\n message: errorData.error_description ?? errorData.error,\n error: errorData.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Poll request failed\", { error: errorMessage });\n return {\n status: DeviceCodePollStatus.Error,\n message: `Poll request failed: ${errorMessage}`,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Poll for device code authorization until completion or timeout.\n */\n async waitForDeviceCodeAuthorization(params: {\n deviceCode: string;\n intervalSeconds: number;\n timeoutMs?: number;\n }): Promise<IDeviceCodePollResult> {\n const logger = getLogger();\n const timeoutMs = params.timeoutMs ?? DEFAULT_LOGIN_WAIT_TIMEOUT_MS;\n const pollIntervalMs = Math.max(params.intervalSeconds, 1) * 1000;\n const startedAt = Date.now();\n\n logger.info(\"Waiting for device code authorization\", {\n timeoutMs: timeoutMs,\n pollIntervalMs: pollIntervalMs,\n });\n\n while (Date.now() - startedAt < timeoutMs) {\n const result = await this.pollDeviceCode(params.deviceCode);\n\n if (result.status !== DeviceCodePollStatus.Pending) {\n return result;\n }\n\n const remainingMs = timeoutMs - (Date.now() - startedAt);\n if (remainingMs <= 0) {\n break;\n }\n\n await sleep({ durationMs: Math.min(pollIntervalMs, remainingMs) });\n }\n\n return {\n status: DeviceCodePollStatus.Pending,\n message:\n \"Timed out waiting for browser login confirmation. Please finish login in your browser, then call `muggle_auth_poll` to continue.\",\n };\n }\n\n /**\n * Get user info from Auth0.\n */\n private async getUserInfo(accessToken: string): Promise<{ email?: string; sub?: string }> {\n const logger = getLogger();\n const config = getConfig();\n const { domain } = config.localQa.auth0;\n\n const url = `https://${domain}/userinfo`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n logger.warn(\"Failed to get user info\", { status: response.status });\n return {};\n }\n\n const data = (await response.json()) as { email?: string; sub?: string };\n return data;\n } catch (error) {\n logger.warn(\"User info request failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return {};\n }\n }\n\n /**\n * Store authentication tokens.\n */\n private async storeAuth(params: {\n tokenResponse: ITokenResponse;\n email?: string;\n userId?: string;\n }): Promise<void> {\n const { tokenResponse, email, userId } = params;\n const logger = getLogger();\n\n const expiresAt = new Date(Date.now() + tokenResponse.expiresIn * 1000).toISOString();\n\n const storedAuth: IStoredAuth = {\n accessToken: tokenResponse.accessToken,\n refreshToken: tokenResponse.refreshToken,\n expiresAt: expiresAt,\n email: email,\n userId: userId,\n };\n\n const dir = path.dirname(this.authFilePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(this.authFilePath, JSON.stringify(storedAuth, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n\n logger.info(\"Auth stored successfully\", { email: email, expiresAt: expiresAt });\n }\n\n /**\n * Load stored authentication.\n */\n loadStoredAuth(): IStoredAuth | null {\n const logger = getLogger();\n\n if (!fs.existsSync(this.authFilePath)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(this.authFilePath, \"utf-8\");\n return JSON.parse(content) as IStoredAuth;\n } catch (error) {\n logger.error(\"Failed to load stored auth\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n /**\n * Get the current access token (if valid).\n * Does not auto-refresh - use getValidAccessToken() for that.\n */\n getAccessToken(): string | null {\n const storedAuth = this.loadStoredAuth();\n\n if (!storedAuth) {\n return null;\n }\n\n const now = new Date();\n const expiresAt = new Date(storedAuth.expiresAt);\n\n if (now >= expiresAt) {\n return null;\n }\n\n return storedAuth.accessToken;\n }\n\n /**\n * Check if the access token is expired or about to expire.\n * Uses a 5-minute buffer for safety.\n */\n isAccessTokenExpired(): boolean {\n const storedAuth = this.loadStoredAuth();\n\n if (!storedAuth) {\n return true;\n }\n\n const now = new Date();\n const expiresAt = new Date(storedAuth.expiresAt);\n const bufferMs = 5 * 60 * 1000;\n\n return now.getTime() >= expiresAt.getTime() - bufferMs;\n }\n\n /**\n * Refresh the access token using the stored refresh token.\n * @returns New access token or null if refresh failed.\n */\n async refreshAccessToken(): Promise<string | null> {\n const logger = getLogger();\n const storedAuth = this.loadStoredAuth();\n\n if (!storedAuth?.refreshToken) {\n logger.debug(\"No refresh token available\");\n return null;\n }\n\n const config = getConfig();\n const { domain, clientId } = config.localQa.auth0;\n\n logger.info(\"Refreshing access token\");\n\n const url = `https://${domain}/oauth/token`;\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: clientId,\n refresh_token: storedAuth.refreshToken,\n });\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.error(\"Token refresh failed\", {\n status: response.status,\n error: errorText,\n });\n return null;\n }\n\n const tokenData = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in: number;\n };\n\n const newExpiresAt = new Date(Date.now() + tokenData.expires_in * 1000).toISOString();\n\n const updatedAuth: IStoredAuth = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token ?? storedAuth.refreshToken,\n expiresAt: newExpiresAt,\n email: storedAuth.email,\n userId: storedAuth.userId,\n };\n\n const dir = path.dirname(this.authFilePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n fs.writeFileSync(this.authFilePath, JSON.stringify(updatedAuth, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n\n logger.info(\"Access token refreshed\", { expiresAt: newExpiresAt });\n\n return tokenData.access_token;\n } catch (error) {\n logger.error(\"Token refresh request failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n /**\n * Get a valid access token, refreshing if necessary.\n * This is the preferred method for getting an access token for API calls.\n * @returns Valid access token or null if not authenticated or refresh failed.\n */\n async getValidAccessToken(): Promise<string | null> {\n const logger = getLogger();\n const storedAuth = this.loadStoredAuth();\n\n if (!storedAuth) {\n logger.debug(\"No stored auth, cannot get valid token\");\n return null;\n }\n\n if (!this.isAccessTokenExpired()) {\n return storedAuth.accessToken;\n }\n\n logger.info(\"Access token expired, attempting refresh\");\n\n const refreshedToken = await this.refreshAccessToken();\n\n if (refreshedToken) {\n return refreshedToken;\n }\n\n logger.warn(\"Token refresh failed, user needs to re-authenticate\");\n return null;\n }\n\n /**\n * Clear stored authentication (logout).\n */\n logout(): boolean {\n const logger = getLogger();\n\n if (!fs.existsSync(this.authFilePath)) {\n logger.debug(\"No auth to clear\");\n return false;\n }\n\n try {\n fs.unlinkSync(this.authFilePath);\n logger.info(\"Auth cleared successfully\");\n return true;\n } catch (error) {\n logger.error(\"Failed to clear auth\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n}\n\n/** Cached service instance. */\nlet serviceInstance: AuthService | null = null;\n\n/**\n * Get the singleton AuthService instance.\n */\nexport function getAuthService(): AuthService {\n serviceInstance ??= new AuthService();\n return serviceInstance;\n}\n\n/**\n * Reset the service (for testing).\n */\nexport function resetAuthService(): void {\n serviceInstance = null;\n}\n\n/**\n * Sleep for the requested duration.\n */\nfunction sleep(params: { durationMs: number }): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n }, params.durationMs);\n });\n}\n","/**\n * Local storage service for managing ~/.muggle-ai/ directory.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport { getConfig } from \"../../shared/config.js\";\nimport { getLogger } from \"../../shared/logger.js\";\nimport type {\n ISessionMetadata,\n ISessionSummary,\n ITestStep,\n} from \"../types/index.js\";\nimport { SessionStatus } from \"../types/index.js\";\n\n/** Default max age for sessions in days. */\nconst DEFAULT_SESSION_MAX_AGE_DAYS = 30;\n\n/**\n * Service for managing local file storage.\n */\nexport class StorageService {\n /** Base data directory. */\n private readonly dataDir: string;\n /** Sessions directory. */\n private readonly sessionsDir: string;\n\n /**\n * Create a new StorageService.\n */\n constructor() {\n const config = getConfig();\n this.dataDir = config.localQa.dataDir;\n this.sessionsDir = config.localQa.sessionsDir;\n }\n\n /**\n * Ensure the base directories exist.\n */\n ensureDirectories(): void {\n const logger = getLogger();\n\n if (!fs.existsSync(this.dataDir)) {\n fs.mkdirSync(this.dataDir, { recursive: true });\n logger.info(\"Created data directory\", { path: this.dataDir });\n }\n\n if (!fs.existsSync(this.sessionsDir)) {\n fs.mkdirSync(this.sessionsDir, { recursive: true });\n logger.info(\"Created sessions directory\", { path: this.sessionsDir });\n }\n }\n\n /**\n * Create a new session directory.\n * @param sessionId - Unique session ID.\n * @returns Path to the session directory.\n */\n createSessionDirectory(sessionId: string): string {\n const logger = getLogger();\n this.ensureDirectories();\n\n const sessionDir = path.join(this.sessionsDir, sessionId);\n\n if (!fs.existsSync(sessionDir)) {\n fs.mkdirSync(sessionDir, { recursive: true });\n fs.mkdirSync(path.join(sessionDir, \"screenshots\"), { recursive: true });\n fs.mkdirSync(path.join(sessionDir, \"logs\"), { recursive: true });\n logger.info(\"Created session directory\", { sessionId: sessionId, path: sessionDir });\n }\n\n return sessionDir;\n }\n\n /**\n * Save session metadata.\n * @param metadata - Session metadata to save.\n */\n saveSessionMetadata(metadata: ISessionMetadata): void {\n const logger = getLogger();\n const sessionDir = this.createSessionDirectory(metadata.sessionId);\n const metadataPath = path.join(sessionDir, \"metadata.json\");\n\n fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), \"utf-8\");\n logger.debug(\"Saved session metadata\", { sessionId: metadata.sessionId });\n }\n\n /**\n * Load session metadata.\n * @param sessionId - Session ID to load.\n * @returns Session metadata, or null if not found.\n */\n loadSessionMetadata(sessionId: string): ISessionMetadata | null {\n const logger = getLogger();\n const metadataPath = path.join(this.sessionsDir, sessionId, \"metadata.json\");\n\n if (!fs.existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(metadataPath, \"utf-8\");\n return JSON.parse(content) as ISessionMetadata;\n } catch (error) {\n logger.error(\"Failed to load session metadata\", {\n sessionId: sessionId,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n /**\n * List all sessions.\n * @returns Array of session IDs.\n */\n listSessions(): string[] {\n if (!fs.existsSync(this.sessionsDir)) {\n return [];\n }\n\n return fs.readdirSync(this.sessionsDir).filter((entry) => {\n const entryPath = path.join(this.sessionsDir, entry);\n return fs.statSync(entryPath).isDirectory();\n });\n }\n\n /**\n * Get the current session ID (if any).\n * @returns Current session ID, or null.\n */\n getCurrentSessionId(): string | null {\n const currentPath = path.join(this.sessionsDir, \"current\");\n\n if (!fs.existsSync(currentPath)) {\n return null;\n }\n\n try {\n const target = fs.readlinkSync(currentPath);\n return path.basename(target);\n } catch {\n return null;\n }\n }\n\n /**\n * Set the current session.\n * @param sessionId - Session ID to set as current.\n */\n setCurrentSession(sessionId: string): void {\n const logger = getLogger();\n const currentPath = path.join(this.sessionsDir, \"current\");\n const targetPath = path.join(this.sessionsDir, sessionId);\n\n if (fs.existsSync(currentPath)) {\n fs.unlinkSync(currentPath);\n }\n\n fs.symlinkSync(targetPath, currentPath);\n logger.info(\"Set current session\", { sessionId: sessionId });\n }\n\n /**\n * Save a screenshot to the session directory.\n * @param params - Screenshot save parameters.\n */\n saveScreenshot(params: { sessionId: string; filename: string; data: Buffer }): string {\n const { sessionId, filename, data } = params;\n const logger = getLogger();\n const sessionDir = this.createSessionDirectory(sessionId);\n const screenshotPath = path.join(sessionDir, \"screenshots\", filename);\n\n fs.writeFileSync(screenshotPath, data);\n logger.debug(\"Saved screenshot\", { sessionId: sessionId, filename: filename });\n\n return screenshotPath;\n }\n\n /**\n * Append to the results markdown file.\n * @param params - Results append parameters.\n */\n appendToResults(params: { sessionId: string; content: string }): void {\n const { sessionId, content } = params;\n const logger = getLogger();\n const sessionDir = this.createSessionDirectory(sessionId);\n const resultsPath = path.join(sessionDir, \"results.md\");\n\n fs.appendFileSync(resultsPath, content + \"\\n\", \"utf-8\");\n logger.debug(\"Appended to results\", { sessionId: sessionId });\n }\n\n /**\n * Get the results markdown content.\n * @param sessionId - Session ID.\n * @returns Results content, or null if not found.\n */\n getResults(sessionId: string): string | null {\n const resultsPath = path.join(this.sessionsDir, sessionId, \"results.md\");\n\n if (!fs.existsSync(resultsPath)) {\n return null;\n }\n\n return fs.readFileSync(resultsPath, \"utf-8\");\n }\n\n /**\n * Get the data directory path.\n * @returns Data directory path.\n */\n getDataDir(): string {\n return this.dataDir;\n }\n\n /**\n * Get the sessions directory path.\n * @returns Sessions directory path.\n */\n getSessionsDir(): string {\n return this.sessionsDir;\n }\n\n /**\n * Create a new session with metadata.\n * @param params - Session creation parameters.\n * @returns Path to the session directory.\n */\n createSession(params: {\n sessionId: string;\n targetUrl: string;\n testInstructions: string;\n }): string {\n const { sessionId, targetUrl, testInstructions } = params;\n const logger = getLogger();\n\n const sessionDir = this.createSessionDirectory(sessionId);\n\n const metadata: ISessionMetadata = {\n sessionId: sessionId,\n workflowRunId: sessionId,\n status: SessionStatus.Running,\n startTime: new Date().toISOString(),\n targetUrl: targetUrl,\n testInstructions: testInstructions,\n };\n\n this.saveSessionMetadata(metadata);\n this.setCurrentSession(sessionId);\n\n logger.info(\"Created session\", { sessionId: sessionId, targetUrl: targetUrl });\n\n return sessionDir;\n }\n\n /**\n * Update the status of an existing session.\n * @param params - Status update parameters.\n */\n updateSessionStatus(params: { sessionId: string; status: SessionStatus }): void {\n const { sessionId, status } = params;\n const logger = getLogger();\n\n const metadata = this.loadSessionMetadata(sessionId);\n if (!metadata) {\n logger.warn(\"Session not found for status update\", { sessionId: sessionId });\n return;\n }\n\n metadata.status = status;\n if (status === SessionStatus.Completed || status === SessionStatus.Failed) {\n metadata.endTime = new Date().toISOString();\n }\n\n this.saveSessionMetadata(metadata);\n logger.debug(\"Updated session status\", { sessionId: sessionId, status: status });\n }\n\n /**\n * Initialize the results.md file with a header.\n * @param params - Initialization parameters.\n */\n initializeResults(params: {\n sessionId: string;\n targetUrl: string;\n testInstructions: string;\n }): void {\n const { sessionId, targetUrl, testInstructions } = params;\n const logger = getLogger();\n const sessionDir = this.createSessionDirectory(sessionId);\n const resultsPath = path.join(sessionDir, \"results.md\");\n\n const header = [\n `# Test Results: ${sessionId}`,\n \"\",\n `**Target URL:** ${targetUrl}`,\n `**Started:** ${new Date().toISOString()}`,\n `**Instructions:** ${testInstructions}`,\n \"\",\n \"---\",\n \"\",\n \"## Test Steps\",\n \"\",\n ].join(\"\\n\");\n\n fs.writeFileSync(resultsPath, header, \"utf-8\");\n logger.debug(\"Initialized results.md\", { sessionId: sessionId });\n }\n\n /**\n * Append a test step to the results.md file.\n * @param params - Step parameters.\n */\n appendStepToResults(params: { sessionId: string; step: ITestStep }): void {\n const { sessionId, step } = params;\n const logger = getLogger();\n const sessionDir = this.createSessionDirectory(sessionId);\n const resultsPath = path.join(sessionDir, \"results.md\");\n\n const statusIcon = step.success ? \"✓\" : \"✗\";\n const stepContent = [\n `### Step ${step.stepNumber}: ${step.action}`,\n \"\",\n step.target ? `- **Target:** ${step.target}` : \"\",\n `- **Result:** ${step.result} ${statusIcon}`,\n step.screenshotPath\n ? `- **Screenshot:** [step-${String(step.stepNumber).padStart(3, \"0\")}.png](screenshots/step-${String(step.stepNumber).padStart(3, \"0\")}.png)`\n : \"\",\n \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n fs.appendFileSync(resultsPath, stepContent + \"\\n\", \"utf-8\");\n logger.debug(\"Appended step to results\", { sessionId: sessionId, stepNumber: step.stepNumber });\n\n const metadata = this.loadSessionMetadata(sessionId);\n if (metadata) {\n metadata.stepsCount = (metadata.stepsCount ?? 0) + 1;\n this.saveSessionMetadata(metadata);\n }\n }\n\n /**\n * Finalize the results.md file with a summary.\n * @param params - Finalization parameters.\n */\n finalizeResults(params: { sessionId: string; status: SessionStatus; summary?: string }): void {\n const { sessionId, status, summary } = params;\n const logger = getLogger();\n const sessionDir = path.join(this.sessionsDir, sessionId);\n const resultsPath = path.join(sessionDir, \"results.md\");\n\n if (!fs.existsSync(resultsPath)) {\n logger.warn(\"Results file not found for finalization\", { sessionId: sessionId });\n return;\n }\n\n const metadata = this.loadSessionMetadata(sessionId);\n const endTime = new Date();\n const startTime = metadata?.startTime ? new Date(metadata.startTime) : endTime;\n const durationMs = endTime.getTime() - startTime.getTime();\n const durationSeconds = (durationMs / 1000).toFixed(2);\n\n const statusDisplay =\n status === SessionStatus.Completed\n ? \"✓ Passed\"\n : status === SessionStatus.Failed\n ? \"✗ Failed\"\n : \"— Running\";\n\n const footer = [\n \"\",\n \"---\",\n \"\",\n \"## Summary\",\n \"\",\n `**Status:** ${statusDisplay}`,\n `**Duration:** ${durationSeconds}s`,\n `**Steps:** ${metadata?.stepsCount ?? 0}`,\n `**Completed:** ${endTime.toISOString()}`,\n \"\",\n summary ? summary : \"\",\n ].join(\"\\n\");\n\n fs.appendFileSync(resultsPath, footer, \"utf-8\");\n logger.debug(\"Finalized results.md\", { sessionId: sessionId, status: status });\n\n if (metadata) {\n metadata.durationMs = durationMs;\n metadata.endTime = endTime.toISOString();\n metadata.status = status;\n this.saveSessionMetadata(metadata);\n }\n }\n\n /**\n * List all sessions with their metadata.\n * @returns Array of session summaries.\n */\n listSessionsWithMetadata(): ISessionSummary[] {\n const sessionIds = this.listSessions();\n const summaries: ISessionSummary[] = [];\n\n for (const sessionId of sessionIds) {\n if (sessionId === \"current\") {\n continue;\n }\n\n const metadata = this.loadSessionMetadata(sessionId);\n if (metadata) {\n summaries.push({\n sessionId: metadata.sessionId,\n status: metadata.status,\n startTime: metadata.startTime,\n endTime: metadata.endTime,\n targetUrl: metadata.targetUrl,\n durationMs: metadata.durationMs,\n stepsCount: metadata.stepsCount,\n });\n }\n }\n\n summaries.sort((a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime());\n\n return summaries;\n }\n\n /**\n * Cleanup old sessions beyond the specified age.\n * @param params - Cleanup parameters.\n * @returns Number of sessions deleted.\n */\n cleanupOldSessions(params?: { maxAgeDays?: number }): number {\n const maxAgeDays = params?.maxAgeDays ?? DEFAULT_SESSION_MAX_AGE_DAYS;\n const logger = getLogger();\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - maxAgeDays);\n\n const sessionIds = this.listSessions();\n let deletedCount = 0;\n\n for (const sessionId of sessionIds) {\n if (sessionId === \"current\") {\n continue;\n }\n\n const metadata = this.loadSessionMetadata(sessionId);\n if (!metadata) {\n continue;\n }\n\n const sessionDate = new Date(metadata.startTime);\n if (sessionDate < cutoffDate) {\n const sessionDir = path.join(this.sessionsDir, sessionId);\n try {\n fs.rmSync(sessionDir, { recursive: true, force: true });\n deletedCount++;\n logger.info(\"Deleted old session\", {\n sessionId: sessionId,\n age: Math.floor((Date.now() - sessionDate.getTime()) / (1000 * 60 * 60 * 24)),\n });\n } catch (error) {\n logger.error(\"Failed to delete session\", {\n sessionId: sessionId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n\n if (deletedCount > 0) {\n logger.info(\"Session cleanup completed\", {\n deletedCount: deletedCount,\n maxAgeDays: maxAgeDays,\n });\n }\n\n return deletedCount;\n }\n\n /**\n * Get a session directory path.\n * @param sessionId - Session ID.\n * @returns Session directory path.\n */\n getSessionPath(sessionId: string): string {\n return path.join(this.sessionsDir, sessionId);\n }\n\n /**\n * Delete a specific session.\n * @param sessionId - Session ID to delete.\n * @returns Whether deletion succeeded.\n */\n deleteSession(sessionId: string): boolean {\n const logger = getLogger();\n const sessionDir = path.join(this.sessionsDir, sessionId);\n\n if (!fs.existsSync(sessionDir)) {\n logger.warn(\"Session not found for deletion\", { sessionId: sessionId });\n return false;\n }\n\n try {\n const currentId = this.getCurrentSessionId();\n if (currentId === sessionId) {\n const currentPath = path.join(this.sessionsDir, \"current\");\n if (fs.existsSync(currentPath)) {\n fs.unlinkSync(currentPath);\n }\n }\n\n fs.rmSync(sessionDir, { recursive: true, force: true });\n logger.info(\"Deleted session\", { sessionId: sessionId });\n return true;\n } catch (error) {\n logger.error(\"Failed to delete session\", {\n sessionId: sessionId,\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n}\n\n/** Cached service instance. */\nlet serviceInstance: StorageService | null = null;\n\n/**\n * Get the singleton StorageService instance.\n * @returns StorageService instance.\n */\nexport function getStorageService(): StorageService {\n serviceInstance ??= new StorageService();\n return serviceInstance;\n}\n\n/**\n * Reset the service (for testing).\n */\nexport function resetStorageService(): void {\n serviceInstance = null;\n}\n","/**\n * Run Result Storage Service.\n *\n * Handles storage for:\n * - Run results (test generation and replay history)\n * - Locally generated test scripts\n *\n * This is a simplified storage service that only handles execution artifacts.\n * All entity management (projects, use cases, test cases) happens in the cloud.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { getLogger } from \"../../shared/logger.js\";\n\nimport { getStorageService } from \"./storage-service.js\";\n\nconst logger = getLogger();\n\n// ========================================\n// Types\n// ========================================\n\n/**\n * Run result status.\n */\nexport type RunResultStatus = \"pending\" | \"running\" | \"passed\" | \"failed\" | \"cancelled\";\n\n/**\n * Run result type.\n */\nexport type RunResultType = \"generation\" | \"replay\";\n\n/**\n * Run result record.\n */\nexport interface IRunResult {\n /** Unique run ID. */\n id: string;\n /** Run type. */\n runType: RunResultType;\n /** Run status. */\n status: RunResultStatus;\n /** Cloud test case ID. */\n cloudTestCaseId: string;\n /** Local URL used for testing. */\n localUrl: string;\n /** Associated test script ID (if generated). */\n testScriptId?: string;\n /** Execution time in ms. */\n executionTimeMs?: number;\n /** Error message if failed. */\n errorMessage?: string;\n /** Created timestamp. */\n createdAt: string;\n /** Updated timestamp. */\n updatedAt: string;\n}\n\n/**\n * Test script status.\n */\nexport type TestScriptStatus = \"pending\" | \"generated\" | \"published\" | \"failed\";\n\n/**\n * Locally generated test script.\n */\nexport interface ILocalTestScript {\n /** Unique script ID. */\n id: string;\n /** Script name. */\n name: string;\n /** Target URL. */\n url: string;\n /** Script status. */\n status: TestScriptStatus;\n /** Cloud test case ID. */\n cloudTestCaseId: string;\n /** Test goal. */\n goal?: string;\n /** Action script steps. */\n actionScript?: unknown[];\n /** Cloud action script ID (if published). */\n cloudActionScriptId?: string;\n /** Created timestamp. */\n createdAt: string;\n /** Updated timestamp. */\n updatedAt: string;\n}\n\n// ========================================\n// Service Implementation\n// ========================================\n\n/**\n * Run Result Storage Service class.\n */\nexport class RunResultStorageService {\n /** Base directory for run results. */\n private readonly runResultsDir: string;\n\n /** Base directory for test scripts. */\n private readonly testScriptsDir: string;\n\n constructor() {\n const storageService = getStorageService();\n const dataDir = storageService.getDataDir();\n\n this.runResultsDir = path.join(dataDir, \"run-results\");\n this.testScriptsDir = path.join(dataDir, \"test-scripts\");\n\n this.ensureDirectories();\n }\n\n /**\n * Ensure storage directories exist.\n */\n private ensureDirectories(): void {\n if (!fs.existsSync(this.runResultsDir)) {\n fs.mkdirSync(this.runResultsDir, { recursive: true });\n }\n if (!fs.existsSync(this.testScriptsDir)) {\n fs.mkdirSync(this.testScriptsDir, { recursive: true });\n }\n }\n\n // ========================================\n // Run Results\n // ========================================\n\n /**\n * List all run results.\n */\n listRunResults(): IRunResult[] {\n try {\n const files = fs.readdirSync(this.runResultsDir).filter((f) => f.endsWith(\".json\"));\n const results: IRunResult[] = [];\n\n for (const file of files) {\n try {\n const content = fs.readFileSync(path.join(this.runResultsDir, file), \"utf-8\");\n results.push(JSON.parse(content) as IRunResult);\n } catch {\n logger.warn(\"Failed to read run result file\", { file: file });\n }\n }\n\n // Sort by created date, newest first\n return results.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n } catch {\n return [];\n }\n }\n\n /**\n * Get a run result by ID.\n */\n getRunResult(runId: string): IRunResult | undefined {\n const filePath = path.join(this.runResultsDir, `${runId}.json`);\n if (!fs.existsSync(filePath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as IRunResult;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Save a run result.\n */\n saveRunResult(result: IRunResult): void {\n const filePath = path.join(this.runResultsDir, `${result.id}.json`);\n fs.writeFileSync(filePath, JSON.stringify(result, null, 2));\n }\n\n /**\n * Create a new run result.\n */\n createRunResult(params: {\n runType: RunResultType;\n cloudTestCaseId: string;\n localUrl: string;\n }): IRunResult {\n const now = new Date().toISOString();\n const id = `run_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n const result: IRunResult = {\n id: id,\n runType: params.runType,\n status: \"pending\",\n cloudTestCaseId: params.cloudTestCaseId,\n localUrl: params.localUrl,\n createdAt: now,\n updatedAt: now,\n };\n\n this.saveRunResult(result);\n return result;\n }\n\n /**\n * Update a run result.\n */\n updateRunResult(runId: string, updates: Partial<IRunResult>): IRunResult | undefined {\n const result = this.getRunResult(runId);\n if (!result) {\n return undefined;\n }\n\n const updated: IRunResult = {\n ...result,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n this.saveRunResult(updated);\n return updated;\n }\n\n // ========================================\n // Test Scripts\n // ========================================\n\n /**\n * List all test scripts.\n */\n listTestScripts(): ILocalTestScript[] {\n try {\n const files = fs.readdirSync(this.testScriptsDir).filter((f) => f.endsWith(\".json\"));\n const scripts: ILocalTestScript[] = [];\n\n for (const file of files) {\n try {\n const content = fs.readFileSync(path.join(this.testScriptsDir, file), \"utf-8\");\n scripts.push(JSON.parse(content) as ILocalTestScript);\n } catch {\n logger.warn(\"Failed to read test script file\", { file: file });\n }\n }\n\n // Sort by created date, newest first\n return scripts.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n } catch {\n return [];\n }\n }\n\n /**\n * Get a test script by ID.\n */\n getTestScript(testScriptId: string): ILocalTestScript | undefined {\n const filePath = path.join(this.testScriptsDir, `${testScriptId}.json`);\n if (!fs.existsSync(filePath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(content) as ILocalTestScript;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Save a test script.\n */\n saveTestScript(script: ILocalTestScript): void {\n const filePath = path.join(this.testScriptsDir, `${script.id}.json`);\n fs.writeFileSync(filePath, JSON.stringify(script, null, 2));\n }\n\n /**\n * Create a new test script.\n */\n createTestScript(params: {\n name: string;\n url: string;\n cloudTestCaseId: string;\n goal?: string;\n }): ILocalTestScript {\n const now = new Date().toISOString();\n const id = `ts_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;\n\n const script: ILocalTestScript = {\n id: id,\n name: params.name,\n url: params.url,\n status: \"pending\",\n cloudTestCaseId: params.cloudTestCaseId,\n goal: params.goal,\n createdAt: now,\n updatedAt: now,\n };\n\n this.saveTestScript(script);\n return script;\n }\n\n /**\n * Update a test script.\n */\n updateTestScript(testScriptId: string, updates: Partial<ILocalTestScript>): ILocalTestScript | undefined {\n const script = this.getTestScript(testScriptId);\n if (!script) {\n return undefined;\n }\n\n const updated: ILocalTestScript = {\n ...script,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n this.saveTestScript(updated);\n return updated;\n }\n}\n\n// ========================================\n// Singleton Instance\n// ========================================\n\nlet instance: RunResultStorageService | null = null;\n\n/**\n * Get the singleton RunResultStorageService instance.\n */\nexport function getRunResultStorageService(): RunResultStorageService {\n if (!instance) {\n instance = new RunResultStorageService();\n }\n return instance;\n}\n\n/**\n * Reset the singleton instance (for testing).\n */\nexport function resetRunResultStorageService(): void {\n instance = null;\n}\n","/**\n * Execution service for managing electron-app processes.\n * Handles test script generation and replay via direct electron-app execution.\n *\n * Design principle: This service accepts full test case/script details\n * (already fetched via qa_* tools by the agent). No cloud calls here.\n * - Stores run results locally\n * - Replaces production URLs with localhost URLs\n */\n\nimport { spawn } from \"child_process\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nimport { getConfig } from \"../../shared/config.js\";\nimport type { TestCaseDetails, TestScriptDetails } from \"../contracts/project-schemas.js\";\nimport { getAuthService, getRunResultStorageService } from \"./index.js\";\nimport type { RunResultStatus } from \"./run-result-storage-service.js\";\n\n// ========================================\n// Types\n// ========================================\n\n/**\n * Internal execution process tracking.\n */\ninterface IInternalExecutionProcess {\n /** Run ID. */\n runId: string;\n /** Child process. */\n process: ReturnType<typeof spawn>;\n /** Run status. */\n status: RunResultStatus;\n /** Started timestamp. */\n startedAt: number;\n /** Timeout timer. */\n timeoutTimer?: ReturnType<typeof setTimeout>;\n /** Captured stdout. */\n capturedStdout: string;\n /** Captured stderr. */\n capturedStderr: string;\n}\n\n/**\n * Run result returned from execution.\n */\nexport interface ILocalRunResult {\n /** Run ID. */\n id: string;\n /** Test script ID. */\n testScriptId?: string;\n /** Run status. */\n status: \"passed\" | \"failed\";\n /** Execution time in ms. */\n executionTimeMs: number;\n /** Error message if failed. */\n errorMessage?: string;\n}\n\n// ========================================\n// Active Process Tracking\n// ========================================\n\n/** Map of active execution processes. */\nconst activeProcesses: Map<string, IInternalExecutionProcess> = new Map();\n\n// ========================================\n// Auth Helpers\n// ========================================\n\n/**\n * Get the authenticated user ID.\n */\nfunction getAuthenticatedUserId(): string {\n const authService = getAuthService();\n const authStatus = authService.getAuthStatus();\n\n if (!authStatus.authenticated) {\n throw new Error(\"Not authenticated. Please run qa_auth_login first.\");\n }\n\n if (!authStatus.userId) {\n throw new Error(\"User ID not found in auth. Please re-authenticate.\");\n }\n\n return authStatus.userId;\n}\n\n/**\n * Build auth content for electron-app.\n */\nfunction buildStudioAuthContent(): { accessToken: string; email: string; userId: string } {\n const authService = getAuthService();\n const authStatus = authService.getAuthStatus();\n const storedAuth = authService.loadStoredAuth();\n\n if (!authStatus.authenticated || !storedAuth) {\n throw new Error(\"Not authenticated. Please run qa_auth_login first.\");\n }\n\n if (!storedAuth.email || !storedAuth.userId) {\n throw new Error(\"Auth data incomplete. Please re-authenticate.\");\n }\n\n return {\n accessToken: storedAuth.accessToken,\n email: storedAuth.email,\n userId: storedAuth.userId,\n };\n}\n\n// ========================================\n// Temp File Helpers\n// ========================================\n\n/**\n * Ensure temp directory exists.\n */\nasync function ensureTempDir(): Promise<string> {\n const config = getConfig();\n const tempDir = path.join(config.localQa.dataDir, \"temp\");\n await fs.mkdir(tempDir, { recursive: true });\n return tempDir;\n}\n\n/**\n * Write data to a temp file.\n */\nasync function writeTempFile(params: { filename: string; data: unknown }): Promise<string> {\n const tempDir = await ensureTempDir();\n const filePath = path.join(tempDir, params.filename);\n await fs.writeFile(filePath, JSON.stringify(params.data, null, 2));\n return filePath;\n}\n\n/**\n * Cleanup temp files.\n */\nasync function cleanupTempFiles(params: { filePaths: string[] }): Promise<void> {\n for (const filePath of params.filePaths) {\n try {\n await fs.unlink(filePath);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n// ========================================\n// Main Execution Functions\n// ========================================\n\n/**\n * Execute test script generation for a test case.\n *\n * Test case details should be fetched via qa_test_case_get before calling this.\n *\n * @param params - Execution parameters.\n * @param params.testCase - Test case details from qa_test_case_get.\n * @param params.localUrl - Local URL to test against.\n * @param params.timeoutMs - Optional timeout in milliseconds.\n * @returns Run result with generated script info.\n */\nexport async function executeTestGeneration(params: {\n testCase: TestCaseDetails;\n localUrl: string;\n timeoutMs?: number;\n}): Promise<ILocalRunResult> {\n const { testCase, localUrl } = params;\n\n // Verify authentication (authContent will be used when electron-app integration is complete)\n getAuthenticatedUserId(); // Throws if not authenticated\n const authContent = buildStudioAuthContent();\n\n // Initialize run result storage\n const storage = getRunResultStorageService();\n const runResult = storage.createRunResult({\n runType: \"generation\",\n cloudTestCaseId: testCase.id,\n localUrl: localUrl,\n });\n\n try {\n // Create local test script record\n const localTestScript = storage.createTestScript({\n name: `Script for ${testCase.title}`,\n url: localUrl,\n cloudTestCaseId: testCase.id,\n goal: testCase.goal,\n });\n\n // Build action script for electron-app\n // TODO: Build proper action script using testCase details\n const actionScript = {\n steps: [\n {\n type: \"navigate\",\n url: localUrl,\n },\n {\n type: \"explore\",\n goal: testCase.goal,\n instructions: testCase.instructions,\n expectedResult: testCase.expectedResult,\n },\n ],\n };\n\n const runId = runResult.id;\n const startedAt = Date.now();\n\n // Write temp files\n const inputFilePath = await writeTempFile({\n filename: `${runId}_input.json`,\n data: actionScript,\n });\n const authFilePath = await writeTempFile({\n filename: `${runId}_auth.json`,\n data: authContent,\n });\n\n // TODO: Spawn electron-app and wait for completion\n // For now, simulate a failure since electron-app integration is not complete\n\n const completedAt = Date.now();\n const executionTimeMs = completedAt - startedAt;\n\n // Update run result with failure\n storage.updateRunResult(runId, {\n status: \"failed\",\n testScriptId: localTestScript.id,\n executionTimeMs: executionTimeMs,\n errorMessage: \"Electron-app execution not yet implemented.\",\n });\n\n // Cleanup temp files\n await cleanupTempFiles({ filePaths: [inputFilePath, authFilePath] });\n\n return {\n id: runId,\n testScriptId: localTestScript.id,\n status: \"failed\",\n executionTimeMs: executionTimeMs,\n errorMessage: \"Electron-app execution not yet implemented.\",\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n storage.updateRunResult(runResult.id, {\n status: \"failed\",\n errorMessage: errorMessage,\n });\n\n return {\n id: runResult.id,\n status: \"failed\",\n executionTimeMs: 0,\n errorMessage: errorMessage,\n };\n }\n}\n\n/**\n * Execute test script replay.\n *\n * Test script details should be fetched via qa_test_script_get before calling this.\n *\n * @param params - Execution parameters.\n * @param params.testScript - Test script details from qa_test_script_get.\n * @param params.localUrl - Local URL to test against.\n * @param params.timeoutMs - Optional timeout in milliseconds.\n * @returns Run result.\n */\nexport async function executeReplay(params: {\n testScript: TestScriptDetails;\n localUrl: string;\n timeoutMs?: number;\n}): Promise<ILocalRunResult> {\n const { testScript, localUrl } = params;\n\n // Verify authentication (authContent will be used when electron-app integration is complete)\n getAuthenticatedUserId(); // Throws if not authenticated\n const authContent = buildStudioAuthContent();\n\n // Initialize run result storage\n const storage = getRunResultStorageService();\n const runResult = storage.createRunResult({\n runType: \"replay\",\n cloudTestCaseId: testScript.testCaseId,\n localUrl: localUrl,\n });\n\n try {\n const runId = runResult.id;\n const startedAt = Date.now();\n\n // Rewrite URLs in action script to use local URL\n const rewrittenActionScript = rewriteActionScriptUrls({\n actionScript: testScript.actionScript,\n originalUrl: testScript.url,\n localUrl: localUrl,\n });\n\n // Write temp files\n const inputFilePath = await writeTempFile({\n filename: `${runId}_input.json`,\n data: rewrittenActionScript,\n });\n const authFilePath = await writeTempFile({\n filename: `${runId}_auth.json`,\n data: authContent,\n });\n\n // TODO: Spawn electron-app and wait for completion\n\n const completedAt = Date.now();\n const executionTimeMs = completedAt - startedAt;\n\n // Update run result with failure\n storage.updateRunResult(runId, {\n status: \"failed\",\n executionTimeMs: executionTimeMs,\n errorMessage: \"Electron-app execution not yet implemented.\",\n });\n\n // Cleanup temp files\n await cleanupTempFiles({ filePaths: [inputFilePath, authFilePath] });\n\n return {\n id: runId,\n status: \"failed\",\n executionTimeMs: executionTimeMs,\n errorMessage: \"Electron-app execution not yet implemented.\",\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n storage.updateRunResult(runResult.id, {\n status: \"failed\",\n errorMessage: errorMessage,\n });\n\n return {\n id: runResult.id,\n status: \"failed\",\n executionTimeMs: 0,\n errorMessage: errorMessage,\n };\n }\n}\n\n/**\n * Rewrite URLs in action script to use local URL.\n *\n * @param params - Rewrite parameters.\n * @param params.actionScript - Original action script steps.\n * @param params.originalUrl - Original cloud URL to replace.\n * @param params.localUrl - Local URL to use.\n * @returns Action script with rewritten URLs.\n */\nfunction rewriteActionScriptUrls(params: {\n actionScript: unknown[];\n originalUrl?: string;\n localUrl: string;\n}): unknown[] {\n const { actionScript, originalUrl, localUrl } = params;\n\n if (!originalUrl) {\n return actionScript;\n }\n\n // Deep clone and replace URLs\n const serialized = JSON.stringify(actionScript);\n const rewritten = serialized.replace(new RegExp(escapeRegex(originalUrl), \"g\"), localUrl);\n return JSON.parse(rewritten) as unknown[];\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Cancel an active execution.\n *\n * @param params - Cancel parameters.\n * @param params.runId - Run ID to cancel.\n * @returns Whether cancellation was successful.\n */\nexport function cancelExecution(params: { runId: string }): boolean {\n const process = activeProcesses.get(params.runId);\n\n if (!process) {\n return false;\n }\n\n // Kill the process\n process.process.kill(\"SIGTERM\");\n\n // Update status\n process.status = \"cancelled\";\n activeProcesses.delete(params.runId);\n\n // Update storage\n const storage = getRunResultStorageService();\n storage.updateRunResult(params.runId, {\n status: \"cancelled\",\n errorMessage: \"Execution cancelled by user.\",\n });\n\n return true;\n}\n\n/**\n * List active executions.\n */\nexport function listActiveExecutions(): Array<{ runId: string; status: RunResultStatus }> {\n return Array.from(activeProcesses.entries()).map(([runId, process]) => ({\n runId: runId,\n status: process.status,\n }));\n}\n","/**\n * Credentials storage for @muggleai/mcp.\n * Manages persistent storage of authentication credentials.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport { getDataDir } from \"./config.js\";\nimport { getLogger } from \"./logger.js\";\nimport type { IStoredCredentials } from \"./types.js\";\n\n/** Credentials file name. */\nconst CREDENTIALS_FILE = \"credentials.json\";\n\n/**\n * Get the path to the credentials file.\n * @returns Path to credentials.json\n */\nexport function getCredentialsFilePath(): string {\n return path.join(getDataDir(), CREDENTIALS_FILE);\n}\n\n/**\n * Ensure the data directory exists.\n */\nfunction ensureDataDir(): void {\n const dataDir = getDataDir();\n if (!fs.existsSync(dataDir)) {\n fs.mkdirSync(dataDir, { recursive: true });\n }\n}\n\n/**\n * Load stored credentials from disk.\n * @returns Stored credentials, or null if not found or invalid.\n */\nexport function loadCredentials(): IStoredCredentials | null {\n const logger = getLogger();\n const credentialsPath = getCredentialsFilePath();\n\n try {\n if (!fs.existsSync(credentialsPath)) {\n logger.debug(\"No credentials file found\", { path: credentialsPath });\n return null;\n }\n\n const content = fs.readFileSync(credentialsPath, \"utf-8\");\n const credentials = JSON.parse(content) as IStoredCredentials;\n\n // Validate required fields\n if (!credentials.accessToken || !credentials.expiresAt) {\n logger.warn(\"Invalid credentials file - missing required fields\");\n return null;\n }\n\n return credentials;\n } catch (error) {\n logger.warn(\"Failed to load credentials\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n}\n\n/**\n * Save credentials to disk.\n * @param credentials - Credentials to save.\n */\nexport function saveCredentials(credentials: IStoredCredentials): void {\n const logger = getLogger();\n const credentialsPath = getCredentialsFilePath();\n\n try {\n ensureDataDir();\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(credentialsPath, content, { mode: 0o600 });\n\n logger.info(\"Credentials saved\", { path: credentialsPath });\n } catch (error) {\n logger.error(\"Failed to save credentials\", {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\n/**\n * Delete stored credentials.\n */\nexport function deleteCredentials(): void {\n const logger = getLogger();\n const credentialsPath = getCredentialsFilePath();\n\n try {\n if (fs.existsSync(credentialsPath)) {\n fs.unlinkSync(credentialsPath);\n logger.info(\"Credentials deleted\", { path: credentialsPath });\n }\n } catch (error) {\n logger.warn(\"Failed to delete credentials\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Check if credentials are expired.\n * @param credentials - Credentials to check.\n * @returns True if expired.\n */\nexport function isCredentialsExpired(credentials: IStoredCredentials): boolean {\n const expiresAt = new Date(credentials.expiresAt);\n const now = new Date();\n\n // Consider expired 5 minutes before actual expiry for safety\n const bufferMs = 5 * 60 * 1000;\n return now.getTime() >= expiresAt.getTime() - bufferMs;\n}\n\n/**\n * Get valid credentials if available.\n * This is primarily used for API key storage.\n * Access token authentication is handled by AuthService.\n * @returns Valid credentials or null.\n */\nexport function getValidCredentials(): IStoredCredentials | null {\n const credentials = loadCredentials();\n\n if (!credentials) {\n return null;\n }\n\n // Return credentials if API key exists (server validates expiry)\n if (credentials.apiKey) {\n return credentials;\n }\n\n return null;\n}\n\n/**\n * Check if an API key is stored.\n * @returns True if API key exists.\n */\nexport function hasApiKey(): boolean {\n const credentials = loadCredentials();\n return !!credentials?.apiKey;\n}\n\n/**\n * Get stored API key if available.\n * @returns API key or null.\n */\nexport function getApiKey(): string | null {\n const credentials = loadCredentials();\n return credentials?.apiKey ?? null;\n}\n\n/**\n * Save API key to credentials.\n * @param apiKey - The API key to save.\n * @param apiKeyId - The API key ID.\n */\nexport function saveApiKey(params: { apiKey: string; apiKeyId: string }): void {\n const logger = getLogger();\n const credentialsPath = getCredentialsFilePath();\n\n try {\n ensureDataDir();\n\n const credentials: IStoredCredentials = {\n accessToken: \"\",\n expiresAt: \"\",\n apiKey: params.apiKey,\n apiKeyId: params.apiKeyId,\n };\n\n const content = JSON.stringify(credentials, null, 2);\n fs.writeFileSync(credentialsPath, content, { mode: 0o600 });\n\n logger.info(\"API key saved\", { path: credentialsPath });\n } catch (error) {\n logger.error(\"Failed to save API key\", {\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n","/**\n * Authentication module for @muggleai/mcp.\n * Implements device code flow for user authentication.\n */\n\nimport axios, { AxiosError } from \"axios\";\n\nimport { getAuthService } from \"../local-qa/services/index.js\";\nimport { getConfig } from \"./config.js\";\nimport {\n deleteCredentials,\n getValidCredentials,\n saveCredentials,\n} from \"./credentials.js\";\nimport { getLogger } from \"./logger.js\";\nimport { openBrowserUrl } from \"./open-browser.js\";\nimport type {\n IAuth0Config,\n ICallerCredentials,\n IDeviceCodePollResponse,\n IDeviceCodeResponse,\n IStoredCredentials,\n} from \"./types.js\";\n\nconst logger = getLogger();\n\n/**\n * Start the device code authorization flow.\n * Returns a device code and verification URL for the user.\n *\n * @param config - Auth0 configuration.\n * @returns Device code response with URLs and codes.\n * @throws Error if the device code request fails.\n */\nexport async function startDeviceCodeFlow(config: IAuth0Config): Promise<IDeviceCodeResponse> {\n const deviceCodeUrl = `https://${config.domain}/oauth/device/code`;\n\n try {\n logger.info(\"[Auth] Starting device code flow\", {\n domain: config.domain,\n clientId: config.clientId,\n });\n\n const response = await axios.post(\n deviceCodeUrl,\n new URLSearchParams({\n client_id: config.clientId,\n scope: config.scope,\n audience: config.audience,\n }).toString(),\n {\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n },\n );\n\n const data = response.data;\n\n logger.info(\"[Auth] Device code flow started successfully\", {\n userCode: data.user_code,\n expiresIn: data.expires_in,\n });\n\n // Try to open browser automatically\n const browserOpenResult = await openBrowserUrl({\n url: data.verification_uri_complete,\n });\n\n if (browserOpenResult.opened) {\n logger.info(\"[Auth] Browser opened for device code login\");\n } else {\n logger.warn(\"[Auth] Failed to open browser\", {\n error: browserOpenResult.error,\n verificationUriComplete: data.verification_uri_complete,\n });\n }\n\n return {\n deviceCode: data.device_code,\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n verificationUriComplete: data.verification_uri_complete,\n expiresIn: data.expires_in,\n interval: data.interval || 5,\n browserOpened: browserOpenResult.opened,\n browserOpenError: browserOpenResult.error,\n };\n } catch (error) {\n if (error instanceof AxiosError) {\n logger.error(\"[Auth] Failed to start device code flow\", {\n status: error.response?.status,\n data: error.response?.data,\n });\n throw new Error(\n `Failed to start device code flow: ${error.response?.data?.error_description || error.message}`,\n );\n }\n throw error;\n }\n}\n\n/**\n * Poll for device code authorization completion.\n * Should be called at the interval specified in startDeviceCodeFlow response.\n *\n * @param config - Auth0 configuration.\n * @param deviceCode - The device code from startDeviceCodeFlow.\n * @returns Poll response with status and optionally access token.\n */\nexport async function pollDeviceCode(\n config: IAuth0Config,\n deviceCode: string,\n): Promise<IDeviceCodePollResponse> {\n const tokenUrl = `https://${config.domain}/oauth/token`;\n\n try {\n const response = await axios.post(\n tokenUrl,\n new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n client_id: config.clientId,\n }).toString(),\n {\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n },\n );\n\n logger.info(\"[Auth] Authorization successful\");\n\n return {\n status: \"authorized\",\n accessToken: response.data.access_token,\n tokenType: response.data.token_type,\n expiresIn: response.data.expires_in,\n };\n } catch (error) {\n if (error instanceof AxiosError && error.response) {\n const data = error.response.data;\n const errorCode = data.error;\n\n if (errorCode === \"authorization_pending\") {\n return {\n status: \"authorization_pending\",\n error: errorCode,\n errorDescription: data.error_description || \"User has not yet authorized\",\n };\n }\n\n if (errorCode === \"slow_down\") {\n return {\n status: \"slow_down\",\n error: errorCode,\n errorDescription: data.error_description || \"Too many requests, slow down\",\n };\n }\n\n if (errorCode === \"expired_token\") {\n return {\n status: \"expired_token\",\n error: errorCode,\n errorDescription: data.error_description || \"Device code expired, please restart flow\",\n };\n }\n\n if (errorCode === \"access_denied\") {\n return {\n status: \"access_denied\",\n error: errorCode,\n errorDescription: data.error_description || \"User denied access\",\n };\n }\n\n logger.error(\"[Auth] Unexpected error during poll\", {\n status: error.response.status,\n error: errorCode,\n description: data.error_description,\n });\n\n throw new Error(\n `Device code poll failed: ${data.error_description || data.error || \"Unknown error\"}`,\n );\n }\n throw error;\n }\n}\n\n/**\n * Create an API key using an access token.\n * Calls the prompt service API to create a new API key.\n *\n * @param accessToken - Auth0 access token.\n * @param keyName - Optional name for the API key.\n * @param expiry - Expiry option ('30d', '90d', '1y', 'never').\n * @returns Created API key details.\n */\nexport async function createApiKeyWithToken(\n accessToken: string,\n keyName: string | undefined,\n expiry: \"30d\" | \"90d\" | \"1y\" | \"never\" = \"90d\",\n): Promise<{\n id: string;\n key: string;\n name: string | null;\n status: string;\n prefix: string;\n lastFour: string;\n createdAt: number;\n expiresAt: number | null;\n}> {\n const config = getConfig();\n const apiKeyUrl = `${config.qa.promptServiceBaseUrl}/v1/protected/api-keys`;\n\n try {\n logger.info(\"[Auth] Creating API key\", {\n keyName: keyName,\n expiry: expiry,\n });\n\n const response = await axios.post(\n apiKeyUrl,\n {\n name: keyName || \"MCP Auto-Generated\",\n expiry: expiry,\n },\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n },\n );\n\n logger.info(\"[Auth] API key created successfully\", {\n keyId: response.data.id,\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof AxiosError) {\n logger.error(\"[Auth] Failed to create API key\", {\n status: error.response?.status,\n data: error.response?.data,\n });\n throw new Error(\n `Failed to create API key: ${error.response?.data?.message || error.message}`,\n );\n }\n throw error;\n }\n}\n\n/**\n * Complete the full device code login flow.\n * Starts the flow, waits for user authorization, and stores credentials.\n * API key creation is optional - only created when keyName is provided.\n *\n * @param keyName - Optional name for the API key. If provided, creates an API key.\n * @param keyExpiry - Expiry option for API key (only used if keyName is provided).\n * @param timeoutMs - Maximum time to wait for authorization.\n * @returns Result of the login flow.\n */\nexport async function performLogin(\n keyName?: string,\n keyExpiry: \"30d\" | \"90d\" | \"1y\" | \"never\" = \"90d\",\n timeoutMs: number = 120000,\n): Promise<{\n success: boolean;\n deviceCodeResponse?: IDeviceCodeResponse;\n credentials?: IStoredCredentials;\n error?: string;\n}> {\n const authService = getAuthService();\n\n try {\n // Start device code flow via AuthService\n const authDeviceCodeResponse = await authService.startDeviceCodeFlow();\n\n // Map to shared type (ensure browserOpened is defined)\n const deviceCodeResponse: IDeviceCodeResponse = {\n deviceCode: authDeviceCodeResponse.deviceCode,\n userCode: authDeviceCodeResponse.userCode,\n verificationUri: authDeviceCodeResponse.verificationUri,\n verificationUriComplete: authDeviceCodeResponse.verificationUriComplete,\n expiresIn: authDeviceCodeResponse.expiresIn,\n interval: authDeviceCodeResponse.interval,\n browserOpened: authDeviceCodeResponse.browserOpened ?? false,\n browserOpenError: authDeviceCodeResponse.browserOpenError,\n };\n\n // Poll for completion\n const pollResult = await authService.waitForDeviceCodeAuthorization({\n deviceCode: deviceCodeResponse.deviceCode,\n intervalSeconds: deviceCodeResponse.interval,\n timeoutMs: timeoutMs,\n });\n\n if (pollResult.status === \"complete\") {\n // Auth stored by AuthService, get the stored credentials\n const storedAuth = authService.loadStoredAuth();\n\n // Build credentials object for return value\n const credentials: IStoredCredentials = {\n accessToken: storedAuth?.accessToken ?? \"\",\n expiresAt: storedAuth?.expiresAt ?? \"\",\n email: storedAuth?.email,\n userId: storedAuth?.userId,\n };\n\n // Only create API key if explicitly requested (keyName provided)\n if (keyName && storedAuth?.accessToken) {\n logger.info(\"[Auth] Creating API key as explicitly requested\", {\n keyName: keyName,\n });\n\n const apiKeyResult = await createApiKeyWithToken(\n storedAuth.accessToken,\n keyName,\n keyExpiry,\n );\n\n credentials.apiKey = apiKeyResult.key;\n credentials.apiKeyId = apiKeyResult.id;\n\n // Save API key to credentials.json for future use\n saveCredentials(credentials);\n }\n\n return {\n success: true,\n deviceCodeResponse: deviceCodeResponse,\n credentials: credentials,\n };\n }\n\n if (pollResult.status === \"expired\") {\n return {\n success: false,\n deviceCodeResponse: deviceCodeResponse,\n error: \"Device code expired. Please try again.\",\n };\n }\n\n if (pollResult.status === \"error\") {\n return {\n success: false,\n deviceCodeResponse: deviceCodeResponse,\n error: pollResult.error ?? pollResult.message,\n };\n }\n\n // Pending/timeout\n return {\n success: false,\n deviceCodeResponse: deviceCodeResponse,\n error: pollResult.message,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Perform logout by clearing all credentials (auth tokens and API keys).\n */\nexport function performLogout(): void {\n // Clear AuthService auth (access token, refresh token)\n const authService = getAuthService();\n authService.logout();\n\n // Clear API key credentials\n deleteCredentials();\n\n logger.info(\"[Auth] Logged out successfully\");\n}\n\n/**\n * Get caller credentials for API requests (sync version).\n * Checks for API key first, then falls back to access token.\n * Does NOT auto-refresh - use getCallerCredentialsAsync() for that.\n * @returns Caller credentials or empty object.\n */\nexport function getCallerCredentials(): ICallerCredentials {\n // Check for explicit API key in credentials.json\n const credentials = getValidCredentials();\n\n if (credentials?.apiKey) {\n return { apiKey: credentials.apiKey };\n }\n\n // Fall back to access token from AuthService\n const authService = getAuthService();\n const accessToken = authService.getAccessToken();\n\n if (accessToken) {\n return { bearerToken: accessToken };\n }\n\n return {};\n}\n\n/**\n * Get caller credentials for API requests (async version with auto-refresh).\n * This is the preferred method - automatically refreshes expired access tokens.\n * Priority: 1) API key (if explicitly set), 2) Access token (with auto-refresh)\n * @returns Caller credentials or empty object.\n */\nexport async function getCallerCredentialsAsync(): Promise<ICallerCredentials> {\n // Check for explicit API key in credentials.json\n const credentials = getValidCredentials();\n\n if (credentials?.apiKey) {\n return { apiKey: credentials.apiKey };\n }\n\n // Use AuthService for access token with auto-refresh\n const authService = getAuthService();\n const accessToken = await authService.getValidAccessToken();\n\n if (accessToken) {\n return { bearerToken: accessToken };\n }\n\n return {};\n}\n\n/**\n * Check if authentication is required for the given tool.\n * Local-only tools don't require auth.\n * @param toolName - Name of the tool.\n * @returns True if tool requires authentication.\n */\nexport function toolRequiresAuth(toolName: string): boolean {\n // Local tools that don't require auth\n const noAuthTools = [\n // Auth tools (remote tools that don't require prior auth)\n \"muggle-remote-auth-status\",\n \"muggle-remote-auth-login\",\n \"muggle-remote-auth-poll\",\n \"muggle-remote-auth-logout\",\n // Local project tools (no cloud)\n \"muggle-local-project-create\",\n \"muggle-local-project-list\",\n \"muggle-local-project-get\",\n \"muggle-local-project-update\",\n \"muggle-local-project-delete\",\n \"muggle-local-use-case-save\",\n \"muggle-local-use-case-list\",\n \"muggle-local-use-case-get\",\n \"muggle-local-use-case-update\",\n \"muggle-local-use-case-delete\",\n \"muggle-local-test-case-save\",\n \"muggle-local-test-case-list\",\n \"muggle-local-test-case-get\",\n \"muggle-local-test-case-update\",\n \"muggle-local-test-case-delete\",\n \"muggle-local-test-script-save\",\n \"muggle-local-test-script-list\",\n \"muggle-local-test-script-get\",\n \"muggle-local-test-script-delete\",\n \"muggle-local-execute-test-generation\",\n \"muggle-local-execute-replay\",\n \"muggle-local-cancel-execution\",\n \"muggle-local-check-status\",\n \"muggle-local-list-sessions\",\n \"muggle-local-cleanup-sessions\",\n \"muggle-local-get-page-state\",\n \"muggle-local-run-test\",\n \"muggle-local-explore-page\",\n \"muggle-local-execute-action\",\n \"muggle-local-get-screenshot\",\n \"muggle-local-run-result-list\",\n \"muggle-local-run-result-get\",\n \"muggle-local-secret-create\",\n \"muggle-local-secret-list\",\n \"muggle-local-secret-get\",\n \"muggle-local-secret-update\",\n \"muggle-local-secret-delete\",\n \"muggle-local-workflow-file-create\",\n \"muggle-local-workflow-file-list\",\n \"muggle-local-workflow-file-list-available\",\n \"muggle-local-workflow-file-get\",\n \"muggle-local-workflow-file-update\",\n \"muggle-local-workflow-file-delete\",\n \"muggle-local-publish-test-script\",\n ];\n\n return !noAuthTools.includes(toolName);\n}\n","/**\n * Unified MCP server implementation for @muggleai/mcp.\n * Combines QA Gateway and Local QA tools into a single server.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { ZodError } from \"zod\";\n\nimport { getCallerCredentials, toolRequiresAuth } from \"../shared/auth.js\";\nimport { getConfig } from \"../shared/config.js\";\nimport { createChildLogger, getLogger } from \"../shared/logger.js\";\nimport type { ICallerCredentials, IMcpTool } from \"../shared/types.js\";\n\n/** Options for creating the unified MCP server. */\nexport interface IUnifiedMcpServerOptions {\n /** Enable Cloud QA tools. */\n enableQaTools: boolean;\n /** Enable Local QA tools. */\n enableLocalTools: boolean;\n}\n\n/** Global tool registry. */\nlet registeredTools: IMcpTool[] = [];\n\n/**\n * Register tools with the server.\n * @param tools - Tools to register.\n */\nexport function registerTools(tools: IMcpTool[]): void {\n registeredTools = [...registeredTools, ...tools];\n}\n\n/**\n * Get all registered tools.\n * @returns Array of registered tools.\n */\nexport function getAllTools(): IMcpTool[] {\n return registeredTools;\n}\n\n/**\n * Clear all registered tools (for testing).\n */\nexport function clearTools(): void {\n registeredTools = [];\n}\n\n/**\n * Convert a Zod schema to JSON Schema format for MCP.\n * @param schema - Zod schema.\n * @returns JSON Schema object.\n */\nfunction zodToJsonSchema(schema: unknown): object {\n try {\n const zodSchema = schema as { _def?: { typeName?: string } };\n if (zodSchema._def) {\n return convertZodDef(zodSchema);\n }\n } catch {\n // Fallback to generic schema\n }\n\n return {\n type: \"object\",\n properties: {},\n additionalProperties: true,\n };\n}\n\n/**\n * Convert Zod definition to JSON Schema.\n * @param schema - Zod schema definition.\n * @returns JSON Schema object.\n */\nfunction convertZodDef(schema: unknown): object {\n const zodSchema = schema as {\n _def?: {\n typeName?: string;\n shape?: () => Record<string, unknown>;\n innerType?: unknown;\n checks?: Array<{ kind: string; value?: unknown }>;\n description?: string;\n values?: string[];\n options?: unknown[];\n };\n shape?: Record<string, unknown>;\n description?: string;\n };\n\n if (!zodSchema._def) {\n return { type: \"object\" };\n }\n\n const def = zodSchema._def;\n const typeName = def.typeName;\n\n switch (typeName) {\n case \"ZodObject\": {\n const shape = def.shape ? def.shape() : zodSchema.shape || {};\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = convertZodDef(value);\n const valueDef = (value as { _def?: { typeName?: string } })._def;\n if (valueDef?.typeName !== \"ZodOptional\") {\n required.push(key);\n }\n }\n\n const result: Record<string, unknown> = {\n type: \"object\",\n properties: properties,\n };\n if (required.length > 0) {\n result.required = required;\n }\n return result;\n }\n\n case \"ZodString\": {\n const result: Record<string, unknown> = { type: \"string\" };\n if (def.description) result.description = def.description;\n if (def.checks) {\n for (const check of def.checks) {\n if (check.kind === \"min\") result.minLength = check.value;\n if (check.kind === \"max\") result.maxLength = check.value;\n if (check.kind === \"url\") result.format = \"uri\";\n if (check.kind === \"email\") result.format = \"email\";\n }\n }\n return result;\n }\n\n case \"ZodNumber\": {\n const result: Record<string, unknown> = { type: \"number\" };\n if (def.description) result.description = def.description;\n if (def.checks) {\n for (const check of def.checks) {\n if (check.kind === \"int\") result.type = \"integer\";\n if (check.kind === \"min\") result.minimum = check.value;\n if (check.kind === \"max\") result.maximum = check.value;\n }\n }\n return result;\n }\n\n case \"ZodBoolean\": {\n const result: Record<string, unknown> = { type: \"boolean\" };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case \"ZodArray\": {\n const result: Record<string, unknown> = {\n type: \"array\",\n items: def.innerType ? convertZodDef(def.innerType) : {},\n };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case \"ZodEnum\": {\n const result: Record<string, unknown> = {\n type: \"string\",\n enum: def.values || [],\n };\n if (def.description) result.description = def.description;\n return result;\n }\n\n case \"ZodOptional\": {\n const inner = def.innerType ? convertZodDef(def.innerType) : {};\n if (def.description) (inner as Record<string, unknown>).description = def.description;\n return inner;\n }\n\n case \"ZodUnion\": {\n const options = def.options || [];\n return {\n oneOf: options.map((opt) => convertZodDef(opt)),\n };\n }\n\n default:\n return { type: \"object\" };\n }\n}\n\n/**\n * Handle just-in-time authentication for tools that require it.\n * @param toolName - Name of the tool being called.\n * @param correlationId - Request correlation ID.\n * @returns Credentials if available, or triggers auth flow.\n */\nasync function handleJitAuth(\n toolName: string,\n correlationId: string,\n): Promise<{ credentials: ICallerCredentials; authTriggered: boolean }> {\n const childLogger = createChildLogger(correlationId);\n\n // Check if tool requires auth\n if (!toolRequiresAuth(toolName)) {\n return { credentials: {}, authTriggered: false };\n }\n\n // Check for valid credentials\n const credentials = getCallerCredentials();\n if (credentials.apiKey || credentials.bearerToken) {\n return { credentials: credentials, authTriggered: false };\n }\n\n // No credentials - trigger auth flow\n childLogger.info(\"No credentials found, triggering JIT auth\", { tool: toolName });\n\n // For now, return empty credentials and let the tool fail with auth error\n // The full JIT auth flow would be more complex (involving browser popup)\n return { credentials: {}, authTriggered: false };\n}\n\n/**\n * Create and configure the unified MCP server.\n * @param options - Server options.\n * @returns Configured MCP Server instance.\n */\nexport function createUnifiedMcpServer(options: IUnifiedMcpServerOptions): Server {\n const logger = getLogger();\n const config = getConfig();\n\n const server = new Server(\n {\n name: config.serverName,\n version: config.serverVersion,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n );\n\n // Handle list tools request\n server.setRequestHandler(ListToolsRequestSchema, () => {\n const tools = getAllTools();\n logger.debug(\"Listing tools\", { count: tools.length });\n\n const toolDefinitions = tools.map((tool) => {\n const jsonSchema = zodToJsonSchema(tool.inputSchema);\n\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: jsonSchema,\n };\n });\n\n return { tools: toolDefinitions };\n });\n\n // Handle call tool request\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const correlationId = uuidv4();\n const childLogger = createChildLogger(correlationId);\n\n const toolName = request.params.name;\n const toolInput = request.params.arguments || {};\n\n childLogger.info(\"Tool call received\", {\n tool: toolName,\n hasArguments: Object.keys(toolInput).length > 0,\n });\n\n try {\n // Find the tool\n const tool = getAllTools().find((t) => t.name === toolName);\n if (!tool) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: \"NOT_FOUND\",\n message: `Unknown tool: ${toolName}`,\n }),\n },\n ],\n isError: true,\n };\n }\n\n // Handle JIT authentication\n const { authTriggered } = await handleJitAuth(toolName, correlationId);\n\n if (authTriggered) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n message: \"Authentication required. Please complete login in your browser.\",\n }),\n },\n ],\n };\n }\n\n // Execute the tool\n const startTime = Date.now();\n const result = await tool.execute({\n input: toolInput,\n correlationId: correlationId,\n });\n const latency = Date.now() - startTime;\n\n childLogger.info(\"Tool call completed\", {\n tool: toolName,\n latencyMs: latency,\n isError: result.isError,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: result.content,\n },\n ],\n isError: result.isError,\n };\n } catch (error) {\n if (error instanceof ZodError) {\n childLogger.warn(\"Tool call failed with validation error\", {\n tool: toolName,\n errors: error.errors,\n });\n\n const issueMessages = error.errors.slice(0, 3).map((issue) => {\n const path = issue.path.join(\".\");\n return path ? `'${path}': ${issue.message}` : issue.message;\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: \"INVALID_ARGUMENT\",\n message: `Invalid input: ${issueMessages.join(\"; \")}`,\n }),\n },\n ],\n isError: true,\n };\n }\n\n childLogger.error(\"Tool call failed with error\", {\n tool: toolName,\n error: String(error),\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"An unexpected error occurred\",\n }),\n },\n ],\n isError: true,\n };\n }\n });\n\n // Handle list resources request\n server.setRequestHandler(ListResourcesRequestSchema, () => {\n logger.debug(\"Listing resources\");\n return { resources: [] };\n });\n\n // Handle read resource request\n server.setRequestHandler(ReadResourceRequestSchema, (request) => {\n const uri = request.params.uri;\n logger.debug(\"Reading resource\", { uri: uri });\n\n return {\n contents: [\n {\n uri: uri,\n mimeType: \"text/plain\",\n text: `Resource not found: ${uri}`,\n },\n ],\n };\n });\n\n logger.info(\"Unified MCP server configured\", {\n tools: getAllTools().length,\n enableQaTools: options.enableQaTools,\n enableLocalTools: options.enableLocalTools,\n });\n\n return server;\n}\n","/**\n * Server module exports for @muggleai/mcp.\n */\n\nexport * from \"./mcp-server.js\";\nexport * from \"./stdio-server.js\";\n","/**\n * Stdio server implementation for @muggleai/mcp.\n * Runs the MCP server using stdin/stdout transport.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { getLogger } from \"../shared/logger.js\";\n\nconst logger = getLogger();\n\n/**\n * Start the MCP server using stdio transport.\n * @param server - Configured MCP Server instance.\n */\nexport async function startStdioServer(server: Server): Promise<void> {\n logger.info(\"Starting stdio server transport\");\n\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n\n logger.info(\"Stdio server connected\");\n\n // Handle process signals for graceful shutdown\n const shutdown = (signal: string): void => {\n logger.info(`Received ${signal}, shutting down...`);\n process.exit(0);\n };\n\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n}\n","/**\n * QA Gateway tools module.\n * Cloud-based QA tools that require authentication.\n */\n\nimport type { IMcpTool } from \"../shared/types.js\";\n\nimport { allQaToolDefinitions, executeQaTool } from \"./tools/tool-registry.js\";\n\nexport * from \"./contracts/index.js\";\nexport * from \"./tools/index.js\";\nexport * from \"./types.js\";\nexport * from \"./upstream-client.js\";\n\n/**\n * Convert QA tool definitions to IMcpTool format.\n * @returns Array of IMcpTool definitions.\n */\nexport function getQaTools(): IMcpTool[] {\n return allQaToolDefinitions.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n requiresAuth: tool.requiresAuth !== false,\n execute: async (params: { input: unknown; correlationId: string }) => {\n return executeQaTool(tool.name, params.input, params.correlationId);\n },\n }));\n}\n","/**\n * Zod schemas/contracts for QA Gateway tools.\n */\n\nimport { z } from \"zod\";\n\n// =============================================================================\n// Common Schemas\n// =============================================================================\n\n/** Pagination input schema. */\nexport const PaginationInputSchema = z.object({\n page: z.number().int().positive().optional().describe(\"Page number (1-based)\"),\n pageSize: z.number().int().positive().max(100).optional().describe(\"Number of items per page\"),\n});\n\n/** ID string schema. */\nexport const IdSchema = z.string().min(1).describe(\"Unique identifier\");\n\n/** Optional workflow parameters. */\nexport const WorkflowParamsSchema = z\n .record(z.unknown())\n .optional()\n .describe(\"Optional workflow parameters for memory configuration overrides\");\n\n// =============================================================================\n// Project Schemas\n// =============================================================================\n\nexport const ProjectCreateInputSchema = z.object({\n projectName: z.string().min(1).max(255).describe(\"Name of the project\"),\n description: z.string().min(1).describe(\"Project description\"),\n url: z.string().url().describe(\"Target website URL to test\"),\n});\n\nexport const ProjectGetInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to retrieve\"),\n});\n\nexport const ProjectDeleteInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to delete\"),\n});\n\nexport const ProjectUpdateInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to update\"),\n projectName: z.string().min(1).max(255).optional().describe(\"New project name\"),\n description: z.string().optional().describe(\"Updated description\"),\n url: z.string().url().optional().describe(\"Updated target URL\"),\n});\n\nexport const ProjectListInputSchema = PaginationInputSchema.extend({});\n\n// =============================================================================\n// PRD File Schemas\n// =============================================================================\n\nexport const PrdFileUploadInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to associate the PRD file with\"),\n fileName: z.string().min(1).describe(\"Name of the file\"),\n contentBase64: z.string().min(1).describe(\"Base64-encoded file content\"),\n contentType: z.string().optional().describe(\"MIME type of the file\"),\n});\n\nexport const PrdFileListInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to list PRD files for\"),\n});\n\nexport const PrdFileDeleteInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n prdFileId: IdSchema.describe(\"PRD file ID to delete\"),\n});\n\nexport const PrdFileProcessStartInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to process PRD files for\"),\n name: z.string().min(1).describe(\"Workflow name\"),\n description: z.string().min(1).describe(\"Description of the PRD processing workflow\"),\n prdFilePath: z.string().min(1).describe(\"Storage path of the uploaded PRD file (from upload response)\"),\n originalFileName: z.string().min(1).describe(\"Original file name of the PRD document\"),\n url: z.string().url().describe(\"Target website URL for context\"),\n contentChecksum: z.string().min(1).describe(\"SHA-256 checksum of the PRD file content (from upload response)\"),\n fileSize: z.number().int().min(0).describe(\"Size of the PRD file in bytes (from upload response)\"),\n});\n\nexport const PrdFileProcessLatestRunInputSchema = z.object({\n workflowRuntimeId: IdSchema.describe(\"PRD processing workflow runtime ID\"),\n});\n\n// =============================================================================\n// Secret Schemas\n// =============================================================================\n\nexport const SecretListInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to list secrets for\"),\n});\n\nexport const SecretCreateInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to create the secret for\"),\n name: z.string().min(1).describe(\"Secret name/key\"),\n value: z.string().min(1).describe(\"Secret value\"),\n description: z.string().min(1).describe(\"Human-readable description for selection guidance\"),\n source: z.enum([\"user\", \"agent\"]).optional().describe(\"Source of the secret: 'user' for user-provided credentials, 'agent' for agent-generated credentials\"),\n});\n\nexport const SecretGetInputSchema = z.object({\n secretId: IdSchema.describe(\"Secret ID to retrieve\"),\n});\n\nexport const SecretUpdateInputSchema = z.object({\n secretId: IdSchema.describe(\"Secret ID to update\"),\n name: z.string().min(1).optional().describe(\"Updated secret name\"),\n value: z.string().min(1).optional().describe(\"Updated secret value\"),\n description: z.string().optional().describe(\"Updated description\"),\n});\n\nexport const SecretDeleteInputSchema = z.object({\n secretId: IdSchema.describe(\"Secret ID to delete\"),\n});\n\n// =============================================================================\n// Use Case Schemas\n// =============================================================================\n\nexport const UseCaseDiscoveryMemoryGetInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to get use case discovery memory for\"),\n});\n\nexport const UseCaseCandidatesApproveInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n approvedCandidateIds: z.array(IdSchema).min(1).describe(\"IDs of candidates to approve/graduate\"),\n});\n\nexport const UseCaseListInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to list use cases for\"),\n}).merge(PaginationInputSchema);\n\nexport const UseCaseGetInputSchema = z.object({\n useCaseId: IdSchema.describe(\"Use case ID to retrieve\"),\n});\n\nexport const UseCasePromptPreviewInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to generate use case for\"),\n instruction: z.string().min(1).describe(\"Natural language instruction describing the use case (e.g., 'As a logged-in user, I can add items to cart')\"),\n});\n\nexport const UseCaseCreateFromPromptsInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to create use cases for\"),\n prompts: z.array(z.object({\n instruction: z.string().min(1).describe(\"Natural language instruction describing the use case\"),\n })).min(1).describe(\"Array of prompts to generate use cases from\"),\n});\n\nexport const UseCaseUpdateFromPromptInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n useCaseId: IdSchema.describe(\"Use case ID to update\"),\n instruction: z.string().min(1).describe(\"Natural language instruction to regenerate the use case from\"),\n});\n\n// =============================================================================\n// Test Case Schemas\n// =============================================================================\n\nexport const TestCaseListInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to list test cases for\"),\n}).merge(PaginationInputSchema);\n\nexport const TestCaseGetInputSchema = z.object({\n testCaseId: IdSchema.describe(\"Test case ID to retrieve\"),\n});\n\nexport const TestCaseListByUseCaseInputSchema = z.object({\n useCaseId: IdSchema.describe(\"Use case ID to list test cases for\"),\n});\n\nexport const TestCaseGenerateFromPromptInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n useCaseId: IdSchema.describe(\"Use case ID to generate test cases for\"),\n instruction: z.string().min(1).describe(\"Natural language instruction describing the test cases to generate\"),\n});\n\nexport const TestCaseCreateInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n useCaseId: IdSchema.describe(\"Use case ID to associate the test case with\"),\n title: z.string().min(1).describe(\"Test case title\"),\n description: z.string().min(1).describe(\"Detailed description of what the test case validates\"),\n goal: z.string().min(1).describe(\"Concise, measurable goal of the test\"),\n precondition: z.string().optional().describe(\"Initial state/setup required before test execution\"),\n expectedResult: z.string().min(1).describe(\"Expected outcome after test execution\"),\n url: z.string().url().describe(\"Target URL for the test case\"),\n status: z.enum([\"DRAFT\", \"ACTIVE\", \"DEPRECATED\", \"ARCHIVED\"]).optional().describe(\"Test case status\"),\n priority: z.enum([\"HIGH\", \"MEDIUM\", \"LOW\"]).optional().describe(\"Test case priority\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n category: z.string().optional().describe(\"Test case category\"),\n automated: z.boolean().optional().describe(\"Whether this test case is automated (default: true)\"),\n});\n\n// =============================================================================\n// Test Script Schemas\n// =============================================================================\n\nexport const TestScriptListInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to list test scripts for\"),\n}).merge(PaginationInputSchema);\n\nexport const TestScriptGetInputSchema = z.object({\n testScriptId: IdSchema.describe(\"Test script ID to retrieve\"),\n});\n\nexport const TestScriptListPaginatedInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to list test scripts for\"),\n}).merge(PaginationInputSchema);\n\n// =============================================================================\n// Workflow Schemas\n// =============================================================================\n\nexport const WorkflowStartWebsiteScanInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to scan\"),\n url: z.string().url().describe(\"Website URL to scan\"),\n description: z.string().min(1).describe(\"Description of what to scan/discover\"),\n archiveUnapproved: z.boolean().optional().describe(\"Whether to archive unapproved candidates before scanning\"),\n workflowParams: WorkflowParamsSchema,\n});\n\nexport const WorkflowListRuntimesInputSchema = z.object({\n projectId: IdSchema.optional().describe(\"Filter by project ID\"),\n});\n\nexport const WorkflowGetLatestRunInputSchema = z.object({\n workflowRuntimeId: IdSchema.describe(\"Workflow runtime ID\"),\n});\n\nexport const WorkflowStartTestCaseDetectionInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n useCaseId: IdSchema.describe(\"Use case ID to detect test cases for\"),\n name: z.string().min(1).describe(\"Workflow name\"),\n description: z.string().min(1).describe(\"Workflow description\"),\n url: z.string().url().describe(\"Target website URL\"),\n workflowParams: WorkflowParamsSchema,\n});\n\nexport const WorkflowStartTestScriptGenerationInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n useCaseId: IdSchema.describe(\"Use case ID\"),\n testCaseId: IdSchema.describe(\"Test case ID\"),\n name: z.string().min(1).describe(\"Workflow name\"),\n url: z.string().url().describe(\"Target website URL\"),\n goal: z.string().min(1).describe(\"Test goal\"),\n precondition: z.string().min(1).describe(\"Preconditions\"),\n instructions: z.string().min(1).describe(\"Step-by-step instructions\"),\n expectedResult: z.string().min(1).describe(\"Expected result\"),\n workflowParams: WorkflowParamsSchema,\n});\n\nexport const WorkflowGetLatestScriptGenByTestCaseInputSchema = z.object({\n testCaseId: IdSchema.describe(\"Test case ID\"),\n});\n\nexport const WorkflowStartTestScriptReplayInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n useCaseId: IdSchema.describe(\"Use case ID\"),\n testCaseId: IdSchema.describe(\"Test case ID\"),\n testScriptId: IdSchema.describe(\"Test script ID to replay\"),\n name: z.string().min(1).describe(\"Workflow name\"),\n workflowParams: WorkflowParamsSchema,\n});\n\nexport const WorkflowStartTestScriptReplayBulkInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n name: z.string().min(1).describe(\"Workflow name\"),\n intervalSec: z.number().int().describe(\"Interval in seconds (-1 for one-time / on-demand)\"),\n useCaseId: IdSchema.optional().describe(\"Optional: only replay test cases under this use case\"),\n namePrefix: z.string().optional().describe(\"Optional: prefix for generated workflow names\"),\n limit: z.number().int().optional().describe(\"Optional: limit number of test cases to replay\"),\n testCaseIds: z.array(IdSchema).optional().describe(\"Optional: targeted test cases to replay\"),\n repeatPerTestCase: z.number().int().optional().describe(\"Optional: repeat count per test case\"),\n workflowParams: WorkflowParamsSchema,\n});\n\nexport const WorkflowGetReplayBulkBatchSummaryInputSchema = z.object({\n runBatchId: IdSchema.describe(\"Run batch ID\"),\n});\n\nexport const WorkflowCancelRunInputSchema = z.object({\n workflowRunId: IdSchema.describe(\"Workflow run ID to cancel\"),\n});\n\nexport const WorkflowCancelRuntimeInputSchema = z.object({\n workflowRuntimeId: IdSchema.describe(\"Workflow runtime ID to cancel\"),\n});\n\n// =============================================================================\n// Report Schemas\n// =============================================================================\n\nexport const ProjectTestResultsSummaryInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to get test results summary for\"),\n});\n\nexport const ProjectTestScriptsSummaryInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to get test scripts summary for\"),\n});\n\nexport const ProjectTestRunsSummaryInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to get test runs summary for\"),\n});\n\nexport const ReportStatsSummaryInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to get report stats for\"),\n});\n\nexport const ReportCostQueryInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n startDateKey: z.string().optional().describe(\"Start date key (YYYYMMDD)\"),\n endDateKey: z.string().optional().describe(\"End date key (YYYYMMDD)\"),\n filterType: z.string().optional().describe(\"Filter type for cost breakdown\"),\n filterIds: z.array(z.unknown()).optional().describe(\"Filter IDs\"),\n});\n\nexport const ReportPreferencesUpsertInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID\"),\n channels: z.array(z.unknown()).describe(\"Delivery channels to enable\"),\n emails: z.array(z.unknown()).optional().describe(\"Email addresses for delivery\"),\n phones: z.array(z.unknown()).optional().describe(\"Phone numbers for SMS delivery\"),\n webhookUrl: z.string().url().optional().describe(\"Webhook URL for delivery\"),\n defaultExportFormat: z.string().optional().describe(\"Default export format (pdf, html, etc.)\"),\n});\n\nexport const ReportFinalGenerateInputSchema = z.object({\n projectId: IdSchema.describe(\"Project ID to generate report for\"),\n exportFormat: z.enum([\"pdf\", \"html\", \"markdown\"]).describe(\"Export format for the report\"),\n});\n\n// =============================================================================\n// Wallet Schemas\n// =============================================================================\n\nexport const WalletTopUpInputSchema = z.object({\n packageId: IdSchema.describe(\"Token package ID to purchase\"),\n checkoutSuccessCallback: z.string().url().describe(\"URL to redirect to when checkout succeeds\"),\n checkoutCancelCallback: z.string().url().describe(\"URL to redirect to when checkout is canceled\"),\n});\n\nexport const WalletPaymentMethodCreateSetupSessionInputSchema = z.object({\n checkoutSuccessCallback: z.string().url().describe(\"URL to redirect to when payment method setup succeeds\"),\n checkoutCancelCallback: z.string().url().describe(\"URL to redirect to when payment method setup is canceled\"),\n});\n\nexport const WalletAutoTopUpSetPaymentMethodInputSchema = z.object({\n paymentMethodId: IdSchema.describe(\"Saved Stripe payment method ID (e.g., pm_xxx)\"),\n});\n\nexport const WalletPaymentMethodListInputSchema = z.object({});\n\nexport const WalletAutoTopUpUpdateInputSchema = z.object({\n enabled: z.boolean().describe(\"Whether auto top-up is enabled\"),\n topUpTriggerTokenThreshold: z.number().int().min(0).describe(\"Token balance threshold to trigger auto top-up\"),\n packageId: IdSchema.describe(\"Token package ID to purchase when auto top-up triggers\"),\n});\n\n// =============================================================================\n// Recommendation Schemas\n// =============================================================================\n\nexport const RecommendScheduleInputSchema = z.object({\n projectId: IdSchema.optional().describe(\"Project ID for context\"),\n testFrequency: z.enum([\"daily\", \"weekly\", \"onDemand\"]).optional().describe(\"Desired test frequency\"),\n timezone: z.string().optional().describe(\"Timezone for scheduling\"),\n});\n\nexport const RecommendCicdSetupInputSchema = z.object({\n projectId: IdSchema.optional().describe(\"Project ID for context\"),\n repositoryProvider: z.enum([\"github\", \"azureDevOps\", \"gitlab\", \"other\"]).optional().describe(\"Git repository provider\"),\n cadence: z.enum([\"onPullRequest\", \"nightly\", \"onDemand\"]).optional().describe(\"CI/CD trigger cadence\"),\n});\n\n// =============================================================================\n// API Key Schemas\n// =============================================================================\n\nexport const ApiKeyCreateInputSchema = z.object({\n name: z.string().optional().describe(\"Name for the API key (helps identify the key later)\"),\n expiry: z.enum([\"30d\", \"90d\", \"1y\", \"never\"]).optional().describe(\"Key expiry period (default: 90d)\"),\n});\n\nexport const ApiKeyListInputSchema = z.object({});\n\nexport const ApiKeyGetInputSchema = z.object({\n apiKeyId: IdSchema.describe(\"ID of the API key to retrieve\"),\n});\n\nexport const ApiKeyRevokeInputSchema = z.object({\n apiKeyId: IdSchema.describe(\"ID of the API key to revoke\"),\n});\n\n// =============================================================================\n// Auth Schemas (Device Code Flow)\n// =============================================================================\n\n/**\n * Auth login input schema for device code flow.\n */\nexport const AuthLoginInputSchema = z.object({\n waitForCompletion: z.boolean().optional().describe(\"Whether to wait for browser login completion before returning. Default: true\"),\n timeoutMs: z.number().int().positive().min(1000).max(900000).optional().describe(\"Maximum time to wait for login completion in milliseconds. Default: 120000\"),\n});\n\n/**\n * Auth poll input schema.\n */\nexport const AuthPollInputSchema = z.object({\n deviceCode: z.string().optional().describe(\"Device code from the login response. Optional if a login was recently started.\"),\n});\n\n/**\n * Empty input schema for tools that take no parameters.\n */\nexport const EmptyInputSchema = z.object({});\n","/**\n * Type definitions for QA Gateway tools.\n */\n\nimport type { ZodSchema } from \"zod\";\n\n/**\n * MCP error codes.\n */\nexport enum McpErrorCode {\n UNAUTHORIZED = \"UNAUTHORIZED\",\n FORBIDDEN = \"FORBIDDEN\",\n NOT_FOUND = \"NOT_FOUND\",\n INVALID_ARGUMENT = \"INVALID_ARGUMENT\",\n UPSTREAM_ERROR = \"UPSTREAM_ERROR\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n}\n\n/**\n * Gateway error with MCP error code.\n */\nexport class GatewayError extends Error {\n /** MCP error code. */\n public readonly code: McpErrorCode;\n\n /** HTTP status code (if applicable). */\n public readonly statusCode?: number;\n\n /** Additional error details. */\n public readonly details?: Record<string, unknown>;\n\n constructor(params: {\n code: McpErrorCode;\n message: string;\n statusCode?: number;\n details?: Record<string, unknown>;\n }) {\n super(params.message);\n this.name = \"GatewayError\";\n this.code = params.code;\n this.statusCode = params.statusCode;\n this.details = params.details;\n }\n}\n\n/**\n * Mapped upstream HTTP call specification.\n */\nexport interface IUpstreamCall {\n /** HTTP method. */\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n /** Path relative to prompt-service base URL. */\n path: string;\n\n /** Query parameters. */\n queryParams?: Record<string, string | number | boolean | undefined>;\n\n /** Request body (for POST/PUT/PATCH). */\n body?: unknown;\n\n /** Optional multipart form-data upload. */\n multipartFormData?: {\n /** Field name for the uploaded file (e.g., \"file\"). */\n fileFieldName: string;\n /** File name to provide to upstream. */\n fileName: string;\n /** MIME type for the uploaded file. */\n contentType: string;\n /** Base64-encoded file bytes. */\n fileBase64: string;\n };\n\n /** Timeout in milliseconds (overrides default). */\n timeoutMs?: number;\n}\n\n/**\n * Upstream response.\n */\nexport interface IUpstreamResponse<T = unknown> {\n /** HTTP status code. */\n statusCode: number;\n /** Response data. */\n data: T;\n /** Response headers. */\n headers: Record<string, string>;\n}\n\n/**\n * Caller credentials for API requests.\n */\nexport interface ICallerCredentials {\n /** Bearer token (from device code flow or config). */\n bearerToken?: string;\n /** API key (from device code flow or config). */\n apiKey?: string;\n}\n\n/**\n * QA tool definition with schema, description, and implementation.\n */\nexport interface IQaToolDefinition {\n /** Tool name (used in MCP). */\n name: string;\n\n /** Tool description (shown to LLM). */\n description: string;\n\n /** Input schema (Zod). */\n inputSchema: ZodSchema;\n\n /** Whether this tool requires authentication (default: true). */\n requiresAuth?: boolean;\n\n /** Map validated input to upstream call. */\n mapToUpstream: (input: unknown) => IUpstreamCall;\n\n /** Map upstream response to tool output. */\n mapFromUpstream?: (response: IUpstreamResponse, input?: unknown) => unknown;\n\n /**\n * Local handler for tools that don't make upstream calls.\n * Used for auth tools and recommendation tools.\n */\n localHandler?: (input: unknown) => Promise<unknown>;\n}\n","/**\n * HTTP client for forwarding requests to prompt-service.\n */\n\nimport axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nimport { getConfig } from \"../shared/config.js\";\nimport { getLogger } from \"../shared/logger.js\";\n\nimport {\n GatewayError,\n ICallerCredentials,\n IUpstreamCall,\n IUpstreamResponse,\n McpErrorCode,\n} from \"./types.js\";\n\n/** Allowed upstream path prefixes. */\nconst ALLOWED_UPSTREAM_PREFIXES = [\n \"/v1/protected/muggle-test/\",\n \"/v1/protected/wallet/\",\n \"/v1/protected/api-keys\",\n];\n\n/**\n * Client for forwarding requests to prompt-service with auth passthrough.\n */\nexport class PromptServiceClient {\n private readonly httpClient: AxiosInstance;\n private readonly baseUrl: string;\n private readonly requestTimeoutMs: number;\n\n constructor() {\n const config = getConfig();\n this.baseUrl = config.qa.promptServiceBaseUrl;\n this.requestTimeoutMs = config.qa.requestTimeoutMs;\n\n this.httpClient = axios.create({\n baseURL: this.baseUrl,\n timeout: this.requestTimeoutMs,\n validateStatus: () => true,\n });\n }\n\n /**\n * Validate that the upstream path is within the allowed prefix.\n * @param path - Path to validate.\n * @throws GatewayError if path is not allowed.\n */\n private validatePath(path: string): void {\n const isAllowed = ALLOWED_UPSTREAM_PREFIXES.some((prefix) => path.startsWith(prefix));\n\n if (!isAllowed) {\n const logger = getLogger();\n logger.error(\"Path not in allowlist\", {\n path: path,\n allowedPrefixes: ALLOWED_UPSTREAM_PREFIXES,\n });\n throw new GatewayError({\n code: McpErrorCode.FORBIDDEN,\n message: `Path '${path}' is not allowed`,\n });\n }\n }\n\n /**\n * Build headers for upstream request with credential forwarding.\n * @param credentials - Caller credentials to forward.\n * @param correlationId - Request correlation ID.\n * @returns Headers object.\n */\n private buildHeaders(\n credentials: ICallerCredentials,\n correlationId: string,\n ): Record<string, string> {\n const headers: Record<string, string> = {\n \"X-Correlation-Id\": correlationId,\n };\n\n if (credentials.bearerToken) {\n headers[\"Authorization\"] = credentials.bearerToken.startsWith(\"Bearer \")\n ? credentials.bearerToken\n : `Bearer ${credentials.bearerToken}`;\n }\n\n if (credentials.apiKey) {\n headers[\"x-api-key\"] = credentials.apiKey;\n }\n\n return headers;\n }\n\n /**\n * Build query string from parameters.\n * @param params - Query parameters.\n * @returns Query string (without leading '?').\n */\n private buildQueryString(\n params?: Record<string, string | number | boolean | undefined>,\n ): string {\n if (!params) {\n return \"\";\n }\n\n const entries = Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n\n return entries.length > 0 ? `?${entries.join(\"&\")}` : \"\";\n }\n\n /**\n * Map HTTP status code to MCP error code.\n * @param statusCode - HTTP status code.\n * @returns MCP error code.\n */\n private mapStatusToErrorCode(statusCode: number): McpErrorCode {\n if (statusCode === 401) {\n return McpErrorCode.UNAUTHORIZED;\n }\n if (statusCode === 403) {\n return McpErrorCode.FORBIDDEN;\n }\n if (statusCode === 404) {\n return McpErrorCode.NOT_FOUND;\n }\n if (statusCode >= 400 && statusCode < 500) {\n return McpErrorCode.INVALID_ARGUMENT;\n }\n return McpErrorCode.UPSTREAM_ERROR;\n }\n\n /**\n * Format upstream error response into a user-friendly message.\n * @param statusCode - HTTP status code.\n * @param data - Response data from upstream.\n * @returns User-friendly error message.\n */\n private formatUpstreamErrorMessage(statusCode: number, data: unknown): string {\n const responseData = data as {\n error?: string;\n message?: string;\n detail?: string;\n details?: string;\n } | null;\n\n const rawMessage =\n responseData?.message ||\n responseData?.error ||\n responseData?.detail ||\n responseData?.details;\n\n if (rawMessage && typeof rawMessage === \"string\") {\n let cleaned = rawMessage\n .replace(/^Error:\\s*/i, \"\")\n .replace(/^INVALID_ARGUMENT:\\s*/i, \"\")\n .replace(/^NOT_FOUND:\\s*/i, \"\")\n .replace(/^FORBIDDEN:\\s*/i, \"\");\n\n cleaned = cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n return cleaned;\n }\n\n switch (statusCode) {\n case 400:\n return \"Invalid request. Please check your input parameters.\";\n case 401:\n return \"Authentication required. Please check your credentials.\";\n case 403:\n return \"You don't have permission to perform this action.\";\n case 404:\n return \"The requested resource was not found.\";\n case 409:\n return \"A conflict occurred. The resource may already exist.\";\n case 429:\n return \"Too many requests. Please wait and try again.\";\n case 500:\n return \"The service encountered an error. Please try again later.\";\n case 502:\n case 503:\n case 504:\n return \"The service is temporarily unavailable. Please try again later.\";\n default:\n return `Request failed with status ${statusCode}.`;\n }\n }\n\n /**\n * Execute an upstream call to prompt-service.\n * @param call - Upstream call specification.\n * @param credentials - Caller credentials to forward.\n * @param correlationId - Request correlation ID.\n * @returns Upstream response.\n * @throws GatewayError on validation or upstream errors.\n */\n async execute<T = unknown>(\n call: IUpstreamCall,\n credentials: ICallerCredentials,\n correlationId: string,\n ): Promise<IUpstreamResponse<T>> {\n const logger = getLogger();\n\n // Validate credentials\n if (!credentials.bearerToken && !credentials.apiKey) {\n throw new GatewayError({\n code: McpErrorCode.UNAUTHORIZED,\n message: \"Missing authentication. Please run 'muggle-mcp login' to authenticate.\",\n });\n }\n\n // Validate path\n this.validatePath(call.path);\n\n const url = call.path + this.buildQueryString(call.queryParams);\n const headers = this.buildHeaders(credentials, correlationId);\n const timeout = call.timeoutMs || this.requestTimeoutMs;\n\n const startTime = Date.now();\n\n logger.info(\"Upstream request\", {\n correlationId: correlationId,\n method: call.method,\n path: call.path,\n hasBody: !!call.body,\n });\n\n try {\n const requestConfig: AxiosRequestConfig = {\n method: call.method,\n url: url,\n headers: headers,\n timeout: timeout,\n };\n\n if (call.body && [\"POST\", \"PUT\", \"PATCH\"].includes(call.method)) {\n requestConfig.data = call.body;\n requestConfig.headers = {\n ...headers,\n \"Content-Type\": \"application/json\",\n };\n } else {\n requestConfig.headers = {\n ...headers,\n \"Content-Type\": \"application/json\",\n };\n }\n\n const response = await this.httpClient.request(requestConfig);\n const latency = Date.now() - startTime;\n\n logger.info(\"Upstream response\", {\n correlationId: correlationId,\n statusCode: response.status,\n latencyMs: latency,\n });\n\n // Handle error responses\n if (response.status >= 400) {\n const errorCode = this.mapStatusToErrorCode(response.status);\n const errorMessage = this.formatUpstreamErrorMessage(response.status, response.data);\n\n throw new GatewayError({\n code: errorCode,\n message: errorMessage,\n statusCode: response.status,\n });\n }\n\n // Extract response headers\n const responseHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(response.headers)) {\n if (typeof value === \"string\") {\n responseHeaders[key.toLowerCase()] = value;\n }\n }\n\n return {\n statusCode: response.status,\n data: response.data as T,\n headers: responseHeaders,\n };\n } catch (error) {\n const latency = Date.now() - startTime;\n\n if (error instanceof GatewayError) {\n throw error;\n }\n\n if (error instanceof AxiosError) {\n logger.error(\"Upstream request failed\", {\n correlationId: correlationId,\n error: error.message,\n code: error.code,\n latencyMs: latency,\n });\n\n if (error.code === \"ECONNABORTED\" || error.code === \"ETIMEDOUT\") {\n throw new GatewayError({\n code: McpErrorCode.UPSTREAM_ERROR,\n message: `Request timeout after ${timeout}ms`,\n details: { upstreamPath: call.path },\n });\n }\n\n throw new GatewayError({\n code: McpErrorCode.UPSTREAM_ERROR,\n message: `Upstream connection error: ${error.message}`,\n details: { upstreamPath: call.path },\n });\n }\n\n logger.error(\"Unknown upstream error\", {\n correlationId: correlationId,\n error: String(error),\n latencyMs: latency,\n });\n\n throw new GatewayError({\n code: McpErrorCode.INTERNAL_ERROR,\n message: \"Internal gateway error\",\n });\n }\n }\n}\n\n/** Singleton client instance. */\nlet clientInstance: PromptServiceClient | null = null;\n\n/**\n * Get the PromptServiceClient instance (singleton).\n * @returns PromptServiceClient instance.\n */\nexport function getPromptServiceClient(): PromptServiceClient {\n if (!clientInstance) {\n clientInstance = new PromptServiceClient();\n }\n return clientInstance;\n}\n","/**\n * QA Tool registry - maps tool names to their implementations.\n */\n\nimport { z } from \"zod\";\n\nimport { getCallerCredentialsAsync } from \"../../shared/auth.js\";\nimport { getConfig } from \"../../shared/config.js\";\nimport { createChildLogger } from \"../../shared/logger.js\";\nimport type { IMcpToolResult } from \"../../shared/types.js\";\n\nimport * as schemas from \"../contracts/index.js\";\nimport { GatewayError, IQaToolDefinition, IUpstreamResponse } from \"../types.js\";\nimport { getPromptServiceClient } from \"../upstream-client.js\";\nimport { getAuthService } from \"../../local-qa/services/index.js\";\nimport { DeviceCodePollStatus } from \"../../local-qa/types/index.js\";\n\n/** Muggle Test API prefix. */\nconst MUGGLE_TEST_PREFIX = \"/v1/protected/muggle-test\";\n\n/** Default workflow timeout. */\nconst getWorkflowTimeoutMs = (): number => getConfig().qa.workflowTimeoutMs;\n\n// =============================================================================\n// Project Tools\n// =============================================================================\n\nconst projectTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-project-create\",\n description: \"Create a new QA testing project. Projects organize use cases, test cases, and test scripts.\",\n inputSchema: schemas.ProjectCreateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectCreateInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/projects`,\n body: {\n name: data.projectName,\n description: data.description,\n url: data.url,\n },\n };\n },\n },\n {\n name: \"muggle-remote-project-get\",\n description: \"Get details of a specific project by ID.\",\n inputSchema: schemas.ProjectGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectGetInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}`,\n };\n },\n },\n {\n name: \"muggle-remote-project-update\",\n description: \"Update an existing project's details.\",\n inputSchema: schemas.ProjectUpdateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectUpdateInputSchema>;\n const body: Record<string, unknown> = { id: data.projectId };\n if (data.projectName !== undefined) body.name = data.projectName;\n if (data.description !== undefined) body.description = data.description;\n if (data.url !== undefined) body.url = data.url;\n return {\n method: \"PUT\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}`,\n body: body,\n };\n },\n },\n {\n name: \"muggle-remote-project-list\",\n description: \"List all projects accessible to the authenticated user.\",\n inputSchema: schemas.ProjectListInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectListInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects`,\n queryParams: { page: data.page, pageSize: data.pageSize },\n };\n },\n },\n {\n name: \"muggle-remote-project-delete\",\n description: \"Delete a project and all associated entities. This is a soft delete.\",\n inputSchema: schemas.ProjectDeleteInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectDeleteInputSchema>;\n return {\n method: \"DELETE\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}`,\n };\n },\n },\n];\n\n// =============================================================================\n// Use Case Tools\n// =============================================================================\n\nconst useCaseTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-use-case-discovery-memory-get\",\n description: \"Get the use case discovery memory for a project, including all discovered use case candidates.\",\n inputSchema: schemas.UseCaseDiscoveryMemoryGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCaseDiscoveryMemoryGetInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/use-case-discovery-memory`,\n };\n },\n },\n {\n name: \"muggle-remote-use-case-candidates-approve\",\n description: \"Approve (graduate) selected use case candidates into actual use cases.\",\n inputSchema: schemas.UseCaseCandidatesApproveInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCaseCandidatesApproveInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/use-case-discovery-memory/graduate`,\n body: { approveIds: data.approvedCandidateIds },\n };\n },\n },\n {\n name: \"muggle-remote-use-case-list\",\n description: \"List all use cases for a project.\",\n inputSchema: schemas.UseCaseListInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCaseListInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/use-cases`,\n queryParams: { projectId: data.projectId, page: data.page, pageSize: data.pageSize },\n };\n },\n },\n {\n name: \"muggle-remote-use-case-get\",\n description: \"Get details of a specific use case by ID.\",\n inputSchema: schemas.UseCaseGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCaseGetInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/use-cases/${data.useCaseId}`,\n };\n },\n },\n {\n name: \"muggle-remote-use-case-prompt-preview\",\n description: \"Preview a use case generated from a natural language instruction without saving.\",\n inputSchema: schemas.UseCasePromptPreviewInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCasePromptPreviewInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/use-cases/prompt/preview`,\n body: { instruction: data.instruction },\n };\n },\n },\n {\n name: \"muggle-remote-use-case-create-from-prompts\",\n description: \"Create one or more use cases from natural language instructions.\",\n inputSchema: schemas.UseCaseCreateFromPromptsInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCaseCreateFromPromptsInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/use-cases/prompts/bulk`,\n body: { projectId: data.projectId, prompts: data.prompts },\n };\n },\n },\n {\n name: \"muggle-remote-use-case-update-from-prompt\",\n description: \"Update an existing use case by regenerating its fields from a new instruction.\",\n inputSchema: schemas.UseCaseUpdateFromPromptInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.UseCaseUpdateFromPromptInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/use-cases/${data.useCaseId}/prompt`,\n body: { instruction: data.instruction },\n };\n },\n },\n];\n\n// =============================================================================\n// Test Case Tools\n// =============================================================================\n\nconst testCaseTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-test-case-list\",\n description: \"List test cases for a project.\",\n inputSchema: schemas.TestCaseListInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestCaseListInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/test-cases`,\n queryParams: { projectId: data.projectId, page: data.page, pageSize: data.pageSize },\n };\n },\n },\n {\n name: \"muggle-remote-test-case-get\",\n description: \"Get details of a specific test case.\",\n inputSchema: schemas.TestCaseGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestCaseGetInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/test-cases/${data.testCaseId}`,\n };\n },\n },\n {\n name: \"muggle-remote-test-case-list-by-use-case\",\n description: \"List test cases for a specific use case.\",\n inputSchema: schemas.TestCaseListByUseCaseInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestCaseListByUseCaseInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/use-cases/${data.useCaseId}/test-cases`,\n };\n },\n },\n {\n name: \"muggle-remote-test-case-generate-from-prompt\",\n description: \"Generate test cases from a natural language prompt. Returns preview test cases.\",\n inputSchema: schemas.TestCaseGenerateFromPromptInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestCaseGenerateFromPromptInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/use-cases/${data.useCaseId}/test-cases/prompt/preview`,\n body: { instruction: data.instruction },\n };\n },\n },\n {\n name: \"muggle-remote-test-case-create\",\n description: \"Create a new test case for a use case.\",\n inputSchema: schemas.TestCaseCreateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestCaseCreateInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/test-cases`,\n body: {\n projectId: data.projectId,\n useCaseId: data.useCaseId,\n title: data.title,\n description: data.description,\n goal: data.goal,\n precondition: data.precondition,\n expectedResult: data.expectedResult,\n url: data.url,\n status: data.status || \"DRAFT\",\n priority: data.priority || \"MEDIUM\",\n tags: data.tags || [],\n category: data.category || \"Functional\",\n automated: data.automated ?? true,\n },\n };\n },\n },\n];\n\n// =============================================================================\n// Test Script Tools\n// =============================================================================\n\nconst testScriptTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-test-script-list\",\n description: \"List test scripts for a project.\",\n inputSchema: schemas.TestScriptListInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestScriptListInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/test-scripts`,\n queryParams: { projectId: data.projectId, page: data.page, pageSize: data.pageSize },\n };\n },\n },\n {\n name: \"muggle-remote-test-script-get\",\n description: \"Get details of a specific test script.\",\n inputSchema: schemas.TestScriptGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestScriptGetInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/test-scripts/${data.testScriptId}`,\n };\n },\n },\n {\n name: \"muggle-remote-test-script-list-paginated\",\n description: \"List test scripts with full pagination support.\",\n inputSchema: schemas.TestScriptListPaginatedInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.TestScriptListPaginatedInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/test-scripts/paginated`,\n queryParams: { projectId: data.projectId, page: data.page, pageSize: data.pageSize },\n };\n },\n },\n];\n\n// =============================================================================\n// Workflow Tools\n// =============================================================================\n\nconst workflowTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-workflow-start-website-scan\",\n description: \"Start a website scan workflow to discover use cases from a URL.\",\n inputSchema: schemas.WorkflowStartWebsiteScanInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowStartWebsiteScanInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/use-case/website-scan`,\n body: {\n projectId: data.projectId,\n url: data.url,\n description: data.description,\n archiveUnapproved: data.archiveUnapproved,\n ...(data.workflowParams && { workflowParams: data.workflowParams }),\n },\n timeoutMs: getWorkflowTimeoutMs(),\n };\n },\n },\n {\n name: \"muggle-remote-workflow-list-website-scan-runtimes\",\n description: \"List website scan workflow runtimes.\",\n inputSchema: schemas.WorkflowListRuntimesInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowListRuntimesInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/use-case/website-scan/workflowRuntimes`,\n queryParams: { projectId: data.projectId },\n };\n },\n },\n {\n name: \"muggle-remote-workflow-get-website-scan-latest-run\",\n description: \"Get the latest run status for a website scan workflow runtime.\",\n inputSchema: schemas.WorkflowGetLatestRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetLatestRunInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/use-case/website-scan/${data.workflowRuntimeId}/run/latest`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-start-test-case-detection\",\n description: \"Start a test case detection workflow to generate test cases from use cases.\",\n inputSchema: schemas.WorkflowStartTestCaseDetectionInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowStartTestCaseDetectionInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-case/test-case-detection`,\n body: {\n projectId: data.projectId,\n useCaseId: data.useCaseId,\n name: data.name,\n description: data.description,\n url: data.url,\n ...(data.workflowParams && { workflowParams: data.workflowParams }),\n },\n timeoutMs: getWorkflowTimeoutMs(),\n };\n },\n },\n {\n name: \"muggle-remote-wf-list-tc-detect-runtimes\",\n description: \"List test case detection workflow runtimes.\",\n inputSchema: schemas.WorkflowListRuntimesInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowListRuntimesInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-case/test-case-detection/workflowRuntimes`,\n queryParams: { projectId: data.projectId },\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-tc-detect-latest-run\",\n description: \"Get the latest run status for a test case detection workflow runtime.\",\n inputSchema: schemas.WorkflowGetLatestRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetLatestRunInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-case/test-case-detection/${data.workflowRuntimeId}/run/latest`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-start-test-script-generation\",\n description: \"Start a test script generation workflow.\",\n inputSchema: schemas.WorkflowStartTestScriptGenerationInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowStartTestScriptGenerationInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-generation`,\n body: {\n projectId: data.projectId,\n testCaseId: data.testCaseId,\n useCaseId: data.useCaseId,\n name: data.name,\n url: data.url,\n goal: data.goal,\n precondition: data.precondition,\n instructions: data.instructions,\n expectedResult: data.expectedResult,\n ...(data.workflowParams && { workflowParams: data.workflowParams }),\n },\n timeoutMs: getWorkflowTimeoutMs(),\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-ts-gen-latest-run\",\n description: \"Get the latest run status for a test script generation workflow runtime.\",\n inputSchema: schemas.WorkflowGetLatestRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetLatestRunInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-generation/${data.workflowRuntimeId}/run/latest`,\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-latest-ts-gen-by-tc\",\n description: \"Get the latest test script generation runtime for a specific test case.\",\n inputSchema: schemas.WorkflowGetLatestScriptGenByTestCaseInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetLatestScriptGenByTestCaseInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-generation/testcases/${data.testCaseId}/runtime/latest`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-start-test-script-replay\",\n description: \"Start a test script replay workflow to execute a single test script.\",\n inputSchema: schemas.WorkflowStartTestScriptReplayInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowStartTestScriptReplayInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-replay`,\n body: {\n projectId: data.projectId,\n useCaseId: data.useCaseId,\n testCaseId: data.testCaseId,\n testScriptId: data.testScriptId,\n name: data.name,\n ...(data.workflowParams && { workflowParams: data.workflowParams }),\n },\n timeoutMs: getWorkflowTimeoutMs(),\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-ts-replay-latest-run\",\n description: \"Get the latest run status for a test script replay workflow runtime.\",\n inputSchema: schemas.WorkflowGetLatestRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetLatestRunInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-replay/${data.workflowRuntimeId}/run/latest`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-start-test-script-replay-bulk\",\n description: \"Start a bulk test script replay workflow to execute multiple test scripts.\",\n inputSchema: schemas.WorkflowStartTestScriptReplayBulkInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowStartTestScriptReplayBulkInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-replay/bulk/workflowRuntimes`,\n body: {\n projectId: data.projectId,\n name: data.name,\n intervalSec: data.intervalSec,\n useCaseId: data.useCaseId,\n namePrefix: data.namePrefix,\n limit: data.limit,\n testCaseIds: data.testCaseIds,\n repeatPerTestCase: data.repeatPerTestCase,\n ...(data.workflowParams && { workflowParams: data.workflowParams }),\n },\n timeoutMs: getWorkflowTimeoutMs(),\n };\n },\n },\n {\n name: \"muggle-remote-wf-list-ts-replay-bulk-runtimes\",\n description: \"List bulk test script replay workflow runtimes.\",\n inputSchema: schemas.WorkflowListRuntimesInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowListRuntimesInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-replay/bulk/workflowRuntimes`,\n queryParams: { projectId: data.projectId },\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-ts-replay-bulk-latest-run\",\n description: \"Get the latest run status for a bulk test script replay workflow runtime.\",\n inputSchema: schemas.WorkflowGetLatestRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetLatestRunInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-replay/bulk/${data.workflowRuntimeId}/run/latest`,\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-replay-bulk-batch-summary\",\n description: \"Get the summary of a bulk replay run batch.\",\n inputSchema: schemas.WorkflowGetReplayBulkBatchSummaryInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowGetReplayBulkBatchSummaryInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/test-script/test-script-replay/bulk/run-batch/${data.runBatchId}/summary`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-cancel-run\",\n description: \"Cancel a running workflow run.\",\n inputSchema: schemas.WorkflowCancelRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowCancelRunInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/runs/${data.workflowRunId}/cancel`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-cancel-runtime\",\n description: \"Cancel a workflow runtime and all its runs.\",\n inputSchema: schemas.WorkflowCancelRuntimeInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WorkflowCancelRuntimeInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/runtimes/${data.workflowRuntimeId}/cancel`,\n };\n },\n },\n];\n\n// =============================================================================\n// Report Tools\n// =============================================================================\n\nconst reportTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-project-test-results-summary-get\",\n description: \"Get a summary of test results for a project.\",\n inputSchema: schemas.ProjectTestResultsSummaryInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectTestResultsSummaryInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/testResults`,\n };\n },\n },\n {\n name: \"muggle-remote-project-test-scripts-summary-get\",\n description: \"Get a summary of test scripts for a project.\",\n inputSchema: schemas.ProjectTestScriptsSummaryInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectTestScriptsSummaryInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/test-scripts/summary`,\n };\n },\n },\n {\n name: \"muggle-remote-project-test-runs-summary-get\",\n description: \"Get a summary of test runs for a project.\",\n inputSchema: schemas.ProjectTestRunsSummaryInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ProjectTestRunsSummaryInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/test-runs/summary`,\n };\n },\n },\n {\n name: \"muggle-remote-report-stats-summary-get\",\n description: \"Get report statistics summary for a project.\",\n inputSchema: schemas.ReportStatsSummaryInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ReportStatsSummaryInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/report/stats-summary`,\n queryParams: { projectId: data.projectId },\n };\n },\n },\n {\n name: \"muggle-remote-report-cost-query\",\n description: \"Query cost/usage data for a project over a date range.\",\n inputSchema: schemas.ReportCostQueryInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ReportCostQueryInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/report/cost/query`,\n body: {\n projectId: data.projectId,\n startDateKey: data.startDateKey,\n endDateKey: data.endDateKey,\n filterType: data.filterType,\n filterIds: data.filterIds,\n },\n };\n },\n },\n {\n name: \"muggle-remote-report-preferences-upsert\",\n description: \"Update report delivery preferences for a project.\",\n inputSchema: schemas.ReportPreferencesUpsertInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ReportPreferencesUpsertInputSchema>;\n return {\n method: \"PUT\",\n path: `${MUGGLE_TEST_PREFIX}/report/preferences`,\n body: {\n projectId: data.projectId,\n channels: data.channels,\n emails: data.emails,\n phones: data.phones,\n webhookUrl: data.webhookUrl,\n defaultExportFormat: data.defaultExportFormat,\n },\n };\n },\n },\n {\n name: \"muggle-remote-report-final-generate\",\n description: \"Generate a final test report for a project.\",\n inputSchema: schemas.ReportFinalGenerateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ReportFinalGenerateInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/report/final/generate`,\n body: {\n projectId: data.projectId,\n exportFormat: data.exportFormat,\n },\n timeoutMs: getWorkflowTimeoutMs(),\n };\n },\n },\n];\n\n// =============================================================================\n// Secret Tools\n// =============================================================================\n\nconst secretTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-secret-list\",\n description: \"List all secrets for a project. Secret values are not returned for security.\",\n inputSchema: schemas.SecretListInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.SecretListInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/secrets`,\n queryParams: { projectId: data.projectId },\n };\n },\n },\n {\n name: \"muggle-remote-secret-create\",\n description: \"Create a new secret (credential) for a project.\",\n inputSchema: schemas.SecretCreateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.SecretCreateInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/secrets`,\n body: {\n projectId: data.projectId,\n secretName: data.name,\n value: data.value,\n description: data.description,\n source: data.source,\n },\n };\n },\n },\n {\n name: \"muggle-remote-secret-get\",\n description: \"Get details of a specific secret. The secret value is not returned for security.\",\n inputSchema: schemas.SecretGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.SecretGetInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/secrets/${data.secretId}`,\n };\n },\n },\n {\n name: \"muggle-remote-secret-update\",\n description: \"Update an existing secret.\",\n inputSchema: schemas.SecretUpdateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.SecretUpdateInputSchema>;\n const body: Record<string, unknown> = {};\n if (data.name !== undefined) body.name = data.name;\n if (data.value !== undefined) body.value = data.value;\n if (data.description !== undefined) body.description = data.description;\n return {\n method: \"PUT\",\n path: `${MUGGLE_TEST_PREFIX}/secrets/${data.secretId}`,\n body: body,\n };\n },\n },\n {\n name: \"muggle-remote-secret-delete\",\n description: \"Delete a secret from a project.\",\n inputSchema: schemas.SecretDeleteInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.SecretDeleteInputSchema>;\n return {\n method: \"DELETE\",\n path: `${MUGGLE_TEST_PREFIX}/secrets/${data.secretId}`,\n };\n },\n },\n];\n\n// =============================================================================\n// PRD File Tools\n// =============================================================================\n\nconst prdFileTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-prd-file-upload\",\n description: \"Upload a PRD file to a project. File content should be base64-encoded.\",\n inputSchema: schemas.PrdFileUploadInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.PrdFileUploadInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/use-case/prd-file-upload`,\n multipartFormData: {\n fileFieldName: \"file\",\n fileName: data.fileName,\n contentType: data.contentType || \"application/octet-stream\",\n fileBase64: data.contentBase64,\n },\n };\n },\n },\n {\n name: \"muggle-remote-prd-file-list-by-project\",\n description: \"List all PRD files associated with a project.\",\n inputSchema: schemas.PrdFileListInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.PrdFileListInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/prd-files`,\n };\n },\n },\n {\n name: \"muggle-remote-prd-file-delete\",\n description: \"Delete a PRD file from a project.\",\n inputSchema: schemas.PrdFileDeleteInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.PrdFileDeleteInputSchema>;\n return {\n method: \"DELETE\",\n path: `${MUGGLE_TEST_PREFIX}/projects/${data.projectId}/prd-files/${data.prdFileId}`,\n };\n },\n },\n {\n name: \"muggle-remote-workflow-start-prd-file-process\",\n description: \"Start a PRD file processing workflow to extract use cases.\",\n inputSchema: schemas.PrdFileProcessStartInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.PrdFileProcessStartInputSchema>;\n return {\n method: \"POST\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/use-case/prd-file-process`,\n body: {\n projectId: data.projectId,\n name: data.name,\n description: data.description,\n prdFilePath: data.prdFilePath,\n originalFileName: data.originalFileName,\n url: data.url,\n contentChecksum: data.contentChecksum,\n fileSize: data.fileSize,\n },\n };\n },\n },\n {\n name: \"muggle-remote-wf-get-prd-process-latest-run\",\n description: \"Get the latest run status of a PRD file processing workflow.\",\n inputSchema: schemas.PrdFileProcessLatestRunInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.PrdFileProcessLatestRunInputSchema>;\n return {\n method: \"GET\",\n path: `${MUGGLE_TEST_PREFIX}/workflow/use-case/prd-file-process/${data.workflowRuntimeId}/run/latest`,\n };\n },\n },\n];\n\n// =============================================================================\n// Wallet Tools\n// =============================================================================\n\nconst walletTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-wallet-topup\",\n description: \"Create a Stripe checkout session to purchase a token package.\",\n inputSchema: schemas.WalletTopUpInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WalletTopUpInputSchema>;\n return {\n method: \"POST\",\n path: \"/v1/protected/wallet/topup\",\n body: {\n packageId: data.packageId,\n checkoutSuccessCallback: data.checkoutSuccessCallback,\n checkoutCancelCallback: data.checkoutCancelCallback,\n },\n };\n },\n },\n {\n name: \"muggle-remote-wallet-pm-create-setup-session\",\n description: \"Create a Stripe setup session to add a payment method.\",\n inputSchema: schemas.WalletPaymentMethodCreateSetupSessionInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WalletPaymentMethodCreateSetupSessionInputSchema>;\n return {\n method: \"POST\",\n path: \"/v1/protected/wallet/payment-methods/setup\",\n body: {\n checkoutSuccessCallback: data.checkoutSuccessCallback,\n checkoutCancelCallback: data.checkoutCancelCallback,\n },\n };\n },\n },\n {\n name: \"muggle-remote-wallet-auto-topup-set-payment-method\",\n description: \"Set the saved payment method used by wallet auto top-up.\",\n inputSchema: schemas.WalletAutoTopUpSetPaymentMethodInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WalletAutoTopUpSetPaymentMethodInputSchema>;\n return {\n method: \"PUT\",\n path: \"/v1/protected/wallet/auto-topup/payment-method\",\n body: { paymentMethodId: data.paymentMethodId },\n };\n },\n },\n {\n name: \"muggle-remote-wallet-payment-method-list\",\n description: \"List saved payment methods.\",\n inputSchema: schemas.WalletPaymentMethodListInputSchema,\n mapToUpstream: () => {\n return {\n method: \"GET\",\n path: \"/v1/protected/wallet/payment-methods\",\n };\n },\n },\n {\n name: \"muggle-remote-wallet-auto-topup-update\",\n description: \"Update wallet auto-topup settings.\",\n inputSchema: schemas.WalletAutoTopUpUpdateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.WalletAutoTopUpUpdateInputSchema>;\n return {\n method: \"PUT\",\n path: \"/v1/protected/wallet/auto-topup\",\n body: {\n enabled: data.enabled,\n topUpTriggerTokenThreshold: data.topUpTriggerTokenThreshold,\n packageId: data.packageId,\n },\n };\n },\n },\n];\n\n// =============================================================================\n// Recommendation Tools (No upstream calls)\n// =============================================================================\n\nconst recommendationTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-recommend-schedule\",\n description: \"Get recommendations for test scheduling based on project needs.\",\n inputSchema: schemas.RecommendScheduleInputSchema,\n requiresAuth: false,\n mapToUpstream: () => {\n throw new Error(\"RECOMMENDATION_ONLY\");\n },\n mapFromUpstream: () => {\n return {\n recommendations: [\n {\n title: \"Nightly Regression Tests\",\n rationale: \"Running tests every night catches regressions quickly.\",\n schedule: \"0 2 * * *\",\n timezone: \"UTC\",\n },\n {\n title: \"On-Demand with Smoke Tests\",\n rationale: \"Run smoke tests on every PR, full regression on merge.\",\n schedule: \"Pull Request trigger + main branch merge\",\n },\n {\n title: \"Continuous Monitoring\",\n rationale: \"Run tests every 4 hours for production monitoring.\",\n schedule: \"0 */4 * * *\",\n },\n ],\n };\n },\n localHandler: async () => {\n return {\n recommendations: [\n {\n title: \"Nightly Regression Tests\",\n rationale: \"Running tests every night catches regressions quickly.\",\n schedule: \"0 2 * * *\",\n timezone: \"UTC\",\n },\n {\n title: \"On-Demand with Smoke Tests\",\n rationale: \"Run smoke tests on every PR, full regression on merge.\",\n schedule: \"Pull Request trigger + main branch merge\",\n },\n {\n title: \"Continuous Monitoring\",\n rationale: \"Run tests every 4 hours for production monitoring.\",\n schedule: \"0 */4 * * *\",\n },\n ],\n };\n },\n },\n {\n name: \"muggle-remote-recommend-cicd-setup\",\n description: \"Get recommendations and templates for CI/CD integration.\",\n inputSchema: schemas.RecommendCicdSetupInputSchema,\n requiresAuth: false,\n mapToUpstream: () => {\n throw new Error(\"RECOMMENDATION_ONLY\");\n },\n localHandler: async (input) => {\n const data = input as z.infer<typeof schemas.RecommendCicdSetupInputSchema>;\n const provider = data?.repositoryProvider || \"github\";\n\n const recommendations = [];\n\n if (provider === \"github\" || provider === \"other\") {\n recommendations.push({\n title: \"GitHub Actions Integration\",\n rationale: \"Native GitHub integration with minimal setup.\",\n steps: [\n \"Create .github/workflows/muggle-test.yml\",\n \"Add MUGGLE_AI_API_KEY as a repository secret\",\n \"Configure workflow trigger\",\n ],\n });\n }\n\n if (provider === \"azureDevOps\" || provider === \"other\") {\n recommendations.push({\n title: \"Azure DevOps Pipelines Integration\",\n rationale: \"Native Azure DevOps integration with pipeline triggers.\",\n steps: [\n \"Create azure-pipelines.yml\",\n \"Add MUGGLE_AI_API_KEY to variable group\",\n \"Configure triggers\",\n ],\n });\n }\n\n if (provider === \"gitlab\" || provider === \"other\") {\n recommendations.push({\n title: \"GitLab CI Integration\",\n rationale: \"Native GitLab CI integration with merge request pipelines.\",\n steps: [\n \"Add .gitlab-ci.yml\",\n \"Add MUGGLE_AI_API_KEY as CI/CD variable\",\n \"Configure pipeline rules\",\n ],\n });\n }\n\n return { recommendations: recommendations };\n },\n },\n];\n\n// =============================================================================\n// API Key Tools\n// =============================================================================\n\n/** API key endpoint prefix. */\nconst API_KEY_PREFIX = \"/v1/protected/api-keys\";\n\nconst apiKeyTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-auth-api-key-create\",\n description: \"Create a new API key for the authenticated user. Requires existing authentication.\",\n inputSchema: schemas.ApiKeyCreateInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ApiKeyCreateInputSchema>;\n return {\n method: \"POST\",\n path: API_KEY_PREFIX,\n body: {\n name: data.name || \"MCP Gateway Key\",\n expiry: data.expiry || \"90d\",\n },\n };\n },\n mapFromUpstream: (response) => {\n const data = response.data as {\n id: string;\n key: string;\n name: string | null;\n status: string;\n prefix: string;\n lastFour: string;\n createdAt: number;\n expiresAt: number | null;\n };\n\n const maskedKey = `${data.prefix}...${data.lastFour}`;\n const expiresAt = data.expiresAt\n ? new Date(data.expiresAt).toISOString()\n : \"never\";\n\n return {\n success: true,\n message: \"API key created.\",\n apiKey: {\n id: data.id,\n key: data.key,\n hint: maskedKey,\n name: data.name,\n status: data.status,\n createdAt: new Date(data.createdAt).toISOString(),\n expiresAt: expiresAt,\n },\n note: \"The full API key is returned only once. Store it securely.\",\n };\n },\n },\n {\n name: \"muggle-remote-auth-api-key-list\",\n description: \"List all API keys for the authenticated user. Shows key metadata but not the secret values.\",\n inputSchema: schemas.ApiKeyListInputSchema,\n mapToUpstream: () => {\n return {\n method: \"GET\",\n path: API_KEY_PREFIX,\n };\n },\n mapFromUpstream: (response) => {\n const keys = response.data as Array<{\n id: string;\n name: string | null;\n status: string;\n prefix: string;\n lastFour: string;\n createdAt: number;\n expiresAt: number | null;\n revokedAt: number | null;\n }>;\n\n return {\n success: true,\n count: keys.length,\n apiKeys: keys.map((key) => ({\n id: key.id,\n name: key.name,\n status: key.status,\n hint: `${key.prefix}...${key.lastFour}`,\n createdAt: new Date(key.createdAt).toISOString(),\n expiresAt: key.expiresAt ? new Date(key.expiresAt).toISOString() : \"never\",\n revokedAt: key.revokedAt ? new Date(key.revokedAt).toISOString() : null,\n })),\n };\n },\n },\n {\n name: \"muggle-remote-auth-api-key-get\",\n description: \"Get details of a specific API key by ID.\",\n inputSchema: schemas.ApiKeyGetInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ApiKeyGetInputSchema>;\n return {\n method: \"GET\",\n path: `${API_KEY_PREFIX}/${data.apiKeyId}`,\n };\n },\n mapFromUpstream: (response) => {\n const key = response.data as {\n id: string;\n name: string | null;\n status: string;\n prefix: string;\n lastFour: string;\n createdAt: number;\n expiresAt: number | null;\n revokedAt: number | null;\n };\n\n return {\n success: true,\n apiKey: {\n id: key.id,\n name: key.name,\n status: key.status,\n hint: `${key.prefix}...${key.lastFour}`,\n createdAt: new Date(key.createdAt).toISOString(),\n expiresAt: key.expiresAt ? new Date(key.expiresAt).toISOString() : \"never\",\n revokedAt: key.revokedAt ? new Date(key.revokedAt).toISOString() : null,\n },\n };\n },\n },\n {\n name: \"muggle-remote-auth-api-key-revoke\",\n description: \"Revoke an API key. The key will immediately stop working. Use qa_auth_api_key_list to find the key ID first.\",\n inputSchema: schemas.ApiKeyRevokeInputSchema,\n mapToUpstream: (input) => {\n const data = input as z.infer<typeof schemas.ApiKeyRevokeInputSchema>;\n return {\n method: \"DELETE\",\n path: `${API_KEY_PREFIX}/${data.apiKeyId}`,\n };\n },\n mapFromUpstream: () => {\n return {\n success: true,\n message: \"API key revoked successfully. It will no longer work for authentication.\",\n };\n },\n },\n];\n\n// =============================================================================\n// Auth Tools (Device Code Flow)\n// =============================================================================\n\nconst authTools: IQaToolDefinition[] = [\n {\n name: \"muggle-remote-auth-status\",\n description: \"Check current authentication status. Shows if you're logged in and when your session expires.\",\n inputSchema: schemas.EmptyInputSchema,\n requiresAuth: false,\n mapToUpstream: () => {\n throw new Error(\"LOCAL_HANDLER_ONLY\");\n },\n localHandler: async () => {\n const authService = getAuthService();\n const status = authService.getAuthStatus();\n\n if (!status.authenticated) {\n return {\n authenticated: false,\n message: \"Not authenticated. Use muggle-remote-auth-login to authenticate.\",\n };\n }\n\n return {\n authenticated: true,\n email: status.email,\n userId: status.userId,\n expiresAt: status.expiresAt,\n isExpired: status.isExpired,\n };\n },\n },\n {\n name: \"muggle-remote-auth-login\",\n description: \"Start authentication with the Muggle Test service. Opens a browser-based login flow and waits for confirmation by default. If login is still pending after the wait timeout, use muggle-remote-auth-poll to finish authentication.\",\n inputSchema: schemas.AuthLoginInputSchema,\n requiresAuth: false,\n mapToUpstream: () => {\n throw new Error(\"LOCAL_HANDLER_ONLY\");\n },\n localHandler: async (input) => {\n const data = input as z.infer<typeof schemas.AuthLoginInputSchema>;\n const authService = getAuthService();\n\n const deviceCodeResponse = await authService.startDeviceCodeFlow();\n const waitForCompletion = data.waitForCompletion ?? true;\n\n if (!waitForCompletion) {\n return {\n status: \"pending\",\n deviceCode: deviceCodeResponse.deviceCode,\n userCode: deviceCodeResponse.userCode,\n verificationUri: deviceCodeResponse.verificationUri,\n browserOpened: deviceCodeResponse.browserOpened,\n message: \"Login started. Complete authentication in your browser, then call muggle-remote-auth-poll.\",\n };\n }\n\n const pollResult = await authService.waitForDeviceCodeAuthorization({\n deviceCode: deviceCodeResponse.deviceCode,\n intervalSeconds: deviceCodeResponse.interval,\n timeoutMs: data.timeoutMs,\n });\n\n if (pollResult.status === DeviceCodePollStatus.Complete) {\n return {\n status: \"complete\",\n success: true,\n email: pollResult.email,\n message: \"Login successful. You are now authenticated.\",\n };\n }\n\n return {\n status: pollResult.status,\n message: pollResult.message,\n };\n },\n },\n {\n name: \"muggle-remote-auth-poll\",\n description: \"Poll for login completion after starting the login flow with muggle-remote-auth-login. Call this after the user completes authentication in their browser.\",\n inputSchema: schemas.AuthPollInputSchema,\n requiresAuth: false,\n mapToUpstream: () => {\n throw new Error(\"LOCAL_HANDLER_ONLY\");\n },\n localHandler: async (input) => {\n const data = input as z.infer<typeof schemas.AuthPollInputSchema>;\n const authService = getAuthService();\n\n const deviceCode = data.deviceCode ?? authService.getPendingDeviceCode();\n\n if (!deviceCode) {\n return {\n error: \"NO_PENDING_LOGIN\",\n message: \"No pending login found. Please start a new login with muggle-remote-auth-login.\",\n };\n }\n\n const result = await authService.pollDeviceCode(deviceCode);\n\n if (result.status === DeviceCodePollStatus.Complete) {\n return {\n status: \"complete\",\n success: true,\n email: result.email,\n message: \"Login complete. You are now authenticated.\",\n };\n }\n\n return {\n status: result.status,\n message: result.message,\n };\n },\n },\n {\n name: \"muggle-remote-auth-logout\",\n description: \"Log out and clear stored credentials.\",\n inputSchema: schemas.EmptyInputSchema,\n requiresAuth: false,\n mapToUpstream: () => {\n throw new Error(\"LOCAL_HANDLER_ONLY\");\n },\n localHandler: async () => {\n const authService = getAuthService();\n const result = authService.logout();\n\n if (result) {\n return { success: true, message: \"Successfully logged out.\" };\n }\n\n return { success: false, message: \"No active session to log out from.\" };\n },\n },\n];\n\n// =============================================================================\n// All Tools Combined\n// =============================================================================\n\n/** All QA tool definitions. */\nexport const allQaToolDefinitions: IQaToolDefinition[] = [\n ...projectTools,\n ...useCaseTools,\n ...testCaseTools,\n ...testScriptTools,\n ...workflowTools,\n ...reportTools,\n ...secretTools,\n ...prdFileTools,\n ...walletTools,\n ...recommendationTools,\n ...apiKeyTools,\n ...authTools,\n];\n\n/**\n * Get a QA tool definition by name.\n * @param name - Tool name.\n * @returns Tool definition or undefined.\n */\nexport function getQaToolByName(name: string): IQaToolDefinition | undefined {\n return allQaToolDefinitions.find((tool) => tool.name === name);\n}\n\n/**\n * Default response mapper.\n * @param response - Upstream response.\n * @returns Response data.\n */\nfunction defaultResponseMapper(response: IUpstreamResponse): unknown {\n return response.data;\n}\n\n/**\n * Execute a QA tool.\n * @param toolName - Tool name.\n * @param input - Tool input.\n * @param correlationId - Correlation ID.\n * @returns Tool result.\n */\nexport async function executeQaTool(\n toolName: string,\n input: unknown,\n correlationId: string,\n): Promise<IMcpToolResult> {\n const logger = createChildLogger(correlationId);\n const tool = getQaToolByName(toolName);\n\n if (!tool) {\n return {\n content: JSON.stringify({ error: \"NOT_FOUND\", message: `Unknown tool: ${toolName}` }),\n isError: true,\n };\n }\n\n try {\n // Validate input\n const validatedInput = tool.inputSchema.parse(input);\n\n // Check if tool has a local handler\n if (tool.localHandler) {\n const result = await tool.localHandler(validatedInput);\n return {\n content: JSON.stringify(result, null, 2),\n isError: false,\n };\n }\n\n // Get credentials (async with auto-refresh)\n const credentials = await getCallerCredentialsAsync();\n\n // Execute upstream call\n try {\n const upstreamCall = tool.mapToUpstream(validatedInput);\n const client = getPromptServiceClient();\n const response = await client.execute(upstreamCall, credentials, correlationId);\n\n // Map response\n const mapper = tool.mapFromUpstream || defaultResponseMapper;\n const result = mapper(response, validatedInput);\n\n return {\n content: JSON.stringify(result, null, 2),\n isError: false,\n };\n } catch (error) {\n if (error instanceof Error && error.message === \"RECOMMENDATION_ONLY\") {\n // This is a recommendation tool, return static response\n const mapper = tool.mapFromUpstream || defaultResponseMapper;\n const result = mapper({ statusCode: 200, data: {}, headers: {} }, validatedInput);\n return {\n content: JSON.stringify(result, null, 2),\n isError: false,\n };\n }\n throw error;\n }\n } catch (error) {\n if (error instanceof GatewayError) {\n logger.warn(\"Tool call failed with gateway error\", {\n tool: toolName,\n code: error.code,\n message: error.message,\n });\n return {\n content: JSON.stringify({ error: error.code, message: error.message }),\n isError: true,\n };\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Tool call failed\", { tool: toolName, error: errorMessage });\n return {\n content: JSON.stringify({ error: \"INTERNAL_ERROR\", message: errorMessage }),\n isError: true,\n };\n }\n}\n","/**\n * Local QA module for the unified MCP package.\n *\n * This module provides minimal local testing capabilities:\n * - Status and session management\n * - Test execution (generation and replay) using cloud test cases\n * - Run result viewing\n * - Test script viewing\n * - Publishing to cloud\n *\n * All entity management (projects, use cases, test cases, secrets) happens\n * via qa_* cloud tools. Local tools only handle execution and results.\n */\n\nimport type { IMcpTool } from \"../shared/types.js\";\n\nimport { allLocalQaTools } from \"./tools/index.js\";\n\n// Re-export types\nexport * from \"./types/index.js\";\n\n// Re-export contracts\nexport * from \"./contracts/index.js\";\n\n// Re-export services\nexport * from \"./services/index.js\";\n\n// Re-export tools\nexport * from \"./tools/index.js\";\n\n/**\n * Get all local QA tools as IMcpTool instances for registration.\n *\n * Maps the ILocalMcpTool interface to the generic IMcpTool interface\n * used by the unified MCP server.\n *\n * @returns Array of MCP tool definitions.\n */\nexport function getLocalQaTools(): IMcpTool[] {\n return allLocalQaTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n requiresAuth: !isLocalOnlyTool(tool.name),\n execute: async (params: { input: unknown; correlationId: string }) => {\n const result = await tool.execute({\n input: params.input,\n correlationId: params.correlationId,\n });\n return {\n content: result.content,\n isError: result.isError,\n data: result.data,\n };\n },\n }));\n}\n\n/**\n * Check if a tool is local-only (doesn't require cloud auth).\n *\n * Status and session tools don't need authentication.\n * Execution and publishing tools require auth (handled internally).\n */\nfunction isLocalOnlyTool(toolName: string): boolean {\n const localOnlyTools = [\n // Status and session tools (no auth needed)\n \"muggle_check_status\",\n \"muggle_list_sessions\",\n // Run result and test script viewing (local storage only)\n \"muggle_run_result_list\",\n \"muggle_run_result_get\",\n \"muggle_test_script_list\",\n \"muggle_test_script_get\",\n ];\n\n return localOnlyTools.includes(toolName);\n}\n","/**\n * Zod schemas for auth-related tools.\n */\n\nimport { z } from \"zod\";\n\n/**\n * Auth login input schema.\n */\nexport const AuthLoginInputSchema = z.object({\n waitForCompletion: z.boolean().optional().describe(\"Whether to wait for browser login completion before returning. Default: true\"),\n timeoutMs: z.number().int().positive().min(1000).max(900000).optional().describe(\"Maximum time to wait for login completion in milliseconds. Default: 120000\"),\n});\n\nexport type AuthLoginInput = z.infer<typeof AuthLoginInputSchema>;\n\n/**\n * Auth poll input schema.\n */\nexport const AuthPollInputSchema = z.object({\n deviceCode: z.string().optional().describe(\"Device code from the login response. Optional if a login was recently started.\"),\n});\n\nexport type AuthPollInput = z.infer<typeof AuthPollInputSchema>;\n\n/**\n * Empty input schema for tools that take no parameters.\n */\nexport const EmptyInputSchema = z.object({});\n\nexport type EmptyInput = z.infer<typeof EmptyInputSchema>;\n","/**\n * Zod schemas for local execution tools.\n *\n * These schemas support the minimal local tool set:\n * - Execution (test generation, replay, cancel)\n * - Run results (list, get)\n * - Test scripts (list, get)\n * - Publishing\n *\n * Design principle: Execution tools accept full test case/script details\n * (fetched via qa_* tools), not just IDs. This keeps local tools free of\n * cloud dependencies.\n */\n\nimport { z } from \"zod\";\n\n// ========================================\n// Test Case Schema (from qa_test_case_get)\n// ========================================\n\n/**\n * Test case details schema.\n * These fields come from qa_test_case_get response.\n */\nexport const TestCaseDetailsSchema = z.object({\n /** Cloud test case ID. */\n id: z.string().min(1).describe(\"Cloud test case ID\"),\n /** Test case title. */\n title: z.string().min(1).describe(\"Test case title\"),\n /** Test goal. */\n goal: z.string().min(1).describe(\"Test goal - what the test should verify\"),\n /** Expected result. */\n expectedResult: z.string().min(1).describe(\"Expected outcome after test execution\"),\n /** Preconditions (optional). */\n precondition: z.string().optional().describe(\"Initial state/setup required before test execution\"),\n /** Step-by-step instructions (optional). */\n instructions: z.string().optional().describe(\"Step-by-step instructions for the test\"),\n /** Original cloud URL (for reference, replaced by localUrl). */\n url: z.string().url().optional().describe(\"Original cloud URL (replaced by localUrl during execution)\"),\n});\n\nexport type TestCaseDetails = z.infer<typeof TestCaseDetailsSchema>;\n\n// ========================================\n// Test Script Schema (from qa_test_script_get)\n// ========================================\n\n/**\n * Test script details schema.\n * These fields come from qa_test_script_get response.\n */\nexport const TestScriptDetailsSchema = z.object({\n /** Cloud test script ID. */\n id: z.string().min(1).describe(\"Cloud test script ID\"),\n /** Script name. */\n name: z.string().min(1).describe(\"Test script name\"),\n /** Cloud test case ID this script belongs to. */\n testCaseId: z.string().min(1).describe(\"Cloud test case ID this script was generated from\"),\n /** Action script steps. */\n actionScript: z.array(z.unknown()).describe(\"Action script steps to replay\"),\n /** Original cloud URL (for reference, replaced by localUrl). */\n url: z.string().url().optional().describe(\"Original cloud URL (replaced by localUrl during execution)\"),\n});\n\nexport type TestScriptDetails = z.infer<typeof TestScriptDetailsSchema>;\n\n// ========================================\n// Execution Schemas\n// ========================================\n\n/**\n * Execute test generation input schema.\n * Accepts full test case details (from qa_test_case_get) plus local URL.\n */\nexport const ExecuteTestGenerationInputSchema = z.object({\n /** Test case details from qa_test_case_get. */\n testCase: TestCaseDetailsSchema.describe(\"Test case details obtained from qa_test_case_get\"),\n /** Local URL to test against. */\n localUrl: z.string().url().describe(\"Local URL to test against (e.g., http://localhost:3000)\"),\n /** Explicit approval to launch electron-app. */\n approveElectronAppLaunch: z.boolean().describe(\"Set to true after the user explicitly approves launching electron-app\"),\n /** Optional timeout. */\n timeoutMs: z.number().int().positive().optional().describe(\"Timeout in milliseconds (default: 300000 = 5 min)\"),\n});\n\nexport type ExecuteTestGenerationInput = z.infer<typeof ExecuteTestGenerationInputSchema>;\n\n/**\n * Execute replay input schema.\n * Accepts full test script details (from qa_test_script_get) plus local URL.\n */\nexport const ExecuteReplayInputSchema = z.object({\n /** Test script details from qa_test_script_get. */\n testScript: TestScriptDetailsSchema.describe(\"Test script details obtained from qa_test_script_get\"),\n /** Local URL to test against. */\n localUrl: z.string().url().describe(\"Local URL to test against (e.g., http://localhost:3000)\"),\n /** Explicit approval to launch electron-app. */\n approveElectronAppLaunch: z.boolean().describe(\"Set to true after the user explicitly approves launching electron-app\"),\n /** Optional timeout. */\n timeoutMs: z.number().int().positive().optional().describe(\"Timeout in milliseconds (default: 180000 = 3 min)\"),\n});\n\nexport type ExecuteReplayInput = z.infer<typeof ExecuteReplayInputSchema>;\n\n/**\n * Cancel execution input schema.\n */\nexport const CancelExecutionInputSchema = z.object({\n runId: z.string().min(1).describe(\"Run ID to cancel\"),\n});\n\nexport type CancelExecutionInput = z.infer<typeof CancelExecutionInputSchema>;\n\n// ========================================\n// Run Result Schemas\n// ========================================\n\n/**\n * Run result list input schema.\n */\nexport const RunResultListInputSchema = z.object({\n cloudTestCaseId: z.string().optional().describe(\"Optional cloud test case ID to filter by\"),\n limit: z.number().int().positive().optional().describe(\"Maximum results to return (default: 20)\"),\n});\n\nexport type RunResultListInput = z.infer<typeof RunResultListInputSchema>;\n\n/**\n * Run result get input schema.\n */\nexport const RunResultGetInputSchema = z.object({\n runId: z.string().min(1).describe(\"Run result ID to retrieve\"),\n});\n\nexport type RunResultGetInput = z.infer<typeof RunResultGetInputSchema>;\n\n// ========================================\n// Test Script Schemas\n// ========================================\n\n/**\n * Test script list input schema.\n */\nexport const TestScriptListInputSchema = z.object({\n cloudTestCaseId: z.string().optional().describe(\"Optional cloud test case ID to filter by\"),\n});\n\nexport type TestScriptListInput = z.infer<typeof TestScriptListInputSchema>;\n\n/**\n * Test script get input schema.\n */\nexport const TestScriptGetInputSchema = z.object({\n testScriptId: z.string().min(1).describe(\"Test script ID to retrieve\"),\n});\n\nexport type TestScriptGetInput = z.infer<typeof TestScriptGetInputSchema>;\n\n// ========================================\n// Publishing Schemas\n// ========================================\n\n/**\n * Publish test script input schema.\n * Uses local run ID to find the generated script and cloud IDs for where to publish.\n */\nexport const PublishTestScriptInputSchema = z.object({\n runId: z.string().min(1).describe(\"Local run result ID from muggle_execute_test_generation\"),\n cloudTestCaseId: z.string().min(1).describe(\"Cloud test case ID to publish the script under\"),\n});\n\nexport type PublishTestScriptInput = z.infer<typeof PublishTestScriptInputSchema>;\n","/**\n * Zod schemas for session-related tools.\n */\n\nimport { z } from \"zod\";\n\n/**\n * List sessions input schema.\n */\nexport const ListSessionsInputSchema = z.object({\n limit: z.number().int().positive().optional().describe(\"Maximum number of sessions to return. Defaults to 10.\"),\n});\n\nexport type ListSessionsInput = z.infer<typeof ListSessionsInputSchema>;\n\n/**\n * Cleanup sessions input schema.\n */\nexport const CleanupSessionsInputSchema = z.object({\n max_age_days: z.number().int().min(0).optional().describe(\"Maximum age of sessions to keep (in days). Sessions older than this will be deleted. Defaults to 30.\"),\n});\n\nexport type CleanupSessionsInput = z.infer<typeof CleanupSessionsInputSchema>;\n","/**\n * Tool registry for local-qa.\n * Manages the minimal set of local execution tools.\n *\n * All entity management (projects, use cases, test cases, secrets) happens via qa_* cloud tools.\n * Local tools only handle: status, execution, results, and publishing.\n */\n\nimport { getLogger } from \"../../shared/logger.js\";\nimport type { IMcpToolResult, ILocalMcpTool } from \"../types/index.js\";\nimport {\n EmptyInputSchema,\n ListSessionsInputSchema,\n ExecuteTestGenerationInputSchema,\n ExecuteReplayInputSchema,\n CancelExecutionInputSchema,\n RunResultListInputSchema,\n RunResultGetInputSchema,\n TestScriptListInputSchema,\n TestScriptGetInputSchema,\n PublishTestScriptInputSchema,\n} from \"../contracts/index.js\";\nimport {\n cancelExecution,\n executeReplay,\n executeTestGeneration,\n getAuthService,\n getStorageService,\n getRunResultStorageService,\n} from \"../services/index.js\";\n\n/**\n * Create a child logger for correlation.\n */\nfunction createChildLogger(correlationId: string) {\n const logger = getLogger();\n return {\n info: (msg: string, meta?: Record<string, unknown>) => logger.info(msg, { ...meta, correlationId: correlationId }),\n error: (msg: string, meta?: Record<string, unknown>) => logger.error(msg, { ...meta, correlationId: correlationId }),\n warn: (msg: string, meta?: Record<string, unknown>) => logger.warn(msg, { ...meta, correlationId: correlationId }),\n debug: (msg: string, meta?: Record<string, unknown>) => logger.debug(msg, { ...meta, correlationId: correlationId }),\n };\n}\n\n// ========================================\n// Status Tools\n// ========================================\n\nconst checkStatusTool: ILocalMcpTool = {\n name: \"muggle-local-check-status\",\n description: \"Check the status of Muggle Test Local. This verifies the connection to web-service and shows current session information.\",\n inputSchema: EmptyInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-check-status\");\n\n const authService = getAuthService();\n const storageService = getStorageService();\n const authStatus = authService.getAuthStatus();\n\n const content = [\n \"## Muggle Test Local Status\",\n \"\",\n `**Data Directory:** ${storageService.getDataDir()}`,\n `**Sessions Directory:** ${storageService.getSessionsDir()}`,\n \"\",\n \"### Authentication\",\n `**Authenticated:** ${authStatus.authenticated ? \"Yes\" : \"No\"}`,\n authStatus.email ? `**Email:** ${authStatus.email}` : \"\",\n authStatus.expiresAt ? `**Expires:** ${authStatus.expiresAt}` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return { content: content, isError: false };\n },\n};\n\nconst listSessionsTool: ILocalMcpTool = {\n name: \"muggle-local-list-sessions\",\n description: \"List all stored testing sessions. Shows session IDs, status, and metadata for each session.\",\n inputSchema: ListSessionsInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-list-sessions\");\n\n const input = ListSessionsInputSchema.parse(ctx.input);\n const storageService = getStorageService();\n const sessions = storageService.listSessionsWithMetadata();\n const limit = input.limit ?? 10;\n const limited = sessions.slice(0, limit);\n\n if (limited.length === 0) {\n return { content: \"No sessions found.\", isError: false, data: { sessions: [] } };\n }\n\n const lines = limited.map((s) => {\n return `- **${s.sessionId}** - ${s.status} - ${s.targetUrl} (${s.stepsCount ?? 0} steps)`;\n });\n\n const content = [\n \"## Sessions\",\n \"\",\n ...lines,\n \"\",\n sessions.length > limit ? `Showing ${limit} of ${sessions.length} sessions.` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return { content: content, isError: false, data: { sessions: limited } };\n },\n};\n\n// ========================================\n// Run Result Tools\n// ========================================\n\nconst runResultListTool: ILocalMcpTool = {\n name: \"muggle-local-run-result-list\",\n description: \"List run results (test generation and replay history), optionally filtered by cloud test case ID.\",\n inputSchema: RunResultListInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-run-result-list\");\n\n const input = RunResultListInputSchema.parse(ctx.input);\n const storage = getRunResultStorageService();\n let results = storage.listRunResults();\n\n if (input.cloudTestCaseId) {\n results = results.filter((r) => r.cloudTestCaseId === input.cloudTestCaseId);\n }\n\n const limit = input.limit ?? 20;\n results = results.slice(0, limit);\n\n if (results.length === 0) {\n return { content: \"No run results found.\", isError: false, data: { results: [] } };\n }\n\n const lines = results.map((r) => {\n return `- **${r.id}** - ${r.runType} - ${r.status} (${r.executionTimeMs ?? 0}ms)`;\n });\n\n const content = [\"## Run Results\", \"\", ...lines].join(\"\\n\");\n\n return { content: content, isError: false, data: { results: results } };\n },\n};\n\nconst runResultGetTool: ILocalMcpTool = {\n name: \"muggle-local-run-result-get\",\n description: \"Get detailed information about a run result including screenshots and action script output.\",\n inputSchema: RunResultGetInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-run-result-get\");\n\n const input = RunResultGetInputSchema.parse(ctx.input);\n const storage = getRunResultStorageService();\n const result = storage.getRunResult(input.runId);\n\n if (!result) {\n return { content: `Run result not found: ${input.runId}`, isError: true };\n }\n\n const content = [\n \"## Run Result Details\",\n \"\",\n `**ID:** ${result.id}`,\n `**Type:** ${result.runType}`,\n `**Status:** ${result.status}`,\n `**Cloud Test Case:** ${result.cloudTestCaseId}`,\n `**Duration:** ${result.executionTimeMs ?? 0}ms`,\n result.errorMessage ? `**Error:** ${result.errorMessage}` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return { content: content, isError: false, data: result };\n },\n};\n\n// ========================================\n// Test Script Tools (Read-only - scripts are generated during execution)\n// ========================================\n\nconst testScriptListTool: ILocalMcpTool = {\n name: \"muggle-local-test-script-list\",\n description: \"List locally generated test scripts, optionally filtered by cloud test case ID.\",\n inputSchema: TestScriptListInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-test-script-list\");\n\n const input = TestScriptListInputSchema.parse(ctx.input);\n const storage = getRunResultStorageService();\n let scripts = storage.listTestScripts();\n\n if (input.cloudTestCaseId) {\n scripts = scripts.filter((s) => s.cloudTestCaseId === input.cloudTestCaseId);\n }\n\n if (scripts.length === 0) {\n return { content: \"No test scripts found.\", isError: false, data: { testScripts: [] } };\n }\n\n const lines = scripts.map((ts) => `- **${ts.name}** (${ts.id}) - ${ts.status}`);\n const content = [\"## Test Scripts\", \"\", ...lines].join(\"\\n\");\n\n return { content: content, isError: false, data: { testScripts: scripts } };\n },\n};\n\nconst testScriptGetTool: ILocalMcpTool = {\n name: \"muggle-local-test-script-get\",\n description: \"Get details of a locally generated test script including action script steps.\",\n inputSchema: TestScriptGetInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-test-script-get\");\n\n const input = TestScriptGetInputSchema.parse(ctx.input);\n const storage = getRunResultStorageService();\n const testScript = storage.getTestScript(input.testScriptId);\n\n if (!testScript) {\n return { content: `Test script not found: ${input.testScriptId}`, isError: true };\n }\n\n const content = [\n \"## Test Script Details\",\n \"\",\n `**ID:** ${testScript.id}`,\n `**Name:** ${testScript.name}`,\n `**URL:** ${testScript.url}`,\n `**Status:** ${testScript.status}`,\n testScript.goal ? `**Goal:** ${testScript.goal}` : \"\",\n testScript.actionScript ? `**Steps:** ${testScript.actionScript.length}` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return { content: content, isError: false, data: testScript };\n },\n};\n\n// ========================================\n// Execution Tools\n// ========================================\n\nconst executeTestGenerationTool: ILocalMcpTool = {\n name: \"muggle-local-execute-test-generation\",\n description: \"Execute test script generation for a test case. First call qa_test_case_get to get test case details, then pass them here along with the localhost URL. Requires explicit approval before launching electron-app in explore mode.\",\n inputSchema: ExecuteTestGenerationInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-execute-test-generation\");\n\n const input = ExecuteTestGenerationInputSchema.parse(ctx.input);\n\n if (!input.approveElectronAppLaunch) {\n return {\n content: [\n \"## Electron App Launch Required\",\n \"\",\n \"This tool will launch the electron-app to generate a test script.\",\n \"Please set `approveElectronAppLaunch: true` to proceed.\",\n \"\",\n `**Test Case:** ${input.testCase.title}`,\n `**Local URL:** ${input.localUrl}`,\n \"\",\n \"**Note:** The electron-app will open a browser window and navigate to your test URL.\",\n ].join(\"\\n\"),\n isError: false,\n data: { requiresApproval: true },\n };\n }\n\n try {\n const result = await executeTestGeneration({\n testCase: input.testCase,\n localUrl: input.localUrl,\n timeoutMs: input.timeoutMs,\n });\n\n const content = [\n \"## Test Generation \" + (result.status === \"passed\" ? \"Successful\" : \"Failed\"),\n \"\",\n `**Run ID:** ${result.id}`,\n `**Test Script ID:** ${result.testScriptId}`,\n `**Status:** ${result.status}`,\n `**Duration:** ${result.executionTimeMs}ms`,\n result.errorMessage ? `**Error:** ${result.errorMessage}` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return {\n content: content,\n isError: result.status !== \"passed\",\n data: result,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Test generation failed\", { error: errorMessage });\n return { content: `Test generation failed: ${errorMessage}`, isError: true };\n }\n },\n};\n\nconst executeReplayTool: ILocalMcpTool = {\n name: \"muggle-local-execute-replay\",\n description: \"Execute test script replay. First call qa_test_script_get to get test script details (including actionScript), then pass them here along with the localhost URL. Requires explicit approval before launching electron-app in engine mode.\",\n inputSchema: ExecuteReplayInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-execute-replay\");\n\n const input = ExecuteReplayInputSchema.parse(ctx.input);\n\n if (!input.approveElectronAppLaunch) {\n return {\n content: [\n \"## Electron App Launch Required\",\n \"\",\n \"This tool will launch the electron-app to replay a test script.\",\n \"Please set `approveElectronAppLaunch: true` to proceed.\",\n \"\",\n `**Test Script:** ${input.testScript.name}`,\n `**Local URL:** ${input.localUrl}`,\n `**Steps:** ${input.testScript.actionScript.length}`,\n \"\",\n \"**Note:** The electron-app will open a browser window and execute the test steps.\",\n ].join(\"\\n\"),\n isError: false,\n data: { requiresApproval: true },\n };\n }\n\n try {\n const result = await executeReplay({\n testScript: input.testScript,\n localUrl: input.localUrl,\n timeoutMs: input.timeoutMs,\n });\n\n const content = [\n \"## Test Replay \" + (result.status === \"passed\" ? \"Successful\" : \"Failed\"),\n \"\",\n `**Run ID:** ${result.id}`,\n `**Test Script ID:** ${result.testScriptId}`,\n `**Status:** ${result.status}`,\n `**Duration:** ${result.executionTimeMs}ms`,\n result.errorMessage ? `**Error:** ${result.errorMessage}` : \"\",\n ].filter(Boolean).join(\"\\n\");\n\n return {\n content: content,\n isError: result.status !== \"passed\",\n data: result,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\"Test replay failed\", { error: errorMessage });\n return { content: `Test replay failed: ${errorMessage}`, isError: true };\n }\n },\n};\n\nconst cancelExecutionTool: ILocalMcpTool = {\n name: \"muggle-local-cancel-execution\",\n description: \"Cancel an active test generation or replay execution.\",\n inputSchema: CancelExecutionInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-cancel-execution\");\n\n const input = CancelExecutionInputSchema.parse(ctx.input);\n\n const cancelled = cancelExecution({ runId: input.runId });\n\n if (cancelled) {\n return { content: `Execution cancelled: ${input.runId}`, isError: false };\n }\n\n return { content: `No active execution found with ID: ${input.runId}`, isError: true };\n },\n};\n\n// ========================================\n// Publishing Tools\n// ========================================\n\nconst publishTestScriptTool: ILocalMcpTool = {\n name: \"muggle-local-publish-test-script\",\n description: \"Publish a locally generated test script to the cloud. Uses the run ID from muggle_execute_test_generation to find the script and uploads it to the specified cloud test case.\",\n inputSchema: PublishTestScriptInputSchema,\n execute: async (ctx) => {\n const logger = createChildLogger(ctx.correlationId);\n logger.info(\"Executing muggle-local-publish-test-script\");\n\n const input = PublishTestScriptInputSchema.parse(ctx.input);\n const storage = getRunResultStorageService();\n\n // Get the run result to find the test script\n const runResult = storage.getRunResult(input.runId);\n if (!runResult) {\n return { content: `Run result not found: ${input.runId}`, isError: true };\n }\n\n if (!runResult.testScriptId) {\n return { content: `Run result ${input.runId} does not have an associated test script`, isError: true };\n }\n\n const testScript = storage.getTestScript(runResult.testScriptId);\n if (!testScript) {\n return { content: `Test script not found: ${runResult.testScriptId}`, isError: true };\n }\n\n // TODO: Implement actual publish to cloud via prompt-service client\n // For now, return placeholder\n return {\n content: [\n \"## Test Script Publishing\",\n \"\",\n \"Publishing test scripts to cloud is not yet implemented.\",\n \"\",\n `**Run ID:** ${input.runId}`,\n `**Test Script ID:** ${runResult.testScriptId}`,\n `**Target Cloud Test Case:** ${input.cloudTestCaseId}`,\n ].join(\"\\n\"),\n isError: true,\n };\n },\n};\n\n// ========================================\n// All Tools Registry\n// ========================================\n\n/**\n * All registered local QA tools.\n * Minimal set focused on execution and results.\n */\nexport const allLocalQaTools: ILocalMcpTool[] = [\n // Status tools\n checkStatusTool,\n listSessionsTool,\n // Run result tools\n runResultListTool,\n runResultGetTool,\n // Test script tools (read-only)\n testScriptListTool,\n testScriptGetTool,\n // Execution tools\n executeTestGenerationTool,\n executeReplayTool,\n cancelExecutionTool,\n // Publishing tools\n publishTestScriptTool,\n];\n\n/**\n * Map of tool name to tool definition for fast lookup.\n */\nconst toolMap: Map<string, ILocalMcpTool> = new Map(\n allLocalQaTools.map((tool) => [tool.name, tool]),\n);\n\n/**\n * Get a tool by name.\n */\nexport function getTool(name: string): ILocalMcpTool | undefined {\n return toolMap.get(name);\n}\n\n/**\n * Execute a tool by name.\n */\nexport async function executeTool(\n name: string,\n input: unknown,\n correlationId: string,\n): Promise<IMcpToolResult> {\n const tool = getTool(name);\n\n if (!tool) {\n return {\n content: `Unknown tool: ${name}. Available tools: ${allLocalQaTools.map((t) => t.name).join(\", \")}`,\n isError: true,\n };\n }\n\n return tool.execute({ input: input, correlationId: correlationId });\n}\n"]}