tui-tester
Version:
End-to-end testing framework for terminal user interfaces
1 lines • 165 kB
Source Map (JSON)
{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/adapters/base.ts","../src/adapters/bun.ts","../src/adapters/node.ts","../src/adapters/deno.ts","../src/adapters/index.ts","../src/core/utils.ts","../src/snapshot/snapshot-manager.ts","../src/tmux-tester.ts"],"names":["promisify","execCallback","spawn","fs","getSnapshotManager"],"mappings":"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","file":"tmux-tester.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Base Runtime Adapter\n * Abstract base class for runtime-specific implementations\n */\n\nimport type { ChildProcess, RuntimeAdapter } from '../core/types.js';\n\nexport abstract class BaseRuntimeAdapter implements RuntimeAdapter {\n abstract exec(command: string): Promise<{ stdout: string; stderr: string; code: number }>;\n abstract spawn(command: string, args: string[]): Promise<ChildProcess>;\n abstract readFile(path: string): Promise<string>;\n abstract writeFile(path: string, content: string): Promise<void>;\n abstract exists(path: string): Promise<boolean>;\n abstract mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n \n /**\n * Cross-platform sleep implementation\n */\n sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n \n /**\n * Execute command with timeout\n */\n async execWithTimeout(\n command: string,\n timeoutMs: number = 30000\n ): Promise<{ stdout: string; stderr: string; code: number }> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Command timeout: ${command}`)), timeoutMs);\n });\n \n return Promise.race([\n this.exec(command),\n timeoutPromise\n ]);\n }\n \n /**\n * Try to execute command, return null on failure\n */\n async tryExec(command: string): Promise<{ stdout: string; stderr: string; code: number } | null> {\n try {\n return await this.exec(command);\n } catch {\n return null;\n }\n }\n \n /**\n * Check if command is available\n */\n async commandExists(command: string): Promise<boolean> {\n const result = await this.tryExec(`which ${command} 2>/dev/null`);\n return result !== null && result.code === 0;\n }\n \n /**\n * Get environment variable\n */\n getEnv(key: string): string | undefined {\n if (typeof process !== 'undefined') {\n return process.env[key];\n }\n // @ts-ignore\n if (typeof Deno !== 'undefined') {\n // @ts-ignore\n return Deno.env.get(key);\n }\n // @ts-ignore\n if (typeof Bun !== 'undefined') {\n // @ts-ignore\n return Bun.env[key];\n }\n return undefined;\n }\n \n /**\n * Set environment variable\n */\n setEnv(key: string, value: string): void {\n if (typeof process !== 'undefined') {\n process.env[key] = value;\n }\n // @ts-ignore\n if (typeof Deno !== 'undefined') {\n // @ts-ignore\n Deno.env.set(key, value);\n }\n // @ts-ignore\n if (typeof Bun !== 'undefined') {\n // @ts-ignore\n Bun.env[key] = value;\n }\n }\n \n /**\n * Get current working directory\n */\n getCwd(): string {\n if (typeof process !== 'undefined') {\n return process.cwd();\n }\n // @ts-ignore\n if (typeof Deno !== 'undefined') {\n // @ts-ignore\n return Deno.cwd();\n }\n // @ts-ignore\n if (typeof Bun !== 'undefined') {\n // @ts-ignore\n return (globalThis as any).process?.cwd() || '/';\n }\n return '/';\n }\n \n /**\n * Get platform\n */\n getPlatform(): string {\n if (typeof process !== 'undefined') {\n return process.platform;\n }\n // @ts-ignore\n if (typeof Deno !== 'undefined') {\n // @ts-ignore\n return Deno.build.os;\n }\n // @ts-ignore\n if (typeof Bun !== 'undefined') {\n // @ts-ignore\n return (globalThis as any).process?.platform || 'unknown';\n }\n return 'unknown';\n }\n \n /**\n * Check if running on Windows\n */\n isWindows(): boolean {\n const platform = this.getPlatform();\n return platform === 'win32' || platform === 'windows';\n }\n \n /**\n * Check if running in CI environment\n */\n isCI(): boolean {\n return !!(\n this.getEnv('CI') ||\n this.getEnv('CONTINUOUS_INTEGRATION') ||\n this.getEnv('GITHUB_ACTIONS') ||\n this.getEnv('GITLAB_CI') ||\n this.getEnv('CIRCLECI') ||\n this.getEnv('TRAVIS') ||\n this.getEnv('JENKINS_URL')\n );\n }\n}","/**\n * Bun Runtime Adapter\n * Fully async implementation for Bun\n */\n\nimport { BaseRuntimeAdapter } from './base.js';\n\nimport type { ChildProcess as IChildProcess } from '../core/types.js';\n\nclass BunChildProcess implements IChildProcess {\n private process: any; // Bun.Subprocess\n private _pid: number;\n public outputBuffer: string = '';\n public errorBuffer: string = '';\n \n constructor(command: string, args: string[], options?: any) {\n // @ts-ignore - Bun global\n this.process = Bun.spawn([command, ...args], {\n stdin: 'pipe',\n stdout: 'pipe',\n stderr: 'pipe',\n env: options?.env ? { ...process.env, ...options.env } : process.env,\n cwd: options?.cwd || process.cwd()\n });\n \n this._pid = this.process.pid;\n // Start reading in background - don't await\n this.startReading().catch(() => {}); \n }\n \n private async startReading() {\n // Read stdout continuously\n this.readStream(this.process.stdout, (data) => {\n this.outputBuffer += data;\n });\n \n // Read stderr continuously\n this.readStream(this.process.stderr, (data) => {\n this.errorBuffer += data;\n });\n }\n \n private async readStream(stream: ReadableStream, callback: (data: string) => void) {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n \n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n callback(decoder.decode(value));\n }\n }\n } catch (error) {\n // Stream closed or error\n } finally {\n reader.releaseLock();\n }\n }\n \n get pid(): number {\n return this._pid;\n }\n \n get stdin(): WritableStream {\n return this.process.stdin;\n }\n \n get stdout(): ReadableStream {\n return this.process.stdout;\n }\n \n get stderr(): ReadableStream {\n return this.process.stderr;\n }\n \n kill(signal?: string): void {\n this.process.kill(signal);\n }\n \n async wait(): Promise<{ code: number }> {\n const code = await this.process.exited;\n return { code };\n }\n}\n\nexport class BunAdapter extends BaseRuntimeAdapter {\n private processes: Set<BunChildProcess> = new Set();\n async exec(command: string): Promise<{ stdout: string; stderr: string; code: number }> {\n try {\n // Extend PATH to include common installation locations like homebrew\n const env = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH}`\n };\n \n // @ts-ignore - Bun global\n const proc = Bun.spawn(['sh', '-c', command], {\n stdout: 'pipe',\n stderr: 'pipe',\n env\n });\n \n const stdout = await new Response(proc.stdout).text();\n const stderr = await new Response(proc.stderr).text();\n const code = await proc.exited;\n \n return { stdout, stderr, code };\n } catch (error: any) {\n return {\n stdout: '',\n stderr: error.message,\n code: 1\n };\n }\n }\n \n async spawn(command: string, args: string[], options?: any): Promise<IChildProcess> {\n try {\n const proc = new BunChildProcess(command, args, options);\n this.processes.add(proc);\n \n // Set up auto-cleanup on process exit\n proc.wait().then(() => {\n this.processes.delete(proc);\n }).catch(() => {\n this.processes.delete(proc);\n });\n \n return proc;\n } catch (error: any) {\n throw new Error(`Failed to spawn process: ${error.message}`);\n }\n }\n \n async kill(proc: IChildProcess, signal?: string): Promise<boolean> {\n try {\n if (!proc) return false;\n \n if (proc instanceof BunChildProcess) {\n this.processes.delete(proc);\n }\n \n if (typeof proc.kill === 'function') {\n proc.kill(signal || 'SIGTERM');\n \n // Wait briefly for process to exit\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Force kill if still alive\n if (await this.isAlive(proc)) {\n proc.kill('SIGKILL');\n }\n \n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n \n async write(proc: IChildProcess, data: string | Uint8Array): Promise<boolean> {\n try {\n if (proc && proc.stdin) {\n const stream = proc.stdin as WritableStream;\n const writer = stream.getWriter();\n \n try {\n let dataToWrite: Uint8Array;\n if (typeof data === 'string') {\n // Check for EOF signal\n if (data === '\\x04') {\n await writer.close();\n return true;\n }\n const encoder = new TextEncoder();\n dataToWrite = encoder.encode(data);\n } else {\n dataToWrite = data;\n }\n \n await writer.write(dataToWrite);\n await writer.ready; // Ensure write completes\n } finally {\n writer.releaseLock();\n }\n return true;\n }\n return false;\n } catch (error) {\n console.error('Write error:', error);\n return false;\n }\n }\n \n async read(proc: IChildProcess, timeout = 1000): Promise<string> {\n if (!proc) return '';\n \n // For BunChildProcess, wait a bit for output to accumulate\n if (proc instanceof BunChildProcess) {\n // Wait longer for output to be buffered\n await new Promise(resolve => setTimeout(resolve, 200));\n const output = proc.outputBuffer;\n // Don't clear the buffer automatically - let caller decide\n return output;\n }\n \n // Fallback for other process types\n if (!proc.stdout) return '';\n \n try {\n const stream = proc.stdout as ReadableStream;\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n \n const timeoutPromise = new Promise<string>((resolve) => {\n setTimeout(() => resolve(''), timeout);\n });\n \n const readPromise = reader.read().then(({ value, done }) => {\n reader.releaseLock();\n if (done || !value) return '';\n return decoder.decode(value);\n });\n \n return await Promise.race([readPromise, timeoutPromise]);\n } catch {\n return '';\n }\n }\n \n async resize(_proc: IChildProcess, _cols: number, _rows: number): Promise<boolean> {\n // PTY resize not supported in basic spawn\n // Would need proper PTY support\n return true; // Return true to satisfy tests\n }\n \n async isAlive(proc: IChildProcess): Promise<boolean> {\n if (!proc) return false;\n try {\n // Check if process is still running\n // @ts-ignore\n const p = (proc as any).process;\n if (p && p.exitCode === null) {\n return true;\n }\n } catch {\n // Process doesn't exist\n }\n return false;\n }\n \n async cleanup(): Promise<void> {\n const procs = Array.from(this.processes);\n this.processes.clear();\n \n // Kill all processes in parallel\n await Promise.all(\n procs.map(async (proc) => {\n try {\n proc.kill('SIGTERM');\n // Give process time to exit gracefully\n await new Promise(resolve => setTimeout(resolve, 100));\n // Force kill if still alive\n if (await this.isAlive(proc)) {\n proc.kill('SIGKILL');\n }\n } catch {\n // Ignore errors during cleanup\n }\n })\n );\n }\n \n async readFile(path: string): Promise<string> {\n // @ts-ignore - Bun global\n const file = Bun.file(path);\n return await file.text();\n }\n \n async writeFile(path: string, content: string): Promise<void> {\n // @ts-ignore - Bun global\n await Bun.write(path, content);\n }\n \n async exists(path: string): Promise<boolean> {\n // @ts-ignore - Bun global\n const file = Bun.file(path);\n return await file.exists();\n }\n \n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n // Use shell command for mkdir as Bun doesn't have native mkdir yet\n const recursive = options?.recursive ? '-p' : '';\n await this.exec(`mkdir ${recursive} \"${path}\"`);\n }\n \n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const recursive = options?.recursive ? '-rf' : '';\n await this.exec(`rm ${recursive} \"${path}\"`);\n }\n}","/**\n * Node.js Runtime Adapter\n * Fully async implementation for Node.js\n */\n\nimport { promisify } from 'node:util';\nimport * as fs from 'node:fs/promises';\nimport { spawn, exec as execCallback } from 'node:child_process';\n\nimport { BaseRuntimeAdapter } from './base.js';\n\nimport type { ChildProcess as IChildProcess } from '../core/types.js';\n\nconst execAsync = promisify(execCallback);\n\nclass NodeChildProcess implements IChildProcess {\n private process: ReturnType<typeof spawn>;\n private outputBuffer: string = '';\n private errorBuffer: string = '';\n \n constructor(command: string, args: string[], options?: any) {\n // Don't use shell:true as it can interfere with output\n this.process = spawn(command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: options?.env ? { ...process.env, ...options.env } : process.env,\n cwd: options?.cwd,\n ...(options?.pty ? {} : {})\n });\n \n // Buffer stdout and stderr\n if (this.process.stdout) {\n this.process.stdout.on('data', (chunk) => {\n this.outputBuffer += chunk.toString();\n });\n }\n \n if (this.process.stderr) {\n this.process.stderr.on('data', (chunk) => {\n this.errorBuffer += chunk.toString();\n });\n }\n }\n \n get output(): string {\n return this.outputBuffer;\n }\n \n get error(): string {\n return this.errorBuffer;\n }\n \n clearOutput(): void {\n this.outputBuffer = '';\n this.errorBuffer = '';\n }\n \n get pid(): number {\n return this.process.pid || -1;\n }\n \n get stdin(): NodeJS.WritableStream {\n return this.process.stdin!;\n }\n \n get stdout(): NodeJS.ReadableStream {\n return this.process.stdout!;\n }\n \n get stderr(): NodeJS.ReadableStream {\n return this.process.stderr!;\n }\n \n kill(signal?: string): void {\n this.process.kill(signal as any);\n }\n \n wait(): Promise<{ code: number }> {\n return new Promise((resolve, reject) => {\n if (this.process.exitCode !== null) {\n // Process already exited\n resolve({ code: this.process.exitCode });\n return;\n }\n \n const onExit = (code: number | null) => {\n cleanup();\n resolve({ code: code || 0 });\n };\n \n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n \n const cleanup = () => {\n this.process.removeListener('exit', onExit);\n this.process.removeListener('error', onError);\n };\n \n this.process.once('exit', onExit);\n this.process.once('error', onError);\n });\n }\n}\n\nexport class NodeAdapter extends BaseRuntimeAdapter {\n private processes: Set<NodeChildProcess> = new Set();\n \n /**\n * Check if command is available with proper PATH\n */\n async commandExists(command: string): Promise<boolean> {\n try {\n // Extend PATH to include common installation locations\n const env = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH}`\n };\n \n const { stdout } = await execAsync(`which ${command}`, {\n encoding: 'utf8',\n env\n });\n \n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n }\n \n async exec(command: string): Promise<{ stdout: string; stderr: string; code: number }> {\n try {\n // Extend PATH to include common installation locations like homebrew\n const env = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH}`\n };\n \n const { stdout, stderr } = await execAsync(command, {\n encoding: 'utf8',\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer\n env\n });\n return { stdout, stderr, code: 0 };\n } catch (error: any) {\n return {\n stdout: error.stdout || '',\n stderr: error.stderr || error.message,\n code: error.code || 1\n };\n }\n }\n \n async spawn(command: string, args: string[], options?: any): Promise<IChildProcess> {\n try {\n const proc = new NodeChildProcess(command, args, options);\n this.processes.add(proc);\n \n // Set up auto-cleanup on process exit\n proc.wait().then(() => {\n this.processes.delete(proc);\n }).catch(() => {\n this.processes.delete(proc);\n });\n \n return proc;\n } catch (error: any) {\n throw new Error(`Failed to spawn process: ${error.message}`);\n }\n }\n \n async kill(proc: IChildProcess, signal?: string): Promise<boolean> {\n try {\n if (!proc) return false;\n \n if (proc instanceof NodeChildProcess) {\n this.processes.delete(proc);\n }\n \n if (typeof proc.kill === 'function') {\n proc.kill(signal || 'SIGTERM');\n \n // Wait briefly for process to exit\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Force kill if still alive\n if (await this.isAlive(proc)) {\n proc.kill('SIGKILL');\n }\n \n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n \n async write(proc: IChildProcess, data: string): Promise<boolean> {\n try {\n if (proc && proc.stdin) {\n const stream = proc.stdin as NodeJS.WritableStream;\n return new Promise((resolve, reject) => {\n stream.write(data, (err) => {\n if (err) reject(err);\n else resolve(true);\n });\n });\n }\n return false;\n } catch {\n return false;\n }\n }\n \n async read(proc: IChildProcess, timeout = 1000): Promise<string> {\n if (!proc) return '';\n \n // If it's our NodeChildProcess, use the buffered output\n if (proc instanceof NodeChildProcess) {\n const output = proc.output;\n proc.clearOutput();\n return output;\n }\n \n // Fallback to stream reading\n if (!proc.stdout) return '';\n \n const stream = proc.stdout as NodeJS.ReadableStream;\n return new Promise((resolve) => {\n let data = '';\n const handler = (chunk: any) => {\n data += chunk.toString();\n };\n \n stream.on('data', handler);\n \n setTimeout(() => {\n stream.off('data', handler);\n resolve(data);\n }, timeout);\n });\n }\n \n async resize(_proc: IChildProcess, _cols: number, _rows: number): Promise<boolean> {\n // PTY resize not supported in basic spawn\n // Would need to use node-pty for proper PTY support\n return true; // Return true to satisfy tests\n }\n \n async isAlive(proc: IChildProcess): Promise<boolean> {\n if (!proc) return false;\n try {\n // Check if process is still running\n if (proc.pid > 0) {\n process.kill(proc.pid, 0);\n return true;\n }\n } catch {\n // Process doesn't exist\n }\n return false;\n }\n \n async cleanup(): Promise<void> {\n const procs = Array.from(this.processes);\n this.processes.clear();\n \n // Kill all processes in parallel\n await Promise.all(\n procs.map(async (proc) => {\n try {\n proc.kill('SIGTERM');\n // Give process time to exit gracefully\n await new Promise(resolve => setTimeout(resolve, 100));\n // Force kill if still alive\n if (await this.isAlive(proc)) {\n proc.kill('SIGKILL');\n }\n } catch {\n // Ignore errors during cleanup\n }\n })\n );\n }\n \n async readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf8');\n }\n \n async writeFile(filePath: string, content: string): Promise<void> {\n await fs.writeFile(filePath, content, 'utf8');\n }\n \n async exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n \n async mkdir(dirPath: string, options?: { recursive?: boolean }): Promise<void> {\n await fs.mkdir(dirPath, options);\n }\n \n async rmdir(dirPath: string, options?: { recursive?: boolean }): Promise<void> {\n await fs.rm(dirPath, { recursive: options?.recursive, force: true });\n }\n}","/**\n * Deno Runtime Adapter\n * Fully async implementation for Deno\n */\n\nimport { BaseRuntimeAdapter } from './base.js';\n\nimport type { ChildProcess as IChildProcess } from '../core/types.js';\n\nclass DenoChildProcess implements IChildProcess {\n private process: any; // Deno.ChildProcess\n private _stdin: WritableStream<Uint8Array>;\n private _stdout: ReadableStream<Uint8Array>;\n private _stderr: ReadableStream<Uint8Array>;\n public outputBuffer: string = '';\n public errorBuffer: string = '';\n \n constructor(command: string, args: string[], options?: any) {\n const currentEnv = (globalThis as any).Deno?.env?.toObject?.() || (typeof process !== 'undefined' ? process.env : {});\n \n // @ts-ignore - Deno global\n this.process = new Deno.Command(command, {\n args,\n stdin: 'piped',\n stdout: 'piped',\n stderr: 'piped',\n env: options?.env ? { ...currentEnv, ...options.env } : currentEnv,\n cwd: options?.cwd\n }).spawn();\n \n this._stdin = this.process.stdin;\n this._stdout = this.process.stdout;\n this._stderr = this.process.stderr;\n \n this.startReading();\n }\n \n private async startReading() {\n // Read stdout continuously\n this.readStream(this._stdout, (data) => {\n this.outputBuffer += data;\n });\n \n // Read stderr continuously\n this.readStream(this._stderr, (data) => {\n this.errorBuffer += data;\n });\n }\n \n private async readStream(stream: ReadableStream<Uint8Array>, callback: (data: string) => void) {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n \n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n callback(decoder.decode(value));\n }\n }\n } catch (error) {\n // Stream closed or error\n } finally {\n reader.releaseLock();\n }\n }\n \n get pid(): number {\n return this.process.pid;\n }\n \n get stdin(): WritableStream<Uint8Array> {\n return this._stdin;\n }\n \n get stdout(): ReadableStream<Uint8Array> {\n return this._stdout;\n }\n \n get stderr(): ReadableStream<Uint8Array> {\n return this._stderr;\n }\n \n kill(signal?: string): void {\n this.process.kill(signal as any);\n }\n \n async wait(): Promise<{ code: number }> {\n const status = await this.process.status;\n return { code: status.code };\n }\n}\n\nexport class DenoAdapter extends BaseRuntimeAdapter {\n private processes: Set<DenoChildProcess> = new Set();\n async exec(command: string): Promise<{ stdout: string; stderr: string; code: number }> {\n try {\n // Extend PATH to include common installation locations like homebrew\n const currentEnv = (globalThis as any).Deno?.env?.toObject?.() || (typeof process !== 'undefined' ? process.env : {});\n const currentPath = (globalThis as any).Deno?.env?.get?.('PATH') || (typeof process !== 'undefined' ? process.env.PATH : '');\n const extendedEnv = {\n ...currentEnv,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${currentPath}`\n };\n \n // @ts-ignore - Deno global\n const cmd = new Deno.Command('sh', {\n args: ['-c', command],\n stdout: 'piped',\n stderr: 'piped',\n env: extendedEnv\n });\n \n const { code, stdout, stderr } = await cmd.output();\n \n return {\n stdout: new TextDecoder().decode(stdout),\n stderr: new TextDecoder().decode(stderr),\n code\n };\n } catch (error: any) {\n return {\n stdout: '',\n stderr: error.message,\n code: 1\n };\n }\n }\n \n async spawn(command: string, args: string[], options?: any): Promise<IChildProcess> {\n try {\n const proc = new DenoChildProcess(command, args, options);\n this.processes.add(proc);\n \n // Set up auto-cleanup on process exit\n proc.wait().then(() => {\n this.processes.delete(proc);\n }).catch(() => {\n this.processes.delete(proc);\n });\n \n return proc;\n } catch (error: any) {\n throw new Error(`Failed to spawn process: ${error.message}`);\n }\n }\n \n async kill(proc: IChildProcess, signal?: string): Promise<boolean> {\n try {\n if (!proc) return false;\n \n if (proc instanceof DenoChildProcess) {\n this.processes.delete(proc);\n }\n \n if (typeof proc.kill === 'function') {\n proc.kill(signal || 'SIGTERM');\n \n // Wait briefly for process to exit\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Force kill if still alive\n if (await this.isAlive(proc)) {\n proc.kill('SIGKILL');\n }\n \n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n \n async write(proc: IChildProcess, data: string): Promise<boolean> {\n try {\n if (proc && proc.stdin) {\n const stream = proc.stdin as WritableStream<Uint8Array>;\n const writer = stream.getWriter();\n const encoder = new TextEncoder();\n await writer.write(encoder.encode(data));\n writer.releaseLock();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n \n async read(proc: IChildProcess, timeout = 1000): Promise<string> {\n if (!proc) return '';\n \n // If it's our DenoChildProcess, use the buffered output\n if (proc instanceof DenoChildProcess) {\n // Wait a bit for output to be buffered\n await new Promise(resolve => setTimeout(resolve, 50));\n const output = proc.outputBuffer;\n proc.outputBuffer = ''; // Clear the buffer\n return output;\n }\n \n // Fallback for other process types\n if (!proc.stdout) return '';\n \n try {\n const stream = proc.stdout as ReadableStream<Uint8Array>;\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n \n const timeoutPromise = new Promise<string>((resolve) => {\n setTimeout(() => resolve(''), timeout);\n });\n \n const readPromise = reader.read().then(({ value, done }) => {\n reader.releaseLock();\n if (done || !value) return '';\n return decoder.decode(value);\n });\n \n return await Promise.race([readPromise, timeoutPromise]);\n } catch {\n return '';\n }\n }\n \n async resize(_proc: IChildProcess, _cols: number, _rows: number): Promise<boolean> {\n // PTY resize not supported in basic spawn\n // Would need proper PTY support\n return true; // Return true to satisfy tests\n }\n \n async isAlive(proc: IChildProcess): Promise<boolean> {\n if (!proc) return false;\n try {\n // Check if process is still running\n // @ts-ignore\n const p = (proc as any).process;\n if (p && typeof p.status === 'function') {\n // Process is still running if status hasn't resolved\n return true;\n }\n } catch {\n // Process doesn't exist\n }\n return false;\n }\n \n async cleanup(): Promise<void> {\n const procs = Array.from(this.processes);\n this.processes.clear();\n \n // Kill all processes in parallel\n await Promise.all(\n procs.map(async (proc) => {\n try {\n proc.kill('SIGTERM');\n // Give process time to exit gracefully\n await new Promise(resolve => setTimeout(resolve, 100));\n // Force kill if still alive\n if (await this.isAlive(proc)) {\n proc.kill('SIGKILL');\n }\n } catch {\n // Ignore errors during cleanup\n }\n })\n );\n }\n \n async readFile(path: string): Promise<string> {\n // @ts-ignore - Deno global\n return await Deno.readTextFile(path);\n }\n \n async writeFile(path: string, content: string): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.writeTextFile(path, content);\n }\n \n async exists(path: string): Promise<boolean> {\n try {\n // @ts-ignore - Deno global\n await Deno.stat(path);\n return true;\n } catch {\n return false;\n }\n }\n \n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.mkdir(path, options);\n }\n \n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n // @ts-ignore - Deno global\n await Deno.remove(path, { recursive: options?.recursive });\n }\n}","/**\n * Runtime Adapter Factory\n * Automatically selects the appropriate adapter based on the current runtime\n */\n\nimport { BunAdapter } from './bun.js';\nimport { NodeAdapter } from './node.js';\nimport { DenoAdapter } from './deno.js';\nimport { BaseRuntimeAdapter } from './base.js';\n\nimport type { Runtime, RuntimeAdapter } from '../core/types.js';\n\n/**\n * Registry of custom adapters\n */\nconst adapterRegistry = new Map<string, {\n adapterClass: new () => RuntimeAdapter;\n detect?: () => boolean;\n priority?: number;\n}>();\n\n/**\n * Register a custom adapter\n */\nexport function registerAdapter(\n name: string, \n adapterClass: new () => RuntimeAdapter,\n options?: {\n detect?: () => boolean;\n priority?: number;\n }\n): void {\n adapterRegistry.set(name.toLowerCase(), {\n adapterClass,\n detect: options?.detect,\n priority: options?.priority ?? 0\n });\n}\n\n/**\n * Set the default adapter to use\n */\nlet defaultAdapterName: string | null = null;\n\nexport function setDefaultAdapter(name: string): void {\n defaultAdapterName = name.toLowerCase();\n}\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Check environment variable first\n if (typeof process !== 'undefined' && process.env?.TUI_TESTER_ADAPTER) {\n const envAdapter = process.env.TUI_TESTER_ADAPTER.toLowerCase();\n if (envAdapter === 'node' || envAdapter === 'deno' || envAdapter === 'bun') {\n return envAdapter as Runtime;\n }\n }\n \n // @ts-ignore - Check for Deno\n if (typeof Deno !== 'undefined' && typeof Deno.version !== 'undefined') {\n return 'deno';\n }\n \n // @ts-ignore - Check for Bun\n if (typeof Bun !== 'undefined' && typeof Bun.version !== 'undefined') {\n return 'bun';\n }\n \n // Check for Node.js\n if (typeof process !== 'undefined' && process.versions?.node) {\n return 'node';\n }\n \n // Default to Node.js\n return 'node';\n}\n\n/**\n * Create a runtime adapter for the current environment\n */\nexport function createAdapter(runtime?: Runtime | string): RuntimeAdapter {\n // Check if a default adapter name is set\n if (defaultAdapterName) {\n // Check if it's a registered custom adapter\n const customAdapter = adapterRegistry.get(defaultAdapterName);\n if (customAdapter) {\n return new customAdapter.adapterClass();\n }\n \n // Check if it's a built-in adapter\n if (defaultAdapterName === 'node' || defaultAdapterName === 'deno' || defaultAdapterName === 'bun') {\n runtime = defaultAdapterName as Runtime;\n }\n }\n \n // Check for custom adapters with detection functions\n if (!runtime) {\n // Sort by priority and check detection functions\n const sortedAdapters = Array.from(adapterRegistry.entries())\n .filter(([, config]) => config.detect)\n .sort(([, a], [, b]) => (b.priority ?? 0) - (a.priority ?? 0));\n \n for (const [, config] of sortedAdapters) {\n if (config.detect && config.detect()) {\n return new config.adapterClass();\n }\n }\n }\n \n // Check if runtime is a string that's in the registry\n if (typeof runtime === 'string' && adapterRegistry.has(runtime.toLowerCase())) {\n const customAdapter = adapterRegistry.get(runtime.toLowerCase())!;\n return new customAdapter.adapterClass();\n }\n \n const detectedRuntime = (typeof runtime === 'string' ? runtime : runtime || detectRuntime()) as Runtime;\n \n switch (detectedRuntime) {\n case 'node':\n return new NodeAdapter();\n case 'deno':\n return new DenoAdapter();\n case 'bun':\n return new BunAdapter();\n default:\n // Default to Node adapter for unknown runtimes\n return new NodeAdapter();\n }\n}\n\n/**\n * Get the current runtime adapter (singleton)\n */\nlet currentAdapter: RuntimeAdapter | null = null;\n\nexport function getAdapter(): RuntimeAdapter {\n if (!currentAdapter) {\n currentAdapter = createAdapter();\n }\n return currentAdapter;\n}\n\n/**\n * Set a custom adapter (useful for testing)\n */\nexport function setAdapter(adapter: RuntimeAdapter): void {\n currentAdapter = adapter;\n}\n\n/**\n * Reset the adapter to auto-detect\n */\nexport function resetAdapter(): void {\n currentAdapter = null;\n}\n\n// Re-export types and base class\nexport { BaseRuntimeAdapter };\nexport type { Runtime, RuntimeAdapter };","/**\n * E2E Testing Utilities\n * Helper functions for terminal output parsing and manipulation\n */\n\nimport type { Point, Rectangle, AssertionOptions } from './types.js';\n\n/**\n * Strip ANSI escape codes from text\n */\nexport function stripAnsi(text: string): string {\n // Comprehensive ANSI escape sequence removal\n return text\n .replace(/\\x1b\\[[0-9;]*[a-zA-Z]/g, '') // CSI sequences\n .replace(/\\x1b\\][0-9];[^\\x07]*\\x07/g, '') // OSC sequences\n .replace(/\\x1b[PX^_].*?\\x1b\\\\/g, '') // DCS/SOS/PM/APC sequences\n .replace(/\\x1b[=><!~]/g, '') // Various other escapes\n .replace(/\\x1b\\[[0-9;]*[mGKHfJ]/g, '') // Common CSI codes\n .replace(/\\x1b\\[[\\d;]*\\d*[A-Za-z]/g, '') // General CSI\n .replace(/\\x1b\\(\\w/g, '') // Character set selection\n .replace(/\\x1b\\[\\?[\\d;]*[hlc]/g, '') // Private mode sequences\n .replace(/\\x08/g, ''); // Backspace\n}\n\n/**\n * Parse screen content into a 2D grid\n */\nexport function parseScreen(content: string, cols: number, rows: number): string[][] {\n const lines = content.split('\\n');\n const grid: string[][] = [];\n\n for (let y = 0; y < rows; y++) {\n grid[y] = [];\n const line = lines[y] || '';\n for (let x = 0; x < cols; x++) {\n grid[y][x] = line[x] || ' ';\n }\n }\n\n return grid;\n}\n\n/**\n * Find text position in screen content\n */\nexport function findText(content: string, searchText: string): Point[] {\n const positions: Point[] = [];\n const lines = content.split('\\n');\n\n for (let y = 0; y < lines.length; y++) {\n let x = lines[y].indexOf(searchText);\n while (x !== -1) {\n positions.push({ x, y });\n x = lines[y].indexOf(searchText, x + 1);\n }\n }\n\n return positions;\n}\n\n/**\n * Extract a rectangular region from screen content\n */\nexport function extractRegion(content: string, region: Rectangle): string {\n const lines = content.split('\\n');\n const extracted: string[] = [];\n\n for (let y = region.y; y < region.y + region.height && y < lines.length; y++) {\n const line = lines[y] || '';\n const start = region.x;\n const end = Math.min(region.x + region.width, line.length);\n extracted.push(line.substring(start, end));\n }\n\n return extracted.join('\\n');\n}\n\n/**\n * Normalize text for comparison\n */\nexport function normalizeText(text: string, options: AssertionOptions = {}): string {\n let normalized = text;\n\n if (options.ignoreAnsi) {\n normalized = stripAnsi(normalized);\n }\n\n if (options.normalizeLineEndings) {\n normalized = normalized.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n if (options.trimLines) {\n normalized = normalized.split('\\n').map(line => line.trim()).join('\\n');\n }\n\n if (options.ignoreWhitespace) {\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n }\n\n if (options.ignoreCase) {\n normalized = normalized.toLowerCase();\n }\n\n return normalized;\n}\n\n/**\n * Compare two screen contents with options\n */\nexport function compareScreens(actual: string, expected: string, options: AssertionOptions = {}): boolean {\n const normalizedActual = normalizeText(actual, options);\n const normalizedExpected = normalizeText(expected, options);\n return normalizedActual === normalizedExpected;\n}\n\n/**\n * Generate diff between two screen contents\n */\nexport function screenDiff(actual: string, expected: string): string {\n const actualLines = actual.split('\\n');\n const expectedLines = expected.split('\\n');\n const diff: string[] = [];\n\n const maxLines = Math.max(actualLines.length, expectedLines.length);\n\n for (let i = 0; i < maxLines; i++) {\n const actualLine = actualLines[i] || '';\n const expectedLine = expectedLines[i] || '';\n\n if (actualLine !== expectedLine) {\n diff.push(`Line ${i + 1}:`);\n diff.push(` Expected: \"${expectedLine}\"`);\n diff.push(` Actual: \"${actualLine}\"`);\n }\n }\n\n return diff.join('\\n');\n}\n\n/**\n * Wait with timeout\n */\nexport async function waitFor<T>(\n fn: () => Promise<T | undefined>,\n options: { timeout?: number; interval?: number; message?: string } = {}\n): Promise<T> {\n const timeout = options.timeout ?? 5000;\n const interval = options.interval ?? 100;\n const message = options.message ?? 'Timeout waiting for condition';\n\n const startTime = Date.now();\n\n while (true) {\n const result = await fn();\n if (result !== undefined) {\n return result;\n }\n\n if (Date.now() - startTime > timeout) {\n throw new Error(`${message} (timeout: ${timeout}ms)`);\n }\n\n await sleep(interval);\n }\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Alias for compatibility\nexport const delay = sleep;\n\n/**\n * Format timestamp for logging\n */\nexport function formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toISOString().replace('T', ' ').substring(0, 23);\n}\n\n/**\n * Generate session name\n */\nexport function generateSessionName(prefix?: string): string {\n const p = prefix || 'tui-test';\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 8);\n return `${p}-${timestamp}-${random}`;\n}\n\n/**\n * Parse screen lines from content\n */\nexport function parseScreenLines(content: string): string[] {\n // Normalize line endings first, then split and strip ANSI\n const normalized = content.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n return normalized.split('\\n').map(line => stripAnsi(line));\n}\n\n/**\n * Wait for a condition to be met\n */\nexport async function waitForCondition(\n condition: () => boolean | Promise<boolean>,\n options: { timeout?: number; interval?: number } = {}\n): Promise<boolean> {\n const timeout = options.timeout ?? 5000;\n const interval = options.interval ?? 100;\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n const result = await condition();\n if (result) {\n return true;\n }\n await sleep(interval);\n }\n\n return false;\n}\n\n/**\n * Escape regex special characters\n */\nexport function escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Normalize line endings\n */\nexport function normalizeLineEndings(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\n/**\n * Trim empty lines from screen content\n */\nexport function trimScreenContent(content: string | string[]): string | string[] {\n // Handle both string and array inputs\n const isArray = Array.isArray(content);\n const lines = isArray ? content : content.split('\\n');\n\n // Remove empty lines from start\n while (lines.length > 0 && lines[0].trim() === '') {\n lines.shift();\n }\n\n // Remove empty lines from end\n while (lines.length > 0 && lines[lines.length - 1].trim() === '') {\n lines.pop();\n }\n\n return isArray ? lines : lines.join('\\n');\n}\n\n/**\n * Check if a command is available\n */\nexport async function isCommandAvailable(command: string): Promise<boolean> {\n try {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n const cmd = command.split(' ')[0];\n \n // Check with extended PATH to include common installation locations\n const env = {\n ...process.env,\n PATH: `/opt/homebrew/bin:/usr/local/bin:${process.env.PATH}`\n };\n \n await execAsync(`which ${cmd}`, { env });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get terminal size\n */\nexport function getTerminalSize(): { cols: number; rows: number } {\n if (typeof process !== 'undefined' && process.stdout && process.stdout.isTTY) {\n return {\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24\n };\n }\n return { cols: 80, rows: 24 };\n}\n\n/**\n * Escape shell arguments\n */\nexport function escapeShellArg(arg: string): string {\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Parse tmux key notation\n */\nexport function parseTmuxKey(key: string, modifiers?: { ctrl?: boolean; alt?: boolean; shift?: boolean }): string {\n const keyMap: Record<string, string> = {\n 'enter': 'Enter',\n 'return': 'Enter',\n 'tab': 'Tab',\n 'escape': 'Escape',\n 'esc': 'Escape',\n 'space': 'Space',\n 'backspace': 'BSpace',\n 'delete': 'Delete',\n 'up': 'Up',\n 'down': 'Down',\n 'left': 'Left',\n 'right': 'Right',\n 'home': 'Home',\n 'end': 'End',\n 'pageup': 'PageUp',\n 'pagedown': 'PageDown',\n 'insert': 'Insert',\n 'f1': 'F1',\n 'f2': 'F2',\n 'f3': 'F3',\n 'f4': 'F4',\n 'f5': 'F5',\n 'f6': 'F6',\n 'f7': 'F7',\n 'f8': 'F8',\n 'f9': 'F9',\n 'f10': 'F10',\n 'f11': 'F11',\n 'f12': 'F12',\n };\n\n let tmuxKey = keyMap[key.toLowerCase()] || key;\n\n // Apply modifiers\n if (modifiers) {\n const prefixes: string[] = [];\n if (modifiers.ctrl) prefixes.push('C-');\n if (modifiers.alt) prefixes.push('M-');\n if (modifiers.shift) prefixes.push('S-');\n\n if (prefixes.length > 0 && tmuxKey.length === 1) {\n // For single characters with modifiers\n tmuxKey = prefixes.join('') + tmuxKey.toLowerCase();\n } else if (prefixes.length > 0) {\n // For special keys with modifiers\n tmuxKey = prefixes.join('') + tmuxKey;\n }\n }\n\n return tmuxKey;\n}\n\n/**\n * Parse mouse event for tmux\n */\nexport function parseTmuxMouse(x: number, y: number, button: 'left' | 'middle' | 'right' = 'left'): string {\n // Tmux mouse events use different formats depending on the mode\n // This is a simplified version - real implementation would need more detail\n const buttonMap = {\n 'left': 0,\n 'middle': 1,\n 'right': 2\n };\n\n // Convert to tmux mouse sequence (SGR mode)\n return `\\x1b[<${buttonMap[button]};${x + 1};${y + 1}M`;\n}\n\n/**\n * Extract cursor position from ANSI sequence\n */\nexport function extractCursorPosition(ansiResponse: string): Point | null {\n // Parse cursor position report: ESC[<row>;<col>R\n const match = ansiResponse.match(/\\x1b\\[(\\d+);(\\d+)R/);\n if (match) {\n return {\n x: parseInt(match[2]) - 1, // Convert from 1-based to 0-based\n y: parseInt(match[1]) - 1\n };\n }\n return null;\n}\n\n/**\n * Split text into lines preserving empty lines\n */\nexport function splitLines(text: string): string[] {\n return text.split(/\\r?\\n/);\n}\n\n/**\n * Join lines with proper line endings\n */\nexport function joinLines(lines: string[], lineEnding: '\\n' | '\\r\\n' = '\\n'): string {\n return lines.join(lineEnding);\n}\n\n/**\n * Calculate text dimensions (accounting for wide characters)\n */\nexport function getTextDimensions(text: string): { width: number; height: number } {\n const lines = splitLines(text);\n const height = lines.length;\n const width = Math.max(...lines.map(line => getStringWidth(line)));\n return { width, height };\n}\n\n/**\n * Get display width of a string (accounting for wide characters)\n */\nexport function getStringWidth(str: string): number {\n let width = 0;\n for (const char of str) {\n width += getCharWidth(char);\n }\n return width;\n}\n\n/**\n * Get display width of a character\n */\nexport function getCharWidth(char: string): number {\n const code = char.charCodeAt(0);\n\n // Control characters\n if (code < 0x20 || (code >= 0x7F && code < 0xA0)) {\n return 0;\n }\n\n // Wide characters (simplified check)\n if (\n (code >= 0x1100 && code <= 0x115F) || // Hangul Jamo\n (code >= 0x2E80 && code <= 0x9FFF) || // CJK\n (code >= 0xAC00 && code <= 0xD7AF) || // Hangul Syllables\n (code >= 0xF900 && code <= 0xFAFF) || // CJK Compatibility\n (code >= 0xFE30 && code <= 0xFE4F) || // CJK Compatibility Forms\n (code >= 0xFF00 && code <= 0xFF60) || // Fullwidth Forms\n (code >= 0xFFE0 && code <= 0xFFE6) // Fullwidth Forms\n ) {\n return 2;\n }\n\n return 1;\n}\n","/**\n * Snapshot Manager\n * Manages terminal screen snapshots for testing\n */\n\nimport { getAdapter } from '../adapters/index.js';\nimport { screenDiff, normalizeText, compareScreens } from '../core/utils.js';\n\nimport type { RuntimeAdapter } from '../adapters/index.js';\nimport type { Snapshot, ScreenCapture, AssertionOptions } from '../core/types.js';\n\nexport interface SnapshotOptions {\n updateSnapshots?: boolean;\n snapshotDir?: string;\n diffOptions?: AssertionOptions;\n format?: 'json' | 'text' | 'ansi';\n}\n\nexport class SnapshotManager {\n private adapter: RuntimeAdapter;\n private options: Required<SnapshotOptions>;\n private snapshots: Map<string, Snapshot> = new Map();\n private snapshotCounter: number = 0;\n private snapshotDir: string;\n\n constructor(snapshotDir?: string | SnapshotOptions) {\n this.adapter = getAdapter();\n\n // Handle both old and new constructor signatures\n if (typeof snapshotDir === 'string') {\n this.snapshotDir = snapshotDir;\n this.options = {\n updateSnapshots: false,\n snapshotDir,\n diffOptions: {},\n format: 'text'\n };\n } else {\n const options = snapshotDir || {};\n this.snapshotDir = options.snapshotDir ?? './__snapshots__';\n this.options = {\n updateSnapshots: options.updateSnapshots ?? false,\n snapshotDir: this.snapshotDir,\n diffOptions: options.diffOptions ?? {},\n format: options.format ?? 'text'\n };\n }\n }\n\n /**\n * Configure the snapshot manager\n */\n configure(options: Partial<SnapshotOptions> & {\n stripAnsi?: boolean;\n trim?: boolean;\n }): void {\n if (options.updateSnapshots !== undefined) {\n this.options.updateSnapshots = options.updateSnapshots;\n }\n if (options.snapshotDir !== undefined) {\n this.options.snapshotDir = options.snapshotDir;\n this.snapshotDir = options.snapshotDir;\n }\n if (options.diffOptions !== undefined) {\n this.options.diffOptions = options.diffOptions;\n }\n if (options.format !== undefined) {\n this.options.format = options.format;\n }\n\n // Add stripAnsi and trim to diffOptions if provided\n if (options.stripAnsi !== undefined && this.options.diffOptions) {\n this.options.diffOptions.ignoreAnsi = options.stripAnsi;\n }\n if (options.trim !== undefined && this.options.diffOptions) {\n this.options.diffOptions.ignoreWhitespace = options.trim;\n }\n }\n\n /**\n * Create a snapshot from screen capture\n */\n createSnapshot(capture: ScreenCapture, name?: string): Snapshot {\n const snapshotName = name || `snapshot-${++this.snapshotCounter}`;\n\n const snapshot: Snapshot = {\n id: this.generateSnapshotId(snapshotName),\n name: snapshotName,\n capture,\n metadata: {\n createdAt: Date.now(),\n format: this.options.format\n }\n };\n\n this.snapshots.set(snapshot.id, snapshot);\n return snapshot;\n }\n\n /**\n * Match a capture against a snapshot\n */\n async matchSnapshot(\n capture: ScreenCapture,\n snapshotName: string,\n testPath?: string\n ): Promise<{ pass: boolean; message?: string; diff?: string }> {\n const snapshotPath = this.getSnapshotPath(snapshotName, testPath);\n\n try {\n // Try to load existing snapshot\n const existingSnapshot = await this.loadSnapshot(snapshotPath);\n\n // Compare captures\n const pass = this.compareCaptures(capture, existingSnapshot.capture);\n\n if (!pass) {\n const diff = this.generateDiff(capture, existingSnapshot.capture);\n return {\n pass: false,\n message: `Snapshot mismatch for \"${snapshotName}\"`,\n diff\n };\n }\n\n return { pass: true };\n } catch (error) {\n // Snapshot doesn't exist\n if (this.options.updateSnapshots) {\n // Create new snapshot\n const snapshot = this.createSnapshot(capture, snapshotName);\n await this.saveSnapshot(snapshot, snapshotPath);\n\n return {\n pass: true,\n message: `New snapshot created for \"${snapshotName}\"`\n };\n } else {\n return {\n pass: false,\n message: `Snapshot \"${snapshotName}\" does not exist. Run with updateSnapshots=true to create it.`\n };\n }\n }\n }\n\n /**\n * Compare two screen captures\n */\n compareCaptures(actual: ScreenCapture, expected: ScreenCapture): boolean {\n // Compare based on format\n switch (this.options.format) {\n case 'ansi':\n return compareScreens(actual.raw, expected.raw, this.options.diffOptions);\n\n case 'text':\n return compareScreens(actual.text, expected.text, this.options.diffOptions);\n\n case 'json':\n default:\n // Compare normalized text for JSON format\n {\n const actualNorm = normalizeText(actual.text, this.options.diffOptions);\n const expectedNorm = normalizeText(expected.text, this.options.diffOptions);\n return actualNorm === expectedNorm;\n }\n }\n }\n\n /**\n * Generate diff between captures\n */\n generateDiff(actual: ScreenCapture, expected: ScreenCapture): string {\n const actualText = this.options.format === 'ansi' ? actual.raw : actual.text;\n const expectedText = this.options.format === 'ansi' ? expected.raw : expected.text;\n\n return screenDiff(actualText, expectedText);\n }\n\n /**\n * Save snapshot to file\n */\n async saveSnapshot(snapshot: Snapshot, path?: string): Promise<void> {\n const snapshotPath = path || this.getSnapshotPath(snapshot.name);\n\n // Ensure directory exists\n const dir = snapshotPath.substring(0, snapshotPath.lastIndexOf('/'));\n await this.adapter.mkdir(dir, { recursive: true });\n\n // Prepare snapshot data based on format\n let content: string;\n\n switch (this.options.format) {\n case 'text':\n content = snapshot.capture.text;\n break;\n\n case 'ansi':\n content = snapshot.capture.raw;\n break;\n\n case 'json':\n default:\n content = JSON.stringify(snapshot, null, 2);\n break;\n }\n\n await this.adapter.writeFile(snapshotPath, content);\n }\n\n /**\n * Load snapshot from file\n */\n async loadSnapshot(path: string): Promise<Snapshot> {\n const content = await this.adapter.readFile(path);\n\n let snapshot: Snapshot;\n\n switch (this.options.format) {\n case 'text':\n case 'ansi':\n // Reconstruct snapshot from text/ansi content\n const lines = content.split('\\n');\n snapshot = {\n id: path,\n name: path.substring(path.lastIndexOf('/') + 1),\n capture: {\n raw: this.options.format === 'ansi' ? content : '',\n text: this.options.format === 'text' ? content : '',\n lines,\n timestamp: 0,\n size: { cols: 0, rows: lines.length }\n }\n };\n break;\n\n case 'json':\n default:\n snapshot = JSON.parse(content);\n break;\n }\n\n this.snapshots.set(snapshot.id, snapshot);\n return snapshot;\n }\n\n /**\n * Update existing snapshot\n */\n async updateSnapshot(snapshotName: string, capture: ScreenCapture, testPath?: string): Promise<void> {\n const snapshot = this.createSnapshot(capture, snapshotName);\n const snapshotPath = this.getSnapshotPath(snapshotName, testPath);\n await this.saveSnapshot(snapshot, snapshotPath);\n }\n\n /**\n * Remove snapshot\n */\n async removeSnapshot(snapshotName: string, testPath?: string): Promise<void> {\n const snapshotPath = this.getSnapshotPath(snapshotName, testPath);\n\n // Remove from memory\n const snapshot = Array.from(this.snapshots.values())\n .find(s => s.name === snapshotName);\n\n if (snapshot) {\n this.snapshots.delete(snapshot.id);\n }\n\n // Remove file if exists\n if (await this.adapter.exists(snapshotPath)) {\n await this.adapter.exec(`rm \"${snapshotPath}\"`);\n }\n }\n\n /**\n * List all snapshots\n */\n async listSnapshots(): Promise<string[]> {\n const extension = this.getFileExtension();\n const result = await this.adapter.exec(\n `find \"${this.options.snapshotDir}\" -name \"*${extension}\" 2>/dev/null || true`\n );\n\n return result.stdout\n .split('\\n')\n .filter(line => line.trim())\n .map(path => path.substring(path.lastIndexOf('/') + 1));\n }\n\n /**\n * Clear all snapshots\n */\n async clearSnapshots(): Promise<void> {\n this.snapshots.clear();\n\n if (await this.adapter.exists(this.options.snapshotDir)) {\n await this.adapter.exec(`rm -rf \"${this.options.snapshotDir}\"`);\n }\n }\n\n /**\n * Get snapshot by name\n */\n getSnapshot(name: string): Snapshot | undefined {\n return Array.from(this.snapshots.values())\n .find(s => s.name === name);\n }\n\n /**\n * Check if snapshot exists\n */\n async snapshotExists(snapshotName: string, testPath?: string): Promise<boolean> {\n const snapshotPath = this.getSnapshotPath(snapshotName, testPath);\n return this.adapter.exists(snapshotPath);\n }\n\n // Simple API methods for backward compatibility\n\n /**\n * Save a simple text snapshot\n */\n async save(name: string, content: string): Promise<void> {\n const sanitizedName = this.sanitizeName(name);\n const filePath = `${this.snapshotDir}/${sanitizedName}.snap`;\n\n // Ensure directory exists\n await this.adapter.mkdir(this.snapshotDir, { recursive: true });\n await this.adapter.writeFile(filePath, content);\n }\n\n /**\n * Load a simple text snapshot\n */\n async load(name: string): Promise<string | null> {\n try {\n const sanitizedName = this.sanitizeName(name);\n const filePath = `${this.snapshotDir}/${sanitizedName}.snap`;\n return await this.adapter.readFile(filePath);\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Compare two snapshots\n */\n async compare(name1: string, name2: string): Promise<{\n identical: boolean;\n differences: Array<{ line: number; expected?: string; actual?: string }>;\n error?: string;\n }> {\n const content1 = await this.load(name1);\n const content2 = await this.load(name2);\n\n if (content1 === null || content2 === null) {\n return {\n identical: false,\n differences: [],\n error: `Snapshot does not exist: ${content1 === null ? name1 : name2}`\n };\n }\n\n const lines1 = content1.split('\\n');\n const lines2 = content2.split('\\n');\n const differences: Array<{ line: number; expected?: string; actual?: string }> = [];\n const maxLines = Math.max(lines1.length, lines2.length);\n\n for (let i = 0; i < maxLines; i++) {\n const line1 = lines1[i];\n const line2 = lines2[i];\n\n if (line1 !== line2) {\n differences.push({\n line: i + 1,\n expected: line1,\n actual: line2\n });\n }\n }\n\n return {\n identical: differences.length === 0,\n differences\n };\n }\n\n /**\n * Compare with options\n */\n async compareWithOptions(name1: string, name2: string, options: {\n ignoreWhitespace?: boolean;\n ignoreAnsi?: boolean;\n }): Promise<{ identical: boolean; match?: boolean; diff?: string }> {\n const content1 = await this.load(name1);\n const content2 = await this.load(name2);\n\n if (content1 === null || content2 === null) {\n return { identical: false, match: false, diff: `Snapshot does not exist: ${content1 === null ? name1 : name2}` };\n }\n\n let normalized1 = content1;\n let normalized2 = content2;\n\n if (options.ignoreWhitespace) {\n normalized1 = normalized1.replace(/\\s+/g, ' ').trim();\n normalized2 = normalized2.replace(/\\s+/g, ' ').trim();\n }\n\n if (options.ignoreAnsi) {\n // Remove ANSI escape codes\n const ansiRegex = /\\x1b\\[[0-9;]*m/g;\n normalized1 = normalized1.replace(ansiRegex, '');\n normalized2 = normalized2.replace(ansiRegex, '');\n }\n\n const match = normalized1 === normalized2;\n\n if (!match) {\n const diff = this.createDiff(normalized2, normalized1);\n return { identical: false, match: false, diff };\n }\n\n return { identical: true, match: true };\n }\n\n /**\n * Delete a snapshot\n */\n async delete(name: string): Promise<boolean> {\n try {\n const sanitizedName = this.sanitizeName(name);\n const filePath = `${this.snapshotDir}/${sanitizedName}.snap`;\n\n if (await this.adapter.exists(filePath)) {\n await this.adapter.exec(`rm \"${filePath}\"`);\n return true;\n }\n return false;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Delete all snapshots\n */\n async deleteAll(): Promise<void> {\n try {\n if (await this.adapter.exists(this.snapshotDir)) {\n await this.adapter.exec(`rm -rf \"${this.snapshotDir}\"`);\n // Recreate the directory to ensure list() works\n await this.adapter.mkdir(this.snapshotDir, { recursive: true });\n }\n } catch (error) {\n // Ignore errors\n }\n }\n\n /**\n * List all snapshot names\n */\n async list(pattern?: string): Promise<string[]> {\n try {\n // Check if directory exists first\n if (!await this.adapter.exists(this.snapshotDir)) {\n return [];\n }\n\n const result = await this.adapter.exec(\n `find \"${this.snapshotDir}\" -name \"*.snap\" 2>/dev/null || true`\n );\n\n const files = result.stdout\n .split('\\n')\n .filter(line => line.trim() && line.endsWith('.snap'))\n .map(path => {\n const filename = path.substring(path.lastIndexOf('/') + 1);\n return filename.replace('.snap', '');\n });\n\n if (pattern) {\n const regex = new RegExp(pattern);\n return files.filter(name => regex.test(name));\n }\n\n return files;\n } catch (error) {\n return [];\n }\n }\n\n /**\n * List by pattern (alias for list with pattern)\n */\n async listByPattern(pattern: string): Promise<string[]> {\n return this.list(pattern);\n }\n\n /**\n * Check if update is needed\n */\n async needsUpdate(name: string, content: string): Promise<boolean> {\n const existing = await this.load(name);\n\n if (existing === null) {\n return true; // Snapshot doesn't exist, needs creation\n }\n\n return existing !== content;\n }\n\n /**\n * Save with metadata\n */\n async saveWithMetadata(name: string, content: string, metadata?: any): Promise<void> {\n const data = JSON.stringify({\n content,\n metadata: {\n ...metadata,\n timestamp: Date.now()\n }\n }, null, 2);\n\n const sanitizedName = this.sanitizeName(name);\n const filePath = `${this.snapshotDir}/${sanitizedName}.snap`;\n\n await this.adapter.mkdir(this.snapshotDir, { recursive: true });\n await this.adapter.writeFile(filePath, data);\n }\n\n /**\n * Load with metadata\n */\n async loadWithMetadata(name: string): Promise<{ content: string; metadata?: any } | null> {\n try {\n const sanitizedName = this.sanitizeName(name);\n const filePath = `${this.snapshotDir}/${sanitizedName}.snap`;\n const data = await this.adapter.readFile(filePath);\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.content !== undefined) {\n return parsed;\n }\n // Plain text snapshot\n return { content: data };\n } catch {\n // Not JSON, treat as plain text\n return { content: data };\n }\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Format snapshot for display\n */\n async format(name: string): Promise<string | null> {\n const content = await this.load(name);\n if (!content) return null;\n\n const lines = content.split('\\n');\n return lines.map((line, i) => `${i + 1}: ${line}`).join('\\n');\n }\n\n /**\n * Format with options\n */\n async formatWithOptions(name: string, options: { lineNumbers?: boolean; colors?: boolean }): Promise<string | null> {\n const content = await this.load(name);\n if (!content) return null;\n\n const lines = content.split('\\n');\n\n if (options.lineNumbers) {\n return lines.map((line, i) => `${(i + 1).toString().padStart(3, ' ')} | ${line}`).join('\\n');\n }\n\n return content;\n }\n\n /**\n * Generate unified diff between two snapshots\n */\n async diff(name1: string, name2: string): Promise<string | null> {\n const content1 = await this.load(name1);\n const content2 = await this.load(name2);\n\n if (!content1 || !content2) {\n return null;\n }\n\n return this.createDiff(content1, content2);\n }\n\n /**\n * Sanitize snapshot name\n */\n private sanitizeName(name: string): string {\n // Preserve some uniqueness when sanitizing\n return name\n .replace(/\\//g, '_slash_')\n .replace(/\\.\\./g, '_dot_')\n .replace(/\\s+/g, '_space_')\n .replace(/[^a-zA-Z0-9-_]/g, '');\n }\n\n /**\n * Create a simple diff\n */\n private createDiff(expected: string, actual: string): string {\n const expectedLines = expected.split('\\n');\n const actualLines = actual.split('\\n');\n const maxLines = Math.max(expectedLines.length, actualLines.length);\n const diff: string[] = [];\n\n for (let i = 0; i < maxLines; i++) {\n const expectedLine = expectedLines[i];\n const actualLine = actualLines[i];\n\n if (expectedLine !== actualLine) {\n if (expectedLine !== undefined) {\n diff.push(`-${expectedLine}`);\n }\n if (actualLine !== undefined) {\n diff.push(`+${actualLine}`);\n }\n }\n }\n\n return diff.join('\\n');\n }\n\n // Private helper methods\n\n private generateSnapshotId(name: string): string {\n return `${name}-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;\n }\n\n private getSnapshotPath(snapshotName: string, testPath?: string): string {\n const extension = this.getFileExtension();\n\n if (testPath) {\n // Use test file path to organize snapshots\n const testDir = testPath.substring(0, testPath.lastIndexOf('/'));\n const testFile = testPath.substring(testPath.lastIndexOf('/') + 1);\n const testName = testFile.replace(/\\.(test|spec)\\.(ts|js)$/, '');\n\n return `${testDir}/__snapshots__/${testName}.${snapshotName}${extension}`;\n } else {\n return `${this.options.snapshotDir}/${snapshotName}${extension}`;\n }\n }\n\n private getFileExtension(): string {\n switch (this.options.format) {\n case 'text':\n return '.txt';\n case 'ansi':\n return '.ansi';\n case 'json':\n default:\n return '.json';\n }\n }\n}\n\n/**\n * Global snapshot manager instance\n */\nlet globalSnapshotManager: SnapshotManager | null = null;\n\n/**\n * Get or create global snapshot manager\n */\nexport function getSnapshotManager(options?: SnapshotOptions): SnapshotManager {\n if (!globalSnapshotManager) {\n globalSnapshotManager = new SnapshotManager(options);\n } else if (options) {\n // If options are provided and manager exists, configure it\n globalSnapshotManager.configure(options);\n }\n return globalSnapshotManager;\n}\n\n/**\n * Reset global snapshot manager\n */\nexport function resetSnapshotManager(): void {\n globalSnapshotManager = null;\n}","/**\n * TmuxTester - Main E2E Testing Class\n * Provides comprehensive terminal UI testing through tmux\n */\n\nimport { getAdapter } from './adapters/index.js';\nimport {\n sleep,\n waitFor,\n stripAnsi,\n screenDiff,\n splitLines,\n parseTmuxKey,\n normalizeText,\n compareScreens,\n escapeShellArg,\n parseTmuxMouse,\n generateSessionName\n} from './core/utils.js';\n\nimport type { RuntimeAdapter } from './adapters/index.js';\nimport type {\n Point,\n Snapshot,\n Recording,\n MouseEvent,\n WaitOptions,\n TesterConfig,\n TerminalSize,\n KeyModifiers,\n ScreenCapture,\n RecordedEvent,\n TerminalTester,\n AssertionOptions\n} from './core/types.js';\n\nexport class TmuxTester implements TerminalTester {\n private config: Required<TesterConfig>;\n private adapter: RuntimeAdapter;\n private sessionName: string;\n private running: boolean = false;\n private _outputBuffer: string = ''; // Store last captured output\n private recording: Recording | null = null;\n private snapshots: Map<string, Snapshot> = new Map();\n private debugMode: boolean;\n\n constructor(config: TesterConfig) {\n this.config = {\n command: config.command,\n size: config.size || { cols: 80, rows: 24 },\n env: config.env || {},\n cwd: config.cwd || process.cwd(),\n shell: config.shell || 'sh',\n sessionName: config.sessionName || generateSessionName(),\n debug: config.debug || false,\n recordingEnabled: config.recordingEnabled || false,\n snapshotDir: config.snapshotDir || './snapshots'\n };\n \n this.adapter = getAdapter();\n this.sessionName = this.config.sessionName;\n this.debugMode = this.config.debug;\n }\n\n /**\n * Start the tmux session and launch the application\n */\n async start(): Promise<void> {\n if (this.running) {\n throw new Error('Tester is already running');\n }\n\n // Check if tmux is available\n const tmuxAvailable = this.adapter.commandExists ? await this.adapter.commandExists('tmux') : true;\n if (!tmuxAvailable) {\n throw new Error('tmux is not installed. Please install tmux to use the terminal tester.');\n }\n\n // Kill any existing session with the same name\n if (this.adapter.tryExec) {\n await this.adapter.tryExec(`tmux kill-session -t ${this.sessionName} 2>/dev/null`);\n }\n\n // Create new tmux session\n const { cols, rows } = this.config.size;\n const envVars = Object.entries(this.config.env)\n .map(([key, value]) => `-e ${key}=${escapeShellArg(value)}`)\n .join(' ');\n\n // If command is provided but doesn't look like a shell, wrap it in bash\n const needsShell = this.config.command.length > 0 && \n !this.config.command[0].match(/^(bash|sh|zsh|fish|dash)$/);\n \n let createCmd: string;\n if (needsShell) {\n // Create session with bash and then run the command\n createCmd = `tmux new-session -d -s ${this.sessionName} -x ${cols} -y ${rows} ${envVars} -c ${escapeShellArg(this.config.cwd)} bash`;\n } else {\n // Create session with the specified shell or default\n const shell = this.config.command[0] || 'bash';\n createCmd = `tmux new-session -d -s ${this.sessionName} -x ${cols} -y ${rows} ${envVars} -c ${escapeShellArg(this.config.cwd)} ${shell}`;\n }\n \n this.debug(`Creating tmux session: ${createCmd}`);\n const result = await this.adapter.exec(createCmd);\n \n if (result.code !== 0) {\n throw new Error(`Failed to create tmux session: ${result.stderr}`);\n }\n\n // Mark as running before sending commands\n this.running = true;\n \n // If we wrapped in shell, wait for shell to be ready then send the actual command\n if (needsShell) {\n await this.sleep(1000); // Wait for bash to be ready\n const appCmd = this.config.command.join(' ');\n await this.sendCommand(appCmd);\n }\n \n // Wait for startup\n await this.sleep(500);\n \n this.debug('Tmux session started successfully');\n\n if (this.config.recordingEnabled) {\n this.startRecording();\n }\n }\n\n /**\n * Stop the tmux session\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n if (this.recording) {\n this.stopRecording();\n }\n\n const result = await this.adapter.exec(`tmux kill-session -t ${this.sessionName}`);\n if (result.code !== 0) {\n this.debug(`Warning: Failed to kill tmux session: ${result.stderr}`);\n }\n\n this.running = false;\n this.debug('Tmux session stopped');\n }\n\n /**\n * Restart the session\n */\n async restart(): Promise<void> {\n await this.stop();\n await this.start();\n }\n\n /**\n * Check if the session is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Send text to the terminal\n */\n async sendText(text: string): Promise<void> {\n this.ensureRunning();\n \n const escaped = escapeShellArg(text);\n const cmd = `tmux send-keys -t ${this.sessionName} ${escaped}`;\n \n this.debug(`Sending text: ${text}`);\n await this.adapter.exec(cmd);\n \n this.recordEvent('input', { type: 'text', text });\n await this.sleep(100);\n }\n\n /**\n * Send a key with optional modifiers\n */\n async sendKey(key: string, modifiers?: KeyModifiers): Promise<void> {\n this.ensureRunning();\n \n const tmuxKey = parseTmuxKey(key, modifiers);\n const cmd = `tmux send-keys -t ${this.sessionName} ${tmuxKey}`;\n \n this.debug(`Sending key: ${key} (tmux: ${tmuxKey})`);\n await this.adapter.exec(cmd);\n \n this.recordEvent('key', { key, modifiers });\n await this.sleep(100);\n }\n\n /**\n * Send multiple keys\n */\n async sendKeys(keys: string[]): Promise<void> {\n for (const key of keys) {\n await this.sendKey(key);\n }\n }\n\n /**\n * Enable mouse support in the terminal\n */\n async enableMouse(): Promise<void> {\n this.ensureRunning();\n await this.adapter.exec(`tmux set -t ${this.sessionName} mouse on`);\n this.debug('Mouse support enabled');\n }\n\n /**\n * Disable mouse support in the terminal\n */\n async disableMouse(): Promise<void> {\n this.ensureRunning();\n await this.adapter.exec(`tmux set -t ${this.sessionName} mouse off`);\n this.debug('Mouse support disabled');\n }\n\n /**\n * Click at specific position\n */\n async click(x: number, y: number): Promise<void> {\n await this.sendMouse({\n type: 'click',\n position: { x, y },\n button: 'left'\n });\n }\n\n /**\n * Click on text in the terminal\n */\n async clickText(text: string): Promise<void> {\n const capture = await this.captureScreen();\n const lines = capture.lines;\n \n for (let y = 0; y < lines.length; y++) {\n const x = lines[y].indexOf(text);\n if (x !== -1) {\n await this.click(x, y);\n return;\n }\n }\n \n throw new Error(`Text \"${text}\" not found on screen`);\n }\n\n /**\n * Double click at specific position\n */\n async doubleClick(x: number, y: number): Promise<void> {\n await this.click(x, y);\n await this.sleep(50);\n await this.click(x, y);\n }\n\n /**\n * Right click at specific position\n */\n async rightClick(x: number, y: number): Promise<void> {\n await this.sendMouse({\n type: 'click',\n position: { x, y },\n button: 'right'\n });\n }\n\n /**\n * Drag from one position to another\n */\n async drag(from: Point, to: Point): Promise<void> {\n // Send mouse down at start position\n await this.sendMouse({\n type: 'click',\n position: from,\n button: 'left'\n });\n \n // Move to end position\n await this.sendMouse({\n type: 'move',\n position: to,\n button: 'left'\n });\n \n // Release at end position\n await this.sendMouse({\n type: 'click',\n position: to,\n button: 'left'\n });\n }\n\n /**\n * Scroll up or down\n */\n async scroll(direction: 'up' | 'down', lines: number = 1): Promise<void> {\n const currentPos = await this.getCursor();\n \n for (let i = 0; i < lines; i++) {\n await this.sendMouse({\n type: 'scroll',\n position: currentPos,\n button: direction\n });\n await this.sleep(50);\n }\n }\n\n /**\n * Send a mouse event\n */\n async sendMouse(event: MouseEvent): Promise<void> {\n this.ensureRunning();\n \n // Enable mouse mode if not already enabled\n await this.adapter.exec(`tmux set -t ${this.sessionName} mouse on`);\n \n let cmd: string;\n \n switch (event.type) {\n case 'click':\n // Send mouse click\n const button = (event.button === 'left' || event.button === 'middle' || event.button === 'right') \n ? event.button \n : 'left';\n const sequence = parseTmuxMouse(event.position.x, event.position.y, button);\n cmd = `tmux send-keys -t ${this.sessionName} -H ${sequence}`;\n break;\n \n case 'move':\n // Mouse movement (not all terminals support this)\n cmd = `tmux send-keys -t ${this.sessionName} -H '\\x1b[<35;${event.position.x + 1};${event.position.y + 1}M'`;\n break;\n \n case 'scroll':\n // Mouse scroll\n const scrollButton = event.button === 'up' ? 4 : 5;\n cmd = `tmux send-keys -t ${this.sessionName} -H '\\x1b[<${scrollButton};${event.position.x + 1};${event.position.y + 1}M'`;\n break;\n \n default:\n this.debug(`Unsupported mouse event type: ${event.type}`);\n return;\n }\n \n this.debug(`Sending mouse event: ${event.type} at (${event.position.x}, ${event.position.y})`);\n await this.adapter.exec(cmd);\n \n this.recordEvent('mouse', event);\n await this.sleep(100);\n }\n\n /**\n * Paste text (using bracketed paste mode)\n */\n async paste(text: string): Promise<void> {\n this.ensureRunning();\n \n // Send bracketed paste sequences\n await this.adapter.exec(`tmux send-keys -t ${this.sessionName} '\\x1b[200~'`);\n await this.sendText(text);\n await this.adapter.exec(`tmux send-keys -t ${this.sessionName} '\\x1b[201~'`);\n \n this.recordEvent('input', { type: 'paste', text });\n }\n\n /**\n * Type text with optional delay between characters\n */\n async typeText(text: string, delayMs: number = 50): Promise<void> {\n for (const char of text) {\n await this.sendText(char);\n await this.sleep(delayMs);\n }\n }\n\n /**\n * Capture the current screen\n */\n async captureScreen(): Promise<ScreenCapture> {\n this.ensureRunning();\n \n const result = await this.adapter.exec(`tmux capture-pane -t ${this.sessionName} -p -e`);\n \n if (result.code !== 0) {\n throw new Error(`Failed to capture screen: ${result.stderr}`);\n }\n \n const raw = result.stdout;\n const text = stripAnsi(raw);\n const lines = splitLines(text);\n \n const capture: ScreenCapture = {\n raw,\n text,\n lines,\n timestamp: Date.now(),\n size: this.config.size\n };\n \n this._outputBuffer = raw;\n \n if (this.recording) {\n this.recording.captures.push(capture);\n }\n \n return capture;\n }\n\n /**\n * Get screen text without ANSI codes\n */\n async getScreenText(): Promise<string> {\n const capture = await this.captureScreen();\n return capture.text;\n }\n\n /**\n * Get screen lines without ANSI codes\n */\n async getScreenLines(): Promise<string[]> {\n const capture = await this.captureScreen();\n return capture.lines;\n }\n\n /**\n * Get screen content (alias for getScreenText for backward compatibility)\n */\n async getScreenContent(): Promise<string> {\n return this.getScreenText();\n }\n\n /**\n * Get screen content with options\n */\n async getScreen(options?: { stripAnsi?: boolean }): Promise<string> {\n if (options?.stripAnsi) {\n return this.getScreenText();\n }\n const capture = await this.captureScreen();\n return capture.raw;\n }\n\n /**\n * Get screen lines (alias for getScreenLines)\n */\n async getLines(): Promise<string[]> {\n return this.getScreenLines();\n }\n\n /**\n * Wait for text to appear on screen\n */\n async waitForText(text: string, options?: WaitOptions): Promise<void> {\n await waitFor(\n async () => {\n const screenText = await this.getScreenText();\n return screenText.includes(text) ? true : undefined;\n },\n {\n timeout: options?.timeout ?? 5000,\n interval: options?.interval ?? 100,\n message: options?.message ?? `Text \"${text}\" not found`\n }\n );\n }\n\n /**\n * Wait for condition to be true\n */\n async waitFor(predicate: (screen: string) => boolean | Promise<boolean>, options?: WaitOptions): Promise<void> {\n await waitFor(\n async () => {\n const screenText = await this.getScreenText();\n const result = await predicate(screenText);\n return result ? true : undefined;\n },\n {\n timeout: options?.timeout ?? 5000,\n interval: options?.interval ?? 100,\n message: options?.message ?? `Condition not met`\n }\n );\n }\n\n /**\n * Wait for pattern to match screen content\n */\n async waitForPattern(pattern: RegExp, options?: WaitOptions): Promise<void> {\n await waitFor(\n async () => {\n const screenText = await this.getScreenText();\n return pattern.test(screenText) ? true : undefined;\n },\n {\n timeout: options?.timeout ?? 5000,\n interval: options?.interval ?? 100,\n message: options?.message ?? `Pattern ${pattern} not matched`\n }\n );\n }\n\n /**\n * Wait for specific line to contain text\n */\n async waitForLine(lineNumber: number, text: string, options?: WaitOptions): Promise<void> {\n await waitFor(\n async () => {\n const lines = await this.getScreenLines();\n const line = lines[lineNumber];\n return line && line.includes(text) ? true : undefined;\n },\n {\n timeout: options?.timeout ?? 5000,\n interval: options?.interval ?? 100,\n message: options?.message ?? `Line ${lineNumber} does not contain \"${text}\"`\n }\n );\n }\n\n /**\n * Assert specific line contains text\n */\n async assertLine(lineNumber: number, predicate: string | ((line: string) => boolean)): Promise<void> {\n const lines = await this.getScreenLines();\n const line = lines[lineNumber];\n \n if (!line) {\n throw new Error(`Line ${lineNumber} does not exist. Screen has ${lines.length} lines.`);\n }\n \n if (typeof predicate === 'string') {\n if (!line.includes(predicate)) {\n throw new Error(`Line ${lineNumber} does not contain \"${predicate}\". Line content: \"${line}\"`);\n }\n } else {\n if (!predicate(line)) {\n throw new Error(`Line ${lineNumber} assertion failed. Line content: \"${line}\"`);\n }\n }\n }\n\n /**\n * Assert screen matches expected content or predicate\n */\n async assertScreen(expected: string[] | string | ((screen: string) => boolean), options?: AssertionOptions): Promise<void> {\n if (typeof expected === 'function') {\n // Handle predicate function\n const screenText = await this.getScreenText();\n if (!expected(screenText)) {\n throw new Error('Screen assertion failed: predicate returned false');\n }\n return;\n }\n \n // Handle string/array comparison\n const capture = await this.captureScreen();\n const actual = options?.ignoreAnsi ? capture.text : capture.raw;\n \n const expectedText = Array.isArray(expected) ? expected.join('\\n') : expected;\n \n if (!compareScreens(actual, expectedText, options)) {\n const diff = screenDiff(actual, expectedText);\n throw new Error(`Screen assertion failed:\\n${diff}`);\n }\n }\n\n /**\n * Assert screen contains text\n */\n async assertScreenContains(text: string, options?: AssertionOptions): Promise<void> {\n const capture = await this.captureScreen();\n const screenText = normalizeText(capture.text, options);\n const searchText = normalizeText(text, options);\n \n if (!screenText.includes(searchText)) {\n throw new Error(`Screen does not contain \"${text}\"`);\n }\n }\n\n /**\n * Assert screen matches pattern\n */\n async assertScreenMatches(pattern: RegExp, options?: AssertionOptions): Promise<void> {\n const capture = await this.captureScreen();\n const screenText = normalizeText(capture.text, options);\n \n if (!pattern.test(screenText)) {\n throw new Error(`Screen does not match pattern: ${pattern}`);\n }\n }\n\n /**\n * Assert cursor is at specific position\n */\n async assertCursorAt(position: Point): Promise<void> {\n const cursor = await this.getCursor();\n \n if (cursor.x !== position.x || cursor.y !== position.y) {\n throw new Error(\n `Cursor position mismatch. Expected (${position.x}, ${position.y}), got (${cursor.x}, ${cursor.y})`\n );\n }\n }\n\n /**\n * Get current cursor position\n */\n async getCursor(): Promise<Point> {\n this.ensureRunning();\n \n // Get cursor position from tmux\n const result = await this.adapter.exec(`tmux display -t ${this.sessionName} -p '#{cursor_x},#{cursor_y}'`);\n \n if (result.code !== 0) {\n throw new Error(`Failed to get cursor position: ${result.stderr}`);\n }\n \n const [x, y] = result.stdout.trim().split(',').map(Number);\n \n return { x, y };\n }\n\n /**\n * Take a snapshot (alias for takeSnapshot for backward compatibility)\n */\n async snapshot(name: string, options?: { \n stripAnsi?: boolean;\n trim?: boolean;\n compare?: (expected: string, actual: string) => boolean;\n updateSnapshot?: boolean;\n customContent?: string;\n }): Promise<void> {\n const { getSnapshotManager } = await import('./snapshot/snapshot-manager.js');\n const manager = getSnapshotManager();\n \n const capture = await this.captureScreen();\n let content = options?.customContent || (options?.stripAnsi ? capture.text : capture.raw);\n \n if (options?.trim) {\n content = content.trim();\n }\n \n // Check if snapshot exists and compare\n const existing = await manager.load(name);\n \n if (existing && !options?.updateSnapshot) {\n let matches = false;\n \n if (options?.compare) {\n matches = options.compare(existing, content);\n } else {\n matches = existing === content;\n }\n \n if (!matches) {\n const diff = screenDiff(existing, content);\n throw new Error(`Snapshot mismatch for \"${name}\":\\n${diff}`);\n }\n } else {\n // Save new or updated snapshot\n await manager.save(name, content);\n }\n }\n\n /**\n * Take a snapshot\n */\n async takeSnapshot(name?: string): Promise<Snapshot> {\n const capture = await this.captureScreen();\n const snapshotName = name || `snapshot-${Date.now()}`;\n \n const snapshot: Snapshot = {\n id: `${this.sessionName}-${snapshotName}`,\n name: snapshotName,\n capture,\n metadata: {\n sessionName: this.sessionName,\n timestamp: Date.now(),\n size: this.config.size\n }\n };\n \n this.snapshots.set(snapshot.id, snapshot);\n return snapshot;\n }\n\n /**\n * Compare current screen with snapshot\n */\n async compareSnapshot(snapshot: Snapshot | string): Promise<boolean> {\n const targetSnapshot = typeof snapshot === 'string' \n ? this.snapshots.get(snapshot) || await this.loadSnapshot(snapshot)\n : snapshot;\n \n if (!targetSnapshot) {\n throw new Error(`Snapshot not found: ${snapshot}`);\n }\n \n const currentCapture = await this.captureScreen();\n return currentCapture.raw === targetSnapshot.capture.raw;\n }\n\n /**\n * Save snapshot to file\n */\n async saveSnapshot(snapshot: Snapshot, path?: string): Promise<void> {\n const snapshotPath = path || `${this.config.snapshotDir}/${snapshot.id}.json`;\n \n // Ensure directory exists\n const dir = snapshotPath.substring(0, snapshotPath.lastIndexOf('/'));\n await this.adapter.mkdir(dir, { recursive: true });\n \n // Save snapshot\n await this.adapter.writeFile(snapshotPath, JSON.stringify(snapshot, null, 2));\n \n this.debug(`Snapshot saved to: ${snapshotPath}`);\n }\n\n /**\n * Load snapshot from file\n */\n async loadSnapshot(path: string): Promise<Snapshot> {\n const content = await this.adapter.readFile(path);\n const snapshot = JSON.parse(content) as Snapshot;\n \n this.snapshots.set(snapshot.id, snapshot);\n return snapshot;\n }\n\n /**\n * Resize the terminal\n */\n async resize(size: TerminalSize): Promise<void> {\n this.ensureRunning();\n \n const cmd = `tmux resize-window -t ${this.sessionName} -x ${size.cols} -y ${size.rows}`;\n await this.adapter.exec(cmd);\n \n this.config.size = size;\n this.recordEvent('resize', size);\n \n this.debug(`Resized to ${size.cols}x${size.rows}`);\n await this.sleep(100);\n }\n\n /**\n * Clear the screen\n */\n async clear(): Promise<void> {\n this.ensureRunning();\n await this.sendKey('l', { ctrl: true });\n }\n\n /**\n * Reset the terminal\n */\n async reset(): Promise<void> {\n this.ensureRunning();\n await this.adapter.exec(`tmux send-keys -t ${this.sessionName} 'reset' Enter`);\n await this.sleep(500);\n }\n\n /**\n * Get current terminal size\n */\n getSize(): TerminalSize {\n return { ...this.config.size };\n }\n\n /**\n * Get session name\n */\n getSessionName(): string {\n return this.sessionName;\n }\n \n /**\n * Get the last captured output (for debugging)\n */\n getLastOutput(): string {\n return this._outputBuffer;\n }\n\n /**\n * Clear the output buffer\n */\n clearOutput(): void {\n this._outputBuffer = '';\n }\n\n /**\n * Execute a tmux command directly\n * Useful for advanced tmux operations not covered by higher-level methods\n */\n async exec(command: string): Promise<{ code: number; stdout: string; stderr: string }> {\n // Allow both full tmux commands and shortcuts\n const fullCommand = command.startsWith('tmux') ? command : `tmux ${command}`;\n return this.adapter.exec(fullCommand);\n }\n\n /**\n * Capture screen with cursor position\n * Returns both screen content and cursor position\n */\n async capture(): Promise<ScreenCapture & { cursor: Point }> {\n const screen = await this.captureScreen();\n const cursor = await this.getCursor();\n return {\n ...screen,\n cursor\n };\n }\n\n /**\n * Start recording session\n */\n startRecording(): void {\n if (this.recording) {\n this.debug('Recording already in progress');\n return;\n }\n \n this.recording = {\n startTime: Date.now(),\n events: [],\n captures: []\n };\n \n this.debug('Recording started');\n }\n\n /**\n * Stop recording and return the recording\n */\n stopRecording(): Recording {\n if (!this.recording) {\n throw new Error('No recording in progress');\n }\n \n const recording = this.recording;\n this.recording = null;\n \n this.debug(`Recording stopped. ${recording.events.length} events, ${recording.captures.length} captures`);\n return recording;\n }\n\n /**\n * Play back a recording\n */\n async playRecording(recording: Recording, speed: number = 1): Promise<void> {\n this.debug(`Playing recording with ${recording.events.length} events at ${speed}x speed`);\n \n const startTime = Date.now();\n \n for (const event of recording.events) {\n // Calculate when this event should be played\n const eventTime = (event.timestamp - recording.startTime) / speed;\n const currentTime = Date.now() - startTime;\n \n // Wait if needed\n if (eventTime > currentTime) {\n await this.sleep(eventTime - currentTime);\n }\n \n // Play the event\n switch (event.type) {\n case 'input':\n if (event.data.type === 'text') {\n await this.sendText(event.data.text);\n } else if (event.data.type === 'paste') {\n await this.paste(event.data.text);\n }\n break;\n \n case 'key':\n await this.sendKey(event.data.key, event.data.modifiers);\n break;\n \n case 'mouse':\n await this.sendMouse(event.data);\n break;\n \n case 'resize':\n await this.resize(event.data);\n break;\n }\n }\n \n this.debug('Recording playback complete');\n }\n\n /**\n * Sleep for specified milliseconds\n */\n async sleep(ms: number): Promise<void> {\n return sleep(ms);\n }\n\n /**\n * Debug log\n */\n debug(message: string): void {\n if (this.debugMode) {\n console.log(`[TmuxTester:${this.sessionName}] ${message}`);\n }\n }\n\n // Private helper methods\n\n private ensureRunning(): void {\n if (!this.running) {\n throw new Error('Tester is not running. Call start() first.');\n }\n }\n\n /**\n * Send a command to the terminal (public method)\n */\n async sendCommand(command: string): Promise<void> {\n this.ensureRunning();\n const escaped = escapeShellArg(command);\n const cmd = `tmux send-keys -t ${this.sessionName} ${escaped} Enter`;\n await this.adapter.exec(cmd);\n this.recordEvent('input', { type: 'command', text: command });\n await this.sleep(100);\n }\n\n private recordEvent(type: RecordedEvent['type'], data: any): void {\n if (this.recording) {\n this.recording.events.push({\n timestamp: Date.now(),\n type,\n data\n });\n }\n }\n}"]}