agenshield 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -8
- package/src/commands/setup.d.ts.map +1 -1
- package/src/commands/setup.js +61 -0
- package/src/commands/setup.js.map +1 -1
- package/src/wizard/engine.d.ts.map +1 -1
- package/src/wizard/engine.js +9 -1
- package/src/wizard/engine.js.map +1 -1
- package/src/wizard/types.d.ts +2 -0
- package/src/wizard/types.d.ts.map +1 -1
- package/src/wizard/types.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agenshield",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgenShield - CLI for managing AI agent security sandbox",
|
|
6
6
|
"main": "./src/index.js",
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
"sandbox"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@agenshield/broker": "0.
|
|
41
|
-
"@agenshield/daemon": "0.
|
|
42
|
-
"@agenshield/interceptor": "0.
|
|
43
|
-
"@agenshield/ipc": "0.
|
|
44
|
-
"@agenshield/patcher": "0.
|
|
45
|
-
"@agenshield/sandbox": "0.
|
|
46
|
-
"@agenshield/skills": "0.
|
|
40
|
+
"@agenshield/broker": "0.6.0",
|
|
41
|
+
"@agenshield/daemon": "0.6.0",
|
|
42
|
+
"@agenshield/interceptor": "0.6.0",
|
|
43
|
+
"@agenshield/ipc": "0.6.0",
|
|
44
|
+
"@agenshield/patcher": "0.6.0",
|
|
45
|
+
"@agenshield/sandbox": "0.6.0",
|
|
46
|
+
"@agenshield/skills": "0.6.0",
|
|
47
47
|
"commander": "^14.0.0",
|
|
48
48
|
"ink": "^5.2.0",
|
|
49
49
|
"ink-spinner": "^5.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8LpC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAkF5C"}
|
package/src/commands/setup.js
CHANGED
|
@@ -7,10 +7,67 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Command } from 'commander';
|
|
9
9
|
import React from 'react';
|
|
10
|
+
import readline from 'node:readline';
|
|
10
11
|
import { render } from 'ink';
|
|
11
12
|
import { WizardApp } from '../wizard/index.js';
|
|
12
13
|
import { formatPresetList, getPreset } from '@agenshield/sandbox';
|
|
13
14
|
import { createWizardEngine } from '../wizard/engine.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check for an existing AgenShield installation and offer to uninstall it.
|
|
17
|
+
* Equivalent to running `agenshield uninstall --skip-backup --force` before setup.
|
|
18
|
+
*/
|
|
19
|
+
async function checkExistingInstallation(options) {
|
|
20
|
+
const { ensureSudoAccess } = await import('../utils/privileges.js');
|
|
21
|
+
ensureSudoAccess();
|
|
22
|
+
const { canUninstall, forceUninstall } = await import('@agenshield/sandbox');
|
|
23
|
+
const check = canUninstall();
|
|
24
|
+
if (!check.hasBackup)
|
|
25
|
+
return; // No existing installation
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log(' AgenShield is already installed.');
|
|
28
|
+
if (check.backup) {
|
|
29
|
+
console.log(` Backup from: ${check.backup.timestamp}`);
|
|
30
|
+
}
|
|
31
|
+
console.log('');
|
|
32
|
+
if (!options.skipConfirm) {
|
|
33
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
34
|
+
const answer = await new Promise((resolve) => {
|
|
35
|
+
rl.question(' Uninstall existing installation and re-setup? [y/N] ', (ans) => {
|
|
36
|
+
rl.close();
|
|
37
|
+
resolve(ans);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 'yes') {
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log(' Setup cancelled.');
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log(' --skip-confirm: auto-uninstalling existing installation...');
|
|
48
|
+
}
|
|
49
|
+
// Stop daemon
|
|
50
|
+
console.log('');
|
|
51
|
+
console.log(' Stopping daemon...');
|
|
52
|
+
const { stopDaemon } = await import('../utils/daemon.js');
|
|
53
|
+
await stopDaemon();
|
|
54
|
+
// Force uninstall
|
|
55
|
+
console.log(' Uninstalling existing installation...');
|
|
56
|
+
console.log('');
|
|
57
|
+
const result = forceUninstall((progress) => {
|
|
58
|
+
const icon = progress.success ? '\x1b[32m✓\x1b[0m' : '\x1b[31m✗\x1b[0m';
|
|
59
|
+
console.log(` ${icon} ${progress.step}: ${progress.message || progress.error || ''}`);
|
|
60
|
+
});
|
|
61
|
+
if (!result.success) {
|
|
62
|
+
console.error('');
|
|
63
|
+
console.error(` \x1b[31mUninstall failed: ${result.error}\x1b[0m`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(' \x1b[32mExisting installation removed.\x1b[0m');
|
|
68
|
+
console.log(' Proceeding with fresh setup...');
|
|
69
|
+
console.log('');
|
|
70
|
+
}
|
|
14
71
|
/**
|
|
15
72
|
* Run the setup wizard (CLI/Ink mode)
|
|
16
73
|
*/
|
|
@@ -165,6 +222,10 @@ export function createSetupCommand() {
|
|
|
165
222
|
process.exit(1);
|
|
166
223
|
}
|
|
167
224
|
}
|
|
225
|
+
// Check for existing installation (skip in dry-run mode)
|
|
226
|
+
if (!options.dryRun) {
|
|
227
|
+
await checkExistingInstallation({ skipConfirm: options.skipConfirm });
|
|
228
|
+
}
|
|
168
229
|
// Default to Web UI unless --cli is specified or env var opts out
|
|
169
230
|
if (!options.cli && process.env['AGENSHIELD_WEBUI_REQUESTED'] !== 'false') {
|
|
170
231
|
delete process.env['AGENSHIELD_WEBUI_REQUESTED'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Setup command\n *\n * Runs the interactive setup wizard to sandbox a target application.\n * Supports presets (openclaw, custom) and configurable naming.\n * With --ui flag, launches a web-based setup wizard.\n */\n\nimport { Command } from 'commander';\nimport React from 'react';\nimport { render } from 'ink';\nimport { WizardApp } from '../wizard/index.js';\nimport { formatPresetList, getPreset } from '@agenshield/sandbox';\nimport { createWizardEngine } from '../wizard/engine.js';\nimport type { WizardOptions } from '../wizard/types.js';\n\n/**\n * Run the setup wizard (CLI/Ink mode)\n */\nasync function runSetup(): Promise<void> {\n const { waitUntilExit } = render(React.createElement(WizardApp));\n await waitUntilExit();\n}\n\n/**\n * Run the setup wizard in web UI mode\n */\nasync function runSetupWebUI(wizardOptions: WizardOptions): Promise<void> {\n const { createSetupServer } = await import('../setup-server/index.js');\n\n console.log('');\n console.log(' Starting Web UI Setup Wizard...');\n console.log('');\n\n // Create wizard engine and run detection phase BEFORE server starts\n const engine = createWizardEngine(wizardOptions);\n const detectionResult = await engine.runDetectionPhase();\n\n if (!detectionResult.success) {\n console.error(` Detection failed: ${detectionResult.error}`);\n process.exit(1);\n }\n\n if (engine.context.presetDetection?.found) {\n console.log(` Detected: ${engine.context.preset?.name ?? 'Unknown target'}`);\n } else if (engine.context.targetInstallable) {\n console.log(` No target found — Web UI will offer installation.`);\n } else {\n console.error(' No supported target found. Use --target custom --entry-point <path> for custom applications.');\n process.exit(1);\n }\n console.log('');\n\n // Acquire sudo credentials now (in the terminal) before opening the browser,\n // so the setup phase can use cached credentials without a TTY prompt.\n if (!wizardOptions.dryRun) {\n const { ensureSudoAccess } = await import('../utils/privileges.js');\n ensureSudoAccess();\n }\n\n // Create and start the setup server on a different port than daemon (5200)\n const server = createSetupServer(engine);\n const port = 5200; // Setup wizard uses 5200, daemon uses 5200\n const url = await server.start(port);\n\n console.log(` Setup wizard is running at: ${url}`);\n console.log('');\n console.log(' Opening browser...');\n console.log(' (If the browser does not open, visit the URL above manually)');\n console.log('');\n\n // Open browser (macOS)\n try {\n const { exec } = await import('node:child_process');\n exec(`open \"${url}\"`);\n } catch {\n // Non-fatal — user can open the URL manually\n }\n\n // Wait for setup to complete or be cancelled (SIGINT/SIGTERM)\n const completionOrSignal = Promise.race([\n server.waitForCompletion(),\n new Promise<void>((resolve) => {\n process.on('SIGINT', resolve);\n process.on('SIGTERM', resolve);\n }),\n ]);\n\n await completionOrSignal;\n console.log(' Setup complete! Shutting down server...');\n await server.stop();\n\n // Stop any existing daemon first\n console.log(' Stopping any existing daemon...');\n const { startDaemon, stopDaemon } = await import('../utils/daemon.js');\n await stopDaemon();\n\n // Kill any process on port 5200 (daemon port)\n try {\n const { execSync } = await import('node:child_process');\n execSync('lsof -i :5200 -t 2>/dev/null | xargs kill -9 2>/dev/null || true', { encoding: 'utf-8' });\n await new Promise(r => setTimeout(r, 500));\n } catch { /* ignore */ }\n\n // Start the daemon on port 5200\n console.log(' Starting daemon...');\n const daemonResult = await startDaemon();\n if (daemonResult.success) {\n console.log(` Daemon started (PID: ${daemonResult.pid})`);\n console.log(` Dashboard available at: http://localhost:5200`);\n } else {\n console.warn(` Warning: ${daemonResult.message}`);\n }\n\n // Force exit after grace period\n setTimeout(() => process.exit(0), 500).unref();\n}\n\n/**\n * Build WizardOptions from CLI options\n */\nfunction buildWizardOptions(options: Record<string, unknown>): WizardOptions {\n const wizardOptions: WizardOptions = {};\n if (options['target']) wizardOptions.targetPreset = options['target'] as string;\n if (options['entryPoint']) wizardOptions.entryPoint = options['entryPoint'] as string;\n if (options['baseName']) wizardOptions.baseName = options['baseName'] as string;\n if (options['prefix']) wizardOptions.prefix = options['prefix'] as string;\n if (options['baseUid']) wizardOptions.baseUid = options['baseUid'] as number;\n if (options['dryRun']) wizardOptions.dryRun = true;\n if (options['skipConfirm']) wizardOptions.skipConfirm = true;\n if (options['verbose']) wizardOptions.verbose = true;\n return wizardOptions;\n}\n\n/**\n * Create the setup command\n */\nexport function createSetupCommand(): Command {\n const cmd = new Command('setup')\n .description('Run the setup wizard to sandbox a target application')\n .option('--target <preset>', 'Target preset to use: openclaw, custom (default: auto-detect)')\n .option('--entry-point <path>', 'Entry point for custom target (Node.js file)')\n .option('--base-name <name>', 'Base name for users/groups (default: agenshield)')\n .option('--prefix <prefix>', 'Use a custom prefix for users/groups (for testing)')\n .option('--base-uid <uid>', 'Base UID for created users', parseInt)\n .option('--dry-run', 'Show what would be done without making changes')\n .option('--skip-confirm', 'Skip confirmation prompts')\n .option('-v, --verbose', 'Show verbose output')\n .option('--list-presets', 'List available presets and exit')\n .option('--cli', 'Use terminal/Ink UI instead of web browser')\n .action(async (options) => {\n // Handle --list-presets\n if (options.listPresets) {\n console.log(formatPresetList());\n return;\n }\n\n // Validate --target option\n if (options.target) {\n const preset = getPreset(options.target);\n if (!preset) {\n console.error(`Error: Unknown preset '${options.target}'`);\n console.error('');\n console.error(formatPresetList());\n process.exit(1);\n }\n\n // Custom preset requires --entry-point\n if (options.target === 'custom' && !options.entryPoint) {\n console.error('Error: --entry-point is required when using --target custom');\n console.error('');\n console.error('Example:');\n console.error(' agenshield setup --target custom --entry-point /path/to/my-app/dist/index.js');\n process.exit(1);\n }\n }\n\n\n\n // Default to Web UI unless --cli is specified or env var opts out\n if (!options.cli && process.env['AGENSHIELD_WEBUI_REQUESTED'] !== 'false') {\n delete process.env['AGENSHIELD_WEBUI_REQUESTED'];\n await runSetupWebUI(buildWizardOptions(options));\n return;\n }\n\n // Store options in environment for wizard to pick up\n if (options.target) {\n process.env['AGENSHIELD_TARGET'] = options.target;\n }\n if (options.entryPoint) {\n process.env['AGENSHIELD_ENTRY_POINT'] = options.entryPoint;\n }\n if (options.baseName) {\n process.env['AGENSHIELD_BASE_NAME'] = options.baseName;\n }\n if (options.prefix) {\n process.env['AGENSHIELD_PREFIX'] = options.prefix;\n }\n if (options.baseUid) {\n process.env['AGENSHIELD_BASE_UID'] = String(options.baseUid);\n }\n if (options.dryRun) {\n process.env['AGENSHIELD_DRY_RUN'] = 'true';\n }\n if (options.skipConfirm) {\n process.env['AGENSHIELD_SKIP_CONFIRM'] = 'true';\n }\n if (options.verbose) {\n process.env['AGENSHIELD_VERBOSE'] = 'true';\n }\n\n await runSetup();\n });\n\n return cmd;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Setup command\n *\n * Runs the interactive setup wizard to sandbox a target application.\n * Supports presets (openclaw, custom) and configurable naming.\n * With --ui flag, launches a web-based setup wizard.\n */\n\nimport { Command } from 'commander';\nimport React from 'react';\nimport readline from 'node:readline';\nimport { render } from 'ink';\nimport { WizardApp } from '../wizard/index.js';\nimport { formatPresetList, getPreset } from '@agenshield/sandbox';\nimport { createWizardEngine } from '../wizard/engine.js';\nimport type { WizardOptions } from '../wizard/types.js';\n\n/**\n * Check for an existing AgenShield installation and offer to uninstall it.\n * Equivalent to running `agenshield uninstall --skip-backup --force` before setup.\n */\nasync function checkExistingInstallation(options: { skipConfirm?: boolean }): Promise<void> {\n const { ensureSudoAccess } = await import('../utils/privileges.js');\n ensureSudoAccess();\n\n const { canUninstall, forceUninstall } = await import('@agenshield/sandbox');\n const check = canUninstall();\n\n if (!check.hasBackup) return; // No existing installation\n\n console.log('');\n console.log(' AgenShield is already installed.');\n if (check.backup) {\n console.log(` Backup from: ${check.backup.timestamp}`);\n }\n console.log('');\n\n if (!options.skipConfirm) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(' Uninstall existing installation and re-setup? [y/N] ', (ans) => {\n rl.close();\n resolve(ans);\n });\n });\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 'yes') {\n console.log('');\n console.log(' Setup cancelled.');\n process.exit(0);\n }\n } else {\n console.log(' --skip-confirm: auto-uninstalling existing installation...');\n }\n\n // Stop daemon\n console.log('');\n console.log(' Stopping daemon...');\n const { stopDaemon } = await import('../utils/daemon.js');\n await stopDaemon();\n\n // Force uninstall\n console.log(' Uninstalling existing installation...');\n console.log('');\n const result = forceUninstall((progress) => {\n const icon = progress.success ? '\\x1b[32m✓\\x1b[0m' : '\\x1b[31m✗\\x1b[0m';\n console.log(` ${icon} ${progress.step}: ${progress.message || progress.error || ''}`);\n });\n\n if (!result.success) {\n console.error('');\n console.error(` \\x1b[31mUninstall failed: ${result.error}\\x1b[0m`);\n process.exit(1);\n }\n\n console.log('');\n console.log(' \\x1b[32mExisting installation removed.\\x1b[0m');\n console.log(' Proceeding with fresh setup...');\n console.log('');\n}\n\n/**\n * Run the setup wizard (CLI/Ink mode)\n */\nasync function runSetup(): Promise<void> {\n const { waitUntilExit } = render(React.createElement(WizardApp));\n await waitUntilExit();\n}\n\n/**\n * Run the setup wizard in web UI mode\n */\nasync function runSetupWebUI(wizardOptions: WizardOptions): Promise<void> {\n const { createSetupServer } = await import('../setup-server/index.js');\n\n console.log('');\n console.log(' Starting Web UI Setup Wizard...');\n console.log('');\n\n // Create wizard engine and run detection phase BEFORE server starts\n const engine = createWizardEngine(wizardOptions);\n const detectionResult = await engine.runDetectionPhase();\n\n if (!detectionResult.success) {\n console.error(` Detection failed: ${detectionResult.error}`);\n process.exit(1);\n }\n\n if (engine.context.presetDetection?.found) {\n console.log(` Detected: ${engine.context.preset?.name ?? 'Unknown target'}`);\n } else if (engine.context.targetInstallable) {\n console.log(` No target found — Web UI will offer installation.`);\n } else {\n console.error(' No supported target found. Use --target custom --entry-point <path> for custom applications.');\n process.exit(1);\n }\n console.log('');\n\n // Acquire sudo credentials now (in the terminal) before opening the browser,\n // so the setup phase can use cached credentials without a TTY prompt.\n if (!wizardOptions.dryRun) {\n const { ensureSudoAccess } = await import('../utils/privileges.js');\n ensureSudoAccess();\n }\n\n // Create and start the setup server on a different port than daemon (5200)\n const server = createSetupServer(engine);\n const port = 5200; // Setup wizard uses 5200, daemon uses 5200\n const url = await server.start(port);\n\n console.log(` Setup wizard is running at: ${url}`);\n console.log('');\n console.log(' Opening browser...');\n console.log(' (If the browser does not open, visit the URL above manually)');\n console.log('');\n\n // Open browser (macOS)\n try {\n const { exec } = await import('node:child_process');\n exec(`open \"${url}\"`);\n } catch {\n // Non-fatal — user can open the URL manually\n }\n\n // Wait for setup to complete or be cancelled (SIGINT/SIGTERM)\n const completionOrSignal = Promise.race([\n server.waitForCompletion(),\n new Promise<void>((resolve) => {\n process.on('SIGINT', resolve);\n process.on('SIGTERM', resolve);\n }),\n ]);\n\n await completionOrSignal;\n console.log(' Setup complete! Shutting down server...');\n await server.stop();\n\n // Stop any existing daemon first\n console.log(' Stopping any existing daemon...');\n const { startDaemon, stopDaemon } = await import('../utils/daemon.js');\n await stopDaemon();\n\n // Kill any process on port 5200 (daemon port)\n try {\n const { execSync } = await import('node:child_process');\n execSync('lsof -i :5200 -t 2>/dev/null | xargs kill -9 2>/dev/null || true', { encoding: 'utf-8' });\n await new Promise(r => setTimeout(r, 500));\n } catch { /* ignore */ }\n\n // Start the daemon on port 5200\n console.log(' Starting daemon...');\n const daemonResult = await startDaemon();\n if (daemonResult.success) {\n console.log(` Daemon started (PID: ${daemonResult.pid})`);\n console.log(` Dashboard available at: http://localhost:5200`);\n } else {\n console.warn(` Warning: ${daemonResult.message}`);\n }\n\n // Force exit after grace period\n setTimeout(() => process.exit(0), 500).unref();\n}\n\n/**\n * Build WizardOptions from CLI options\n */\nfunction buildWizardOptions(options: Record<string, unknown>): WizardOptions {\n const wizardOptions: WizardOptions = {};\n if (options['target']) wizardOptions.targetPreset = options['target'] as string;\n if (options['entryPoint']) wizardOptions.entryPoint = options['entryPoint'] as string;\n if (options['baseName']) wizardOptions.baseName = options['baseName'] as string;\n if (options['prefix']) wizardOptions.prefix = options['prefix'] as string;\n if (options['baseUid']) wizardOptions.baseUid = options['baseUid'] as number;\n if (options['dryRun']) wizardOptions.dryRun = true;\n if (options['skipConfirm']) wizardOptions.skipConfirm = true;\n if (options['verbose']) wizardOptions.verbose = true;\n return wizardOptions;\n}\n\n/**\n * Create the setup command\n */\nexport function createSetupCommand(): Command {\n const cmd = new Command('setup')\n .description('Run the setup wizard to sandbox a target application')\n .option('--target <preset>', 'Target preset to use: openclaw, custom (default: auto-detect)')\n .option('--entry-point <path>', 'Entry point for custom target (Node.js file)')\n .option('--base-name <name>', 'Base name for users/groups (default: agenshield)')\n .option('--prefix <prefix>', 'Use a custom prefix for users/groups (for testing)')\n .option('--base-uid <uid>', 'Base UID for created users', parseInt)\n .option('--dry-run', 'Show what would be done without making changes')\n .option('--skip-confirm', 'Skip confirmation prompts')\n .option('-v, --verbose', 'Show verbose output')\n .option('--list-presets', 'List available presets and exit')\n .option('--cli', 'Use terminal/Ink UI instead of web browser')\n .action(async (options) => {\n // Handle --list-presets\n if (options.listPresets) {\n console.log(formatPresetList());\n return;\n }\n\n // Validate --target option\n if (options.target) {\n const preset = getPreset(options.target);\n if (!preset) {\n console.error(`Error: Unknown preset '${options.target}'`);\n console.error('');\n console.error(formatPresetList());\n process.exit(1);\n }\n\n // Custom preset requires --entry-point\n if (options.target === 'custom' && !options.entryPoint) {\n console.error('Error: --entry-point is required when using --target custom');\n console.error('');\n console.error('Example:');\n console.error(' agenshield setup --target custom --entry-point /path/to/my-app/dist/index.js');\n process.exit(1);\n }\n }\n\n // Check for existing installation (skip in dry-run mode)\n if (!options.dryRun) {\n await checkExistingInstallation({ skipConfirm: options.skipConfirm });\n }\n\n // Default to Web UI unless --cli is specified or env var opts out\n if (!options.cli && process.env['AGENSHIELD_WEBUI_REQUESTED'] !== 'false') {\n delete process.env['AGENSHIELD_WEBUI_REQUESTED'];\n await runSetupWebUI(buildWizardOptions(options));\n return;\n }\n\n // Store options in environment for wizard to pick up\n if (options.target) {\n process.env['AGENSHIELD_TARGET'] = options.target;\n }\n if (options.entryPoint) {\n process.env['AGENSHIELD_ENTRY_POINT'] = options.entryPoint;\n }\n if (options.baseName) {\n process.env['AGENSHIELD_BASE_NAME'] = options.baseName;\n }\n if (options.prefix) {\n process.env['AGENSHIELD_PREFIX'] = options.prefix;\n }\n if (options.baseUid) {\n process.env['AGENSHIELD_BASE_UID'] = String(options.baseUid);\n }\n if (options.dryRun) {\n process.env['AGENSHIELD_DRY_RUN'] = 'true';\n }\n if (options.skipConfirm) {\n process.env['AGENSHIELD_SKIP_CONFIRM'] = 'true';\n }\n if (options.verbose) {\n process.env['AGENSHIELD_VERBOSE'] = 'true';\n }\n\n await runSetup();\n });\n\n return cmd;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EAEb,aAAa,EACd,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAYrG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,kCAAkC;IAClC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,oEAAoE;IACpE,iBAAiB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,+EAA+E;IAC/E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,+EAA+E;IAC/E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AA09BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAgFxE"}
|
package/src/wizard/engine.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Wizard engine - orchestrates the setup steps
|
|
3
3
|
*/
|
|
4
4
|
import * as crypto from 'node:crypto';
|
|
5
|
-
import { checkPrerequisites, saveBackup, backupOriginalConfig, createUserConfig, createGroups, createAgentUser, createBrokerUser, createAllDirectories, setupSocketDirectory, verifyUsersAndGroups, verifyDirectories, generateAgentProfile, installSeatbeltProfiles, installAllWrappers, installPresetBinaries, generateBrokerPlist, installLaunchDaemon, fixSocketPermissions, createPathsConfig, deployInterceptor, copyNodeBinary, copyBrokerBinary, installGuardedShell,
|
|
5
|
+
import { checkPrerequisites, saveBackup, backupOriginalConfig, createUserConfig, createGroups, createAgentUser, createBrokerUser, createAllDirectories, setupSocketDirectory, verifyUsersAndGroups, verifyDirectories, generateAgentProfile, installSeatbeltProfiles, installAllWrappers, installPresetBinaries, generateBrokerPlist, installLaunchDaemon, fixSocketPermissions, createPathsConfig, deployInterceptor, copyNodeBinary, copyBrokerBinary, copyShieldClient, installGuardedShell,
|
|
6
6
|
// Preset system
|
|
7
7
|
getPreset, autoDetectPreset, } from '@agenshield/sandbox';
|
|
8
8
|
import { createWizardSteps, getStepsByPhase, getAllStepIds } from './types.js';
|
|
@@ -426,6 +426,7 @@ const stepExecutors = {
|
|
|
426
426
|
userConfig: context.userConfig,
|
|
427
427
|
binDir: context.directories.binDir,
|
|
428
428
|
socketGroupName: context.userConfig.groups.socket.name,
|
|
429
|
+
nodeVersion: context.options?.nodeVersion,
|
|
429
430
|
verbose: context.options?.verbose,
|
|
430
431
|
});
|
|
431
432
|
context.wrappersInstalled = result.installedWrappers;
|
|
@@ -483,6 +484,12 @@ const stepExecutors = {
|
|
|
483
484
|
binaryPath: brokerPath,
|
|
484
485
|
success: true,
|
|
485
486
|
};
|
|
487
|
+
// Also install shield-client (used by curl/git/etc. wrappers)
|
|
488
|
+
logVerbose('Installing shield-client to /opt/agenshield/bin/shield-client', context);
|
|
489
|
+
const clientResult = await copyShieldClient(context.userConfig);
|
|
490
|
+
if (!clientResult.success) {
|
|
491
|
+
logVerbose(`Warning: shield-client install failed: ${clientResult.message}`, context);
|
|
492
|
+
}
|
|
486
493
|
return { success: true };
|
|
487
494
|
},
|
|
488
495
|
'install-daemon-config': async (context) => {
|
|
@@ -509,6 +516,7 @@ const stepExecutors = {
|
|
|
509
516
|
socketGroup: socketGroupName,
|
|
510
517
|
policiesPath: '/opt/agenshield/policies',
|
|
511
518
|
auditLogPath: '/var/log/agenshield/audit.log',
|
|
519
|
+
agentHome: context.userConfig.agentUser.home,
|
|
512
520
|
}, null, 2);
|
|
513
521
|
logVerbose(`Writing daemon config to ${configPath}`, context);
|
|
514
522
|
// Write config file via sudo tee
|
package/src/wizard/engine.js.map
CHANGED
|
@@ -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 saveBackup,\n backupOriginalConfig,\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 installGuardedShell,\n // Preset system\n getPreset,\n autoDetectPreset,\n type MigrationContext,\n type MigrationDirectories,\n} from '@agenshield/sandbox';\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 * Verbose logging helper - logs messages when verbose mode is enabled\n * Uses stderr to bypass Ink's stdout capture\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}\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 verify, excludes passcode and complete) */\n runSetupPhase(): 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 context.preset = preset;\n context.presetDetection = { 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 const openclawPreset = getPreset('openclaw');\n if (openclawPreset) {\n context.preset = openclawPreset;\n context.presetDetection = { 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 execSync('npm install -g openclaw', {\n encoding: 'utf-8',\n timeout: 120_000,\n stdio: 'pipe',\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 backup: async (context) => {\n if (!context.presetDetection) {\n return { success: false, error: 'No target detected' };\n }\n\n // Skip actual backup in dry-run mode\n if (context.options?.dryRun) {\n context.originalInstallation = {\n method: (context.presetDetection.method as 'npm' | 'git') || 'npm',\n packagePath: context.presetDetection.packagePath || '',\n binaryPath: context.presetDetection.binaryPath,\n configPath: context.presetDetection.configPath,\n version: context.presetDetection.version,\n };\n return { success: true };\n }\n\n // Backup original config if it exists\n let configBackupPath: string | undefined;\n if (context.presetDetection.configPath) {\n const backupResult = backupOriginalConfig(context.presetDetection.configPath);\n if (!backupResult.success) {\n return { success: false, error: backupResult.error };\n }\n configBackupPath = backupResult.backupPath;\n }\n\n // Store backup info for later (will be saved after user creation)\n context.originalInstallation = {\n method: (context.presetDetection.method as 'npm' | 'git') || 'npm',\n packagePath: context.presetDetection.packagePath || '',\n binaryPath: context.presetDetection.binaryPath,\n configPath: context.presetDetection.configPath,\n configBackupPath,\n version: context.presetDetection.version,\n };\n\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: context.pathsConfig.configDir,\n packageDir: `${agentUser.home}/.openclaw-pkg`,\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 verbose: context.options?.verbose,\n });\n context.wrappersInstalled = result.installedWrappers;\n if (!result.success) {\n return { success: false, error: result.errors.join('; ') };\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 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 }, null, 2);\n\n logVerbose(`Writing daemon config to ${configPath}`, context);\n\n // Write config file via sudo tee\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 execSync(`sudo chown ${brokerUsername}:${socketGroupName} \"${configPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\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-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 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 execSync(`sudo mkdir -p /var/log/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });\n execSync(`sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });\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 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 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 migrate: async (context) => {\n if (!context.preset || !context.agentUser || !context.directories || !context.userConfig) {\n return { success: false, error: 'Missing required context for migration' };\n }\n\n // Get the entry command for this preset to determine binary name\n const entryCommand = context.preset.getEntryCommand({\n agentUser: context.userConfig.agentUser,\n directories: context.directories as MigrationDirectories,\n entryPoint: context.options?.entryPoint,\n detection: context.presetDetection,\n });\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.migration = {\n success: true,\n newPaths: {\n packagePath: context.directories.packageDir,\n binaryPath: entryCommand,\n configPath: `${context.directories.configDir}/config.json`,\n },\n };\n return { success: true };\n }\n\n // Use preset's migrate function\n const migrationContext: MigrationContext = {\n agentUser: context.userConfig.agentUser,\n directories: context.directories as MigrationDirectories,\n entryPoint: context.options?.entryPoint,\n detection: context.presetDetection,\n };\n\n const result = await context.preset.migrate(migrationContext);\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n context.migration = {\n success: true,\n newPaths: result.newPaths,\n };\n\n // Now save the full backup with all the information\n if (context.originalInstallation && context.agentUser && result.newPaths) {\n const sandboxUserInfo: SandboxUserInfo = {\n username: context.agentUser.username,\n uid: context.agentUser.uid,\n gid: context.agentUser.gid,\n homeDir: context.agentUser.homeDir,\n };\n\n const migratedPaths: MigratedPaths = {\n packagePath: result.newPaths.packagePath,\n configPath: result.newPaths.configPath || `${context.directories?.configDir}/config.json`,\n binaryPath: result.newPaths.binaryPath,\n };\n\n const backupResult = saveBackup({\n originalInstallation: context.originalInstallation,\n sandboxUser: sandboxUserInfo,\n migratedPaths,\n });\n\n if (!backupResult.success) {\n // Log warning but don't fail - installation is already complete\n console.warn(`Warning: Could not save backup: ${backupResult.error}`);\n }\n }\n\n return { success: true };\n },\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 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 onStateChange?.(state);\n return { success: false, error: step.error };\n }\n\n const result = await executeStep(step, context, executor);\n\n if (result.success) {\n step.status = 'completed';\n } else {\n step.status = 'error';\n step.error = result.error;\n state.hasError = true;\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 (confirm through verify, excludes passcode and complete)\n * Called after user confirms they want to proceed\n */\n async runSetupPhase() {\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) => id !== 'setup-passcode' && id !== 'complete')];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n } finally {\n clearInterval(keepalive);\n }\n return;\n }\n // dry-run path (unchanged)\n const setupSteps: WizardStepId[] = ['confirm', ...getStepsByPhase('setup')\n .filter((id) => id !== 'setup-passcode' && id !== 'complete')];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n },\n\n /**\n * Run final phase (setup-passcode and complete)\n * Called after the passcode UI has collected the passcode value\n */\n async runFinalPhase() {\n const finalSteps: WizardStepId[] = ['setup-passcode', '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 saveBackup,\n backupOriginalConfig,\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 // Preset system\n getPreset,\n autoDetectPreset,\n type MigrationContext,\n type MigrationDirectories,\n} from '@agenshield/sandbox';\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 * Verbose logging helper - logs messages when verbose mode is enabled\n * Uses stderr to bypass Ink's stdout capture\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}\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 verify, excludes passcode and complete) */\n runSetupPhase(): 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 context.preset = preset;\n context.presetDetection = { 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 const openclawPreset = getPreset('openclaw');\n if (openclawPreset) {\n context.preset = openclawPreset;\n context.presetDetection = { 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 execSync('npm install -g openclaw', {\n encoding: 'utf-8',\n timeout: 120_000,\n stdio: 'pipe',\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 backup: async (context) => {\n if (!context.presetDetection) {\n return { success: false, error: 'No target detected' };\n }\n\n // Skip actual backup in dry-run mode\n if (context.options?.dryRun) {\n context.originalInstallation = {\n method: (context.presetDetection.method as 'npm' | 'git') || 'npm',\n packagePath: context.presetDetection.packagePath || '',\n binaryPath: context.presetDetection.binaryPath,\n configPath: context.presetDetection.configPath,\n version: context.presetDetection.version,\n };\n return { success: true };\n }\n\n // Backup original config if it exists\n let configBackupPath: string | undefined;\n if (context.presetDetection.configPath) {\n const backupResult = backupOriginalConfig(context.presetDetection.configPath);\n if (!backupResult.success) {\n return { success: false, error: backupResult.error };\n }\n configBackupPath = backupResult.backupPath;\n }\n\n // Store backup info for later (will be saved after user creation)\n context.originalInstallation = {\n method: (context.presetDetection.method as 'npm' | 'git') || 'npm',\n packagePath: context.presetDetection.packagePath || '',\n binaryPath: context.presetDetection.binaryPath,\n configPath: context.presetDetection.configPath,\n configBackupPath,\n version: context.presetDetection.version,\n };\n\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: context.pathsConfig.configDir,\n packageDir: `${agentUser.home}/.openclaw-pkg`,\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 });\n context.wrappersInstalled = result.installedWrappers;\n if (!result.success) {\n return { success: false, error: result.errors.join('; ') };\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 execSync(`sudo tee \"${configPath}\" > /dev/null << 'SHIELD_EOF'\n${shieldConfig}\nSHIELD_EOF`, { encoding: 'utf-8', stdio: 'pipe' });\n\n // Set ownership and permissions\n execSync(`sudo chown ${brokerUsername}:${socketGroupName} \"${configPath}\"`, { encoding: 'utf-8', stdio: 'pipe' });\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-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 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 execSync(`sudo mkdir -p /var/log/agenshield`, { encoding: 'utf-8', stdio: 'pipe' });\n execSync(`sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });\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 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 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 migrate: async (context) => {\n if (!context.preset || !context.agentUser || !context.directories || !context.userConfig) {\n return { success: false, error: 'Missing required context for migration' };\n }\n\n // Get the entry command for this preset to determine binary name\n const entryCommand = context.preset.getEntryCommand({\n agentUser: context.userConfig.agentUser,\n directories: context.directories as MigrationDirectories,\n entryPoint: context.options?.entryPoint,\n detection: context.presetDetection,\n });\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.migration = {\n success: true,\n newPaths: {\n packagePath: context.directories.packageDir,\n binaryPath: entryCommand,\n configPath: `${context.directories.configDir}/config.json`,\n },\n };\n return { success: true };\n }\n\n // Use preset's migrate function\n const migrationContext: MigrationContext = {\n agentUser: context.userConfig.agentUser,\n directories: context.directories as MigrationDirectories,\n entryPoint: context.options?.entryPoint,\n detection: context.presetDetection,\n };\n\n const result = await context.preset.migrate(migrationContext);\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n context.migration = {\n success: true,\n newPaths: result.newPaths,\n };\n\n // Now save the full backup with all the information\n if (context.originalInstallation && context.agentUser && result.newPaths) {\n const sandboxUserInfo: SandboxUserInfo = {\n username: context.agentUser.username,\n uid: context.agentUser.uid,\n gid: context.agentUser.gid,\n homeDir: context.agentUser.homeDir,\n };\n\n const migratedPaths: MigratedPaths = {\n packagePath: result.newPaths.packagePath,\n configPath: result.newPaths.configPath || `${context.directories?.configDir}/config.json`,\n binaryPath: result.newPaths.binaryPath,\n };\n\n const backupResult = saveBackup({\n originalInstallation: context.originalInstallation,\n sandboxUser: sandboxUserInfo,\n migratedPaths,\n });\n\n if (!backupResult.success) {\n // Log warning but don't fail - installation is already complete\n console.warn(`Warning: Could not save backup: ${backupResult.error}`);\n }\n }\n\n return { success: true };\n },\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 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 onStateChange?.(state);\n return { success: false, error: step.error };\n }\n\n const result = await executeStep(step, context, executor);\n\n if (result.success) {\n step.status = 'completed';\n } else {\n step.status = 'error';\n step.error = result.error;\n state.hasError = true;\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 (confirm through verify, excludes passcode and complete)\n * Called after user confirms they want to proceed\n */\n async runSetupPhase() {\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) => id !== 'setup-passcode' && id !== 'complete')];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n } finally {\n clearInterval(keepalive);\n }\n return;\n }\n // dry-run path (unchanged)\n const setupSteps: WizardStepId[] = ['confirm', ...getStepsByPhase('setup')\n .filter((id) => id !== 'setup-passcode' && id !== 'complete')];\n await runSteps(state, context, setupSteps, engine.onStateChange);\n },\n\n /**\n * Run final phase (setup-passcode and complete)\n * Called after the passcode UI has collected the passcode value\n */\n async runFinalPhase() {\n const finalSteps: WizardStepId[] = ['setup-passcode', '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"]}
|
package/src/wizard/types.d.ts
CHANGED
|
@@ -53,6 +53,8 @@ export interface WizardOptions {
|
|
|
53
53
|
skipConfirm?: boolean;
|
|
54
54
|
/** Verbose output */
|
|
55
55
|
verbose?: boolean;
|
|
56
|
+
/** Node.js version to install via NVM (default: '24') */
|
|
57
|
+
nodeVersion?: string;
|
|
56
58
|
}
|
|
57
59
|
export interface WizardContext {
|
|
58
60
|
/** Wizard options from CLI */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/wizard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,QAAQ,GACR,gBAAgB,GAChB,WAAW,GACX,SAAS,GACT,QAAQ,GACR,eAAe,GACf,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,uBAAuB,GACvB,kBAAkB,GAClB,oBAAoB,GACpB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,UAAU,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/wizard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,QAAQ,GACR,gBAAgB,GAChB,WAAW,GACX,SAAS,GACT,QAAQ,GACR,eAAe,GACf,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,uBAAuB,GACvB,kBAAkB,GAClB,oBAAoB,GACpB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,UAAU,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,6BAA6B;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,uCAAuC;IACvC,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC,qEAAqE;IACrE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C,sBAAsB;IACtB,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B,uBAAuB;IACvB,UAAU,CAAC,EAAE,eAAe,CAAC;IAE7B,qBAAqB;IACrB,aAAa,CAAC,EAAE;QACd,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,CAAC;IAEF,kCAAkC;IAClC,WAAW,CAAC,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAEF,kCAAkC;IAClC,gBAAgB,CAAC,EAAE;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IAEF,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,0BAA0B;IAC1B,eAAe,CAAC,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAEF,2BAA2B;IAC3B,YAAY,CAAC,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAEF,yBAAyB;IACzB,iBAAiB,CAAC,EAAE;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,yBAAyB;IACzB,YAAY,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IAEF,uBAAuB;IACvB,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE;YACT,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC;YACnB,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;IAEF,0BAA0B;IAC1B,YAAY,CAAC,EAAE;QACb,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IAEF,4BAA4B;IAC5B,aAAa,CAAC,EAAE;QACd,+BAA+B;QAC/B,UAAU,EAAE,OAAO,CAAC;QACpB,0CAA0C;QAC1C,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IAEF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,qDAAqD;IACrD,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,oBAAoB,EAmK9C,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,GAAG,YAAY,EAAE,CAE5E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CAOhD"}
|
package/src/wizard/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/wizard/types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Types for the setup wizard\n */\n\nimport type { OriginalInstallation, UserConfig, PathsConfig } from '@agenshield/ipc';\nimport type { TargetPreset, PresetDetectionResult } from '@agenshield/sandbox';\n\nexport type WizardStepStatus = 'pending' | 'running' | 'completed' | 'error' | 'skipped';\n\n/**\n * Wizard step IDs\n */\nexport type WizardStepId =\n | 'prerequisites'\n | 'detect'\n | 'install-target'\n | 'configure'\n | 'confirm'\n | 'backup'\n | 'create-groups'\n | 'create-agent-user'\n | 'create-broker-user'\n | 'create-directories'\n | 'setup-socket'\n | 'generate-seatbelt'\n | 'install-wrappers'\n | 'install-broker'\n | 'install-daemon-config'\n | 'install-policies'\n | 'setup-launchdaemon'\n | 'migrate'\n | 'verify'\n | 'setup-passcode'\n | 'complete';\n\nexport interface WizardStep {\n id: WizardStepId;\n name: string;\n description: string;\n status: WizardStepStatus;\n error?: string;\n}\n\nexport interface WizardState {\n currentStep: number;\n steps: WizardStep[];\n isComplete: boolean;\n hasError: boolean;\n}\n\n/**\n * User information after creation\n */\nexport interface SandboxUserInfo {\n username: string;\n uid: number;\n gid: number;\n homeDir: string;\n shell: string;\n}\n\n/**\n * Wizard options passed from CLI\n */\nexport interface WizardOptions {\n /** Target preset to use: 'openclaw', 'custom', or auto-detect if not specified */\n targetPreset?: string;\n /** Entry point for custom target (Node.js file path) */\n entryPoint?: string;\n /** Base name for users/groups (default: 'agenshield') */\n baseName?: string;\n /** Optional prefix for user/group names (for testing) */\n prefix?: string;\n /** Optional base UID (for testing) */\n baseUid?: number;\n /** Optional base GID (for testing) */\n baseGid?: number;\n /** Dry run mode - show what would be done without making changes */\n dryRun?: boolean;\n /** Skip confirmation prompt */\n skipConfirm?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface WizardContext {\n /** Wizard options from CLI */\n options?: WizardOptions;\n\n /** User configuration (dynamic based on prefix/baseUid/baseName) */\n userConfig?: UserConfig;\n\n /** Paths configuration */\n pathsConfig?: PathsConfig;\n\n /** Selected target preset */\n preset?: TargetPreset;\n\n /** Detection result from the preset */\n presetDetection?: PresetDetectionResult;\n\n /** Original installation info for backup (set during backup step) */\n originalInstallation?: OriginalInstallation;\n\n /** Agent user info */\n agentUser?: SandboxUserInfo;\n\n /** Broker user info */\n brokerUser?: SandboxUserInfo;\n\n /** Groups created */\n groupsCreated?: {\n socket: { name: string; gid: number };\n workspace: { name: string; gid: number };\n };\n\n /** Directory structure created */\n directories?: {\n binDir: string;\n wrappersDir: string;\n configDir: string;\n packageDir: string;\n npmDir: string;\n socketDir: string;\n logDir: string;\n seatbeltDir: string;\n };\n\n /** Socket setup result */\n socketSetup?: {\n path: string;\n success: boolean;\n };\n\n /** Seatbelt profiles generated */\n seatbeltProfiles?: {\n agentProfile: string;\n operationProfiles: string[];\n };\n\n /** Wrappers installed */\n wrappersInstalled?: string[];\n\n /** Broker installation */\n brokerInstalled?: {\n binaryPath: string;\n success: boolean;\n };\n\n /** Daemon configuration */\n daemonConfig?: {\n configPath: string;\n success: boolean;\n };\n\n /** Policies installed */\n policiesInstalled?: {\n builtinCount: number;\n customCount: number;\n };\n\n /** LaunchDaemon setup */\n launchDaemon?: {\n plistPath: string;\n loaded: boolean;\n };\n\n /** Migration result */\n migration?: {\n success: boolean;\n newPaths?: {\n packagePath: string;\n binaryPath: string;\n configPath?: string;\n };\n };\n\n /** Verification result */\n verification?: {\n usersValid: boolean;\n groupsValid: boolean;\n directoriesValid: boolean;\n socketValid: boolean;\n daemonRunning: boolean;\n networkBlocked: boolean;\n };\n\n /** Passcode setup result */\n passcodeSetup?: {\n /** Whether passcode was set */\n configured: boolean;\n /** Whether user skipped passcode setup */\n skipped: boolean;\n };\n\n /** Passcode value (temporary, only during wizard flow) */\n passcodeValue?: string;\n\n /** Whether the target can be installed (e.g. via npm) */\n targetInstallable?: boolean;\n\n /** Whether the user requested target installation */\n installTargetRequested?: boolean;\n}\n\n/**\n * Step definition for wizard\n */\nexport interface WizardStepDefinition {\n id: WizardStepId;\n name: string;\n description: string;\n /** Whether this step requires sudo */\n requiresSudo?: boolean;\n /** Dependencies (other step IDs that must complete first) */\n dependsOn?: WizardStepId[];\n /** Phase: 'detection' (runs before confirm) or 'setup' (runs after confirm) */\n phase: 'detection' | 'setup';\n}\n\n/**\n * All wizard step definitions\n */\nexport const WIZARD_STEPS: WizardStepDefinition[] = [\n // Detection phase\n {\n id: 'prerequisites',\n name: 'Check Prerequisites',\n description: 'Verify Node.js 22+, macOS, and required tools',\n phase: 'detection',\n },\n {\n id: 'detect',\n name: 'Detect Target',\n description: 'Find target application (auto-detect or use specified preset)',\n phase: 'detection',\n dependsOn: ['prerequisites'],\n },\n {\n id: 'install-target',\n name: 'Install Target',\n description: 'Install target application if not found',\n phase: 'detection',\n dependsOn: ['detect'],\n },\n {\n id: 'configure',\n name: 'Configure',\n description: 'Set up user configuration',\n phase: 'detection',\n dependsOn: ['install-target'],\n },\n {\n id: 'confirm',\n name: 'Confirm Setup',\n description: 'Show plan and get user confirmation',\n phase: 'detection',\n dependsOn: ['configure'],\n },\n\n // Setup phase\n {\n id: 'backup',\n name: 'Backup Installation',\n description: 'Save backup for safe reversal',\n phase: 'setup',\n dependsOn: ['confirm'],\n },\n {\n id: 'create-groups',\n name: 'Create Groups',\n description: 'Create socket access and workspace groups',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['backup'],\n },\n {\n id: 'create-agent-user',\n name: 'Create Agent User',\n description: 'Create sandboxed agent user with guarded shell',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-groups'],\n },\n {\n id: 'create-broker-user',\n name: 'Create Broker User',\n description: 'Create broker user for daemon',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-groups'],\n },\n {\n id: 'create-directories',\n name: 'Create Directories',\n description: 'Create /opt/agenshield, /etc/agenshield, etc.',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-agent-user', 'create-broker-user'],\n },\n {\n id: 'setup-socket',\n name: 'Setup Socket',\n description: 'Create /var/run/agenshield/ with correct permissions',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'generate-seatbelt',\n name: 'Generate Seatbelt Profiles',\n description: 'Generate macOS sandbox profiles',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-wrappers',\n name: 'Install Wrappers',\n description: 'Install command wrappers to agent home bin directory',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-broker',\n name: 'Install Broker',\n description: 'Install broker binary',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-daemon-config',\n name: 'Install Daemon Config',\n description: 'Write daemon configuration files',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-policies',\n name: 'Install Policies',\n description: 'Write default security policies',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'setup-launchdaemon',\n name: 'Setup LaunchDaemon',\n description: 'Create and load launchd plist',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['install-broker', 'install-daemon-config'],\n },\n {\n id: 'migrate',\n name: 'Migrate Installation',\n description: 'Move target application to sandbox',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['install-wrappers', 'setup-launchdaemon'],\n },\n {\n id: 'verify',\n name: 'Verify Installation',\n description: 'Test sandboxed application',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['migrate'],\n },\n {\n id: 'setup-passcode',\n name: 'Setup Passcode',\n description: 'Set a passcode to protect sensitive configuration',\n phase: 'setup',\n dependsOn: ['verify'],\n },\n {\n id: 'complete',\n name: 'Complete',\n description: 'Setup finished successfully',\n phase: 'setup',\n dependsOn: ['setup-passcode'],\n },\n];\n\n/**\n * Get step IDs for a specific phase\n */\nexport function getStepsByPhase(phase: 'detection' | 'setup'): WizardStepId[] {\n return WIZARD_STEPS.filter((s) => s.phase === phase).map((s) => s.id);\n}\n\n/**\n * Get all step IDs in order\n */\nexport function getAllStepIds(): WizardStepId[] {\n return WIZARD_STEPS.map((s) => s.id);\n}\n\n/**\n * Create initial wizard steps from definitions\n */\nexport function createWizardSteps(): WizardStep[] {\n return WIZARD_STEPS.map((def) => ({\n id: def.id,\n name: def.name,\n description: def.description,\n status: 'pending' as const,\n }));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/wizard/types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Types for the setup wizard\n */\n\nimport type { OriginalInstallation, UserConfig, PathsConfig } from '@agenshield/ipc';\nimport type { TargetPreset, PresetDetectionResult } from '@agenshield/sandbox';\n\nexport type WizardStepStatus = 'pending' | 'running' | 'completed' | 'error' | 'skipped';\n\n/**\n * Wizard step IDs\n */\nexport type WizardStepId =\n | 'prerequisites'\n | 'detect'\n | 'install-target'\n | 'configure'\n | 'confirm'\n | 'backup'\n | 'create-groups'\n | 'create-agent-user'\n | 'create-broker-user'\n | 'create-directories'\n | 'setup-socket'\n | 'generate-seatbelt'\n | 'install-wrappers'\n | 'install-broker'\n | 'install-daemon-config'\n | 'install-policies'\n | 'setup-launchdaemon'\n | 'migrate'\n | 'verify'\n | 'setup-passcode'\n | 'complete';\n\nexport interface WizardStep {\n id: WizardStepId;\n name: string;\n description: string;\n status: WizardStepStatus;\n error?: string;\n}\n\nexport interface WizardState {\n currentStep: number;\n steps: WizardStep[];\n isComplete: boolean;\n hasError: boolean;\n}\n\n/**\n * User information after creation\n */\nexport interface SandboxUserInfo {\n username: string;\n uid: number;\n gid: number;\n homeDir: string;\n shell: string;\n}\n\n/**\n * Wizard options passed from CLI\n */\nexport interface WizardOptions {\n /** Target preset to use: 'openclaw', 'custom', or auto-detect if not specified */\n targetPreset?: string;\n /** Entry point for custom target (Node.js file path) */\n entryPoint?: string;\n /** Base name for users/groups (default: 'agenshield') */\n baseName?: string;\n /** Optional prefix for user/group names (for testing) */\n prefix?: string;\n /** Optional base UID (for testing) */\n baseUid?: number;\n /** Optional base GID (for testing) */\n baseGid?: number;\n /** Dry run mode - show what would be done without making changes */\n dryRun?: boolean;\n /** Skip confirmation prompt */\n skipConfirm?: boolean;\n /** Verbose output */\n verbose?: boolean;\n /** Node.js version to install via NVM (default: '24') */\n nodeVersion?: string;\n}\n\nexport interface WizardContext {\n /** Wizard options from CLI */\n options?: WizardOptions;\n\n /** User configuration (dynamic based on prefix/baseUid/baseName) */\n userConfig?: UserConfig;\n\n /** Paths configuration */\n pathsConfig?: PathsConfig;\n\n /** Selected target preset */\n preset?: TargetPreset;\n\n /** Detection result from the preset */\n presetDetection?: PresetDetectionResult;\n\n /** Original installation info for backup (set during backup step) */\n originalInstallation?: OriginalInstallation;\n\n /** Agent user info */\n agentUser?: SandboxUserInfo;\n\n /** Broker user info */\n brokerUser?: SandboxUserInfo;\n\n /** Groups created */\n groupsCreated?: {\n socket: { name: string; gid: number };\n workspace: { name: string; gid: number };\n };\n\n /** Directory structure created */\n directories?: {\n binDir: string;\n wrappersDir: string;\n configDir: string;\n packageDir: string;\n npmDir: string;\n socketDir: string;\n logDir: string;\n seatbeltDir: string;\n };\n\n /** Socket setup result */\n socketSetup?: {\n path: string;\n success: boolean;\n };\n\n /** Seatbelt profiles generated */\n seatbeltProfiles?: {\n agentProfile: string;\n operationProfiles: string[];\n };\n\n /** Wrappers installed */\n wrappersInstalled?: string[];\n\n /** Broker installation */\n brokerInstalled?: {\n binaryPath: string;\n success: boolean;\n };\n\n /** Daemon configuration */\n daemonConfig?: {\n configPath: string;\n success: boolean;\n };\n\n /** Policies installed */\n policiesInstalled?: {\n builtinCount: number;\n customCount: number;\n };\n\n /** LaunchDaemon setup */\n launchDaemon?: {\n plistPath: string;\n loaded: boolean;\n };\n\n /** Migration result */\n migration?: {\n success: boolean;\n newPaths?: {\n packagePath: string;\n binaryPath: string;\n configPath?: string;\n };\n };\n\n /** Verification result */\n verification?: {\n usersValid: boolean;\n groupsValid: boolean;\n directoriesValid: boolean;\n socketValid: boolean;\n daemonRunning: boolean;\n networkBlocked: boolean;\n };\n\n /** Passcode setup result */\n passcodeSetup?: {\n /** Whether passcode was set */\n configured: boolean;\n /** Whether user skipped passcode setup */\n skipped: boolean;\n };\n\n /** Passcode value (temporary, only during wizard flow) */\n passcodeValue?: string;\n\n /** Whether the target can be installed (e.g. via npm) */\n targetInstallable?: boolean;\n\n /** Whether the user requested target installation */\n installTargetRequested?: boolean;\n}\n\n/**\n * Step definition for wizard\n */\nexport interface WizardStepDefinition {\n id: WizardStepId;\n name: string;\n description: string;\n /** Whether this step requires sudo */\n requiresSudo?: boolean;\n /** Dependencies (other step IDs that must complete first) */\n dependsOn?: WizardStepId[];\n /** Phase: 'detection' (runs before confirm) or 'setup' (runs after confirm) */\n phase: 'detection' | 'setup';\n}\n\n/**\n * All wizard step definitions\n */\nexport const WIZARD_STEPS: WizardStepDefinition[] = [\n // Detection phase\n {\n id: 'prerequisites',\n name: 'Check Prerequisites',\n description: 'Verify Node.js 22+, macOS, and required tools',\n phase: 'detection',\n },\n {\n id: 'detect',\n name: 'Detect Target',\n description: 'Find target application (auto-detect or use specified preset)',\n phase: 'detection',\n dependsOn: ['prerequisites'],\n },\n {\n id: 'install-target',\n name: 'Install Target',\n description: 'Install target application if not found',\n phase: 'detection',\n dependsOn: ['detect'],\n },\n {\n id: 'configure',\n name: 'Configure',\n description: 'Set up user configuration',\n phase: 'detection',\n dependsOn: ['install-target'],\n },\n {\n id: 'confirm',\n name: 'Confirm Setup',\n description: 'Show plan and get user confirmation',\n phase: 'detection',\n dependsOn: ['configure'],\n },\n\n // Setup phase\n {\n id: 'backup',\n name: 'Backup Installation',\n description: 'Save backup for safe reversal',\n phase: 'setup',\n dependsOn: ['confirm'],\n },\n {\n id: 'create-groups',\n name: 'Create Groups',\n description: 'Create socket access and workspace groups',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['backup'],\n },\n {\n id: 'create-agent-user',\n name: 'Create Agent User',\n description: 'Create sandboxed agent user with guarded shell',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-groups'],\n },\n {\n id: 'create-broker-user',\n name: 'Create Broker User',\n description: 'Create broker user for daemon',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-groups'],\n },\n {\n id: 'create-directories',\n name: 'Create Directories',\n description: 'Create /opt/agenshield, /etc/agenshield, etc.',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-agent-user', 'create-broker-user'],\n },\n {\n id: 'setup-socket',\n name: 'Setup Socket',\n description: 'Create /var/run/agenshield/ with correct permissions',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'generate-seatbelt',\n name: 'Generate Seatbelt Profiles',\n description: 'Generate macOS sandbox profiles',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-wrappers',\n name: 'Install Wrappers',\n description: 'Install command wrappers to agent home bin directory',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-broker',\n name: 'Install Broker',\n description: 'Install broker binary',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-daemon-config',\n name: 'Install Daemon Config',\n description: 'Write daemon configuration files',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'install-policies',\n name: 'Install Policies',\n description: 'Write default security policies',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['create-directories'],\n },\n {\n id: 'setup-launchdaemon',\n name: 'Setup LaunchDaemon',\n description: 'Create and load launchd plist',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['install-broker', 'install-daemon-config'],\n },\n {\n id: 'migrate',\n name: 'Migrate Installation',\n description: 'Move target application to sandbox',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['install-wrappers', 'setup-launchdaemon'],\n },\n {\n id: 'verify',\n name: 'Verify Installation',\n description: 'Test sandboxed application',\n phase: 'setup',\n requiresSudo: true,\n dependsOn: ['migrate'],\n },\n {\n id: 'setup-passcode',\n name: 'Setup Passcode',\n description: 'Set a passcode to protect sensitive configuration',\n phase: 'setup',\n dependsOn: ['verify'],\n },\n {\n id: 'complete',\n name: 'Complete',\n description: 'Setup finished successfully',\n phase: 'setup',\n dependsOn: ['setup-passcode'],\n },\n];\n\n/**\n * Get step IDs for a specific phase\n */\nexport function getStepsByPhase(phase: 'detection' | 'setup'): WizardStepId[] {\n return WIZARD_STEPS.filter((s) => s.phase === phase).map((s) => s.id);\n}\n\n/**\n * Get all step IDs in order\n */\nexport function getAllStepIds(): WizardStepId[] {\n return WIZARD_STEPS.map((s) => s.id);\n}\n\n/**\n * Create initial wizard steps from definitions\n */\nexport function createWizardSteps(): WizardStep[] {\n return WIZARD_STEPS.map((def) => ({\n id: def.id,\n name: def.name,\n description: def.description,\n status: 'pending' as const,\n }));\n}\n"]}
|