agenshield 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/utils/daemon.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Daemon management utilities\n *\n * Provides functions for starting, stopping, and monitoring the AgenShield daemon.\n */\n\nimport { spawn, execSync } from 'node:child_process';\nimport type { SpawnOptions } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { isSecretEnvVar } from '@agenshield/sandbox';\nimport { captureCallingUserEnv } from './sudo-env.js';\n\nconst require = createRequire(import.meta.url);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Daemon configuration\n */\nexport const DAEMON_CONFIG = {\n PID_FILE: '/var/run/agenshield/agenshield.pid',\n PORT: 5200,\n HOST: '127.0.0.1', // Use IPv4 for actual connections (avoids IPv6 issues)\n DISPLAY_HOST: 'localhost', // Use localhost for user-facing URLs\n LOG_DIR: '/var/log/agenshield',\n SOCKET_DIR: '/var/run/agenshield',\n};\n\n/**\n * Status of the daemon\n */\nexport interface DaemonStatus {\n running: boolean;\n pid?: number;\n port?: number;\n uptime?: string;\n url?: string;\n}\n\n/**\n * Get the current daemon status\n */\nexport async function getDaemonStatus(): Promise<DaemonStatus> {\n // Check via HTTP health endpoint first\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const response = await fetch(`http://${DAEMON_CONFIG.HOST}:${DAEMON_CONFIG.PORT}/api/health`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (response.ok) {\n const data = (await response.json()) as { uptime?: string };\n const pid = findDaemonPid() || findDaemonPidByPort(DAEMON_CONFIG.PORT);\n return {\n running: true,\n pid: pid ?? undefined,\n port: DAEMON_CONFIG.PORT,\n uptime: data.uptime,\n url: `http://${DAEMON_CONFIG.HOST}:${DAEMON_CONFIG.PORT}`,\n };\n }\n } catch {\n // Daemon not responding via HTTP\n }\n\n // Check PID files (home dir + legacy location)\n const pid = findDaemonPid();\n if (pid) {\n return { running: true, pid };\n }\n\n return { running: false };\n}\n\n/**\n * Find the daemon executable path\n */\nexport function findDaemonExecutable(): string | null {\n // Try npm-installed package first (works when installed via npm)\n // Resolve bin path from package.json so it works both in monorepo (dist/main.js)\n // and when published (main.js directly in package root)\n try {\n const pkgPath = require.resolve('@agenshield/daemon/package.json');\n const pkgDir = path.dirname(pkgPath);\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const binEntry = typeof pkg.bin === 'string'\n ? pkg.bin\n : pkg.bin?.['agenshield-daemon'] || './dist/main.js';\n const npmPath = path.resolve(pkgDir, binEntry);\n if (fs.existsSync(npmPath)) return npmPath;\n } catch {\n /* package not installed via npm */\n }\n\n const searchPaths = [\n // Monorepo: relative to CLI dist\n path.join(__dirname, '../../../shield-daemon/dist/main.js'),\n // System-installed location\n '/opt/agenshield/bin/agenshield-daemon',\n // Development from CWD\n path.join(process.cwd(), 'libs/shield-daemon/dist/main.js'),\n ];\n\n for (const p of searchPaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n\n return null;\n}\n\n/**\n * Find the daemon TypeScript source (for tsx fallback in dev)\n */\nexport function findDaemonSource(): string | null {\n const searchPaths = [\n path.join(__dirname, '../../../shield-daemon/src/main.ts'),\n path.join(process.cwd(), 'libs/shield-daemon/src/main.ts'),\n ];\n return searchPaths.find(p => fs.existsSync(p)) || null;\n}\n\n/**\n * Find tsx binary for running TypeScript directly\n */\nfunction findTsx(): string | null {\n const searchPaths = [\n path.join(process.cwd(), 'node_modules/.bin/tsx'),\n ];\n return searchPaths.find(p => fs.existsSync(p)) || null;\n}\n\n/**\n * Find daemon PID from known PID file locations\n */\nfunction findDaemonPid(): number | null {\n const homePidPath = path.join(os.homedir(), '.agenshield', 'daemon.pid');\n const legacyPidPath = DAEMON_CONFIG.PID_FILE;\n const pidPaths = [homePidPath, legacyPidPath];\n\n // When running as root via sudo, the daemon runs as SUDO_USER and writes\n // its PID to ~sudouser/.agenshield/daemon.pid (not /var/root/).\n const sudoUser = process.env['SUDO_USER'];\n if (sudoUser) {\n try {\n const userHome = execSync(`eval echo ~${sudoUser}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: 3000,\n }).trim();\n pidPaths.splice(1, 0, path.join(userHome, '.agenshield', 'daemon.pid'));\n } catch { /* ignore */ }\n }\n\n for (const pidPath of pidPaths) {\n try {\n if (fs.existsSync(pidPath)) {\n const pid = parseInt(fs.readFileSync(pidPath, 'utf8').trim(), 10);\n if (!isNaN(pid)) {\n process.kill(pid, 0); // throws if not running\n return pid;\n }\n }\n } catch { /* stale or inaccessible */ }\n }\n return null;\n}\n\n/**\n * Find daemon PID by checking which process is listening on the daemon port\n */\nfunction findDaemonPidByPort(port: number): number | null {\n try {\n const output = execSync(`lsof -ti :${port}`, {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 3000,\n }).trim();\n if (output) {\n const pid = parseInt(output.split('\\n')[0], 10);\n if (!isNaN(pid)) return pid;\n }\n } catch { /* lsof failed */ }\n return null;\n}\n\n/**\n * Start the daemon\n */\nexport async function startDaemon(options: { foreground?: boolean } = {}): Promise<{\n success: boolean;\n message: string;\n pid?: number;\n}> {\n // Check if already running\n const status = await getDaemonStatus();\n if (status.running) {\n return {\n success: true,\n message: 'Daemon is already running',\n pid: status.pid,\n };\n }\n\n // Find daemon executable\n let daemonPath = findDaemonExecutable();\n let runner = 'node';\n\n if (!daemonPath) {\n // Fallback: run from TypeScript source via tsx\n const source = findDaemonSource();\n const tsx = findTsx();\n if (source && tsx) {\n daemonPath = source;\n runner = tsx;\n } else {\n return {\n success: false,\n message: 'Daemon executable not found. Build first: npx nx build shield-daemon',\n };\n }\n }\n\n const env: Record<string, string | undefined> = {\n ...process.env,\n AGENSHIELD_PORT: String(DAEMON_CONFIG.PORT),\n AGENSHIELD_HOST: DAEMON_CONFIG.HOST,\n };\n\n const isUnderSudo = !!process.env['SUDO_USER'];\n\n if (isUnderSudo) {\n // Legacy path: running via \"sudo agenshield daemon start\"\n const userEnv = captureCallingUserEnv();\n if (userEnv) {\n const secretNames = Object.keys(userEnv).filter(k => userEnv[k] && isSecretEnvVar(k));\n if (secretNames.length > 0) {\n env['AGENSHIELD_USER_SECRETS'] = secretNames.join(',');\n }\n if (userEnv['PATH']) {\n env['PATH'] = userEnv['PATH'];\n }\n }\n } else {\n // User-mode: process.env already has correct PATH and secrets\n const secretNames = Object.keys(process.env).filter(\n k => process.env[k] && isSecretEnvVar(k)\n );\n if (secretNames.length > 0) {\n env['AGENSHIELD_USER_SECRETS'] = secretNames.join(',');\n }\n }\n\n // Ensure system dirs exist and are writable (daemon runs as root)\n for (const dir of [DAEMON_CONFIG.LOG_DIR, DAEMON_CONFIG.SOCKET_DIR]) {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // May already exist\n }\n }\n\n // Ensure user config dir\n const configDir = path.join(os.homedir(), '.agenshield');\n fs.mkdirSync(configDir, { recursive: true });\n\n if (options.foreground) {\n // Run in foreground (blocking)\n const spawnOpts: SpawnOptions = {\n stdio: 'inherit',\n env,\n };\n const child = spawn(runner, [daemonPath], spawnOpts);\n\n return new Promise((resolve) => {\n child.on('exit', (code) => {\n resolve({\n success: code === 0,\n message: code === 0 ? 'Daemon exited' : `Daemon exited with code ${code}`,\n });\n });\n });\n }\n\n // Run in background\n try {\n // Try launchctl first (macOS preferred)\n try {\n execSync('launchctl list com.agenshield.daemon 2>/dev/null', { stdio: 'pipe' });\n execSync('launchctl start com.agenshield.daemon');\n return {\n success: true,\n message: 'Daemon started via launchd',\n };\n } catch {\n // Not using launchd, fall back to nohup\n }\n\n let logDir = env['AGENSHIELD_LOG_DIR'] || DAEMON_CONFIG.LOG_DIR;\n let logFile = path.join(logDir, 'daemon.log');\n let logFd: number;\n try {\n logFd = fs.openSync(logFile, 'a');\n } catch {\n // File open failed — fall back to user-local log\n logDir = path.join(os.homedir(), '.agenshield', 'logs');\n fs.mkdirSync(logDir, { recursive: true });\n logFile = path.join(logDir, 'daemon.log');\n logFd = fs.openSync(logFile, 'a');\n }\n\n const bgSpawnOpts: SpawnOptions = {\n detached: true,\n stdio: ['ignore', logFd, logFd],\n env,\n };\n const child = spawn(runner, [daemonPath], bgSpawnOpts);\n\n child.unref();\n\n // Write PID file\n try {\n fs.writeFileSync(DAEMON_CONFIG.PID_FILE, String(child.pid));\n } catch {\n // May require sudo\n }\n\n // Wait a moment and verify\n await new Promise((resolve) => setTimeout(resolve, 1000));\n const newStatus = await getDaemonStatus();\n\n if (newStatus.running) {\n return {\n success: true,\n message: 'Daemon started',\n pid: child.pid,\n };\n } else {\n return {\n success: false,\n message: `Daemon failed to start. Check logs at ${logFile}`,\n };\n }\n } catch (err) {\n return {\n success: false,\n message: `Failed to start daemon: ${(err as Error).message}`,\n };\n }\n}\n\n/**\n * Stop the daemon\n */\nexport async function stopDaemon(): Promise<{\n success: boolean;\n message: string;\n}> {\n const status = await getDaemonStatus();\n\n if (!status.running) {\n return {\n success: true,\n message: 'Daemon is not running',\n };\n }\n\n // Try launchctl first\n try {\n execSync('launchctl list com.agenshield.daemon 2>/dev/null', { stdio: 'pipe' });\n execSync('launchctl stop com.agenshield.daemon');\n return {\n success: true,\n message: 'Daemon stopped via launchd',\n };\n } catch {\n // Not using launchd\n }\n\n // Try killing by PID\n if (status.pid) {\n try {\n process.kill(status.pid, 'SIGTERM');\n\n // Wait for process to exit\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Clean up PID file\n try {\n fs.unlinkSync(DAEMON_CONFIG.PID_FILE);\n } catch {\n // Ignore\n }\n\n return {\n success: true,\n message: `Daemon stopped (PID ${status.pid})`,\n };\n } catch (err) {\n return {\n success: false,\n message: `Failed to stop daemon: ${(err as Error).message}`,\n };\n }\n }\n\n // Fallback: find PID by port\n const portPid = findDaemonPidByPort(DAEMON_CONFIG.PORT);\n if (portPid) {\n try {\n process.kill(portPid, 'SIGTERM');\n await new Promise(r => setTimeout(r, 1000));\n return { success: true, message: `Daemon stopped (PID ${portPid}, via port lookup)` };\n } catch (err) {\n return { success: false, message: `Failed to stop daemon: ${(err as Error).message}` };\n }\n }\n\n return {\n success: false,\n message: 'Could not determine daemon PID. Try: pkill -f agenshield-daemon',\n };\n}\n\n/**\n * Restart the daemon\n */\nexport async function restartDaemon(): Promise<{\n success: boolean;\n message: string;\n}> {\n const stopResult = await stopDaemon();\n if (!stopResult.success && stopResult.message !== 'Daemon is not running') {\n return stopResult;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const startResult = await startDaemon({ foreground: false });\n return startResult;\n}\n"]}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/utils/daemon.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Daemon management utilities\n *\n * Provides functions for starting, stopping, and monitoring the AgenShield daemon.\n */\n\nimport { spawn, execSync } from 'node:child_process';\nimport type { SpawnOptions } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { isSecretEnvVar } from '@agenshield/sandbox';\nimport { isOpenClawInstalled, stopOpenClawServices } from '@agenshield/integrations';\nimport { captureCallingUserEnv } from './sudo-env.js';\n\nconst require = createRequire(import.meta.url);\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Daemon configuration\n */\nexport const DAEMON_CONFIG = {\n PID_FILE: '/var/run/agenshield/agenshield.pid',\n PORT: 5200,\n HOST: '127.0.0.1', // Use IPv4 for actual connections (avoids IPv6 issues)\n DISPLAY_HOST: 'localhost', // Use localhost for user-facing URLs\n LOG_DIR: '/var/log/agenshield',\n SOCKET_DIR: '/var/run/agenshield',\n};\n\n/**\n * Status of the daemon\n */\nexport interface DaemonStatus {\n running: boolean;\n pid?: number;\n port?: number;\n uptime?: string;\n url?: string;\n}\n\n/**\n * Get the current daemon status\n */\nexport async function getDaemonStatus(): Promise<DaemonStatus> {\n // Check via HTTP health endpoint first\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 2000);\n\n const response = await fetch(`http://${DAEMON_CONFIG.HOST}:${DAEMON_CONFIG.PORT}/api/health`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (response.ok) {\n const data = (await response.json()) as { uptime?: string };\n const pid = findDaemonPid() || findDaemonPidByPort(DAEMON_CONFIG.PORT);\n return {\n running: true,\n pid: pid ?? undefined,\n port: DAEMON_CONFIG.PORT,\n uptime: data.uptime,\n url: `http://${DAEMON_CONFIG.HOST}:${DAEMON_CONFIG.PORT}`,\n };\n }\n } catch {\n // Daemon not responding via HTTP\n }\n\n // Check PID files (home dir + legacy location)\n const pid = findDaemonPid();\n if (pid) {\n return { running: true, pid };\n }\n\n return { running: false };\n}\n\n/**\n * Find the daemon executable path\n */\nexport function findDaemonExecutable(): string | null {\n // Try npm-installed package first (works when installed via npm)\n // Resolve bin path from package.json so it works both in monorepo (dist/main.js)\n // and when published (main.js directly in package root)\n try {\n const pkgPath = require.resolve('@agenshield/daemon/package.json');\n const pkgDir = path.dirname(pkgPath);\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const binEntry = typeof pkg.bin === 'string'\n ? pkg.bin\n : pkg.bin?.['agenshield-daemon'] || './dist/main.js';\n const npmPath = path.resolve(pkgDir, binEntry);\n if (fs.existsSync(npmPath)) return npmPath;\n } catch {\n /* package not installed via npm */\n }\n\n const searchPaths = [\n // Monorepo: relative to CLI dist\n path.join(__dirname, '../../../shield-daemon/dist/main.js'),\n // System-installed location\n '/opt/agenshield/bin/agenshield-daemon',\n // Development from CWD\n path.join(process.cwd(), 'libs/shield-daemon/dist/main.js'),\n ];\n\n for (const p of searchPaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n\n return null;\n}\n\n/**\n * Find the daemon TypeScript source (for tsx fallback in dev)\n */\nexport function findDaemonSource(): string | null {\n const searchPaths = [\n path.join(__dirname, '../../../shield-daemon/src/main.ts'),\n path.join(process.cwd(), 'libs/shield-daemon/src/main.ts'),\n ];\n return searchPaths.find(p => fs.existsSync(p)) || null;\n}\n\n/**\n * Find tsx binary for running TypeScript directly\n */\nfunction findTsx(): string | null {\n const searchPaths = [\n path.join(process.cwd(), 'node_modules/.bin/tsx'),\n ];\n return searchPaths.find(p => fs.existsSync(p)) || null;\n}\n\n/**\n * Find daemon PID from known PID file locations\n */\nfunction findDaemonPid(): number | null {\n const homePidPath = path.join(os.homedir(), '.agenshield', 'daemon.pid');\n const legacyPidPath = DAEMON_CONFIG.PID_FILE;\n const pidPaths = [homePidPath, legacyPidPath];\n\n // When running as root via sudo, the daemon runs as SUDO_USER and writes\n // its PID to ~sudouser/.agenshield/daemon.pid (not /var/root/).\n const sudoUser = process.env['SUDO_USER'];\n if (sudoUser) {\n try {\n const userHome = execSync(`eval echo ~${sudoUser}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: 3000,\n }).trim();\n pidPaths.splice(1, 0, path.join(userHome, '.agenshield', 'daemon.pid'));\n } catch { /* ignore */ }\n }\n\n for (const pidPath of pidPaths) {\n try {\n if (fs.existsSync(pidPath)) {\n const pid = parseInt(fs.readFileSync(pidPath, 'utf8').trim(), 10);\n if (!isNaN(pid)) {\n process.kill(pid, 0); // throws if not running\n return pid;\n }\n }\n } catch { /* stale or inaccessible */ }\n }\n return null;\n}\n\n/**\n * Find daemon PID by checking which process is listening on the daemon port\n */\nfunction findDaemonPidByPort(port: number): number | null {\n try {\n const output = execSync(`lsof -ti :${port}`, {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 3000,\n }).trim();\n if (output) {\n const pid = parseInt(output.split('\\n')[0], 10);\n if (!isNaN(pid)) return pid;\n }\n } catch { /* lsof failed */ }\n return null;\n}\n\n/**\n * Start the daemon\n */\nexport async function startDaemon(options: { foreground?: boolean } = {}): Promise<{\n success: boolean;\n message: string;\n pid?: number;\n}> {\n // Check if already running\n const status = await getDaemonStatus();\n if (status.running) {\n return {\n success: true,\n message: 'Daemon is already running',\n pid: status.pid,\n };\n }\n\n // Find daemon executable\n let daemonPath = findDaemonExecutable();\n let runner = 'node';\n\n if (!daemonPath) {\n // Fallback: run from TypeScript source via tsx\n const source = findDaemonSource();\n const tsx = findTsx();\n if (source && tsx) {\n daemonPath = source;\n runner = tsx;\n } else {\n return {\n success: false,\n message: 'Daemon executable not found. Build first: npx nx build shield-daemon',\n };\n }\n }\n\n const env: Record<string, string | undefined> = {\n ...process.env,\n AGENSHIELD_PORT: String(DAEMON_CONFIG.PORT),\n AGENSHIELD_HOST: DAEMON_CONFIG.HOST,\n };\n\n const isUnderSudo = !!process.env['SUDO_USER'];\n\n if (isUnderSudo) {\n // Legacy path: running via \"sudo agenshield daemon start\"\n const userEnv = captureCallingUserEnv();\n if (userEnv) {\n const secretNames = Object.keys(userEnv).filter(k => userEnv[k] && isSecretEnvVar(k));\n if (secretNames.length > 0) {\n env['AGENSHIELD_USER_SECRETS'] = secretNames.join(',');\n }\n if (userEnv['PATH']) {\n env['PATH'] = userEnv['PATH'];\n }\n }\n } else {\n // User-mode: process.env already has correct PATH and secrets\n const secretNames = Object.keys(process.env).filter(\n k => process.env[k] && isSecretEnvVar(k)\n );\n if (secretNames.length > 0) {\n env['AGENSHIELD_USER_SECRETS'] = secretNames.join(',');\n }\n }\n\n // Ensure system dirs exist and are writable (daemon runs as root)\n for (const dir of [DAEMON_CONFIG.LOG_DIR, DAEMON_CONFIG.SOCKET_DIR]) {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // May already exist\n }\n }\n\n // Ensure user config dir\n const configDir = path.join(os.homedir(), '.agenshield');\n fs.mkdirSync(configDir, { recursive: true });\n\n if (options.foreground) {\n // Run in foreground (blocking)\n const spawnOpts: SpawnOptions = {\n stdio: 'inherit',\n env,\n };\n const child = spawn(runner, [daemonPath], spawnOpts);\n\n return new Promise((resolve) => {\n child.on('exit', (code) => {\n resolve({\n success: code === 0,\n message: code === 0 ? 'Daemon exited' : `Daemon exited with code ${code}`,\n });\n });\n });\n }\n\n // Run in background\n try {\n // Try launchctl first (macOS preferred)\n try {\n execSync('launchctl list com.agenshield.daemon 2>/dev/null', { stdio: 'pipe' });\n execSync('launchctl start com.agenshield.daemon');\n return {\n success: true,\n message: 'Daemon started via launchd',\n };\n } catch {\n // Not using launchd, fall back to nohup\n }\n\n let logDir = env['AGENSHIELD_LOG_DIR'] || DAEMON_CONFIG.LOG_DIR;\n let logFile = path.join(logDir, 'daemon.log');\n let logFd: number;\n try {\n logFd = fs.openSync(logFile, 'a');\n } catch {\n // File open failed — fall back to user-local log\n logDir = path.join(os.homedir(), '.agenshield', 'logs');\n fs.mkdirSync(logDir, { recursive: true });\n logFile = path.join(logDir, 'daemon.log');\n logFd = fs.openSync(logFile, 'a');\n }\n\n const bgSpawnOpts: SpawnOptions = {\n detached: true,\n stdio: ['ignore', logFd, logFd],\n env,\n };\n const child = spawn(runner, [daemonPath], bgSpawnOpts);\n\n child.unref();\n\n // Write PID file\n try {\n fs.writeFileSync(DAEMON_CONFIG.PID_FILE, String(child.pid));\n } catch {\n // May require sudo\n }\n\n // Wait a moment and verify\n await new Promise((resolve) => setTimeout(resolve, 1000));\n const newStatus = await getDaemonStatus();\n\n if (newStatus.running) {\n return {\n success: true,\n message: 'Daemon started',\n pid: child.pid,\n };\n } else {\n return {\n success: false,\n message: `Daemon failed to start. Check logs at ${logFile}`,\n };\n }\n } catch (err) {\n return {\n success: false,\n message: `Failed to start daemon: ${(err as Error).message}`,\n };\n }\n}\n\n/**\n * Stop the daemon\n */\nexport async function stopDaemon(): Promise<{\n success: boolean;\n message: string;\n}> {\n // Stop OpenClaw services first (they depend on broker)\n try {\n if (await isOpenClawInstalled()) {\n await stopOpenClawServices();\n }\n } catch {\n // Best effort\n }\n\n const status = await getDaemonStatus();\n\n if (!status.running) {\n return {\n success: true,\n message: 'Daemon is not running',\n };\n }\n\n // Try launchctl first\n try {\n execSync('launchctl list com.agenshield.daemon 2>/dev/null', { stdio: 'pipe' });\n execSync('launchctl stop com.agenshield.daemon');\n return {\n success: true,\n message: 'Daemon stopped via launchd',\n };\n } catch {\n // Not using launchd\n }\n\n // Try killing by PID\n if (status.pid) {\n try {\n process.kill(status.pid, 'SIGTERM');\n\n // Wait for process to exit\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Clean up PID file\n try {\n fs.unlinkSync(DAEMON_CONFIG.PID_FILE);\n } catch {\n // Ignore\n }\n\n return {\n success: true,\n message: `Daemon stopped (PID ${status.pid})`,\n };\n } catch (err) {\n return {\n success: false,\n message: `Failed to stop daemon: ${(err as Error).message}`,\n };\n }\n }\n\n // Fallback: find PID by port\n const portPid = findDaemonPidByPort(DAEMON_CONFIG.PORT);\n if (portPid) {\n try {\n process.kill(portPid, 'SIGTERM');\n await new Promise(r => setTimeout(r, 1000));\n return { success: true, message: `Daemon stopped (PID ${portPid}, via port lookup)` };\n } catch (err) {\n return { success: false, message: `Failed to stop daemon: ${(err as Error).message}` };\n }\n }\n\n return {\n success: false,\n message: 'Could not determine daemon PID. Try: pkill -f agenshield-daemon',\n };\n}\n\n/**\n * Restart the daemon\n */\nexport async function restartDaemon(): Promise<{\n success: boolean;\n message: string;\n}> {\n const stopResult = await stopDaemon();\n if (!stopResult.success && stopResult.message !== 'Daemon is not running') {\n return stopResult;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const startResult = await startDaemon({ foreground: false });\n return startResult;\n}\n"]}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Wizard engine - orchestrates the setup steps
3
3
  */
4
- import type { WizardState, WizardContext, WizardOptions } from './types.js';
4
+ import type { WizardState, WizardContext, WizardStepId, WizardOptions } from './types.js';
5
5
  export type StepExecutor = (context: WizardContext) => Promise<{
6
6
  success: boolean;
7
7
  error?: string;
8
8
  }>;
9
+ export declare function setEngineLogCallback(cb: ((message: string, stepId?: WizardStepId) => void) | undefined): void;
9
10
  export interface WizardEngine {
10
11
  state: WizardState;
11
12
  context: WizardContext;
@@ -17,8 +18,10 @@ export interface WizardEngine {
17
18
  success: boolean;
18
19
  error?: string;
19
20
  }>;
20
- /** Run setup phase (confirm through verify, excludes passcode and complete) */
21
+ /** Run setup phase (confirm through scan-source, stops for user selection) */
21
22
  runSetupPhase(): Promise<void>;
23
+ /** Run migration phase (select-items + migrate + verify) - called after user makes selection */
24
+ runMigrationPhase(): Promise<void>;
22
25
  /** Run final phase (setup-passcode and complete) - called after passcode UI */
23
26
  runFinalPhase(): Promise<void>;
24
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EAEb,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAYrG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,kCAAkC;IAClC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,oEAAoE;IACpE,iBAAiB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,+EAA+E;IAC/E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,+EAA+E;IAC/E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAo/BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAgFxE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuDH,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AASrG,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAE7G;AAeD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,kCAAkC;IAClC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,oEAAoE;IACpE,iBAAiB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,8EAA8E;IAC9E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,gGAAgG;IAChG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,+EAA+E;IAC/E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AA08CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CA+FxE"}