agenshield 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenshield",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "type": "module",
5
5
  "description": "AgenShield - CLI for managing AI agent security sandbox",
6
6
  "main": "./src/index.js",
@@ -37,14 +37,14 @@
37
37
  "sandbox"
38
38
  ],
39
39
  "dependencies": {
40
- "@agenshield/broker": "0.7.0",
41
- "@agenshield/daemon": "0.7.0",
42
- "@agenshield/integrations": "0.7.0",
43
- "@agenshield/interceptor": "0.7.0",
44
- "@agenshield/ipc": "0.7.0",
45
- "@agenshield/patcher": "0.7.0",
46
- "@agenshield/sandbox": "0.7.0",
47
- "@agenshield/skills": "0.7.0",
40
+ "@agenshield/broker": "0.7.2",
41
+ "@agenshield/daemon": "0.7.2",
42
+ "@agenshield/integrations": "0.7.2",
43
+ "@agenshield/interceptor": "0.7.2",
44
+ "@agenshield/ipc": "0.7.2",
45
+ "@agenshield/patcher": "0.7.2",
46
+ "@agenshield/sandbox": "0.7.2",
47
+ "@agenshield/skills": "0.7.2",
48
48
  "commander": "^14.0.0",
49
49
  "ink": "^5.2.0",
50
50
  "ink-spinner": "^5.0.0",
@@ -1 +1 @@
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"}
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;AAg+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CA+FxE"}
@@ -997,18 +997,34 @@ SHIELD_EOF`, { encoding: 'utf-8', stdio: 'pipe' });
997
997
  }
998
998
  try {
999
999
  const { execSync } = await import('node:child_process');
1000
- const sudoersContent = [
1001
- '# AgenShield: allow broker to run openclaw commands as agent user',
1002
- `${brokerUsername} ALL=(${agentUsername}) NOPASSWD: /opt/agenshield/bin/openclaw-launcher.sh *`,
1003
- `${brokerUsername} ALL=(${agentUsername}) NOPASSWD: /usr/bin/tee ${agentHome}/.openclaw/*`,
1004
- '',
1005
- '# AgenShield: allow broker to manage openclaw gateway LaunchDaemon',
1006
- `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl kickstart system/com.agenshield.openclaw.gateway`,
1007
- `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl kickstart -k system/com.agenshield.openclaw.gateway`,
1008
- `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl kill SIGTERM system/com.agenshield.openclaw.gateway`,
1009
- `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl list com.agenshield.openclaw.gateway`,
1010
- '',
1011
- ].join('\n');
1000
+ // Include the original user (who ran setup) so dev-mode daemon can also use sudo
1001
+ const originalUser = getOriginalUser();
1002
+ const users = [brokerUsername];
1003
+ if (originalUser && originalUser !== brokerUsername) {
1004
+ users.push(originalUser);
1005
+ }
1006
+ const lines = [
1007
+ '# AgenShield: allow broker (and host user) to run openclaw commands as agent user',
1008
+ ];
1009
+ for (const user of users) {
1010
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /opt/agenshield/bin/openclaw-launcher.sh *`);
1011
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/cat ${agentHome}/.openclaw/*`);
1012
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /usr/bin/tee ${agentHome}/.openclaw/*`);
1013
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/mkdir -p ${agentHome}/.openclaw/*`);
1014
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /usr/bin/tee ${agentHome}/bin/*`);
1015
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/mkdir -p ${agentHome}/bin`);
1016
+ lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/bash --norc --noprofile -c *`);
1017
+ }
1018
+ lines.push('');
1019
+ lines.push('# AgenShield: allow broker (and host user) to manage openclaw gateway LaunchDaemon');
1020
+ for (const user of users) {
1021
+ lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl kickstart system/com.agenshield.openclaw.gateway`);
1022
+ lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl kickstart -k system/com.agenshield.openclaw.gateway`);
1023
+ lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl kill SIGTERM system/com.agenshield.openclaw.gateway`);
1024
+ lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl list com.agenshield.openclaw.gateway`);
1025
+ }
1026
+ lines.push('');
1027
+ const sudoersContent = lines.join('\n');
1012
1028
  const tmpPath = '/tmp/agenshield-sudoers';
1013
1029
  // 1. Write to temp file
1014
1030
  logVerbose('Writing sudoers rules to temp file', context);
@@ -1025,7 +1041,7 @@ SHIELD_EOF`, { encoding: 'utf-8', stdio: 'pipe' });
1025
1041
  execSync(`sudo mv "${tmpPath}" /etc/sudoers.d/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });
1026
1042
  // 4. Set permissions (440 is required for sudoers files)
1027
1043
  execSync('sudo chmod 440 /etc/sudoers.d/agenshield', { encoding: 'utf-8', stdio: 'pipe' });
1028
- logVerbose(`Sudoers rule installed: ${brokerUsername} → ${agentUsername} + root (launchctl)`, context);
1044
+ logVerbose(`Sudoers rule installed: ${users.join(', ')} → ${agentUsername} + root (launchctl)`, context);
1029
1045
  return { success: true };
1030
1046
  }
1031
1047
  catch (err) {
@@ -1276,6 +1292,9 @@ async function runSteps(state, context, stepIds, onStateChange) {
1276
1292
  _currentStepId = stepId;
1277
1293
  logVerbose(`▶ Starting step: ${step.name} (${step.id})`, context);
1278
1294
  onStateChange?.(state);
1295
+ // Yield a macrotask tick so the SSE 'running' event flushes to the browser
1296
+ // before the step executor (which may use execSync) blocks the event loop.
1297
+ await new Promise(resolve => setTimeout(resolve, 0));
1279
1298
  // Execute the step
1280
1299
  const executor = stepExecutors[stepId];
1281
1300
  if (!executor) {
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wizard engine - orchestrates the setup steps\n */\n\nimport * as os from 'node:os';\nimport * as crypto from 'node:crypto';\nimport {\n checkPrerequisites,\n createUserConfig,\n createGroups,\n createAgentUser,\n createBrokerUser,\n createAllDirectories,\n setupSocketDirectory,\n verifyUsersAndGroups,\n verifyDirectories,\n generateAgentProfile,\n installSeatbeltProfiles,\n installAllWrappers,\n installPresetBinaries,\n generateBrokerPlist,\n installLaunchDaemon,\n fixSocketPermissions,\n createPathsConfig,\n deployInterceptor,\n copyNodeBinary,\n copyBrokerBinary,\n copyShieldClient,\n installGuardedShell,\n // NVM (existing)\n installAgentNvm,\n patchNvmNode,\n // Preset system\n getPreset,\n autoDetectPreset,\n type MigrationContext,\n type MigrationDirectories,\n} from '@agenshield/sandbox';\nimport {\n // Homebrew\n installAgentHomebrew,\n isAgentHomebrewInstalled,\n // OpenClaw install + config + lifecycle\n detectHostOpenClawVersion,\n installAgentOpenClaw,\n copyOpenClawConfig,\n stopHostOpenClaw,\n getOriginalUser,\n getHostOpenClawConfigPath,\n onboardAgentOpenClaw,\n // OpenClaw LaunchDaemons\n installOpenClawLaunchDaemons,\n startOpenClawServices,\n OPENCLAW_DAEMON_PLIST,\n OPENCLAW_GATEWAY_PLIST,\n} from '@agenshield/integrations';\nimport type { OriginalInstallation, MigratedPaths, SandboxUserInfo, UserConfig, PasscodeData } from '@agenshield/ipc';\nimport type {\n WizardStep,\n WizardState,\n WizardContext,\n WizardStepId,\n WizardOptions,\n} from './types.js';\nimport { createWizardSteps, getStepsByPhase, getAllStepIds } from './types.js';\n\nexport type StepExecutor = (context: WizardContext) => Promise<{ success: boolean; error?: string }>;\n\n/**\n * Module-level log callback — allows the setup server to receive verbose\n * messages and broadcast them (e.g. via SSE) to the browser UI.\n */\nlet _logCallback: ((message: string, stepId?: WizardStepId) => void) | undefined;\nlet _currentStepId: WizardStepId | undefined;\n\nexport function setEngineLogCallback(cb: ((message: string, stepId?: WizardStepId) => void) | undefined): void {\n _logCallback = cb;\n}\n\n/**\n * Verbose logging helper - logs messages when verbose mode is enabled.\n * Writes to stderr (terminal) only in verbose mode, but ALWAYS calls\n * the log callback so the setup server can forward messages to the browser.\n */\nfunction logVerbose(message: string, context?: WizardContext): void {\n if (context?.options?.verbose || process.env['AGENSHIELD_VERBOSE'] === 'true') {\n process.stderr.write(`[SETUP] ${message}\\n`);\n }\n // Always broadcast to the UI regardless of verbose flag\n _logCallback?.(message, _currentStepId);\n}\n\nexport interface WizardEngine {\n state: WizardState;\n context: WizardContext;\n onStateChange?: (state: WizardState) => void;\n /** Run full wizard (all steps) */\n run(): Promise<void>;\n /** Run only detection phase (prerequisites + detect + configure) */\n runDetectionPhase(): Promise<{ success: boolean; error?: string }>;\n /** Run setup phase (confirm through scan-source, stops for user selection) */\n runSetupPhase(): Promise<void>;\n /** Run migration phase (select-items + migrate + verify) - called after user makes selection */\n runMigrationPhase(): Promise<void>;\n /** Run final phase (setup-passcode and complete) - called after passcode UI */\n runFinalPhase(): Promise<void>;\n}\n\n/**\n * Execute a step and update state\n */\nasync function executeStep(\n step: WizardStep,\n context: WizardContext,\n executor: StepExecutor\n): Promise<{ success: boolean; error?: string }> {\n try {\n return await executor(context);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Step executors\n */\nconst stepExecutors: Record<WizardStepId, StepExecutor> = {\n prerequisites: async (_context) => {\n const result = checkPrerequisites();\n if (!result.ok) {\n return {\n success: false,\n error: `Missing prerequisites: ${result.missing.join(', ')}`,\n };\n }\n return { success: true };\n },\n\n detect: async (context) => {\n const presetId = context.options?.targetPreset;\n\n // Handle custom preset - requires entry point\n if (presetId === 'custom') {\n if (!context.options?.entryPoint) {\n return {\n success: false,\n error: '--entry-point is required when using --target custom',\n };\n }\n\n const preset = getPreset('custom');\n if (!preset) {\n return { success: false, error: 'Custom preset not found' };\n }\n\n // Custom preset doesn't auto-detect, so we create a detection result\n context.preset = preset;\n context.presetDetection = {\n found: true,\n method: 'custom',\n };\n return { success: true };\n }\n\n // Handle specific preset requested\n if (presetId) {\n const preset = getPreset(presetId);\n if (!preset) {\n return { success: false, error: `Unknown preset: ${presetId}` };\n }\n\n const detection = await preset.detect();\n if (!detection?.found) {\n // Don't fail — let install-target step handle it\n // Preserve partial detection (e.g. configPath) for scan-source\n context.preset = preset;\n context.presetDetection = detection ?? { found: false };\n context.targetInstallable = true;\n return { success: true };\n }\n\n context.preset = preset;\n context.presetDetection = detection;\n return { success: true };\n }\n\n // Auto-detect preset\n const result = await autoDetectPreset();\n if (!result) {\n // No target found — mark as installable so install-target step can offer installation\n // Try to capture partial detection (e.g. configPath with skills on disk)\n const openclawPreset = getPreset('openclaw');\n if (openclawPreset) {\n context.preset = openclawPreset;\n const partialDetection = await openclawPreset.detect();\n context.presetDetection = partialDetection ?? { found: false };\n context.targetInstallable = true;\n return { success: true };\n }\n return {\n success: false,\n error: 'No supported target found. Use --target custom --entry-point <path> for custom applications.',\n };\n }\n\n context.preset = result.preset;\n context.presetDetection = result.detection;\n return { success: true };\n },\n\n 'install-target': async (context) => {\n // If detection already found a target, skip\n if (context.presetDetection?.found) {\n return { success: true };\n }\n\n // If not found and user hasn't requested install yet, mark as installable and succeed\n // (the Web UI will offer an install button)\n if (!context.installTargetRequested) {\n context.targetInstallable = true;\n return { success: true };\n }\n\n // User requested installation — skip actual install in dry-run\n if (context.options?.dryRun) {\n context.targetInstallable = false;\n context.presetDetection = { found: true, method: 'npm' };\n return { success: true };\n }\n\n // Run npm install -g openclaw (no sudo — user handles npm config)\n try {\n const { execSync } = await import('node:child_process');\n logVerbose('Running: npm install -g openclaw', context);\n const output = execSync('npm install -g openclaw', {\n encoding: 'utf-8',\n timeout: 120_000,\n stdio: 'pipe',\n });\n if (output?.trim()) {\n logVerbose(output.trim(), context);\n }\n } catch (err) {\n return {\n success: false,\n error: `Failed to install openclaw: ${(err as Error).message}`,\n };\n }\n\n // Re-run detection\n const result = await autoDetectPreset();\n if (!result) {\n return {\n success: false,\n error: 'openclaw was installed but could not be detected. Check your PATH.',\n };\n }\n\n context.preset = result.preset;\n context.presetDetection = result.detection;\n context.targetInstallable = false;\n return { success: true };\n },\n\n configure: async (context) => {\n // Create user configuration based on options\n const userConfig = createUserConfig({\n prefix: context.options?.prefix,\n baseUid: context.options?.baseUid,\n baseGid: context.options?.baseGid,\n baseName: context.options?.baseName,\n });\n\n context.userConfig = userConfig;\n context.pathsConfig = createPathsConfig(userConfig);\n\n return { success: true };\n },\n\n // Confirmation is handled by the UI, this step just marks it as complete\n confirm: async (_context) => {\n return { success: true };\n },\n\n // ── New setup steps ───────────────────────────────────────────────────\n\n 'cleanup-previous': async (context) => {\n logVerbose('Checking for previous installations', context);\n const { execSync } = await import('node:child_process');\n const fs = await import('node:fs');\n\n // Quick check: does the default agent user exist?\n let agentUserExists = false;\n try {\n execSync('dscl . -read /Users/ash_default_agent', { encoding: 'utf-8', stdio: 'pipe' });\n agentUserExists = true;\n } catch { /* user doesn't exist */ }\n\n if (!agentUserExists) {\n logVerbose('No previous installation detected', context);\n return { success: true };\n }\n\n logVerbose('Found previous installation (ash_default_agent exists), cleaning up', context);\n\n if (context.options?.dryRun) {\n logVerbose('[dry-run] Would remove previous installation', context);\n return { success: true };\n }\n\n // NOTE: We cannot use forceUninstall() here because it calls stopDaemon()\n // which kills the process on port 5200 — that's our own setup wizard.\n // Instead we do the cleanup steps inline, skipping the daemon kill.\n\n const sudo = (cmd: string) => {\n try {\n execSync(`sudo ${cmd}`, { encoding: 'utf-8', stdio: 'pipe' });\n return true;\n } catch { return false; }\n };\n\n // 1. Stop broker launchd service (but NOT the daemon on port 5200 — that's us)\n const brokerPlist = '/Library/LaunchDaemons/com.agenshield.broker.plist';\n if (fs.existsSync(brokerPlist)) {\n logVerbose('[cleanup] Stopping broker LaunchDaemon', context);\n sudo(`launchctl bootout system/com.agenshield.broker 2>/dev/null || true`);\n sudo(`rm -f \"${brokerPlist}\"`);\n }\n\n // 2. Remove OpenClaw LaunchDaemon plists if present\n for (const plist of [\n '/Library/LaunchDaemons/com.agenshield.openclaw.daemon.plist',\n '/Library/LaunchDaemons/com.agenshield.openclaw.gateway.plist',\n ]) {\n if (fs.existsSync(plist)) {\n const label = plist.replace('/Library/LaunchDaemons/', '').replace('.plist', '');\n logVerbose(`[cleanup] Removing ${label}`, context);\n sudo(`launchctl bootout system/${label} 2>/dev/null || true`);\n sudo(`rm -f \"${plist}\"`);\n }\n }\n\n // 3. Discover and kill processes for all ash_* users\n let sandboxUsers: string[] = [];\n try {\n const output = execSync('dscl . -list /Users', { encoding: 'utf-8' });\n sandboxUsers = output.split('\\n').filter(u => u.startsWith('ash_'));\n } catch { /* ignore */ }\n\n for (const username of sandboxUsers) {\n logVerbose(`[cleanup] Killing processes for ${username}`, context);\n sudo(`pkill -u ${username} 2>/dev/null || true`);\n }\n if (sandboxUsers.length > 0) {\n try { execSync('sleep 1', { encoding: 'utf-8' }); } catch { /* ignore */ }\n for (const username of sandboxUsers) {\n sudo(`pkill -9 -u ${username} 2>/dev/null || true`);\n }\n }\n\n // 4. Delete sandbox users (with home dirs)\n const { deleteSandboxUser } = await import('@agenshield/sandbox');\n for (const username of sandboxUsers) {\n logVerbose(`[cleanup] Deleting user ${username}`, context);\n deleteSandboxUser(username, { removeHomeDir: true });\n }\n\n // 5. Delete ash_* groups\n let ashGroups: string[] = [];\n try {\n const output = execSync('dscl . -list /Groups', { encoding: 'utf-8' });\n ashGroups = output.split('\\n').filter(g => g.startsWith('ash_'));\n } catch { /* ignore */ }\n\n for (const groupName of ashGroups) {\n logVerbose(`[cleanup] Deleting group ${groupName}`, context);\n sudo(`dscl . -delete /Groups/${groupName}`);\n }\n\n // 6. Remove guarded shell from /etc/shells and disk\n const guardedShellPath = '/usr/local/bin/guarded-shell';\n if (fs.existsSync(guardedShellPath)) {\n logVerbose('[cleanup] Removing guarded shell', context);\n sudo(`sed -i '' '\\\\|${guardedShellPath}|d' /etc/shells`);\n sudo(`rm -f \"${guardedShellPath}\"`);\n }\n\n // 7. Remove sudoers drop-in\n if (fs.existsSync('/etc/sudoers.d/agenshield')) {\n logVerbose('[cleanup] Removing /etc/sudoers.d/agenshield', context);\n sudo('rm -f /etc/sudoers.d/agenshield');\n }\n\n // 8. Clean up directories\n for (const dir of ['/etc/agenshield', '/var/log/agenshield', '/var/run/agenshield', '/opt/agenshield']) {\n if (fs.existsSync(dir)) {\n logVerbose(`[cleanup] Removing ${dir}`, context);\n sudo(`rm -rf \"${dir}\"`);\n }\n }\n\n logVerbose('Previous installation cleaned up', context);\n return { success: true };\n },\n\n 'install-homebrew': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install Homebrew to ${agentUser.home}/homebrew`, context);\n context.homebrewInstalled = { brewPath: `${agentUser.home}/homebrew/bin/brew`, success: true };\n return { success: true };\n }\n\n // Skip if already installed (e.g., retry after partial failure)\n if (await isAgentHomebrewInstalled(agentUser.home)) {\n logVerbose('Homebrew already installed, skipping', context);\n context.homebrewInstalled = { brewPath: `${agentUser.home}/homebrew/bin/brew`, success: true };\n return { success: true };\n }\n\n logVerbose(`Installing user-specific Homebrew for ${agentUser.username}`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await installAgentHomebrew({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroupName,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.homebrewInstalled = { brewPath: result.brewPath, success: true };\n return { success: true };\n },\n\n 'install-nvm': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n const nodeVersion = context.options?.nodeVersion || '24';\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install NVM + Node.js v${nodeVersion} for ${agentUser.username}`, context);\n context.nvmInstalled = {\n nvmDir: `${agentUser.home}/.nvm`,\n nodeVersion: `v${nodeVersion}`,\n nodeBinaryPath: `${agentUser.home}/.nvm/versions/node/v${nodeVersion}.0.0/bin/node`,\n success: true,\n };\n return { success: true };\n }\n\n // Skip if NVM + requested Node version already installed\n const nvmDir = `${agentUser.home}/.nvm`;\n const nvmSh = `${nvmDir}/nvm.sh`;\n const fs = await import('node:fs');\n if (fs.existsSync(nvmSh)) {\n try {\n const { exec: execCb } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(execCb);\n const { stdout } = await execAsync(\n `sudo -H -u ${agentUser.username} /bin/bash --norc --noprofile -c 'source \"${nvmSh}\" && nvm which ${nodeVersion}'`,\n { cwd: '/' },\n );\n if (stdout.trim()) {\n logVerbose(`NVM + Node.js v${nodeVersion} already installed, skipping`, context);\n // Still copy node binary to ensure it's up to date\n const nodeResult = await copyNodeBinary(context.userConfig, stdout.trim());\n if (!nodeResult.success) {\n return { success: false, error: `Node binary copy failed: ${nodeResult.message}` };\n }\n // NOTE: Do NOT patch NVM node here — patching must happen after all\n // npm installs (openclaw etc.) complete. See start-openclaw step.\n context.nvmInstalled = {\n nvmDir,\n nodeVersion: `v${nodeVersion}`,\n nodeBinaryPath: stdout.trim(),\n success: true,\n };\n return { success: true };\n }\n } catch {\n // Node version not installed, proceed with full install\n }\n }\n\n logVerbose(`Installing NVM + Node.js v${nodeVersion} for ${agentUser.username}`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await installAgentNvm({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroupName,\n nodeVersion,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n // Copy NVM node binary to /opt/agenshield/bin/node-bin\n logVerbose(`Copying NVM node binary to /opt/agenshield/bin/node-bin`, context);\n const nodeResult = await copyNodeBinary(context.userConfig, result.nodeBinaryPath);\n if (!nodeResult.success) {\n return { success: false, error: `Node binary copy failed: ${nodeResult.message}` };\n }\n\n // NOTE: Do NOT patch NVM node here — patching must happen after all\n // npm installs (openclaw etc.) complete. See start-openclaw step.\n\n context.nvmInstalled = {\n nvmDir: result.nvmDir,\n nodeVersion: result.nodeVersion,\n nodeBinaryPath: result.nodeBinaryPath,\n success: true,\n };\n return { success: true };\n },\n\n 'configure-shell': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would configure guarded shell with Homebrew + NVM paths`, context);\n context.shellConfigured = { success: true };\n return { success: true };\n }\n\n logVerbose('Installing guarded shell with Homebrew and NVM paths', context);\n const result = await installGuardedShell(context.userConfig, { verbose: context.options?.verbose });\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.shellConfigured = { success: true };\n return { success: true };\n },\n\n 'install-openclaw': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Detect host version\n const hostVersion = context.presetDetection?.version || detectHostOpenClawVersion() || 'latest';\n logVerbose(`Host OpenClaw version: ${hostVersion}`, context);\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install openclaw@${hostVersion} for ${agentUser.username}`, context);\n context.openclawInstalled = {\n version: hostVersion,\n binaryPath: `${agentUser.home}/.nvm/versions/node/v24.0.0/bin/openclaw`,\n success: true,\n };\n return { success: true };\n }\n\n logVerbose(`Installing openclaw@${hostVersion} for agent user`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await installAgentOpenClaw({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroupName,\n targetVersion: hostVersion,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.openclawInstalled = {\n version: result.version,\n binaryPath: result.binaryPath,\n success: true,\n };\n return { success: true };\n },\n\n 'copy-openclaw-config': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Find host config path\n const sourceConfigPath = context.presetDetection?.configPath\n || getHostOpenClawConfigPath();\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would copy .openclaw from ${sourceConfigPath || '(not found)'} to ${agentUser.home}/.openclaw`, context);\n context.openclawConfigCopied = {\n configDir: `${agentUser.home}/.openclaw`,\n sanitized: false,\n success: true,\n };\n return { success: true };\n }\n\n if (!sourceConfigPath) {\n logVerbose('No host .openclaw config found, creating empty config', context);\n }\n\n logVerbose(`Copying OpenClaw config to agent user`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = copyOpenClawConfig({\n sourceConfigPath: sourceConfigPath || '/nonexistent',\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroup: socketGroupName,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.openclawConfigCopied = {\n configDir: result.configDir,\n sanitized: result.sanitized,\n success: true,\n };\n return { success: true };\n },\n\n 'stop-host-openclaw': async (context) => {\n const originalUser = getOriginalUser();\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would stop OpenClaw daemon + gateway for user: ${originalUser}`, context);\n context.hostOpenclawStopped = { daemonStopped: true, gatewayStopped: true };\n return { success: true };\n }\n\n logVerbose(`Stopping host OpenClaw processes for user: ${originalUser}`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await stopHostOpenClaw({\n originalUser,\n verbose: context.options?.verbose,\n onLog,\n });\n\n context.hostOpenclawStopped = {\n daemonStopped: result.daemonStopped,\n gatewayStopped: result.gatewayStopped,\n };\n\n // Non-fatal if stop fails (processes might not be running)\n return { success: true };\n },\n\n 'onboard-openclaw': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n\n if (context.options?.dryRun) {\n logVerbose('[dry-run] Would run openclaw onboard --non-interactive', context);\n context.openclawOnboarded = { success: true };\n return { success: true };\n }\n\n logVerbose('Running openclaw onboard for agent user', context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await onboardAgentOpenClaw({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n verbose: context.options?.verbose,\n onLog,\n });\n\n context.openclawOnboarded = { success: result.success };\n\n // Non-fatal — onboard may fail if openclaw doesn't support the flags\n if (!result.success) {\n logVerbose(`Onboard returned non-success (non-fatal): ${result.message}`, context);\n }\n return { success: true };\n },\n\n 'start-openclaw': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install OpenClaw LaunchDaemons (managed by broker)`, context);\n context.openclawLaunchDaemons = {\n daemonPlistPath: OPENCLAW_DAEMON_PLIST,\n gatewayPlistPath: OPENCLAW_GATEWAY_PLIST,\n loaded: false,\n };\n return { success: true };\n }\n\n // 1. Patch NVM node in-place BEFORE starting OpenClaw services.\n // All npm installs (openclaw, onboard, etc.) are done by now, so it's safe\n // to replace NVM's node with the interceptor wrapper. From this point on,\n // every `node` invocation via NVM goes through the interceptor.\n const onLog = (msg: string) => logVerbose(msg, context);\n if (context.nvmInstalled?.success && context.nvmInstalled.nodeBinaryPath) {\n logVerbose('Patching NVM node binary in-place with interceptor wrapper', context);\n const patchResult = await patchNvmNode({\n nodeBinaryPath: context.nvmInstalled.nodeBinaryPath,\n agentUsername: agentUser.username,\n socketGroupName,\n interceptorPath: '/opt/agenshield/lib/interceptor/register.cjs',\n socketPath: '/var/run/agenshield/agenshield.sock',\n httpPort: 5201,\n verbose: context.options?.verbose,\n onLog,\n });\n if (!patchResult.success) {\n return { success: false, error: `Failed to patch NVM node: ${patchResult.message}` };\n }\n }\n\n // 2. Install OpenClaw LaunchDaemons (gateway + daemon) — managed by launchd/broker\n logVerbose('Installing OpenClaw LaunchDaemons (broker-managed)', context);\n const installResult = await installOpenClawLaunchDaemons({\n agentUsername: agentUser.username,\n socketGroupName,\n agentHome: agentUser.home,\n });\n\n if (!installResult.success) {\n return { success: false, error: installResult.message };\n }\n\n logVerbose('OpenClaw LaunchDaemons installed and loaded', context);\n\n // 3. Start OpenClaw services via launchctl kickstart\n logVerbose('Starting OpenClaw services via launchctl', context);\n const startResult = await startOpenClawServices();\n\n if (!startResult.success) {\n logVerbose(`Failed to start OpenClaw services (non-fatal): ${startResult.message}`, context);\n } else {\n logVerbose('OpenClaw services started', context);\n }\n\n context.openclawLaunchDaemons = {\n daemonPlistPath: OPENCLAW_DAEMON_PLIST,\n gatewayPlistPath: OPENCLAW_GATEWAY_PLIST,\n loaded: true,\n };\n\n return { success: true };\n },\n\n 'open-dashboard': async (_context) => {\n // No-op: the browser is already on the setup wizard page which\n // transitions to CompleteStep and polls for daemon readiness.\n return { success: true };\n },\n\n 'create-groups': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create group: ${context.userConfig.groups.socket.name} (gid=${context.userConfig.groups.socket.gid})`, context);\n logVerbose(`[dry-run] Would create group: ${context.userConfig.groups.workspace.name} (gid=${context.userConfig.groups.workspace.gid})`, context);\n context.groupsCreated = {\n socket: context.userConfig.groups.socket,\n workspace: context.userConfig.groups.workspace,\n };\n return { success: true };\n }\n\n logVerbose(`Creating group: ${context.userConfig.groups.socket.name} (gid=${context.userConfig.groups.socket.gid})`, context);\n logVerbose(`Creating group: ${context.userConfig.groups.workspace.name} (gid=${context.userConfig.groups.workspace.gid})`, context);\n\n const results = await createGroups(context.userConfig, { verbose: context.options?.verbose });\n const failed = results.filter((r) => !r.success);\n\n if (failed.length > 0) {\n return {\n success: false,\n error: failed.map((r) => r.message).join('; '),\n };\n }\n\n context.groupsCreated = {\n socket: context.userConfig.groups.socket,\n workspace: context.userConfig.groups.workspace,\n };\n\n return { success: true };\n },\n\n 'create-agent-user': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create user: ${agentUser.username} (uid=${agentUser.uid}, gid=${agentUser.gid})`, context);\n logVerbose(`[dry-run] Home directory: ${agentUser.home}`, context);\n logVerbose(`[dry-run] Shell: ${agentUser.shell}`, context);\n context.agentUser = {\n username: agentUser.username,\n uid: agentUser.uid,\n gid: agentUser.gid,\n homeDir: agentUser.home,\n shell: agentUser.shell,\n };\n return { success: true };\n }\n\n logVerbose(`Creating user: ${agentUser.username} (uid=${agentUser.uid}, gid=${agentUser.gid})`, context);\n logVerbose(`Home directory: ${agentUser.home}`, context);\n logVerbose(`Shell: ${agentUser.shell}`, context);\n\n const result = await createAgentUser(context.userConfig, { verbose: context.options?.verbose });\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.agentUser = {\n username: agentUser.username,\n uid: agentUser.uid,\n gid: agentUser.gid,\n homeDir: agentUser.home,\n shell: agentUser.shell,\n };\n\n return { success: true };\n },\n\n 'create-broker-user': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { brokerUser } = context.userConfig;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create user: ${brokerUser.username} (uid=${brokerUser.uid}, gid=${brokerUser.gid})`, context);\n context.brokerUser = {\n username: brokerUser.username,\n uid: brokerUser.uid,\n gid: brokerUser.gid,\n homeDir: brokerUser.home,\n shell: brokerUser.shell,\n };\n return { success: true };\n }\n\n logVerbose(`Creating user: ${brokerUser.username} (uid=${brokerUser.uid}, gid=${brokerUser.gid})`, context);\n\n const result = await createBrokerUser(context.userConfig, { verbose: context.options?.verbose });\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.brokerUser = {\n username: brokerUser.username,\n uid: brokerUser.uid,\n gid: brokerUser.gid,\n homeDir: brokerUser.home,\n shell: brokerUser.shell,\n };\n\n return { success: true };\n },\n\n 'create-directories': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const directories = {\n binDir: `${agentUser.home}/bin`,\n wrappersDir: `${agentUser.home}/bin`,\n configDir: `${agentUser.home}/.openclaw`,\n npmDir: `${agentUser.home}/.npm`,\n socketDir: context.pathsConfig.socketDir,\n logDir: context.pathsConfig.logDir,\n seatbeltDir: context.pathsConfig.seatbeltDir,\n };\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create directory: ${directories.binDir}`, context);\n logVerbose(`[dry-run] Would create directory: ${directories.configDir}`, context);\n logVerbose(`[dry-run] Would create directory: ${directories.socketDir}`, context);\n logVerbose(`[dry-run] Would create directory: ${directories.logDir}`, context);\n context.directories = directories;\n return { success: true };\n }\n\n logVerbose(`Creating directory: ${directories.binDir}`, context);\n logVerbose(`Creating directory: ${directories.configDir}`, context);\n logVerbose(`Creating directory: ${directories.socketDir}`, context);\n logVerbose(`Creating directory: ${directories.logDir}`, context);\n logVerbose(`Creating directory: ${agentUser.home}/workspace (mode=2775, group=${context.userConfig.groups.workspace.name})`, context);\n\n const results = await createAllDirectories(context.userConfig, { verbose: context.options?.verbose });\n const failed = results.filter((r) => !r.success);\n\n if (failed.length > 0) {\n return {\n success: false,\n error: failed.map((r) => r.message).join('; '),\n };\n }\n\n context.directories = directories;\n\n return { success: true };\n },\n\n 'setup-socket': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.socketSetup = {\n path: context.pathsConfig.socketPath,\n success: true,\n };\n return { success: true };\n }\n\n const result = await setupSocketDirectory(context.userConfig);\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.socketSetup = {\n path: context.pathsConfig.socketPath,\n success: true,\n };\n\n return { success: true };\n },\n\n 'generate-seatbelt': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.seatbeltProfiles = {\n agentProfile: `${context.pathsConfig.seatbeltDir}/agent.sb`,\n operationProfiles: [],\n };\n return { success: true };\n }\n\n try {\n // Generate agent profile\n const agentProfile = generateAgentProfile({\n workspacePath: `${context.userConfig.agentUser.home}/workspace`,\n socketPath: context.pathsConfig.socketPath,\n });\n\n // Install profiles\n const result = await installSeatbeltProfiles(context.userConfig, {\n agentProfile,\n });\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n context.seatbeltProfiles = {\n agentProfile: result.agentProfilePath!,\n operationProfiles: result.operationProfilePaths || [],\n };\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to generate seatbelt profiles: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-wrappers': async (context) => {\n if (!context.userConfig || !context.agentUser || !context.directories) {\n return { success: false, error: 'Required context not set' };\n }\n\n // Determine which bins to install from preset\n const requiredBins = context.preset?.requiredBins;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install guarded shell to /usr/local/bin/guarded-shell`, context);\n logVerbose(`[dry-run] Would install ZDOTDIR files to /etc/agenshield/zdot/`, context);\n logVerbose(`[dry-run] Would install wrappers: ${(requiredBins || ['node', 'npm', 'git', 'curl', 'shieldctl']).join(', ')}`, context);\n context.wrappersInstalled = requiredBins || ['node', 'npm', 'git', 'curl', 'shieldctl'];\n return { success: true };\n }\n\n try {\n // First, install guarded shell (critical for PATH/HOME enforcement)\n logVerbose(`Installing guarded shell to /usr/local/bin/guarded-shell`, context);\n logVerbose(`Installing .zshenv to /etc/agenshield/zdot/.zshenv`, context);\n logVerbose(`Installing .zshrc to /etc/agenshield/zdot/.zshrc`, context);\n\n const guardedShellResult = await installGuardedShell(context.userConfig);\n if (!guardedShellResult.success) {\n return { success: false, error: guardedShellResult.message };\n }\n\n if (requiredBins && requiredBins.length > 0) {\n // Preset-driven installation\n logVerbose(`Installing wrappers: ${requiredBins.join(', ')}`, context);\n const result = await installPresetBinaries({\n requiredBins,\n userConfig: context.userConfig,\n binDir: context.directories.binDir,\n socketGroupName: context.userConfig.groups.socket.name,\n nodeVersion: context.options?.nodeVersion,\n verbose: context.options?.verbose,\n nvmResult: context.nvmInstalled ? {\n success: context.nvmInstalled.success,\n nvmDir: context.nvmInstalled.nvmDir,\n nodeVersion: context.nvmInstalled.nodeVersion,\n nodeBinaryPath: context.nvmInstalled.nodeBinaryPath,\n message: '',\n } : undefined,\n });\n context.wrappersInstalled = result.installedWrappers;\n if (!result.success) {\n return { success: false, error: result.errors.join('; ') };\n }\n\n // Install shield-exec binary for daemon runtime self-healing\n try {\n const { SHIELD_EXEC_CONTENT, SHIELD_EXEC_PATH } = await import('@agenshield/sandbox');\n const { execSync } = await import('node:child_process');\n execSync(`sudo tee \"${SHIELD_EXEC_PATH}\" > /dev/null << 'SHIELDEXECEOF'\\n${SHIELD_EXEC_CONTENT}\\nSHIELDEXECEOF`);\n execSync(`sudo chmod 755 \"${SHIELD_EXEC_PATH}\"`);\n execSync(`sudo chown root:wheel \"${SHIELD_EXEC_PATH}\"`);\n logVerbose(`Installed shield-exec to ${SHIELD_EXEC_PATH}`, context);\n } catch (err) {\n logVerbose(`Warning: shield-exec install failed: ${(err as Error).message}`, context);\n }\n\n return { success: true };\n }\n\n // Fallback: install all wrappers (no preset or preset has no requiredBins)\n logVerbose(`Deploying interceptor to /opt/agenshield/lib/interceptor/register.cjs`, context);\n const interceptorResult = await deployInterceptor(context.userConfig);\n if (!interceptorResult.success) {\n return { success: false, error: interceptorResult.message };\n }\n\n logVerbose(`Copying node binary to /opt/agenshield/bin/node-bin`, context);\n const nodeBinResult = await copyNodeBinary(context.userConfig);\n if (!nodeBinResult.success) {\n return { success: false, error: nodeBinResult.message };\n }\n\n logVerbose(`Installing all wrappers to ${context.directories.binDir}`, context);\n const result = await installAllWrappers(context.userConfig, context.directories);\n if (!result.success) {\n return { success: false, error: result.error };\n }\n context.wrappersInstalled = result.installed || [];\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to install wrappers: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-broker': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n const brokerPath = '/opt/agenshield/bin/agenshield-broker';\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install broker binary to ${brokerPath}`, context);\n context.brokerInstalled = {\n binaryPath: brokerPath,\n success: true,\n };\n return { success: true };\n }\n\n logVerbose(`Installing broker binary to ${brokerPath}`, context);\n\n const result = await copyBrokerBinary(context.userConfig);\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.brokerInstalled = {\n binaryPath: brokerPath,\n success: true,\n };\n\n // Also install shield-client (used by curl/git/etc. wrappers)\n logVerbose('Installing shield-client to /opt/agenshield/bin/shield-client', context);\n const clientResult = await copyShieldClient(context.userConfig);\n if (!clientResult.success) {\n logVerbose(`Warning: shield-client install failed: ${clientResult.message}`, context);\n }\n\n return { success: true };\n },\n\n 'install-daemon-config': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n const configPath = `${context.pathsConfig.configDir}/shield.json`;\n const brokerUsername = context.userConfig.brokerUser.username;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would write daemon config to ${configPath}`, context);\n context.daemonConfig = {\n configPath,\n success: true,\n };\n return { success: true };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n\n const shieldConfig = JSON.stringify({\n socketPath: context.pathsConfig.socketPath,\n socketOwner: brokerUsername,\n socketGroup: socketGroupName,\n policiesPath: '/opt/agenshield/policies',\n auditLogPath: '/var/log/agenshield/audit.log',\n agentHome: context.userConfig.agentUser.home,\n }, null, 2);\n\n logVerbose(`Writing daemon config to ${configPath}`, context);\n\n // Write config file via sudo tee\n logVerbose(`Running: sudo tee \"${configPath}\"`, context);\n execSync(`sudo tee \"${configPath}\" > /dev/null << 'SHIELD_EOF'\n${shieldConfig}\nSHIELD_EOF`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Set ownership and permissions\n logVerbose(`Running: sudo chown ${brokerUsername}:${socketGroupName} \"${configPath}\"`, context);\n execSync(`sudo chown ${brokerUsername}:${socketGroupName} \"${configPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\n logVerbose(`Running: sudo chmod 640 \"${configPath}\"`, context);\n execSync(`sudo chmod 640 \"${configPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\n\n context.daemonConfig = {\n configPath,\n success: true,\n };\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to install daemon config: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-sudoers': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const brokerUsername = context.userConfig.brokerUser.username;\n const agentUsername = context.userConfig.agentUser.username;\n const agentHome = context.userConfig.agentUser.home;\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install /etc/sudoers.d/agenshield granting ${brokerUsername} sudo for ${agentUsername} operations`, context);\n return { success: true };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n\n const sudoersContent = [\n '# AgenShield: allow broker to run openclaw commands as agent user',\n `${brokerUsername} ALL=(${agentUsername}) NOPASSWD: /opt/agenshield/bin/openclaw-launcher.sh *`,\n `${brokerUsername} ALL=(${agentUsername}) NOPASSWD: /usr/bin/tee ${agentHome}/.openclaw/*`,\n '',\n '# AgenShield: allow broker to manage openclaw gateway LaunchDaemon',\n `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl kickstart system/com.agenshield.openclaw.gateway`,\n `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl kickstart -k system/com.agenshield.openclaw.gateway`,\n `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl kill SIGTERM system/com.agenshield.openclaw.gateway`,\n `${brokerUsername} ALL=(root) NOPASSWD: /bin/launchctl list com.agenshield.openclaw.gateway`,\n '',\n ].join('\\n');\n\n const tmpPath = '/tmp/agenshield-sudoers';\n\n // 1. Write to temp file\n logVerbose('Writing sudoers rules to temp file', context);\n execSync(`sudo tee \"${tmpPath}\" > /dev/null`, {\n input: sudoersContent,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // 2. Validate with visudo\n logVerbose('Validating sudoers syntax', context);\n execSync(`sudo visudo -c -f \"${tmpPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // 3. Move to /etc/sudoers.d/\n logVerbose('Installing sudoers drop-in to /etc/sudoers.d/agenshield', context);\n execSync(`sudo mv \"${tmpPath}\" /etc/sudoers.d/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // 4. Set permissions (440 is required for sudoers files)\n execSync('sudo chmod 440 /etc/sudoers.d/agenshield', { encoding: 'utf-8', stdio: 'pipe' });\n\n logVerbose(`Sudoers rule installed: ${brokerUsername} → ${agentUsername} + root (launchctl)`, context);\n return { success: true };\n } catch (err) {\n // Clean up temp file on failure\n try {\n const { execSync } = await import('node:child_process');\n execSync('sudo rm -f /tmp/agenshield-sudoers', { stdio: 'pipe' });\n } catch { /* ignore */ }\n return {\n success: false,\n error: `Failed to install sudoers rule: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-policies': async (context) => {\n if (!context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.policiesInstalled = {\n builtinCount: 5,\n customCount: 0,\n };\n return { success: true };\n }\n\n // TODO: Implement actual policy installation\n // For now, just mark as success\n context.policiesInstalled = {\n builtinCount: 5,\n customCount: 0,\n };\n\n return { success: true };\n },\n\n 'setup-launchdaemon': async (context) => {\n if (!context.userConfig || !context.brokerInstalled) {\n return { success: false, error: 'Required context not set' };\n }\n\n const plistPath = '/Library/LaunchDaemons/com.agenshield.broker.plist';\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.launchDaemon = {\n plistPath,\n loaded: false,\n };\n return { success: true };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n const brokerUsername = context.userConfig.brokerUser.username;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Remove stale socket from previous installs (may be root-owned, causing EACCES)\n logVerbose('Removing stale socket file if present', context);\n logVerbose('Running: sudo rm -f /var/run/agenshield/agenshield.sock', context);\n execSync(`sudo rm -f /var/run/agenshield/agenshield.sock`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Ensure log files exist with correct ownership BEFORE loading daemon.\n // launchd opens stdout/stderr files at process start; if they don't exist\n // or are root-owned, the broker's output may be lost.\n logVerbose('Ensuring log files have correct ownership', context);\n logVerbose('Running: sudo mkdir -p /var/log/agenshield', context);\n execSync(`sudo mkdir -p /var/log/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });\n logVerbose('Running: sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log', context);\n execSync(`sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });\n logVerbose(`Running: sudo chown ${brokerUsername}:${socketGroupName} /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, context);\n execSync(`sudo chown ${brokerUsername}:${socketGroupName} /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Bootout any stale broker daemon entry from a previous install.\n // Without this, `launchctl load` may no-op if the old entry is cached.\n logVerbose('Removing stale launchd entry if present', context);\n logVerbose('Running: sudo launchctl bootout system/com.agenshield.broker', context);\n try {\n execSync(`sudo launchctl bootout system/com.agenshield.broker 2>/dev/null`, { encoding: 'utf-8', stdio: 'pipe' });\n } catch {\n // Not loaded — that's fine\n }\n\n // Generate plist\n const plist = generateBrokerPlist(context.userConfig, {\n brokerPath: context.brokerInstalled.binaryPath,\n });\n\n // Install and load\n const result = await installLaunchDaemon(plist);\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n // Force-start the broker immediately. launchctl load + RunAtLoad may not\n // start the process if launchd throttles it (e.g. ThrottleInterval from a\n // prior crashed run). kickstart bypasses throttling.\n logVerbose('Kickstarting broker daemon', context);\n logVerbose('Running: sudo launchctl kickstart system/com.agenshield.broker', context);\n try {\n execSync(`sudo launchctl kickstart system/com.agenshield.broker`, { encoding: 'utf-8', stdio: 'pipe' });\n } catch {\n // May fail if already running from RunAtLoad — that's fine\n }\n\n // Fix socket permissions after broker starts\n // This ensures the daemon user can access the broker socket\n const socketResult = await fixSocketPermissions(context.userConfig);\n if (!socketResult.success) {\n // Non-fatal: log warning but continue\n console.warn(`[Setup] Warning: ${socketResult.message}`);\n }\n\n context.launchDaemon = {\n plistPath: result.plistPath!,\n loaded: result.loaded || false,\n };\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to setup LaunchDaemon: ${(err as Error).message}`,\n };\n }\n },\n\n // NOTE: migrate step removed — replaced by install-openclaw + copy-openclaw-config\n\n verify: async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.verification = {\n usersValid: true,\n groupsValid: true,\n directoriesValid: true,\n socketValid: true,\n daemonRunning: false,\n networkBlocked: true,\n };\n return { success: true };\n }\n\n // Verify users and groups\n const userResult = await verifyUsersAndGroups(context.userConfig);\n if (!userResult.valid) {\n return {\n success: false,\n error: `Missing users: ${userResult.missingUsers.join(', ')}; Missing groups: ${userResult.missingGroups.join(', ')}`,\n };\n }\n\n // Verify directories\n const dirResult = await verifyDirectories(context.userConfig);\n if (!dirResult.valid) {\n const parts: string[] = [];\n if (dirResult.missing.length > 0) {\n parts.push(`Missing directories: ${dirResult.missing.join(', ')}`);\n }\n if (dirResult.incorrect.length > 0) {\n parts.push(`Incorrect directories: ${dirResult.incorrect.map(d => `${d.path} (${d.issue})`).join(', ')}`);\n }\n return {\n success: false,\n error: parts.join('; ') || 'Directory verification failed',\n };\n }\n\n // NOTE: We skip running the target binary during setup verification.\n // The interceptor (loaded via NODE_OPTIONS) would try to connect to the\n // broker, which isn't running yet, causing ETIMEDOUT errors.\n // The users/groups/directories verification above is sufficient.\n\n context.verification = {\n usersValid: true,\n groupsValid: true,\n directoriesValid: true,\n socketValid: context.socketSetup?.success || false,\n daemonRunning: context.launchDaemon?.loaded || false,\n networkBlocked: true, // Assumed true if seatbelt is installed\n };\n\n return { success: true };\n },\n\n 'setup-passcode': async (context) => {\n // Check if user chose to skip\n if (context.passcodeSetup?.skipped) {\n context.passcodeSetup = { configured: false, skipped: true };\n return { success: true };\n }\n\n // Check if passcode value was provided by the UI\n if (!context.passcodeValue) {\n // No passcode provided - skip (user declined in UI)\n context.passcodeSetup = { configured: false, skipped: true };\n return { success: true };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.passcodeSetup = { configured: true, skipped: false };\n // Clear the passcode from context\n context.passcodeValue = undefined;\n return { success: true };\n }\n\n try {\n // Hash the passcode using PBKDF2 (same as daemon's auth/passcode.ts)\n const ITERATIONS = 100000;\n const KEY_LENGTH = 64;\n const DIGEST = 'sha512';\n const SALT_LENGTH = 16;\n\n const salt = crypto.randomBytes(SALT_LENGTH);\n const derivedKey = await new Promise<Buffer>((resolve, reject) => {\n crypto.pbkdf2(context.passcodeValue!, salt, ITERATIONS, KEY_LENGTH, DIGEST, (err, key) => {\n if (err) reject(err);\n else resolve(key);\n });\n });\n\n const hash = `${ITERATIONS}:${salt.toString('base64')}:${derivedKey.toString('base64')}`;\n\n const passcodeData: PasscodeData = {\n hash,\n setAt: new Date().toISOString(),\n };\n\n // Save passcode to vault\n const { getVault } = await import('@agenshield/daemon');\n const vault = getVault();\n await vault.set('passcode', passcodeData);\n\n // Enable passcode protection in state\n const { updatePasscodeProtectionState } = await import('@agenshield/daemon');\n updatePasscodeProtectionState({ enabled: true });\n\n context.passcodeSetup = { configured: true, skipped: false };\n\n // Clear the passcode from context for security\n context.passcodeValue = undefined;\n\n return { success: true };\n } catch (err) {\n // Clear the passcode from context even on failure\n context.passcodeValue = undefined;\n return {\n success: false,\n error: `Failed to setup passcode: ${(err as Error).message}`,\n };\n }\n },\n\n complete: async (_context) => {\n // Final step - nothing to do\n return { success: true };\n },\n};\n\n/**\n * Run a subset of steps\n */\nasync function runSteps(\n state: WizardState,\n context: WizardContext,\n stepIds: WizardStepId[],\n onStateChange?: (state: WizardState) => void\n): Promise<{ success: boolean; error?: string }> {\n for (const stepId of stepIds) {\n const stepIndex = state.steps.findIndex((s) => s.id === stepId);\n if (stepIndex === -1) continue;\n\n state.currentStep = stepIndex;\n const step = state.steps[stepIndex];\n\n // Update step status to running\n step.status = 'running';\n _currentStepId = stepId;\n logVerbose(`▶ Starting step: ${step.name} (${step.id})`, context);\n onStateChange?.(state);\n\n // Execute the step\n const executor = stepExecutors[stepId];\n if (!executor) {\n step.status = 'error';\n step.error = `No executor for step: ${step.id}`;\n state.hasError = true;\n _currentStepId = undefined;\n logVerbose(`✗ Step ${step.id}: no executor found`, context);\n onStateChange?.(state);\n return { success: false, error: step.error };\n }\n\n const result = await executeStep(step, context, executor);\n _currentStepId = undefined;\n\n if (result.success) {\n step.status = 'completed';\n logVerbose(`✓ Completed step: ${step.name}`, context);\n } else {\n step.status = 'error';\n step.error = result.error;\n state.hasError = true;\n logVerbose(`✗ Failed step: ${step.name} — ${result.error}`, context);\n onStateChange?.(state);\n return { success: false, error: result.error };\n }\n\n onStateChange?.(state);\n }\n\n return { success: true };\n}\n\n/**\n * Create a new wizard engine\n */\nexport function createWizardEngine(options?: WizardOptions): WizardEngine {\n const state: WizardState = {\n currentStep: 0,\n steps: createWizardSteps(),\n isComplete: false,\n hasError: false,\n };\n\n const context: WizardContext = {\n options,\n };\n\n const engine: WizardEngine = {\n state,\n context,\n onStateChange: undefined,\n\n /**\n * Run detection phase only (prerequisites + detect + configure)\n * Called first, then waits for user confirmation\n */\n async runDetectionPhase() {\n const detectionSteps = getStepsByPhase('detection').filter((id) => id !== 'confirm');\n const result = await runSteps(state, context, detectionSteps, engine.onStateChange);\n return result;\n },\n\n /**\n * Run setup phase — all setup steps from confirm through complete.\n * Called after user confirms they want to proceed.\n * Excludes: setup-passcode, open-dashboard, complete (handled by runFinalPhase).\n */\n async runSetupPhase() {\n const excludeFromSetup: WizardStepId[] = [\n 'setup-passcode', 'open-dashboard', 'complete',\n ];\n\n // Prompt for sudo credentials before privileged steps (skip in dry-run)\n if (!context.options?.dryRun) {\n const { ensureSudoAccess, startSudoKeepalive } = await import('../utils/privileges.js');\n ensureSudoAccess();\n const keepalive = startSudoKeepalive();\n try {\n const setupSteps: WizardStepId[] = ['confirm', ...getStepsByPhase('setup')\n .filter((id) => !excludeFromSetup.includes(id))];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n } finally {\n clearInterval(keepalive);\n }\n return;\n }\n // dry-run path\n const setupSteps: WizardStepId[] = ['confirm', ...getStepsByPhase('setup')\n .filter((id) => !excludeFromSetup.includes(id))];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n },\n\n /**\n * Run migration phase — no longer needed in new flow.\n * Kept for backward compatibility; does nothing.\n * @deprecated Use runSetupPhase() which now includes install-openclaw + copy-openclaw-config.\n */\n async runMigrationPhase() {\n // Migration is now part of the setup phase (install-openclaw + copy-openclaw-config)\n return;\n },\n\n /**\n * Run final phase (setup-passcode, open-dashboard, and complete)\n * Called after the passcode UI has collected the passcode value\n */\n async runFinalPhase() {\n const finalSteps: WizardStepId[] = ['setup-passcode', 'open-dashboard', 'complete'];\n await runSteps(state, context, finalSteps, engine.onStateChange);\n\n if (!state.hasError) {\n state.isComplete = true;\n engine.onStateChange?.(state);\n }\n },\n\n /**\n * Run all steps sequentially (for backwards compatibility)\n */\n async run() {\n await runSteps(state, context, getAllStepIds(), engine.onStateChange);\n\n if (!state.hasError) {\n state.isComplete = true;\n engine.onStateChange?.(state);\n }\n },\n };\n\n return engine;\n}\n"]}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Wizard engine - orchestrates the setup steps\n */\n\nimport * as os from 'node:os';\nimport * as crypto from 'node:crypto';\nimport {\n checkPrerequisites,\n createUserConfig,\n createGroups,\n createAgentUser,\n createBrokerUser,\n createAllDirectories,\n setupSocketDirectory,\n verifyUsersAndGroups,\n verifyDirectories,\n generateAgentProfile,\n installSeatbeltProfiles,\n installAllWrappers,\n installPresetBinaries,\n generateBrokerPlist,\n installLaunchDaemon,\n fixSocketPermissions,\n createPathsConfig,\n deployInterceptor,\n copyNodeBinary,\n copyBrokerBinary,\n copyShieldClient,\n installGuardedShell,\n // NVM (existing)\n installAgentNvm,\n patchNvmNode,\n // Preset system\n getPreset,\n autoDetectPreset,\n type MigrationContext,\n type MigrationDirectories,\n} from '@agenshield/sandbox';\nimport {\n // Homebrew\n installAgentHomebrew,\n isAgentHomebrewInstalled,\n // OpenClaw install + config + lifecycle\n detectHostOpenClawVersion,\n installAgentOpenClaw,\n copyOpenClawConfig,\n stopHostOpenClaw,\n getOriginalUser,\n getHostOpenClawConfigPath,\n onboardAgentOpenClaw,\n // OpenClaw LaunchDaemons\n installOpenClawLaunchDaemons,\n startOpenClawServices,\n OPENCLAW_DAEMON_PLIST,\n OPENCLAW_GATEWAY_PLIST,\n} from '@agenshield/integrations';\nimport type { OriginalInstallation, MigratedPaths, SandboxUserInfo, UserConfig, PasscodeData } from '@agenshield/ipc';\nimport type {\n WizardStep,\n WizardState,\n WizardContext,\n WizardStepId,\n WizardOptions,\n} from './types.js';\nimport { createWizardSteps, getStepsByPhase, getAllStepIds } from './types.js';\n\nexport type StepExecutor = (context: WizardContext) => Promise<{ success: boolean; error?: string }>;\n\n/**\n * Module-level log callback — allows the setup server to receive verbose\n * messages and broadcast them (e.g. via SSE) to the browser UI.\n */\nlet _logCallback: ((message: string, stepId?: WizardStepId) => void) | undefined;\nlet _currentStepId: WizardStepId | undefined;\n\nexport function setEngineLogCallback(cb: ((message: string, stepId?: WizardStepId) => void) | undefined): void {\n _logCallback = cb;\n}\n\n/**\n * Verbose logging helper - logs messages when verbose mode is enabled.\n * Writes to stderr (terminal) only in verbose mode, but ALWAYS calls\n * the log callback so the setup server can forward messages to the browser.\n */\nfunction logVerbose(message: string, context?: WizardContext): void {\n if (context?.options?.verbose || process.env['AGENSHIELD_VERBOSE'] === 'true') {\n process.stderr.write(`[SETUP] ${message}\\n`);\n }\n // Always broadcast to the UI regardless of verbose flag\n _logCallback?.(message, _currentStepId);\n}\n\nexport interface WizardEngine {\n state: WizardState;\n context: WizardContext;\n onStateChange?: (state: WizardState) => void;\n /** Run full wizard (all steps) */\n run(): Promise<void>;\n /** Run only detection phase (prerequisites + detect + configure) */\n runDetectionPhase(): Promise<{ success: boolean; error?: string }>;\n /** Run setup phase (confirm through scan-source, stops for user selection) */\n runSetupPhase(): Promise<void>;\n /** Run migration phase (select-items + migrate + verify) - called after user makes selection */\n runMigrationPhase(): Promise<void>;\n /** Run final phase (setup-passcode and complete) - called after passcode UI */\n runFinalPhase(): Promise<void>;\n}\n\n/**\n * Execute a step and update state\n */\nasync function executeStep(\n step: WizardStep,\n context: WizardContext,\n executor: StepExecutor\n): Promise<{ success: boolean; error?: string }> {\n try {\n return await executor(context);\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Step executors\n */\nconst stepExecutors: Record<WizardStepId, StepExecutor> = {\n prerequisites: async (_context) => {\n const result = checkPrerequisites();\n if (!result.ok) {\n return {\n success: false,\n error: `Missing prerequisites: ${result.missing.join(', ')}`,\n };\n }\n return { success: true };\n },\n\n detect: async (context) => {\n const presetId = context.options?.targetPreset;\n\n // Handle custom preset - requires entry point\n if (presetId === 'custom') {\n if (!context.options?.entryPoint) {\n return {\n success: false,\n error: '--entry-point is required when using --target custom',\n };\n }\n\n const preset = getPreset('custom');\n if (!preset) {\n return { success: false, error: 'Custom preset not found' };\n }\n\n // Custom preset doesn't auto-detect, so we create a detection result\n context.preset = preset;\n context.presetDetection = {\n found: true,\n method: 'custom',\n };\n return { success: true };\n }\n\n // Handle specific preset requested\n if (presetId) {\n const preset = getPreset(presetId);\n if (!preset) {\n return { success: false, error: `Unknown preset: ${presetId}` };\n }\n\n const detection = await preset.detect();\n if (!detection?.found) {\n // Don't fail — let install-target step handle it\n // Preserve partial detection (e.g. configPath) for scan-source\n context.preset = preset;\n context.presetDetection = detection ?? { found: false };\n context.targetInstallable = true;\n return { success: true };\n }\n\n context.preset = preset;\n context.presetDetection = detection;\n return { success: true };\n }\n\n // Auto-detect preset\n const result = await autoDetectPreset();\n if (!result) {\n // No target found — mark as installable so install-target step can offer installation\n // Try to capture partial detection (e.g. configPath with skills on disk)\n const openclawPreset = getPreset('openclaw');\n if (openclawPreset) {\n context.preset = openclawPreset;\n const partialDetection = await openclawPreset.detect();\n context.presetDetection = partialDetection ?? { found: false };\n context.targetInstallable = true;\n return { success: true };\n }\n return {\n success: false,\n error: 'No supported target found. Use --target custom --entry-point <path> for custom applications.',\n };\n }\n\n context.preset = result.preset;\n context.presetDetection = result.detection;\n return { success: true };\n },\n\n 'install-target': async (context) => {\n // If detection already found a target, skip\n if (context.presetDetection?.found) {\n return { success: true };\n }\n\n // If not found and user hasn't requested install yet, mark as installable and succeed\n // (the Web UI will offer an install button)\n if (!context.installTargetRequested) {\n context.targetInstallable = true;\n return { success: true };\n }\n\n // User requested installation — skip actual install in dry-run\n if (context.options?.dryRun) {\n context.targetInstallable = false;\n context.presetDetection = { found: true, method: 'npm' };\n return { success: true };\n }\n\n // Run npm install -g openclaw (no sudo — user handles npm config)\n try {\n const { execSync } = await import('node:child_process');\n logVerbose('Running: npm install -g openclaw', context);\n const output = execSync('npm install -g openclaw', {\n encoding: 'utf-8',\n timeout: 120_000,\n stdio: 'pipe',\n });\n if (output?.trim()) {\n logVerbose(output.trim(), context);\n }\n } catch (err) {\n return {\n success: false,\n error: `Failed to install openclaw: ${(err as Error).message}`,\n };\n }\n\n // Re-run detection\n const result = await autoDetectPreset();\n if (!result) {\n return {\n success: false,\n error: 'openclaw was installed but could not be detected. Check your PATH.',\n };\n }\n\n context.preset = result.preset;\n context.presetDetection = result.detection;\n context.targetInstallable = false;\n return { success: true };\n },\n\n configure: async (context) => {\n // Create user configuration based on options\n const userConfig = createUserConfig({\n prefix: context.options?.prefix,\n baseUid: context.options?.baseUid,\n baseGid: context.options?.baseGid,\n baseName: context.options?.baseName,\n });\n\n context.userConfig = userConfig;\n context.pathsConfig = createPathsConfig(userConfig);\n\n return { success: true };\n },\n\n // Confirmation is handled by the UI, this step just marks it as complete\n confirm: async (_context) => {\n return { success: true };\n },\n\n // ── New setup steps ───────────────────────────────────────────────────\n\n 'cleanup-previous': async (context) => {\n logVerbose('Checking for previous installations', context);\n const { execSync } = await import('node:child_process');\n const fs = await import('node:fs');\n\n // Quick check: does the default agent user exist?\n let agentUserExists = false;\n try {\n execSync('dscl . -read /Users/ash_default_agent', { encoding: 'utf-8', stdio: 'pipe' });\n agentUserExists = true;\n } catch { /* user doesn't exist */ }\n\n if (!agentUserExists) {\n logVerbose('No previous installation detected', context);\n return { success: true };\n }\n\n logVerbose('Found previous installation (ash_default_agent exists), cleaning up', context);\n\n if (context.options?.dryRun) {\n logVerbose('[dry-run] Would remove previous installation', context);\n return { success: true };\n }\n\n // NOTE: We cannot use forceUninstall() here because it calls stopDaemon()\n // which kills the process on port 5200 — that's our own setup wizard.\n // Instead we do the cleanup steps inline, skipping the daemon kill.\n\n const sudo = (cmd: string) => {\n try {\n execSync(`sudo ${cmd}`, { encoding: 'utf-8', stdio: 'pipe' });\n return true;\n } catch { return false; }\n };\n\n // 1. Stop broker launchd service (but NOT the daemon on port 5200 — that's us)\n const brokerPlist = '/Library/LaunchDaemons/com.agenshield.broker.plist';\n if (fs.existsSync(brokerPlist)) {\n logVerbose('[cleanup] Stopping broker LaunchDaemon', context);\n sudo(`launchctl bootout system/com.agenshield.broker 2>/dev/null || true`);\n sudo(`rm -f \"${brokerPlist}\"`);\n }\n\n // 2. Remove OpenClaw LaunchDaemon plists if present\n for (const plist of [\n '/Library/LaunchDaemons/com.agenshield.openclaw.daemon.plist',\n '/Library/LaunchDaemons/com.agenshield.openclaw.gateway.plist',\n ]) {\n if (fs.existsSync(plist)) {\n const label = plist.replace('/Library/LaunchDaemons/', '').replace('.plist', '');\n logVerbose(`[cleanup] Removing ${label}`, context);\n sudo(`launchctl bootout system/${label} 2>/dev/null || true`);\n sudo(`rm -f \"${plist}\"`);\n }\n }\n\n // 3. Discover and kill processes for all ash_* users\n let sandboxUsers: string[] = [];\n try {\n const output = execSync('dscl . -list /Users', { encoding: 'utf-8' });\n sandboxUsers = output.split('\\n').filter(u => u.startsWith('ash_'));\n } catch { /* ignore */ }\n\n for (const username of sandboxUsers) {\n logVerbose(`[cleanup] Killing processes for ${username}`, context);\n sudo(`pkill -u ${username} 2>/dev/null || true`);\n }\n if (sandboxUsers.length > 0) {\n try { execSync('sleep 1', { encoding: 'utf-8' }); } catch { /* ignore */ }\n for (const username of sandboxUsers) {\n sudo(`pkill -9 -u ${username} 2>/dev/null || true`);\n }\n }\n\n // 4. Delete sandbox users (with home dirs)\n const { deleteSandboxUser } = await import('@agenshield/sandbox');\n for (const username of sandboxUsers) {\n logVerbose(`[cleanup] Deleting user ${username}`, context);\n deleteSandboxUser(username, { removeHomeDir: true });\n }\n\n // 5. Delete ash_* groups\n let ashGroups: string[] = [];\n try {\n const output = execSync('dscl . -list /Groups', { encoding: 'utf-8' });\n ashGroups = output.split('\\n').filter(g => g.startsWith('ash_'));\n } catch { /* ignore */ }\n\n for (const groupName of ashGroups) {\n logVerbose(`[cleanup] Deleting group ${groupName}`, context);\n sudo(`dscl . -delete /Groups/${groupName}`);\n }\n\n // 6. Remove guarded shell from /etc/shells and disk\n const guardedShellPath = '/usr/local/bin/guarded-shell';\n if (fs.existsSync(guardedShellPath)) {\n logVerbose('[cleanup] Removing guarded shell', context);\n sudo(`sed -i '' '\\\\|${guardedShellPath}|d' /etc/shells`);\n sudo(`rm -f \"${guardedShellPath}\"`);\n }\n\n // 7. Remove sudoers drop-in\n if (fs.existsSync('/etc/sudoers.d/agenshield')) {\n logVerbose('[cleanup] Removing /etc/sudoers.d/agenshield', context);\n sudo('rm -f /etc/sudoers.d/agenshield');\n }\n\n // 8. Clean up directories\n for (const dir of ['/etc/agenshield', '/var/log/agenshield', '/var/run/agenshield', '/opt/agenshield']) {\n if (fs.existsSync(dir)) {\n logVerbose(`[cleanup] Removing ${dir}`, context);\n sudo(`rm -rf \"${dir}\"`);\n }\n }\n\n logVerbose('Previous installation cleaned up', context);\n return { success: true };\n },\n\n 'install-homebrew': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install Homebrew to ${agentUser.home}/homebrew`, context);\n context.homebrewInstalled = { brewPath: `${agentUser.home}/homebrew/bin/brew`, success: true };\n return { success: true };\n }\n\n // Skip if already installed (e.g., retry after partial failure)\n if (await isAgentHomebrewInstalled(agentUser.home)) {\n logVerbose('Homebrew already installed, skipping', context);\n context.homebrewInstalled = { brewPath: `${agentUser.home}/homebrew/bin/brew`, success: true };\n return { success: true };\n }\n\n logVerbose(`Installing user-specific Homebrew for ${agentUser.username}`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await installAgentHomebrew({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroupName,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.homebrewInstalled = { brewPath: result.brewPath, success: true };\n return { success: true };\n },\n\n 'install-nvm': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n const nodeVersion = context.options?.nodeVersion || '24';\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install NVM + Node.js v${nodeVersion} for ${agentUser.username}`, context);\n context.nvmInstalled = {\n nvmDir: `${agentUser.home}/.nvm`,\n nodeVersion: `v${nodeVersion}`,\n nodeBinaryPath: `${agentUser.home}/.nvm/versions/node/v${nodeVersion}.0.0/bin/node`,\n success: true,\n };\n return { success: true };\n }\n\n // Skip if NVM + requested Node version already installed\n const nvmDir = `${agentUser.home}/.nvm`;\n const nvmSh = `${nvmDir}/nvm.sh`;\n const fs = await import('node:fs');\n if (fs.existsSync(nvmSh)) {\n try {\n const { exec: execCb } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(execCb);\n const { stdout } = await execAsync(\n `sudo -H -u ${agentUser.username} /bin/bash --norc --noprofile -c 'source \"${nvmSh}\" && nvm which ${nodeVersion}'`,\n { cwd: '/' },\n );\n if (stdout.trim()) {\n logVerbose(`NVM + Node.js v${nodeVersion} already installed, skipping`, context);\n // Still copy node binary to ensure it's up to date\n const nodeResult = await copyNodeBinary(context.userConfig, stdout.trim());\n if (!nodeResult.success) {\n return { success: false, error: `Node binary copy failed: ${nodeResult.message}` };\n }\n // NOTE: Do NOT patch NVM node here — patching must happen after all\n // npm installs (openclaw etc.) complete. See start-openclaw step.\n context.nvmInstalled = {\n nvmDir,\n nodeVersion: `v${nodeVersion}`,\n nodeBinaryPath: stdout.trim(),\n success: true,\n };\n return { success: true };\n }\n } catch {\n // Node version not installed, proceed with full install\n }\n }\n\n logVerbose(`Installing NVM + Node.js v${nodeVersion} for ${agentUser.username}`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await installAgentNvm({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroupName,\n nodeVersion,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n // Copy NVM node binary to /opt/agenshield/bin/node-bin\n logVerbose(`Copying NVM node binary to /opt/agenshield/bin/node-bin`, context);\n const nodeResult = await copyNodeBinary(context.userConfig, result.nodeBinaryPath);\n if (!nodeResult.success) {\n return { success: false, error: `Node binary copy failed: ${nodeResult.message}` };\n }\n\n // NOTE: Do NOT patch NVM node here — patching must happen after all\n // npm installs (openclaw etc.) complete. See start-openclaw step.\n\n context.nvmInstalled = {\n nvmDir: result.nvmDir,\n nodeVersion: result.nodeVersion,\n nodeBinaryPath: result.nodeBinaryPath,\n success: true,\n };\n return { success: true };\n },\n\n 'configure-shell': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would configure guarded shell with Homebrew + NVM paths`, context);\n context.shellConfigured = { success: true };\n return { success: true };\n }\n\n logVerbose('Installing guarded shell with Homebrew and NVM paths', context);\n const result = await installGuardedShell(context.userConfig, { verbose: context.options?.verbose });\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.shellConfigured = { success: true };\n return { success: true };\n },\n\n 'install-openclaw': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Detect host version\n const hostVersion = context.presetDetection?.version || detectHostOpenClawVersion() || 'latest';\n logVerbose(`Host OpenClaw version: ${hostVersion}`, context);\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install openclaw@${hostVersion} for ${agentUser.username}`, context);\n context.openclawInstalled = {\n version: hostVersion,\n binaryPath: `${agentUser.home}/.nvm/versions/node/v24.0.0/bin/openclaw`,\n success: true,\n };\n return { success: true };\n }\n\n logVerbose(`Installing openclaw@${hostVersion} for agent user`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await installAgentOpenClaw({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroupName,\n targetVersion: hostVersion,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.openclawInstalled = {\n version: result.version,\n binaryPath: result.binaryPath,\n success: true,\n };\n return { success: true };\n },\n\n 'copy-openclaw-config': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Find host config path\n const sourceConfigPath = context.presetDetection?.configPath\n || getHostOpenClawConfigPath();\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would copy .openclaw from ${sourceConfigPath || '(not found)'} to ${agentUser.home}/.openclaw`, context);\n context.openclawConfigCopied = {\n configDir: `${agentUser.home}/.openclaw`,\n sanitized: false,\n success: true,\n };\n return { success: true };\n }\n\n if (!sourceConfigPath) {\n logVerbose('No host .openclaw config found, creating empty config', context);\n }\n\n logVerbose(`Copying OpenClaw config to agent user`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = copyOpenClawConfig({\n sourceConfigPath: sourceConfigPath || '/nonexistent',\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n socketGroup: socketGroupName,\n verbose: context.options?.verbose,\n onLog,\n });\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.openclawConfigCopied = {\n configDir: result.configDir,\n sanitized: result.sanitized,\n success: true,\n };\n return { success: true };\n },\n\n 'stop-host-openclaw': async (context) => {\n const originalUser = getOriginalUser();\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would stop OpenClaw daemon + gateway for user: ${originalUser}`, context);\n context.hostOpenclawStopped = { daemonStopped: true, gatewayStopped: true };\n return { success: true };\n }\n\n logVerbose(`Stopping host OpenClaw processes for user: ${originalUser}`, context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await stopHostOpenClaw({\n originalUser,\n verbose: context.options?.verbose,\n onLog,\n });\n\n context.hostOpenclawStopped = {\n daemonStopped: result.daemonStopped,\n gatewayStopped: result.gatewayStopped,\n };\n\n // Non-fatal if stop fails (processes might not be running)\n return { success: true };\n },\n\n 'onboard-openclaw': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n\n if (context.options?.dryRun) {\n logVerbose('[dry-run] Would run openclaw onboard --non-interactive', context);\n context.openclawOnboarded = { success: true };\n return { success: true };\n }\n\n logVerbose('Running openclaw onboard for agent user', context);\n const onLog = (msg: string) => logVerbose(msg, context);\n const result = await onboardAgentOpenClaw({\n agentHome: agentUser.home,\n agentUsername: agentUser.username,\n verbose: context.options?.verbose,\n onLog,\n });\n\n context.openclawOnboarded = { success: result.success };\n\n // Non-fatal — onboard may fail if openclaw doesn't support the flags\n if (!result.success) {\n logVerbose(`Onboard returned non-success (non-fatal): ${result.message}`, context);\n }\n return { success: true };\n },\n\n 'start-openclaw': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install OpenClaw LaunchDaemons (managed by broker)`, context);\n context.openclawLaunchDaemons = {\n daemonPlistPath: OPENCLAW_DAEMON_PLIST,\n gatewayPlistPath: OPENCLAW_GATEWAY_PLIST,\n loaded: false,\n };\n return { success: true };\n }\n\n // 1. Patch NVM node in-place BEFORE starting OpenClaw services.\n // All npm installs (openclaw, onboard, etc.) are done by now, so it's safe\n // to replace NVM's node with the interceptor wrapper. From this point on,\n // every `node` invocation via NVM goes through the interceptor.\n const onLog = (msg: string) => logVerbose(msg, context);\n if (context.nvmInstalled?.success && context.nvmInstalled.nodeBinaryPath) {\n logVerbose('Patching NVM node binary in-place with interceptor wrapper', context);\n const patchResult = await patchNvmNode({\n nodeBinaryPath: context.nvmInstalled.nodeBinaryPath,\n agentUsername: agentUser.username,\n socketGroupName,\n interceptorPath: '/opt/agenshield/lib/interceptor/register.cjs',\n socketPath: '/var/run/agenshield/agenshield.sock',\n httpPort: 5201,\n verbose: context.options?.verbose,\n onLog,\n });\n if (!patchResult.success) {\n return { success: false, error: `Failed to patch NVM node: ${patchResult.message}` };\n }\n }\n\n // 2. Install OpenClaw LaunchDaemons (gateway + daemon) — managed by launchd/broker\n logVerbose('Installing OpenClaw LaunchDaemons (broker-managed)', context);\n const installResult = await installOpenClawLaunchDaemons({\n agentUsername: agentUser.username,\n socketGroupName,\n agentHome: agentUser.home,\n });\n\n if (!installResult.success) {\n return { success: false, error: installResult.message };\n }\n\n logVerbose('OpenClaw LaunchDaemons installed and loaded', context);\n\n // 3. Start OpenClaw services via launchctl kickstart\n logVerbose('Starting OpenClaw services via launchctl', context);\n const startResult = await startOpenClawServices();\n\n if (!startResult.success) {\n logVerbose(`Failed to start OpenClaw services (non-fatal): ${startResult.message}`, context);\n } else {\n logVerbose('OpenClaw services started', context);\n }\n\n context.openclawLaunchDaemons = {\n daemonPlistPath: OPENCLAW_DAEMON_PLIST,\n gatewayPlistPath: OPENCLAW_GATEWAY_PLIST,\n loaded: true,\n };\n\n return { success: true };\n },\n\n 'open-dashboard': async (_context) => {\n // No-op: the browser is already on the setup wizard page which\n // transitions to CompleteStep and polls for daemon readiness.\n return { success: true };\n },\n\n 'create-groups': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create group: ${context.userConfig.groups.socket.name} (gid=${context.userConfig.groups.socket.gid})`, context);\n logVerbose(`[dry-run] Would create group: ${context.userConfig.groups.workspace.name} (gid=${context.userConfig.groups.workspace.gid})`, context);\n context.groupsCreated = {\n socket: context.userConfig.groups.socket,\n workspace: context.userConfig.groups.workspace,\n };\n return { success: true };\n }\n\n logVerbose(`Creating group: ${context.userConfig.groups.socket.name} (gid=${context.userConfig.groups.socket.gid})`, context);\n logVerbose(`Creating group: ${context.userConfig.groups.workspace.name} (gid=${context.userConfig.groups.workspace.gid})`, context);\n\n const results = await createGroups(context.userConfig, { verbose: context.options?.verbose });\n const failed = results.filter((r) => !r.success);\n\n if (failed.length > 0) {\n return {\n success: false,\n error: failed.map((r) => r.message).join('; '),\n };\n }\n\n context.groupsCreated = {\n socket: context.userConfig.groups.socket,\n workspace: context.userConfig.groups.workspace,\n };\n\n return { success: true };\n },\n\n 'create-agent-user': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create user: ${agentUser.username} (uid=${agentUser.uid}, gid=${agentUser.gid})`, context);\n logVerbose(`[dry-run] Home directory: ${agentUser.home}`, context);\n logVerbose(`[dry-run] Shell: ${agentUser.shell}`, context);\n context.agentUser = {\n username: agentUser.username,\n uid: agentUser.uid,\n gid: agentUser.gid,\n homeDir: agentUser.home,\n shell: agentUser.shell,\n };\n return { success: true };\n }\n\n logVerbose(`Creating user: ${agentUser.username} (uid=${agentUser.uid}, gid=${agentUser.gid})`, context);\n logVerbose(`Home directory: ${agentUser.home}`, context);\n logVerbose(`Shell: ${agentUser.shell}`, context);\n\n const result = await createAgentUser(context.userConfig, { verbose: context.options?.verbose });\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.agentUser = {\n username: agentUser.username,\n uid: agentUser.uid,\n gid: agentUser.gid,\n homeDir: agentUser.home,\n shell: agentUser.shell,\n };\n\n return { success: true };\n },\n\n 'create-broker-user': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const { brokerUser } = context.userConfig;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create user: ${brokerUser.username} (uid=${brokerUser.uid}, gid=${brokerUser.gid})`, context);\n context.brokerUser = {\n username: brokerUser.username,\n uid: brokerUser.uid,\n gid: brokerUser.gid,\n homeDir: brokerUser.home,\n shell: brokerUser.shell,\n };\n return { success: true };\n }\n\n logVerbose(`Creating user: ${brokerUser.username} (uid=${brokerUser.uid}, gid=${brokerUser.gid})`, context);\n\n const result = await createBrokerUser(context.userConfig, { verbose: context.options?.verbose });\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.brokerUser = {\n username: brokerUser.username,\n uid: brokerUser.uid,\n gid: brokerUser.gid,\n homeDir: brokerUser.home,\n shell: brokerUser.shell,\n };\n\n return { success: true };\n },\n\n 'create-directories': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n const { agentUser } = context.userConfig;\n const directories = {\n binDir: `${agentUser.home}/bin`,\n wrappersDir: `${agentUser.home}/bin`,\n configDir: `${agentUser.home}/.openclaw`,\n npmDir: `${agentUser.home}/.npm`,\n socketDir: context.pathsConfig.socketDir,\n logDir: context.pathsConfig.logDir,\n seatbeltDir: context.pathsConfig.seatbeltDir,\n };\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would create directory: ${directories.binDir}`, context);\n logVerbose(`[dry-run] Would create directory: ${directories.configDir}`, context);\n logVerbose(`[dry-run] Would create directory: ${directories.socketDir}`, context);\n logVerbose(`[dry-run] Would create directory: ${directories.logDir}`, context);\n context.directories = directories;\n return { success: true };\n }\n\n logVerbose(`Creating directory: ${directories.binDir}`, context);\n logVerbose(`Creating directory: ${directories.configDir}`, context);\n logVerbose(`Creating directory: ${directories.socketDir}`, context);\n logVerbose(`Creating directory: ${directories.logDir}`, context);\n logVerbose(`Creating directory: ${agentUser.home}/workspace (mode=2775, group=${context.userConfig.groups.workspace.name})`, context);\n\n const results = await createAllDirectories(context.userConfig, { verbose: context.options?.verbose });\n const failed = results.filter((r) => !r.success);\n\n if (failed.length > 0) {\n return {\n success: false,\n error: failed.map((r) => r.message).join('; '),\n };\n }\n\n context.directories = directories;\n\n return { success: true };\n },\n\n 'setup-socket': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.socketSetup = {\n path: context.pathsConfig.socketPath,\n success: true,\n };\n return { success: true };\n }\n\n const result = await setupSocketDirectory(context.userConfig);\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.socketSetup = {\n path: context.pathsConfig.socketPath,\n success: true,\n };\n\n return { success: true };\n },\n\n 'generate-seatbelt': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.seatbeltProfiles = {\n agentProfile: `${context.pathsConfig.seatbeltDir}/agent.sb`,\n operationProfiles: [],\n };\n return { success: true };\n }\n\n try {\n // Generate agent profile\n const agentProfile = generateAgentProfile({\n workspacePath: `${context.userConfig.agentUser.home}/workspace`,\n socketPath: context.pathsConfig.socketPath,\n });\n\n // Install profiles\n const result = await installSeatbeltProfiles(context.userConfig, {\n agentProfile,\n });\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n context.seatbeltProfiles = {\n agentProfile: result.agentProfilePath!,\n operationProfiles: result.operationProfilePaths || [],\n };\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to generate seatbelt profiles: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-wrappers': async (context) => {\n if (!context.userConfig || !context.agentUser || !context.directories) {\n return { success: false, error: 'Required context not set' };\n }\n\n // Determine which bins to install from preset\n const requiredBins = context.preset?.requiredBins;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install guarded shell to /usr/local/bin/guarded-shell`, context);\n logVerbose(`[dry-run] Would install ZDOTDIR files to /etc/agenshield/zdot/`, context);\n logVerbose(`[dry-run] Would install wrappers: ${(requiredBins || ['node', 'npm', 'git', 'curl', 'shieldctl']).join(', ')}`, context);\n context.wrappersInstalled = requiredBins || ['node', 'npm', 'git', 'curl', 'shieldctl'];\n return { success: true };\n }\n\n try {\n // First, install guarded shell (critical for PATH/HOME enforcement)\n logVerbose(`Installing guarded shell to /usr/local/bin/guarded-shell`, context);\n logVerbose(`Installing .zshenv to /etc/agenshield/zdot/.zshenv`, context);\n logVerbose(`Installing .zshrc to /etc/agenshield/zdot/.zshrc`, context);\n\n const guardedShellResult = await installGuardedShell(context.userConfig);\n if (!guardedShellResult.success) {\n return { success: false, error: guardedShellResult.message };\n }\n\n if (requiredBins && requiredBins.length > 0) {\n // Preset-driven installation\n logVerbose(`Installing wrappers: ${requiredBins.join(', ')}`, context);\n const result = await installPresetBinaries({\n requiredBins,\n userConfig: context.userConfig,\n binDir: context.directories.binDir,\n socketGroupName: context.userConfig.groups.socket.name,\n nodeVersion: context.options?.nodeVersion,\n verbose: context.options?.verbose,\n nvmResult: context.nvmInstalled ? {\n success: context.nvmInstalled.success,\n nvmDir: context.nvmInstalled.nvmDir,\n nodeVersion: context.nvmInstalled.nodeVersion,\n nodeBinaryPath: context.nvmInstalled.nodeBinaryPath,\n message: '',\n } : undefined,\n });\n context.wrappersInstalled = result.installedWrappers;\n if (!result.success) {\n return { success: false, error: result.errors.join('; ') };\n }\n\n // Install shield-exec binary for daemon runtime self-healing\n try {\n const { SHIELD_EXEC_CONTENT, SHIELD_EXEC_PATH } = await import('@agenshield/sandbox');\n const { execSync } = await import('node:child_process');\n execSync(`sudo tee \"${SHIELD_EXEC_PATH}\" > /dev/null << 'SHIELDEXECEOF'\\n${SHIELD_EXEC_CONTENT}\\nSHIELDEXECEOF`);\n execSync(`sudo chmod 755 \"${SHIELD_EXEC_PATH}\"`);\n execSync(`sudo chown root:wheel \"${SHIELD_EXEC_PATH}\"`);\n logVerbose(`Installed shield-exec to ${SHIELD_EXEC_PATH}`, context);\n } catch (err) {\n logVerbose(`Warning: shield-exec install failed: ${(err as Error).message}`, context);\n }\n\n return { success: true };\n }\n\n // Fallback: install all wrappers (no preset or preset has no requiredBins)\n logVerbose(`Deploying interceptor to /opt/agenshield/lib/interceptor/register.cjs`, context);\n const interceptorResult = await deployInterceptor(context.userConfig);\n if (!interceptorResult.success) {\n return { success: false, error: interceptorResult.message };\n }\n\n logVerbose(`Copying node binary to /opt/agenshield/bin/node-bin`, context);\n const nodeBinResult = await copyNodeBinary(context.userConfig);\n if (!nodeBinResult.success) {\n return { success: false, error: nodeBinResult.message };\n }\n\n logVerbose(`Installing all wrappers to ${context.directories.binDir}`, context);\n const result = await installAllWrappers(context.userConfig, context.directories);\n if (!result.success) {\n return { success: false, error: result.error };\n }\n context.wrappersInstalled = result.installed || [];\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to install wrappers: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-broker': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n const brokerPath = '/opt/agenshield/bin/agenshield-broker';\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install broker binary to ${brokerPath}`, context);\n context.brokerInstalled = {\n binaryPath: brokerPath,\n success: true,\n };\n return { success: true };\n }\n\n logVerbose(`Installing broker binary to ${brokerPath}`, context);\n\n const result = await copyBrokerBinary(context.userConfig);\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n context.brokerInstalled = {\n binaryPath: brokerPath,\n success: true,\n };\n\n // Also install shield-client (used by curl/git/etc. wrappers)\n logVerbose('Installing shield-client to /opt/agenshield/bin/shield-client', context);\n const clientResult = await copyShieldClient(context.userConfig);\n if (!clientResult.success) {\n logVerbose(`Warning: shield-client install failed: ${clientResult.message}`, context);\n }\n\n return { success: true };\n },\n\n 'install-daemon-config': async (context) => {\n if (!context.userConfig || !context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n const configPath = `${context.pathsConfig.configDir}/shield.json`;\n const brokerUsername = context.userConfig.brokerUser.username;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would write daemon config to ${configPath}`, context);\n context.daemonConfig = {\n configPath,\n success: true,\n };\n return { success: true };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n\n const shieldConfig = JSON.stringify({\n socketPath: context.pathsConfig.socketPath,\n socketOwner: brokerUsername,\n socketGroup: socketGroupName,\n policiesPath: '/opt/agenshield/policies',\n auditLogPath: '/var/log/agenshield/audit.log',\n agentHome: context.userConfig.agentUser.home,\n }, null, 2);\n\n logVerbose(`Writing daemon config to ${configPath}`, context);\n\n // Write config file via sudo tee\n logVerbose(`Running: sudo tee \"${configPath}\"`, context);\n execSync(`sudo tee \"${configPath}\" > /dev/null << 'SHIELD_EOF'\n${shieldConfig}\nSHIELD_EOF`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Set ownership and permissions\n logVerbose(`Running: sudo chown ${brokerUsername}:${socketGroupName} \"${configPath}\"`, context);\n execSync(`sudo chown ${brokerUsername}:${socketGroupName} \"${configPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\n logVerbose(`Running: sudo chmod 640 \"${configPath}\"`, context);\n execSync(`sudo chmod 640 \"${configPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\n\n context.daemonConfig = {\n configPath,\n success: true,\n };\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to install daemon config: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-sudoers': async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'User configuration not set' };\n }\n\n const brokerUsername = context.userConfig.brokerUser.username;\n const agentUsername = context.userConfig.agentUser.username;\n const agentHome = context.userConfig.agentUser.home;\n\n if (context.options?.dryRun) {\n logVerbose(`[dry-run] Would install /etc/sudoers.d/agenshield granting ${brokerUsername} sudo for ${agentUsername} operations`, context);\n return { success: true };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n\n // Include the original user (who ran setup) so dev-mode daemon can also use sudo\n const originalUser = getOriginalUser();\n const users = [brokerUsername];\n if (originalUser && originalUser !== brokerUsername) {\n users.push(originalUser);\n }\n\n const lines: string[] = [\n '# AgenShield: allow broker (and host user) to run openclaw commands as agent user',\n ];\n for (const user of users) {\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /opt/agenshield/bin/openclaw-launcher.sh *`);\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/cat ${agentHome}/.openclaw/*`);\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /usr/bin/tee ${agentHome}/.openclaw/*`);\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/mkdir -p ${agentHome}/.openclaw/*`);\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /usr/bin/tee ${agentHome}/bin/*`);\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/mkdir -p ${agentHome}/bin`);\n lines.push(`${user} ALL=(${agentUsername}) NOPASSWD: /bin/bash --norc --noprofile -c *`);\n }\n lines.push('');\n lines.push('# AgenShield: allow broker (and host user) to manage openclaw gateway LaunchDaemon');\n for (const user of users) {\n lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl kickstart system/com.agenshield.openclaw.gateway`);\n lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl kickstart -k system/com.agenshield.openclaw.gateway`);\n lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl kill SIGTERM system/com.agenshield.openclaw.gateway`);\n lines.push(`${user} ALL=(root) NOPASSWD: /bin/launchctl list com.agenshield.openclaw.gateway`);\n }\n lines.push('');\n\n const sudoersContent = lines.join('\\n');\n\n const tmpPath = '/tmp/agenshield-sudoers';\n\n // 1. Write to temp file\n logVerbose('Writing sudoers rules to temp file', context);\n execSync(`sudo tee \"${tmpPath}\" > /dev/null`, {\n input: sudoersContent,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n // 2. Validate with visudo\n logVerbose('Validating sudoers syntax', context);\n execSync(`sudo visudo -c -f \"${tmpPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // 3. Move to /etc/sudoers.d/\n logVerbose('Installing sudoers drop-in to /etc/sudoers.d/agenshield', context);\n execSync(`sudo mv \"${tmpPath}\" /etc/sudoers.d/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // 4. Set permissions (440 is required for sudoers files)\n execSync('sudo chmod 440 /etc/sudoers.d/agenshield', { encoding: 'utf-8', stdio: 'pipe' });\n\n logVerbose(`Sudoers rule installed: ${users.join(', ')} → ${agentUsername} + root (launchctl)`, context);\n return { success: true };\n } catch (err) {\n // Clean up temp file on failure\n try {\n const { execSync } = await import('node:child_process');\n execSync('sudo rm -f /tmp/agenshield-sudoers', { stdio: 'pipe' });\n } catch { /* ignore */ }\n return {\n success: false,\n error: `Failed to install sudoers rule: ${(err as Error).message}`,\n };\n }\n },\n\n 'install-policies': async (context) => {\n if (!context.pathsConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.policiesInstalled = {\n builtinCount: 5,\n customCount: 0,\n };\n return { success: true };\n }\n\n // TODO: Implement actual policy installation\n // For now, just mark as success\n context.policiesInstalled = {\n builtinCount: 5,\n customCount: 0,\n };\n\n return { success: true };\n },\n\n 'setup-launchdaemon': async (context) => {\n if (!context.userConfig || !context.brokerInstalled) {\n return { success: false, error: 'Required context not set' };\n }\n\n const plistPath = '/Library/LaunchDaemons/com.agenshield.broker.plist';\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.launchDaemon = {\n plistPath,\n loaded: false,\n };\n return { success: true };\n }\n\n try {\n const { execSync } = await import('node:child_process');\n const brokerUsername = context.userConfig.brokerUser.username;\n const socketGroupName = context.userConfig.groups.socket.name;\n\n // Remove stale socket from previous installs (may be root-owned, causing EACCES)\n logVerbose('Removing stale socket file if present', context);\n logVerbose('Running: sudo rm -f /var/run/agenshield/agenshield.sock', context);\n execSync(`sudo rm -f /var/run/agenshield/agenshield.sock`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Ensure log files exist with correct ownership BEFORE loading daemon.\n // launchd opens stdout/stderr files at process start; if they don't exist\n // or are root-owned, the broker's output may be lost.\n logVerbose('Ensuring log files have correct ownership', context);\n logVerbose('Running: sudo mkdir -p /var/log/agenshield', context);\n execSync(`sudo mkdir -p /var/log/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });\n logVerbose('Running: sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log', context);\n execSync(`sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });\n logVerbose(`Running: sudo chown ${brokerUsername}:${socketGroupName} /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, context);\n execSync(`sudo chown ${brokerUsername}:${socketGroupName} /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Bootout any stale broker daemon entry from a previous install.\n // Without this, `launchctl load` may no-op if the old entry is cached.\n logVerbose('Removing stale launchd entry if present', context);\n logVerbose('Running: sudo launchctl bootout system/com.agenshield.broker', context);\n try {\n execSync(`sudo launchctl bootout system/com.agenshield.broker 2>/dev/null`, { encoding: 'utf-8', stdio: 'pipe' });\n } catch {\n // Not loaded — that's fine\n }\n\n // Generate plist\n const plist = generateBrokerPlist(context.userConfig, {\n brokerPath: context.brokerInstalled.binaryPath,\n });\n\n // Install and load\n const result = await installLaunchDaemon(plist);\n\n if (!result.success) {\n return { success: false, error: result.message };\n }\n\n // Force-start the broker immediately. launchctl load + RunAtLoad may not\n // start the process if launchd throttles it (e.g. ThrottleInterval from a\n // prior crashed run). kickstart bypasses throttling.\n logVerbose('Kickstarting broker daemon', context);\n logVerbose('Running: sudo launchctl kickstart system/com.agenshield.broker', context);\n try {\n execSync(`sudo launchctl kickstart system/com.agenshield.broker`, { encoding: 'utf-8', stdio: 'pipe' });\n } catch {\n // May fail if already running from RunAtLoad — that's fine\n }\n\n // Fix socket permissions after broker starts\n // This ensures the daemon user can access the broker socket\n const socketResult = await fixSocketPermissions(context.userConfig);\n if (!socketResult.success) {\n // Non-fatal: log warning but continue\n console.warn(`[Setup] Warning: ${socketResult.message}`);\n }\n\n context.launchDaemon = {\n plistPath: result.plistPath!,\n loaded: result.loaded || false,\n };\n\n return { success: true };\n } catch (err) {\n return {\n success: false,\n error: `Failed to setup LaunchDaemon: ${(err as Error).message}`,\n };\n }\n },\n\n // NOTE: migrate step removed — replaced by install-openclaw + copy-openclaw-config\n\n verify: async (context) => {\n if (!context.userConfig) {\n return { success: false, error: 'Configuration not set' };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.verification = {\n usersValid: true,\n groupsValid: true,\n directoriesValid: true,\n socketValid: true,\n daemonRunning: false,\n networkBlocked: true,\n };\n return { success: true };\n }\n\n // Verify users and groups\n const userResult = await verifyUsersAndGroups(context.userConfig);\n if (!userResult.valid) {\n return {\n success: false,\n error: `Missing users: ${userResult.missingUsers.join(', ')}; Missing groups: ${userResult.missingGroups.join(', ')}`,\n };\n }\n\n // Verify directories\n const dirResult = await verifyDirectories(context.userConfig);\n if (!dirResult.valid) {\n const parts: string[] = [];\n if (dirResult.missing.length > 0) {\n parts.push(`Missing directories: ${dirResult.missing.join(', ')}`);\n }\n if (dirResult.incorrect.length > 0) {\n parts.push(`Incorrect directories: ${dirResult.incorrect.map(d => `${d.path} (${d.issue})`).join(', ')}`);\n }\n return {\n success: false,\n error: parts.join('; ') || 'Directory verification failed',\n };\n }\n\n // NOTE: We skip running the target binary during setup verification.\n // The interceptor (loaded via NODE_OPTIONS) would try to connect to the\n // broker, which isn't running yet, causing ETIMEDOUT errors.\n // The users/groups/directories verification above is sufficient.\n\n context.verification = {\n usersValid: true,\n groupsValid: true,\n directoriesValid: true,\n socketValid: context.socketSetup?.success || false,\n daemonRunning: context.launchDaemon?.loaded || false,\n networkBlocked: true, // Assumed true if seatbelt is installed\n };\n\n return { success: true };\n },\n\n 'setup-passcode': async (context) => {\n // Check if user chose to skip\n if (context.passcodeSetup?.skipped) {\n context.passcodeSetup = { configured: false, skipped: true };\n return { success: true };\n }\n\n // Check if passcode value was provided by the UI\n if (!context.passcodeValue) {\n // No passcode provided - skip (user declined in UI)\n context.passcodeSetup = { configured: false, skipped: true };\n return { success: true };\n }\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.passcodeSetup = { configured: true, skipped: false };\n // Clear the passcode from context\n context.passcodeValue = undefined;\n return { success: true };\n }\n\n try {\n // Hash the passcode using PBKDF2 (same as daemon's auth/passcode.ts)\n const ITERATIONS = 100000;\n const KEY_LENGTH = 64;\n const DIGEST = 'sha512';\n const SALT_LENGTH = 16;\n\n const salt = crypto.randomBytes(SALT_LENGTH);\n const derivedKey = await new Promise<Buffer>((resolve, reject) => {\n crypto.pbkdf2(context.passcodeValue!, salt, ITERATIONS, KEY_LENGTH, DIGEST, (err, key) => {\n if (err) reject(err);\n else resolve(key);\n });\n });\n\n const hash = `${ITERATIONS}:${salt.toString('base64')}:${derivedKey.toString('base64')}`;\n\n const passcodeData: PasscodeData = {\n hash,\n setAt: new Date().toISOString(),\n };\n\n // Save passcode to vault\n const { getVault } = await import('@agenshield/daemon');\n const vault = getVault();\n await vault.set('passcode', passcodeData);\n\n // Enable passcode protection in state\n const { updatePasscodeProtectionState } = await import('@agenshield/daemon');\n updatePasscodeProtectionState({ enabled: true });\n\n context.passcodeSetup = { configured: true, skipped: false };\n\n // Clear the passcode from context for security\n context.passcodeValue = undefined;\n\n return { success: true };\n } catch (err) {\n // Clear the passcode from context even on failure\n context.passcodeValue = undefined;\n return {\n success: false,\n error: `Failed to setup passcode: ${(err as Error).message}`,\n };\n }\n },\n\n complete: async (_context) => {\n // Final step - nothing to do\n return { success: true };\n },\n};\n\n/**\n * Run a subset of steps\n */\nasync function runSteps(\n state: WizardState,\n context: WizardContext,\n stepIds: WizardStepId[],\n onStateChange?: (state: WizardState) => void\n): Promise<{ success: boolean; error?: string }> {\n for (const stepId of stepIds) {\n const stepIndex = state.steps.findIndex((s) => s.id === stepId);\n if (stepIndex === -1) continue;\n\n state.currentStep = stepIndex;\n const step = state.steps[stepIndex];\n\n // Update step status to running\n step.status = 'running';\n _currentStepId = stepId;\n logVerbose(`▶ Starting step: ${step.name} (${step.id})`, context);\n onStateChange?.(state);\n\n // Yield a macrotask tick so the SSE 'running' event flushes to the browser\n // before the step executor (which may use execSync) blocks the event loop.\n await new Promise(resolve => setTimeout(resolve, 0));\n\n // Execute the step\n const executor = stepExecutors[stepId];\n if (!executor) {\n step.status = 'error';\n step.error = `No executor for step: ${step.id}`;\n state.hasError = true;\n _currentStepId = undefined;\n logVerbose(`✗ Step ${step.id}: no executor found`, context);\n onStateChange?.(state);\n return { success: false, error: step.error };\n }\n\n const result = await executeStep(step, context, executor);\n _currentStepId = undefined;\n\n if (result.success) {\n step.status = 'completed';\n logVerbose(`✓ Completed step: ${step.name}`, context);\n } else {\n step.status = 'error';\n step.error = result.error;\n state.hasError = true;\n logVerbose(`✗ Failed step: ${step.name} — ${result.error}`, context);\n onStateChange?.(state);\n return { success: false, error: result.error };\n }\n\n onStateChange?.(state);\n }\n\n return { success: true };\n}\n\n/**\n * Create a new wizard engine\n */\nexport function createWizardEngine(options?: WizardOptions): WizardEngine {\n const state: WizardState = {\n currentStep: 0,\n steps: createWizardSteps(),\n isComplete: false,\n hasError: false,\n };\n\n const context: WizardContext = {\n options,\n };\n\n const engine: WizardEngine = {\n state,\n context,\n onStateChange: undefined,\n\n /**\n * Run detection phase only (prerequisites + detect + configure)\n * Called first, then waits for user confirmation\n */\n async runDetectionPhase() {\n const detectionSteps = getStepsByPhase('detection').filter((id) => id !== 'confirm');\n const result = await runSteps(state, context, detectionSteps, engine.onStateChange);\n return result;\n },\n\n /**\n * Run setup phase — all setup steps from confirm through complete.\n * Called after user confirms they want to proceed.\n * Excludes: setup-passcode, open-dashboard, complete (handled by runFinalPhase).\n */\n async runSetupPhase() {\n const excludeFromSetup: WizardStepId[] = [\n 'setup-passcode', 'open-dashboard', 'complete',\n ];\n\n // Prompt for sudo credentials before privileged steps (skip in dry-run)\n if (!context.options?.dryRun) {\n const { ensureSudoAccess, startSudoKeepalive } = await import('../utils/privileges.js');\n ensureSudoAccess();\n const keepalive = startSudoKeepalive();\n try {\n const setupSteps: WizardStepId[] = ['confirm', ...getStepsByPhase('setup')\n .filter((id) => !excludeFromSetup.includes(id))];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n } finally {\n clearInterval(keepalive);\n }\n return;\n }\n // dry-run path\n const setupSteps: WizardStepId[] = ['confirm', ...getStepsByPhase('setup')\n .filter((id) => !excludeFromSetup.includes(id))];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n },\n\n /**\n * Run migration phase — no longer needed in new flow.\n * Kept for backward compatibility; does nothing.\n * @deprecated Use runSetupPhase() which now includes install-openclaw + copy-openclaw-config.\n */\n async runMigrationPhase() {\n // Migration is now part of the setup phase (install-openclaw + copy-openclaw-config)\n return;\n },\n\n /**\n * Run final phase (setup-passcode, open-dashboard, and complete)\n * Called after the passcode UI has collected the passcode value\n */\n async runFinalPhase() {\n const finalSteps: WizardStepId[] = ['setup-passcode', 'open-dashboard', 'complete'];\n await runSteps(state, context, finalSteps, engine.onStateChange);\n\n if (!state.hasError) {\n state.isComplete = true;\n engine.onStateChange?.(state);\n }\n },\n\n /**\n * Run all steps sequentially (for backwards compatibility)\n */\n async run() {\n await runSteps(state, context, getAllStepIds(), engine.onStateChange);\n\n if (!state.hasError) {\n state.isComplete = true;\n engine.onStateChange?.(state);\n }\n },\n };\n\n return engine;\n}\n"]}