nexus-agents 2.77.2 → 2.77.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.
Files changed (37) hide show
  1. package/dist/{chunk-6UDFAXUI.js → chunk-AFGRQB4H.js} +5 -3
  2. package/dist/{chunk-6UDFAXUI.js.map → chunk-AFGRQB4H.js.map} +1 -1
  3. package/dist/{chunk-BC3M4VLP.js → chunk-BMOPMCFZ.js} +5 -2
  4. package/dist/chunk-BMOPMCFZ.js.map +1 -0
  5. package/dist/{chunk-CPPZCNAS.js → chunk-EEW7VFFF.js} +3 -3
  6. package/dist/{chunk-X3BU5MIG.js → chunk-FYAQBYHM.js} +2 -2
  7. package/dist/{chunk-RFITLMH4.js → chunk-LIY6WZNR.js} +24 -212
  8. package/dist/chunk-LIY6WZNR.js.map +1 -0
  9. package/dist/{chunk-VEF6DCQU.js → chunk-MV4R2ZIJ.js} +204 -4
  10. package/dist/chunk-MV4R2ZIJ.js.map +1 -0
  11. package/dist/{chunk-N3HOBUU4.js → chunk-S6MEYRYZ.js} +30 -21
  12. package/dist/{chunk-N3HOBUU4.js.map → chunk-S6MEYRYZ.js.map} +1 -1
  13. package/dist/{chunk-ZKOBXAPK.js → chunk-WXVN4K3D.js} +2 -2
  14. package/dist/cli.d.ts +2 -0
  15. package/dist/cli.js +30 -17
  16. package/dist/cli.js.map +1 -1
  17. package/dist/{consensus-vote-UR3JU7RI.js → consensus-vote-AWBFYF5S.js} +3 -3
  18. package/dist/{expert-bridge-DWBO2HXZ.js → expert-bridge-NX2MGOBQ.js} +2 -2
  19. package/dist/{factory-LXOVC44K.js → factory-JI6PSWGR.js} +2 -2
  20. package/dist/index.d.ts +0 -2
  21. package/dist/index.js +8 -8
  22. package/dist/{repo-analyze-HWMXSK5C.js → repo-analyze-QGLXEFVJ.js} +2 -2
  23. package/dist/{repo-security-plan-EIL2BV3S.js → repo-security-plan-X5CRZ2YY.js} +3 -3
  24. package/dist/{setup-command-ZIG5JJAE.js → setup-command-DB3DOE6K.js} +4 -4
  25. package/package.json +1 -1
  26. package/dist/chunk-BC3M4VLP.js.map +0 -1
  27. package/dist/chunk-RFITLMH4.js.map +0 -1
  28. package/dist/chunk-VEF6DCQU.js.map +0 -1
  29. /package/dist/{chunk-CPPZCNAS.js.map → chunk-EEW7VFFF.js.map} +0 -0
  30. /package/dist/{chunk-X3BU5MIG.js.map → chunk-FYAQBYHM.js.map} +0 -0
  31. /package/dist/{chunk-ZKOBXAPK.js.map → chunk-WXVN4K3D.js.map} +0 -0
  32. /package/dist/{consensus-vote-UR3JU7RI.js.map → consensus-vote-AWBFYF5S.js.map} +0 -0
  33. /package/dist/{expert-bridge-DWBO2HXZ.js.map → expert-bridge-NX2MGOBQ.js.map} +0 -0
  34. /package/dist/{factory-LXOVC44K.js.map → factory-JI6PSWGR.js.map} +0 -0
  35. /package/dist/{repo-analyze-HWMXSK5C.js.map → repo-analyze-QGLXEFVJ.js.map} +0 -0
  36. /package/dist/{repo-security-plan-EIL2BV3S.js.map → repo-security-plan-X5CRZ2YY.js.map} +0 -0
  37. /package/dist/{setup-command-ZIG5JJAE.js.map → setup-command-DB3DOE6K.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/setup-command.ts","../src/cli/setup-types.ts","../src/cli/setup-environment.ts","../src/cli/setup-mcp.ts","../src/cli/setup-rules.ts","../src/cli/setup-formatting.ts","../src/cli/setup-opencode.ts","../src/cli/setup-cli-detection.ts","../src/cli/cli-detection-error.ts","../src/cli/setup-gemini.ts","../src/cli/setup-codex.ts","../src/cli/setup-wizard.ts","../src/cli/setup-permissions.ts","../src/cli/verify-command.ts"],"sourcesContent":["/* eslint-disable max-lines -- Cohesive setup command module (governance: 400-600 OK if cohesive) */\n/**\n * nexus-agents setup command\n *\n * Configures Claude CLI integration with nexus-agents MCP server.\n * Generates MCP configuration snippet and .rules/nexus-agents.md.\n *\n * @module cli/setup-command\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n * (Source: Issue #425 - Interactive setup wizard)\n */\n\nimport { existsSync } from 'node:fs';\nimport type { SetupOptions, SetupResult, SetupStep, EnvironmentInfo } from './setup-types.js';\nimport { SetupOptionsSchema } from './setup-types.js';\nimport { getTimeProvider, getErrorMessage } from '../core/index.js';\nimport {\n detectEnvironment,\n generateMcpSnippet,\n generateRulesContent,\n createRulesFile,\n getRulesFilePath,\n formatStatus,\n formatHeader,\n formatCodeBlock,\n isInteractive,\n configureMcpServer,\n // Hook configuration (Issue #416)\n configureHooks,\n generateHookSnippet,\n} from './setup-helpers.js';\nimport type { McpConfigResult, HookConfigResult } from './setup-helpers.js';\nimport { initDataDirectories } from './setup-data-dir.js';\nimport type { DataDirInitResult } from './setup-data-dir.js';\nimport { runConfigInitSync } from './setup-config.js';\nimport { detectOpenCodeCli, configureOpenCode } from './setup-opencode.js';\nimport { detectGeminiCli, configureGemini } from './setup-gemini.js';\nimport { detectCodexCli, configureCodex } from './setup-codex.js';\nimport { formatDetectionMessage } from './cli-detection-error.js';\nimport { VERSION } from '../version.js';\nimport { runWizard } from './setup-wizard.js';\nimport { generatePermissionsSnippet, buildPermissionsBanner } from './setup-permissions.js';\n// #2137: post-setup health gate. Surfaces install-time issues that are easy\n// to miss (better-sqlite3 native build, missing API keys, unwritable data\n// dirs) inline at the end of setup, with copy-pasteable remediation.\nimport { runVerify } from './verify-command.js';\nimport { colors, symbols } from './ansi-output.js';\n\n// ============================================================================\n// Output Helpers\n// ============================================================================\n\n/**\n * Writes a line to stdout.\n */\nfunction writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/**\n * Writes an empty line.\n */\nfunction writeEmptyLine(): void {\n process.stdout.write('\\n');\n}\n\n/**\n * Prints MCP configuration result section.\n */\nfunction printMcpResult(mcpResult: McpConfigResult, snippet: string | undefined): void {\n writeLine(formatHeader('MCP Configuration'));\n writeLine('─'.repeat(40));\n if (mcpResult.success) {\n writeLine(mcpResult.message);\n writeLine('Run `/mcp` in Claude Code to verify.');\n } else {\n writeLine(`Failed: ${mcpResult.message}`);\n if (snippet !== undefined) {\n writeEmptyLine();\n writeLine('Manual fallback - run:');\n writeEmptyLine();\n writeLine(formatCodeBlock(`claude mcp add-json nexus-agents '${snippet}'`));\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints rules file section.\n */\nfunction printRulesFile(rulesPath: string): void {\n writeLine(formatHeader('Rules File'));\n writeLine('─'.repeat(40));\n writeLine(`Created: ${rulesPath}`);\n writeLine('Claude will now have context about nexus-agents tools.');\n writeEmptyLine();\n}\n\n/**\n * Prints hooks configuration result section.\n * (Source: Issue #416)\n */\nfunction printHooksResult(hookResult: HookConfigResult, snippet: string | undefined): void {\n writeLine(formatHeader('Hooks Configuration'));\n writeLine('─'.repeat(40));\n if (hookResult.success) {\n writeLine(hookResult.message);\n writeLine('Hooks will track sessions, metrics, and validate tool use.');\n } else {\n writeLine(`Note: ${hookResult.message}`);\n if (snippet !== undefined) {\n writeEmptyLine();\n writeLine('Manual fallback - add to ~/.claude/settings.json:');\n writeEmptyLine();\n writeLine(formatCodeBlock(snippet));\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints warnings section.\n */\nfunction printWarnings(warnings: readonly string[]): void {\n writeLine(formatHeader('Warnings'));\n writeLine('─'.repeat(40));\n for (const warning of warnings) {\n writeLine(`⚠ ${warning}`);\n }\n writeEmptyLine();\n}\n\n/**\n * Prints errors section.\n */\nfunction printErrors(errors: readonly string[]): void {\n writeLine(formatHeader('Errors'));\n writeLine('─'.repeat(40));\n for (const error of errors) {\n writeLine(`✗ ${error}`);\n }\n writeEmptyLine();\n}\n\n/**\n * Prints next steps section.\n */\nfunction printNextSteps(mcpConfigured: boolean, hasMcpSnippet: boolean): void {\n writeLine(formatHeader('Next Steps'));\n writeLine('─'.repeat(40));\n if (hasMcpSnippet && !mcpConfigured) {\n writeLine('1. Configure MCP manually (see above)');\n writeLine('2. Restart Claude Code');\n }\n writeLine('3. Run: nexus-agents doctor');\n writeLine('4. Try: nexus-agents orchestrate \"Hello World\"');\n writeEmptyLine();\n}\n\n/**\n * Prints steps with status indicators.\n */\nfunction printSteps(steps: readonly SetupStep[], verbose: boolean): void {\n for (const step of steps) {\n const status = formatStatus(step.status);\n const duration = step.durationMs !== undefined ? ` (${String(step.durationMs)}ms)` : '';\n writeLine(`${status} ${step.name}${verbose ? duration : ''}`);\n if (step.message !== undefined && (verbose || step.status === 'failed')) {\n writeLine(` ${step.message}`);\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints result summary line.\n */\nfunction printSummary(success: boolean): void {\n const summary = success ? '✓ Setup completed successfully!' : '✗ Setup completed with errors';\n writeLine(success ? `\\x1b[32m${summary}\\x1b[0m` : `\\x1b[31m${summary}\\x1b[0m`);\n writeEmptyLine();\n}\n\n// ============================================================================\n// Setup Steps\n// ============================================================================\n\n/**\n * Runs the environment detection step.\n */\nfunction runDetectionStep(projectRoot: string): { env: EnvironmentInfo; step: SetupStep } {\n const time = getTimeProvider();\n const startTime = time.now();\n const env = detectEnvironment(projectRoot);\n\n return {\n env,\n step: {\n name: 'Environment Detection',\n status: 'success',\n message: `Platform: ${env.platform}, Claude CLI: ${env.claudeCli.installed ? (env.claudeCli.version ?? 'installed') : 'not found'}`,\n durationMs: time.now() - startTime,\n },\n };\n}\n\n/** Minimum Node.js major version required. */\nconst REQUIRED_NODE_MAJOR = 22;\n\n/**\n * Runs the prerequisite validation step.\n * Checks Node.js version and warns about missing package managers.\n */\nfunction runPrerequisiteStep(): { step: SetupStep; warnings: readonly string[] } {\n const time = getTimeProvider();\n const startTime = time.now();\n const warnings: string[] = [];\n\n const version = process.version;\n const major = Number(version.slice(1).split('.')[0]);\n const nodeOk = major >= REQUIRED_NODE_MAJOR;\n\n if (!nodeOk) {\n warnings.push(\n `Node.js ${version} detected — v${String(REQUIRED_NODE_MAJOR)}.x+ required. Some features may not work.`\n );\n }\n\n const status = nodeOk ? 'success' : 'warning';\n const message = nodeOk\n ? `Node.js ${version} (meets v${String(REQUIRED_NODE_MAJOR)}.x requirement)`\n : `Node.js ${version} — v${String(REQUIRED_NODE_MAJOR)}.x+ required`;\n\n return {\n step: {\n name: 'Prerequisite Check',\n status,\n message,\n durationMs: time.now() - startTime,\n },\n warnings,\n };\n}\n\n/** MCP step result type. */\ntype McpStepResult = {\n step: SetupStep;\n snippet: string | undefined;\n mcpResult: McpConfigResult | undefined;\n};\n\n/** Creates an MCP step result. */\nfunction makeMcpResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n snippet?: string,\n mcpResult?: McpConfigResult\n): McpStepResult {\n return {\n step: {\n name: 'MCP Configuration',\n status,\n message,\n durationMs: getTimeProvider().now() - startTime,\n },\n snippet,\n mcpResult,\n };\n}\n\n/**\n * Runs the MCP configuration step.\n */\nfunction runMcpConfigStep(env: EnvironmentInfo, options: SetupOptions): McpStepResult {\n const startTime = getTimeProvider().now();\n\n if (options.skipMcp) {\n return makeMcpResult('skipped', 'Skipped (--skip-mcp)', startTime);\n }\n\n const useNpx = !env.claudeCli.installed;\n const snippet = generateMcpSnippet(useNpx);\n\n if (!env.claudeCli.installed) {\n const mcpResult: McpConfigResult = {\n success: false,\n alreadyConfigured: false,\n message: 'Claude CLI not installed',\n };\n return makeMcpResult(\n 'warning',\n 'Claude CLI not found - manual configuration required',\n startTime,\n snippet,\n mcpResult\n );\n }\n\n const mcpResult = configureMcpServer(useNpx, options.force, options.scope);\n const status = mcpResult.success\n ? mcpResult.alreadyConfigured\n ? 'skipped'\n : 'success'\n : 'failed';\n return makeMcpResult(\n status,\n mcpResult.message,\n startTime,\n mcpResult.success ? undefined : snippet,\n mcpResult\n );\n}\n\n/** Creates a rules step result. */\nfunction makeRulesResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n rulesPath?: string\n): { step: SetupStep; rulesPath: string | undefined } {\n return {\n step: { name: 'Rules File', status, message, durationMs: getTimeProvider().now() - startTime },\n rulesPath,\n };\n}\n\n/** Creates a hooks step result. */\nfunction makeHooksResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n hookResult?: HookConfigResult\n): { step: SetupStep; hookSnippet: string | undefined; hookResult: HookConfigResult | undefined } {\n return {\n step: {\n name: 'Hooks Configuration',\n status,\n message,\n durationMs: getTimeProvider().now() - startTime,\n },\n hookSnippet: hookResult?.success === false ? generateHookSnippet() : undefined,\n hookResult,\n };\n}\n\n/**\n * Runs the rules file generation step.\n */\nfunction runRulesStep(\n env: EnvironmentInfo,\n options: SetupOptions\n): { step: SetupStep; rulesPath: string | undefined } {\n const startTime = getTimeProvider().now();\n\n if (options.skipRules) {\n return makeRulesResult('skipped', 'Skipped (--skip-rules)', startTime);\n }\n\n const rulesPath = getRulesFilePath(env.projectInfo.root);\n if (existsSync(rulesPath) && !options.force) {\n return makeRulesResult(\n 'skipped',\n 'Rules file already exists (use --force to overwrite)',\n startTime\n );\n }\n\n try {\n const createdPath = createRulesFile(env.projectInfo.root, options.dryRun);\n const msg = options.dryRun ? `Would create: ${createdPath}` : `Created: ${createdPath}`;\n return makeRulesResult('success', msg, startTime, createdPath);\n } catch (error) {\n const msg = getErrorMessage(error);\n return makeRulesResult('failed', `Failed to create rules file: ${msg}`, startTime);\n }\n}\n\n/**\n * Runs the hooks configuration step.\n * (Source: Issue #416 - Setup command hook configuration)\n */\nfunction runHooksStep(\n env: EnvironmentInfo,\n options: SetupOptions\n): { step: SetupStep; hookSnippet: string | undefined; hookResult: HookConfigResult | undefined } {\n const startTime = getTimeProvider().now();\n\n if (options.skipHooks) {\n return makeHooksResult('skipped', 'Skipped (--skip-hooks)', startTime);\n }\n\n // If Claude CLI is not installed, we can't configure automatically\n if (!env.claudeCli.installed) {\n return makeHooksResult(\n 'warning',\n 'Claude CLI not found - manual hook configuration required',\n startTime,\n {\n success: false,\n alreadyConfigured: false,\n message: 'Claude CLI not installed',\n }\n );\n }\n\n // If dry-run, just report what would happen\n if (options.dryRun) {\n return makeHooksResult(\n 'success',\n 'Would configure nexus-agents hooks in Claude Code settings',\n startTime\n );\n }\n\n // Configure using Claude CLI\n const hookResult = configureHooks(options.force);\n const status = hookResult.success\n ? hookResult.alreadyConfigured\n ? 'skipped'\n : 'success'\n : 'failed';\n\n return makeHooksResult(status, hookResult.message, startTime, hookResult);\n}\n\n/**\n * Runs the OpenCode MCP configuration step (#1253).\n */\nfunction runOpenCodeStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipOpencode) {\n return {\n name: 'OpenCode MCP',\n status: 'skipped',\n message: 'Skipped (--skip-opencode)',\n durationMs: 0,\n };\n }\n const cliInfo = detectOpenCodeCli();\n if (!cliInfo.installed) {\n return {\n name: 'OpenCode MCP',\n status: 'skipped',\n message: formatDetectionMessage('OpenCode CLI', cliInfo.detectionError),\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureOpenCode(options.force, options.dryRun);\n return {\n name: 'OpenCode MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the Gemini CLI MCP configuration step (#1259).\n */\nfunction runGeminiStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipGemini) {\n return {\n name: 'Gemini MCP',\n status: 'skipped',\n message: 'Skipped (--skip-gemini)',\n durationMs: 0,\n };\n }\n const cliInfo = detectGeminiCli();\n if (!cliInfo.installed) {\n return {\n name: 'Gemini MCP',\n status: 'skipped',\n message: formatDetectionMessage('Gemini CLI', cliInfo.detectionError),\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureGemini(options.force, options.dryRun, options.scope);\n return {\n name: 'Gemini MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the data directory initialization step (#1249).\n */\nfunction runDataDirStep(options: SetupOptions): { step: SetupStep; result: DataDirInitResult } {\n const startTime = getTimeProvider().now();\n const dataDirResult = initDataDirectories(options.dryRun);\n return {\n step: {\n name: 'Data Directory',\n status: dataDirResult.success\n ? dataDirResult.created.length > 0\n ? 'success'\n : 'skipped'\n : 'failed',\n message: dataDirResult.success\n ? dataDirResult.created.length > 0\n ? `Created ${String(dataDirResult.created.length)} directories`\n : 'All directories already exist'\n : `Failed: ${dataDirResult.error ?? 'Unknown error'}`,\n durationMs: getTimeProvider().now() - startTime,\n },\n result: dataDirResult,\n };\n}\n\n/**\n * Runs the Codex CLI MCP configuration step (#1263).\n */\nfunction runCodexStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipCodex) {\n return {\n name: 'Codex MCP',\n status: 'skipped',\n message: 'Skipped (--skip-codex)',\n durationMs: 0,\n };\n }\n const cliInfo = detectCodexCli();\n if (!cliInfo.installed) {\n return {\n name: 'Codex MCP',\n status: 'skipped',\n message: formatDetectionMessage('Codex CLI', cliInfo.detectionError),\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureCodex(options.force, options.dryRun);\n return {\n name: 'Codex MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the config file generation step (#1252).\n */\nfunction runConfigStep(projectRoot: string, options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipConfig) {\n return {\n name: 'Configuration',\n status: 'skipped',\n message: 'Skipped (--skip-config)',\n durationMs: 0,\n };\n }\n const result = runConfigInitSync(projectRoot, options.force, options.dryRun);\n return {\n name: 'Configuration',\n status: result.success ? (result.created ? 'success' : 'skipped') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/** Checks a named step's status, returning a check or issue string. */\nfunction checkStepStatus(steps: readonly SetupStep[], name: string, label: string): string {\n const step = steps.find((s) => s.name === name);\n const ok = step?.status === 'success' || step?.status === 'skipped';\n return ok ? `${label} OK` : `${label} failed`;\n}\n\n/**\n * Runs post-setup validation step (#1271).\n * Checks that critical setup outcomes are in place.\n */\nfunction runValidationStep(steps: readonly SetupStep[]): SetupStep {\n const startTime = getTimeProvider().now();\n\n const mcpSteps = steps.filter((s) => s.name.includes('MCP'));\n const mcpFailed = mcpSteps.filter((s) => s.status === 'failed').length;\n const mcpCheck =\n mcpFailed > 0\n ? `${String(mcpFailed)} MCP config(s) failed`\n : `${String(mcpSteps.length)} MCP configs OK`;\n\n const results = [\n mcpCheck,\n checkStepStatus(steps, 'Data Directory', 'Data dirs'),\n checkStepStatus(steps, 'Configuration', 'Config'),\n ];\n const hasIssues = results.some((r) => r.includes('failed'));\n\n return {\n name: 'Validation',\n status: hasIssues ? 'warning' : 'success',\n message: `${results.join(', ')}. Run \\`nexus-agents doctor\\` for full health check`,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n// ============================================================================\n// Main Command Helpers\n// ============================================================================\n\n/**\n * Adds Claude CLI warnings if not installed.\n */\nfunction addClaudeCliWarnings(warnings: string[], installed: boolean): void {\n if (!installed) {\n warnings.push(\n 'Claude CLI not found. Install it with: npm install -g @anthropic-ai/claude-code'\n );\n warnings.push('The MCP snippet uses npx to run nexus-agents (works without global install).');\n }\n}\n\n/**\n * Collects errors from failed steps.\n */\nfunction collectErrors(steps: readonly SetupStep[]): string[] {\n return steps.filter((s) => s.status === 'failed').map((s) => s.message ?? `${s.name} failed`);\n}\n\n/** Result context for building final result. */\ninterface SetupResultContext {\n startTime: number;\n steps: SetupStep[];\n warnings: string[];\n mcpResult: McpConfigResult | undefined;\n snippet: string | undefined;\n hookResult: HookConfigResult | undefined;\n hookSnippet: string | undefined;\n rulesPath: string | undefined;\n dataDirResult?: DataDirInitResult;\n}\n\n/** Checks if a config result represents a new (non-existing) success. */\nfunction isNewSuccess(result: McpConfigResult | HookConfigResult | undefined): boolean {\n return result?.success === true && !result.alreadyConfigured;\n}\n\n/** Builds the final setup result from context. */\nfunction buildSetupResult(ctx: SetupResultContext): SetupResult {\n const errors = collectErrors(ctx.steps);\n return {\n success: errors.length === 0,\n steps: ctx.steps,\n warnings: ctx.warnings,\n errors,\n durationMs: getTimeProvider().now() - ctx.startTime,\n ...(isNewSuccess(ctx.mcpResult) && { mcpConfigured: true }),\n ...(ctx.snippet !== undefined && { mcpSnippet: ctx.snippet }),\n ...(isNewSuccess(ctx.hookResult) && { hooksConfigured: true }),\n ...(ctx.hookSnippet !== undefined && { hookSnippet: ctx.hookSnippet }),\n ...(ctx.rulesPath !== undefined && { rulesPath: ctx.rulesPath }),\n ...(ctx.dataDirResult !== undefined && {\n dataDirPath: ctx.dataDirResult.rootPath,\n dataDirsCreated: ctx.dataDirResult.created.length,\n }),\n };\n}\n\n// ============================================================================\n// Main Command\n// ============================================================================\n\n/**\n * Runs the setup command.\n */\nexport function runSetup(options: Partial<SetupOptions> = {}): SetupResult {\n const startTime = getTimeProvider().now();\n const parsedOptions = SetupOptionsSchema.parse(options);\n const projectRoot = process.cwd();\n\n const warnings: string[] = [];\n\n // Step 1: Environment Detection\n const { env, step: detectionStep } = runDetectionStep(projectRoot);\n addClaudeCliWarnings(warnings, env.claudeCli.installed);\n\n // Step 2: Prerequisite Validation\n const { step: prereqStep, warnings: prereqWarnings } = runPrerequisiteStep();\n warnings.push(...prereqWarnings);\n\n // Step 3: MCP Configuration\n const { step: mcpStep, snippet, mcpResult } = runMcpConfigStep(env, parsedOptions);\n\n // Step 4: Rules File\n const { step: rulesStep, rulesPath } = runRulesStep(env, parsedOptions);\n\n // Step 5: Hooks Configuration (Issue #416)\n const { step: hooksStep, hookSnippet, hookResult } = runHooksStep(env, parsedOptions);\n\n // Step 6: Data Directory Initialization (#1249)\n const { step: dataDirStep, result: dataDirResult } = runDataDirStep(parsedOptions);\n\n // Step 7: OpenCode MCP Configuration (#1253)\n const openCodeStep = runOpenCodeStep(parsedOptions);\n\n // Step 8: Gemini MCP Configuration (#1259)\n const geminiStep = runGeminiStep(parsedOptions);\n\n // Step 9: Codex MCP Configuration (#1263)\n const codexStep = runCodexStep(parsedOptions);\n\n const configStep = runConfigStep(projectRoot, parsedOptions); // Step 10\n const steps = [\n detectionStep,\n prereqStep,\n mcpStep,\n rulesStep,\n hooksStep,\n dataDirStep,\n openCodeStep,\n geminiStep,\n codexStep,\n configStep,\n ];\n steps.push(runValidationStep(steps)); // Step 11: Validation (#1271)\n\n return buildSetupResult({\n startTime,\n steps,\n warnings,\n mcpResult,\n snippet,\n hookResult,\n hookSnippet,\n rulesPath,\n dataDirResult,\n });\n}\n\n/** Prints optional detail sections (MCP, hooks, rules, data dir). */\nfunction printDetailSections(result: SetupResult): void {\n if (result.mcpSnippet !== undefined || result.mcpConfigured === true) {\n const mcpResult: McpConfigResult =\n result.mcpConfigured === true\n ? {\n success: true,\n alreadyConfigured: false,\n message: 'Added nexus-agents MCP server to Claude Code',\n }\n : { success: false, alreadyConfigured: false, message: 'Manual configuration required' };\n printMcpResult(mcpResult, result.mcpSnippet);\n }\n if (result.hookSnippet !== undefined || result.hooksConfigured === true) {\n const hookResult: HookConfigResult =\n result.hooksConfigured === true\n ? {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents hooks in Claude Code settings',\n }\n : { success: false, alreadyConfigured: false, message: 'Manual configuration required' };\n printHooksResult(hookResult, result.hookSnippet);\n }\n if (result.rulesPath !== undefined) printRulesFile(result.rulesPath);\n if (result.dataDirPath !== undefined) printDataDirSection(result);\n printPermissionsSuggestion();\n}\n\n/** Prints the Claude Code permissions suggestion (#1945). */\nfunction printPermissionsSuggestion(): void {\n const snippet = generatePermissionsSnippet('all');\n const banner = buildPermissionsBanner(snippet);\n writeLine(banner);\n}\n\n/** Prints the data directory section. */\nfunction printDataDirSection(result: SetupResult): void {\n writeLine(formatHeader('Data Directory'));\n writeLine('─'.repeat(40));\n const count = result.dataDirsCreated ?? 0;\n const msg =\n count > 0\n ? `Created ${String(count)} directories under ${result.dataDirPath ?? ''}`\n : `All directories already exist at ${result.dataDirPath ?? ''}`;\n writeLine(msg);\n writeEmptyLine();\n}\n\n/**\n * Prints the setup result.\n */\nexport function printSetupResult(result: SetupResult, verbose: boolean): void {\n writeEmptyLine();\n writeLine(formatHeader(`Nexus Agents Setup v${VERSION}`));\n writeLine('═'.repeat(40));\n writeEmptyLine();\n\n printSteps(result.steps, verbose);\n printDetailSections(result);\n\n if (result.warnings.length > 0) printWarnings(result.warnings);\n if (result.errors.length > 0) printErrors(result.errors);\n printNextSteps(result.mcpConfigured === true, result.mcpSnippet !== undefined);\n printSummary(result.success);\n}\n\n/**\n * Prints the post-setup \"Getting Started\" banner (#2138).\n *\n * Three numbered steps tailored to what setup actually configured. If Claude\n * Code's MCP wiring succeeded we point step 2 at the integrated harness\n * (`/mcp` in Claude); otherwise we suggest the standalone `orchestrate`\n * command. Always shown after a successful setup — printing 3 lines is not\n * worth gating on first-run detection.\n *\n * @param mcpConfigured - True when an MCP harness (Claude/etc.) was wired up.\n */\nfunction printGettingStartedBanner(mcpConfigured: boolean): void {\n writeEmptyLine();\n writeLine(formatHeader('Getting started'));\n writeLine('─'.repeat(40));\n\n writeLine(' 1. nexus-agents hello — guided tour (no API keys needed)');\n if (mcpConfigured) {\n writeLine(' 2. Use through Claude Code — type /mcp in Claude to list tools');\n } else {\n writeLine(' 2. nexus-agents orchestrate \"...\" — run your first task');\n }\n writeLine(' 3. nexus-agents workflow list — explore built-in workflows');\n\n writeEmptyLine();\n writeLine(` ${colors.dim}Docs: https://github.com/williamzujkowski/nexus-agents${colors.reset}`);\n writeLine(` ${colors.dim}Harness wiring: docs/guides/HARNESS_COMPATIBILITY.md${colors.reset}`);\n}\n\n/**\n * Runs the post-setup health gate (#2137).\n *\n * After setup writes its files, this runs the verify checks and prints a\n * structured health summary inline. Returns `true` when no `severity: 'hard'`\n * checks failed — warnings still pass the gate.\n *\n * In `--dry-run` mode, the gate is skipped entirely (the user is previewing,\n * not actually installing).\n */\nasync function runPostSetupHealthGate(dryRun: boolean): Promise<boolean> {\n if (dryRun) return true;\n\n const result = await runVerify();\n const passed = result.checks.filter((c) => c.passed).length;\n const total = result.checks.length;\n\n writeEmptyLine();\n writeLine(formatHeader(`Health check (${String(passed)}/${String(total)} passed)`));\n writeLine('─'.repeat(40));\n\n for (const check of result.checks) {\n let symbol: string;\n if (check.passed) {\n symbol = `${colors.green}${symbols.check}${colors.reset}`;\n } else if (check.severity === 'warn') {\n symbol = `${colors.yellow}${symbols.warn}${colors.reset}`;\n } else {\n symbol = `${colors.red}${symbols.cross}${colors.reset}`;\n }\n writeLine(` ${symbol} ${check.name}: ${check.message}`);\n if (!check.passed && check.fix !== undefined) {\n writeLine(` ${colors.dim}→ Fix: ${check.fix}${colors.reset}`);\n }\n }\n\n writeEmptyLine();\n if (!result.noHardFailures) {\n writeLine(\n `${colors.red}${colors.bold}Action required: fix the blocking issues above before using nexus-agents.${colors.reset}`\n );\n } else if (!result.allPassed) {\n const warnCount = result.checks.filter((c) => !c.passed).length;\n writeLine(\n `${colors.yellow}${colors.bold}Setup complete with ${String(warnCount)} warning(s) — nexus-agents will run but some features are degraded.${colors.reset}`\n );\n } else {\n writeLine(\n `${colors.green}${colors.bold}All health checks passed. nexus-agents is ready.${colors.reset}`\n );\n }\n\n return result.noHardFailures;\n}\n\n/**\n * Setup command entry point (synchronous, non-interactive).\n *\n * @returns Exit code (0 = success, 1 = failure)\n */\nexport function setupCommand(options: Partial<SetupOptions> = {}): number {\n const parsedOptions = SetupOptionsSchema.parse(options);\n\n // Check for non-interactive mode in CI\n if (!isInteractive() && !parsedOptions.nonInteractive) {\n writeLine('Non-interactive environment detected.');\n writeLine('Run with --non-interactive or set CI=true.');\n return 1;\n }\n\n const result = runSetup(options);\n printSetupResult(result, parsedOptions.verbose);\n\n return result.success ? 0 : 1;\n}\n\n/** Extended options including interactive flag. */\nexport interface SetupCommandOptions extends Partial<SetupOptions> {\n interactive?: boolean;\n}\n\n/**\n * Setup command entry point with interactive wizard support.\n * (Source: Issue #425 - Interactive setup wizard)\n *\n * Also runs the post-setup health gate (#2137): after the configuration\n * steps complete, calls into `runVerify()` to surface install-time issues\n * that are easy to miss but break things at runtime (better-sqlite3 native\n * build, data dir writability, missing API keys). Health-gate warnings do\n * NOT fail setup — only `severity: 'hard'` failures do.\n *\n * @returns Exit code (0 = setup + no hard health failures, 1 = either failed)\n */\n/**\n * Runs the interactive wizard branch and returns its exit code.\n * Extracted from `setupCommandAsync` to keep cyclomatic complexity ≤10.\n */\nasync function runInteractiveSetup(options: SetupCommandOptions): Promise<number> {\n const wizardOptions = await runWizard();\n if (wizardOptions === undefined) return 1; // User cancelled.\n\n const mergedOptions = { ...options, ...wizardOptions };\n delete mergedOptions.interactive;\n\n const result = runSetup(mergedOptions);\n printSetupResult(result, mergedOptions.verbose ?? false);\n const healthOk = await runPostSetupHealthGate(mergedOptions.dryRun ?? false);\n if (result.success && !(mergedOptions.dryRun ?? false)) {\n printGettingStartedBanner(result.mcpConfigured === true);\n }\n return result.success && healthOk ? 0 : 1;\n}\n\nexport async function setupCommandAsync(options: SetupCommandOptions = {}): Promise<number> {\n if (options.interactive === true) {\n return runInteractiveSetup(options);\n }\n\n // Sync setup, then run the health gate, then print the getting-started banner.\n const setupResult = runSetupAndPrint(options);\n const healthOk = await runPostSetupHealthGate(options.dryRun ?? false);\n if (setupResult.exitCode === 0 && !(options.dryRun ?? false)) {\n printGettingStartedBanner(setupResult.mcpConfigured);\n }\n // Hard health failures override a successful setup; warnings don't.\n return setupResult.exitCode !== 0 || !healthOk ? 1 : 0;\n}\n\n/**\n * Runs setupCommand and captures both the exit code and the\n * `mcpConfigured` signal we need for the banner. Wraps the existing\n * synchronous path without changing its signature.\n */\nfunction runSetupAndPrint(options: SetupCommandOptions): {\n exitCode: number;\n mcpConfigured: boolean;\n} {\n const parsedOptions = SetupOptionsSchema.parse(options);\n if (!isInteractive() && !parsedOptions.nonInteractive) {\n writeLine('Non-interactive environment detected.');\n writeLine('Run with --non-interactive or set CI=true.');\n return { exitCode: 1, mcpConfigured: false };\n }\n const result = runSetup(options);\n printSetupResult(result, parsedOptions.verbose);\n return { exitCode: result.success ? 0 : 1, mcpConfigured: result.mcpConfigured === true };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { generateMcpSnippet, generateRulesContent, detectEnvironment };\nexport { runWizard } from './setup-wizard.js';\nexport type { SetupOptions, SetupResult };\n// SetupCommandOptions is already exported via interface definition above\nexport type { WizardAnswers, UsageMode } from './setup-wizard.js';\n","/**\n * nexus-agents setup command types\n *\n * Type definitions for the user onboarding automation system.\n *\n * @module cli/setup-types\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { z } from 'zod';\nimport type { CommandResult } from '../core/index.js';\n\n/**\n * Setup command options schema.\n */\nexport const SetupOptionsSchema = z.object({\n /** Skip interactive prompts */\n nonInteractive: z.boolean().default(false),\n /** Overwrite existing configurations */\n force: z.boolean().default(false),\n /** Skip MCP configuration */\n skipMcp: z.boolean().default(false),\n /** Skip CLAUDE.md/rules generation */\n skipRules: z.boolean().default(false),\n /** Skip hooks configuration (Issue #416) */\n skipHooks: z.boolean().default(false),\n /** Skip config file generation (#1252) */\n skipConfig: z.boolean().default(false),\n /** Skip OpenCode MCP configuration (#1253) */\n skipOpencode: z.boolean().default(false),\n /** Skip Gemini CLI MCP configuration (#1259) */\n skipGemini: z.boolean().default(false),\n /** Skip Codex CLI MCP configuration (#1263) */\n skipCodex: z.boolean().default(false),\n /** Show what would be done without making changes */\n dryRun: z.boolean().default(false),\n /** Show detailed output */\n verbose: z.boolean().default(false),\n /** Target scope for MCP config */\n scope: z.enum(['user', 'project']).default('user'),\n});\n\nexport type SetupOptions = z.infer<typeof SetupOptionsSchema>;\n\n/**\n * Claude CLI detection result.\n */\nexport interface ClaudeCliInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n readonly configPath: string;\n readonly mcpJsonPath: string;\n}\n\n/**\n * Existing MCP configuration info.\n */\nexport interface McpConfigInfo {\n readonly exists: boolean;\n readonly path: string;\n readonly hasNexusAgents: boolean;\n readonly servers: readonly string[];\n}\n\n/**\n * MCP server configuration entry.\n */\nexport interface McpServerEntry {\n readonly command: string;\n readonly args?: readonly string[];\n readonly env?: Record<string, string>;\n}\n\n/**\n * MCP JSON configuration format.\n */\nexport interface McpJsonConfig {\n readonly mcpServers?: Record<string, McpServerEntry>;\n}\n\n/**\n * Project type detection.\n */\nexport type ProjectType =\n | 'typescript'\n | 'javascript'\n | 'python'\n | 'rust'\n | 'go'\n | 'java'\n | 'unknown';\n\n/**\n * Project information.\n */\nexport interface ProjectInfo {\n readonly root: string;\n readonly hasPackageJson: boolean;\n readonly hasClaudeMd: boolean;\n readonly hasClaudeRules: boolean;\n readonly hasNexusConfig: boolean;\n readonly projectType: ProjectType;\n readonly packageName?: string;\n}\n\n/**\n * Complete environment information.\n */\nexport interface EnvironmentInfo {\n readonly platform: NodeJS.Platform;\n readonly homeDir: string;\n readonly claudeCli: ClaudeCliInfo;\n readonly existingMcpConfig: McpConfigInfo | undefined;\n readonly projectInfo: ProjectInfo;\n}\n\n/**\n * Setup step status.\n */\nexport interface SetupStep {\n readonly name: string;\n readonly status: 'pending' | 'success' | 'skipped' | 'failed' | 'warning';\n readonly message?: string;\n readonly durationMs?: number;\n}\n\n/**\n * Setup result summary.\n * Extends CommandResult base pattern (Issue #584).\n */\nexport interface SetupResult extends CommandResult {\n /** Setup steps executed */\n readonly steps: readonly SetupStep[];\n /** MCP configuration was successful via Claude CLI */\n readonly mcpConfigured?: boolean;\n /** Fallback MCP snippet for manual configuration */\n readonly mcpSnippet?: string;\n /** Hooks configuration was successful via Claude CLI (Issue #416) */\n readonly hooksConfigured?: boolean;\n /** Fallback hook snippet for manual configuration */\n readonly hookSnippet?: string;\n readonly rulesPath?: string;\n /** Data directory path if initialized (#1249) */\n readonly dataDirPath?: string;\n /** Number of data directories created (#1249) */\n readonly dataDirsCreated?: number;\n readonly warnings: readonly string[];\n readonly errors: readonly string[];\n readonly durationMs: number;\n}\n\n/**\n * Backup information for rollback.\n */\nexport interface BackupInfo {\n readonly type: 'file';\n readonly originalPath: string;\n readonly backupPath: string;\n readonly content: string;\n}\n\n/**\n * Rollback item types.\n */\nexport type RollbackItem =\n | { type: 'file-backup'; backup: BackupInfo }\n | { type: 'file-created'; path: string }\n | { type: 'file-modified'; backup: BackupInfo };\n","/**\n * nexus-agents setup environment detection\n *\n * Environment detection helpers for Claude CLI and project setup.\n *\n * @module cli/setup-environment\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, basename } from 'node:path';\nimport { CLI_SUBPROCESS_TIMEOUTS } from '../config/timeouts.js';\nimport type {\n ClaudeCliInfo,\n McpConfigInfo,\n ProjectInfo,\n ProjectType,\n EnvironmentInfo,\n} from './setup-types.js';\n\n/**\n * Parses Claude CLI version from output.\n */\nfunction parseClaudeVersion(output: string): string | undefined {\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match?.[1];\n}\n\n/**\n * Detects if Claude CLI is installed and available.\n * Uses a 3-second timeout to avoid hanging in slow environments.\n */\nexport function detectClaudeCli(): ClaudeCliInfo {\n const configPath = join(homedir(), '.claude');\n const mcpJsonPath = join(homedir(), '.claude.json');\n\n try {\n const result = execSync('claude --version', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: CLI_SUBPROCESS_TIMEOUTS.envSetupMs,\n });\n const version = parseClaudeVersion(result);\n\n return {\n installed: true,\n version,\n configPath,\n mcpJsonPath,\n };\n } catch {\n return {\n installed: false,\n version: undefined,\n configPath,\n mcpJsonPath,\n };\n }\n}\n\n/** Extracts MCP servers from direct mcpServers key (project-scoped .mcp.json). */\nfunction extractDirectServers(config: Record<string, unknown>): string[] | undefined {\n const mcpServers = config['mcpServers'] as Record<string, unknown> | undefined;\n if (mcpServers === undefined) return undefined;\n return Object.keys(mcpServers);\n}\n\n/** Extracts MCP servers from projects key (~/.claude.json format). */\nfunction extractProjectServers(config: Record<string, unknown>): string[] | undefined {\n const projects = config['projects'] as Record<string, Record<string, unknown>> | undefined;\n if (projects === undefined) return undefined;\n const allServers = new Set<string>();\n for (const proj of Object.values(projects)) {\n const mcpServers = proj['mcpServers'] as Record<string, unknown> | undefined;\n if (mcpServers !== undefined) Object.keys(mcpServers).forEach((n) => allServers.add(n));\n }\n return [...allServers];\n}\n\n/** Builds McpConfigInfo from a server list. */\nfunction buildMcpInfo(path: string, servers: string[]): McpConfigInfo {\n return { exists: true, path, hasNexusAgents: servers.includes('nexus-agents'), servers };\n}\n\n/**\n * Detects existing MCP configuration.\n *\n * Handles two formats:\n * - `.mcp.json` (project-scoped): `{ mcpServers: { ... } }`\n * - `~/.claude.json` (user-scoped): `{ projects: { [path]: { mcpServers: { ... } } } }`\n */\nexport function detectMcpConfig(mcpJsonPath: string): McpConfigInfo | undefined {\n if (!existsSync(mcpJsonPath)) return undefined;\n try {\n const config = JSON.parse(readFileSync(mcpJsonPath, 'utf-8')) as Record<string, unknown>;\n const direct = extractDirectServers(config);\n if (direct !== undefined) return buildMcpInfo(mcpJsonPath, direct);\n const projected = extractProjectServers(config);\n if (projected !== undefined) return buildMcpInfo(mcpJsonPath, projected);\n return buildMcpInfo(mcpJsonPath, []);\n } catch {\n return buildMcpInfo(mcpJsonPath, []);\n }\n}\n\n/** Checks for TypeScript in package.json devDependencies. */\nfunction hasTypeScriptInPackageJson(root: string): boolean {\n try {\n const content = readFileSync(join(root, 'package.json'), 'utf-8');\n const parsed: unknown = JSON.parse(content);\n const pkg = parsed as Record<string, unknown>;\n const devDeps = pkg['devDependencies'] as Record<string, string> | undefined;\n return devDeps?.['typescript'] !== undefined;\n } catch {\n return false;\n }\n}\n\n/** Mapping of config files to project types. */\nconst CONFIG_FILE_TYPES: readonly [string, ProjectType][] = [\n ['tsconfig.json', 'typescript'],\n ['Cargo.toml', 'rust'],\n ['go.mod', 'go'],\n ['pyproject.toml', 'python'],\n ['setup.py', 'python'],\n ['pom.xml', 'java'],\n ['build.gradle', 'java'],\n];\n\n/**\n * Detects project type based on configuration files.\n */\nexport function detectProjectType(root: string): ProjectType {\n // Check config files\n for (const [file, type] of CONFIG_FILE_TYPES) {\n if (existsSync(join(root, file))) return type;\n }\n\n // Check package.json\n if (existsSync(join(root, 'package.json'))) {\n return hasTypeScriptInPackageJson(root) ? 'typescript' : 'javascript';\n }\n\n return 'unknown';\n}\n\n/**\n * Detects project information.\n */\nexport function detectProjectInfo(root: string): ProjectInfo {\n let packageName: string | undefined;\n\n if (existsSync(join(root, 'package.json'))) {\n try {\n const content = readFileSync(join(root, 'package.json'), 'utf-8');\n const pkg = JSON.parse(content) as Record<string, unknown>;\n const nameValue = pkg['name'];\n packageName = typeof nameValue === 'string' ? nameValue : undefined;\n } catch (parseErr: unknown) {\n // Non-critical: package.json parse failure, fall through to basename\n void parseErr;\n }\n }\n\n return {\n root,\n hasPackageJson: existsSync(join(root, 'package.json')),\n hasClaudeMd: existsSync(join(root, 'CLAUDE.md')),\n // Rules relocated in #2121: canonical is `.rules/`. Still accept the\n // legacy `.claude/rules/` path so detection doesn't break on repos that\n // haven't migrated yet.\n hasClaudeRules: existsSync(join(root, '.rules')) || existsSync(join(root, '.claude', 'rules')),\n hasNexusConfig: existsSync(join(root, 'nexus-agents.yaml')),\n projectType: detectProjectType(root),\n packageName: packageName ?? basename(root),\n };\n}\n\n/**\n * Detects complete environment information.\n */\nexport function detectEnvironment(projectRoot: string): EnvironmentInfo {\n const claudeCli = detectClaudeCli();\n const existingMcpConfig = detectMcpConfig(claudeCli.mcpJsonPath);\n const projectInfo = detectProjectInfo(projectRoot);\n\n return {\n platform: process.platform,\n homeDir: homedir(),\n claudeCli,\n existingMcpConfig,\n projectInfo,\n };\n}\n","/**\n * nexus-agents setup MCP configuration\n *\n * MCP configuration helpers using Claude CLI's `claude mcp` commands.\n *\n * @module cli/setup-mcp\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { execSync, execFileSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { McpJsonConfig, McpServerEntry } from './setup-types.js';\nimport { getErrorMessage } from '../core/index.js';\n\n/** MCP entry for nexus-agents */\nexport const NEXUS_AGENTS_MCP_ENTRY: McpServerEntry = {\n command: 'nexus-agents',\n args: ['--mode=server'],\n};\n\n/** MCP entry with npx for users who install globally */\nexport const NEXUS_AGENTS_MCP_NPX_ENTRY: McpServerEntry = {\n command: 'npx',\n args: ['-y', 'nexus-agents@latest', '--mode=server'],\n};\n\n/**\n * Result of MCP configuration attempt.\n */\nexport interface McpConfigResult {\n success: boolean;\n alreadyConfigured: boolean;\n message: string;\n}\n\n/**\n * Checks if nexus-agents MCP server is already configured in Claude CLI.\n */\nexport function isMcpServerConfigured(): boolean {\n try {\n const result = execSync('claude mcp get nexus-agents', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return result.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Maps scope option to Claude CLI `-s` flag value.\n */\nfunction scopeToFlag(scope: 'user' | 'project'): string {\n return scope === 'project' ? 'local' : 'user';\n}\n\n/**\n * Removes existing MCP server configuration if present.\n */\nfunction removeExistingMcpServer(scope: 'user' | 'project' = 'user'): void {\n try {\n execSync(`claude mcp remove nexus-agents -s ${scopeToFlag(scope)}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n // Ignore removal errors\n }\n}\n\n/**\n * Adds MCP server to Claude CLI.\n */\nfunction addMcpServer(useNpx: boolean, scope: 'user' | 'project' = 'user'): McpConfigResult {\n const entry = useNpx ? NEXUS_AGENTS_MCP_NPX_ENTRY : NEXUS_AGENTS_MCP_ENTRY;\n const jsonConfig = JSON.stringify(entry);\n const scopeLabel = scope === 'project' ? 'project' : 'global';\n\n try {\n execFileSync(\n 'claude',\n ['mcp', 'add-json', 'nexus-agents', jsonConfig, '-s', scopeToFlag(scope)],\n {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }\n );\n return {\n success: true,\n alreadyConfigured: false,\n message: `Added nexus-agents MCP server to Claude Code (${scopeLabel})`,\n };\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to add MCP server: ${errorMsg}`,\n };\n }\n}\n\n/**\n * Configures nexus-agents MCP server using Claude CLI.\n *\n * Uses `claude mcp add-json` to register the server.\n * @param scope - 'user' for global (~/.claude/mcp.json), 'project' for local (.mcp.json)\n */\nexport function configureMcpServer(\n useNpx: boolean = false,\n force: boolean = false,\n scope: 'user' | 'project' = 'user'\n): McpConfigResult {\n const isConfigured = isMcpServerConfigured();\n\n // Check if already configured\n if (!force && isConfigured) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents MCP server already configured (use --force to reconfigure)',\n };\n }\n\n // Remove existing if forcing\n if (force && isConfigured) {\n removeExistingMcpServer(scope);\n }\n\n return addMcpServer(useNpx, scope);\n}\n\n/**\n * Generates MCP configuration snippet for manual setup (fallback).\n */\nexport function generateMcpSnippet(useNpx: boolean = false): string {\n const entry = useNpx ? NEXUS_AGENTS_MCP_NPX_ENTRY : NEXUS_AGENTS_MCP_ENTRY;\n const config: McpJsonConfig = {\n mcpServers: {\n 'nexus-agents': entry,\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generates the full MCP config path based on scope.\n *\n * Claude Code uses:\n * - Project scope: `.mcp.json` in project root\n * - User scope: `~/.claude.json` (stores MCP config under `projects` key)\n */\nexport function getMcpJsonPath(scope: 'user' | 'project', projectRoot: string): string {\n if (scope === 'project') {\n return join(projectRoot, '.mcp.json');\n }\n return join(homedir(), '.claude.json');\n}\n\n// ============================================================================\n// Hook Configuration (Issue #411, #416)\n// ============================================================================\n\n/**\n * Generates hook configuration for Claude CLI settings.json.\n * (Source: Issue #411 - Claude CLI Hook Integration)\n */\nexport function generateHookConfig(): HookSettingsConfig {\n return {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks session-start',\n },\n ],\n },\n ],\n PreToolUse: [\n {\n matcher: 'Bash',\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks pre-tool --tool Bash --validate',\n },\n ],\n },\n ],\n PostToolUse: [\n {\n matcher: '*',\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks post-tool --track-metrics',\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks stop --check-tasks',\n },\n ],\n },\n ],\n },\n };\n}\n\n/**\n * Hook command entry structure.\n */\ninterface HookCommandEntry {\n type: 'command';\n command: string;\n}\n\n/**\n * Hook matcher entry structure.\n */\ninterface HookMatcherEntry {\n matcher?: string;\n hooks: HookCommandEntry[];\n}\n\n/**\n * Hook settings configuration structure.\n */\nexport interface HookSettingsConfig {\n hooks: {\n SessionStart?: HookMatcherEntry[];\n SessionEnd?: HookMatcherEntry[];\n PreToolUse?: HookMatcherEntry[];\n PostToolUse?: HookMatcherEntry[];\n Stop?: HookMatcherEntry[];\n };\n}\n\n/**\n * Result of hook configuration attempt.\n */\nexport interface HookConfigResult {\n success: boolean;\n alreadyConfigured: boolean;\n message: string;\n}\n\n/**\n * Checks if hooks are already configured in Claude CLI settings.\n */\nexport function areHooksConfigured(): boolean {\n try {\n const result = execSync('claude config get hooks', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n // If we get output that includes nexus-agents, hooks are configured\n return result.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Reads existing hooks from Claude CLI settings.\n * Returns parsed hooks object or undefined if no hooks exist or parse fails.\n */\nexport function getExistingHooks(): HookSettingsConfig['hooks'] | undefined {\n try {\n const result = execSync('claude config get hooks', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const trimmed = result.trim();\n if (!trimmed || trimmed === 'null' || trimmed === 'undefined') {\n return undefined;\n }\n return JSON.parse(trimmed) as HookSettingsConfig['hooks'];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Merges two hook arrays, combining entries without duplicating nexus-agents hooks.\n */\nfunction mergeHookArrays(\n existing: HookMatcherEntry[] | undefined,\n newHooks: HookMatcherEntry[]\n): HookMatcherEntry[] {\n if (!existing || existing.length === 0) {\n return newHooks;\n }\n\n // Filter out any existing nexus-agents hooks to avoid duplicates\n const filteredExisting = existing.filter((entry) => {\n return !entry.hooks.some((h) => h.command.startsWith('nexus-agents'));\n });\n\n // Combine existing (non-nexus) hooks with new nexus-agents hooks\n return [...filteredExisting, ...newHooks];\n}\n\n/**\n * Merges nexus-agents hooks with existing hooks configuration.\n * Preserves existing user hooks while adding/updating nexus-agents hooks.\n */\nexport function mergeHookConfigs(\n existing: HookSettingsConfig['hooks'] | undefined,\n newConfig: HookSettingsConfig['hooks']\n): HookSettingsConfig['hooks'] {\n if (!existing) {\n return newConfig;\n }\n\n const hookTypes = ['SessionStart', 'SessionEnd', 'PreToolUse', 'PostToolUse', 'Stop'] as const;\n\n const merged: HookSettingsConfig['hooks'] = {};\n\n for (const hookType of hookTypes) {\n const existingHooks = existing[hookType];\n const newHooks = newConfig[hookType];\n\n if (newHooks) {\n merged[hookType] = mergeHookArrays(existingHooks, newHooks);\n } else if (existingHooks) {\n merged[hookType] = existingHooks;\n }\n }\n\n return merged;\n}\n\n/**\n * Configures hooks in Claude CLI settings.\n * Uses `claude config set hooks` to register hook commands.\n * Merges with existing hooks instead of overwriting them (Issue #420).\n */\nexport function configureHooks(force: boolean = false): HookConfigResult {\n const isConfigured = areHooksConfigured();\n\n if (!force && isConfigured) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'Hooks already configured (use --force to reconfigure)',\n };\n }\n\n const nexusHookConfig = generateHookConfig();\n\n try {\n // Read existing hooks first to merge (Issue #420)\n const existingHooks = getExistingHooks();\n const mergedHooks = mergeHookConfigs(existingHooks, nexusHookConfig.hooks);\n\n // Use claude config set with merged hooks\n const configJson = JSON.stringify(mergedHooks);\n execFileSync('claude', ['config', 'set', 'hooks', configJson], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return {\n success: true,\n alreadyConfigured: false,\n message: existingHooks\n ? 'Merged nexus-agents hooks with existing hooks in Claude Code settings'\n : 'Configured nexus-agents hooks in Claude Code settings',\n };\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure hooks: ${errorMsg}`,\n };\n }\n}\n\n/**\n * Generates hook configuration snippet for manual setup.\n */\nexport function generateHookSnippet(): string {\n const config = generateHookConfig();\n return JSON.stringify(config, null, 2);\n}\n","/**\n * nexus-agents setup rules generation\n *\n * Rules file and backup management helpers.\n *\n * @module cli/setup-rules\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { VERSION } from '../version.js';\nimport { getTimeProvider } from '../core/index.js';\nimport type { BackupInfo } from './setup-types.js';\n\n/**\n * Generates the nexus-agents rules file content.\n */\nexport function generateRulesContent(): string {\n return `# Nexus-Agents Integration\n\nThis project uses [nexus-agents](https://github.com/williamzujkowski/nexus-agents) v${VERSION} for multi-agent orchestration.\n\n## MCP Tools Available\n\nWhen running with MCP server mode, these tools are available:\n\n| Tool | Description |\n| ---- | ----------- |\n| \\`orchestrate\\` | Task orchestration with Orchestrator coordination |\n| \\`create_expert\\` | Dynamic expert agent creation |\n| \\`run_workflow\\` | Execute workflow templates |\n| \\`delegate_to_model\\` | Route task to optimal model |\n| \\`list_experts\\` | List available expert types (discoverability) |\n| \\`list_workflows\\` | List available workflow templates |\n\n## Quick Commands\n\n\\`\\`\\`bash\n# Orchestrate a task with specialized experts\nnexus-agents orchestrate \"Implement feature X with tests\"\n\n# List available experts\nnexus-agents expert list\n\n# Run a workflow\nnexus-agents workflow list\nnexus-agents workflow run code-review --input='{\"url\": \"...\"}'\n\n# Check system health\nnexus-agents doctor\n\n# Generate config\nnexus-agents config init\n\\`\\`\\`\n\n## Usage Examples\n\n**Orchestrate a code review:**\n\\`\\`\\`\nUse nexus-agents to review this PR: https://github.com/owner/repo/pull/123\n\\`\\`\\`\n\n**Create a specialized expert:**\n\\`\\`\\`\nCreate a security expert to audit this codebase for vulnerabilities\n\\`\\`\\`\n\n**Run a workflow:**\n\\`\\`\\`\nRun the code-review workflow with the current changes\n\\`\\`\\`\n\n## Configuration\n\n- Config file: \\`./nexus-agents.yaml\\`\n- Generate config: \\`nexus-agents config init\\`\n- Check health: \\`nexus-agents doctor\\`\n\n---\n*Generated by nexus-agents setup v${VERSION}*\n`;\n}\n\n/**\n * Gets the rules file path.\n *\n * As of #2121 rules live at `<root>/.rules/` (harness-neutral location,\n * was `.claude/rules/`). Claude Code finds them via CLAUDE.md references,\n * so the move doesn't break its auto-load. Non-Claude harnesses (OpenCode,\n * Codex, Cursor, etc.) can point at the same directory.\n */\nexport function getRulesFilePath(projectRoot: string): string {\n return join(projectRoot, '.rules', 'nexus-agents.md');\n}\n\n/**\n * Creates the rules file.\n */\nexport function createRulesFile(projectRoot: string, dryRun: boolean): string {\n const rulesPath = getRulesFilePath(projectRoot);\n const content = generateRulesContent();\n\n if (!dryRun) {\n const rulesDir = dirname(rulesPath);\n mkdirSync(rulesDir, { recursive: true });\n writeFileSync(rulesPath, content, 'utf-8');\n }\n\n return rulesPath;\n}\n\n/**\n * Creates a backup of a file.\n */\nexport function backupFile(filePath: string): BackupInfo {\n const content = readFileSync(filePath, 'utf-8');\n const backupPath = `${filePath}.backup.${String(getTimeProvider().now())}`;\n writeFileSync(backupPath, content, 'utf-8');\n\n return {\n type: 'file',\n originalPath: filePath,\n backupPath,\n content,\n };\n}\n\n/**\n * Restores a file from backup.\n */\nexport function restoreBackup(backup: BackupInfo): void {\n writeFileSync(backup.originalPath, backup.content, 'utf-8');\n}\n","/**\n * nexus-agents setup output formatting\n *\n * Output formatting helpers for setup command.\n * Re-exports from consolidated ansi-output.ts for backward compatibility.\n *\n * @module cli/setup-formatting\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\n// Re-export consolidated formatters from ansi-output.ts\nexport { formatStatus, formatHeader, formatCodeBlock, colors, symbols } from './ansi-output.js';\n\n/**\n * Checks if running in interactive mode.\n */\nexport function isInteractive(): boolean {\n if (!process.stdout.isTTY) return false;\n if (process.env['CI'] === 'true') return false;\n if (process.env['CONTINUOUS_INTEGRATION'] !== undefined) return false;\n return true;\n}\n","/**\n * OpenCode MCP auto-configuration for setup command.\n *\n * Detects OpenCode CLI and generates opencode.json/.jsonc with nexus-agents MCP server.\n * Supports JSONC (JSON with Comments) via `jsonc-parser` for comment-preserving writes.\n *\n * @module cli/setup-opencode\n * (Source: Issue #1253 - OpenCode MCP auto-configuration, #1255 - JSONC support)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as jsoncParse, modify, applyEdits } from 'jsonc-parser';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport { detectCliBinary, type CliDetectionInfo } from './setup-cli-detection.js';\n\nconst logger = createLogger({ component: 'setup-opencode' });\n\n/**\n * OpenCode detection result.\n *\n * Type alias of {@link CliDetectionInfo} — see #2155.\n */\nexport type OpenCodeCliInfo = CliDetectionInfo;\n\n/** OpenCode MCP configuration result. */\nexport interface OpenCodeConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n readonly configPath: string;\n}\n\n/** Resolved config file info. */\nexport interface ResolvedConfig {\n readonly path: string;\n readonly isJsonc: boolean;\n readonly exists: boolean;\n}\n\n/** Detects OpenCode CLI installation. Delegates to {@link detectCliBinary}. */\nexport function detectOpenCodeCli(): OpenCodeCliInfo {\n return detectCliBinary('opencode');\n}\n\n/**\n * Resolves the OpenCode config directory path.\n * OpenCode uses ~/.config/opencode/ on Linux/macOS.\n */\nfunction getOpenCodeConfigDir(): string {\n return join(homedir(), '.config', 'opencode');\n}\n\n/**\n * Resolves the path for nexus-agents CLI command.\n * Uses `npx nexus-agents` for portability.\n */\nfunction getNexusCommand(): readonly string[] {\n return ['npx', 'nexus-agents', '--mode=server'];\n}\n\nconst NEXUS_MCP_ENTRY = {\n type: 'local',\n command: getNexusCommand(),\n enabled: true,\n};\n\n/**\n * Resolves the OpenCode config file in a directory.\n * Prefers .jsonc over .json (matching OpenCode's own priority).\n */\nexport function resolveOpenCodeConfig(dir: string): ResolvedConfig {\n const jsoncPath = join(dir, 'opencode.jsonc');\n if (existsSync(jsoncPath)) {\n return { path: jsoncPath, isJsonc: true, exists: true };\n }\n const jsonPath = join(dir, 'opencode.json');\n if (existsSync(jsonPath)) {\n return { path: jsonPath, isJsonc: false, exists: true };\n }\n return { path: jsonPath, isJsonc: false, exists: false };\n}\n\n/** Checks if nexus-agents is already configured in an existing config. */\nfunction isAlreadyConfigured(resolved: ResolvedConfig): boolean {\n if (!resolved.exists) return false;\n try {\n const raw = readFileSync(resolved.path, 'utf-8');\n const config = jsoncParse(raw) as Record<string, unknown> | null;\n const mcp = config?.['mcp'] as Record<string, unknown> | undefined;\n return mcp?.['nexus-agents'] !== undefined;\n } catch {\n logger.debug('Failed to parse existing OpenCode config, will overwrite');\n return false;\n }\n}\n\n/** Writes nexus-agents MCP entry using comment-preserving edits for JSONC. */\nfunction writeJsoncConfig(configPath: string, raw: string): void {\n let result = raw;\n result = applyEdits(result, modify(result, ['mcp', 'nexus-agents'], NEXUS_MCP_ENTRY, {}));\n result = applyEdits(result, modify(result, ['$schema'], 'https://opencode.ai/config.json', {}));\n writeFileSync(configPath, result, 'utf-8');\n}\n\n/** Writes nexus-agents MCP entry as plain JSON for new configs. */\nfunction writeJsonConfig(configPath: string): void {\n const config = {\n $schema: 'https://opencode.ai/config.json',\n mcp: { 'nexus-agents': NEXUS_MCP_ENTRY },\n };\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/** Writes the merged config with nexus-agents MCP entry. */\nfunction writeOpenCodeConfig(configDir: string, resolved: ResolvedConfig): void {\n if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true });\n\n if (resolved.exists) {\n const raw = readFileSync(resolved.path, 'utf-8');\n writeJsoncConfig(resolved.path, raw);\n } else {\n writeJsonConfig(resolved.path);\n }\n}\n\n/** Options for configureOpenCode. */\nexport interface ConfigureOpenCodeOptions {\n readonly force: boolean;\n readonly dryRun: boolean;\n readonly projectRoot?: string;\n}\n\n/** Validates projectRoot to prevent path traversal (CWE-22). */\nfunction validateProjectRoot(projectRoot: string): string {\n const resolved = resolve(projectRoot);\n if (!existsSync(resolved)) {\n throw new Error(`Project root does not exist: ${resolved}`);\n }\n return resolved;\n}\n\n/**\n * Configures OpenCode with nexus-agents MCP server.\n * Supports both global (~/.config/opencode/) and project-local configs.\n */\nexport function configureOpenCode(\n force: boolean,\n dryRun: boolean,\n options?: ConfigureOpenCodeOptions\n): OpenCodeConfigResult {\n try {\n return configureOpenCodeInner(force, dryRun, options);\n } catch (error: unknown) {\n const fallbackPath = join(getOpenCodeConfigDir(), 'opencode.json');\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure OpenCode: ${getErrorMessage(error)}`,\n configPath: fallbackPath,\n };\n }\n}\n\nfunction configureOpenCodeInner(\n force: boolean,\n dryRun: boolean,\n options?: ConfigureOpenCodeOptions\n): OpenCodeConfigResult {\n const configDir =\n options?.projectRoot !== undefined\n ? validateProjectRoot(options.projectRoot)\n : getOpenCodeConfigDir();\n const resolved = resolveOpenCodeConfig(configDir);\n\n if (isAlreadyConfigured(resolved) && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in OpenCode',\n configPath: resolved.path,\n };\n }\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: `Would configure nexus-agents MCP in ${resolved.path}`,\n configPath: resolved.path,\n };\n }\n writeOpenCodeConfig(configDir, resolved);\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in OpenCode',\n configPath: resolved.path,\n };\n}\n","/**\n * Shared CLI binary detection helpers (#2155, child of #2151).\n *\n * Consolidates the near-identical detection logic that previously lived in\n * `setup-codex.ts`, `setup-gemini.ts`, and `setup-opencode.ts`. Each setup\n * file now delegates to `detectCliBinary(name)` instead of carrying its\n * own copy of the platform-aware locator + version-extraction logic.\n *\n * The per-CLI `ConfigResult` interfaces remain separate because they\n * legitimately differ (Codex writes via MCP, Gemini and OpenCode write to\n * config files with paths).\n *\n * @module cli/setup-cli-detection\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { platform } from 'node:os';\n\nimport { classifyExecError, type DetectionError } from './cli-detection-error.js';\n\n/** Generic CLI detection result. Consumed by every `setup-*.ts` detector. */\nexport interface CliDetectionInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n /**\n * Classification of why detection failed. Set when `installed` is `false`\n * OR when the binary was located but `--version` failed (#2152).\n */\n readonly detectionError?: DetectionError;\n}\n\n/** Returns the platform-appropriate command for locating an executable. */\nexport function getCliLocatorCommand(): 'where' | 'which' {\n return platform() === 'win32' ? 'where' : 'which';\n}\n\n/**\n * Extracts a semver triple (`X.Y.Z`) from CLI `--version` output.\n *\n * Pure helper — exported for direct unit testing. Returns the matched\n * version string or undefined when no semver-shaped substring is present.\n */\nexport function extractSemver(output: string): string | undefined {\n const match = /(\\d+\\.\\d+\\.\\d+)/.exec(output);\n return match?.[1];\n}\n\n/**\n * Detects whether a CLI binary is installed and reports its version.\n *\n * Two-phase detection:\n * 1. Locate via `which` / `where` — fast PATH check (3s timeout).\n * 2. If located, run `<name> --version` and extract semver (5s timeout).\n *\n * Both phases trap `execFileSync` exceptions and return a `CliDetectionInfo`\n * with a classified `detectionError`. Callers never see exceptions from\n * this function.\n */\nexport function detectCliBinary(name: string): CliDetectionInfo {\n try {\n execFileSync(getCliLocatorCommand(), [name], { timeout: 3000, stdio: 'pipe' });\n } catch (err: unknown) {\n return { installed: false, version: undefined, detectionError: classifyExecError(err) };\n }\n\n try {\n const output = execFileSync(name, ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return { installed: true, version: extractSemver(output) };\n } catch (err: unknown) {\n return { installed: true, version: undefined, detectionError: classifyExecError(err) };\n }\n}\n","/**\n * nexus-agents/cli - CLI detection error classification (#2152)\n *\n * Small helper shared by `setup-codex.ts`, `setup-gemini.ts`, `setup-opencode.ts`\n * (and later `setup-cli-detection.ts` once #2155 consolidates them) so that a\n * `which`/`where` or `<cli> --version` failure is classified instead of\n * silently collapsed into `installed: false`.\n *\n * Before this file, all three setup modules did `catch { return { installed: false } }`,\n * treating `ENOENT` (genuinely not installed), `ETIMEDOUT` (PATH lookup hung),\n * `EACCES` (binary present but not executable), and arbitrary other exec\n * failures identically. That made doctor/verify diagnostics unactionable.\n *\n * @module cli/cli-detection-error\n */\n\n/**\n * Stable classification of why a CLI-detection exec failed.\n *\n * - `not-found`: binary is not on PATH (`ENOENT`). User action: install the CLI.\n * - `timeout`: the exec hung past the configured timeout (`ETIMEDOUT`,\n * `exit code null with signal`). User action: investigate PATH for hung\n * filesystems (NFS mounts, dead autofs entries).\n * - `permission`: binary is present but the current user can't execute it\n * (`EACCES`, `EPERM`). User action: fix mode bits or ownership.\n * - `other`: any other exec failure. User action: re-run with verbose\n * logging or inspect stderr directly.\n */\nexport type DetectionError = 'not-found' | 'timeout' | 'permission' | 'other';\n\n/**\n * Human-readable explanation for each detection-error class. Intended for\n * `doctor`/`verify` output — short enough to fit on one line next to the CLI\n * name.\n */\nexport const DETECTION_ERROR_MESSAGES: Record<DetectionError, string> = {\n 'not-found': 'binary not on PATH',\n timeout: 'detection timed out (hung PATH?)',\n permission: 'binary present but not executable',\n other: 'detection failed — check verbose logs',\n};\n\n/**\n * Formats a user-facing \"not installed\" message that incorporates the\n * detection-error class. Called by setup runners to replace the flat\n * \"<cli> not installed\" message when the underlying cause is more specific.\n *\n * - `not-found` or undefined → \"<cli> not installed\"\n * - other classes → \"<cli> detection failed: <class-message>\"\n */\nexport function formatDetectionMessage(cliName: string, detectionError?: DetectionError): string {\n if (detectionError === undefined || detectionError === 'not-found') {\n return `${cliName} not installed`;\n }\n return `${cliName} detection failed: ${DETECTION_ERROR_MESSAGES[detectionError]}`;\n}\n\n/**\n * Classifies a thrown error from `execFileSync('which'|'where', ...)` or\n * `execFileSync(cli, ['--version'])`.\n *\n * Node's `execFileSync` throws with a `code` property on the error object\n * (string like `'ENOENT'`) for most OS-level failures. Timeouts additionally\n * set `signal: 'SIGTERM'` and may have `code: undefined`. We probe both.\n */\nexport function classifyExecError(err: unknown): DetectionError {\n if (typeof err !== 'object' || err === null) return 'other';\n\n // Duck-type rather than instanceof — execFileSync errors aren't always\n // `Error` instances across Node versions and test harnesses.\n const e = err as { code?: unknown; signal?: unknown; killed?: unknown };\n\n if (e.code === 'ENOENT') return 'not-found';\n if (e.code === 'ETIMEDOUT') return 'timeout';\n if (e.killed === true || e.signal === 'SIGTERM' || e.signal === 'SIGKILL') {\n // execFileSync sets `killed: true` + SIGTERM when its own timeout fires.\n return 'timeout';\n }\n if (e.code === 'EACCES' || e.code === 'EPERM') return 'permission';\n\n return 'other';\n}\n","/**\n * Gemini CLI MCP auto-configuration for setup command.\n *\n * Detects Gemini CLI and configures ~/.gemini/settings.json with nexus-agents MCP server.\n *\n * @module cli/setup-gemini\n * (Source: Issue #1259 - Gemini CLI MCP auto-configuration)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport { detectCliBinary, type CliDetectionInfo } from './setup-cli-detection.js';\n\nconst logger = createLogger({ component: 'setup-gemini' });\n\n/**\n * Gemini CLI detection result.\n *\n * Type alias of {@link CliDetectionInfo} — see #2155.\n */\nexport type GeminiCliInfo = CliDetectionInfo;\n\n/** Gemini MCP configuration result. */\nexport interface GeminiConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n readonly configPath: string;\n}\n\n/** Gemini MCP server entry format. */\ninterface GeminiMcpEntry {\n readonly command: string;\n readonly args: readonly string[];\n readonly timeout: number;\n}\n\n/** Detects Gemini CLI installation. Delegates to {@link detectCliBinary}. */\nexport function detectGeminiCli(): GeminiCliInfo {\n return detectCliBinary('gemini');\n}\n\n/** Resolves the Gemini config directory path based on scope. */\nfunction getGeminiConfigDir(scope: 'user' | 'project', projectRoot?: string): string {\n if (scope === 'project' && projectRoot !== undefined) {\n return join(projectRoot, '.gemini');\n }\n return join(homedir(), '.gemini');\n}\n\n/** Returns the nexus-agents MCP entry for Gemini settings.json. */\nfunction getNexusMcpEntry(): GeminiMcpEntry {\n return {\n command: 'npx',\n args: ['nexus-agents', '--mode=server'],\n timeout: 30000,\n };\n}\n\n/** Checks if nexus-agents is already configured in settings.json. */\nfunction isAlreadyConfigured(configPath: string): boolean {\n if (!existsSync(configPath)) return false;\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n const servers = config['mcpServers'] as Record<string, unknown> | undefined;\n return servers?.['nexus-agents'] !== undefined;\n } catch {\n logger.debug('Failed to parse existing Gemini settings.json, will overwrite');\n return false;\n }\n}\n\n/** Reads existing config or returns empty object. */\nfunction readExistingConfig(configPath: string): Record<string, unknown> {\n if (!existsSync(configPath)) return {};\n try {\n return JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\n/** Writes the merged config with nexus-agents MCP entry. */\nfunction writeGeminiConfig(configDir: string, configPath: string): void {\n if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true });\n const config = readExistingConfig(configPath);\n const servers = (config['mcpServers'] ?? {}) as Record<string, unknown>;\n servers['nexus-agents'] = getNexusMcpEntry();\n config['mcpServers'] = servers;\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Configures Gemini CLI with nexus-agents MCP server.\n *\n * @param force - Force reconfiguration even if already configured\n * @param dryRun - Preview changes without writing\n * @param scope - 'user' for global (~/.gemini/), 'project' for project-local (.gemini/)\n * @param projectRoot - Project root directory (required for project scope)\n */\nexport function configureGemini(\n force: boolean,\n dryRun: boolean,\n scope: 'user' | 'project' = 'user',\n projectRoot?: string\n): GeminiConfigResult {\n const configDir = getGeminiConfigDir(scope, projectRoot);\n const configPath = join(configDir, 'settings.json');\n\n if (isAlreadyConfigured(configPath) && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in Gemini CLI',\n configPath,\n };\n }\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: `Would configure nexus-agents MCP in ${configPath}`,\n configPath,\n };\n }\n try {\n writeGeminiConfig(configDir, configPath);\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in Gemini CLI',\n configPath,\n };\n } catch (error: unknown) {\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure Gemini: ${getErrorMessage(error)}`,\n configPath,\n };\n }\n}\n","/**\n * Codex CLI MCP auto-configuration for setup command.\n *\n * Detects Codex CLI and registers nexus-agents MCP server\n * using `codex mcp add` CLI command.\n *\n * @module cli/setup-codex\n * (Source: Issue #1263 - Codex CLI MCP auto-configuration)\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport { detectCliBinary, type CliDetectionInfo } from './setup-cli-detection.js';\n\nconst logger = createLogger({ component: 'setup-codex' });\n\n/**\n * Codex CLI detection result.\n *\n * Type alias of {@link CliDetectionInfo} — kept as a named type for the\n * public API surface (re-exported from `cli/index.ts`). Identical shape\n * across all three CLI setups (#2155).\n */\nexport type CodexCliInfo = CliDetectionInfo;\n\n/** Codex MCP configuration result. */\nexport interface CodexConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n}\n\n/** Detects Codex CLI installation. Delegates to {@link detectCliBinary}. */\nexport function detectCodexCli(): CodexCliInfo {\n return detectCliBinary('codex');\n}\n\n/**\n * Checks if nexus-agents is already configured in Codex MCP.\n */\nfunction isAlreadyConfigured(): boolean {\n try {\n const output = execFileSync('codex', ['mcp', 'list'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return output.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Removes existing nexus-agents MCP configuration from Codex.\n */\nfunction removeExisting(): void {\n try {\n execFileSync('codex', ['mcp', 'remove', 'nexus-agents'], {\n timeout: 5000,\n stdio: 'pipe',\n });\n } catch {\n logger.debug('Failed to remove existing Codex MCP config (may not exist)');\n }\n}\n\n/**\n * Adds nexus-agents MCP server to Codex CLI.\n *\n * Uses: codex mcp add nexus-agents -- npx nexus-agents --mode=server\n */\nfunction addMcpServer(): CodexConfigResult {\n try {\n execFileSync(\n 'codex',\n ['mcp', 'add', 'nexus-agents', '--', 'npx', 'nexus-agents', '--mode=server'],\n {\n timeout: 10000,\n stdio: 'pipe',\n }\n );\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in Codex CLI',\n };\n } catch (error: unknown) {\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure Codex: ${getErrorMessage(error)}`,\n };\n }\n}\n\n/**\n * Configures Codex CLI with nexus-agents MCP server.\n */\nexport function configureCodex(force: boolean, dryRun: boolean): CodexConfigResult {\n if (isAlreadyConfigured() && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in Codex CLI',\n };\n }\n\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Would configure nexus-agents MCP in Codex CLI',\n };\n }\n\n if (force && isAlreadyConfigured()) {\n removeExisting();\n }\n\n return addMcpServer();\n}\n","/**\n * nexus-agents setup interactive wizard\n *\n * Guided setup experience for configuring nexus-agents with Claude CLI.\n * Uses Node.js readline for terminal prompts without external dependencies.\n *\n * @module cli/setup-wizard\n * (Source: Issue #425 - Interactive setup wizard)\n */\n\nimport { createInterface, type Interface } from 'node:readline';\nimport { formatHeader, formatStatus, isInteractive } from './setup-formatting.js';\nimport type { SetupOptions } from './setup-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Usage mode selection. */\nexport type UsageMode = 'claude-desktop' | 'claude-cli' | 'standalone' | 'all';\n\n/** Wizard answers collected from user. */\nexport interface WizardAnswers {\n usageMode: UsageMode;\n hasApiKeys: boolean;\n configDirectory: string;\n confirmProceed: boolean;\n}\n\n/** Wizard state during execution. */\ninterface WizardState {\n currentStep: number;\n totalSteps: number;\n answers: Partial<WizardAnswers>;\n}\n\n// ============================================================================\n// Readline Helpers\n// ============================================================================\n\n/**\n * Creates a readline interface for prompting.\n */\nfunction createReadline(): Interface {\n return createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\n/**\n * Prompts for input and returns the answer.\n */\nasync function promptInput(rl: Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Prompts for a yes/no confirmation.\n */\nasync function promptConfirm(\n rl: Interface,\n question: string,\n defaultValue = true\n): Promise<boolean> {\n const defaultHint = defaultValue ? '[Y/n]' : '[y/N]';\n const answer = await promptInput(rl, `${question} ${defaultHint}: `);\n\n if (answer === '') return defaultValue;\n return answer.toLowerCase().startsWith('y');\n}\n\n/**\n * Prints options for selection prompt.\n */\nfunction printOptions(\n options: readonly { value: string; label: string }[],\n defaultIndex: number\n): void {\n for (let i = 0; i < options.length; i++) {\n const option = options[i];\n const marker = i === defaultIndex ? '>' : ' ';\n const label = option?.label ?? '';\n writeLine(` ${marker} ${String(i + 1)}. ${label}`);\n }\n}\n\n/**\n * Gets value from options at index with fallback.\n */\nfunction getOptionValue(\n options: readonly { value: string; label: string }[],\n index: number,\n fallbackIndex: number\n): string {\n const option = options[index];\n if (option !== undefined) {\n return option.value;\n }\n const fallback = options[fallbackIndex];\n return fallback?.value ?? '';\n}\n\n/**\n * Prompts for a selection from a list of options.\n */\nasync function promptSelect(\n rl: Interface,\n question: string,\n options: readonly { value: string; label: string }[],\n defaultIndex = 0\n): Promise<string> {\n writeLine('\\n' + question);\n printOptions(options, defaultIndex);\n\n const answer = await promptInput(rl, `\\nChoice [1-${String(options.length)}]: `);\n\n if (answer === '') {\n return getOptionValue(options, defaultIndex, 0);\n }\n\n const index = parseInt(answer, 10) - 1;\n if (index >= 0 && index < options.length) {\n return getOptionValue(options, index, 0);\n }\n\n return getOptionValue(options, defaultIndex, 0);\n}\n\n// ============================================================================\n// Output Helpers\n// ============================================================================\n\n/** Writes a line to stdout. */\nfunction writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/** Writes an empty line. */\nfunction writeEmptyLine(): void {\n process.stdout.write('\\n');\n}\n\n/** Prints the wizard header. */\nfunction printWizardHeader(): void {\n writeEmptyLine();\n writeLine(formatHeader('Nexus Agents Setup Wizard'));\n writeLine('='.repeat(40));\n writeLine('This wizard will help you configure nexus-agents.');\n writeEmptyLine();\n}\n\n/** Prints step progress. */\nfunction printStepProgress(state: WizardState, stepName: string): void {\n writeLine(\n `\\n${formatHeader(`Step ${String(state.currentStep)}/${String(state.totalSteps)}: ${stepName}`)}`\n );\n writeLine('-'.repeat(40));\n}\n\n/** Prints completion message. */\nfunction printCompletion(): void {\n writeEmptyLine();\n writeLine(formatStatus('success') + ' Wizard completed! Running setup...');\n writeEmptyLine();\n}\n\n// ============================================================================\n// Wizard Steps\n// ============================================================================\n\n/** Usage mode options. */\nconst USAGE_MODE_OPTIONS: readonly { value: UsageMode; label: string }[] = [\n { value: 'claude-cli', label: 'Claude CLI (terminal-based development)' },\n { value: 'claude-desktop', label: 'Claude Desktop (GUI application)' },\n { value: 'standalone', label: 'Standalone CLI (without Claude integration)' },\n { value: 'all', label: 'All of the above' },\n];\n\n/**\n * Step 1: Ask how the user plans to use nexus-agents.\n */\nasync function askUsageMode(rl: Interface, state: WizardState): Promise<UsageMode> {\n printStepProgress(state, 'Usage Mode');\n writeLine('How will you use nexus-agents?');\n\n const answer = await promptSelect(rl, '', USAGE_MODE_OPTIONS, 0);\n\n return answer as UsageMode;\n}\n\n/**\n * Step 2: Ask about API key configuration.\n */\nasync function askApiKeys(rl: Interface, state: WizardState): Promise<boolean> {\n printStepProgress(state, 'API Keys');\n writeLine('nexus-agents works best with API keys configured.');\n writeLine('Supported providers: Anthropic (Claude), OpenAI, Google (Gemini)');\n writeEmptyLine();\n\n const hasKeys = await promptConfirm(rl, 'Do you have at least one API key configured?', false);\n\n if (!hasKeys) {\n writeEmptyLine();\n writeLine('No worries! You can configure API keys later:');\n writeLine(' - ANTHROPIC_API_KEY for Claude');\n writeLine(' - OPENAI_API_KEY for OpenAI/Codex');\n writeLine(' - GOOGLE_AI_API_KEY for Gemini');\n writeLine('\\nRun `nexus-agents doctor` to check your configuration.');\n }\n\n return hasKeys;\n}\n\n/**\n * Step 3: Ask about configuration directory.\n */\nasync function askConfigDirectory(rl: Interface, state: WizardState): Promise<string> {\n printStepProgress(state, 'Configuration');\n writeLine('Where should nexus-agents store its configuration?');\n writeEmptyLine();\n\n const defaultDir = process.cwd();\n const answer = await promptInput(rl, `Directory [${defaultDir}]: `);\n\n return answer || defaultDir;\n}\n\n/**\n * Step 4: Confirm and proceed.\n */\nasync function askConfirmation(\n rl: Interface,\n state: WizardState,\n answers: Partial<WizardAnswers>\n): Promise<boolean> {\n printStepProgress(state, 'Confirmation');\n writeLine('Setup will configure the following:');\n writeEmptyLine();\n\n const modeLabel =\n USAGE_MODE_OPTIONS.find((o) => o.value === answers.usageMode)?.label ?? 'Unknown';\n const apiKeyStatus = answers.hasApiKeys === true ? 'Configured' : 'Not yet configured';\n const configDir = answers.configDirectory ?? process.cwd();\n writeLine(` Usage mode: ${modeLabel}`);\n writeLine(` API keys: ${apiKeyStatus}`);\n writeLine(` Config directory: ${configDir}`);\n writeEmptyLine();\n\n const skipMcp = answers.usageMode === 'standalone';\n if (!skipMcp) {\n writeLine('Will configure:');\n writeLine(' - MCP server for Claude integration');\n writeLine(' - Rules file (.rules/nexus-agents.md)');\n writeLine(' - Hooks for session tracking');\n } else {\n writeLine('Will configure:');\n writeLine(' - Rules file (.rules/nexus-agents.md)');\n writeLine(' - (Skipping MCP/hooks - not needed for standalone mode)');\n }\n\n writeEmptyLine();\n return promptConfirm(rl, 'Proceed with setup?', true);\n}\n\n// ============================================================================\n// Wizard Runner\n// ============================================================================\n\n/**\n * Runs the interactive setup wizard.\n *\n * @returns Setup options based on wizard answers, or undefined if cancelled\n */\nexport async function runWizard(): Promise<Partial<SetupOptions> | undefined> {\n // Check if interactive mode is available\n if (!isInteractive()) {\n writeLine('Interactive mode not available (TTY required).');\n writeLine('Use --non-interactive flag for automated setup.');\n return undefined;\n }\n\n const rl = createReadline();\n\n try {\n printWizardHeader();\n\n const state: WizardState = {\n currentStep: 1,\n totalSteps: 4,\n answers: {},\n };\n\n // Step 1: Usage mode\n state.answers.usageMode = await askUsageMode(rl, state);\n state.currentStep++;\n\n // Step 2: API keys\n state.answers.hasApiKeys = await askApiKeys(rl, state);\n state.currentStep++;\n\n // Step 3: Config directory\n state.answers.configDirectory = await askConfigDirectory(rl, state);\n state.currentStep++;\n\n // Step 4: Confirmation\n state.answers.confirmProceed = await askConfirmation(rl, state, state.answers);\n state.currentStep++;\n\n if (!state.answers.confirmProceed) {\n writeEmptyLine();\n writeLine('Setup cancelled.');\n return undefined;\n }\n\n printCompletion();\n\n // Convert wizard answers to setup options\n return convertAnswersToOptions(state.answers as WizardAnswers);\n } finally {\n rl.close();\n }\n}\n\n/**\n * Converts wizard answers to setup options.\n */\nfunction convertAnswersToOptions(answers: WizardAnswers): Partial<SetupOptions> {\n const isStandalone = answers.usageMode === 'standalone';\n\n return {\n // Skip MCP and hooks for standalone mode\n skipMcp: isStandalone,\n skipHooks: isStandalone,\n // Always create rules file\n skipRules: false,\n // Use user scope for Claude CLI/Desktop, project for standalone\n scope: isStandalone ? 'project' : 'user',\n // Non-interactive since we collected all info\n nonInteractive: true,\n // Show verbose output to explain what's happening\n verbose: true,\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { isInteractive };\n","/**\n * Claude Code permissions snippet generator (#1945).\n *\n * In \"don't ask\" permission mode, Claude Code hard-rejects MCP tool calls\n * that aren't in the allowlist. For nexus-agents to be usable for agentic\n * dogfooding (orchestrate, create_expert, consensus_vote), the tools must\n * be pre-approved in ~/.claude/settings.json.\n *\n * This module generates a recommended snippet for users to paste into\n * their settings.json. We do NOT auto-write permissions — that would be\n * a security footgun.\n *\n * @module cli/setup-permissions\n */\n\n/** MCP tool names that are safe to pre-approve (read-only or idempotent). */\nconst SAFE_READONLY_TOOLS = [\n 'list_experts',\n 'list_workflows',\n 'weather_report',\n 'memory_query',\n 'memory_stats',\n 'query_trace',\n 'research_query',\n 'research_analyze',\n 'research_discover',\n 'research_synthesize',\n 'repo_analyze',\n 'repo_security_plan',\n 'extract_symbols',\n 'search_codebase',\n] as const;\n\n/** MCP tools that execute tasks but are commonly used for dogfooding. */\nconst SAFE_EXECUTION_TOOLS = [\n 'orchestrate',\n 'create_expert',\n 'execute_expert',\n 'consensus_vote',\n 'delegate_to_model',\n 'run_workflow',\n 'issue_triage',\n 'registry_import',\n] as const;\n\nexport type PermissionLevel = 'readonly' | 'all';\n\n/**\n * Generate a JSON snippet of recommended permissions for Claude Code's\n * `~/.claude/settings.json` to pre-approve nexus-agents MCP tools.\n *\n * Users paste this into the `permissions.allow` array.\n */\nexport function generatePermissionsSnippet(level: PermissionLevel = 'all'): string {\n const tools =\n level === 'readonly'\n ? [...SAFE_READONLY_TOOLS]\n : [...SAFE_READONLY_TOOLS, ...SAFE_EXECUTION_TOOLS];\n\n const permissions = tools.map((t) => `mcp__nexus-agents__${t}`).sort();\n return JSON.stringify(permissions, null, 2);\n}\n\n/**\n * Return a human-readable banner explaining the permissions snippet,\n * for inclusion in `nexus-agents setup` output.\n */\nexport function buildPermissionsBanner(snippet: string): string {\n return [\n '',\n '--- Claude Code Permissions (optional) ---',\n '',\n \"To use nexus-agents MCP tools in 'don't ask' mode (autonomous/headless\",\n 'Claude Code sessions), add these entries to the `permissions.allow` array',\n 'in your `~/.claude/settings.json`:',\n '',\n snippet,\n '',\n 'Without these, each MCP tool call will prompt for approval in interactive',\n 'mode, or be rejected outright in `dangerously-skip-permissions` mode.',\n '',\n 'Reference: https://github.com/williamzujkowski/nexus-agents/issues/1945',\n '',\n ].join('\\n');\n}\n","/**\n * nexus-agents/cli - Verify Command\n *\n * Quick verification that installation works correctly.\n * No API keys required - runs offline checks only.\n *\n * @module cli/verify-command\n * (Source: Issue #253 - Quick verification step after installation)\n */\n\nimport { VERSION } from '../version.js';\nimport { getTimeProvider } from '../core/index.js';\nimport { defaultConfig } from '../config/index.js';\nimport { BUILT_IN_EXPERTS } from '../agents/experts/expert-config.js';\nimport { colors, symbols } from './ansi-output.js';\nimport { checkSqlite, checkDataDirectory, checkApiKeys } from './doctor.js';\nimport { probeAllClis } from './cli-auth-probe.js';\n\n/**\n * Verify command options.\n */\nexport interface VerifyOptions {\n readonly verbose: boolean;\n}\n\n/**\n * Severity of a failed check.\n *\n * - `hard`: functionality is broken (e.g. Node version too low, core exports\n * missing). Exit code 1.\n * - `warn`: functionality is degraded but usable (e.g. better-sqlite3 missing\n * → only some memory backends unavailable; no CLI adapters detected →\n * orchestrator still works via API keys). Exit code 0.\n *\n * Unused on passing checks.\n */\nexport type VerifySeverity = 'hard' | 'warn';\n\n/**\n * Single verification check result.\n */\nexport interface VerifyCheck {\n readonly name: string;\n readonly passed: boolean;\n readonly message: string;\n readonly fix?: string;\n /**\n * Severity for failed checks. Defaults to `hard` when omitted. Passing\n * checks ignore this field.\n */\n readonly severity?: VerifySeverity;\n}\n\n/**\n * Complete verification result.\n */\nexport interface VerifyResult {\n readonly version: string;\n readonly nodeVersion: string;\n readonly checks: readonly VerifyCheck[];\n /** True when every check passed. */\n readonly allPassed: boolean;\n /**\n * True when no check failed with `severity: 'hard'`. Drives the exit code:\n * warnings alone do not fail verification (exit 0 with warnings printed).\n */\n readonly noHardFailures: boolean;\n readonly durationMs: number;\n}\n\n/**\n * Checks if Node.js version is supported.\n */\nfunction checkNodeVersion(): VerifyCheck {\n const version = process.version;\n const major = parseInt(version.slice(1).split('.')[0] ?? '0', 10);\n\n if (major >= 22) {\n return {\n name: 'Node.js Version',\n passed: true,\n message: `${version} (LTS)`,\n };\n }\n\n if (major >= 18) {\n return {\n name: 'Node.js Version',\n passed: true,\n message: `${version} (supported, recommend 22.x LTS)`,\n };\n }\n\n return {\n name: 'Node.js Version',\n passed: false,\n message: `${version} (unsupported)`,\n fix: 'Install Node.js 22.x LTS from https://nodejs.org',\n };\n}\n\n/**\n * Checks if package exports are accessible.\n */\nfunction checkPackageExports(): VerifyCheck {\n try {\n // Check if we can access core exports\n const hasVersion = typeof VERSION === 'string' && VERSION.length > 0;\n const hasConfig = typeof defaultConfig === 'object';\n const hasBuiltInExperts = typeof BUILT_IN_EXPERTS === 'object';\n\n if (hasVersion && hasConfig && hasBuiltInExperts) {\n return {\n name: 'Package Exports',\n passed: true,\n message: 'All core modules accessible',\n };\n }\n\n return {\n name: 'Package Exports',\n passed: false,\n message: 'Some modules failed to load',\n fix: 'Try reinstalling: npm install -g nexus-agents',\n };\n } catch {\n return {\n name: 'Package Exports',\n passed: false,\n message: 'Failed to load core modules',\n fix: 'Try reinstalling: npm install -g nexus-agents',\n };\n }\n}\n\n/**\n * Checks if default configuration is accessible.\n */\nfunction checkConfigLoading(): VerifyCheck {\n try {\n const hasModels = typeof defaultConfig.models === 'object';\n const hasSecurity = typeof defaultConfig.security === 'object';\n\n if (hasModels && hasSecurity) {\n return {\n name: 'Configuration',\n passed: true,\n message: 'Default config accessible',\n };\n }\n\n return {\n name: 'Configuration',\n passed: true, // Config errors are not fatal for verification\n message: 'Using default configuration',\n };\n } catch {\n return {\n name: 'Configuration',\n passed: true, // Still works with defaults\n message: 'Using default configuration',\n };\n }\n}\n\n/**\n * Checks expert system availability.\n */\nfunction checkExpertSystem(): VerifyCheck {\n const expertTypes = Object.keys(BUILT_IN_EXPERTS);\n const count = expertTypes.length;\n\n if (count >= 5) {\n return {\n name: 'Expert System',\n passed: true,\n message: `${String(count)} expert types available`,\n };\n }\n\n return {\n name: 'Expert System',\n passed: false,\n message: 'Expert types not loaded',\n fix: 'Try reinstalling: npm install -g nexus-agents',\n };\n}\n\n/**\n * Checks that better-sqlite3 loads. Memory backends (agentic, adaptive, typed,\n * mobimem, decay) are unavailable if it's missing — functional degradation,\n * not a hard failure. Rebuilding the native module or reinstalling usually\n * fixes it.\n */\nasync function checkSqliteAvailability(): Promise<VerifyCheck> {\n const result = await checkSqlite();\n if (result.available) {\n return {\n name: 'SQLite Storage',\n passed: true,\n message: 'better-sqlite3 loaded (memory backends available)',\n };\n }\n return {\n name: 'SQLite Storage',\n passed: false,\n severity: 'warn',\n message: result.error ?? 'better-sqlite3 not available',\n fix: 'Run \"pnpm rebuild better-sqlite3\" or reinstall nexus-agents',\n };\n}\n\n/**\n * Checks that the `~/.nexus-agents/` data directories exist and are writable.\n * `cli-commands.ts::dispatchCommand` initializes them lazily (#1398), so\n * missing dirs are a hard failure (persistence will silently drop writes).\n */\nfunction checkDataDirs(): VerifyCheck {\n const result = checkDataDirectory();\n const unwritable = result.subdirectories.filter((s) => !s.exists || !s.writable);\n if (result.rootExists && unwritable.length === 0) {\n return {\n name: 'Data Directories',\n passed: true,\n message: `${result.rootPath} (all subdirectories writable)`,\n };\n }\n if (!result.rootExists) {\n return {\n name: 'Data Directories',\n passed: false,\n severity: 'warn',\n message: `${result.rootPath} does not exist`,\n fix: 'Run any nexus-agents command — directories auto-initialize on first run',\n };\n }\n return {\n name: 'Data Directories',\n passed: false,\n severity: 'warn',\n message: `${String(unwritable.length)} subdirectory(ies) unwritable: ${unwritable\n .map((s) => s.name)\n .join(', ')}`,\n fix: `Check filesystem permissions on ${result.rootPath}`,\n };\n}\n\n/**\n * Checks that at least one execution path is configured — either an API key\n * (direct adapter) or a CLI that's actually authenticated. Without either,\n * the orchestrator has nothing to dispatch to.\n *\n * #2437: previously only checked env vars, so verify reported \"No API keys\n * configured / degraded\" while doctor (post-#2448) correctly reported the\n * CLI as authed. Both were accurate but disagreed in tone, confusing\n * operators. Now verify uses the same auth probe doctor uses, so they\n * align on the available-paths question.\n */\nasync function checkAdapterAvailability(): Promise<VerifyCheck> {\n const keys = checkApiKeys();\n const configuredKeys = keys.filter((k) => k.configured);\n const authedClis = (await probeAllClis()).filter((p) => p.state === 'authenticated');\n\n if (configuredKeys.length > 0 || authedClis.length > 0) {\n const parts: string[] = [];\n if (configuredKeys.length > 0) {\n parts.push(\n `${String(configuredKeys.length)} API key(s): ${configuredKeys.map((k) => k.name).join(', ')}`\n );\n }\n if (authedClis.length > 0) {\n parts.push(\n `${String(authedClis.length)} authed CLI(s): ${authedClis.map((p) => p.cli).join(', ')}`\n );\n }\n return {\n name: 'Adapter Availability',\n passed: true,\n message: parts.join('; '),\n };\n }\n\n return {\n name: 'Adapter Availability',\n passed: false,\n severity: 'warn',\n message: 'No API keys and no authed CLIs detected',\n fix: 'Run \"nexus-agents login\" to see per-CLI status, then \"claude /login\" / \"codex login\" / etc., or set ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_AI_API_KEY',\n };\n}\n\n/**\n * Runs all verification checks.\n */\nexport async function runVerify(): Promise<VerifyResult> {\n const time = getTimeProvider();\n const startTime = time.now();\n\n const checks: VerifyCheck[] = [\n checkNodeVersion(),\n checkPackageExports(),\n checkConfigLoading(),\n checkExpertSystem(),\n await checkSqliteAvailability(),\n checkDataDirs(),\n await checkAdapterAvailability(),\n ];\n\n const allPassed = checks.every((c) => c.passed);\n const noHardFailures = checks.every((c) => c.passed || c.severity === 'warn');\n const durationMs = time.now() - startTime;\n\n return {\n version: VERSION,\n nodeVersion: process.version,\n checks,\n allPassed,\n noHardFailures,\n durationMs,\n };\n}\n\n/**\n * Formats a single check result.\n *\n * Failed-but-warn checks render as yellow warnings (degraded). Failed hard\n * checks render as red crosses.\n */\nfunction formatCheck(check: VerifyCheck): string {\n let symbol: string;\n if (check.passed) {\n symbol = `${colors.green}${symbols.check}${colors.reset}`;\n } else if (check.severity === 'warn') {\n symbol = `${colors.yellow}${symbols.warn}${colors.reset}`;\n } else {\n symbol = `${colors.red}${symbols.cross}${colors.reset}`;\n }\n\n let line = ` ${symbol} ${check.name}: ${check.message}`;\n\n if (!check.passed && check.fix !== undefined) {\n line += `\\n ${colors.dim}Fix: ${check.fix}${colors.reset}`;\n }\n\n return line;\n}\n\n/**\n * Prints verification results to stdout.\n */\nexport function printVerifyResult(result: VerifyResult, verbose: boolean): void {\n process.stdout.write('\\n');\n process.stdout.write(`${colors.bold}nexus-agents verify${colors.reset}\\n`);\n process.stdout.write('===================\\n');\n process.stdout.write('\\n');\n process.stdout.write(`Version: ${result.version}\\n`);\n process.stdout.write(`Node.js: ${result.nodeVersion}\\n`);\n process.stdout.write('\\n');\n\n process.stdout.write(`${colors.cyan}Running checks...${colors.reset}\\n`);\n process.stdout.write('\\n');\n\n for (const check of result.checks) {\n process.stdout.write(formatCheck(check) + '\\n');\n }\n\n process.stdout.write('\\n');\n\n const warnCount = result.checks.filter((c) => !c.passed && c.severity === 'warn').length;\n const hardCount = result.checks.filter((c) => !c.passed && c.severity !== 'warn').length;\n\n if (result.allPassed) {\n process.stdout.write(\n `${colors.green}${colors.bold}Installation verified successfully!${colors.reset}\\n`\n );\n process.stdout.write('\\n');\n process.stdout.write(`${colors.cyan}Next steps:${colors.reset}\\n`);\n process.stdout.write(' 1. Run \"nexus-agents doctor\" to check external CLI integrations\\n');\n process.stdout.write(\n ' 2. Run \"nexus-agents review --setup\" to configure GitHub integration\\n'\n );\n process.stdout.write(' 3. Try \"nexus-agents --help\" for all available commands\\n');\n } else if (hardCount === 0) {\n process.stdout.write(\n `${colors.yellow}${colors.bold}Verified with ${String(warnCount)} warning(s) — functional but degraded${colors.reset}\\n`\n );\n process.stdout.write('\\n');\n process.stdout.write('The warnings above indicate reduced functionality but will not\\n');\n process.stdout.write('prevent nexus-agents from running. Fix them when convenient.\\n');\n } else {\n process.stdout.write(\n `${colors.red}${colors.bold}Verification failed: ${String(hardCount)} blocking issue(s), ${String(warnCount)} warning(s)${colors.reset}\\n`\n );\n process.stdout.write('\\n');\n process.stdout.write('Please fix the blocking issues above and try again.\\n');\n }\n\n process.stdout.write('\\n');\n\n if (verbose) {\n process.stdout.write(`${colors.dim}Duration: ${String(result.durationMs)}ms${colors.reset}\\n`);\n process.stdout.write('\\n');\n }\n}\n\n/**\n * Runs the verify command and prints results.\n *\n * Exit codes:\n * - `0`: all checks passed, or only `warn`-severity checks failed (degraded\n * but functional)\n * - `1`: at least one `hard`-severity check failed (broken install)\n */\nexport async function verifyCommand(options: VerifyOptions): Promise<number> {\n const result = await runVerify();\n printVerifyResult(result, options.verbose);\n return result.noHardFailures ? 0 : 1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,SAAS,cAAAA,mBAAkB;;;ACH3B,SAAS,SAAS;AAMX,IAAM,qBAAqB,EAAE,OAAO;AAAA;AAAA,EAEzC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEhC,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAElC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEpC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEpC,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAErC,cAAc,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEvC,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAErC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEpC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEjC,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAElC,OAAO,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,QAAQ,MAAM;AACnD,CAAC;;;AC/BD,SAAS,gBAAgB;AACzB,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AACxB,SAAS,MAAM,gBAAgB;AAa/B,SAAS,mBAAmB,QAAoC;AAC9D,QAAM,QAAQ,OAAO,MAAM,iBAAiB;AAC5C,SAAO,QAAQ,CAAC;AAClB;AAMO,SAAS,kBAAiC;AAC/C,QAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAC5C,QAAM,cAAc,KAAK,QAAQ,GAAG,cAAc;AAElD,MAAI;AACF,UAAM,SAAS,SAAS,oBAAoB;AAAA,MAC1C,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,SAAS,wBAAwB;AAAA,IACnC,CAAC;AACD,UAAM,UAAU,mBAAmB,MAAM;AAEzC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,qBAAqB,QAAuD;AACnF,QAAM,aAAa,OAAO,YAAY;AACtC,MAAI,eAAe,OAAW,QAAO;AACrC,SAAO,OAAO,KAAK,UAAU;AAC/B;AAGA,SAAS,sBAAsB,QAAuD;AACpF,QAAM,WAAW,OAAO,UAAU;AAClC,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,QAAQ,OAAO,OAAO,QAAQ,GAAG;AAC1C,UAAM,aAAa,KAAK,YAAY;AACpC,QAAI,eAAe,OAAW,QAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;AAAA,EACxF;AACA,SAAO,CAAC,GAAG,UAAU;AACvB;AAGA,SAAS,aAAa,MAAc,SAAkC;AACpE,SAAO,EAAE,QAAQ,MAAM,MAAM,gBAAgB,QAAQ,SAAS,cAAc,GAAG,QAAQ;AACzF;AASO,SAAS,gBAAgB,aAAgD;AAC9E,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAC5D,UAAM,SAAS,qBAAqB,MAAM;AAC1C,QAAI,WAAW,OAAW,QAAO,aAAa,aAAa,MAAM;AACjE,UAAM,YAAY,sBAAsB,MAAM;AAC9C,QAAI,cAAc,OAAW,QAAO,aAAa,aAAa,SAAS;AACvE,WAAO,aAAa,aAAa,CAAC,CAAC;AAAA,EACrC,QAAQ;AACN,WAAO,aAAa,aAAa,CAAC,CAAC;AAAA,EACrC;AACF;AAGA,SAAS,2BAA2B,MAAuB;AACzD,MAAI;AACF,UAAM,UAAU,aAAa,KAAK,MAAM,cAAc,GAAG,OAAO;AAChE,UAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,UAAM,MAAM;AACZ,UAAM,UAAU,IAAI,iBAAiB;AACrC,WAAO,UAAU,YAAY,MAAM;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,oBAAsD;AAAA,EAC1D,CAAC,iBAAiB,YAAY;AAAA,EAC9B,CAAC,cAAc,MAAM;AAAA,EACrB,CAAC,UAAU,IAAI;AAAA,EACf,CAAC,kBAAkB,QAAQ;AAAA,EAC3B,CAAC,YAAY,QAAQ;AAAA,EACrB,CAAC,WAAW,MAAM;AAAA,EAClB,CAAC,gBAAgB,MAAM;AACzB;AAKO,SAAS,kBAAkB,MAA2B;AAE3D,aAAW,CAAC,MAAM,IAAI,KAAK,mBAAmB;AAC5C,QAAI,WAAW,KAAK,MAAM,IAAI,CAAC,EAAG,QAAO;AAAA,EAC3C;AAGA,MAAI,WAAW,KAAK,MAAM,cAAc,CAAC,GAAG;AAC1C,WAAO,2BAA2B,IAAI,IAAI,eAAe;AAAA,EAC3D;AAEA,SAAO;AACT;AAKO,SAAS,kBAAkB,MAA2B;AAC3D,MAAI;AAEJ,MAAI,WAAW,KAAK,MAAM,cAAc,CAAC,GAAG;AAC1C,QAAI;AACF,YAAM,UAAU,aAAa,KAAK,MAAM,cAAc,GAAG,OAAO;AAChE,YAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAM,YAAY,IAAI,MAAM;AAC5B,oBAAc,OAAO,cAAc,WAAW,YAAY;AAAA,IAC5D,SAAS,UAAmB;AAE1B,WAAK;AAAA,IACP;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,WAAW,KAAK,MAAM,cAAc,CAAC;AAAA,IACrD,aAAa,WAAW,KAAK,MAAM,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,IAI/C,gBAAgB,WAAW,KAAK,MAAM,QAAQ,CAAC,KAAK,WAAW,KAAK,MAAM,WAAW,OAAO,CAAC;AAAA,IAC7F,gBAAgB,WAAW,KAAK,MAAM,mBAAmB,CAAC;AAAA,IAC1D,aAAa,kBAAkB,IAAI;AAAA,IACnC,aAAa,eAAe,SAAS,IAAI;AAAA,EAC3C;AACF;AAKO,SAAS,kBAAkB,aAAsC;AACtE,QAAM,YAAY,gBAAgB;AAClC,QAAM,oBAAoB,gBAAgB,UAAU,WAAW;AAC/D,QAAM,cAAc,kBAAkB,WAAW;AAEjD,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1LA,SAAS,YAAAC,WAAU,oBAAoB;AACvC,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAKd,IAAM,yBAAyC;AAAA,EACpD,SAAS;AAAA,EACT,MAAM,CAAC,eAAe;AACxB;AAGO,IAAM,6BAA6C;AAAA,EACxD,SAAS;AAAA,EACT,MAAM,CAAC,MAAM,uBAAuB,eAAe;AACrD;AAcO,SAAS,wBAAiC;AAC/C,MAAI;AACF,UAAM,SAASC,UAAS,+BAA+B;AAAA,MACrD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,SAAS,cAAc;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,YAAY,OAAmC;AACtD,SAAO,UAAU,YAAY,UAAU;AACzC;AAKA,SAAS,wBAAwB,QAA4B,QAAc;AACzE,MAAI;AACF,IAAAA,UAAS,qCAAqC,YAAY,KAAK,CAAC,IAAI;AAAA,MAClE,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAKA,SAAS,aAAa,QAAiB,QAA4B,QAAyB;AAC1F,QAAM,QAAQ,SAAS,6BAA6B;AACpD,QAAM,aAAa,KAAK,UAAU,KAAK;AACvC,QAAM,aAAa,UAAU,YAAY,YAAY;AAErD,MAAI;AACF;AAAA,MACE;AAAA,MACA,CAAC,OAAO,YAAY,gBAAgB,YAAY,MAAM,YAAY,KAAK,CAAC;AAAA,MACxE;AAAA,QACE,UAAU;AAAA,QACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,iDAAiD,UAAU;AAAA,IACtE;AAAA,EACF,SAAS,OAAO;AACd,UAAM,WAAW,gBAAgB,KAAK;AACtC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,6BAA6B,QAAQ;AAAA,IAChD;AAAA,EACF;AACF;AAQO,SAAS,mBACd,SAAkB,OAClB,QAAiB,OACjB,QAA4B,QACX;AACjB,QAAM,eAAe,sBAAsB;AAG3C,MAAI,CAAC,SAAS,cAAc;AAC1B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,SAAS,cAAc;AACzB,4BAAwB,KAAK;AAAA,EAC/B;AAEA,SAAO,aAAa,QAAQ,KAAK;AACnC;AAKO,SAAS,mBAAmB,SAAkB,OAAe;AAClE,QAAM,QAAQ,SAAS,6BAA6B;AACpD,QAAM,SAAwB;AAAA,IAC5B,YAAY;AAAA,MACV,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAwBO,SAAS,qBAAyC;AACvD,SAAO;AAAA,IACL,OAAO;AAAA,MACL,cAAc;AAAA,QACZ;AAAA,UACE,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,UACE,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA2CO,SAAS,qBAA8B;AAC5C,MAAI;AACF,UAAM,SAASC,UAAS,2BAA2B;AAAA,MACjD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAED,WAAO,OAAO,SAAS,cAAc;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,mBAA4D;AAC1E,MAAI;AACF,UAAM,SAASA,UAAS,2BAA2B;AAAA,MACjD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,CAAC,WAAW,YAAY,UAAU,YAAY,aAAa;AAC7D,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,gBACP,UACA,UACoB;AACpB,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAGA,QAAM,mBAAmB,SAAS,OAAO,CAAC,UAAU;AAClD,WAAO,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW,cAAc,CAAC;AAAA,EACtE,CAAC;AAGD,SAAO,CAAC,GAAG,kBAAkB,GAAG,QAAQ;AAC1C;AAMO,SAAS,iBACd,UACA,WAC6B;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,gBAAgB,cAAc,cAAc,eAAe,MAAM;AAEpF,QAAM,SAAsC,CAAC;AAE7C,aAAW,YAAY,WAAW;AAChC,UAAM,gBAAgB,SAAS,QAAQ;AACvC,UAAM,WAAW,UAAU,QAAQ;AAEnC,QAAI,UAAU;AACZ,aAAO,QAAQ,IAAI,gBAAgB,eAAe,QAAQ;AAAA,IAC5D,WAAW,eAAe;AACxB,aAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,eAAe,QAAiB,OAAyB;AACvE,QAAM,eAAe,mBAAmB;AAExC,MAAI,CAAC,SAAS,cAAc;AAC1B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAkB,mBAAmB;AAE3C,MAAI;AAEF,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,cAAc,iBAAiB,eAAe,gBAAgB,KAAK;AAGzE,UAAM,aAAa,KAAK,UAAU,WAAW;AAC7C,iBAAa,UAAU,CAAC,UAAU,OAAO,SAAS,UAAU,GAAG;AAAA,MAC7D,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,gBACL,0EACA;AAAA,IACN;AAAA,EACF,SAAS,OAAO;AACd,UAAM,WAAW,gBAAgB,KAAK;AACtC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,8BAA8B,QAAQ;AAAA,IACjD;AAAA,EACF;AACF;AAKO,SAAS,sBAA8B;AAC5C,QAAM,SAAS,mBAAmB;AAClC,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;;;AClYA,SAAS,gBAAAC,eAAc,eAAe,iBAAiB;AACvD,SAAS,QAAAC,OAAM,eAAe;AAQvB,SAAS,uBAA+B;AAC7C,SAAO;AAAA;AAAA,sFAE6E,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCA2DzD,OAAO;AAAA;AAE3C;AAUO,SAAS,iBAAiB,aAA6B;AAC5D,SAAOC,MAAK,aAAa,UAAU,iBAAiB;AACtD;AAKO,SAAS,gBAAgB,aAAqB,QAAyB;AAC5E,QAAM,YAAY,iBAAiB,WAAW;AAC9C,QAAM,UAAU,qBAAqB;AAErC,MAAI,CAAC,QAAQ;AACX,UAAM,WAAW,QAAQ,SAAS;AAClC,cAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,kBAAc,WAAW,SAAS,OAAO;AAAA,EAC3C;AAEA,SAAO;AACT;;;AC9FO,SAAS,gBAAyB;AACvC,MAAI,CAAC,QAAQ,OAAO,MAAO,QAAO;AAClC,MAAI,QAAQ,IAAI,IAAI,MAAM,OAAQ,QAAO;AACzC,MAAI,QAAQ,IAAI,wBAAwB,MAAM,OAAW,QAAO;AAChE,SAAO;AACT;;;ACXA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,YAAY,QAAQ,kBAAkB;;;ACExD,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAgB;;;ACmBlB,IAAM,2BAA2D;AAAA,EACtE,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO;AACT;AAUO,SAAS,uBAAuB,SAAiB,gBAAyC;AAC/F,MAAI,mBAAmB,UAAa,mBAAmB,aAAa;AAClE,WAAO,GAAG,OAAO;AAAA,EACnB;AACA,SAAO,GAAG,OAAO,sBAAsB,yBAAyB,cAAc,CAAC;AACjF;AAUO,SAAS,kBAAkB,KAA8B;AAC9D,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AAIpD,QAAM,IAAI;AAEV,MAAI,EAAE,SAAS,SAAU,QAAO;AAChC,MAAI,EAAE,SAAS,YAAa,QAAO;AACnC,MAAI,EAAE,WAAW,QAAQ,EAAE,WAAW,aAAa,EAAE,WAAW,WAAW;AAEzE,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,YAAY,EAAE,SAAS,QAAS,QAAO;AAEtD,SAAO;AACT;;;ADjDO,SAAS,uBAA0C;AACxD,SAAO,SAAS,MAAM,UAAU,UAAU;AAC5C;AAQO,SAAS,cAAc,QAAoC;AAChE,QAAM,QAAQ,kBAAkB,KAAK,MAAM;AAC3C,SAAO,QAAQ,CAAC;AAClB;AAaO,SAAS,gBAAgB,MAAgC;AAC9D,MAAI;AACF,IAAAC,cAAa,qBAAqB,GAAG,CAAC,IAAI,GAAG,EAAE,SAAS,KAAM,OAAO,OAAO,CAAC;AAAA,EAC/E,SAAS,KAAc;AACrB,WAAO,EAAE,WAAW,OAAO,SAAS,QAAW,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,EACxF;AAEA,MAAI;AACF,UAAM,SAASA,cAAa,MAAM,CAAC,WAAW,GAAG;AAAA,MAC/C,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,EAAE,WAAW,MAAM,SAAS,cAAc,MAAM,EAAE;AAAA,EAC3D,SAAS,KAAc;AACrB,WAAO,EAAE,WAAW,MAAM,SAAS,QAAW,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,EACvF;AACF;;;ADzDA,IAAM,SAAS,aAAa,EAAE,WAAW,iBAAiB,CAAC;AAyBpD,SAAS,oBAAqC;AACnD,SAAO,gBAAgB,UAAU;AACnC;AAMA,SAAS,uBAA+B;AACtC,SAAOC,MAAKC,SAAQ,GAAG,WAAW,UAAU;AAC9C;AAMA,SAAS,kBAAqC;AAC5C,SAAO,CAAC,OAAO,gBAAgB,eAAe;AAChD;AAEA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,gBAAgB;AAAA,EACzB,SAAS;AACX;AAMO,SAAS,sBAAsB,KAA6B;AACjE,QAAM,YAAYD,MAAK,KAAK,gBAAgB;AAC5C,MAAIE,YAAW,SAAS,GAAG;AACzB,WAAO,EAAE,MAAM,WAAW,SAAS,MAAM,QAAQ,KAAK;AAAA,EACxD;AACA,QAAM,WAAWF,MAAK,KAAK,eAAe;AAC1C,MAAIE,YAAW,QAAQ,GAAG;AACxB,WAAO,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,KAAK;AAAA,EACxD;AACA,SAAO,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,MAAM;AACzD;AAGA,SAAS,oBAAoB,UAAmC;AAC9D,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,MAAI;AACF,UAAM,MAAMC,cAAa,SAAS,MAAM,OAAO;AAC/C,UAAM,SAAS,WAAW,GAAG;AAC7B,UAAM,MAAM,SAAS,KAAK;AAC1B,WAAO,MAAM,cAAc,MAAM;AAAA,EACnC,QAAQ;AACN,WAAO,MAAM,0DAA0D;AACvE,WAAO;AAAA,EACT;AACF;AAGA,SAAS,iBAAiB,YAAoB,KAAmB;AAC/D,MAAI,SAAS;AACb,WAAS,WAAW,QAAQ,OAAO,QAAQ,CAAC,OAAO,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;AACxF,WAAS,WAAW,QAAQ,OAAO,QAAQ,CAAC,SAAS,GAAG,mCAAmC,CAAC,CAAC,CAAC;AAC9F,EAAAC,eAAc,YAAY,QAAQ,OAAO;AAC3C;AAGA,SAAS,gBAAgB,YAA0B;AACjD,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,KAAK,EAAE,gBAAgB,gBAAgB;AAAA,EACzC;AACA,EAAAA,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E;AAGA,SAAS,oBAAoB,WAAmB,UAAgC;AAC9E,MAAI,CAACF,YAAW,SAAS,EAAG,CAAAG,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAEpE,MAAI,SAAS,QAAQ;AACnB,UAAM,MAAMF,cAAa,SAAS,MAAM,OAAO;AAC/C,qBAAiB,SAAS,MAAM,GAAG;AAAA,EACrC,OAAO;AACL,oBAAgB,SAAS,IAAI;AAAA,EAC/B;AACF;AAUA,SAAS,oBAAoB,aAA6B;AACxD,QAAM,WAAW,QAAQ,WAAW;AACpC,MAAI,CAACD,YAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,gCAAgC,QAAQ,EAAE;AAAA,EAC5D;AACA,SAAO;AACT;AAMO,SAAS,kBACd,OACA,QACA,SACsB;AACtB,MAAI;AACF,WAAO,uBAAuB,OAAO,QAAQ,OAAO;AAAA,EACtD,SAAS,OAAgB;AACvB,UAAM,eAAeF,MAAK,qBAAqB,GAAG,eAAe;AACjE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,iCAAiC,gBAAgB,KAAK,CAAC;AAAA,MAChE,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,QACA,SACsB;AACtB,QAAM,YACJ,SAAS,gBAAgB,SACrB,oBAAoB,QAAQ,WAAW,IACvC,qBAAqB;AAC3B,QAAM,WAAW,sBAAsB,SAAS;AAEhD,MAAI,oBAAoB,QAAQ,KAAK,CAAC,OAAO;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,uCAAuC,SAAS,IAAI;AAAA,MAC7D,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AACA,sBAAoB,WAAW,QAAQ;AACvC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,YAAY,SAAS;AAAA,EACvB;AACF;;;AG/LA,SAAS,cAAAM,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAKxB,IAAMC,UAAS,aAAa,EAAE,WAAW,eAAe,CAAC;AAyBlD,SAAS,kBAAiC;AAC/C,SAAO,gBAAgB,QAAQ;AACjC;AAGA,SAAS,mBAAmB,OAA2B,aAA8B;AACnF,MAAI,UAAU,aAAa,gBAAgB,QAAW;AACpD,WAAOC,MAAK,aAAa,SAAS;AAAA,EACpC;AACA,SAAOA,MAAKC,SAAQ,GAAG,SAAS;AAClC;AAGA,SAAS,mBAAmC;AAC1C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,CAAC,gBAAgB,eAAe;AAAA,IACtC,SAAS;AAAA,EACX;AACF;AAGA,SAASC,qBAAoB,YAA6B;AACxD,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO;AACpC,MAAI;AACF,UAAM,SAAS,KAAK,MAAMC,cAAa,YAAY,OAAO,CAAC;AAC3D,UAAM,UAAU,OAAO,YAAY;AACnC,WAAO,UAAU,cAAc,MAAM;AAAA,EACvC,QAAQ;AACN,IAAAL,QAAO,MAAM,+DAA+D;AAC5E,WAAO;AAAA,EACT;AACF;AAGA,SAAS,mBAAmB,YAA6C;AACvE,MAAI,CAACI,YAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,YAAY,OAAO,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,SAAS,kBAAkB,WAAmB,YAA0B;AACtE,MAAI,CAACD,YAAW,SAAS,EAAG,CAAAE,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACpE,QAAM,SAAS,mBAAmB,UAAU;AAC5C,QAAM,UAAW,OAAO,YAAY,KAAK,CAAC;AAC1C,UAAQ,cAAc,IAAI,iBAAiB;AAC3C,SAAO,YAAY,IAAI;AACvB,EAAAC,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E;AAUO,SAAS,gBACd,OACA,QACA,QAA4B,QAC5B,aACoB;AACpB,QAAM,YAAY,mBAAmB,OAAO,WAAW;AACvD,QAAM,aAAaN,MAAK,WAAW,eAAe;AAElD,MAAIE,qBAAoB,UAAU,KAAK,CAAC,OAAO;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,uCAAuC,UAAU;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,sBAAkB,WAAW,UAAU;AACvC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF,SAAS,OAAgB;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,+BAA+B,gBAAgB,KAAK,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;;;ACtIA,SAAS,gBAAAK,qBAAoB;AAK7B,IAAMC,UAAS,aAAa,EAAE,WAAW,cAAc,CAAC;AAmBjD,SAAS,iBAA+B;AAC7C,SAAO,gBAAgB,OAAO;AAChC;AAKA,SAASC,uBAA+B;AACtC,MAAI;AACF,UAAM,SAASC,cAAa,SAAS,CAAC,OAAO,MAAM,GAAG;AAAA,MACpD,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,OAAO,SAAS,cAAc;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,iBAAuB;AAC9B,MAAI;AACF,IAAAA,cAAa,SAAS,CAAC,OAAO,UAAU,cAAc,GAAG;AAAA,MACvD,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AACN,IAAAF,QAAO,MAAM,4DAA4D;AAAA,EAC3E;AACF;AAOA,SAASG,gBAAkC;AACzC,MAAI;AACF,IAAAD;AAAA,MACE;AAAA,MACA,CAAC,OAAO,OAAO,gBAAgB,MAAM,OAAO,gBAAgB,eAAe;AAAA,MAC3E;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAgB;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,8BAA8B,gBAAgB,KAAK,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;AAKO,SAAS,eAAe,OAAgB,QAAoC;AACjF,MAAID,qBAAoB,KAAK,CAAC,OAAO;AACnC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,SAASA,qBAAoB,GAAG;AAClC,mBAAe;AAAA,EACjB;AAEA,SAAOE,cAAa;AACtB;;;AChHA,SAAS,uBAAuC;AAiChD,SAAS,iBAA4B;AACnC,SAAO,gBAAgB;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AAKA,eAAe,YAAY,IAAe,UAAmC;AAC3E,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,MAAAA,SAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAe,cACb,IACA,UACA,eAAe,MACG;AAClB,QAAM,cAAc,eAAe,UAAU;AAC7C,QAAM,SAAS,MAAM,YAAY,IAAI,GAAG,QAAQ,IAAI,WAAW,IAAI;AAEnE,MAAI,WAAW,GAAI,QAAO;AAC1B,SAAO,OAAO,YAAY,EAAE,WAAW,GAAG;AAC5C;AAKA,SAAS,aACP,SACA,cACM;AACN,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAM,QAAQ,QAAQ,SAAS;AAC/B,cAAU,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE;AAAA,EACpD;AACF;AAKA,SAAS,eACP,SACA,OACA,eACQ;AACR,QAAM,SAAS,QAAQ,KAAK;AAC5B,MAAI,WAAW,QAAW;AACxB,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,WAAW,QAAQ,aAAa;AACtC,SAAO,UAAU,SAAS;AAC5B;AAKA,eAAe,aACb,IACA,UACA,SACA,eAAe,GACE;AACjB,YAAU,OAAO,QAAQ;AACzB,eAAa,SAAS,YAAY;AAElC,QAAM,SAAS,MAAM,YAAY,IAAI;AAAA,YAAe,OAAO,QAAQ,MAAM,CAAC,KAAK;AAE/E,MAAI,WAAW,IAAI;AACjB,WAAO,eAAe,SAAS,cAAc,CAAC;AAAA,EAChD;AAEA,QAAM,QAAQ,SAAS,QAAQ,EAAE,IAAI;AACrC,MAAI,SAAS,KAAK,QAAQ,QAAQ,QAAQ;AACxC,WAAO,eAAe,SAAS,OAAO,CAAC;AAAA,EACzC;AAEA,SAAO,eAAe,SAAS,cAAc,CAAC;AAChD;AAOA,SAAS,UAAU,MAAoB;AACrC,UAAQ,OAAO,MAAM,OAAO,IAAI;AAClC;AAGA,SAAS,iBAAuB;AAC9B,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAGA,SAAS,oBAA0B;AACjC,iBAAe;AACf,YAAU,aAAa,2BAA2B,CAAC;AACnD,YAAU,IAAI,OAAO,EAAE,CAAC;AACxB,YAAU,mDAAmD;AAC7D,iBAAe;AACjB;AAGA,SAAS,kBAAkB,OAAoB,UAAwB;AACrE;AAAA,IACE;AAAA,EAAK,aAAa,QAAQ,OAAO,MAAM,WAAW,CAAC,IAAI,OAAO,MAAM,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;AAAA,EACjG;AACA,YAAU,IAAI,OAAO,EAAE,CAAC;AAC1B;AAGA,SAAS,kBAAwB;AAC/B,iBAAe;AACf,YAAU,aAAa,SAAS,IAAI,qCAAqC;AACzE,iBAAe;AACjB;AAOA,IAAM,qBAAqE;AAAA,EACzE,EAAE,OAAO,cAAc,OAAO,0CAA0C;AAAA,EACxE,EAAE,OAAO,kBAAkB,OAAO,mCAAmC;AAAA,EACrE,EAAE,OAAO,cAAc,OAAO,8CAA8C;AAAA,EAC5E,EAAE,OAAO,OAAO,OAAO,mBAAmB;AAC5C;AAKA,eAAe,aAAa,IAAe,OAAwC;AACjF,oBAAkB,OAAO,YAAY;AACrC,YAAU,gCAAgC;AAE1C,QAAM,SAAS,MAAM,aAAa,IAAI,IAAI,oBAAoB,CAAC;AAE/D,SAAO;AACT;AAKA,eAAe,WAAW,IAAe,OAAsC;AAC7E,oBAAkB,OAAO,UAAU;AACnC,YAAU,mDAAmD;AAC7D,YAAU,kEAAkE;AAC5E,iBAAe;AAEf,QAAM,UAAU,MAAM,cAAc,IAAI,gDAAgD,KAAK;AAE7F,MAAI,CAAC,SAAS;AACZ,mBAAe;AACf,cAAU,+CAA+C;AACzD,cAAU,kCAAkC;AAC5C,cAAU,qCAAqC;AAC/C,cAAU,kCAAkC;AAC5C,cAAU,0DAA0D;AAAA,EACtE;AAEA,SAAO;AACT;AAKA,eAAe,mBAAmB,IAAe,OAAqC;AACpF,oBAAkB,OAAO,eAAe;AACxC,YAAU,oDAAoD;AAC9D,iBAAe;AAEf,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAM,SAAS,MAAM,YAAY,IAAI,cAAc,UAAU,KAAK;AAElE,SAAO,UAAU;AACnB;AAKA,eAAe,gBACb,IACA,OACA,SACkB;AAClB,oBAAkB,OAAO,cAAc;AACvC,YAAU,qCAAqC;AAC/C,iBAAe;AAEf,QAAM,YACJ,mBAAmB,KAAK,CAAC,MAAM,EAAE,UAAU,QAAQ,SAAS,GAAG,SAAS;AAC1E,QAAM,eAAe,QAAQ,eAAe,OAAO,eAAe;AAClE,QAAM,YAAY,QAAQ,mBAAmB,QAAQ,IAAI;AACzD,YAAU,iBAAiB,SAAS,EAAE;AACtC,YAAU,eAAe,YAAY,EAAE;AACvC,YAAU,uBAAuB,SAAS,EAAE;AAC5C,iBAAe;AAEf,QAAM,UAAU,QAAQ,cAAc;AACtC,MAAI,CAAC,SAAS;AACZ,cAAU,iBAAiB;AAC3B,cAAU,uCAAuC;AACjD,cAAU,yCAAyC;AACnD,cAAU,gCAAgC;AAAA,EAC5C,OAAO;AACL,cAAU,iBAAiB;AAC3B,cAAU,yCAAyC;AACnD,cAAU,2DAA2D;AAAA,EACvE;AAEA,iBAAe;AACf,SAAO,cAAc,IAAI,uBAAuB,IAAI;AACtD;AAWA,eAAsB,YAAwD;AAE5E,MAAI,CAAC,cAAc,GAAG;AACpB,cAAU,gDAAgD;AAC1D,cAAU,iDAAiD;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,eAAe;AAE1B,MAAI;AACF,sBAAkB;AAElB,UAAM,QAAqB;AAAA,MACzB,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,SAAS,CAAC;AAAA,IACZ;AAGA,UAAM,QAAQ,YAAY,MAAM,aAAa,IAAI,KAAK;AACtD,UAAM;AAGN,UAAM,QAAQ,aAAa,MAAM,WAAW,IAAI,KAAK;AACrD,UAAM;AAGN,UAAM,QAAQ,kBAAkB,MAAM,mBAAmB,IAAI,KAAK;AAClE,UAAM;AAGN,UAAM,QAAQ,iBAAiB,MAAM,gBAAgB,IAAI,OAAO,MAAM,OAAO;AAC7E,UAAM;AAEN,QAAI,CAAC,MAAM,QAAQ,gBAAgB;AACjC,qBAAe;AACf,gBAAU,kBAAkB;AAC5B,aAAO;AAAA,IACT;AAEA,oBAAgB;AAGhB,WAAO,wBAAwB,MAAM,OAAwB;AAAA,EAC/D,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAKA,SAAS,wBAAwB,SAA+C;AAC9E,QAAM,eAAe,QAAQ,cAAc;AAE3C,SAAO;AAAA;AAAA,IAEL,SAAS;AAAA,IACT,WAAW;AAAA;AAAA,IAEX,WAAW;AAAA;AAAA,IAEX,OAAO,eAAe,YAAY;AAAA;AAAA,IAElC,gBAAgB;AAAA;AAAA,IAEhB,SAAS;AAAA,EACX;AACF;;;AC3UA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,SAAS,2BAA2B,QAAyB,OAAe;AACjF,QAAM,QACJ,UAAU,aACN,CAAC,GAAG,mBAAmB,IACvB,CAAC,GAAG,qBAAqB,GAAG,oBAAoB;AAEtD,QAAM,cAAc,MAAM,IAAI,CAAC,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK;AACrE,SAAO,KAAK,UAAU,aAAa,MAAM,CAAC;AAC5C;AAMO,SAAS,uBAAuB,SAAyB;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ACXA,SAAS,mBAAgC;AACvC,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,SAAS,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE;AAEhE,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,OAAO;AAAA,IACnB,KAAK;AAAA,EACP;AACF;AAKA,SAAS,sBAAmC;AAC1C,MAAI;AAEF,UAAM,aAAa,OAAO,YAAY,YAAY,QAAQ,SAAS;AACnE,UAAM,YAAY,OAAO,kBAAkB;AAC3C,UAAM,oBAAoB,OAAO,qBAAqB;AAEtD,QAAI,cAAc,aAAa,mBAAmB;AAChD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAKA,SAAS,qBAAkC;AACzC,MAAI;AACF,UAAM,YAAY,OAAO,cAAc,WAAW;AAClD,UAAM,cAAc,OAAO,cAAc,aAAa;AAEtD,QAAI,aAAa,aAAa;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAKA,SAAS,oBAAiC;AACxC,QAAM,cAAc,OAAO,KAAK,gBAAgB;AAChD,QAAM,QAAQ,YAAY;AAE1B,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO,KAAK,CAAC;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AACF;AAQA,eAAe,0BAAgD;AAC7D,QAAM,SAAS,MAAM,YAAY;AACjC,MAAI,OAAO,WAAW;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,OAAO,SAAS;AAAA,IACzB,KAAK;AAAA,EACP;AACF;AAOA,SAAS,gBAA6B;AACpC,QAAM,SAAS,mBAAmB;AAClC,QAAM,aAAa,OAAO,eAAe,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ;AAC/E,MAAI,OAAO,cAAc,WAAW,WAAW,GAAG;AAChD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,CAAC,OAAO,YAAY;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,GAAG,OAAO,QAAQ;AAAA,MAC3B,KAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,GAAG,OAAO,WAAW,MAAM,CAAC,kCAAkC,WACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI,CAAC;AAAA,IACb,KAAK,mCAAmC,OAAO,QAAQ;AAAA,EACzD;AACF;AAaA,eAAe,2BAAiD;AAC9D,QAAM,OAAO,aAAa;AAC1B,QAAM,iBAAiB,KAAK,OAAO,CAAC,MAAM,EAAE,UAAU;AACtD,QAAM,cAAc,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,eAAe;AAEnF,MAAI,eAAe,SAAS,KAAK,WAAW,SAAS,GAAG;AACtD,UAAM,QAAkB,CAAC;AACzB,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM;AAAA,QACJ,GAAG,OAAO,eAAe,MAAM,CAAC,gBAAgB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC9F;AAAA,IACF;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM;AAAA,QACJ,GAAG,OAAO,WAAW,MAAM,CAAC,mBAAmB,WAAW,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MACxF;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AACF;AAKA,eAAsB,YAAmC;AACvD,QAAM,OAAO,gBAAgB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAE3B,QAAM,SAAwB;AAAA,IAC5B,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,MAAM,wBAAwB;AAAA,IAC9B,cAAc;AAAA,IACd,MAAM,yBAAyB;AAAA,EACjC;AAEA,QAAM,YAAY,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAC9C,QAAM,iBAAiB,OAAO,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,MAAM;AAC5E,QAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQA,SAAS,YAAY,OAA4B;AAC/C,MAAI;AACJ,MAAI,MAAM,QAAQ;AAChB,aAAS,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,EACzD,WAAW,MAAM,aAAa,QAAQ;AACpC,aAAS,GAAG,OAAO,MAAM,GAAG,QAAQ,IAAI,GAAG,OAAO,KAAK;AAAA,EACzD,OAAO;AACL,aAAS,GAAG,OAAO,GAAG,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,EACvD;AAEA,MAAI,OAAO,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO;AAEtD,MAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,QAAW;AAC5C,YAAQ;AAAA,OAAU,OAAO,GAAG,QAAQ,MAAM,GAAG,GAAG,OAAO,KAAK;AAAA,EAC9D;AAEA,SAAO;AACT;AAKO,SAAS,kBAAkB,QAAsB,SAAwB;AAC9E,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,sBAAsB,OAAO,KAAK;AAAA,CAAI;AACzE,UAAQ,OAAO,MAAM,uBAAuB;AAC5C,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,YAAY,OAAO,OAAO;AAAA,CAAI;AACnD,UAAQ,OAAO,MAAM,YAAY,OAAO,WAAW;AAAA,CAAI;AACvD,UAAQ,OAAO,MAAM,IAAI;AAEzB,UAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,oBAAoB,OAAO,KAAK;AAAA,CAAI;AACvE,UAAQ,OAAO,MAAM,IAAI;AAEzB,aAAW,SAAS,OAAO,QAAQ;AACjC,YAAQ,OAAO,MAAM,YAAY,KAAK,IAAI,IAAI;AAAA,EAChD;AAEA,UAAQ,OAAO,MAAM,IAAI;AAEzB,QAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,MAAM,EAAE;AAClF,QAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,MAAM,EAAE;AAElF,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI,sCAAsC,OAAO,KAAK;AAAA;AAAA,IACjF;AACA,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,cAAc,OAAO,KAAK;AAAA,CAAI;AACjE,YAAQ,OAAO,MAAM,qEAAqE;AAC1F,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,6DAA6D;AAAA,EACpF,WAAW,cAAc,GAAG;AAC1B,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,MAAM,GAAG,OAAO,IAAI,iBAAiB,OAAO,SAAS,CAAC,6CAAwC,OAAO,KAAK;AAAA;AAAA,IACtH;AACA,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO,MAAM,kEAAkE;AACvF,YAAQ,OAAO,MAAM,gEAAgE;AAAA,EACvF,OAAO;AACL,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,wBAAwB,OAAO,SAAS,CAAC,uBAAuB,OAAO,SAAS,CAAC,cAAc,OAAO,KAAK;AAAA;AAAA,IACxI;AACA,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO,MAAM,uDAAuD;AAAA,EAC9E;AAEA,UAAQ,OAAO,MAAM,IAAI;AAEzB,MAAI,SAAS;AACX,YAAQ,OAAO,MAAM,GAAG,OAAO,GAAG,aAAa,OAAO,OAAO,UAAU,CAAC,KAAK,OAAO,KAAK;AAAA,CAAI;AAC7F,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACF;AAUA,eAAsB,cAAc,SAAyC;AAC3E,QAAM,SAAS,MAAM,UAAU;AAC/B,oBAAkB,QAAQ,QAAQ,OAAO;AACzC,SAAO,OAAO,iBAAiB,IAAI;AACrC;;;Ab1WA,SAASC,WAAU,MAAoB;AACrC,UAAQ,OAAO,MAAM,OAAO,IAAI;AAClC;AAKA,SAASC,kBAAuB;AAC9B,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAKA,SAAS,eAAe,WAA4B,SAAmC;AACrF,EAAAD,WAAU,aAAa,mBAAmB,CAAC;AAC3C,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,MAAI,UAAU,SAAS;AACrB,IAAAA,WAAU,UAAU,OAAO;AAC3B,IAAAA,WAAU,sCAAsC;AAAA,EAClD,OAAO;AACL,IAAAA,WAAU,WAAW,UAAU,OAAO,EAAE;AACxC,QAAI,YAAY,QAAW;AACzB,MAAAC,gBAAe;AACf,MAAAD,WAAU,wBAAwB;AAClC,MAAAC,gBAAe;AACf,MAAAD,WAAU,gBAAgB,qCAAqC,OAAO,GAAG,CAAC;AAAA,IAC5E;AAAA,EACF;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,eAAe,WAAyB;AAC/C,EAAAD,WAAU,aAAa,YAAY,CAAC;AACpC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,EAAAA,WAAU,YAAY,SAAS,EAAE;AACjC,EAAAA,WAAU,wDAAwD;AAClE,EAAAC,gBAAe;AACjB;AAMA,SAAS,iBAAiB,YAA8B,SAAmC;AACzF,EAAAD,WAAU,aAAa,qBAAqB,CAAC;AAC7C,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,MAAI,WAAW,SAAS;AACtB,IAAAA,WAAU,WAAW,OAAO;AAC5B,IAAAA,WAAU,4DAA4D;AAAA,EACxE,OAAO;AACL,IAAAA,WAAU,SAAS,WAAW,OAAO,EAAE;AACvC,QAAI,YAAY,QAAW;AACzB,MAAAC,gBAAe;AACf,MAAAD,WAAU,mDAAmD;AAC7D,MAAAC,gBAAe;AACf,MAAAD,WAAU,gBAAgB,OAAO,CAAC;AAAA,IACpC;AAAA,EACF;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,cAAc,UAAmC;AACxD,EAAAD,WAAU,aAAa,UAAU,CAAC;AAClC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,aAAW,WAAW,UAAU;AAC9B,IAAAA,WAAU,UAAK,OAAO,EAAE;AAAA,EAC1B;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,YAAY,QAAiC;AACpD,EAAAD,WAAU,aAAa,QAAQ,CAAC;AAChC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,aAAW,SAAS,QAAQ;AAC1B,IAAAA,WAAU,UAAK,KAAK,EAAE;AAAA,EACxB;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,eAAe,eAAwB,eAA8B;AAC5E,EAAAD,WAAU,aAAa,YAAY,CAAC;AACpC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,MAAI,iBAAiB,CAAC,eAAe;AACnC,IAAAA,WAAU,uCAAuC;AACjD,IAAAA,WAAU,wBAAwB;AAAA,EACpC;AACA,EAAAA,WAAU,6BAA6B;AACvC,EAAAA,WAAU,gDAAgD;AAC1D,EAAAC,gBAAe;AACjB;AAKA,SAAS,WAAW,OAA6B,SAAwB;AACvE,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,aAAa,KAAK,MAAM;AACvC,UAAM,WAAW,KAAK,eAAe,SAAY,KAAK,OAAO,KAAK,UAAU,CAAC,QAAQ;AACrF,IAAAD,WAAU,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,UAAU,WAAW,EAAE,EAAE;AAC5D,QAAI,KAAK,YAAY,WAAc,WAAW,KAAK,WAAW,WAAW;AACvE,MAAAA,WAAU,KAAK,KAAK,OAAO,EAAE;AAAA,IAC/B;AAAA,EACF;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,aAAa,SAAwB;AAC5C,QAAM,UAAU,UAAU,yCAAoC;AAC9D,EAAAD,WAAU,UAAU,WAAW,OAAO,YAAY,WAAW,OAAO,SAAS;AAC7E,EAAAC,gBAAe;AACjB;AASA,SAAS,iBAAiB,aAAgE;AACxF,QAAM,OAAO,gBAAgB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,MAAM,kBAAkB,WAAW;AAEzC,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aAAa,IAAI,QAAQ,iBAAiB,IAAI,UAAU,YAAa,IAAI,UAAU,WAAW,cAAe,WAAW;AAAA,MACjI,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAGA,IAAM,sBAAsB;AAM5B,SAAS,sBAAwE;AAC/E,QAAM,OAAO,gBAAgB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,WAAqB,CAAC;AAE5B,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,OAAO,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACnD,QAAM,SAAS,SAAS;AAExB,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,WAAW,OAAO,qBAAgB,OAAO,mBAAmB,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,YAAY;AACpC,QAAM,UAAU,SACZ,WAAW,OAAO,YAAY,OAAO,mBAAmB,CAAC,oBACzD,WAAW,OAAO,YAAO,OAAO,mBAAmB,CAAC;AAExD,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,cACP,QACA,SACA,WACA,SACA,WACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,KAAsB,SAAsC;AACpF,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,MAAI,QAAQ,SAAS;AACnB,WAAO,cAAc,WAAW,wBAAwB,SAAS;AAAA,EACnE;AAEA,QAAM,SAAS,CAAC,IAAI,UAAU;AAC9B,QAAM,UAAU,mBAAmB,MAAM;AAEzC,MAAI,CAAC,IAAI,UAAU,WAAW;AAC5B,UAAMC,aAA6B;AAAA,MACjC,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,mBAAmB,QAAQ,QAAQ,OAAO,QAAQ,KAAK;AACzE,QAAM,SAAS,UAAU,UACrB,UAAU,oBACR,YACA,YACF;AACJ,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,UAAU,UAAU,SAAY;AAAA,IAChC;AAAA,EACF;AACF;AAGA,SAAS,gBACP,QACA,SACA,WACA,WACoD;AACpD,SAAO;AAAA,IACL,MAAM,EAAE,MAAM,cAAc,QAAQ,SAAS,YAAY,gBAAgB,EAAE,IAAI,IAAI,UAAU;AAAA,IAC7F;AAAA,EACF;AACF;AAGA,SAAS,gBACP,QACA,SACA,WACA,YACgG;AAChG,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,IACA,aAAa,YAAY,YAAY,QAAQ,oBAAoB,IAAI;AAAA,IACrE;AAAA,EACF;AACF;AAKA,SAAS,aACP,KACA,SACoD;AACpD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,MAAI,QAAQ,WAAW;AACrB,WAAO,gBAAgB,WAAW,0BAA0B,SAAS;AAAA,EACvE;AAEA,QAAM,YAAY,iBAAiB,IAAI,YAAY,IAAI;AACvD,MAAIC,YAAW,SAAS,KAAK,CAAC,QAAQ,OAAO;AAC3C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,cAAc,gBAAgB,IAAI,YAAY,MAAM,QAAQ,MAAM;AACxE,UAAM,MAAM,QAAQ,SAAS,iBAAiB,WAAW,KAAK,YAAY,WAAW;AACrF,WAAO,gBAAgB,WAAW,KAAK,WAAW,WAAW;AAAA,EAC/D,SAAS,OAAO;AACd,UAAM,MAAM,gBAAgB,KAAK;AACjC,WAAO,gBAAgB,UAAU,gCAAgC,GAAG,IAAI,SAAS;AAAA,EACnF;AACF;AAMA,SAAS,aACP,KACA,SACgG;AAChG,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,MAAI,QAAQ,WAAW;AACrB,WAAO,gBAAgB,WAAW,0BAA0B,SAAS;AAAA,EACvE;AAGA,MAAI,CAAC,IAAI,UAAU,WAAW;AAC5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,eAAe,QAAQ,KAAK;AAC/C,QAAM,SAAS,WAAW,UACtB,WAAW,oBACT,YACA,YACF;AAEJ,SAAO,gBAAgB,QAAQ,WAAW,SAAS,WAAW,UAAU;AAC1E;AAKA,SAAS,gBAAgB,SAAkC;AACzD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,cAAc;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,kBAAkB;AAClC,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,gBAAgB,QAAQ,cAAc;AAAA,MACtE,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,SAAS,kBAAkB,QAAQ,OAAO,QAAQ,MAAM;AAC9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,oBAAoB,YAAY,YAAa;AAAA,IAC9E,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAKA,SAAS,cAAc,SAAkC;AACvD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,YAAY;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,gBAAgB;AAChC,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,cAAc,QAAQ,cAAc;AAAA,MACpE,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,SAAS,gBAAgB,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,KAAK;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,oBAAoB,YAAY,YAAa;AAAA,IAC9E,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAKA,SAAS,eAAe,SAAuE;AAC7F,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,QAAM,gBAAgB,oBAAoB,QAAQ,MAAM;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,cAAc,UAClB,cAAc,QAAQ,SAAS,IAC7B,YACA,YACF;AAAA,MACJ,SAAS,cAAc,UACnB,cAAc,QAAQ,SAAS,IAC7B,WAAW,OAAO,cAAc,QAAQ,MAAM,CAAC,iBAC/C,kCACF,WAAW,cAAc,SAAS,eAAe;AAAA,MACrD,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAKA,SAAS,aAAa,SAAkC;AACtD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,WAAW;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,eAAe;AAC/B,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,aAAa,QAAQ,cAAc;AAAA,MACnE,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,SAAS,eAAe,QAAQ,OAAO,QAAQ,MAAM;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,oBAAoB,YAAY,YAAa;AAAA,IAC9E,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAKA,SAAS,cAAc,aAAqB,SAAkC;AAC5E,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,YAAY;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,SAAS,kBAAkB,aAAa,QAAQ,OAAO,QAAQ,MAAM;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,UAAU,YAAY,YAAa;AAAA,IACpE,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAGA,SAAS,gBAAgB,OAA6B,MAAc,OAAuB;AACzF,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC9C,QAAM,KAAK,MAAM,WAAW,aAAa,MAAM,WAAW;AAC1D,SAAO,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK;AACtC;AAMA,SAAS,kBAAkB,OAAwC;AACjE,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,SAAS,KAAK,CAAC;AAC3D,QAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAChE,QAAM,WACJ,YAAY,IACR,GAAG,OAAO,SAAS,CAAC,0BACpB,GAAG,OAAO,SAAS,MAAM,CAAC;AAEhC,QAAM,UAAU;AAAA,IACd;AAAA,IACA,gBAAgB,OAAO,kBAAkB,WAAW;AAAA,IACpD,gBAAgB,OAAO,iBAAiB,QAAQ;AAAA,EAClD;AACA,QAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC;AAE1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,YAAY,YAAY;AAAA,IAChC,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC9B,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AASA,SAAS,qBAAqB,UAAoB,WAA0B;AAC1E,MAAI,CAAC,WAAW;AACd,aAAS;AAAA,MACP;AAAA,IACF;AACA,aAAS,KAAK,8EAA8E;AAAA,EAC9F;AACF;AAKA,SAAS,cAAc,OAAuC;AAC5D,SAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,EAAE,IAAI,SAAS;AAC9F;AAgBA,SAAS,aAAa,QAAiE;AACrF,SAAO,QAAQ,YAAY,QAAQ,CAAC,OAAO;AAC7C;AAGA,SAAS,iBAAiB,KAAsC;AAC9D,QAAM,SAAS,cAAc,IAAI,KAAK;AACtC,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd;AAAA,IACA,YAAY,gBAAgB,EAAE,IAAI,IAAI,IAAI;AAAA,IAC1C,GAAI,aAAa,IAAI,SAAS,KAAK,EAAE,eAAe,KAAK;AAAA,IACzD,GAAI,IAAI,YAAY,UAAa,EAAE,YAAY,IAAI,QAAQ;AAAA,IAC3D,GAAI,aAAa,IAAI,UAAU,KAAK,EAAE,iBAAiB,KAAK;AAAA,IAC5D,GAAI,IAAI,gBAAgB,UAAa,EAAE,aAAa,IAAI,YAAY;AAAA,IACpE,GAAI,IAAI,cAAc,UAAa,EAAE,WAAW,IAAI,UAAU;AAAA,IAC9D,GAAI,IAAI,kBAAkB,UAAa;AAAA,MACrC,aAAa,IAAI,cAAc;AAAA,MAC/B,iBAAiB,IAAI,cAAc,QAAQ;AAAA,IAC7C;AAAA,EACF;AACF;AASO,SAAS,SAAS,UAAiC,CAAC,GAAgB;AACzE,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,QAAM,gBAAgB,mBAAmB,MAAM,OAAO;AACtD,QAAM,cAAc,QAAQ,IAAI;AAEhC,QAAM,WAAqB,CAAC;AAG5B,QAAM,EAAE,KAAK,MAAM,cAAc,IAAI,iBAAiB,WAAW;AACjE,uBAAqB,UAAU,IAAI,UAAU,SAAS;AAGtD,QAAM,EAAE,MAAM,YAAY,UAAU,eAAe,IAAI,oBAAoB;AAC3E,WAAS,KAAK,GAAG,cAAc;AAG/B,QAAM,EAAE,MAAM,SAAS,SAAS,UAAU,IAAI,iBAAiB,KAAK,aAAa;AAGjF,QAAM,EAAE,MAAM,WAAW,UAAU,IAAI,aAAa,KAAK,aAAa;AAGtE,QAAM,EAAE,MAAM,WAAW,aAAa,WAAW,IAAI,aAAa,KAAK,aAAa;AAGpF,QAAM,EAAE,MAAM,aAAa,QAAQ,cAAc,IAAI,eAAe,aAAa;AAGjF,QAAM,eAAe,gBAAgB,aAAa;AAGlD,QAAM,aAAa,cAAc,aAAa;AAG9C,QAAM,YAAY,aAAa,aAAa;AAE5C,QAAM,aAAa,cAAc,aAAa,aAAa;AAC3D,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,KAAK,kBAAkB,KAAK,CAAC;AAEnC,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAGA,SAAS,oBAAoB,QAA2B;AACtD,MAAI,OAAO,eAAe,UAAa,OAAO,kBAAkB,MAAM;AACpE,UAAM,YACJ,OAAO,kBAAkB,OACrB;AAAA,MACE,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX,IACA,EAAE,SAAS,OAAO,mBAAmB,OAAO,SAAS,gCAAgC;AAC3F,mBAAe,WAAW,OAAO,UAAU;AAAA,EAC7C;AACA,MAAI,OAAO,gBAAgB,UAAa,OAAO,oBAAoB,MAAM;AACvE,UAAM,aACJ,OAAO,oBAAoB,OACvB;AAAA,MACE,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX,IACA,EAAE,SAAS,OAAO,mBAAmB,OAAO,SAAS,gCAAgC;AAC3F,qBAAiB,YAAY,OAAO,WAAW;AAAA,EACjD;AACA,MAAI,OAAO,cAAc,OAAW,gBAAe,OAAO,SAAS;AACnE,MAAI,OAAO,gBAAgB,OAAW,qBAAoB,MAAM;AAChE,6BAA2B;AAC7B;AAGA,SAAS,6BAAmC;AAC1C,QAAM,UAAU,2BAA2B,KAAK;AAChD,QAAM,SAAS,uBAAuB,OAAO;AAC7C,EAAAH,WAAU,MAAM;AAClB;AAGA,SAAS,oBAAoB,QAA2B;AACtD,EAAAA,WAAU,aAAa,gBAAgB,CAAC;AACxC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,QAAM,QAAQ,OAAO,mBAAmB;AACxC,QAAM,MACJ,QAAQ,IACJ,WAAW,OAAO,KAAK,CAAC,sBAAsB,OAAO,eAAe,EAAE,KACtE,oCAAoC,OAAO,eAAe,EAAE;AAClE,EAAAA,WAAU,GAAG;AACb,EAAAC,gBAAe;AACjB;AAKO,SAAS,iBAAiB,QAAqB,SAAwB;AAC5E,EAAAA,gBAAe;AACf,EAAAD,WAAU,aAAa,uBAAuB,OAAO,EAAE,CAAC;AACxD,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,EAAAC,gBAAe;AAEf,aAAW,OAAO,OAAO,OAAO;AAChC,sBAAoB,MAAM;AAE1B,MAAI,OAAO,SAAS,SAAS,EAAG,eAAc,OAAO,QAAQ;AAC7D,MAAI,OAAO,OAAO,SAAS,EAAG,aAAY,OAAO,MAAM;AACvD,iBAAe,OAAO,kBAAkB,MAAM,OAAO,eAAe,MAAS;AAC7E,eAAa,OAAO,OAAO;AAC7B;AAaA,SAAS,0BAA0B,eAA8B;AAC/D,EAAAA,gBAAe;AACf,EAAAD,WAAU,aAAa,iBAAiB,CAAC;AACzC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AAExB,EAAAA,WAAU,6EAAwE;AAClF,MAAI,eAAe;AACjB,IAAAA,WAAU,8EAAyE;AAAA,EACrF,OAAO;AACL,IAAAA,WAAU,iEAA4D;AAAA,EACxE;AACA,EAAAA,WAAU,uEAAkE;AAE5E,EAAAC,gBAAe;AACf,EAAAD,WAAU,KAAK,OAAO,GAAG,yDAAyD,OAAO,KAAK,EAAE;AAChG,EAAAA,WAAU,KAAK,OAAO,GAAG,uDAAuD,OAAO,KAAK,EAAE;AAChG;AAYA,eAAe,uBAAuB,QAAmC;AACvE,MAAI,OAAQ,QAAO;AAEnB,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,SAAS,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AACrD,QAAM,QAAQ,OAAO,OAAO;AAE5B,EAAAC,gBAAe;AACf,EAAAD,WAAU,aAAa,iBAAiB,OAAO,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC;AAClF,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AAExB,aAAW,SAAS,OAAO,QAAQ;AACjC,QAAI;AACJ,QAAI,MAAM,QAAQ;AAChB,eAAS,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,IACzD,WAAW,MAAM,aAAa,QAAQ;AACpC,eAAS,GAAG,OAAO,MAAM,GAAG,QAAQ,IAAI,GAAG,OAAO,KAAK;AAAA,IACzD,OAAO;AACL,eAAS,GAAG,OAAO,GAAG,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,IACvD;AACA,IAAAA,WAAU,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AACvD,QAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,QAAW;AAC5C,MAAAA,WAAU,QAAQ,OAAO,GAAG,eAAU,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE;AAAA,IAClE;AAAA,EACF;AAEA,EAAAC,gBAAe;AACf,MAAI,CAAC,OAAO,gBAAgB;AAC1B,IAAAD;AAAA,MACE,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,4EAA4E,OAAO,KAAK;AAAA,IACrH;AAAA,EACF,WAAW,CAAC,OAAO,WAAW;AAC5B,UAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE;AACzD,IAAAA;AAAA,MACE,GAAG,OAAO,MAAM,GAAG,OAAO,IAAI,uBAAuB,OAAO,SAAS,CAAC,2EAAsE,OAAO,KAAK;AAAA,IAC1J;AAAA,EACF,OAAO;AACL,IAAAA;AAAA,MACE,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI,mDAAmD,OAAO,KAAK;AAAA,IAC9F;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAOO,SAAS,aAAa,UAAiC,CAAC,GAAW;AACxE,QAAM,gBAAgB,mBAAmB,MAAM,OAAO;AAGtD,MAAI,CAAC,cAAc,KAAK,CAAC,cAAc,gBAAgB;AACrD,IAAAA,WAAU,uCAAuC;AACjD,IAAAA,WAAU,4CAA4C;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,OAAO;AAC/B,mBAAiB,QAAQ,cAAc,OAAO;AAE9C,SAAO,OAAO,UAAU,IAAI;AAC9B;AAuBA,eAAe,oBAAoB,SAA+C;AAChF,QAAM,gBAAgB,MAAM,UAAU;AACtC,MAAI,kBAAkB,OAAW,QAAO;AAExC,QAAM,gBAAgB,EAAE,GAAG,SAAS,GAAG,cAAc;AACrD,SAAO,cAAc;AAErB,QAAM,SAAS,SAAS,aAAa;AACrC,mBAAiB,QAAQ,cAAc,WAAW,KAAK;AACvD,QAAM,WAAW,MAAM,uBAAuB,cAAc,UAAU,KAAK;AAC3E,MAAI,OAAO,WAAW,EAAE,cAAc,UAAU,QAAQ;AACtD,8BAA0B,OAAO,kBAAkB,IAAI;AAAA,EACzD;AACA,SAAO,OAAO,WAAW,WAAW,IAAI;AAC1C;AAEA,eAAsB,kBAAkB,UAA+B,CAAC,GAAoB;AAC1F,MAAI,QAAQ,gBAAgB,MAAM;AAChC,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAGA,QAAM,cAAc,iBAAiB,OAAO;AAC5C,QAAM,WAAW,MAAM,uBAAuB,QAAQ,UAAU,KAAK;AACrE,MAAI,YAAY,aAAa,KAAK,EAAE,QAAQ,UAAU,QAAQ;AAC5D,8BAA0B,YAAY,aAAa;AAAA,EACrD;AAEA,SAAO,YAAY,aAAa,KAAK,CAAC,WAAW,IAAI;AACvD;AAOA,SAAS,iBAAiB,SAGxB;AACA,QAAM,gBAAgB,mBAAmB,MAAM,OAAO;AACtD,MAAI,CAAC,cAAc,KAAK,CAAC,cAAc,gBAAgB;AACrD,IAAAA,WAAU,uCAAuC;AACjD,IAAAA,WAAU,4CAA4C;AACtD,WAAO,EAAE,UAAU,GAAG,eAAe,MAAM;AAAA,EAC7C;AACA,QAAM,SAAS,SAAS,OAAO;AAC/B,mBAAiB,QAAQ,cAAc,OAAO;AAC9C,SAAO,EAAE,UAAU,OAAO,UAAU,IAAI,GAAG,eAAe,OAAO,kBAAkB,KAAK;AAC1F;","names":["existsSync","execSync","homedir","join","execSync","execSync","readFileSync","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","execFileSync","execFileSync","join","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","logger","join","homedir","isAlreadyConfigured","existsSync","readFileSync","mkdirSync","writeFileSync","execFileSync","logger","isAlreadyConfigured","execFileSync","addMcpServer","resolve","writeLine","writeEmptyLine","mcpResult","existsSync"]}
1
+ {"version":3,"sources":["../src/cli/setup-command.ts","../src/cli/setup-types.ts","../src/cli/setup-environment.ts","../src/cli/setup-mcp.ts","../src/cli/setup-rules.ts","../src/cli/setup-formatting.ts","../src/cli/setup-opencode.ts","../src/cli/setup-cli-detection.ts","../src/cli/cli-detection-error.ts","../src/cli/setup-gemini.ts","../src/cli/setup-codex.ts","../src/cli/setup-wizard.ts","../src/cli/setup-permissions.ts","../src/cli/verify-command.ts"],"sourcesContent":["/* eslint-disable max-lines -- Cohesive setup command module (governance: 400-600 OK if cohesive) */\n/**\n * nexus-agents setup command\n *\n * Configures Claude CLI integration with nexus-agents MCP server.\n * Generates MCP configuration snippet and .rules/nexus-agents.md.\n *\n * @module cli/setup-command\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n * (Source: Issue #425 - Interactive setup wizard)\n */\n\nimport { existsSync } from 'node:fs';\nimport type { SetupOptions, SetupResult, SetupStep, EnvironmentInfo } from './setup-types.js';\nimport { SetupOptionsSchema } from './setup-types.js';\nimport { getTimeProvider, getErrorMessage } from '../core/index.js';\nimport {\n detectEnvironment,\n generateMcpSnippet,\n generateRulesContent,\n createRulesFile,\n getRulesFilePath,\n formatStatus,\n formatHeader,\n formatCodeBlock,\n isInteractive,\n configureMcpServer,\n // Hook configuration (Issue #416)\n configureHooks,\n generateHookSnippet,\n} from './setup-helpers.js';\nimport type { McpConfigResult, HookConfigResult } from './setup-helpers.js';\nimport { initDataDirectories } from './setup-data-dir.js';\nimport type { DataDirInitResult } from './setup-data-dir.js';\nimport { runConfigInitSync } from './setup-config.js';\nimport { detectOpenCodeCli, configureOpenCode } from './setup-opencode.js';\nimport { detectGeminiCli, configureGemini } from './setup-gemini.js';\nimport { detectCodexCli, configureCodex } from './setup-codex.js';\nimport { formatDetectionMessage } from './cli-detection-error.js';\nimport { VERSION } from '../version.js';\nimport { runWizard } from './setup-wizard.js';\nimport { generatePermissionsSnippet, buildPermissionsBanner } from './setup-permissions.js';\n// #2137: post-setup health gate. Surfaces install-time issues that are easy\n// to miss (better-sqlite3 native build, missing API keys, unwritable data\n// dirs) inline at the end of setup, with copy-pasteable remediation.\nimport { runVerify } from './verify-command.js';\nimport { colors, symbols } from './ansi-output.js';\n\n// ============================================================================\n// Output Helpers\n// ============================================================================\n\n/**\n * Writes a line to stdout.\n */\nfunction writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/**\n * Writes an empty line.\n */\nfunction writeEmptyLine(): void {\n process.stdout.write('\\n');\n}\n\n/**\n * Prints MCP configuration result section.\n */\nfunction printMcpResult(mcpResult: McpConfigResult, snippet: string | undefined): void {\n writeLine(formatHeader('MCP Configuration'));\n writeLine('─'.repeat(40));\n if (mcpResult.success) {\n writeLine(mcpResult.message);\n writeLine('Run `/mcp` in Claude Code to verify.');\n } else {\n writeLine(`Failed: ${mcpResult.message}`);\n if (snippet !== undefined) {\n writeEmptyLine();\n writeLine('Manual fallback - run:');\n writeEmptyLine();\n writeLine(formatCodeBlock(`claude mcp add-json nexus-agents '${snippet}'`));\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints rules file section.\n */\nfunction printRulesFile(rulesPath: string): void {\n writeLine(formatHeader('Rules File'));\n writeLine('─'.repeat(40));\n writeLine(`Created: ${rulesPath}`);\n writeLine('Claude will now have context about nexus-agents tools.');\n writeEmptyLine();\n}\n\n/**\n * Prints hooks configuration result section.\n * (Source: Issue #416)\n */\nfunction printHooksResult(hookResult: HookConfigResult, snippet: string | undefined): void {\n writeLine(formatHeader('Hooks Configuration'));\n writeLine('─'.repeat(40));\n if (hookResult.success) {\n writeLine(hookResult.message);\n writeLine('Hooks will track sessions, metrics, and validate tool use.');\n } else {\n writeLine(`Note: ${hookResult.message}`);\n if (snippet !== undefined) {\n writeEmptyLine();\n writeLine('Manual fallback - add to ~/.claude/settings.json:');\n writeEmptyLine();\n writeLine(formatCodeBlock(snippet));\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints warnings section.\n */\nfunction printWarnings(warnings: readonly string[]): void {\n writeLine(formatHeader('Warnings'));\n writeLine('─'.repeat(40));\n for (const warning of warnings) {\n writeLine(`⚠ ${warning}`);\n }\n writeEmptyLine();\n}\n\n/**\n * Prints errors section.\n */\nfunction printErrors(errors: readonly string[]): void {\n writeLine(formatHeader('Errors'));\n writeLine('─'.repeat(40));\n for (const error of errors) {\n writeLine(`✗ ${error}`);\n }\n writeEmptyLine();\n}\n\n/**\n * Prints next steps section.\n */\nfunction printNextSteps(mcpConfigured: boolean, hasMcpSnippet: boolean): void {\n writeLine(formatHeader('Next Steps'));\n writeLine('─'.repeat(40));\n if (hasMcpSnippet && !mcpConfigured) {\n writeLine('1. Configure MCP manually (see above)');\n writeLine('2. Restart Claude Code');\n }\n writeLine('3. Run: nexus-agents doctor');\n writeLine('4. Try: nexus-agents orchestrate \"Hello World\"');\n writeEmptyLine();\n}\n\n/**\n * Prints steps with status indicators.\n */\nfunction printSteps(steps: readonly SetupStep[], verbose: boolean): void {\n for (const step of steps) {\n const status = formatStatus(step.status);\n const duration = step.durationMs !== undefined ? ` (${String(step.durationMs)}ms)` : '';\n writeLine(`${status} ${step.name}${verbose ? duration : ''}`);\n if (step.message !== undefined && (verbose || step.status === 'failed')) {\n writeLine(` ${step.message}`);\n }\n }\n writeEmptyLine();\n}\n\n/**\n * Prints result summary line.\n */\nfunction printSummary(success: boolean): void {\n const summary = success ? '✓ Setup completed successfully!' : '✗ Setup completed with errors';\n writeLine(success ? `\\x1b[32m${summary}\\x1b[0m` : `\\x1b[31m${summary}\\x1b[0m`);\n writeEmptyLine();\n}\n\n// ============================================================================\n// Setup Steps\n// ============================================================================\n\n/**\n * Runs the environment detection step.\n */\nfunction runDetectionStep(projectRoot: string): { env: EnvironmentInfo; step: SetupStep } {\n const time = getTimeProvider();\n const startTime = time.now();\n const env = detectEnvironment(projectRoot);\n\n return {\n env,\n step: {\n name: 'Environment Detection',\n status: 'success',\n message: `Platform: ${env.platform}, Claude CLI: ${env.claudeCli.installed ? (env.claudeCli.version ?? 'installed') : 'not found'}`,\n durationMs: time.now() - startTime,\n },\n };\n}\n\n/** Minimum Node.js major version required. */\nconst REQUIRED_NODE_MAJOR = 22;\n\n/**\n * Runs the prerequisite validation step.\n * Checks Node.js version and warns about missing package managers.\n */\nfunction runPrerequisiteStep(): { step: SetupStep; warnings: readonly string[] } {\n const time = getTimeProvider();\n const startTime = time.now();\n const warnings: string[] = [];\n\n const version = process.version;\n const major = Number(version.slice(1).split('.')[0]);\n const nodeOk = major >= REQUIRED_NODE_MAJOR;\n\n if (!nodeOk) {\n warnings.push(\n `Node.js ${version} detected — v${String(REQUIRED_NODE_MAJOR)}.x+ required. Some features may not work.`\n );\n }\n\n const status = nodeOk ? 'success' : 'warning';\n const message = nodeOk\n ? `Node.js ${version} (meets v${String(REQUIRED_NODE_MAJOR)}.x requirement)`\n : `Node.js ${version} — v${String(REQUIRED_NODE_MAJOR)}.x+ required`;\n\n return {\n step: {\n name: 'Prerequisite Check',\n status,\n message,\n durationMs: time.now() - startTime,\n },\n warnings,\n };\n}\n\n/** MCP step result type. */\ntype McpStepResult = {\n step: SetupStep;\n snippet: string | undefined;\n mcpResult: McpConfigResult | undefined;\n};\n\n/** Creates an MCP step result. */\nfunction makeMcpResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n snippet?: string,\n mcpResult?: McpConfigResult\n): McpStepResult {\n return {\n step: {\n name: 'MCP Configuration',\n status,\n message,\n durationMs: getTimeProvider().now() - startTime,\n },\n snippet,\n mcpResult,\n };\n}\n\n/**\n * Runs the MCP configuration step.\n */\nfunction runMcpConfigStep(env: EnvironmentInfo, options: SetupOptions): McpStepResult {\n const startTime = getTimeProvider().now();\n\n if (options.skipMcp) {\n return makeMcpResult('skipped', 'Skipped (--skip-mcp)', startTime);\n }\n\n const useNpx = !env.claudeCli.installed;\n const snippet = generateMcpSnippet(useNpx);\n\n if (!env.claudeCli.installed) {\n const mcpResult: McpConfigResult = {\n success: false,\n alreadyConfigured: false,\n message: 'Claude CLI not installed',\n };\n return makeMcpResult(\n 'warning',\n 'Claude CLI not found - manual configuration required',\n startTime,\n snippet,\n mcpResult\n );\n }\n\n const mcpResult = configureMcpServer(useNpx, options.force, options.scope);\n const status = mcpResult.success\n ? mcpResult.alreadyConfigured\n ? 'skipped'\n : 'success'\n : 'failed';\n return makeMcpResult(\n status,\n mcpResult.message,\n startTime,\n mcpResult.success ? undefined : snippet,\n mcpResult\n );\n}\n\n/** Creates a rules step result. */\nfunction makeRulesResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n rulesPath?: string\n): { step: SetupStep; rulesPath: string | undefined } {\n return {\n step: { name: 'Rules File', status, message, durationMs: getTimeProvider().now() - startTime },\n rulesPath,\n };\n}\n\n/** Creates a hooks step result. */\nfunction makeHooksResult(\n status: SetupStep['status'],\n message: string,\n startTime: number,\n hookResult?: HookConfigResult\n): { step: SetupStep; hookSnippet: string | undefined; hookResult: HookConfigResult | undefined } {\n return {\n step: {\n name: 'Hooks Configuration',\n status,\n message,\n durationMs: getTimeProvider().now() - startTime,\n },\n hookSnippet: hookResult?.success === false ? generateHookSnippet() : undefined,\n hookResult,\n };\n}\n\n/**\n * Runs the rules file generation step.\n */\nfunction runRulesStep(\n env: EnvironmentInfo,\n options: SetupOptions\n): { step: SetupStep; rulesPath: string | undefined } {\n const startTime = getTimeProvider().now();\n\n if (options.skipRules) {\n return makeRulesResult('skipped', 'Skipped (--skip-rules)', startTime);\n }\n\n const rulesPath = getRulesFilePath(env.projectInfo.root);\n if (existsSync(rulesPath) && !options.force) {\n return makeRulesResult(\n 'skipped',\n 'Rules file already exists (use --force to overwrite)',\n startTime\n );\n }\n\n try {\n const createdPath = createRulesFile(env.projectInfo.root, options.dryRun);\n const msg = options.dryRun ? `Would create: ${createdPath}` : `Created: ${createdPath}`;\n return makeRulesResult('success', msg, startTime, createdPath);\n } catch (error) {\n const msg = getErrorMessage(error);\n return makeRulesResult('failed', `Failed to create rules file: ${msg}`, startTime);\n }\n}\n\n/**\n * Runs the hooks configuration step.\n * (Source: Issue #416 - Setup command hook configuration)\n */\nfunction runHooksStep(\n env: EnvironmentInfo,\n options: SetupOptions\n): { step: SetupStep; hookSnippet: string | undefined; hookResult: HookConfigResult | undefined } {\n const startTime = getTimeProvider().now();\n\n if (options.skipHooks) {\n return makeHooksResult('skipped', 'Skipped (--skip-hooks)', startTime);\n }\n\n // If Claude CLI is not installed, we can't configure automatically\n if (!env.claudeCli.installed) {\n return makeHooksResult(\n 'warning',\n 'Claude CLI not found - manual hook configuration required',\n startTime,\n {\n success: false,\n alreadyConfigured: false,\n message: 'Claude CLI not installed',\n }\n );\n }\n\n // If dry-run, just report what would happen\n if (options.dryRun) {\n return makeHooksResult(\n 'success',\n 'Would configure nexus-agents hooks in Claude Code settings',\n startTime\n );\n }\n\n // Configure using Claude CLI\n const hookResult = configureHooks(options.force);\n const status = hookResult.success\n ? hookResult.alreadyConfigured\n ? 'skipped'\n : 'success'\n : 'failed';\n\n return makeHooksResult(status, hookResult.message, startTime, hookResult);\n}\n\n/**\n * Runs the OpenCode MCP configuration step (#1253).\n */\nfunction runOpenCodeStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipOpencode) {\n return {\n name: 'OpenCode MCP',\n status: 'skipped',\n message: 'Skipped (--skip-opencode)',\n durationMs: 0,\n };\n }\n const cliInfo = detectOpenCodeCli();\n if (!cliInfo.installed) {\n return {\n name: 'OpenCode MCP',\n status: 'skipped',\n message: formatDetectionMessage('OpenCode CLI', cliInfo.detectionError),\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureOpenCode(options.force, options.dryRun);\n return {\n name: 'OpenCode MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the Gemini CLI MCP configuration step (#1259).\n */\nfunction runGeminiStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipGemini) {\n return {\n name: 'Gemini MCP',\n status: 'skipped',\n message: 'Skipped (--skip-gemini)',\n durationMs: 0,\n };\n }\n const cliInfo = detectGeminiCli();\n if (!cliInfo.installed) {\n return {\n name: 'Gemini MCP',\n status: 'skipped',\n message: formatDetectionMessage('Gemini CLI', cliInfo.detectionError),\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureGemini(options.force, options.dryRun, options.scope);\n return {\n name: 'Gemini MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the data directory initialization step (#1249).\n */\nfunction runDataDirStep(options: SetupOptions): { step: SetupStep; result: DataDirInitResult } {\n const startTime = getTimeProvider().now();\n const dataDirResult = initDataDirectories(options.dryRun);\n return {\n step: {\n name: 'Data Directory',\n status: dataDirResult.success\n ? dataDirResult.created.length > 0\n ? 'success'\n : 'skipped'\n : 'failed',\n message: dataDirResult.success\n ? dataDirResult.created.length > 0\n ? `Created ${String(dataDirResult.created.length)} directories`\n : 'All directories already exist'\n : `Failed: ${dataDirResult.error ?? 'Unknown error'}`,\n durationMs: getTimeProvider().now() - startTime,\n },\n result: dataDirResult,\n };\n}\n\n/**\n * Runs the Codex CLI MCP configuration step (#1263).\n */\nfunction runCodexStep(options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipCodex) {\n return {\n name: 'Codex MCP',\n status: 'skipped',\n message: 'Skipped (--skip-codex)',\n durationMs: 0,\n };\n }\n const cliInfo = detectCodexCli();\n if (!cliInfo.installed) {\n return {\n name: 'Codex MCP',\n status: 'skipped',\n message: formatDetectionMessage('Codex CLI', cliInfo.detectionError),\n durationMs: getTimeProvider().now() - startTime,\n };\n }\n const result = configureCodex(options.force, options.dryRun);\n return {\n name: 'Codex MCP',\n status: result.success ? (result.alreadyConfigured ? 'skipped' : 'success') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/**\n * Runs the config file generation step (#1252).\n */\nfunction runConfigStep(projectRoot: string, options: SetupOptions): SetupStep {\n const startTime = getTimeProvider().now();\n if (options.skipConfig) {\n return {\n name: 'Configuration',\n status: 'skipped',\n message: 'Skipped (--skip-config)',\n durationMs: 0,\n };\n }\n const result = runConfigInitSync(projectRoot, options.force, options.dryRun);\n return {\n name: 'Configuration',\n status: result.success ? (result.created ? 'success' : 'skipped') : 'failed',\n message: result.message,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n/** Checks a named step's status, returning a check or issue string. */\nfunction checkStepStatus(steps: readonly SetupStep[], name: string, label: string): string {\n const step = steps.find((s) => s.name === name);\n const ok = step?.status === 'success' || step?.status === 'skipped';\n return ok ? `${label} OK` : `${label} failed`;\n}\n\n/**\n * Runs post-setup validation step (#1271).\n * Checks that critical setup outcomes are in place.\n */\nfunction runValidationStep(steps: readonly SetupStep[]): SetupStep {\n const startTime = getTimeProvider().now();\n\n const mcpSteps = steps.filter((s) => s.name.includes('MCP'));\n const mcpFailed = mcpSteps.filter((s) => s.status === 'failed').length;\n const mcpCheck =\n mcpFailed > 0\n ? `${String(mcpFailed)} MCP config(s) failed`\n : `${String(mcpSteps.length)} MCP configs OK`;\n\n const results = [\n mcpCheck,\n checkStepStatus(steps, 'Data Directory', 'Data dirs'),\n checkStepStatus(steps, 'Configuration', 'Config'),\n ];\n const hasIssues = results.some((r) => r.includes('failed'));\n\n return {\n name: 'Validation',\n status: hasIssues ? 'warning' : 'success',\n message: `${results.join(', ')}. Run \\`nexus-agents doctor\\` for full health check`,\n durationMs: getTimeProvider().now() - startTime,\n };\n}\n\n// ============================================================================\n// Main Command Helpers\n// ============================================================================\n\n/**\n * Adds Claude CLI warnings if not installed.\n */\nfunction addClaudeCliWarnings(warnings: string[], installed: boolean): void {\n if (!installed) {\n warnings.push(\n 'Claude CLI not found. Install it with: npm install -g @anthropic-ai/claude-code'\n );\n warnings.push('The MCP snippet uses npx to run nexus-agents (works without global install).');\n }\n}\n\n/**\n * Collects errors from failed steps.\n */\nfunction collectErrors(steps: readonly SetupStep[]): string[] {\n return steps.filter((s) => s.status === 'failed').map((s) => s.message ?? `${s.name} failed`);\n}\n\n/** Result context for building final result. */\ninterface SetupResultContext {\n startTime: number;\n steps: SetupStep[];\n warnings: string[];\n mcpResult: McpConfigResult | undefined;\n snippet: string | undefined;\n hookResult: HookConfigResult | undefined;\n hookSnippet: string | undefined;\n rulesPath: string | undefined;\n dataDirResult?: DataDirInitResult;\n}\n\n/** Checks if a config result represents a new (non-existing) success. */\nfunction isNewSuccess(result: McpConfigResult | HookConfigResult | undefined): boolean {\n return result?.success === true && !result.alreadyConfigured;\n}\n\n/** Builds the final setup result from context. */\nfunction buildSetupResult(ctx: SetupResultContext): SetupResult {\n const errors = collectErrors(ctx.steps);\n return {\n success: errors.length === 0,\n steps: ctx.steps,\n warnings: ctx.warnings,\n errors,\n durationMs: getTimeProvider().now() - ctx.startTime,\n ...(isNewSuccess(ctx.mcpResult) && { mcpConfigured: true }),\n ...(ctx.snippet !== undefined && { mcpSnippet: ctx.snippet }),\n ...(isNewSuccess(ctx.hookResult) && { hooksConfigured: true }),\n ...(ctx.hookSnippet !== undefined && { hookSnippet: ctx.hookSnippet }),\n ...(ctx.rulesPath !== undefined && { rulesPath: ctx.rulesPath }),\n ...(ctx.dataDirResult !== undefined && {\n dataDirPath: ctx.dataDirResult.rootPath,\n dataDirsCreated: ctx.dataDirResult.created.length,\n }),\n };\n}\n\n// ============================================================================\n// Main Command\n// ============================================================================\n\n/**\n * Runs the setup command.\n */\nexport function runSetup(options: Partial<SetupOptions> = {}): SetupResult {\n const startTime = getTimeProvider().now();\n const parsedOptions = SetupOptionsSchema.parse(options);\n const projectRoot = process.cwd();\n\n const warnings: string[] = [];\n\n // Step 1: Environment Detection\n const { env, step: detectionStep } = runDetectionStep(projectRoot);\n addClaudeCliWarnings(warnings, env.claudeCli.installed);\n\n // Step 2: Prerequisite Validation\n const { step: prereqStep, warnings: prereqWarnings } = runPrerequisiteStep();\n warnings.push(...prereqWarnings);\n\n // Step 3: MCP Configuration\n const { step: mcpStep, snippet, mcpResult } = runMcpConfigStep(env, parsedOptions);\n\n // Step 4: Rules File\n const { step: rulesStep, rulesPath } = runRulesStep(env, parsedOptions);\n\n // Step 5: Hooks Configuration (Issue #416)\n const { step: hooksStep, hookSnippet, hookResult } = runHooksStep(env, parsedOptions);\n\n // Step 6: Data Directory Initialization (#1249)\n const { step: dataDirStep, result: dataDirResult } = runDataDirStep(parsedOptions);\n\n // Step 7: OpenCode MCP Configuration (#1253)\n const openCodeStep = runOpenCodeStep(parsedOptions);\n\n // Step 8: Gemini MCP Configuration (#1259)\n const geminiStep = runGeminiStep(parsedOptions);\n\n // Step 9: Codex MCP Configuration (#1263)\n const codexStep = runCodexStep(parsedOptions);\n\n const configStep = runConfigStep(projectRoot, parsedOptions); // Step 10\n const steps = [\n detectionStep,\n prereqStep,\n mcpStep,\n rulesStep,\n hooksStep,\n dataDirStep,\n openCodeStep,\n geminiStep,\n codexStep,\n configStep,\n ];\n steps.push(runValidationStep(steps)); // Step 11: Validation (#1271)\n\n return buildSetupResult({\n startTime,\n steps,\n warnings,\n mcpResult,\n snippet,\n hookResult,\n hookSnippet,\n rulesPath,\n dataDirResult,\n });\n}\n\n/** Prints optional detail sections (MCP, hooks, rules, data dir). */\nfunction printDetailSections(result: SetupResult): void {\n if (result.mcpSnippet !== undefined || result.mcpConfigured === true) {\n const mcpResult: McpConfigResult =\n result.mcpConfigured === true\n ? {\n success: true,\n alreadyConfigured: false,\n message: 'Added nexus-agents MCP server to Claude Code',\n }\n : { success: false, alreadyConfigured: false, message: 'Manual configuration required' };\n printMcpResult(mcpResult, result.mcpSnippet);\n }\n if (result.hookSnippet !== undefined || result.hooksConfigured === true) {\n const hookResult: HookConfigResult =\n result.hooksConfigured === true\n ? {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents hooks in Claude Code settings',\n }\n : { success: false, alreadyConfigured: false, message: 'Manual configuration required' };\n printHooksResult(hookResult, result.hookSnippet);\n }\n if (result.rulesPath !== undefined) printRulesFile(result.rulesPath);\n if (result.dataDirPath !== undefined) printDataDirSection(result);\n printPermissionsSuggestion();\n}\n\n/** Prints the Claude Code permissions suggestion (#1945). */\nfunction printPermissionsSuggestion(): void {\n const snippet = generatePermissionsSnippet('all');\n const banner = buildPermissionsBanner(snippet);\n writeLine(banner);\n}\n\n/** Prints the data directory section. */\nfunction printDataDirSection(result: SetupResult): void {\n writeLine(formatHeader('Data Directory'));\n writeLine('─'.repeat(40));\n const count = result.dataDirsCreated ?? 0;\n const msg =\n count > 0\n ? `Created ${String(count)} directories under ${result.dataDirPath ?? ''}`\n : `All directories already exist at ${result.dataDirPath ?? ''}`;\n writeLine(msg);\n writeEmptyLine();\n}\n\n/**\n * Prints the setup result.\n */\nexport function printSetupResult(result: SetupResult, verbose: boolean): void {\n writeEmptyLine();\n writeLine(formatHeader(`Nexus Agents Setup v${VERSION}`));\n writeLine('═'.repeat(40));\n writeEmptyLine();\n\n printSteps(result.steps, verbose);\n printDetailSections(result);\n\n if (result.warnings.length > 0) printWarnings(result.warnings);\n if (result.errors.length > 0) printErrors(result.errors);\n printNextSteps(result.mcpConfigured === true, result.mcpSnippet !== undefined);\n printSummary(result.success);\n}\n\n/**\n * Prints the post-setup \"Getting Started\" banner (#2138).\n *\n * Three numbered steps tailored to what setup actually configured. If Claude\n * Code's MCP wiring succeeded we point step 2 at the integrated harness\n * (`/mcp` in Claude); otherwise we suggest the standalone `orchestrate`\n * command. Always shown after a successful setup — printing 3 lines is not\n * worth gating on first-run detection.\n *\n * @param mcpConfigured - True when an MCP harness (Claude/etc.) was wired up.\n */\nfunction printGettingStartedBanner(mcpConfigured: boolean): void {\n writeEmptyLine();\n writeLine(formatHeader('Getting started'));\n writeLine('─'.repeat(40));\n\n writeLine(' 1. nexus-agents hello — guided tour (no API keys needed)');\n if (mcpConfigured) {\n writeLine(' 2. Use through Claude Code — type /mcp in Claude to list tools');\n } else {\n writeLine(' 2. nexus-agents orchestrate \"...\" — run your first task');\n }\n writeLine(' 3. nexus-agents workflow list — explore built-in workflows');\n\n writeEmptyLine();\n writeLine(` ${colors.dim}Docs: https://github.com/williamzujkowski/nexus-agents${colors.reset}`);\n writeLine(` ${colors.dim}Harness wiring: docs/guides/HARNESS_COMPATIBILITY.md${colors.reset}`);\n}\n\n/**\n * Runs the post-setup health gate (#2137).\n *\n * After setup writes its files, this runs the verify checks and prints a\n * structured health summary inline. Returns `true` when no `severity: 'hard'`\n * checks failed — warnings still pass the gate.\n *\n * In `--dry-run` mode, the gate is skipped entirely (the user is previewing,\n * not actually installing).\n */\nasync function runPostSetupHealthGate(dryRun: boolean): Promise<boolean> {\n if (dryRun) return true;\n\n const result = await runVerify();\n const passed = result.checks.filter((c) => c.passed).length;\n const total = result.checks.length;\n\n writeEmptyLine();\n writeLine(formatHeader(`Health check (${String(passed)}/${String(total)} passed)`));\n writeLine('─'.repeat(40));\n\n for (const check of result.checks) {\n let symbol: string;\n if (check.passed) {\n symbol = `${colors.green}${symbols.check}${colors.reset}`;\n } else if (check.severity === 'warn') {\n symbol = `${colors.yellow}${symbols.warn}${colors.reset}`;\n } else {\n symbol = `${colors.red}${symbols.cross}${colors.reset}`;\n }\n writeLine(` ${symbol} ${check.name}: ${check.message}`);\n if (!check.passed && check.fix !== undefined) {\n writeLine(` ${colors.dim}→ Fix: ${check.fix}${colors.reset}`);\n }\n }\n\n writeEmptyLine();\n if (!result.noHardFailures) {\n writeLine(\n `${colors.red}${colors.bold}Action required: fix the blocking issues above before using nexus-agents.${colors.reset}`\n );\n } else if (!result.allPassed) {\n const warnCount = result.checks.filter((c) => !c.passed).length;\n writeLine(\n `${colors.yellow}${colors.bold}Setup complete with ${String(warnCount)} warning(s) — nexus-agents will run but some features are degraded.${colors.reset}`\n );\n } else {\n writeLine(\n `${colors.green}${colors.bold}All health checks passed. nexus-agents is ready.${colors.reset}`\n );\n }\n\n return result.noHardFailures;\n}\n\n/**\n * Setup command entry point (synchronous, non-interactive).\n *\n * @returns Exit code (0 = success, 1 = failure)\n */\nexport function setupCommand(options: Partial<SetupOptions> = {}): number {\n const parsedOptions = SetupOptionsSchema.parse(options);\n\n // Check for non-interactive mode in CI\n if (!isInteractive() && !parsedOptions.nonInteractive) {\n writeLine('Non-interactive environment detected.');\n writeLine('Run with --non-interactive or set CI=true.');\n return 1;\n }\n\n const result = runSetup(options);\n printSetupResult(result, parsedOptions.verbose);\n\n return result.success ? 0 : 1;\n}\n\n/** Extended options including interactive flag. */\nexport interface SetupCommandOptions extends Partial<SetupOptions> {\n interactive?: boolean;\n}\n\n/**\n * Setup command entry point with interactive wizard support.\n * (Source: Issue #425 - Interactive setup wizard)\n *\n * Also runs the post-setup health gate (#2137): after the configuration\n * steps complete, calls into `runVerify()` to surface install-time issues\n * that are easy to miss but break things at runtime (better-sqlite3 native\n * build, data dir writability, missing API keys). Health-gate warnings do\n * NOT fail setup — only `severity: 'hard'` failures do.\n *\n * @returns Exit code (0 = setup + no hard health failures, 1 = either failed)\n */\n/**\n * Runs the interactive wizard branch and returns its exit code.\n * Extracted from `setupCommandAsync` to keep cyclomatic complexity ≤10.\n */\nasync function runInteractiveSetup(options: SetupCommandOptions): Promise<number> {\n const wizardOptions = await runWizard();\n if (wizardOptions === undefined) return 1; // User cancelled.\n\n const mergedOptions = { ...options, ...wizardOptions };\n delete mergedOptions.interactive;\n\n const result = runSetup(mergedOptions);\n printSetupResult(result, mergedOptions.verbose ?? false);\n const healthOk = await runPostSetupHealthGate(mergedOptions.dryRun ?? false);\n if (result.success && !(mergedOptions.dryRun ?? false)) {\n printGettingStartedBanner(result.mcpConfigured === true);\n }\n return result.success && healthOk ? 0 : 1;\n}\n\nexport async function setupCommandAsync(options: SetupCommandOptions = {}): Promise<number> {\n if (options.interactive === true) {\n return runInteractiveSetup(options);\n }\n\n // Sync setup, then run the health gate, then print the getting-started banner.\n const setupResult = runSetupAndPrint(options);\n const healthOk = await runPostSetupHealthGate(options.dryRun ?? false);\n if (setupResult.exitCode === 0 && !(options.dryRun ?? false)) {\n printGettingStartedBanner(setupResult.mcpConfigured);\n }\n // Hard health failures override a successful setup; warnings don't.\n return setupResult.exitCode !== 0 || !healthOk ? 1 : 0;\n}\n\n/**\n * Runs setupCommand and captures both the exit code and the\n * `mcpConfigured` signal we need for the banner. Wraps the existing\n * synchronous path without changing its signature.\n */\nfunction runSetupAndPrint(options: SetupCommandOptions): {\n exitCode: number;\n mcpConfigured: boolean;\n} {\n const parsedOptions = SetupOptionsSchema.parse(options);\n if (!isInteractive() && !parsedOptions.nonInteractive) {\n writeLine('Non-interactive environment detected.');\n writeLine('Run with --non-interactive or set CI=true.');\n return { exitCode: 1, mcpConfigured: false };\n }\n const result = runSetup(options);\n printSetupResult(result, parsedOptions.verbose);\n return { exitCode: result.success ? 0 : 1, mcpConfigured: result.mcpConfigured === true };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { generateMcpSnippet, generateRulesContent, detectEnvironment };\nexport { runWizard } from './setup-wizard.js';\nexport type { SetupOptions, SetupResult };\n// SetupCommandOptions is already exported via interface definition above\nexport type { WizardAnswers, UsageMode } from './setup-wizard.js';\n","/**\n * nexus-agents setup command types\n *\n * Type definitions for the user onboarding automation system.\n *\n * @module cli/setup-types\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { z } from 'zod';\nimport type { CommandResult } from '../core/index.js';\n\n/**\n * Setup command options schema.\n */\nexport const SetupOptionsSchema = z.object({\n /** Skip interactive prompts */\n nonInteractive: z.boolean().default(false),\n /** Overwrite existing configurations */\n force: z.boolean().default(false),\n /** Skip MCP configuration */\n skipMcp: z.boolean().default(false),\n /** Skip CLAUDE.md/rules generation */\n skipRules: z.boolean().default(false),\n /** Skip hooks configuration (Issue #416) */\n skipHooks: z.boolean().default(false),\n /** Skip config file generation (#1252) */\n skipConfig: z.boolean().default(false),\n /** Skip OpenCode MCP configuration (#1253) */\n skipOpencode: z.boolean().default(false),\n /** Skip Gemini CLI MCP configuration (#1259) */\n skipGemini: z.boolean().default(false),\n /** Skip Codex CLI MCP configuration (#1263) */\n skipCodex: z.boolean().default(false),\n /** Show what would be done without making changes */\n dryRun: z.boolean().default(false),\n /** Show detailed output */\n verbose: z.boolean().default(false),\n /** Target scope for MCP config */\n scope: z.enum(['user', 'project']).default('user'),\n});\n\nexport type SetupOptions = z.infer<typeof SetupOptionsSchema>;\n\n/**\n * Claude CLI detection result.\n */\nexport interface ClaudeCliInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n readonly configPath: string;\n readonly mcpJsonPath: string;\n}\n\n/**\n * Existing MCP configuration info.\n */\nexport interface McpConfigInfo {\n readonly exists: boolean;\n readonly path: string;\n readonly hasNexusAgents: boolean;\n readonly servers: readonly string[];\n}\n\n/**\n * MCP server configuration entry.\n */\nexport interface McpServerEntry {\n readonly command: string;\n readonly args?: readonly string[];\n readonly env?: Record<string, string>;\n}\n\n/**\n * MCP JSON configuration format.\n */\nexport interface McpJsonConfig {\n readonly mcpServers?: Record<string, McpServerEntry>;\n}\n\n/**\n * Project type detection.\n */\nexport type ProjectType =\n | 'typescript'\n | 'javascript'\n | 'python'\n | 'rust'\n | 'go'\n | 'java'\n | 'unknown';\n\n/**\n * Project information.\n */\nexport interface ProjectInfo {\n readonly root: string;\n readonly hasPackageJson: boolean;\n readonly hasClaudeMd: boolean;\n readonly hasClaudeRules: boolean;\n readonly hasNexusConfig: boolean;\n readonly projectType: ProjectType;\n readonly packageName?: string;\n}\n\n/**\n * Complete environment information.\n */\nexport interface EnvironmentInfo {\n readonly platform: NodeJS.Platform;\n readonly homeDir: string;\n readonly claudeCli: ClaudeCliInfo;\n readonly existingMcpConfig: McpConfigInfo | undefined;\n readonly projectInfo: ProjectInfo;\n}\n\n/**\n * Setup step status.\n */\nexport interface SetupStep {\n readonly name: string;\n readonly status: 'pending' | 'success' | 'skipped' | 'failed' | 'warning';\n readonly message?: string;\n readonly durationMs?: number;\n}\n\n/**\n * Setup result summary.\n * Extends CommandResult base pattern (Issue #584).\n */\nexport interface SetupResult extends CommandResult {\n /** Setup steps executed */\n readonly steps: readonly SetupStep[];\n /** MCP configuration was successful via Claude CLI */\n readonly mcpConfigured?: boolean;\n /** Fallback MCP snippet for manual configuration */\n readonly mcpSnippet?: string;\n /** Hooks configuration was successful via Claude CLI (Issue #416) */\n readonly hooksConfigured?: boolean;\n /** Fallback hook snippet for manual configuration */\n readonly hookSnippet?: string;\n readonly rulesPath?: string;\n /** Data directory path if initialized (#1249) */\n readonly dataDirPath?: string;\n /** Number of data directories created (#1249) */\n readonly dataDirsCreated?: number;\n readonly warnings: readonly string[];\n readonly errors: readonly string[];\n readonly durationMs: number;\n}\n\n/**\n * Backup information for rollback.\n */\nexport interface BackupInfo {\n readonly type: 'file';\n readonly originalPath: string;\n readonly backupPath: string;\n readonly content: string;\n}\n\n/**\n * Rollback item types.\n */\nexport type RollbackItem =\n | { type: 'file-backup'; backup: BackupInfo }\n | { type: 'file-created'; path: string }\n | { type: 'file-modified'; backup: BackupInfo };\n","/**\n * nexus-agents setup environment detection\n *\n * Environment detection helpers for Claude CLI and project setup.\n *\n * @module cli/setup-environment\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, basename } from 'node:path';\nimport { CLI_SUBPROCESS_TIMEOUTS } from '../config/timeouts.js';\nimport type {\n ClaudeCliInfo,\n McpConfigInfo,\n ProjectInfo,\n ProjectType,\n EnvironmentInfo,\n} from './setup-types.js';\n\n/**\n * Parses Claude CLI version from output.\n */\nfunction parseClaudeVersion(output: string): string | undefined {\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match?.[1];\n}\n\n/**\n * Detects if Claude CLI is installed and available.\n * Uses a 3-second timeout to avoid hanging in slow environments.\n */\nexport function detectClaudeCli(): ClaudeCliInfo {\n const configPath = join(homedir(), '.claude');\n const mcpJsonPath = join(homedir(), '.claude.json');\n\n try {\n const result = execSync('claude --version', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: CLI_SUBPROCESS_TIMEOUTS.envSetupMs,\n });\n const version = parseClaudeVersion(result);\n\n return {\n installed: true,\n version,\n configPath,\n mcpJsonPath,\n };\n } catch {\n return {\n installed: false,\n version: undefined,\n configPath,\n mcpJsonPath,\n };\n }\n}\n\n/** Extracts MCP servers from direct mcpServers key (project-scoped .mcp.json). */\nfunction extractDirectServers(config: Record<string, unknown>): string[] | undefined {\n const mcpServers = config['mcpServers'] as Record<string, unknown> | undefined;\n if (mcpServers === undefined) return undefined;\n return Object.keys(mcpServers);\n}\n\n/** Extracts MCP servers from projects key (~/.claude.json format). */\nfunction extractProjectServers(config: Record<string, unknown>): string[] | undefined {\n const projects = config['projects'] as Record<string, Record<string, unknown>> | undefined;\n if (projects === undefined) return undefined;\n const allServers = new Set<string>();\n for (const proj of Object.values(projects)) {\n const mcpServers = proj['mcpServers'] as Record<string, unknown> | undefined;\n if (mcpServers !== undefined) Object.keys(mcpServers).forEach((n) => allServers.add(n));\n }\n return [...allServers];\n}\n\n/** Builds McpConfigInfo from a server list. */\nfunction buildMcpInfo(path: string, servers: string[]): McpConfigInfo {\n return { exists: true, path, hasNexusAgents: servers.includes('nexus-agents'), servers };\n}\n\n/**\n * Detects existing MCP configuration.\n *\n * Handles two formats:\n * - `.mcp.json` (project-scoped): `{ mcpServers: { ... } }`\n * - `~/.claude.json` (user-scoped): `{ projects: { [path]: { mcpServers: { ... } } } }`\n */\nexport function detectMcpConfig(mcpJsonPath: string): McpConfigInfo | undefined {\n if (!existsSync(mcpJsonPath)) return undefined;\n try {\n const config = JSON.parse(readFileSync(mcpJsonPath, 'utf-8')) as Record<string, unknown>;\n const direct = extractDirectServers(config);\n if (direct !== undefined) return buildMcpInfo(mcpJsonPath, direct);\n const projected = extractProjectServers(config);\n if (projected !== undefined) return buildMcpInfo(mcpJsonPath, projected);\n return buildMcpInfo(mcpJsonPath, []);\n } catch {\n return buildMcpInfo(mcpJsonPath, []);\n }\n}\n\n/** Checks for TypeScript in package.json devDependencies. */\nfunction hasTypeScriptInPackageJson(root: string): boolean {\n try {\n const content = readFileSync(join(root, 'package.json'), 'utf-8');\n const parsed: unknown = JSON.parse(content);\n const pkg = parsed as Record<string, unknown>;\n const devDeps = pkg['devDependencies'] as Record<string, string> | undefined;\n return devDeps?.['typescript'] !== undefined;\n } catch {\n return false;\n }\n}\n\n/** Mapping of config files to project types. */\nconst CONFIG_FILE_TYPES: readonly [string, ProjectType][] = [\n ['tsconfig.json', 'typescript'],\n ['Cargo.toml', 'rust'],\n ['go.mod', 'go'],\n ['pyproject.toml', 'python'],\n ['setup.py', 'python'],\n ['pom.xml', 'java'],\n ['build.gradle', 'java'],\n];\n\n/**\n * Detects project type based on configuration files.\n */\nexport function detectProjectType(root: string): ProjectType {\n // Check config files\n for (const [file, type] of CONFIG_FILE_TYPES) {\n if (existsSync(join(root, file))) return type;\n }\n\n // Check package.json\n if (existsSync(join(root, 'package.json'))) {\n return hasTypeScriptInPackageJson(root) ? 'typescript' : 'javascript';\n }\n\n return 'unknown';\n}\n\n/**\n * Detects project information.\n */\nexport function detectProjectInfo(root: string): ProjectInfo {\n let packageName: string | undefined;\n\n if (existsSync(join(root, 'package.json'))) {\n try {\n const content = readFileSync(join(root, 'package.json'), 'utf-8');\n const pkg = JSON.parse(content) as Record<string, unknown>;\n const nameValue = pkg['name'];\n packageName = typeof nameValue === 'string' ? nameValue : undefined;\n } catch (parseErr: unknown) {\n // Non-critical: package.json parse failure, fall through to basename\n void parseErr;\n }\n }\n\n return {\n root,\n hasPackageJson: existsSync(join(root, 'package.json')),\n hasClaudeMd: existsSync(join(root, 'CLAUDE.md')),\n // Rules relocated in #2121: canonical is `.rules/`. Still accept the\n // legacy `.claude/rules/` path so detection doesn't break on repos that\n // haven't migrated yet.\n hasClaudeRules: existsSync(join(root, '.rules')) || existsSync(join(root, '.claude', 'rules')),\n hasNexusConfig: existsSync(join(root, 'nexus-agents.yaml')),\n projectType: detectProjectType(root),\n packageName: packageName ?? basename(root),\n };\n}\n\n/**\n * Detects complete environment information.\n */\nexport function detectEnvironment(projectRoot: string): EnvironmentInfo {\n const claudeCli = detectClaudeCli();\n const existingMcpConfig = detectMcpConfig(claudeCli.mcpJsonPath);\n const projectInfo = detectProjectInfo(projectRoot);\n\n return {\n platform: process.platform,\n homeDir: homedir(),\n claudeCli,\n existingMcpConfig,\n projectInfo,\n };\n}\n","/**\n * nexus-agents setup MCP configuration\n *\n * MCP configuration helpers using Claude CLI's `claude mcp` commands.\n *\n * @module cli/setup-mcp\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { execSync, execFileSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { McpJsonConfig, McpServerEntry } from './setup-types.js';\nimport { getErrorMessage } from '../core/index.js';\n\n/** MCP entry for nexus-agents */\nexport const NEXUS_AGENTS_MCP_ENTRY: McpServerEntry = {\n command: 'nexus-agents',\n args: ['--mode=server'],\n};\n\n/** MCP entry with npx for users who install globally */\nexport const NEXUS_AGENTS_MCP_NPX_ENTRY: McpServerEntry = {\n command: 'npx',\n args: ['-y', 'nexus-agents@latest', '--mode=server'],\n};\n\n/**\n * Result of MCP configuration attempt.\n */\nexport interface McpConfigResult {\n success: boolean;\n alreadyConfigured: boolean;\n message: string;\n}\n\n/**\n * Checks if nexus-agents MCP server is already configured in Claude CLI.\n */\nexport function isMcpServerConfigured(): boolean {\n try {\n const result = execSync('claude mcp get nexus-agents', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return result.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Maps scope option to Claude CLI `-s` flag value.\n */\nfunction scopeToFlag(scope: 'user' | 'project'): string {\n return scope === 'project' ? 'local' : 'user';\n}\n\n/**\n * Removes existing MCP server configuration if present.\n */\nfunction removeExistingMcpServer(scope: 'user' | 'project' = 'user'): void {\n try {\n execSync(`claude mcp remove nexus-agents -s ${scopeToFlag(scope)}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n } catch {\n // Ignore removal errors\n }\n}\n\n/**\n * Adds MCP server to Claude CLI.\n */\nfunction addMcpServer(useNpx: boolean, scope: 'user' | 'project' = 'user'): McpConfigResult {\n const entry = useNpx ? NEXUS_AGENTS_MCP_NPX_ENTRY : NEXUS_AGENTS_MCP_ENTRY;\n const jsonConfig = JSON.stringify(entry);\n const scopeLabel = scope === 'project' ? 'project' : 'global';\n\n try {\n execFileSync(\n 'claude',\n ['mcp', 'add-json', 'nexus-agents', jsonConfig, '-s', scopeToFlag(scope)],\n {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }\n );\n return {\n success: true,\n alreadyConfigured: false,\n message: `Added nexus-agents MCP server to Claude Code (${scopeLabel})`,\n };\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to add MCP server: ${errorMsg}`,\n };\n }\n}\n\n/**\n * Configures nexus-agents MCP server using Claude CLI.\n *\n * Uses `claude mcp add-json` to register the server.\n * @param scope - 'user' for global (~/.claude/mcp.json), 'project' for local (.mcp.json)\n */\nexport function configureMcpServer(\n useNpx: boolean = false,\n force: boolean = false,\n scope: 'user' | 'project' = 'user'\n): McpConfigResult {\n const isConfigured = isMcpServerConfigured();\n\n // Check if already configured\n if (!force && isConfigured) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents MCP server already configured (use --force to reconfigure)',\n };\n }\n\n // Remove existing if forcing\n if (force && isConfigured) {\n removeExistingMcpServer(scope);\n }\n\n return addMcpServer(useNpx, scope);\n}\n\n/**\n * Generates MCP configuration snippet for manual setup (fallback).\n */\nexport function generateMcpSnippet(useNpx: boolean = false): string {\n const entry = useNpx ? NEXUS_AGENTS_MCP_NPX_ENTRY : NEXUS_AGENTS_MCP_ENTRY;\n const config: McpJsonConfig = {\n mcpServers: {\n 'nexus-agents': entry,\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generates the full MCP config path based on scope.\n *\n * Claude Code uses:\n * - Project scope: `.mcp.json` in project root\n * - User scope: `~/.claude.json` (stores MCP config under `projects` key)\n */\nexport function getMcpJsonPath(scope: 'user' | 'project', projectRoot: string): string {\n if (scope === 'project') {\n return join(projectRoot, '.mcp.json');\n }\n return join(homedir(), '.claude.json');\n}\n\n// ============================================================================\n// Hook Configuration (Issue #411, #416)\n// ============================================================================\n\n/**\n * Generates hook configuration for Claude CLI settings.json.\n * (Source: Issue #411 - Claude CLI Hook Integration)\n */\nexport function generateHookConfig(): HookSettingsConfig {\n return {\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks session-start',\n },\n ],\n },\n ],\n PreToolUse: [\n {\n matcher: 'Bash',\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks pre-tool --tool Bash --validate',\n },\n ],\n },\n ],\n PostToolUse: [\n {\n matcher: '*',\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks post-tool --track-metrics',\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: 'nexus-agents hooks stop --check-tasks',\n },\n ],\n },\n ],\n },\n };\n}\n\n/**\n * Hook command entry structure.\n */\ninterface HookCommandEntry {\n type: 'command';\n command: string;\n}\n\n/**\n * Hook matcher entry structure.\n */\ninterface HookMatcherEntry {\n matcher?: string;\n hooks: HookCommandEntry[];\n}\n\n/**\n * Hook settings configuration structure.\n */\nexport interface HookSettingsConfig {\n hooks: {\n SessionStart?: HookMatcherEntry[];\n SessionEnd?: HookMatcherEntry[];\n PreToolUse?: HookMatcherEntry[];\n PostToolUse?: HookMatcherEntry[];\n Stop?: HookMatcherEntry[];\n };\n}\n\n/**\n * Result of hook configuration attempt.\n */\nexport interface HookConfigResult {\n success: boolean;\n alreadyConfigured: boolean;\n message: string;\n}\n\n/**\n * Checks if hooks are already configured in Claude CLI settings.\n */\nexport function areHooksConfigured(): boolean {\n try {\n const result = execSync('claude config get hooks', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n // If we get output that includes nexus-agents, hooks are configured\n return result.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Reads existing hooks from Claude CLI settings.\n * Returns parsed hooks object or undefined if no hooks exist or parse fails.\n */\nexport function getExistingHooks(): HookSettingsConfig['hooks'] | undefined {\n try {\n const result = execSync('claude config get hooks', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const trimmed = result.trim();\n if (!trimmed || trimmed === 'null' || trimmed === 'undefined') {\n return undefined;\n }\n return JSON.parse(trimmed) as HookSettingsConfig['hooks'];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Merges two hook arrays, combining entries without duplicating nexus-agents hooks.\n */\nfunction mergeHookArrays(\n existing: HookMatcherEntry[] | undefined,\n newHooks: HookMatcherEntry[]\n): HookMatcherEntry[] {\n if (!existing || existing.length === 0) {\n return newHooks;\n }\n\n // Filter out any existing nexus-agents hooks to avoid duplicates\n const filteredExisting = existing.filter((entry) => {\n return !entry.hooks.some((h) => h.command.startsWith('nexus-agents'));\n });\n\n // Combine existing (non-nexus) hooks with new nexus-agents hooks\n return [...filteredExisting, ...newHooks];\n}\n\n/**\n * Merges nexus-agents hooks with existing hooks configuration.\n * Preserves existing user hooks while adding/updating nexus-agents hooks.\n */\nexport function mergeHookConfigs(\n existing: HookSettingsConfig['hooks'] | undefined,\n newConfig: HookSettingsConfig['hooks']\n): HookSettingsConfig['hooks'] {\n if (!existing) {\n return newConfig;\n }\n\n const hookTypes = ['SessionStart', 'SessionEnd', 'PreToolUse', 'PostToolUse', 'Stop'] as const;\n\n const merged: HookSettingsConfig['hooks'] = {};\n\n for (const hookType of hookTypes) {\n const existingHooks = existing[hookType];\n const newHooks = newConfig[hookType];\n\n if (newHooks) {\n merged[hookType] = mergeHookArrays(existingHooks, newHooks);\n } else if (existingHooks) {\n merged[hookType] = existingHooks;\n }\n }\n\n return merged;\n}\n\n/**\n * Configures hooks in Claude CLI settings.\n * Uses `claude config set hooks` to register hook commands.\n * Merges with existing hooks instead of overwriting them (Issue #420).\n */\nexport function configureHooks(force: boolean = false): HookConfigResult {\n const isConfigured = areHooksConfigured();\n\n if (!force && isConfigured) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'Hooks already configured (use --force to reconfigure)',\n };\n }\n\n const nexusHookConfig = generateHookConfig();\n\n try {\n // Read existing hooks first to merge (Issue #420)\n const existingHooks = getExistingHooks();\n const mergedHooks = mergeHookConfigs(existingHooks, nexusHookConfig.hooks);\n\n // Use claude config set with merged hooks\n const configJson = JSON.stringify(mergedHooks);\n execFileSync('claude', ['config', 'set', 'hooks', configJson], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return {\n success: true,\n alreadyConfigured: false,\n message: existingHooks\n ? 'Merged nexus-agents hooks with existing hooks in Claude Code settings'\n : 'Configured nexus-agents hooks in Claude Code settings',\n };\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure hooks: ${errorMsg}`,\n };\n }\n}\n\n/**\n * Generates hook configuration snippet for manual setup.\n */\nexport function generateHookSnippet(): string {\n const config = generateHookConfig();\n return JSON.stringify(config, null, 2);\n}\n","/**\n * nexus-agents setup rules generation\n *\n * Rules file and backup management helpers.\n *\n * @module cli/setup-rules\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { VERSION } from '../version.js';\nimport { getTimeProvider } from '../core/index.js';\nimport type { BackupInfo } from './setup-types.js';\n\n/**\n * Generates the nexus-agents rules file content.\n */\nexport function generateRulesContent(): string {\n return `# Nexus-Agents Integration\n\nThis project uses [nexus-agents](https://github.com/williamzujkowski/nexus-agents) v${VERSION} for multi-agent orchestration.\n\n## MCP Tools Available\n\nWhen running with MCP server mode, these tools are available:\n\n| Tool | Description |\n| ---- | ----------- |\n| \\`orchestrate\\` | Task orchestration with Orchestrator coordination |\n| \\`create_expert\\` | Dynamic expert agent creation |\n| \\`run_workflow\\` | Execute workflow templates |\n| \\`delegate_to_model\\` | Route task to optimal model |\n| \\`list_experts\\` | List available expert types (discoverability) |\n| \\`list_workflows\\` | List available workflow templates |\n\n## Quick Commands\n\n\\`\\`\\`bash\n# Orchestrate a task with specialized experts\nnexus-agents orchestrate \"Implement feature X with tests\"\n\n# List available experts\nnexus-agents expert list\n\n# Run a workflow\nnexus-agents workflow list\nnexus-agents workflow run code-review --input='{\"url\": \"...\"}'\n\n# Check system health\nnexus-agents doctor\n\n# Generate config\nnexus-agents config init\n\\`\\`\\`\n\n## Usage Examples\n\n**Orchestrate a code review:**\n\\`\\`\\`\nUse nexus-agents to review this PR: https://github.com/owner/repo/pull/123\n\\`\\`\\`\n\n**Create a specialized expert:**\n\\`\\`\\`\nCreate a security expert to audit this codebase for vulnerabilities\n\\`\\`\\`\n\n**Run a workflow:**\n\\`\\`\\`\nRun the code-review workflow with the current changes\n\\`\\`\\`\n\n## Configuration\n\n- Config file: \\`./nexus-agents.yaml\\`\n- Generate config: \\`nexus-agents config init\\`\n- Check health: \\`nexus-agents doctor\\`\n\n---\n*Generated by nexus-agents setup v${VERSION}*\n`;\n}\n\n/**\n * Gets the rules file path.\n *\n * As of #2121 rules live at `<root>/.rules/` (harness-neutral location,\n * was `.claude/rules/`). Claude Code finds them via CLAUDE.md references,\n * so the move doesn't break its auto-load. Non-Claude harnesses (OpenCode,\n * Codex, Cursor, etc.) can point at the same directory.\n */\nexport function getRulesFilePath(projectRoot: string): string {\n return join(projectRoot, '.rules', 'nexus-agents.md');\n}\n\n/**\n * Creates the rules file.\n */\nexport function createRulesFile(projectRoot: string, dryRun: boolean): string {\n const rulesPath = getRulesFilePath(projectRoot);\n const content = generateRulesContent();\n\n if (!dryRun) {\n const rulesDir = dirname(rulesPath);\n mkdirSync(rulesDir, { recursive: true });\n writeFileSync(rulesPath, content, 'utf-8');\n }\n\n return rulesPath;\n}\n\n/**\n * Creates a backup of a file.\n */\nexport function backupFile(filePath: string): BackupInfo {\n const content = readFileSync(filePath, 'utf-8');\n const backupPath = `${filePath}.backup.${String(getTimeProvider().now())}`;\n writeFileSync(backupPath, content, 'utf-8');\n\n return {\n type: 'file',\n originalPath: filePath,\n backupPath,\n content,\n };\n}\n\n/**\n * Restores a file from backup.\n */\nexport function restoreBackup(backup: BackupInfo): void {\n writeFileSync(backup.originalPath, backup.content, 'utf-8');\n}\n","/**\n * nexus-agents setup output formatting\n *\n * Output formatting helpers for setup command.\n * Re-exports from consolidated ansi-output.ts for backward compatibility.\n *\n * @module cli/setup-formatting\n * (Source: Issue #363 - Auto-configure Claude CLI integration)\n */\n\n// Re-export consolidated formatters from ansi-output.ts\nexport { formatStatus, formatHeader, formatCodeBlock, colors, symbols } from './ansi-output.js';\n\n/**\n * Checks if running in interactive mode.\n */\nexport function isInteractive(): boolean {\n if (!process.stdout.isTTY) return false;\n if (process.env['CI'] === 'true') return false;\n if (process.env['CONTINUOUS_INTEGRATION'] !== undefined) return false;\n return true;\n}\n","/**\n * OpenCode MCP auto-configuration for setup command.\n *\n * Detects OpenCode CLI and generates opencode.json/.jsonc with nexus-agents MCP server.\n * Supports JSONC (JSON with Comments) via `jsonc-parser` for comment-preserving writes.\n *\n * @module cli/setup-opencode\n * (Source: Issue #1253 - OpenCode MCP auto-configuration, #1255 - JSONC support)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as jsoncParse, modify, applyEdits } from 'jsonc-parser';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport { detectCliBinary, type CliDetectionInfo } from './setup-cli-detection.js';\n\nconst logger = createLogger({ component: 'setup-opencode' });\n\n/**\n * OpenCode detection result.\n *\n * Type alias of {@link CliDetectionInfo} — see #2155.\n */\nexport type OpenCodeCliInfo = CliDetectionInfo;\n\n/** OpenCode MCP configuration result. */\nexport interface OpenCodeConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n readonly configPath: string;\n}\n\n/** Resolved config file info. */\nexport interface ResolvedConfig {\n readonly path: string;\n readonly isJsonc: boolean;\n readonly exists: boolean;\n}\n\n/** Detects OpenCode CLI installation. Delegates to {@link detectCliBinary}. */\nexport function detectOpenCodeCli(): OpenCodeCliInfo {\n return detectCliBinary('opencode');\n}\n\n/**\n * Resolves the OpenCode config directory path.\n * OpenCode uses ~/.config/opencode/ on Linux/macOS.\n */\nfunction getOpenCodeConfigDir(): string {\n return join(homedir(), '.config', 'opencode');\n}\n\n/**\n * Resolves the path for nexus-agents CLI command.\n * Uses `npx nexus-agents` for portability.\n */\nfunction getNexusCommand(): readonly string[] {\n return ['npx', 'nexus-agents', '--mode=server'];\n}\n\nconst NEXUS_MCP_ENTRY = {\n type: 'local',\n command: getNexusCommand(),\n enabled: true,\n};\n\n/**\n * Resolves the OpenCode config file in a directory.\n * Prefers .jsonc over .json (matching OpenCode's own priority).\n */\nexport function resolveOpenCodeConfig(dir: string): ResolvedConfig {\n const jsoncPath = join(dir, 'opencode.jsonc');\n if (existsSync(jsoncPath)) {\n return { path: jsoncPath, isJsonc: true, exists: true };\n }\n const jsonPath = join(dir, 'opencode.json');\n if (existsSync(jsonPath)) {\n return { path: jsonPath, isJsonc: false, exists: true };\n }\n return { path: jsonPath, isJsonc: false, exists: false };\n}\n\n/** Checks if nexus-agents is already configured in an existing config. */\nfunction isAlreadyConfigured(resolved: ResolvedConfig): boolean {\n if (!resolved.exists) return false;\n try {\n const raw = readFileSync(resolved.path, 'utf-8');\n const config = jsoncParse(raw) as Record<string, unknown> | null;\n const mcp = config?.['mcp'] as Record<string, unknown> | undefined;\n return mcp?.['nexus-agents'] !== undefined;\n } catch {\n logger.debug('Failed to parse existing OpenCode config, will overwrite');\n return false;\n }\n}\n\n/** Writes nexus-agents MCP entry using comment-preserving edits for JSONC. */\nfunction writeJsoncConfig(configPath: string, raw: string): void {\n let result = raw;\n result = applyEdits(result, modify(result, ['mcp', 'nexus-agents'], NEXUS_MCP_ENTRY, {}));\n result = applyEdits(result, modify(result, ['$schema'], 'https://opencode.ai/config.json', {}));\n writeFileSync(configPath, result, 'utf-8');\n}\n\n/** Writes nexus-agents MCP entry as plain JSON for new configs. */\nfunction writeJsonConfig(configPath: string): void {\n const config = {\n $schema: 'https://opencode.ai/config.json',\n mcp: { 'nexus-agents': NEXUS_MCP_ENTRY },\n };\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/** Writes the merged config with nexus-agents MCP entry. */\nfunction writeOpenCodeConfig(configDir: string, resolved: ResolvedConfig): void {\n if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true });\n\n if (resolved.exists) {\n const raw = readFileSync(resolved.path, 'utf-8');\n writeJsoncConfig(resolved.path, raw);\n } else {\n writeJsonConfig(resolved.path);\n }\n}\n\n/** Options for configureOpenCode. */\nexport interface ConfigureOpenCodeOptions {\n readonly force: boolean;\n readonly dryRun: boolean;\n readonly projectRoot?: string;\n}\n\n/** Validates projectRoot to prevent path traversal (CWE-22). */\nfunction validateProjectRoot(projectRoot: string): string {\n const resolved = resolve(projectRoot);\n if (!existsSync(resolved)) {\n throw new Error(`Project root does not exist: ${resolved}`);\n }\n return resolved;\n}\n\n/**\n * Configures OpenCode with nexus-agents MCP server.\n * Supports both global (~/.config/opencode/) and project-local configs.\n */\nexport function configureOpenCode(\n force: boolean,\n dryRun: boolean,\n options?: ConfigureOpenCodeOptions\n): OpenCodeConfigResult {\n try {\n return configureOpenCodeInner(force, dryRun, options);\n } catch (error: unknown) {\n const fallbackPath = join(getOpenCodeConfigDir(), 'opencode.json');\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure OpenCode: ${getErrorMessage(error)}`,\n configPath: fallbackPath,\n };\n }\n}\n\nfunction configureOpenCodeInner(\n force: boolean,\n dryRun: boolean,\n options?: ConfigureOpenCodeOptions\n): OpenCodeConfigResult {\n const configDir =\n options?.projectRoot !== undefined\n ? validateProjectRoot(options.projectRoot)\n : getOpenCodeConfigDir();\n const resolved = resolveOpenCodeConfig(configDir);\n\n if (isAlreadyConfigured(resolved) && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in OpenCode',\n configPath: resolved.path,\n };\n }\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: `Would configure nexus-agents MCP in ${resolved.path}`,\n configPath: resolved.path,\n };\n }\n writeOpenCodeConfig(configDir, resolved);\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in OpenCode',\n configPath: resolved.path,\n };\n}\n","/**\n * Shared CLI binary detection helpers (#2155, child of #2151).\n *\n * Consolidates the near-identical detection logic that previously lived in\n * `setup-codex.ts`, `setup-gemini.ts`, and `setup-opencode.ts`. Each setup\n * file now delegates to `detectCliBinary(name)` instead of carrying its\n * own copy of the platform-aware locator + version-extraction logic.\n *\n * The per-CLI `ConfigResult` interfaces remain separate because they\n * legitimately differ (Codex writes via MCP, Gemini and OpenCode write to\n * config files with paths).\n *\n * @module cli/setup-cli-detection\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { platform } from 'node:os';\n\nimport { classifyExecError, type DetectionError } from './cli-detection-error.js';\n\n/** Generic CLI detection result. Consumed by every `setup-*.ts` detector. */\nexport interface CliDetectionInfo {\n readonly installed: boolean;\n readonly version: string | undefined;\n /**\n * Classification of why detection failed. Set when `installed` is `false`\n * OR when the binary was located but `--version` failed (#2152).\n */\n readonly detectionError?: DetectionError;\n}\n\n/** Returns the platform-appropriate command for locating an executable. */\nexport function getCliLocatorCommand(): 'where' | 'which' {\n return platform() === 'win32' ? 'where' : 'which';\n}\n\n/**\n * Extracts a semver triple (`X.Y.Z`) from CLI `--version` output.\n *\n * Pure helper — exported for direct unit testing. Returns the matched\n * version string or undefined when no semver-shaped substring is present.\n */\nexport function extractSemver(output: string): string | undefined {\n const match = /(\\d+\\.\\d+\\.\\d+)/.exec(output);\n return match?.[1];\n}\n\n/**\n * Detects whether a CLI binary is installed and reports its version.\n *\n * Two-phase detection:\n * 1. Locate via `which` / `where` — fast PATH check (3s timeout).\n * 2. If located, run `<name> --version` and extract semver (5s timeout).\n *\n * Both phases trap `execFileSync` exceptions and return a `CliDetectionInfo`\n * with a classified `detectionError`. Callers never see exceptions from\n * this function.\n */\nexport function detectCliBinary(name: string): CliDetectionInfo {\n try {\n execFileSync(getCliLocatorCommand(), [name], { timeout: 3000, stdio: 'pipe' });\n } catch (err: unknown) {\n return { installed: false, version: undefined, detectionError: classifyExecError(err) };\n }\n\n try {\n const output = execFileSync(name, ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return { installed: true, version: extractSemver(output) };\n } catch (err: unknown) {\n return { installed: true, version: undefined, detectionError: classifyExecError(err) };\n }\n}\n","/**\n * nexus-agents/cli - CLI detection error classification (#2152)\n *\n * Small helper shared by `setup-codex.ts`, `setup-gemini.ts`, `setup-opencode.ts`\n * (and later `setup-cli-detection.ts` once #2155 consolidates them) so that a\n * `which`/`where` or `<cli> --version` failure is classified instead of\n * silently collapsed into `installed: false`.\n *\n * Before this file, all three setup modules did `catch { return { installed: false } }`,\n * treating `ENOENT` (genuinely not installed), `ETIMEDOUT` (PATH lookup hung),\n * `EACCES` (binary present but not executable), and arbitrary other exec\n * failures identically. That made doctor/verify diagnostics unactionable.\n *\n * @module cli/cli-detection-error\n */\n\n/**\n * Stable classification of why a CLI-detection exec failed.\n *\n * - `not-found`: binary is not on PATH (`ENOENT`). User action: install the CLI.\n * - `timeout`: the exec hung past the configured timeout (`ETIMEDOUT`,\n * `exit code null with signal`). User action: investigate PATH for hung\n * filesystems (NFS mounts, dead autofs entries).\n * - `permission`: binary is present but the current user can't execute it\n * (`EACCES`, `EPERM`). User action: fix mode bits or ownership.\n * - `other`: any other exec failure. User action: re-run with verbose\n * logging or inspect stderr directly.\n */\nexport type DetectionError = 'not-found' | 'timeout' | 'permission' | 'other';\n\n/**\n * Human-readable explanation for each detection-error class. Intended for\n * `doctor`/`verify` output — short enough to fit on one line next to the CLI\n * name.\n */\nexport const DETECTION_ERROR_MESSAGES: Record<DetectionError, string> = {\n 'not-found': 'binary not on PATH',\n timeout: 'detection timed out (hung PATH?)',\n permission: 'binary present but not executable',\n other: 'detection failed — check verbose logs',\n};\n\n/**\n * Formats a user-facing \"not installed\" message that incorporates the\n * detection-error class. Called by setup runners to replace the flat\n * \"<cli> not installed\" message when the underlying cause is more specific.\n *\n * - `not-found` or undefined → \"<cli> not installed\"\n * - other classes → \"<cli> detection failed: <class-message>\"\n */\nexport function formatDetectionMessage(cliName: string, detectionError?: DetectionError): string {\n if (detectionError === undefined || detectionError === 'not-found') {\n return `${cliName} not installed`;\n }\n return `${cliName} detection failed: ${DETECTION_ERROR_MESSAGES[detectionError]}`;\n}\n\n/**\n * Classifies a thrown error from `execFileSync('which'|'where', ...)` or\n * `execFileSync(cli, ['--version'])`.\n *\n * Node's `execFileSync` throws with a `code` property on the error object\n * (string like `'ENOENT'`) for most OS-level failures. Timeouts additionally\n * set `signal: 'SIGTERM'` and may have `code: undefined`. We probe both.\n */\nexport function classifyExecError(err: unknown): DetectionError {\n if (typeof err !== 'object' || err === null) return 'other';\n\n // Duck-type rather than instanceof — execFileSync errors aren't always\n // `Error` instances across Node versions and test harnesses.\n const e = err as { code?: unknown; signal?: unknown; killed?: unknown };\n\n if (e.code === 'ENOENT') return 'not-found';\n if (e.code === 'ETIMEDOUT') return 'timeout';\n if (e.killed === true || e.signal === 'SIGTERM' || e.signal === 'SIGKILL') {\n // execFileSync sets `killed: true` + SIGTERM when its own timeout fires.\n return 'timeout';\n }\n if (e.code === 'EACCES' || e.code === 'EPERM') return 'permission';\n\n return 'other';\n}\n","/**\n * Gemini CLI MCP auto-configuration for setup command.\n *\n * Detects Gemini CLI and configures ~/.gemini/settings.json with nexus-agents MCP server.\n *\n * @module cli/setup-gemini\n * (Source: Issue #1259 - Gemini CLI MCP auto-configuration)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport { detectCliBinary, type CliDetectionInfo } from './setup-cli-detection.js';\n\nconst logger = createLogger({ component: 'setup-gemini' });\n\n/**\n * Gemini CLI detection result.\n *\n * Type alias of {@link CliDetectionInfo} — see #2155.\n */\nexport type GeminiCliInfo = CliDetectionInfo;\n\n/** Gemini MCP configuration result. */\nexport interface GeminiConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n readonly configPath: string;\n}\n\n/** Gemini MCP server entry format. */\ninterface GeminiMcpEntry {\n readonly command: string;\n readonly args: readonly string[];\n readonly timeout: number;\n}\n\n/** Detects Gemini CLI installation. Delegates to {@link detectCliBinary}. */\nexport function detectGeminiCli(): GeminiCliInfo {\n return detectCliBinary('gemini');\n}\n\n/** Resolves the Gemini config directory path based on scope. */\nfunction getGeminiConfigDir(scope: 'user' | 'project', projectRoot?: string): string {\n if (scope === 'project' && projectRoot !== undefined) {\n return join(projectRoot, '.gemini');\n }\n return join(homedir(), '.gemini');\n}\n\n/** Returns the nexus-agents MCP entry for Gemini settings.json. */\nfunction getNexusMcpEntry(): GeminiMcpEntry {\n return {\n command: 'npx',\n args: ['nexus-agents', '--mode=server'],\n timeout: 30000,\n };\n}\n\n/** Checks if nexus-agents is already configured in settings.json. */\nfunction isAlreadyConfigured(configPath: string): boolean {\n if (!existsSync(configPath)) return false;\n try {\n const config = JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n const servers = config['mcpServers'] as Record<string, unknown> | undefined;\n return servers?.['nexus-agents'] !== undefined;\n } catch {\n logger.debug('Failed to parse existing Gemini settings.json, will overwrite');\n return false;\n }\n}\n\n/** Reads existing config or returns empty object. */\nfunction readExistingConfig(configPath: string): Record<string, unknown> {\n if (!existsSync(configPath)) return {};\n try {\n return JSON.parse(readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n\n/** Writes the merged config with nexus-agents MCP entry. */\nfunction writeGeminiConfig(configDir: string, configPath: string): void {\n if (!existsSync(configDir)) mkdirSync(configDir, { recursive: true });\n const config = readExistingConfig(configPath);\n const servers = (config['mcpServers'] ?? {}) as Record<string, unknown>;\n servers['nexus-agents'] = getNexusMcpEntry();\n config['mcpServers'] = servers;\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\n/**\n * Configures Gemini CLI with nexus-agents MCP server.\n *\n * @param force - Force reconfiguration even if already configured\n * @param dryRun - Preview changes without writing\n * @param scope - 'user' for global (~/.gemini/), 'project' for project-local (.gemini/)\n * @param projectRoot - Project root directory (required for project scope)\n */\nexport function configureGemini(\n force: boolean,\n dryRun: boolean,\n scope: 'user' | 'project' = 'user',\n projectRoot?: string\n): GeminiConfigResult {\n const configDir = getGeminiConfigDir(scope, projectRoot);\n const configPath = join(configDir, 'settings.json');\n\n if (isAlreadyConfigured(configPath) && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in Gemini CLI',\n configPath,\n };\n }\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: `Would configure nexus-agents MCP in ${configPath}`,\n configPath,\n };\n }\n try {\n writeGeminiConfig(configDir, configPath);\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in Gemini CLI',\n configPath,\n };\n } catch (error: unknown) {\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure Gemini: ${getErrorMessage(error)}`,\n configPath,\n };\n }\n}\n","/**\n * Codex CLI MCP auto-configuration for setup command.\n *\n * Detects Codex CLI and registers nexus-agents MCP server\n * using `codex mcp add` CLI command.\n *\n * @module cli/setup-codex\n * (Source: Issue #1263 - Codex CLI MCP auto-configuration)\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { getErrorMessage } from '../core/index.js';\nimport { createLogger } from '../core/index.js';\nimport { detectCliBinary, type CliDetectionInfo } from './setup-cli-detection.js';\n\nconst logger = createLogger({ component: 'setup-codex' });\n\n/**\n * Codex CLI detection result.\n *\n * Type alias of {@link CliDetectionInfo} — kept as a named type for the\n * public API surface (re-exported from `cli/index.ts`). Identical shape\n * across all three CLI setups (#2155).\n */\nexport type CodexCliInfo = CliDetectionInfo;\n\n/** Codex MCP configuration result. */\nexport interface CodexConfigResult {\n readonly success: boolean;\n readonly alreadyConfigured: boolean;\n readonly message: string;\n}\n\n/** Detects Codex CLI installation. Delegates to {@link detectCliBinary}. */\nexport function detectCodexCli(): CodexCliInfo {\n return detectCliBinary('codex');\n}\n\n/**\n * Checks if nexus-agents is already configured in Codex MCP.\n */\nfunction isAlreadyConfigured(): boolean {\n try {\n const output = execFileSync('codex', ['mcp', 'list'], {\n timeout: 5000,\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return output.includes('nexus-agents');\n } catch {\n return false;\n }\n}\n\n/**\n * Removes existing nexus-agents MCP configuration from Codex.\n */\nfunction removeExisting(): void {\n try {\n execFileSync('codex', ['mcp', 'remove', 'nexus-agents'], {\n timeout: 5000,\n stdio: 'pipe',\n });\n } catch {\n logger.debug('Failed to remove existing Codex MCP config (may not exist)');\n }\n}\n\n/**\n * Adds nexus-agents MCP server to Codex CLI.\n *\n * Uses: codex mcp add nexus-agents -- npx nexus-agents --mode=server\n */\nfunction addMcpServer(): CodexConfigResult {\n try {\n execFileSync(\n 'codex',\n ['mcp', 'add', 'nexus-agents', '--', 'npx', 'nexus-agents', '--mode=server'],\n {\n timeout: 10000,\n stdio: 'pipe',\n }\n );\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Configured nexus-agents MCP in Codex CLI',\n };\n } catch (error: unknown) {\n return {\n success: false,\n alreadyConfigured: false,\n message: `Failed to configure Codex: ${getErrorMessage(error)}`,\n };\n }\n}\n\n/**\n * Configures Codex CLI with nexus-agents MCP server.\n */\nexport function configureCodex(force: boolean, dryRun: boolean): CodexConfigResult {\n if (isAlreadyConfigured() && !force) {\n return {\n success: true,\n alreadyConfigured: true,\n message: 'nexus-agents already configured in Codex CLI',\n };\n }\n\n if (dryRun) {\n return {\n success: true,\n alreadyConfigured: false,\n message: 'Would configure nexus-agents MCP in Codex CLI',\n };\n }\n\n if (force && isAlreadyConfigured()) {\n removeExisting();\n }\n\n return addMcpServer();\n}\n","/**\n * nexus-agents setup interactive wizard\n *\n * Guided setup experience for configuring nexus-agents with Claude CLI.\n * Uses Node.js readline for terminal prompts without external dependencies.\n *\n * @module cli/setup-wizard\n * (Source: Issue #425 - Interactive setup wizard)\n */\n\nimport { createInterface, type Interface } from 'node:readline';\nimport { formatHeader, formatStatus, isInteractive } from './setup-formatting.js';\nimport type { SetupOptions } from './setup-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Usage mode selection. */\nexport type UsageMode = 'claude-desktop' | 'claude-cli' | 'standalone' | 'all';\n\n/** Wizard answers collected from user. */\nexport interface WizardAnswers {\n usageMode: UsageMode;\n hasApiKeys: boolean;\n configDirectory: string;\n confirmProceed: boolean;\n}\n\n/** Wizard state during execution. */\ninterface WizardState {\n currentStep: number;\n totalSteps: number;\n answers: Partial<WizardAnswers>;\n}\n\n// ============================================================================\n// Readline Helpers\n// ============================================================================\n\n/**\n * Creates a readline interface for prompting.\n */\nfunction createReadline(): Interface {\n return createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\n/**\n * Prompts for input and returns the answer.\n */\nasync function promptInput(rl: Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Prompts for a yes/no confirmation.\n */\nasync function promptConfirm(\n rl: Interface,\n question: string,\n defaultValue = true\n): Promise<boolean> {\n const defaultHint = defaultValue ? '[Y/n]' : '[y/N]';\n const answer = await promptInput(rl, `${question} ${defaultHint}: `);\n\n if (answer === '') return defaultValue;\n return answer.toLowerCase().startsWith('y');\n}\n\n/**\n * Prints options for selection prompt.\n */\nfunction printOptions(\n options: readonly { value: string; label: string }[],\n defaultIndex: number\n): void {\n for (let i = 0; i < options.length; i++) {\n const option = options[i];\n const marker = i === defaultIndex ? '>' : ' ';\n const label = option?.label ?? '';\n writeLine(` ${marker} ${String(i + 1)}. ${label}`);\n }\n}\n\n/**\n * Gets value from options at index with fallback.\n */\nfunction getOptionValue(\n options: readonly { value: string; label: string }[],\n index: number,\n fallbackIndex: number\n): string {\n const option = options[index];\n if (option !== undefined) {\n return option.value;\n }\n const fallback = options[fallbackIndex];\n return fallback?.value ?? '';\n}\n\n/**\n * Prompts for a selection from a list of options.\n */\nasync function promptSelect(\n rl: Interface,\n question: string,\n options: readonly { value: string; label: string }[],\n defaultIndex = 0\n): Promise<string> {\n writeLine('\\n' + question);\n printOptions(options, defaultIndex);\n\n const answer = await promptInput(rl, `\\nChoice [1-${String(options.length)}]: `);\n\n if (answer === '') {\n return getOptionValue(options, defaultIndex, 0);\n }\n\n const index = parseInt(answer, 10) - 1;\n if (index >= 0 && index < options.length) {\n return getOptionValue(options, index, 0);\n }\n\n return getOptionValue(options, defaultIndex, 0);\n}\n\n// ============================================================================\n// Output Helpers\n// ============================================================================\n\n/** Writes a line to stdout. */\nfunction writeLine(text: string): void {\n process.stdout.write(text + '\\n');\n}\n\n/** Writes an empty line. */\nfunction writeEmptyLine(): void {\n process.stdout.write('\\n');\n}\n\n/** Prints the wizard header. */\nfunction printWizardHeader(): void {\n writeEmptyLine();\n writeLine(formatHeader('Nexus Agents Setup Wizard'));\n writeLine('='.repeat(40));\n writeLine('This wizard will help you configure nexus-agents.');\n writeEmptyLine();\n}\n\n/** Prints step progress. */\nfunction printStepProgress(state: WizardState, stepName: string): void {\n writeLine(\n `\\n${formatHeader(`Step ${String(state.currentStep)}/${String(state.totalSteps)}: ${stepName}`)}`\n );\n writeLine('-'.repeat(40));\n}\n\n/** Prints completion message. */\nfunction printCompletion(): void {\n writeEmptyLine();\n writeLine(formatStatus('success') + ' Wizard completed! Running setup...');\n writeEmptyLine();\n}\n\n// ============================================================================\n// Wizard Steps\n// ============================================================================\n\n/** Usage mode options. */\nconst USAGE_MODE_OPTIONS: readonly { value: UsageMode; label: string }[] = [\n { value: 'claude-cli', label: 'Claude CLI (terminal-based development)' },\n { value: 'claude-desktop', label: 'Claude Desktop (GUI application)' },\n { value: 'standalone', label: 'Standalone CLI (without Claude integration)' },\n { value: 'all', label: 'All of the above' },\n];\n\n/**\n * Step 1: Ask how the user plans to use nexus-agents.\n */\nasync function askUsageMode(rl: Interface, state: WizardState): Promise<UsageMode> {\n printStepProgress(state, 'Usage Mode');\n writeLine('How will you use nexus-agents?');\n\n const answer = await promptSelect(rl, '', USAGE_MODE_OPTIONS, 0);\n\n return answer as UsageMode;\n}\n\n/**\n * Step 2: Ask about API key configuration.\n */\nasync function askApiKeys(rl: Interface, state: WizardState): Promise<boolean> {\n printStepProgress(state, 'API Keys');\n writeLine('nexus-agents works best with API keys configured.');\n writeLine('Supported providers: Anthropic (Claude), OpenAI, Google (Gemini)');\n writeEmptyLine();\n\n const hasKeys = await promptConfirm(rl, 'Do you have at least one API key configured?', false);\n\n if (!hasKeys) {\n writeEmptyLine();\n writeLine('No worries! You can configure API keys later:');\n writeLine(' - ANTHROPIC_API_KEY for Claude');\n writeLine(' - OPENAI_API_KEY for OpenAI/Codex');\n writeLine(' - GOOGLE_AI_API_KEY for Gemini');\n writeLine('\\nRun `nexus-agents doctor` to check your configuration.');\n }\n\n return hasKeys;\n}\n\n/**\n * Step 3: Ask about configuration directory.\n */\nasync function askConfigDirectory(rl: Interface, state: WizardState): Promise<string> {\n printStepProgress(state, 'Configuration');\n writeLine('Where should nexus-agents store its configuration?');\n writeEmptyLine();\n\n const defaultDir = process.cwd();\n const answer = await promptInput(rl, `Directory [${defaultDir}]: `);\n\n return answer || defaultDir;\n}\n\n/**\n * Step 4: Confirm and proceed.\n */\nasync function askConfirmation(\n rl: Interface,\n state: WizardState,\n answers: Partial<WizardAnswers>\n): Promise<boolean> {\n printStepProgress(state, 'Confirmation');\n writeLine('Setup will configure the following:');\n writeEmptyLine();\n\n const modeLabel =\n USAGE_MODE_OPTIONS.find((o) => o.value === answers.usageMode)?.label ?? 'Unknown';\n const apiKeyStatus = answers.hasApiKeys === true ? 'Configured' : 'Not yet configured';\n const configDir = answers.configDirectory ?? process.cwd();\n writeLine(` Usage mode: ${modeLabel}`);\n writeLine(` API keys: ${apiKeyStatus}`);\n writeLine(` Config directory: ${configDir}`);\n writeEmptyLine();\n\n const skipMcp = answers.usageMode === 'standalone';\n if (!skipMcp) {\n writeLine('Will configure:');\n writeLine(' - MCP server for Claude integration');\n writeLine(' - Rules file (.rules/nexus-agents.md)');\n writeLine(' - Hooks for session tracking');\n } else {\n writeLine('Will configure:');\n writeLine(' - Rules file (.rules/nexus-agents.md)');\n writeLine(' - (Skipping MCP/hooks - not needed for standalone mode)');\n }\n\n writeEmptyLine();\n return promptConfirm(rl, 'Proceed with setup?', true);\n}\n\n// ============================================================================\n// Wizard Runner\n// ============================================================================\n\n/**\n * Runs the interactive setup wizard.\n *\n * @returns Setup options based on wizard answers, or undefined if cancelled\n */\nexport async function runWizard(): Promise<Partial<SetupOptions> | undefined> {\n // Check if interactive mode is available\n if (!isInteractive()) {\n writeLine('Interactive mode not available (TTY required).');\n writeLine('Use --non-interactive flag for automated setup.');\n return undefined;\n }\n\n const rl = createReadline();\n\n try {\n printWizardHeader();\n\n const state: WizardState = {\n currentStep: 1,\n totalSteps: 4,\n answers: {},\n };\n\n // Step 1: Usage mode\n state.answers.usageMode = await askUsageMode(rl, state);\n state.currentStep++;\n\n // Step 2: API keys\n state.answers.hasApiKeys = await askApiKeys(rl, state);\n state.currentStep++;\n\n // Step 3: Config directory\n state.answers.configDirectory = await askConfigDirectory(rl, state);\n state.currentStep++;\n\n // Step 4: Confirmation\n state.answers.confirmProceed = await askConfirmation(rl, state, state.answers);\n state.currentStep++;\n\n if (!state.answers.confirmProceed) {\n writeEmptyLine();\n writeLine('Setup cancelled.');\n return undefined;\n }\n\n printCompletion();\n\n // Convert wizard answers to setup options\n return convertAnswersToOptions(state.answers as WizardAnswers);\n } finally {\n rl.close();\n }\n}\n\n/**\n * Converts wizard answers to setup options.\n */\nfunction convertAnswersToOptions(answers: WizardAnswers): Partial<SetupOptions> {\n const isStandalone = answers.usageMode === 'standalone';\n\n return {\n // Skip MCP and hooks for standalone mode\n skipMcp: isStandalone,\n skipHooks: isStandalone,\n // Always create rules file\n skipRules: false,\n // Use user scope for Claude CLI/Desktop, project for standalone\n scope: isStandalone ? 'project' : 'user',\n // Non-interactive since we collected all info\n nonInteractive: true,\n // Show verbose output to explain what's happening\n verbose: true,\n };\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { isInteractive };\n","/**\n * Claude Code permissions snippet generator (#1945).\n *\n * In \"don't ask\" permission mode, Claude Code hard-rejects MCP tool calls\n * that aren't in the allowlist. For nexus-agents to be usable for agentic\n * dogfooding (orchestrate, create_expert, consensus_vote), the tools must\n * be pre-approved in ~/.claude/settings.json.\n *\n * This module generates a recommended snippet for users to paste into\n * their settings.json. We do NOT auto-write permissions — that would be\n * a security footgun.\n *\n * @module cli/setup-permissions\n */\n\n/** MCP tool names that are safe to pre-approve (read-only or idempotent). */\nconst SAFE_READONLY_TOOLS = [\n 'list_experts',\n 'list_workflows',\n 'weather_report',\n 'memory_query',\n 'memory_stats',\n 'query_trace',\n 'research_query',\n 'research_analyze',\n 'research_discover',\n 'research_synthesize',\n 'repo_analyze',\n 'repo_security_plan',\n 'extract_symbols',\n 'search_codebase',\n] as const;\n\n/** MCP tools that execute tasks but are commonly used for dogfooding. */\nconst SAFE_EXECUTION_TOOLS = [\n 'orchestrate',\n 'create_expert',\n 'execute_expert',\n 'consensus_vote',\n 'delegate_to_model',\n 'run_workflow',\n 'issue_triage',\n 'registry_import',\n] as const;\n\nexport type PermissionLevel = 'readonly' | 'all';\n\n/**\n * Generate a JSON snippet of recommended permissions for Claude Code's\n * `~/.claude/settings.json` to pre-approve nexus-agents MCP tools.\n *\n * Users paste this into the `permissions.allow` array.\n */\nexport function generatePermissionsSnippet(level: PermissionLevel = 'all'): string {\n const tools =\n level === 'readonly'\n ? [...SAFE_READONLY_TOOLS]\n : [...SAFE_READONLY_TOOLS, ...SAFE_EXECUTION_TOOLS];\n\n const permissions = tools.map((t) => `mcp__nexus-agents__${t}`).sort();\n return JSON.stringify(permissions, null, 2);\n}\n\n/**\n * Return a human-readable banner explaining the permissions snippet,\n * for inclusion in `nexus-agents setup` output.\n */\nexport function buildPermissionsBanner(snippet: string): string {\n return [\n '',\n '--- Claude Code Permissions (optional) ---',\n '',\n \"To use nexus-agents MCP tools in 'don't ask' mode (autonomous/headless\",\n 'Claude Code sessions), add these entries to the `permissions.allow` array',\n 'in your `~/.claude/settings.json`:',\n '',\n snippet,\n '',\n 'Without these, each MCP tool call will prompt for approval in interactive',\n 'mode, or be rejected outright in `dangerously-skip-permissions` mode.',\n '',\n 'Reference: https://github.com/williamzujkowski/nexus-agents/issues/1945',\n '',\n ].join('\\n');\n}\n","/**\n * nexus-agents/cli - Verify Command\n *\n * Quick verification that installation works correctly.\n * No API keys required - runs offline checks only.\n *\n * @module cli/verify-command\n * (Source: Issue #253 - Quick verification step after installation)\n */\n\nimport { VERSION } from '../version.js';\nimport { getTimeProvider } from '../core/index.js';\nimport { defaultConfig } from '../config/index.js';\nimport { BUILT_IN_EXPERTS } from '../agents/experts/expert-config.js';\nimport { colors, symbols } from './ansi-output.js';\nimport { checkSqlite, checkDataDirectory, checkApiKeys } from './doctor.js';\nimport { probeAllClis } from './cli-auth-probe.js';\n\n/**\n * Verify command options.\n */\nexport interface VerifyOptions {\n readonly verbose: boolean;\n}\n\n/**\n * Severity of a failed check.\n *\n * - `hard`: functionality is broken (e.g. Node version too low, core exports\n * missing). Exit code 1.\n * - `warn`: functionality is degraded but usable (e.g. better-sqlite3 missing\n * → only some memory backends unavailable; no CLI adapters detected →\n * orchestrator still works via API keys). Exit code 0.\n *\n * Unused on passing checks.\n */\nexport type VerifySeverity = 'hard' | 'warn';\n\n/**\n * Single verification check result.\n */\nexport interface VerifyCheck {\n readonly name: string;\n readonly passed: boolean;\n readonly message: string;\n readonly fix?: string;\n /**\n * Severity for failed checks. Defaults to `hard` when omitted. Passing\n * checks ignore this field.\n */\n readonly severity?: VerifySeverity;\n}\n\n/**\n * Complete verification result.\n */\nexport interface VerifyResult {\n readonly version: string;\n readonly nodeVersion: string;\n readonly checks: readonly VerifyCheck[];\n /** True when every check passed. */\n readonly allPassed: boolean;\n /**\n * True when no check failed with `severity: 'hard'`. Drives the exit code:\n * warnings alone do not fail verification (exit 0 with warnings printed).\n */\n readonly noHardFailures: boolean;\n readonly durationMs: number;\n}\n\n/**\n * Checks if Node.js version is supported.\n */\nfunction checkNodeVersion(): VerifyCheck {\n const version = process.version;\n const major = parseInt(version.slice(1).split('.')[0] ?? '0', 10);\n\n if (major >= 22) {\n return {\n name: 'Node.js Version',\n passed: true,\n message: `${version} (LTS)`,\n };\n }\n\n if (major >= 18) {\n return {\n name: 'Node.js Version',\n passed: true,\n message: `${version} (supported, recommend 22.x LTS)`,\n };\n }\n\n return {\n name: 'Node.js Version',\n passed: false,\n message: `${version} (unsupported)`,\n fix: 'Install Node.js 22.x LTS from https://nodejs.org',\n };\n}\n\n/**\n * Checks if package exports are accessible.\n */\nfunction checkPackageExports(): VerifyCheck {\n try {\n // Check if we can access core exports\n const hasVersion = typeof VERSION === 'string' && VERSION.length > 0;\n const hasConfig = typeof defaultConfig === 'object';\n const hasBuiltInExperts = typeof BUILT_IN_EXPERTS === 'object';\n\n if (hasVersion && hasConfig && hasBuiltInExperts) {\n return {\n name: 'Package Exports',\n passed: true,\n message: 'All core modules accessible',\n };\n }\n\n return {\n name: 'Package Exports',\n passed: false,\n message: 'Some modules failed to load',\n fix: 'Try reinstalling: npm install -g nexus-agents',\n };\n } catch {\n return {\n name: 'Package Exports',\n passed: false,\n message: 'Failed to load core modules',\n fix: 'Try reinstalling: npm install -g nexus-agents',\n };\n }\n}\n\n/**\n * Checks if default configuration is accessible.\n */\nfunction checkConfigLoading(): VerifyCheck {\n try {\n const hasModels = typeof defaultConfig.models === 'object';\n const hasSecurity = typeof defaultConfig.security === 'object';\n\n if (hasModels && hasSecurity) {\n return {\n name: 'Configuration',\n passed: true,\n message: 'Default config accessible',\n };\n }\n\n return {\n name: 'Configuration',\n passed: true, // Config errors are not fatal for verification\n message: 'Using default configuration',\n };\n } catch {\n return {\n name: 'Configuration',\n passed: true, // Still works with defaults\n message: 'Using default configuration',\n };\n }\n}\n\n/**\n * Checks expert system availability.\n */\nfunction checkExpertSystem(): VerifyCheck {\n const expertTypes = Object.keys(BUILT_IN_EXPERTS);\n const count = expertTypes.length;\n\n if (count >= 5) {\n return {\n name: 'Expert System',\n passed: true,\n message: `${String(count)} expert types available`,\n };\n }\n\n return {\n name: 'Expert System',\n passed: false,\n message: 'Expert types not loaded',\n fix: 'Try reinstalling: npm install -g nexus-agents',\n };\n}\n\n/**\n * Checks that better-sqlite3 loads. Memory backends (agentic, adaptive, typed,\n * mobimem, decay) are unavailable if it's missing — functional degradation,\n * not a hard failure. Rebuilding the native module or reinstalling usually\n * fixes it.\n */\nasync function checkSqliteAvailability(): Promise<VerifyCheck> {\n const result = await checkSqlite();\n if (result.available) {\n return {\n name: 'SQLite Storage',\n passed: true,\n message: 'better-sqlite3 loaded (memory backends available)',\n };\n }\n return {\n name: 'SQLite Storage',\n passed: false,\n severity: 'warn',\n message: result.error ?? 'better-sqlite3 not available',\n fix: 'Run \"pnpm rebuild better-sqlite3\" or reinstall nexus-agents',\n };\n}\n\n/**\n * Checks that the `~/.nexus-agents/` data directories exist and are writable.\n * `cli-commands.ts::dispatchCommand` initializes them lazily (#1398), so\n * missing dirs are a hard failure (persistence will silently drop writes).\n */\nfunction checkDataDirs(): VerifyCheck {\n const result = checkDataDirectory();\n const unwritable = result.subdirectories.filter((s) => !s.exists || !s.writable);\n if (result.rootExists && unwritable.length === 0) {\n return {\n name: 'Data Directories',\n passed: true,\n message: `${result.rootPath} (all subdirectories writable)`,\n };\n }\n if (!result.rootExists) {\n return {\n name: 'Data Directories',\n passed: false,\n severity: 'warn',\n message: `${result.rootPath} does not exist`,\n fix: 'Run any nexus-agents command — directories auto-initialize on first run',\n };\n }\n return {\n name: 'Data Directories',\n passed: false,\n severity: 'warn',\n message: `${String(unwritable.length)} subdirectory(ies) unwritable: ${unwritable\n .map((s) => s.name)\n .join(', ')}`,\n fix: `Check filesystem permissions on ${result.rootPath}`,\n };\n}\n\n/**\n * Checks that at least one execution path is configured — either an API key\n * (direct adapter) or a CLI that's actually authenticated. Without either,\n * the orchestrator has nothing to dispatch to.\n *\n * #2437: previously only checked env vars, so verify reported \"No API keys\n * configured / degraded\" while doctor (post-#2448) correctly reported the\n * CLI as authed. Both were accurate but disagreed in tone, confusing\n * operators. Now verify uses the same auth probe doctor uses, so they\n * align on the available-paths question.\n */\nasync function checkAdapterAvailability(): Promise<VerifyCheck> {\n const keys = checkApiKeys();\n const configuredKeys = keys.filter((k) => k.configured);\n const authedClis = (await probeAllClis()).filter((p) => p.state === 'authenticated');\n\n if (configuredKeys.length > 0 || authedClis.length > 0) {\n const parts: string[] = [];\n if (configuredKeys.length > 0) {\n parts.push(\n `${String(configuredKeys.length)} API key(s): ${configuredKeys.map((k) => k.name).join(', ')}`\n );\n }\n if (authedClis.length > 0) {\n parts.push(\n `${String(authedClis.length)} authed CLI(s): ${authedClis.map((p) => p.cli).join(', ')}`\n );\n }\n return {\n name: 'Adapter Availability',\n passed: true,\n message: parts.join('; '),\n };\n }\n\n return {\n name: 'Adapter Availability',\n passed: false,\n severity: 'warn',\n message: 'No API keys and no authed CLIs detected',\n fix: 'Run \"nexus-agents login\" to see per-CLI status, then \"claude /login\" / \"codex login\" / etc., or set ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_AI_API_KEY',\n };\n}\n\n/**\n * Runs all verification checks.\n */\nexport async function runVerify(): Promise<VerifyResult> {\n const time = getTimeProvider();\n const startTime = time.now();\n\n const checks: VerifyCheck[] = [\n checkNodeVersion(),\n checkPackageExports(),\n checkConfigLoading(),\n checkExpertSystem(),\n await checkSqliteAvailability(),\n checkDataDirs(),\n await checkAdapterAvailability(),\n ];\n\n const allPassed = checks.every((c) => c.passed);\n const noHardFailures = checks.every((c) => c.passed || c.severity === 'warn');\n const durationMs = time.now() - startTime;\n\n return {\n version: VERSION,\n nodeVersion: process.version,\n checks,\n allPassed,\n noHardFailures,\n durationMs,\n };\n}\n\n/**\n * Formats a single check result.\n *\n * Failed-but-warn checks render as yellow warnings (degraded). Failed hard\n * checks render as red crosses.\n */\nfunction formatCheck(check: VerifyCheck): string {\n let symbol: string;\n if (check.passed) {\n symbol = `${colors.green}${symbols.check}${colors.reset}`;\n } else if (check.severity === 'warn') {\n symbol = `${colors.yellow}${symbols.warn}${colors.reset}`;\n } else {\n symbol = `${colors.red}${symbols.cross}${colors.reset}`;\n }\n\n let line = ` ${symbol} ${check.name}: ${check.message}`;\n\n if (!check.passed && check.fix !== undefined) {\n line += `\\n ${colors.dim}Fix: ${check.fix}${colors.reset}`;\n }\n\n return line;\n}\n\n/**\n * Prints verification results to stdout.\n */\nexport function printVerifyResult(result: VerifyResult, verbose: boolean): void {\n process.stdout.write('\\n');\n process.stdout.write(`${colors.bold}nexus-agents verify${colors.reset}\\n`);\n process.stdout.write('===================\\n');\n process.stdout.write('\\n');\n process.stdout.write(`Version: ${result.version}\\n`);\n process.stdout.write(`Node.js: ${result.nodeVersion}\\n`);\n process.stdout.write('\\n');\n\n process.stdout.write(`${colors.cyan}Running checks...${colors.reset}\\n`);\n process.stdout.write('\\n');\n\n for (const check of result.checks) {\n process.stdout.write(formatCheck(check) + '\\n');\n }\n\n process.stdout.write('\\n');\n\n const warnCount = result.checks.filter((c) => !c.passed && c.severity === 'warn').length;\n const hardCount = result.checks.filter((c) => !c.passed && c.severity !== 'warn').length;\n\n if (result.allPassed) {\n process.stdout.write(\n `${colors.green}${colors.bold}Installation verified successfully!${colors.reset}\\n`\n );\n process.stdout.write('\\n');\n process.stdout.write(`${colors.cyan}Next steps:${colors.reset}\\n`);\n process.stdout.write(' 1. Run \"nexus-agents doctor\" to check external CLI integrations\\n');\n process.stdout.write(\n ' 2. Run \"nexus-agents review --setup\" to configure GitHub integration\\n'\n );\n process.stdout.write(' 3. Try \"nexus-agents --help\" for all available commands\\n');\n } else if (hardCount === 0) {\n process.stdout.write(\n `${colors.yellow}${colors.bold}Verified with ${String(warnCount)} warning(s) — functional but degraded${colors.reset}\\n`\n );\n process.stdout.write('\\n');\n process.stdout.write('The warnings above indicate reduced functionality but will not\\n');\n process.stdout.write('prevent nexus-agents from running. Fix them when convenient.\\n');\n } else {\n process.stdout.write(\n `${colors.red}${colors.bold}Verification failed: ${String(hardCount)} blocking issue(s), ${String(warnCount)} warning(s)${colors.reset}\\n`\n );\n process.stdout.write('\\n');\n process.stdout.write('Please fix the blocking issues above and try again.\\n');\n }\n\n process.stdout.write('\\n');\n\n if (verbose) {\n process.stdout.write(`${colors.dim}Duration: ${String(result.durationMs)}ms${colors.reset}\\n`);\n process.stdout.write('\\n');\n }\n}\n\n/**\n * Runs the verify command and prints results.\n *\n * Exit codes:\n * - `0`: all checks passed, or only `warn`-severity checks failed (degraded\n * but functional)\n * - `1`: at least one `hard`-severity check failed (broken install)\n */\nexport async function verifyCommand(options: VerifyOptions): Promise<number> {\n const result = await runVerify();\n printVerifyResult(result, options.verbose);\n return result.noHardFailures ? 0 : 1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,SAAS,cAAAA,mBAAkB;;;ACH3B,SAAS,SAAS;AAMX,IAAM,qBAAqB,EAAE,OAAO;AAAA;AAAA,EAEzC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEhC,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAElC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEpC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEpC,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAErC,cAAc,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEvC,YAAY,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAErC,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEpC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAEjC,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAElC,OAAO,EAAE,KAAK,CAAC,QAAQ,SAAS,CAAC,EAAE,QAAQ,MAAM;AACnD,CAAC;;;AC/BD,SAAS,gBAAgB;AACzB,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AACxB,SAAS,MAAM,gBAAgB;AAa/B,SAAS,mBAAmB,QAAoC;AAC9D,QAAM,QAAQ,OAAO,MAAM,iBAAiB;AAC5C,SAAO,QAAQ,CAAC;AAClB;AAMO,SAAS,kBAAiC;AAC/C,QAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAC5C,QAAM,cAAc,KAAK,QAAQ,GAAG,cAAc;AAElD,MAAI;AACF,UAAM,SAAS,SAAS,oBAAoB;AAAA,MAC1C,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,SAAS,wBAAwB;AAAA,IACnC,CAAC;AACD,UAAM,UAAU,mBAAmB,MAAM;AAEzC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAGA,SAAS,qBAAqB,QAAuD;AACnF,QAAM,aAAa,OAAO,YAAY;AACtC,MAAI,eAAe,OAAW,QAAO;AACrC,SAAO,OAAO,KAAK,UAAU;AAC/B;AAGA,SAAS,sBAAsB,QAAuD;AACpF,QAAM,WAAW,OAAO,UAAU;AAClC,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,QAAQ,OAAO,OAAO,QAAQ,GAAG;AAC1C,UAAM,aAAa,KAAK,YAAY;AACpC,QAAI,eAAe,OAAW,QAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;AAAA,EACxF;AACA,SAAO,CAAC,GAAG,UAAU;AACvB;AAGA,SAAS,aAAa,MAAc,SAAkC;AACpE,SAAO,EAAE,QAAQ,MAAM,MAAM,gBAAgB,QAAQ,SAAS,cAAc,GAAG,QAAQ;AACzF;AASO,SAAS,gBAAgB,aAAgD;AAC9E,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO;AACrC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAC5D,UAAM,SAAS,qBAAqB,MAAM;AAC1C,QAAI,WAAW,OAAW,QAAO,aAAa,aAAa,MAAM;AACjE,UAAM,YAAY,sBAAsB,MAAM;AAC9C,QAAI,cAAc,OAAW,QAAO,aAAa,aAAa,SAAS;AACvE,WAAO,aAAa,aAAa,CAAC,CAAC;AAAA,EACrC,QAAQ;AACN,WAAO,aAAa,aAAa,CAAC,CAAC;AAAA,EACrC;AACF;AAGA,SAAS,2BAA2B,MAAuB;AACzD,MAAI;AACF,UAAM,UAAU,aAAa,KAAK,MAAM,cAAc,GAAG,OAAO;AAChE,UAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,UAAM,MAAM;AACZ,UAAM,UAAU,IAAI,iBAAiB;AACrC,WAAO,UAAU,YAAY,MAAM;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,IAAM,oBAAsD;AAAA,EAC1D,CAAC,iBAAiB,YAAY;AAAA,EAC9B,CAAC,cAAc,MAAM;AAAA,EACrB,CAAC,UAAU,IAAI;AAAA,EACf,CAAC,kBAAkB,QAAQ;AAAA,EAC3B,CAAC,YAAY,QAAQ;AAAA,EACrB,CAAC,WAAW,MAAM;AAAA,EAClB,CAAC,gBAAgB,MAAM;AACzB;AAKO,SAAS,kBAAkB,MAA2B;AAE3D,aAAW,CAAC,MAAM,IAAI,KAAK,mBAAmB;AAC5C,QAAI,WAAW,KAAK,MAAM,IAAI,CAAC,EAAG,QAAO;AAAA,EAC3C;AAGA,MAAI,WAAW,KAAK,MAAM,cAAc,CAAC,GAAG;AAC1C,WAAO,2BAA2B,IAAI,IAAI,eAAe;AAAA,EAC3D;AAEA,SAAO;AACT;AAKO,SAAS,kBAAkB,MAA2B;AAC3D,MAAI;AAEJ,MAAI,WAAW,KAAK,MAAM,cAAc,CAAC,GAAG;AAC1C,QAAI;AACF,YAAM,UAAU,aAAa,KAAK,MAAM,cAAc,GAAG,OAAO;AAChE,YAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAM,YAAY,IAAI,MAAM;AAC5B,oBAAc,OAAO,cAAc,WAAW,YAAY;AAAA,IAC5D,SAAS,UAAmB;AAE1B,WAAK;AAAA,IACP;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,WAAW,KAAK,MAAM,cAAc,CAAC;AAAA,IACrD,aAAa,WAAW,KAAK,MAAM,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,IAI/C,gBAAgB,WAAW,KAAK,MAAM,QAAQ,CAAC,KAAK,WAAW,KAAK,MAAM,WAAW,OAAO,CAAC;AAAA,IAC7F,gBAAgB,WAAW,KAAK,MAAM,mBAAmB,CAAC;AAAA,IAC1D,aAAa,kBAAkB,IAAI;AAAA,IACnC,aAAa,eAAe,SAAS,IAAI;AAAA,EAC3C;AACF;AAKO,SAAS,kBAAkB,aAAsC;AACtE,QAAM,YAAY,gBAAgB;AAClC,QAAM,oBAAoB,gBAAgB,UAAU,WAAW;AAC/D,QAAM,cAAc,kBAAkB,WAAW;AAEjD,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1LA,SAAS,YAAAC,WAAU,oBAAoB;AACvC,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAKd,IAAM,yBAAyC;AAAA,EACpD,SAAS;AAAA,EACT,MAAM,CAAC,eAAe;AACxB;AAGO,IAAM,6BAA6C;AAAA,EACxD,SAAS;AAAA,EACT,MAAM,CAAC,MAAM,uBAAuB,eAAe;AACrD;AAcO,SAAS,wBAAiC;AAC/C,MAAI;AACF,UAAM,SAASC,UAAS,+BAA+B;AAAA,MACrD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,SAAS,cAAc;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,YAAY,OAAmC;AACtD,SAAO,UAAU,YAAY,UAAU;AACzC;AAKA,SAAS,wBAAwB,QAA4B,QAAc;AACzE,MAAI;AACF,IAAAA,UAAS,qCAAqC,YAAY,KAAK,CAAC,IAAI;AAAA,MAClE,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAKA,SAAS,aAAa,QAAiB,QAA4B,QAAyB;AAC1F,QAAM,QAAQ,SAAS,6BAA6B;AACpD,QAAM,aAAa,KAAK,UAAU,KAAK;AACvC,QAAM,aAAa,UAAU,YAAY,YAAY;AAErD,MAAI;AACF;AAAA,MACE;AAAA,MACA,CAAC,OAAO,YAAY,gBAAgB,YAAY,MAAM,YAAY,KAAK,CAAC;AAAA,MACxE;AAAA,QACE,UAAU;AAAA,QACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,iDAAiD,UAAU;AAAA,IACtE;AAAA,EACF,SAAS,OAAO;AACd,UAAM,WAAW,gBAAgB,KAAK;AACtC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,6BAA6B,QAAQ;AAAA,IAChD;AAAA,EACF;AACF;AAQO,SAAS,mBACd,SAAkB,OAClB,QAAiB,OACjB,QAA4B,QACX;AACjB,QAAM,eAAe,sBAAsB;AAG3C,MAAI,CAAC,SAAS,cAAc;AAC1B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,SAAS,cAAc;AACzB,4BAAwB,KAAK;AAAA,EAC/B;AAEA,SAAO,aAAa,QAAQ,KAAK;AACnC;AAKO,SAAS,mBAAmB,SAAkB,OAAe;AAClE,QAAM,QAAQ,SAAS,6BAA6B;AACpD,QAAM,SAAwB;AAAA,IAC5B,YAAY;AAAA,MACV,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAwBO,SAAS,qBAAyC;AACvD,SAAO;AAAA,IACL,OAAO;AAAA,MACL,cAAc;AAAA,QACZ;AAAA,UACE,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa;AAAA,QACX;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,UACE,OAAO;AAAA,YACL;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA2CO,SAAS,qBAA8B;AAC5C,MAAI;AACF,UAAM,SAASC,UAAS,2BAA2B;AAAA,MACjD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAED,WAAO,OAAO,SAAS,cAAc;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,mBAA4D;AAC1E,MAAI;AACF,UAAM,SAASA,UAAS,2BAA2B;AAAA,MACjD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,CAAC,WAAW,YAAY,UAAU,YAAY,aAAa;AAC7D,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,gBACP,UACA,UACoB;AACpB,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAGA,QAAM,mBAAmB,SAAS,OAAO,CAAC,UAAU;AAClD,WAAO,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW,cAAc,CAAC;AAAA,EACtE,CAAC;AAGD,SAAO,CAAC,GAAG,kBAAkB,GAAG,QAAQ;AAC1C;AAMO,SAAS,iBACd,UACA,WAC6B;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,gBAAgB,cAAc,cAAc,eAAe,MAAM;AAEpF,QAAM,SAAsC,CAAC;AAE7C,aAAW,YAAY,WAAW;AAChC,UAAM,gBAAgB,SAAS,QAAQ;AACvC,UAAM,WAAW,UAAU,QAAQ;AAEnC,QAAI,UAAU;AACZ,aAAO,QAAQ,IAAI,gBAAgB,eAAe,QAAQ;AAAA,IAC5D,WAAW,eAAe;AACxB,aAAO,QAAQ,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,eAAe,QAAiB,OAAyB;AACvE,QAAM,eAAe,mBAAmB;AAExC,MAAI,CAAC,SAAS,cAAc;AAC1B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAkB,mBAAmB;AAE3C,MAAI;AAEF,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,cAAc,iBAAiB,eAAe,gBAAgB,KAAK;AAGzE,UAAM,aAAa,KAAK,UAAU,WAAW;AAC7C,iBAAa,UAAU,CAAC,UAAU,OAAO,SAAS,UAAU,GAAG;AAAA,MAC7D,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AACD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,gBACL,0EACA;AAAA,IACN;AAAA,EACF,SAAS,OAAO;AACd,UAAM,WAAW,gBAAgB,KAAK;AACtC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,8BAA8B,QAAQ;AAAA,IACjD;AAAA,EACF;AACF;AAKO,SAAS,sBAA8B;AAC5C,QAAM,SAAS,mBAAmB;AAClC,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;;;AClYA,SAAS,gBAAAC,eAAc,eAAe,iBAAiB;AACvD,SAAS,QAAAC,OAAM,eAAe;AAQvB,SAAS,uBAA+B;AAC7C,SAAO;AAAA;AAAA,sFAE6E,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCA2DzD,OAAO;AAAA;AAE3C;AAUO,SAAS,iBAAiB,aAA6B;AAC5D,SAAOC,MAAK,aAAa,UAAU,iBAAiB;AACtD;AAKO,SAAS,gBAAgB,aAAqB,QAAyB;AAC5E,QAAM,YAAY,iBAAiB,WAAW;AAC9C,QAAM,UAAU,qBAAqB;AAErC,MAAI,CAAC,QAAQ;AACX,UAAM,WAAW,QAAQ,SAAS;AAClC,cAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AACvC,kBAAc,WAAW,SAAS,OAAO;AAAA,EAC3C;AAEA,SAAO;AACT;;;AC9FO,SAAS,gBAAyB;AACvC,MAAI,CAAC,QAAQ,OAAO,MAAO,QAAO;AAClC,MAAI,QAAQ,IAAI,IAAI,MAAM,OAAQ,QAAO;AACzC,MAAI,QAAQ,IAAI,wBAAwB,MAAM,OAAW,QAAO;AAChE,SAAO;AACT;;;ACXA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,OAAM,eAAe;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,YAAY,QAAQ,kBAAkB;;;ACExD,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAgB;;;ACmBlB,IAAM,2BAA2D;AAAA,EACtE,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,OAAO;AACT;AAUO,SAAS,uBAAuB,SAAiB,gBAAyC;AAC/F,MAAI,mBAAmB,UAAa,mBAAmB,aAAa;AAClE,WAAO,GAAG,OAAO;AAAA,EACnB;AACA,SAAO,GAAG,OAAO,sBAAsB,yBAAyB,cAAc,CAAC;AACjF;AAUO,SAAS,kBAAkB,KAA8B;AAC9D,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AAIpD,QAAM,IAAI;AAEV,MAAI,EAAE,SAAS,SAAU,QAAO;AAChC,MAAI,EAAE,SAAS,YAAa,QAAO;AACnC,MAAI,EAAE,WAAW,QAAQ,EAAE,WAAW,aAAa,EAAE,WAAW,WAAW;AAEzE,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,YAAY,EAAE,SAAS,QAAS,QAAO;AAEtD,SAAO;AACT;;;ADjDO,SAAS,uBAA0C;AACxD,SAAO,SAAS,MAAM,UAAU,UAAU;AAC5C;AAQO,SAAS,cAAc,QAAoC;AAChE,QAAM,QAAQ,kBAAkB,KAAK,MAAM;AAC3C,SAAO,QAAQ,CAAC;AAClB;AAaO,SAAS,gBAAgB,MAAgC;AAC9D,MAAI;AACF,IAAAC,cAAa,qBAAqB,GAAG,CAAC,IAAI,GAAG,EAAE,SAAS,KAAM,OAAO,OAAO,CAAC;AAAA,EAC/E,SAAS,KAAc;AACrB,WAAO,EAAE,WAAW,OAAO,SAAS,QAAW,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,EACxF;AAEA,MAAI;AACF,UAAM,SAASA,cAAa,MAAM,CAAC,WAAW,GAAG;AAAA,MAC/C,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,EAAE,WAAW,MAAM,SAAS,cAAc,MAAM,EAAE;AAAA,EAC3D,SAAS,KAAc;AACrB,WAAO,EAAE,WAAW,MAAM,SAAS,QAAW,gBAAgB,kBAAkB,GAAG,EAAE;AAAA,EACvF;AACF;;;ADzDA,IAAM,SAAS,aAAa,EAAE,WAAW,iBAAiB,CAAC;AAyBpD,SAAS,oBAAqC;AACnD,SAAO,gBAAgB,UAAU;AACnC;AAMA,SAAS,uBAA+B;AACtC,SAAOC,MAAKC,SAAQ,GAAG,WAAW,UAAU;AAC9C;AAMA,SAAS,kBAAqC;AAC5C,SAAO,CAAC,OAAO,gBAAgB,eAAe;AAChD;AAEA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,gBAAgB;AAAA,EACzB,SAAS;AACX;AAMO,SAAS,sBAAsB,KAA6B;AACjE,QAAM,YAAYD,MAAK,KAAK,gBAAgB;AAC5C,MAAIE,YAAW,SAAS,GAAG;AACzB,WAAO,EAAE,MAAM,WAAW,SAAS,MAAM,QAAQ,KAAK;AAAA,EACxD;AACA,QAAM,WAAWF,MAAK,KAAK,eAAe;AAC1C,MAAIE,YAAW,QAAQ,GAAG;AACxB,WAAO,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,KAAK;AAAA,EACxD;AACA,SAAO,EAAE,MAAM,UAAU,SAAS,OAAO,QAAQ,MAAM;AACzD;AAGA,SAAS,oBAAoB,UAAmC;AAC9D,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,MAAI;AACF,UAAM,MAAMC,cAAa,SAAS,MAAM,OAAO;AAC/C,UAAM,SAAS,WAAW,GAAG;AAC7B,UAAM,MAAM,SAAS,KAAK;AAC1B,WAAO,MAAM,cAAc,MAAM;AAAA,EACnC,QAAQ;AACN,WAAO,MAAM,0DAA0D;AACvE,WAAO;AAAA,EACT;AACF;AAGA,SAAS,iBAAiB,YAAoB,KAAmB;AAC/D,MAAI,SAAS;AACb,WAAS,WAAW,QAAQ,OAAO,QAAQ,CAAC,OAAO,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;AACxF,WAAS,WAAW,QAAQ,OAAO,QAAQ,CAAC,SAAS,GAAG,mCAAmC,CAAC,CAAC,CAAC;AAC9F,EAAAC,eAAc,YAAY,QAAQ,OAAO;AAC3C;AAGA,SAAS,gBAAgB,YAA0B;AACjD,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,IACT,KAAK,EAAE,gBAAgB,gBAAgB;AAAA,EACzC;AACA,EAAAA,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E;AAGA,SAAS,oBAAoB,WAAmB,UAAgC;AAC9E,MAAI,CAACF,YAAW,SAAS,EAAG,CAAAG,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAEpE,MAAI,SAAS,QAAQ;AACnB,UAAM,MAAMF,cAAa,SAAS,MAAM,OAAO;AAC/C,qBAAiB,SAAS,MAAM,GAAG;AAAA,EACrC,OAAO;AACL,oBAAgB,SAAS,IAAI;AAAA,EAC/B;AACF;AAUA,SAAS,oBAAoB,aAA6B;AACxD,QAAM,WAAW,QAAQ,WAAW;AACpC,MAAI,CAACD,YAAW,QAAQ,GAAG;AACzB,UAAM,IAAI,MAAM,gCAAgC,QAAQ,EAAE;AAAA,EAC5D;AACA,SAAO;AACT;AAMO,SAAS,kBACd,OACA,QACA,SACsB;AACtB,MAAI;AACF,WAAO,uBAAuB,OAAO,QAAQ,OAAO;AAAA,EACtD,SAAS,OAAgB;AACvB,UAAM,eAAeF,MAAK,qBAAqB,GAAG,eAAe;AACjE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,iCAAiC,gBAAgB,KAAK,CAAC;AAAA,MAChE,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,QACA,SACsB;AACtB,QAAM,YACJ,SAAS,gBAAgB,SACrB,oBAAoB,QAAQ,WAAW,IACvC,qBAAqB;AAC3B,QAAM,WAAW,sBAAsB,SAAS;AAEhD,MAAI,oBAAoB,QAAQ,KAAK,CAAC,OAAO;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,uCAAuC,SAAS,IAAI;AAAA,MAC7D,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AACA,sBAAoB,WAAW,QAAQ;AACvC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,YAAY,SAAS;AAAA,EACvB;AACF;;;AG/LA,SAAS,cAAAM,aAAY,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,kBAAiB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAKxB,IAAMC,UAAS,aAAa,EAAE,WAAW,eAAe,CAAC;AAyBlD,SAAS,kBAAiC;AAC/C,SAAO,gBAAgB,QAAQ;AACjC;AAGA,SAAS,mBAAmB,OAA2B,aAA8B;AACnF,MAAI,UAAU,aAAa,gBAAgB,QAAW;AACpD,WAAOC,MAAK,aAAa,SAAS;AAAA,EACpC;AACA,SAAOA,MAAKC,SAAQ,GAAG,SAAS;AAClC;AAGA,SAAS,mBAAmC;AAC1C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,CAAC,gBAAgB,eAAe;AAAA,IACtC,SAAS;AAAA,EACX;AACF;AAGA,SAASC,qBAAoB,YAA6B;AACxD,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO;AACpC,MAAI;AACF,UAAM,SAAS,KAAK,MAAMC,cAAa,YAAY,OAAO,CAAC;AAC3D,UAAM,UAAU,OAAO,YAAY;AACnC,WAAO,UAAU,cAAc,MAAM;AAAA,EACvC,QAAQ;AACN,IAAAL,QAAO,MAAM,+DAA+D;AAC5E,WAAO;AAAA,EACT;AACF;AAGA,SAAS,mBAAmB,YAA6C;AACvE,MAAI,CAACI,YAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,YAAY,OAAO,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,SAAS,kBAAkB,WAAmB,YAA0B;AACtE,MAAI,CAACD,YAAW,SAAS,EAAG,CAAAE,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACpE,QAAM,SAAS,mBAAmB,UAAU;AAC5C,QAAM,UAAW,OAAO,YAAY,KAAK,CAAC;AAC1C,UAAQ,cAAc,IAAI,iBAAiB;AAC3C,SAAO,YAAY,IAAI;AACvB,EAAAC,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO;AAC3E;AAUO,SAAS,gBACd,OACA,QACA,QAA4B,QAC5B,aACoB;AACpB,QAAM,YAAY,mBAAmB,OAAO,WAAW;AACvD,QAAM,aAAaN,MAAK,WAAW,eAAe;AAElD,MAAIE,qBAAoB,UAAU,KAAK,CAAC,OAAO;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,uCAAuC,UAAU;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,sBAAkB,WAAW,UAAU;AACvC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF,SAAS,OAAgB;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,+BAA+B,gBAAgB,KAAK,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;;;ACtIA,SAAS,gBAAAK,qBAAoB;AAK7B,IAAMC,UAAS,aAAa,EAAE,WAAW,cAAc,CAAC;AAmBjD,SAAS,iBAA+B;AAC7C,SAAO,gBAAgB,OAAO;AAChC;AAKA,SAASC,uBAA+B;AACtC,MAAI;AACF,UAAM,SAASC,cAAa,SAAS,CAAC,OAAO,MAAM,GAAG;AAAA,MACpD,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,OAAO,SAAS,cAAc;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,iBAAuB;AAC9B,MAAI;AACF,IAAAA,cAAa,SAAS,CAAC,OAAO,UAAU,cAAc,GAAG;AAAA,MACvD,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AACN,IAAAF,QAAO,MAAM,4DAA4D;AAAA,EAC3E;AACF;AAOA,SAASG,gBAAkC;AACzC,MAAI;AACF,IAAAD;AAAA,MACE;AAAA,MACA,CAAC,OAAO,OAAO,gBAAgB,MAAM,OAAO,gBAAgB,eAAe;AAAA,MAC3E;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAgB;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS,8BAA8B,gBAAgB,KAAK,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;AAKO,SAAS,eAAe,OAAgB,QAAoC;AACjF,MAAID,qBAAoB,KAAK,CAAC,OAAO;AACnC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,SAASA,qBAAoB,GAAG;AAClC,mBAAe;AAAA,EACjB;AAEA,SAAOE,cAAa;AACtB;;;AChHA,SAAS,uBAAuC;AAiChD,SAAS,iBAA4B;AACnC,SAAO,gBAAgB;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AAKA,eAAe,YAAY,IAAe,UAAmC;AAC3E,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,MAAAA,SAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAe,cACb,IACA,UACA,eAAe,MACG;AAClB,QAAM,cAAc,eAAe,UAAU;AAC7C,QAAM,SAAS,MAAM,YAAY,IAAI,GAAG,QAAQ,IAAI,WAAW,IAAI;AAEnE,MAAI,WAAW,GAAI,QAAO;AAC1B,SAAO,OAAO,YAAY,EAAE,WAAW,GAAG;AAC5C;AAKA,SAAS,aACP,SACA,cACM;AACN,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,UAAM,QAAQ,QAAQ,SAAS;AAC/B,cAAU,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE;AAAA,EACpD;AACF;AAKA,SAAS,eACP,SACA,OACA,eACQ;AACR,QAAM,SAAS,QAAQ,KAAK;AAC5B,MAAI,WAAW,QAAW;AACxB,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,WAAW,QAAQ,aAAa;AACtC,SAAO,UAAU,SAAS;AAC5B;AAKA,eAAe,aACb,IACA,UACA,SACA,eAAe,GACE;AACjB,YAAU,OAAO,QAAQ;AACzB,eAAa,SAAS,YAAY;AAElC,QAAM,SAAS,MAAM,YAAY,IAAI;AAAA,YAAe,OAAO,QAAQ,MAAM,CAAC,KAAK;AAE/E,MAAI,WAAW,IAAI;AACjB,WAAO,eAAe,SAAS,cAAc,CAAC;AAAA,EAChD;AAEA,QAAM,QAAQ,SAAS,QAAQ,EAAE,IAAI;AACrC,MAAI,SAAS,KAAK,QAAQ,QAAQ,QAAQ;AACxC,WAAO,eAAe,SAAS,OAAO,CAAC;AAAA,EACzC;AAEA,SAAO,eAAe,SAAS,cAAc,CAAC;AAChD;AAOA,SAAS,UAAU,MAAoB;AACrC,UAAQ,OAAO,MAAM,OAAO,IAAI;AAClC;AAGA,SAAS,iBAAuB;AAC9B,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAGA,SAAS,oBAA0B;AACjC,iBAAe;AACf,YAAU,aAAa,2BAA2B,CAAC;AACnD,YAAU,IAAI,OAAO,EAAE,CAAC;AACxB,YAAU,mDAAmD;AAC7D,iBAAe;AACjB;AAGA,SAAS,kBAAkB,OAAoB,UAAwB;AACrE;AAAA,IACE;AAAA,EAAK,aAAa,QAAQ,OAAO,MAAM,WAAW,CAAC,IAAI,OAAO,MAAM,UAAU,CAAC,KAAK,QAAQ,EAAE,CAAC;AAAA,EACjG;AACA,YAAU,IAAI,OAAO,EAAE,CAAC;AAC1B;AAGA,SAAS,kBAAwB;AAC/B,iBAAe;AACf,YAAU,aAAa,SAAS,IAAI,qCAAqC;AACzE,iBAAe;AACjB;AAOA,IAAM,qBAAqE;AAAA,EACzE,EAAE,OAAO,cAAc,OAAO,0CAA0C;AAAA,EACxE,EAAE,OAAO,kBAAkB,OAAO,mCAAmC;AAAA,EACrE,EAAE,OAAO,cAAc,OAAO,8CAA8C;AAAA,EAC5E,EAAE,OAAO,OAAO,OAAO,mBAAmB;AAC5C;AAKA,eAAe,aAAa,IAAe,OAAwC;AACjF,oBAAkB,OAAO,YAAY;AACrC,YAAU,gCAAgC;AAE1C,QAAM,SAAS,MAAM,aAAa,IAAI,IAAI,oBAAoB,CAAC;AAE/D,SAAO;AACT;AAKA,eAAe,WAAW,IAAe,OAAsC;AAC7E,oBAAkB,OAAO,UAAU;AACnC,YAAU,mDAAmD;AAC7D,YAAU,kEAAkE;AAC5E,iBAAe;AAEf,QAAM,UAAU,MAAM,cAAc,IAAI,gDAAgD,KAAK;AAE7F,MAAI,CAAC,SAAS;AACZ,mBAAe;AACf,cAAU,+CAA+C;AACzD,cAAU,kCAAkC;AAC5C,cAAU,qCAAqC;AAC/C,cAAU,kCAAkC;AAC5C,cAAU,0DAA0D;AAAA,EACtE;AAEA,SAAO;AACT;AAKA,eAAe,mBAAmB,IAAe,OAAqC;AACpF,oBAAkB,OAAO,eAAe;AACxC,YAAU,oDAAoD;AAC9D,iBAAe;AAEf,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAM,SAAS,MAAM,YAAY,IAAI,cAAc,UAAU,KAAK;AAElE,SAAO,UAAU;AACnB;AAKA,eAAe,gBACb,IACA,OACA,SACkB;AAClB,oBAAkB,OAAO,cAAc;AACvC,YAAU,qCAAqC;AAC/C,iBAAe;AAEf,QAAM,YACJ,mBAAmB,KAAK,CAAC,MAAM,EAAE,UAAU,QAAQ,SAAS,GAAG,SAAS;AAC1E,QAAM,eAAe,QAAQ,eAAe,OAAO,eAAe;AAClE,QAAM,YAAY,QAAQ,mBAAmB,QAAQ,IAAI;AACzD,YAAU,iBAAiB,SAAS,EAAE;AACtC,YAAU,eAAe,YAAY,EAAE;AACvC,YAAU,uBAAuB,SAAS,EAAE;AAC5C,iBAAe;AAEf,QAAM,UAAU,QAAQ,cAAc;AACtC,MAAI,CAAC,SAAS;AACZ,cAAU,iBAAiB;AAC3B,cAAU,uCAAuC;AACjD,cAAU,yCAAyC;AACnD,cAAU,gCAAgC;AAAA,EAC5C,OAAO;AACL,cAAU,iBAAiB;AAC3B,cAAU,yCAAyC;AACnD,cAAU,2DAA2D;AAAA,EACvE;AAEA,iBAAe;AACf,SAAO,cAAc,IAAI,uBAAuB,IAAI;AACtD;AAWA,eAAsB,YAAwD;AAE5E,MAAI,CAAC,cAAc,GAAG;AACpB,cAAU,gDAAgD;AAC1D,cAAU,iDAAiD;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,eAAe;AAE1B,MAAI;AACF,sBAAkB;AAElB,UAAM,QAAqB;AAAA,MACzB,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,SAAS,CAAC;AAAA,IACZ;AAGA,UAAM,QAAQ,YAAY,MAAM,aAAa,IAAI,KAAK;AACtD,UAAM;AAGN,UAAM,QAAQ,aAAa,MAAM,WAAW,IAAI,KAAK;AACrD,UAAM;AAGN,UAAM,QAAQ,kBAAkB,MAAM,mBAAmB,IAAI,KAAK;AAClE,UAAM;AAGN,UAAM,QAAQ,iBAAiB,MAAM,gBAAgB,IAAI,OAAO,MAAM,OAAO;AAC7E,UAAM;AAEN,QAAI,CAAC,MAAM,QAAQ,gBAAgB;AACjC,qBAAe;AACf,gBAAU,kBAAkB;AAC5B,aAAO;AAAA,IACT;AAEA,oBAAgB;AAGhB,WAAO,wBAAwB,MAAM,OAAwB;AAAA,EAC/D,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAKA,SAAS,wBAAwB,SAA+C;AAC9E,QAAM,eAAe,QAAQ,cAAc;AAE3C,SAAO;AAAA;AAAA,IAEL,SAAS;AAAA,IACT,WAAW;AAAA;AAAA,IAEX,WAAW;AAAA;AAAA,IAEX,OAAO,eAAe,YAAY;AAAA;AAAA,IAElC,gBAAgB;AAAA;AAAA,IAEhB,SAAS;AAAA,EACX;AACF;;;AC3UA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,SAAS,2BAA2B,QAAyB,OAAe;AACjF,QAAM,QACJ,UAAU,aACN,CAAC,GAAG,mBAAmB,IACvB,CAAC,GAAG,qBAAqB,GAAG,oBAAoB;AAEtD,QAAM,cAAc,MAAM,IAAI,CAAC,MAAM,sBAAsB,CAAC,EAAE,EAAE,KAAK;AACrE,SAAO,KAAK,UAAU,aAAa,MAAM,CAAC;AAC5C;AAMO,SAAS,uBAAuB,SAAyB;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ACXA,SAAS,mBAAgC;AACvC,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,SAAS,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,EAAE;AAEhE,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,OAAO;AAAA,IACnB,KAAK;AAAA,EACP;AACF;AAKA,SAAS,sBAAmC;AAC1C,MAAI;AAEF,UAAM,aAAa,OAAO,YAAY,YAAY,QAAQ,SAAS;AACnE,UAAM,YAAY,OAAO,kBAAkB;AAC3C,UAAM,oBAAoB,OAAO,qBAAqB;AAEtD,QAAI,cAAc,aAAa,mBAAmB;AAChD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAKA,SAAS,qBAAkC;AACzC,MAAI;AACF,UAAM,YAAY,OAAO,cAAc,WAAW;AAClD,UAAM,cAAc,OAAO,cAAc,aAAa;AAEtD,QAAI,aAAa,aAAa;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAKA,SAAS,oBAAiC;AACxC,QAAM,cAAc,OAAO,KAAK,gBAAgB;AAChD,QAAM,QAAQ,YAAY;AAE1B,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO,KAAK,CAAC;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AACF;AAQA,eAAe,0BAAgD;AAC7D,QAAM,SAAS,MAAM,YAAY;AACjC,MAAI,OAAO,WAAW;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,OAAO,SAAS;AAAA,IACzB,KAAK;AAAA,EACP;AACF;AAOA,SAAS,gBAA6B;AACpC,QAAM,SAAS,mBAAmB;AAClC,QAAM,aAAa,OAAO,eAAe,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ;AAC/E,MAAI,OAAO,cAAc,WAAW,WAAW,GAAG;AAChD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,OAAO,QAAQ;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,CAAC,OAAO,YAAY;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,GAAG,OAAO,QAAQ;AAAA,MAC3B,KAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,GAAG,OAAO,WAAW,MAAM,CAAC,kCAAkC,WACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI,CAAC;AAAA,IACb,KAAK,mCAAmC,OAAO,QAAQ;AAAA,EACzD;AACF;AAaA,eAAe,2BAAiD;AAC9D,QAAM,OAAO,aAAa;AAC1B,QAAM,iBAAiB,KAAK,OAAO,CAAC,MAAM,EAAE,UAAU;AACtD,QAAM,cAAc,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,UAAU,eAAe;AAEnF,MAAI,eAAe,SAAS,KAAK,WAAW,SAAS,GAAG;AACtD,UAAM,QAAkB,CAAC;AACzB,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM;AAAA,QACJ,GAAG,OAAO,eAAe,MAAM,CAAC,gBAAgB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC9F;AAAA,IACF;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM;AAAA,QACJ,GAAG,OAAO,WAAW,MAAM,CAAC,mBAAmB,WAAW,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MACxF;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,KAAK;AAAA,EACP;AACF;AAKA,eAAsB,YAAmC;AACvD,QAAM,OAAO,gBAAgB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAE3B,QAAM,SAAwB;AAAA,IAC5B,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,MAAM,wBAAwB;AAAA,IAC9B,cAAc;AAAA,IACd,MAAM,yBAAyB;AAAA,EACjC;AAEA,QAAM,YAAY,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAC9C,QAAM,iBAAiB,OAAO,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,MAAM;AAC5E,QAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQA,SAAS,YAAY,OAA4B;AAC/C,MAAI;AACJ,MAAI,MAAM,QAAQ;AAChB,aAAS,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,EACzD,WAAW,MAAM,aAAa,QAAQ;AACpC,aAAS,GAAG,OAAO,MAAM,GAAG,QAAQ,IAAI,GAAG,OAAO,KAAK;AAAA,EACzD,OAAO;AACL,aAAS,GAAG,OAAO,GAAG,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,EACvD;AAEA,MAAI,OAAO,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO;AAEtD,MAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,QAAW;AAC5C,YAAQ;AAAA,OAAU,OAAO,GAAG,QAAQ,MAAM,GAAG,GAAG,OAAO,KAAK;AAAA,EAC9D;AAEA,SAAO;AACT;AAKO,SAAS,kBAAkB,QAAsB,SAAwB;AAC9E,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,sBAAsB,OAAO,KAAK;AAAA,CAAI;AACzE,UAAQ,OAAO,MAAM,uBAAuB;AAC5C,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,YAAY,OAAO,OAAO;AAAA,CAAI;AACnD,UAAQ,OAAO,MAAM,YAAY,OAAO,WAAW;AAAA,CAAI;AACvD,UAAQ,OAAO,MAAM,IAAI;AAEzB,UAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,oBAAoB,OAAO,KAAK;AAAA,CAAI;AACvE,UAAQ,OAAO,MAAM,IAAI;AAEzB,aAAW,SAAS,OAAO,QAAQ;AACjC,YAAQ,OAAO,MAAM,YAAY,KAAK,IAAI,IAAI;AAAA,EAChD;AAEA,UAAQ,OAAO,MAAM,IAAI;AAEzB,QAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,MAAM,EAAE;AAClF,QAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,MAAM,EAAE;AAElF,MAAI,OAAO,WAAW;AACpB,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI,sCAAsC,OAAO,KAAK;AAAA;AAAA,IACjF;AACA,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO,MAAM,GAAG,OAAO,IAAI,cAAc,OAAO,KAAK;AAAA,CAAI;AACjE,YAAQ,OAAO,MAAM,qEAAqE;AAC1F,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,6DAA6D;AAAA,EACpF,WAAW,cAAc,GAAG;AAC1B,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,MAAM,GAAG,OAAO,IAAI,iBAAiB,OAAO,SAAS,CAAC,6CAAwC,OAAO,KAAK;AAAA;AAAA,IACtH;AACA,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO,MAAM,kEAAkE;AACvF,YAAQ,OAAO,MAAM,gEAAgE;AAAA,EACvF,OAAO;AACL,YAAQ,OAAO;AAAA,MACb,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,wBAAwB,OAAO,SAAS,CAAC,uBAAuB,OAAO,SAAS,CAAC,cAAc,OAAO,KAAK;AAAA;AAAA,IACxI;AACA,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,OAAO,MAAM,uDAAuD;AAAA,EAC9E;AAEA,UAAQ,OAAO,MAAM,IAAI;AAEzB,MAAI,SAAS;AACX,YAAQ,OAAO,MAAM,GAAG,OAAO,GAAG,aAAa,OAAO,OAAO,UAAU,CAAC,KAAK,OAAO,KAAK;AAAA,CAAI;AAC7F,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AACF;AAUA,eAAsB,cAAc,SAAyC;AAC3E,QAAM,SAAS,MAAM,UAAU;AAC/B,oBAAkB,QAAQ,QAAQ,OAAO;AACzC,SAAO,OAAO,iBAAiB,IAAI;AACrC;;;Ab1WA,SAASC,WAAU,MAAoB;AACrC,UAAQ,OAAO,MAAM,OAAO,IAAI;AAClC;AAKA,SAASC,kBAAuB;AAC9B,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAKA,SAAS,eAAe,WAA4B,SAAmC;AACrF,EAAAD,WAAU,aAAa,mBAAmB,CAAC;AAC3C,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,MAAI,UAAU,SAAS;AACrB,IAAAA,WAAU,UAAU,OAAO;AAC3B,IAAAA,WAAU,sCAAsC;AAAA,EAClD,OAAO;AACL,IAAAA,WAAU,WAAW,UAAU,OAAO,EAAE;AACxC,QAAI,YAAY,QAAW;AACzB,MAAAC,gBAAe;AACf,MAAAD,WAAU,wBAAwB;AAClC,MAAAC,gBAAe;AACf,MAAAD,WAAU,gBAAgB,qCAAqC,OAAO,GAAG,CAAC;AAAA,IAC5E;AAAA,EACF;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,eAAe,WAAyB;AAC/C,EAAAD,WAAU,aAAa,YAAY,CAAC;AACpC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,EAAAA,WAAU,YAAY,SAAS,EAAE;AACjC,EAAAA,WAAU,wDAAwD;AAClE,EAAAC,gBAAe;AACjB;AAMA,SAAS,iBAAiB,YAA8B,SAAmC;AACzF,EAAAD,WAAU,aAAa,qBAAqB,CAAC;AAC7C,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,MAAI,WAAW,SAAS;AACtB,IAAAA,WAAU,WAAW,OAAO;AAC5B,IAAAA,WAAU,4DAA4D;AAAA,EACxE,OAAO;AACL,IAAAA,WAAU,SAAS,WAAW,OAAO,EAAE;AACvC,QAAI,YAAY,QAAW;AACzB,MAAAC,gBAAe;AACf,MAAAD,WAAU,mDAAmD;AAC7D,MAAAC,gBAAe;AACf,MAAAD,WAAU,gBAAgB,OAAO,CAAC;AAAA,IACpC;AAAA,EACF;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,cAAc,UAAmC;AACxD,EAAAD,WAAU,aAAa,UAAU,CAAC;AAClC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,aAAW,WAAW,UAAU;AAC9B,IAAAA,WAAU,UAAK,OAAO,EAAE;AAAA,EAC1B;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,YAAY,QAAiC;AACpD,EAAAD,WAAU,aAAa,QAAQ,CAAC;AAChC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,aAAW,SAAS,QAAQ;AAC1B,IAAAA,WAAU,UAAK,KAAK,EAAE;AAAA,EACxB;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,eAAe,eAAwB,eAA8B;AAC5E,EAAAD,WAAU,aAAa,YAAY,CAAC;AACpC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,MAAI,iBAAiB,CAAC,eAAe;AACnC,IAAAA,WAAU,uCAAuC;AACjD,IAAAA,WAAU,wBAAwB;AAAA,EACpC;AACA,EAAAA,WAAU,6BAA6B;AACvC,EAAAA,WAAU,gDAAgD;AAC1D,EAAAC,gBAAe;AACjB;AAKA,SAAS,WAAW,OAA6B,SAAwB;AACvE,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,aAAa,KAAK,MAAM;AACvC,UAAM,WAAW,KAAK,eAAe,SAAY,KAAK,OAAO,KAAK,UAAU,CAAC,QAAQ;AACrF,IAAAD,WAAU,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,UAAU,WAAW,EAAE,EAAE;AAC5D,QAAI,KAAK,YAAY,WAAc,WAAW,KAAK,WAAW,WAAW;AACvE,MAAAA,WAAU,KAAK,KAAK,OAAO,EAAE;AAAA,IAC/B;AAAA,EACF;AACA,EAAAC,gBAAe;AACjB;AAKA,SAAS,aAAa,SAAwB;AAC5C,QAAM,UAAU,UAAU,yCAAoC;AAC9D,EAAAD,WAAU,UAAU,WAAW,OAAO,YAAY,WAAW,OAAO,SAAS;AAC7E,EAAAC,gBAAe;AACjB;AASA,SAAS,iBAAiB,aAAgE;AACxF,QAAM,OAAO,gBAAgB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,MAAM,kBAAkB,WAAW;AAEzC,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,aAAa,IAAI,QAAQ,iBAAiB,IAAI,UAAU,YAAa,IAAI,UAAU,WAAW,cAAe,WAAW;AAAA,MACjI,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAGA,IAAM,sBAAsB;AAM5B,SAAS,sBAAwE;AAC/E,QAAM,OAAO,gBAAgB;AAC7B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,WAAqB,CAAC;AAE5B,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,OAAO,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACnD,QAAM,SAAS,SAAS;AAExB,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,WAAW,OAAO,qBAAgB,OAAO,mBAAmB,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,YAAY;AACpC,QAAM,UAAU,SACZ,WAAW,OAAO,YAAY,OAAO,mBAAmB,CAAC,oBACzD,WAAW,OAAO,YAAO,OAAO,mBAAmB,CAAC;AAExD,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,cACP,QACA,SACA,WACA,SACA,WACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,KAAsB,SAAsC;AACpF,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,MAAI,QAAQ,SAAS;AACnB,WAAO,cAAc,WAAW,wBAAwB,SAAS;AAAA,EACnE;AAEA,QAAM,SAAS,CAAC,IAAI,UAAU;AAC9B,QAAM,UAAU,mBAAmB,MAAM;AAEzC,MAAI,CAAC,IAAI,UAAU,WAAW;AAC5B,UAAMC,aAA6B;AAAA,MACjC,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,mBAAmB,QAAQ,QAAQ,OAAO,QAAQ,KAAK;AACzE,QAAM,SAAS,UAAU,UACrB,UAAU,oBACR,YACA,YACF;AACJ,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,UAAU,UAAU,SAAY;AAAA,IAChC;AAAA,EACF;AACF;AAGA,SAAS,gBACP,QACA,SACA,WACA,WACoD;AACpD,SAAO;AAAA,IACL,MAAM,EAAE,MAAM,cAAc,QAAQ,SAAS,YAAY,gBAAgB,EAAE,IAAI,IAAI,UAAU;AAAA,IAC7F;AAAA,EACF;AACF;AAGA,SAAS,gBACP,QACA,SACA,WACA,YACgG;AAChG,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,IACA,aAAa,YAAY,YAAY,QAAQ,oBAAoB,IAAI;AAAA,IACrE;AAAA,EACF;AACF;AAKA,SAAS,aACP,KACA,SACoD;AACpD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,MAAI,QAAQ,WAAW;AACrB,WAAO,gBAAgB,WAAW,0BAA0B,SAAS;AAAA,EACvE;AAEA,QAAM,YAAY,iBAAiB,IAAI,YAAY,IAAI;AACvD,MAAIC,YAAW,SAAS,KAAK,CAAC,QAAQ,OAAO;AAC3C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,cAAc,gBAAgB,IAAI,YAAY,MAAM,QAAQ,MAAM;AACxE,UAAM,MAAM,QAAQ,SAAS,iBAAiB,WAAW,KAAK,YAAY,WAAW;AACrF,WAAO,gBAAgB,WAAW,KAAK,WAAW,WAAW;AAAA,EAC/D,SAAS,OAAO;AACd,UAAM,MAAM,gBAAgB,KAAK;AACjC,WAAO,gBAAgB,UAAU,gCAAgC,GAAG,IAAI,SAAS;AAAA,EACnF;AACF;AAMA,SAAS,aACP,KACA,SACgG;AAChG,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,MAAI,QAAQ,WAAW;AACrB,WAAO,gBAAgB,WAAW,0BAA0B,SAAS;AAAA,EACvE;AAGA,MAAI,CAAC,IAAI,UAAU,WAAW;AAC5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,eAAe,QAAQ,KAAK;AAC/C,QAAM,SAAS,WAAW,UACtB,WAAW,oBACT,YACA,YACF;AAEJ,SAAO,gBAAgB,QAAQ,WAAW,SAAS,WAAW,UAAU;AAC1E;AAKA,SAAS,gBAAgB,SAAkC;AACzD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,cAAc;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,kBAAkB;AAClC,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,gBAAgB,QAAQ,cAAc;AAAA,MACtE,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,SAAS,kBAAkB,QAAQ,OAAO,QAAQ,MAAM;AAC9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,oBAAoB,YAAY,YAAa;AAAA,IAC9E,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAKA,SAAS,cAAc,SAAkC;AACvD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,YAAY;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,gBAAgB;AAChC,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,cAAc,QAAQ,cAAc;AAAA,MACpE,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,SAAS,gBAAgB,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,KAAK;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,oBAAoB,YAAY,YAAa;AAAA,IAC9E,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAKA,SAAS,eAAe,SAAuE;AAC7F,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,QAAM,gBAAgB,oBAAoB,QAAQ,MAAM;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,cAAc,UAClB,cAAc,QAAQ,SAAS,IAC7B,YACA,YACF;AAAA,MACJ,SAAS,cAAc,UACnB,cAAc,QAAQ,SAAS,IAC7B,WAAW,OAAO,cAAc,QAAQ,MAAM,CAAC,iBAC/C,kCACF,WAAW,cAAc,SAAS,eAAe;AAAA,MACrD,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,IACA,QAAQ;AAAA,EACV;AACF;AAKA,SAAS,aAAa,SAAkC;AACtD,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,WAAW;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,UAAU,eAAe;AAC/B,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,uBAAuB,aAAa,QAAQ,cAAc;AAAA,MACnE,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,IACxC;AAAA,EACF;AACA,QAAM,SAAS,eAAe,QAAQ,OAAO,QAAQ,MAAM;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,oBAAoB,YAAY,YAAa;AAAA,IAC9E,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAKA,SAAS,cAAc,aAAqB,SAAkC;AAC5E,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,MAAI,QAAQ,YAAY;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM,SAAS,kBAAkB,aAAa,QAAQ,OAAO,QAAQ,MAAM;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,OAAO,UAAW,OAAO,UAAU,YAAY,YAAa;AAAA,IACpE,SAAS,OAAO;AAAA,IAChB,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AAGA,SAAS,gBAAgB,OAA6B,MAAc,OAAuB;AACzF,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC9C,QAAM,KAAK,MAAM,WAAW,aAAa,MAAM,WAAW;AAC1D,SAAO,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK;AACtC;AAMA,SAAS,kBAAkB,OAAwC;AACjE,QAAM,YAAY,gBAAgB,EAAE,IAAI;AAExC,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,SAAS,KAAK,CAAC;AAC3D,QAAM,YAAY,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAChE,QAAM,WACJ,YAAY,IACR,GAAG,OAAO,SAAS,CAAC,0BACpB,GAAG,OAAO,SAAS,MAAM,CAAC;AAEhC,QAAM,UAAU;AAAA,IACd;AAAA,IACA,gBAAgB,OAAO,kBAAkB,WAAW;AAAA,IACpD,gBAAgB,OAAO,iBAAiB,QAAQ;AAAA,EAClD;AACA,QAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC;AAE1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,YAAY,YAAY;AAAA,IAChC,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC9B,YAAY,gBAAgB,EAAE,IAAI,IAAI;AAAA,EACxC;AACF;AASA,SAAS,qBAAqB,UAAoB,WAA0B;AAC1E,MAAI,CAAC,WAAW;AACd,aAAS;AAAA,MACP;AAAA,IACF;AACA,aAAS,KAAK,8EAA8E;AAAA,EAC9F;AACF;AAKA,SAAS,cAAc,OAAuC;AAC5D,SAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,EAAE,IAAI,SAAS;AAC9F;AAgBA,SAAS,aAAa,QAAiE;AACrF,SAAO,QAAQ,YAAY,QAAQ,CAAC,OAAO;AAC7C;AAGA,SAAS,iBAAiB,KAAsC;AAC9D,QAAM,SAAS,cAAc,IAAI,KAAK;AACtC,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,OAAO,IAAI;AAAA,IACX,UAAU,IAAI;AAAA,IACd;AAAA,IACA,YAAY,gBAAgB,EAAE,IAAI,IAAI,IAAI;AAAA,IAC1C,GAAI,aAAa,IAAI,SAAS,KAAK,EAAE,eAAe,KAAK;AAAA,IACzD,GAAI,IAAI,YAAY,UAAa,EAAE,YAAY,IAAI,QAAQ;AAAA,IAC3D,GAAI,aAAa,IAAI,UAAU,KAAK,EAAE,iBAAiB,KAAK;AAAA,IAC5D,GAAI,IAAI,gBAAgB,UAAa,EAAE,aAAa,IAAI,YAAY;AAAA,IACpE,GAAI,IAAI,cAAc,UAAa,EAAE,WAAW,IAAI,UAAU;AAAA,IAC9D,GAAI,IAAI,kBAAkB,UAAa;AAAA,MACrC,aAAa,IAAI,cAAc;AAAA,MAC/B,iBAAiB,IAAI,cAAc,QAAQ;AAAA,IAC7C;AAAA,EACF;AACF;AASO,SAAS,SAAS,UAAiC,CAAC,GAAgB;AACzE,QAAM,YAAY,gBAAgB,EAAE,IAAI;AACxC,QAAM,gBAAgB,mBAAmB,MAAM,OAAO;AACtD,QAAM,cAAc,QAAQ,IAAI;AAEhC,QAAM,WAAqB,CAAC;AAG5B,QAAM,EAAE,KAAK,MAAM,cAAc,IAAI,iBAAiB,WAAW;AACjE,uBAAqB,UAAU,IAAI,UAAU,SAAS;AAGtD,QAAM,EAAE,MAAM,YAAY,UAAU,eAAe,IAAI,oBAAoB;AAC3E,WAAS,KAAK,GAAG,cAAc;AAG/B,QAAM,EAAE,MAAM,SAAS,SAAS,UAAU,IAAI,iBAAiB,KAAK,aAAa;AAGjF,QAAM,EAAE,MAAM,WAAW,UAAU,IAAI,aAAa,KAAK,aAAa;AAGtE,QAAM,EAAE,MAAM,WAAW,aAAa,WAAW,IAAI,aAAa,KAAK,aAAa;AAGpF,QAAM,EAAE,MAAM,aAAa,QAAQ,cAAc,IAAI,eAAe,aAAa;AAGjF,QAAM,eAAe,gBAAgB,aAAa;AAGlD,QAAM,aAAa,cAAc,aAAa;AAG9C,QAAM,YAAY,aAAa,aAAa;AAE5C,QAAM,aAAa,cAAc,aAAa,aAAa;AAC3D,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,KAAK,kBAAkB,KAAK,CAAC;AAEnC,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAGA,SAAS,oBAAoB,QAA2B;AACtD,MAAI,OAAO,eAAe,UAAa,OAAO,kBAAkB,MAAM;AACpE,UAAM,YACJ,OAAO,kBAAkB,OACrB;AAAA,MACE,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX,IACA,EAAE,SAAS,OAAO,mBAAmB,OAAO,SAAS,gCAAgC;AAC3F,mBAAe,WAAW,OAAO,UAAU;AAAA,EAC7C;AACA,MAAI,OAAO,gBAAgB,UAAa,OAAO,oBAAoB,MAAM;AACvE,UAAM,aACJ,OAAO,oBAAoB,OACvB;AAAA,MACE,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX,IACA,EAAE,SAAS,OAAO,mBAAmB,OAAO,SAAS,gCAAgC;AAC3F,qBAAiB,YAAY,OAAO,WAAW;AAAA,EACjD;AACA,MAAI,OAAO,cAAc,OAAW,gBAAe,OAAO,SAAS;AACnE,MAAI,OAAO,gBAAgB,OAAW,qBAAoB,MAAM;AAChE,6BAA2B;AAC7B;AAGA,SAAS,6BAAmC;AAC1C,QAAM,UAAU,2BAA2B,KAAK;AAChD,QAAM,SAAS,uBAAuB,OAAO;AAC7C,EAAAH,WAAU,MAAM;AAClB;AAGA,SAAS,oBAAoB,QAA2B;AACtD,EAAAA,WAAU,aAAa,gBAAgB,CAAC;AACxC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,QAAM,QAAQ,OAAO,mBAAmB;AACxC,QAAM,MACJ,QAAQ,IACJ,WAAW,OAAO,KAAK,CAAC,sBAAsB,OAAO,eAAe,EAAE,KACtE,oCAAoC,OAAO,eAAe,EAAE;AAClE,EAAAA,WAAU,GAAG;AACb,EAAAC,gBAAe;AACjB;AAKO,SAAS,iBAAiB,QAAqB,SAAwB;AAC5E,EAAAA,gBAAe;AACf,EAAAD,WAAU,aAAa,uBAAuB,OAAO,EAAE,CAAC;AACxD,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AACxB,EAAAC,gBAAe;AAEf,aAAW,OAAO,OAAO,OAAO;AAChC,sBAAoB,MAAM;AAE1B,MAAI,OAAO,SAAS,SAAS,EAAG,eAAc,OAAO,QAAQ;AAC7D,MAAI,OAAO,OAAO,SAAS,EAAG,aAAY,OAAO,MAAM;AACvD,iBAAe,OAAO,kBAAkB,MAAM,OAAO,eAAe,MAAS;AAC7E,eAAa,OAAO,OAAO;AAC7B;AAaA,SAAS,0BAA0B,eAA8B;AAC/D,EAAAA,gBAAe;AACf,EAAAD,WAAU,aAAa,iBAAiB,CAAC;AACzC,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AAExB,EAAAA,WAAU,6EAAwE;AAClF,MAAI,eAAe;AACjB,IAAAA,WAAU,8EAAyE;AAAA,EACrF,OAAO;AACL,IAAAA,WAAU,iEAA4D;AAAA,EACxE;AACA,EAAAA,WAAU,uEAAkE;AAE5E,EAAAC,gBAAe;AACf,EAAAD,WAAU,KAAK,OAAO,GAAG,yDAAyD,OAAO,KAAK,EAAE;AAChG,EAAAA,WAAU,KAAK,OAAO,GAAG,uDAAuD,OAAO,KAAK,EAAE;AAChG;AAYA,eAAe,uBAAuB,QAAmC;AACvE,MAAI,OAAQ,QAAO;AAEnB,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,SAAS,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AACrD,QAAM,QAAQ,OAAO,OAAO;AAE5B,EAAAC,gBAAe;AACf,EAAAD,WAAU,aAAa,iBAAiB,OAAO,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC;AAClF,EAAAA,WAAU,SAAI,OAAO,EAAE,CAAC;AAExB,aAAW,SAAS,OAAO,QAAQ;AACjC,QAAI;AACJ,QAAI,MAAM,QAAQ;AAChB,eAAS,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,IACzD,WAAW,MAAM,aAAa,QAAQ;AACpC,eAAS,GAAG,OAAO,MAAM,GAAG,QAAQ,IAAI,GAAG,OAAO,KAAK;AAAA,IACzD,OAAO;AACL,eAAS,GAAG,OAAO,GAAG,GAAG,QAAQ,KAAK,GAAG,OAAO,KAAK;AAAA,IACvD;AACA,IAAAA,WAAU,KAAK,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AACvD,QAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,QAAW;AAC5C,MAAAA,WAAU,QAAQ,OAAO,GAAG,eAAU,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE;AAAA,IAClE;AAAA,EACF;AAEA,EAAAC,gBAAe;AACf,MAAI,CAAC,OAAO,gBAAgB;AAC1B,IAAAD;AAAA,MACE,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,4EAA4E,OAAO,KAAK;AAAA,IACrH;AAAA,EACF,WAAW,CAAC,OAAO,WAAW;AAC5B,UAAM,YAAY,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE;AACzD,IAAAA;AAAA,MACE,GAAG,OAAO,MAAM,GAAG,OAAO,IAAI,uBAAuB,OAAO,SAAS,CAAC,2EAAsE,OAAO,KAAK;AAAA,IAC1J;AAAA,EACF,OAAO;AACL,IAAAA;AAAA,MACE,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI,mDAAmD,OAAO,KAAK;AAAA,IAC9F;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAOO,SAAS,aAAa,UAAiC,CAAC,GAAW;AACxE,QAAM,gBAAgB,mBAAmB,MAAM,OAAO;AAGtD,MAAI,CAAC,cAAc,KAAK,CAAC,cAAc,gBAAgB;AACrD,IAAAA,WAAU,uCAAuC;AACjD,IAAAA,WAAU,4CAA4C;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,OAAO;AAC/B,mBAAiB,QAAQ,cAAc,OAAO;AAE9C,SAAO,OAAO,UAAU,IAAI;AAC9B;AAuBA,eAAe,oBAAoB,SAA+C;AAChF,QAAM,gBAAgB,MAAM,UAAU;AACtC,MAAI,kBAAkB,OAAW,QAAO;AAExC,QAAM,gBAAgB,EAAE,GAAG,SAAS,GAAG,cAAc;AACrD,SAAO,cAAc;AAErB,QAAM,SAAS,SAAS,aAAa;AACrC,mBAAiB,QAAQ,cAAc,WAAW,KAAK;AACvD,QAAM,WAAW,MAAM,uBAAuB,cAAc,UAAU,KAAK;AAC3E,MAAI,OAAO,WAAW,EAAE,cAAc,UAAU,QAAQ;AACtD,8BAA0B,OAAO,kBAAkB,IAAI;AAAA,EACzD;AACA,SAAO,OAAO,WAAW,WAAW,IAAI;AAC1C;AAEA,eAAsB,kBAAkB,UAA+B,CAAC,GAAoB;AAC1F,MAAI,QAAQ,gBAAgB,MAAM;AAChC,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAGA,QAAM,cAAc,iBAAiB,OAAO;AAC5C,QAAM,WAAW,MAAM,uBAAuB,QAAQ,UAAU,KAAK;AACrE,MAAI,YAAY,aAAa,KAAK,EAAE,QAAQ,UAAU,QAAQ;AAC5D,8BAA0B,YAAY,aAAa;AAAA,EACrD;AAEA,SAAO,YAAY,aAAa,KAAK,CAAC,WAAW,IAAI;AACvD;AAOA,SAAS,iBAAiB,SAGxB;AACA,QAAM,gBAAgB,mBAAmB,MAAM,OAAO;AACtD,MAAI,CAAC,cAAc,KAAK,CAAC,cAAc,gBAAgB;AACrD,IAAAA,WAAU,uCAAuC;AACjD,IAAAA,WAAU,4CAA4C;AACtD,WAAO,EAAE,UAAU,GAAG,eAAe,MAAM;AAAA,EAC7C;AACA,QAAM,SAAS,SAAS,OAAO;AAC/B,mBAAiB,QAAQ,cAAc,OAAO;AAC9C,SAAO,EAAE,UAAU,OAAO,UAAU,IAAI,GAAG,eAAe,OAAO,kBAAkB,KAAK;AAC1F;","names":["existsSync","execSync","homedir","join","execSync","execSync","readFileSync","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","execFileSync","execFileSync","join","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","homedir","logger","join","homedir","isAlreadyConfigured","existsSync","readFileSync","mkdirSync","writeFileSync","execFileSync","logger","isAlreadyConfigured","execFileSync","addMcpServer","resolve","writeLine","writeEmptyLine","mcpResult","existsSync"]}