agenshield 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenshield",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
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.4.3",
41
- "@agenshield/daemon": "0.4.3",
42
- "@agenshield/interceptor": "0.4.3",
43
- "@agenshield/ipc": "0.4.3",
44
- "@agenshield/patcher": "0.4.3",
45
- "@agenshield/sandbox": "0.4.3",
46
- "@agenshield/skills": "0.4.3",
40
+ "@agenshield/broker": "0.4.4",
41
+ "@agenshield/daemon": "0.4.4",
42
+ "@agenshield/interceptor": "0.4.4",
43
+ "@agenshield/ipc": "0.4.4",
44
+ "@agenshield/patcher": "0.4.4",
45
+ "@agenshield/sandbox": "0.4.4",
46
+ "@agenshield/skills": "0.4.4",
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":"engine.d.ts","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,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;AAi5BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAgFxE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,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;AA27BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAgFxE"}
@@ -489,22 +489,47 @@ const stepExecutors = {
489
489
  if (!context.userConfig || !context.pathsConfig) {
490
490
  return { success: false, error: 'Configuration not set' };
491
491
  }
492
- const configPath = `${context.pathsConfig.configDir}/daemon.json`;
492
+ const configPath = `${context.pathsConfig.configDir}/shield.json`;
493
+ const brokerUsername = context.userConfig.brokerUser.username;
494
+ const socketGroupName = context.userConfig.groups.socket.name;
493
495
  // Skip in dry-run mode
494
496
  if (context.options?.dryRun) {
497
+ logVerbose(`[dry-run] Would write daemon config to ${configPath}`, context);
495
498
  context.daemonConfig = {
496
499
  configPath,
497
500
  success: true,
498
501
  };
499
502
  return { success: true };
500
503
  }
501
- // TODO: Implement actual daemon config installation
502
- // For now, just mark as success
503
- context.daemonConfig = {
504
- configPath,
505
- success: true,
506
- };
507
- return { success: true };
504
+ try {
505
+ const { execSync } = await import('node:child_process');
506
+ const shieldConfig = JSON.stringify({
507
+ socketPath: context.pathsConfig.socketPath,
508
+ socketOwner: brokerUsername,
509
+ socketGroup: socketGroupName,
510
+ policiesPath: '/opt/agenshield/policies',
511
+ auditLogPath: '/var/log/agenshield/audit.log',
512
+ }, null, 2);
513
+ logVerbose(`Writing daemon config to ${configPath}`, context);
514
+ // Write config file via sudo tee
515
+ execSync(`sudo tee "${configPath}" > /dev/null << 'SHIELD_EOF'
516
+ ${shieldConfig}
517
+ SHIELD_EOF`, { encoding: 'utf-8', stdio: 'pipe' });
518
+ // Set ownership and permissions
519
+ execSync(`sudo chown ${brokerUsername}:${socketGroupName} "${configPath}"`, { encoding: 'utf-8', stdio: 'pipe' });
520
+ execSync(`sudo chmod 640 "${configPath}"`, { encoding: 'utf-8', stdio: 'pipe' });
521
+ context.daemonConfig = {
522
+ configPath,
523
+ success: true,
524
+ };
525
+ return { success: true };
526
+ }
527
+ catch (err) {
528
+ return {
529
+ success: false,
530
+ error: `Failed to install daemon config: ${err.message}`,
531
+ };
532
+ }
508
533
  },
509
534
  'install-policies': async (context) => {
510
535
  if (!context.pathsConfig) {
@@ -540,6 +565,12 @@ const stepExecutors = {
540
565
  return { success: true };
541
566
  }
542
567
  try {
568
+ const { execSync } = await import('node:child_process');
569
+ const brokerUsername = context.userConfig.brokerUser.username;
570
+ const socketGroupName = context.userConfig.groups.socket.name;
571
+ // Remove stale socket from previous installs (may be root-owned, causing EACCES)
572
+ logVerbose('Removing stale socket file if present', context);
573
+ execSync(`sudo rm -f /var/run/agenshield/agenshield.sock`, { encoding: 'utf-8', stdio: 'pipe' });
543
574
  // Generate plist
544
575
  const plist = generateBrokerPlist(context.userConfig, {
545
576
  brokerPath: context.brokerInstalled.binaryPath,
@@ -549,6 +580,10 @@ const stepExecutors = {
549
580
  if (!result.success) {
550
581
  return { success: false, error: result.message };
551
582
  }
583
+ // Ensure log files exist with correct ownership so the broker can write to them
584
+ logVerbose('Ensuring log files have correct ownership', context);
585
+ execSync(`sudo touch /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });
586
+ execSync(`sudo chown ${brokerUsername}:${socketGroupName} /var/log/agenshield/broker.log /var/log/agenshield/broker.error.log`, { encoding: 'utf-8', stdio: 'pipe' });
552
587
  // Fix socket permissions after broker starts
553
588
  // This ensures the daemon user can access the broker socket
554
589
  const socketResult = await fixSocketPermissions(context.userConfig);
@@ -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}/daemon.json`;\n\n // Skip in dry-run mode\n if (context.options?.dryRun) {\n context.daemonConfig = {\n configPath,\n success: true,\n };\n return { success: true };\n }\n\n // TODO: Implement actual daemon config installation\n // For now, just mark as success\n context.daemonConfig = {\n configPath,\n success: true,\n };\n\n return { success: true };\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 // 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 // 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":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,mBAAmB;AACnB,gBAAgB;AAChB,SAAS,EACT,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI/E;;;GAGG;AACH,SAAS,UAAU,CAAC,OAAe,EAAE,OAAuB;IAC1D,IAAI,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,MAAM,EAAE,CAAC;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAgBD;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,IAAgB,EAChB,OAAsB,EACtB,QAAsB;IAEtB,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAC5D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,aAAa,GAAuC;IACxD,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC7D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC;QAE/C,8CAA8C;QAC9C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;gBACjC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,sDAAsD;iBAC9D,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;YAC9D,CAAC;YAED,qEAAqE;YACrE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,eAAe,GAAG;gBACxB,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,QAAQ;aACjB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,mCAAmC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,QAAQ,EAAE,EAAE,CAAC;YAClE,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtB,iDAAiD;gBACjD,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxB,OAAO,CAAC,eAAe,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAC3C,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;YACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,sFAAsF;YACtF,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC;gBAChC,OAAO,CAAC,eAAe,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAC3C,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8FAA8F;aACtG,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,4CAA4C;QAC5C,IAAI,OAAO,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,sFAAsF;QACtF,4CAA4C;QAC5C,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;YACpC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;YACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,+DAA+D;QAC/D,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAClC,OAAO,CAAC,eAAe,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,kEAAkE;QAClE,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxD,QAAQ,CAAC,yBAAyB,EAAE;gBAClC,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,OAAO;gBAChB,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,+BAAgC,GAAa,CAAC,OAAO,EAAE;aAC/D,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oEAAoE;aAC5E,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3C,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC3B,6CAA6C;QAC7C,MAAM,UAAU,GAAG,gBAAgB,CAAC;YAClC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM;YAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO;YACjC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO;YACjC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ;SACpC,CAAC,CAAC;QAEH,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;QAChC,OAAO,CAAC,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,yEAAyE;IACzE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QACzD,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,oBAAoB,GAAG;gBAC7B,MAAM,EAAG,OAAO,CAAC,eAAe,CAAC,MAAwB,IAAI,KAAK;gBAClE,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE;gBACtD,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU;gBAC9C,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU;gBAC9C,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,OAAO;aACzC,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,sCAAsC;QACtC,IAAI,gBAAoC,CAAC;QACzC,IAAI,OAAO,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAC9E,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;YACvD,CAAC;YACD,gBAAgB,GAAG,YAAY,CAAC,UAAU,CAAC;QAC7C,CAAC;QAED,kEAAkE;QAClE,OAAO,CAAC,oBAAoB,GAAG;YAC7B,MAAM,EAAG,OAAO,CAAC,eAAe,CAAC,MAAwB,IAAI,KAAK;YAClE,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE;YACtD,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU;YAC9C,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU;YAC9C,gBAAgB;YAChB,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,OAAO;SACzC,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;QACjE,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,iCAAiC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5I,UAAU,CAAC,iCAAiC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;YAClJ,OAAO,CAAC,aAAa,GAAG;gBACtB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM;gBACxC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS;aAC/C,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,UAAU,CAAC,mBAAmB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9H,UAAU,CAAC,mBAAmB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,SAAS,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QAEpI,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC/C,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,aAAa,GAAG;YACtB,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM;YACxC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS;SAC/C,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACrC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;QAEzC,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,gCAAgC,SAAS,CAAC,QAAQ,SAAS,SAAS,CAAC,GAAG,SAAS,SAAS,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;YACvH,UAAU,CAAC,6BAA6B,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YACnE,UAAU,CAAC,oBAAoB,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,SAAS,GAAG;gBAClB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,GAAG,EAAE,SAAS,CAAC,GAAG;gBAClB,GAAG,EAAE,SAAS,CAAC,GAAG;gBAClB,OAAO,EAAE,SAAS,CAAC,IAAI;gBACvB,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,UAAU,CAAC,kBAAkB,SAAS,CAAC,QAAQ,SAAS,SAAS,CAAC,GAAG,SAAS,SAAS,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QACzG,UAAU,CAAC,mBAAmB,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,UAAU,CAAC,UAAU,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,SAAS,GAAG;YAClB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,OAAO,EAAE,SAAS,CAAC,IAAI;YACvB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;QAE1C,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,gCAAgC,UAAU,CAAC,QAAQ,SAAS,UAAU,CAAC,GAAG,SAAS,UAAU,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;YAC1H,OAAO,CAAC,UAAU,GAAG;gBACnB,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,GAAG,EAAE,UAAU,CAAC,GAAG;gBACnB,GAAG,EAAE,UAAU,CAAC,GAAG;gBACnB,OAAO,EAAE,UAAU,CAAC,IAAI;gBACxB,KAAK,EAAE,UAAU,CAAC,KAAK;aACxB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,UAAU,CAAC,kBAAkB,UAAU,CAAC,QAAQ,SAAS,UAAU,CAAC,GAAG,SAAS,UAAU,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QAE5G,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,UAAU,GAAG;YACnB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,OAAO,EAAE,UAAU,CAAC,IAAI;YACxB,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;QACzC,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,MAAM;YAC/B,WAAW,EAAE,GAAG,SAAS,CAAC,IAAI,MAAM;YACpC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;YACxC,UAAU,EAAE,GAAG,SAAS,CAAC,IAAI,gBAAgB;YAC7C,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,OAAO;YAChC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;YACxC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM;YAClC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,WAAW;SAC7C,CAAC;QAEF,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,qCAAqC,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/E,UAAU,CAAC,qCAAqC,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;YAClF,UAAU,CAAC,qCAAqC,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;YAClF,UAAU,CAAC,qCAAqC,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YAC/E,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,UAAU,CAAC,uBAAuB,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QACjE,UAAU,CAAC,uBAAuB,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACpE,UAAU,CAAC,uBAAuB,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACpE,UAAU,CAAC,uBAAuB,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QACjE,UAAU,CAAC,uBAAuB,SAAS,CAAC,IAAI,gCAAgC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;QAEtI,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACtG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC/C,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QAElC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,WAAW,GAAG;gBACpB,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU;gBACpC,OAAO,EAAE,IAAI;aACd,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,WAAW,GAAG;YACpB,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU;YACpC,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACrC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,gBAAgB,GAAG;gBACzB,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,WAAW;gBAC3D,iBAAiB,EAAE,EAAE;aACtB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,YAAY,GAAG,oBAAoB,CAAC;gBACxC,aAAa,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,YAAY;gBAC/D,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU;aAC3C,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,UAAU,EAAE;gBAC/D,YAAY;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACjD,CAAC;YAED,OAAO,CAAC,gBAAgB,GAAG;gBACzB,YAAY,EAAE,MAAM,CAAC,gBAAiB;gBACtC,iBAAiB,EAAE,MAAM,CAAC,qBAAqB,IAAI,EAAE;aACtD,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yCAA0C,GAAa,CAAC,OAAO,EAAE;aACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QAC/D,CAAC;QAED,8CAA8C;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC;QAElD,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,uEAAuE,EAAE,OAAO,CAAC,CAAC;YAC7F,UAAU,CAAC,gEAAgE,EAAE,OAAO,CAAC,CAAC;YACtF,UAAU,CAAC,qCAAqC,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACrI,OAAO,CAAC,iBAAiB,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,oEAAoE;YACpE,UAAU,CAAC,0DAA0D,EAAE,OAAO,CAAC,CAAC;YAChF,UAAU,CAAC,oDAAoD,EAAE,OAAO,CAAC,CAAC;YAC1E,UAAU,CAAC,kDAAkD,EAAE,OAAO,CAAC,CAAC;YAExE,MAAM,kBAAkB,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACzE,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC/D,CAAC;YAED,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,6BAA6B;gBAC7B,UAAU,CAAC,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvE,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;oBACzC,YAAY;oBACZ,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM;oBAClC,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;oBACtD,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO;iBAClC,CAAC,CAAC;gBACH,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;gBACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAED,2EAA2E;YAC3E,UAAU,CAAC,uEAAuE,EAAE,OAAO,CAAC,CAAC;YAC7F,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACtE,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9D,CAAC;YAED,UAAU,CAAC,qDAAqD,EAAE,OAAO,CAAC,CAAC;YAC3E,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1D,CAAC;YAED,UAAU,CAAC,8BAA8B,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACjF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACjD,CAAC;YACD,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;YACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,+BAAgC,GAAa,CAAC,OAAO,EAAE;aAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,UAAU,GAAG,uCAAuC,CAAC;QAE3D,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,4CAA4C,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9E,OAAO,CAAC,eAAe,GAAG;gBACxB,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,IAAI;aACd,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,UAAU,CAAC,+BAA+B,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,eAAe,GAAG;YACxB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACzC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,cAAc,CAAC;QAClE,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAE9D,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,UAAU,CAAC,0CAA0C,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5E,OAAO,CAAC,YAAY,GAAG;gBACrB,UAAU;gBACV,OAAO,EAAE,IAAI;aACd,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAExD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;gBAClC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU;gBAC1C,WAAW,EAAE,cAAc;gBAC3B,WAAW,EAAE,eAAe;gBAC5B,YAAY,EAAE,0BAA0B;gBACxC,YAAY,EAAE,+BAA+B;aAC9C,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAEZ,UAAU,CAAC,4BAA4B,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;YAE9D,iCAAiC;YACjC,QAAQ,CAAC,aAAa,UAAU;EACpC,YAAY;WACH,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAE7C,gCAAgC;YAChC,QAAQ,CAAC,cAAc,cAAc,IAAI,eAAe,KAAK,UAAU,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAClH,QAAQ,CAAC,mBAAmB,UAAU,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAEjF,OAAO,CAAC,YAAY,GAAG;gBACrB,UAAU;gBACV,OAAO,EAAE,IAAI;aACd,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,oCAAqC,GAAa,CAAC,OAAO,EAAE;aACpE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,iBAAiB,GAAG;gBAC1B,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;aACf,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,6CAA6C;QAC7C,gCAAgC;QAChC,OAAO,CAAC,iBAAiB,GAAG;YAC1B,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;SACf,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,SAAS,GAAG,oDAAoD,CAAC;QAEvE,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,YAAY,GAAG;gBACrB,SAAS;gBACT,MAAM,EAAE,KAAK;aACd,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAE9D,iFAAiF;YACjF,UAAU,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC;YAC7D,QAAQ,CAAC,gDAAgD,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAEjG,iBAAiB;YACjB,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE;gBACpD,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU;aAC/C,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAEhD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;YAED,gFAAgF;YAChF,UAAU,CAAC,2CAA2C,EAAE,OAAO,CAAC,CAAC;YACjE,QAAQ,CAAC,gFAAgF,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjI,QAAQ,CAAC,cAAc,cAAc,IAAI,eAAe,sEAAsE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtK,6CAA6C;YAC7C,4DAA4D;YAC5D,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACpE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,oBAAoB,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,OAAO,CAAC,YAAY,GAAG;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAU;gBAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;aAC/B,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,iCAAkC,GAAa,CAAC,OAAO,EAAE;aACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACzF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;QAC7E,CAAC;QAED,iEAAiE;QACjE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;YAClD,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS;YACvC,WAAW,EAAE,OAAO,CAAC,WAAmC;YACxD,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU;YACvC,SAAS,EAAE,OAAO,CAAC,eAAe;SACnC,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,SAAS,GAAG;gBAClB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE;oBACR,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU;oBAC3C,UAAU,EAAE,YAAY;oBACxB,UAAU,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,cAAc;iBAC3D;aACF,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,gCAAgC;QAChC,MAAM,gBAAgB,GAAqB;YACzC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS;YACvC,WAAW,EAAE,OAAO,CAAC,WAAmC;YACxD,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU;YACvC,SAAS,EAAE,OAAO,CAAC,eAAe;SACnC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,SAAS,GAAG;YAClB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;QAEF,oDAAoD;QACpD,IAAI,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzE,MAAM,eAAe,GAAoB;gBACvC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ;gBACpC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;gBAC1B,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;gBAC1B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;aACnC,CAAC;YAEF,MAAM,aAAa,GAAkB;gBACnC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;gBACxC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,SAAS,cAAc;gBACzF,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;aACvC,CAAC;YAEF,MAAM,YAAY,GAAG,UAAU,CAAC;gBAC9B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;gBAClD,WAAW,EAAE,eAAe;gBAC5B,aAAa;aACd,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,gEAAgE;gBAChE,OAAO,CAAC,IAAI,CAAC,mCAAmC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5D,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,YAAY,GAAG;gBACrB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,WAAW,EAAE,IAAI;gBACjB,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,IAAI;aACrB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,kBAAkB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACtH,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,wBAAwB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,+BAA+B;aAC3D,CAAC;QACJ,CAAC;QAED,qEAAqE;QACrE,wEAAwE;QACxE,6DAA6D;QAC7D,iEAAiE;QAEjE,OAAO,CAAC,YAAY,GAAG;YACrB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,gBAAgB,EAAE,IAAI;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,IAAI,KAAK;YAClD,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,IAAI,KAAK;YACpD,cAAc,EAAE,IAAI,EAAE,wCAAwC;SAC/D,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,8BAA8B;QAC9B,IAAI,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,aAAa,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,oDAAoD;YACpD,OAAO,CAAC,aAAa,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,aAAa,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC7D,kCAAkC;YAClC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;YAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,qEAAqE;YACrE,MAAM,UAAU,GAAG,MAAM,CAAC;YAC1B,MAAM,UAAU,GAAG,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,QAAQ,CAAC;YACxB,MAAM,WAAW,GAAG,EAAE,CAAC;YAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC/D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAc,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;oBACvF,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAEzF,MAAM,YAAY,GAAiB;gBACjC,IAAI;gBACJ,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAChC,CAAC;YAEF,yBAAyB;YACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAE1C,sCAAsC;YACtC,MAAM,EAAE,6BAA6B,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC7E,6BAA6B,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjD,OAAO,CAAC,aAAa,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAE7D,+CAA+C;YAC/C,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;YAElC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kDAAkD;YAClD,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6BAA8B,GAAa,CAAC,OAAO,EAAE;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC3B,6BAA6B;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,KAAkB,EAClB,OAAsB,EACtB,OAAuB,EACvB,aAA4C;IAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAChE,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE,SAAS;QAE/B,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAEpC,gCAAgC;QAChC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;QAEvB,mBAAmB;QACnB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,yBAAyB,IAAI,CAAC,EAAE,EAAE,CAAC;YAChD,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACtB,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE1D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACtB,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,MAAM,KAAK,GAAgB;QACzB,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,iBAAiB,EAAE;QAC1B,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;KAChB,CAAC;IAEF,MAAM,OAAO,GAAkB;QAC7B,OAAO;KACR,CAAC;IAEF,MAAM,MAAM,GAAiB;QAC3B,KAAK;QACL,OAAO;QACP,aAAa,EAAE,SAAS;QAExB;;;WAGG;QACH,KAAK,CAAC,iBAAiB;YACrB,MAAM,cAAc,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YACrF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YACpF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,aAAa;YACjB,wEAAwE;YACxE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7B,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;gBACxF,gBAAgB,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,UAAU,GAAmB,CAAC,SAAS,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC;6BACvE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,gBAAgB,IAAI,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC;oBACjE,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBACnE,CAAC;wBAAS,CAAC;oBACT,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC3B,CAAC;gBACD,OAAO;YACT,CAAC;YACD,2BAA2B;YAC3B,MAAM,UAAU,GAAmB,CAAC,SAAS,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC;qBACvE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,gBAAgB,IAAI,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC;YACjE,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACnE,CAAC;QAED;;;WAGG;QACH,KAAK,CAAC,aAAa;YACjB,MAAM,UAAU,GAAmB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;YAClE,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAEjE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;gBACxB,MAAM,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,GAAG;YACP,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAEtE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;gBACxB,MAAM,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","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 // 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 // Ensure log files exist with correct ownership so the broker can write to them\n logVerbose('Ensuring log files have correct ownership', context);\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 // 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"]}