@jvittechs/jai1-cli 0.1.58 → 0.1.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/errors/index.ts","../package.json","../src/services/config.service.ts","../src/services/version-check.service.ts","../src/commands/framework/auth.ts","../src/services/tracking.service.ts","../src/commands/status.ts","../src/services/components.service.ts","../src/commands/apply.ts","../src/ui/apply/UnifiedApplyApp.tsx","../src/ui/shared/ProgressBar.tsx","../src/ui/shared/StatusIcon.tsx","../src/ui/shared/theme.ts","../src/commands/update.ts","../src/commands/framework/check.ts","../src/commands/ide/index.ts","../src/commands/ide/context.ts","../src/ui/context/ContextApp.tsx","../src/ui/context/views/MainMenuView.tsx","../src/ui/context/views/IDEOverviewView.tsx","../src/ui/context/views/ListView.tsx","../src/ui/context/views/DetailView.tsx","../src/services/context-scanner.service.ts","../src/constants/ide-configs.ts","../src/commands/ide/setup.ts","../src/commands/ide/sync.ts","../src/services/migrate-ide.service.ts","../src/constants/ide-migration-configs.ts","../src/commands/learn.ts","../src/ui/guide/GuideApp.tsx","../src/ui/guide/views/MenuView.tsx","../src/ui/guide/views/IntroView.tsx","../src/ui/guide/components/ContentView.tsx","../src/ui/guide/views/RulesView.tsx","../src/ui/guide/views/WorkflowsView.tsx","../src/ui/guide/views/PromptsView.tsx","../src/ui/guide/views/SkillsView.tsx","../src/ui/guide/views/AgenticGuideView.tsx","../src/commands/chat.ts","../src/services/llm-proxy.service.ts","../src/ui/llm/LlmApp.tsx","../src/ui/llm/hooks/useChat.ts","../src/ui/llm/hooks/useLlmApi.ts","../src/ui/llm/components/ChatPanel.tsx","../src/ui/llm/components/MessageItem.tsx","../src/ui/llm/components/InputBox.tsx","../src/ui/llm/components/ModelSelector.tsx","../src/commands/api-keys.ts","../src/commands/translate.ts","../src/services/translation.service.ts","../src/commands/upgrade.ts","../src/commands/clean.ts","../src/commands/redmine/check.ts","../src/services/redmine-config.service.ts","../src/types/redmine.types.ts","../src/api.ts","../src/services/redmine-connectivity.service.ts","../src/commands/redmine/sync-issue.ts","../src/sync-issue.ts","../src/mappers.ts","../src/slug.util.ts","../src/file.util.ts","../src/commands/redmine/sync-project.ts","../src/sync-project.ts","../src/commands/framework/info.ts","../src/commands/self-update.ts","../src/commands/clear-backups.ts","../src/commands/vscode/index.ts","../src/commands/guide.ts","../src/commands/context.ts","../src/commands/migrate-ide.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { Jai1Error } from './errors/index.js';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { checkForClientUpdate } from './services/version-check.service.js';\n\n// ============================================\n// SETUP & AUTH COMMANDS\n// ============================================\nimport { createAuthCommand } from './commands/framework/auth.js';\nimport { createStatusCommand } from './commands/status.js';\n\n// ============================================\n// COMPONENT MANAGEMENT COMMANDS\n// ============================================\nimport { createApplyCommand } from './commands/apply.js';\nimport { createUpdateCommand } from './commands/update.js';\nimport { createCheckCommand } from './commands/framework/check.js';\n\n// ============================================\n// IDE COMMANDS (grouped)\n// ============================================\nimport { createIdeCommand } from './commands/ide/index.js';\n\n// ============================================\n// LEARNING COMMAND\n// ============================================\nimport { createLearnCommand } from './commands/learn.js';\n\n// ============================================\n// LLM PROXY COMMAND\n// ============================================\nimport { createChatCommand } from './commands/chat.js';\nimport { createApiKeysCommand } from './commands/api-keys.js';\nimport { createTranslateCommand } from './commands/translate.js';\n\n// ============================================\n// MAINTENANCE COMMANDS\n// ============================================\nimport { createUpgradeCommand } from './commands/upgrade.js';\nimport { createCleanCommand } from './commands/clean.js';\n\n// ============================================\n// EXTERNAL INTEGRATIONS\n// ============================================\nimport { createRedmineCheckCommand } from './commands/redmine/check.js';\nimport { createSyncIssueCommand } from './commands/redmine/sync-issue.js';\nimport { createSyncProjectCommand } from './commands/redmine/sync-project.js';\n\n// ============================================\n// LEGACY ALIASES (for backward compatibility)\n// ============================================\nimport { createInfoCommand } from './commands/framework/info.js';\nimport { createSelfUpdateCommand } from './commands/self-update.js';\nimport { createClearBackupsCommand } from './commands/clear-backups.js';\nimport { createVSCodeCommand } from './commands/vscode/index.js';\nimport { createGuideCommand } from './commands/guide.js';\nimport { createContextCommand } from './commands/context.js';\nimport { createMigrateIdeCommand } from './commands/migrate-ide.js';\n\nconst program = new Command();\n\n// Manual version check to support update checking\nif (process.argv.includes('-v') || process.argv.includes('--version')) {\n console.log(packageJson.version);\n // Check for updates\n if (!process.argv.includes('--skip-update-check')) {\n await checkForClientUpdate();\n }\n process.exit(0);\n}\n\nprogram\n .name('jai1')\n .description('Jai1 Framework Management CLI')\n// .version() removed to custom handle update check (handled above)\n\n// Global options\nprogram\n // .option('-v, --version', 'output the version number') // Handled manually\n .option('--verbose', 'Enable verbose logging')\n .option('--json', 'Output results as JSON')\n .option('--skip-update-check', 'Skip checking for client updates');\n\n// ============================================\n// 🔧 SETUP & INFO\n// ============================================\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createStatusCommand());\n\n// ============================================\n// 📦 COMPONENT MANAGEMENT\n// ============================================\nprogram.addCommand(createApplyCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createCheckCommand());\n\n// ============================================\n// 🖥️ IDE INTEGRATION (grouped)\n// ============================================\nprogram.addCommand(createIdeCommand());\n\n// ============================================\n// 📚 LEARNING\n// ============================================\nprogram.addCommand(createLearnCommand());\n\n// ============================================\n// 🤖 LLM PROXY\n// ============================================\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createApiKeysCommand());\nprogram.addCommand(createTranslateCommand());\n\n// ============================================\n// 🔧 MAINTENANCE\n// ============================================\nprogram.addCommand(createUpgradeCommand());\nprogram.addCommand(createCleanCommand());\n\n// ============================================\n// 🔗 EXTERNAL INTEGRATIONS\n// ============================================\nconst redmineCommand = new Command('redmine')\n .description('Redmine context sync commands');\n\nredmineCommand.addCommand(createRedmineCheckCommand());\n\nconst syncCommand = new Command('sync')\n .description('Sync Redmine issues to markdown files');\n\nsyncCommand.addCommand(createSyncIssueCommand());\nsyncCommand.addCommand(createSyncProjectCommand());\n\nredmineCommand.addCommand(syncCommand);\n\nprogram.addCommand(redmineCommand);\n\n// ============================================\n// 🔄 LEGACY ALIASES (backward compatibility)\n// Hidden from help, but still work\n// ============================================\n\n\n// Legacy: info -> status\nprogram.addCommand(createInfoCommand(), { hidden: true });\n\n// Legacy: self-update -> upgrade \nprogram.addCommand(createSelfUpdateCommand(), { hidden: true });\n\n// Legacy: clear-backups -> clean\nprogram.addCommand(createClearBackupsCommand(), { hidden: true });\n\n// Legacy: vscode -> ide setup\nprogram.addCommand(createVSCodeCommand(), { hidden: true });\n\n// Legacy: guide -> learn\nprogram.addCommand(createGuideCommand(), { hidden: true });\n\n// Legacy: context -> ide context\nprogram.addCommand(createContextCommand(), { hidden: true });\n\n// Legacy: migrate-ide -> ide sync\nprogram.addCommand(createMigrateIdeCommand(), { hidden: true });\n\n\n// Handle unknown commands\nprogram.on('command:*', (operands) => {\n console.error(`❌ Unknown command: ${operands[0]}`);\n console.error('\\nAvailable commands:');\n console.error('');\n console.error(' 🔧 Setup & Info');\n console.error(' auth Authenticate and configure jai1-client');\n console.error(' status Show configuration and installed components');\n console.error('');\n console.error(' 📦 Components');\n console.error(' apply Install/apply components (interactive UI)');\n console.error(' update Update installed components');\n console.error(' check Check for component updates');\n console.error('');\n console.error(' 🖥️ IDE');\n console.error(' ide context Browse and explore IDE context');\n console.error(' ide setup Configure IDE settings');\n console.error(' ide sync Sync .jai1 content to IDEs');\n console.error('');\n console.error(' 📚 Learning');\n console.error(' learn Interactive Agentic Coding guide');\n console.error('');\n console.error(' 🤖 LLM Proxy');\n console.error(' chat Interactive AI chat');\n console.error(' api-keys Show OpenAI-compatible API credentials');\n console.error(' translate Translate text, files, or folders using AI');\n console.error('');\n console.error(' 🔧 Maintenance');\n console.error(' upgrade Upgrade jai1-client to latest version');\n console.error(' clean Clean up backups and cache');\n console.error('');\n console.error(' 🔗 Integrations');\n console.error(' redmine Redmine integration commands');\n console.error('');\n console.error('Use \"jai1 --help\" for more information.');\n process.exit(1);\n});\n\n// Error handling\nprocess.on('unhandledRejection', (error) => {\n if (error instanceof Jai1Error) {\n console.error('❌', error.message);\n process.exit(error.exitCode);\n } else if (error instanceof Error) {\n console.error('❌ Unexpected error:', error.message);\n if (program.opts().verbose) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n});\n\n// Parse and execute\nprogram.parseAsync(process.argv).then(async () => {\n const opts = program.opts();\n\n // Check for client updates after command execution (unless skipped)\n if (!opts.skipUpdateCheck) {\n await checkForClientUpdate();\n }\n}).catch((error) => {\n console.error('❌', error.message);\n process.exit(1);\n});\n","/**\n * Base error class for jai1-client\n */\nexport class Jai1Error extends Error {\n constructor(\n message: string,\n public exitCode: number\n ) {\n super(message);\n this.name = 'Jai1Error';\n }\n}\n\n/**\n * Validation error (exit code 2)\n */\nexport class ValidationError extends Jai1Error {\n constructor(message: string) {\n super(message, 2);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication error (exit code 3)\n */\nexport class AuthenticationError extends Jai1Error {\n constructor(message: string) {\n super(message, 3);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Not found error (exit code 4)\n */\nexport class NotFoundError extends Jai1Error {\n constructor(message: string) {\n super(message, 4);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network/System error (exit code 5)\n */\nexport class NetworkError extends Jai1Error {\n constructor(message: string) {\n super(message, 5);\n this.name = 'NetworkError';\n }\n}\n","{\n \"name\": \"@jvittechs/jai1-cli\",\n \"version\": \"0.1.58\",\n \"description\": \"Unified CLI for Jai1 Framework Management and Redmine Context Sync\",\n \"type\": \"module\",\n \"bin\": {\n \"jai1\": \"dist/cli.js\"\n },\n \"exports\": {\n \".\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"redmine.config.example.yaml\",\n \"scripts/redmine-sync-issue.sh\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"license\": \"MIT\",\n \"author\": \"JVIT <dev@jvit.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jvittechs/jai.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://github.com/jvittechs/jai/tree/main/packages/cli#readme\",\n \"keywords\": [\n \"jai1\",\n \"framework\",\n \"redmine\",\n \"cli\",\n \"markdown\",\n \"issues\",\n \"context\",\n \"agentic\",\n \"coding\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/cli.ts --dts --format esm --target node22 --out-dir dist --sourcemap\",\n \"dev\": \"tsx src/cli.ts --help\",\n \"lint\": \"eslint .\",\n \"test\": \"vitest run\",\n \"release\": \"node scripts/release.js\",\n \"smart-publish\": \"node scripts/smart-publish.js\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.0.2\",\n \"adm-zip\": \"^0.5.16\",\n \"cli-progress\": \"^3.12.0\",\n \"clipboardy\": \"^4.0.0\",\n \"commander\": \"^12.1.0\",\n \"gray-matter\": \"^4.0.3\",\n \"ink\": \"^5.0.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"p-limit\": \"^5.0.0\",\n \"p-queue\": \"^7.4.1\",\n \"p-retry\": \"^6.2.0\",\n \"react\": \"^18.3.1\",\n \"slugify\": \"^1.6.6\",\n \"undici\": \"^6.19.5\",\n \"yaml\": \"^2.5.0\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.7\",\n \"@types/node\": \"^24.10.1\",\n \"@types/react\": \"^18.3.12\",\n \"@typescript-eslint/eslint-plugin\": \"^8.6.0\",\n \"@typescript-eslint/parser\": \"^8.6.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.9.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.6.3\",\n \"vitest\": \"^2.1.4\"\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { Jai1Config } from '../types/framework.types.js';\n\n/**\n * Service for managing Jai1 global configuration\n * Config stored in ~/.jai1/config.json\n */\nexport class ConfigService {\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor() {\n this.configDir = join(homedir(), '.jai1');\n this.configPath = join(this.configDir, 'config.json');\n }\n\n /**\n * Check if config file exists\n */\n async exists(): Promise<boolean> {\n try {\n await fs.access(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Load configuration from file\n * @returns Config object or null if not found\n */\n async load(): Promise<Jai1Config | null> {\n if (!(await this.exists())) {\n return null;\n }\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n return JSON.parse(content) as Jai1Config;\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Save configuration to file\n * Creates directory if it doesn't exist\n * Sets proper file permissions (600)\n */\n async save(config: Jai1Config): Promise<void> {\n try {\n // Ensure directory exists with restricted permissions\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 });\n\n // Write config with restricted permissions\n await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\n } catch (error) {\n throw new Error(\n `Failed to save config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Get config directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n}\n","import { ConfigService } from './config.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n// Cache to avoid checking too frequently\nlet lastCheckTime = 0;\nlet cachedLatestVersion: string | null = null;\nconst CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Check if there's a newer version of jai1-client available\n * This runs silently and only shows a message if update is available\n */\nexport async function checkForClientUpdate(): Promise<void> {\n try {\n // Check only once per hour\n const now = Date.now();\n if (now - lastCheckTime < CHECK_INTERVAL_MS && cachedLatestVersion) {\n if (isNewerVersion(cachedLatestVersion, packageJson.version)) {\n showUpdateNotification(cachedLatestVersion);\n }\n return;\n }\n\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n return; // Not initialized, skip check\n }\n\n // Fetch latest client version from API\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n\n if (!response.ok) {\n return; // Silently fail\n }\n\n const data = await response.json() as { version: string };\n lastCheckTime = now;\n cachedLatestVersion = data.version;\n\n if (isNewerVersion(data.version, packageJson.version)) {\n showUpdateNotification(data.version);\n }\n } catch {\n // Silently fail - don't interrupt user flow\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Show update notification to user\n */\nfunction showUpdateNotification(latestVersion: string): void {\n console.log('');\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${packageJson.version} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} Run: ${colors.cyan}jai1 upgrade${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}`);\n console.log('');\n}\n\n/**\n * Get current client version\n */\nexport function getClientVersion(): string {\n return packageJson.version;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { trackActionSync } from '../../services/tracking.service.js';\nimport { ValidationError, AuthenticationError } from '../../errors/index.js';\nimport type { InitOptions } from '../../types/framework.types.js';\n\n/**\n * Create auth command for Jai1 Framework\n * Allows both interactive and non-interactive modes\n */\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth')\n .description('Authenticate and configure jai1-client')\n .option('--api-url <url>', 'Jai1 Store API URL')\n .option('--access-key <key>', 'Your access key')\n .action(async (options: InitOptions) => {\n await handleAuth(options);\n });\n\n return cmd;\n}\n\nasync function handleAuth(options: InitOptions): Promise<void> {\n const configService = new ConfigService();\n\n let apiUrl: string;\n let accessKey: string;\n let isInteractive = false;\n\n // Check if config already exists\n const existingConfig = await configService.load();\n if (existingConfig) {\n console.log('⚠️ Configuration already exists at:', configService.getConfigPath());\n console.log(' Run this command again with new values to overwrite.');\n console.log('');\n }\n\n // Interactive vs Non-Interactive mode\n if (options.apiUrl && options.accessKey) {\n // Non-interactive mode\n apiUrl = options.apiUrl;\n accessKey = options.accessKey;\n } else if (options.apiUrl || options.accessKey) {\n // Partial options provided - error\n throw new ValidationError(\n 'Both --api-url and --access-key are required in non-interactive mode'\n );\n } else {\n // Interactive mode\n isInteractive = true;\n console.log('🚀 Jai1 Client Setup');\n console.log('─────────────────\\n');\n\n // For now, use simple readline until inquirer is installed\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n resolve(answer);\n });\n });\n };\n\n apiUrl = await question('API URL (https://store.jai1.io): ');\n if (!apiUrl) {\n apiUrl = 'https://store.jai1.io';\n }\n\n accessKey = await question('Access Key: ');\n if (!accessKey) {\n rl.close();\n throw new ValidationError('Access key is required');\n }\n\n rl.close();\n }\n\n // Validate API URL format\n try {\n new URL(apiUrl);\n } catch {\n throw new ValidationError('Invalid API URL format');\n }\n\n console.log('\\nValidating access key...');\n\n // TODO: Validate access key with API\n // For now, just save it\n // const isValid = await validateAccessKey(apiUrl, accessKey);\n // if (!isValid) {\n // throw new AuthenticationError('Invalid access key');\n // }\n\n // Save config\n await configService.save({\n apiUrl,\n accessKey,\n version: null,\n lastUpdated: null,\n });\n\n // Track auth action (sync to ensure it completes before exit)\n await trackActionSync('auth', {\n configPath: configService.getConfigPath(),\n mode: isInteractive ? 'interactive' : 'non-interactive',\n isReconfig: !!existingConfig,\n });\n\n console.log('✓ Configuration saved to', configService.getConfigPath());\n console.log('');\n console.log(\"You're all set! Run 'jai1 check' to check for updates.\");\n}\n","import { ConfigService } from './config.service.js';\nimport { platform, release, arch, hostname, homedir } from 'os';\nimport { version as nodeVersion } from 'process';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tracking action categories\n */\nexport type TrackingAction =\n | 'init'\n | 'download'\n | 'version_check'\n | 'sync'\n | 'update'\n | 'redmine_check'\n | 'redmine_sync_issue'\n | 'redmine_sync_project'\n | 'vscode'\n | 'info'\n | 'check';\n\nexport interface TrackingDetail {\n [key: string]: unknown;\n}\n\n/**\n * Get basic system info for logging\n */\nfunction getSystemInfo(): Record<string, string> {\n return {\n os: platform(),\n osRelease: release(),\n arch: arch(),\n nodeVersion: nodeVersion,\n hostname: hostname(),\n homeDir: homedir(),\n };\n}\n\n/**\n * Service for tracking CLI usage to server\n * Tracking is fire-and-forget, errors are silently ignored\n */\nexport class TrackingService {\n private configService: ConfigService;\n\n constructor() {\n this.configService = new ConfigService();\n }\n\n /**\n * Track a CLI action (fire-and-forget)\n * WARNING: Process may exit before request completes\n * Use trackSync for important events\n *\n * @param action - The action being performed\n * @param detail - Optional additional details\n */\n async track(action: TrackingAction, detail?: TrackingDetail): Promise<void> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n\n // Fire and forget - don't await\n this.sendTrackingEvent(trackUrl, config.accessKey, action, detail).catch(\n () => {\n // Silently ignore tracking errors\n }\n );\n } catch {\n // Silently ignore config errors\n }\n }\n\n /**\n * Track a CLI action synchronously (waits for completion)\n * Use this for important events before process exit\n */\n async trackSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return false;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n return await this.sendTrackingEvent(trackUrl, config.accessKey, action, detail);\n } catch {\n return false;\n }\n }\n\n private async sendTrackingEvent(\n trackUrl: string,\n accessKey: string,\n action: TrackingAction,\n detail?: TrackingDetail\n ): Promise<boolean> {\n try {\n // Merge detail with system info\n const enrichedDetail = {\n ...getSystemInfo(),\n ...detail,\n };\n\n const response = await fetch(trackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n action,\n detail: enrichedDetail,\n clientVersion: packageJson.version,\n }),\n // Timeout to avoid blocking too long\n signal: AbortSignal.timeout(10000),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// Singleton instance for convenience\nlet trackingInstance: TrackingService | null = null;\n\n/**\n * Get or create tracking service instance\n */\nexport function getTrackingService(): TrackingService {\n if (!trackingInstance) {\n trackingInstance = new TrackingService();\n }\n return trackingInstance;\n}\n\n/**\n * Convenience function to track an action (fire-and-forget)\n * WARNING: May not complete before process exit\n */\nexport function trackAction(action: TrackingAction, detail?: TrackingDetail): void {\n getTrackingService().track(action, detail);\n}\n\n/**\n * Convenience function to track an action synchronously\n * Use this for important events at end of commands\n */\nexport async function trackActionSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n return getTrackingService().trackSync(action, detail);\n}\n","/**\n * Status Command\n * Show jai1-client configuration and installed components status\n * \n * Renamed from 'info' to 'status' for clarity (common CLI pattern)\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../types/framework.types.js';\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Show configuration and installed components status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleStatus(options);\n });\n\n return cmd;\n}\n\nasync function handleStatus(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n const installedComponents = await componentsService.getInstalled();\n const componentCount = Object.keys(installedComponents).length;\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n componentCount,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('📊 Jai1 Client Status');\n console.log('─────────────────────\\n');\n\n // Configuration section\n console.log('🔧 Configuration');\n console.log(` Config: ${info.configPath}`);\n console.log(` API URL: ${info.apiUrl}`);\n console.log(` Access Key: ${info.accessKey}`);\n console.log();\n\n // Framework section\n console.log('📦 Framework');\n console.log(` Version: ${info.version}`);\n console.log(` Updated: ${info.lastUpdated}`);\n console.log(` Location: ${info.frameworkPath}`);\n console.log();\n\n // Project section\n console.log('📁 Project');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Components: ${componentCount} installed`);\n }\n console.log();\n\n // Quick tips\n if (!info.projectStatus.exists) {\n console.log('💡 Run \"jai1 apply\" to install components for this project.');\n } else if (componentCount > 0) {\n console.log('💡 Run \"jai1 check\" to check for component updates.');\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { gunzipSync } from 'zlib';\nimport { createHash } from 'crypto';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n/**\n * Component from API\n */\nexport interface Component {\n id: number;\n filepath: string;\n name: string;\n description: string | null;\n content: string | null;\n contentType: 'markdown' | 'bundle' | 'zip'; // 'zip' for legacy compatibility\n version: string;\n downloads: number;\n status: string;\n tags?: string[];\n dependencies?: { filepath: string; required: boolean }[];\n}\n\n/**\n * Tag from API\n */\nexport interface Tag {\n tag: string;\n count: number;\n}\n\n/**\n * Installed component info\n */\nexport interface InstalledComponent {\n filepath: string;\n version: string;\n checksum: string;\n installedAt: string;\n modified: boolean;\n}\n\n/**\n * Service for managing components\n */\nexport class ComponentsService {\n private readonly cacheDir: string;\n private readonly manifestFile: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.cacheDir = join(homedir(), '.jai1', 'cache');\n this.manifestFile = join(projectRoot, '.jai1', 'manifest.json');\n }\n\n /**\n * List components from API\n */\n async list(config: Jai1Config, options?: { tag?: string; search?: string }): Promise<Component[]> {\n const params = new URLSearchParams();\n if (options?.tag) params.set('tag', options.tag);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/components${params.toString() ? '?' + params.toString() : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * List available tags\n */\n async listTags(config: Jai1Config): Promise<Tag[]> {\n const response = await fetch(`${config.apiUrl}/api/tags`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list tags: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { tags: Tag[] };\n return data.tags;\n }\n\n /**\n * Get single component\n */\n async get(config: Jai1Config, filepath: string): Promise<Component> {\n const encodedPath = encodeURIComponent(filepath);\n const response = await fetch(`${config.apiUrl}/api/components/${encodedPath}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Component not found: ${filepath}`);\n }\n throw new NetworkError(`Failed to get component: HTTP ${response.status}`);\n }\n\n return await response.json() as Component;\n }\n\n /**\n * Get core components\n */\n async getCore(config: Jai1Config): Promise<Component[]> {\n const response = await fetch(`${config.apiUrl}/api/components/core`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get core components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * Download and install a component\n */\n async install(config: Jai1Config, filepath: string, targetDir: string): Promise<void> {\n const component = await this.get(config, filepath);\n\n if (!component.content) {\n throw new Error(`Component ${filepath} has no content`);\n }\n\n const targetPath = join(targetDir, filepath);\n const targetFolder = join(targetPath, '..');\n\n await fs.mkdir(targetFolder, { recursive: true });\n\n let checksumContent = component.content; // Default for simple types\n if (component.contentType === 'bundle' || component.contentType === 'zip') {\n // Decompress if gzipped (bundle type), or parse directly (legacy zip)\n let bundleJson: string;\n if (component.contentType === 'bundle') {\n // Gzipped base64 content\n const compressed = Buffer.from(component.content, 'base64');\n bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n } else {\n // Legacy: raw JSON string\n bundleJson = component.content;\n }\n\n const bundle = JSON.parse(bundleJson) as { main: string; assets: Record<string, string> };\n\n // Extract skill folder\n const skillDir = join(targetDir, filepath);\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write main SKILL.md\n await fs.writeFile(join(skillDir, 'SKILL.md'), bundle.main);\n\n // Write assets\n for (const [assetPath, content] of Object.entries(bundle.assets)) {\n if (assetPath === 'SKILL.md') continue;\n const assetFullPath = join(skillDir, assetPath);\n await fs.mkdir(join(assetFullPath, '..'), { recursive: true });\n await fs.writeFile(assetFullPath, content);\n }\n } else {\n // Checksum content for markdown is just the content\n // For bundle it was set above\n if (component.contentType === 'markdown') {\n checksumContent = component.content;\n }\n // Regular markdown file\n await fs.writeFile(targetPath, component.content);\n }\n\n // Update installed.json\n await this.markInstalled(filepath, component.version, this.calculateChecksum(checksumContent));\n }\n\n /**\n * Get installed components\n */\n async getInstalled(): Promise<Record<string, InstalledComponent>> {\n try {\n const content = await fs.readFile(this.manifestFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Mark component as installed\n */\n async markInstalled(filepath: string, version: string, checksum: string): Promise<void> {\n const installed = await this.getInstalled();\n installed[filepath] = {\n filepath,\n version,\n checksum,\n installedAt: new Date().toISOString(),\n modified: false,\n };\n\n await fs.mkdir(join(this.manifestFile, '..'), { recursive: true });\n await fs.writeFile(this.manifestFile, JSON.stringify(installed, null, 2));\n }\n\n /**\n * Get checksums for multiple components\n */\n async getChecksums(config: Jai1Config, filepaths: string[]): Promise<Record<string, { version: string; checksum: string }>> {\n const response = await fetch(`${config.apiUrl}/api/components/checksums`, {\n method: 'POST',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ filepaths }),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get checksums: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { checksums: Record<string, { version: string; checksum: string }> };\n return data.checksums;\n }\n\n /**\n * Resolve dependencies recursively\n */\n async resolveWithDependencies(config: Jai1Config, filepaths: string[]): Promise<string[]> {\n const resolved = new Set<string>();\n const queue = [...filepaths];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (seen.has(current)) continue;\n seen.add(current);\n resolved.add(current);\n\n try {\n // We need metadata to check deps\n // For efficiency, we could batch fetch metadata, but for now simple get is fine\n // Optimization: getBatch API could be used here\n const component = await this.get(config, current);\n\n if (component.dependencies) {\n for (const dep of component.dependencies) {\n if (!dep.filepath) continue; // Should have filepath\n // Handle both string and object format if API changes\n const depPath = typeof dep === 'string' ? dep : dep.filepath;\n if (!seen.has(depPath)) {\n queue.push(depPath);\n }\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not resolve dependencies for ${current}: ${error}`);\n }\n }\n\n return Array.from(resolved);\n }\n\n /**\n * Backup component file before update\n */\n async backupFile(filepath: string, targetDir: string): Promise<string | null> {\n const sourcePath = join(targetDir, filepath);\n\n try {\n await fs.access(sourcePath);\n } catch {\n return null; // File doesn't exist, no backup needed\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = join(targetDir, '..', '.jai1_backup', timestamp);\n const backupPath = join(backupDir, filepath);\n\n const stats = await fs.stat(sourcePath);\n\n await fs.mkdir(join(backupPath, '..'), { recursive: true });\n\n if (stats.isDirectory()) {\n await fs.cp(sourcePath, backupPath, { recursive: true });\n } else {\n await fs.copyFile(sourcePath, backupPath);\n }\n\n return backupPath;\n }\n\n /**\n * List all backup directories\n */\n async listBackups(projectRoot: string): Promise<string[]> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n const entries = await fs.readdir(backupRoot, { withFileTypes: true });\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n /**\n * Clear all backups\n */\n async clearBackups(projectRoot: string): Promise<void> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n await fs.rm(backupRoot, { recursive: true, force: true });\n } catch (error) {\n // Ignore error if dir doesn't exist\n }\n }\n\n /**\n * Calculate SHA256 checksum (matches server logic)\n */\n calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { UnifiedApplyApp } from '../ui/apply/UnifiedApplyApp.js';\n\n/**\n * Create apply command with Unified Ink UI\n */\nexport function createApplyCommand(): Command {\n const cmd = new Command('apply')\n .description('Apply components to your project (interactive UI)')\n .argument('[items...]', 'Package name or component filepaths (non-interactive mode)')\n .option('--force', 'Force overwrite even if modified locally')\n .option('--no-interactive', 'Disable interactive UI (for CI/CD)')\n .action(async (items: string[], options: { force?: boolean; interactive?: boolean }) => {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Non-interactive mode or direct arguments\n if (options.interactive === false || items.length > 0) {\n await nonInteractiveApply(config, items, options);\n return;\n }\n\n // Interactive mode with Unified Ink UI\n const { waitUntilExit } = render(\n React.createElement(UnifiedApplyApp, {\n config: config,\n force: options.force,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Non-interactive apply (for CLI args or CI/CD)\n */\nasync function nonInteractiveApply(\n config: any,\n items: string[],\n options: { force?: boolean }\n) {\n const componentsService = new ComponentsService();\n\n if (items.length === 0) {\n console.log('❌ No items specified. Use interactive mode or provide package/component names.');\n console.log('💡 Usage: jai1 apply <package> or jai1 apply <filepath...>');\n return;\n }\n\n // Check if first arg is a package\n const tags = await componentsService.listTags(config);\n const packageNames = tags.map(t => t.tag);\n\n let filepaths: string[];\n\n if (items.length === 1 && packageNames.includes(items[0]!)) {\n // Package mode\n console.log(`📦 Applying package '${items[0]}'...`);\n const components = await componentsService.list(config, { tag: items[0] });\n filepaths = components.map(c => c.filepath);\n } else {\n // Direct filepaths\n filepaths = items;\n }\n\n // Resolve dependencies\n console.log('🔍 Resolving dependencies...');\n const resolvedPaths = await componentsService.resolveWithDependencies(config, filepaths);\n\n console.log(`📦 Will apply ${resolvedPaths.length} component(s):`);\n for (const fp of resolvedPaths) {\n const isDep = !filepaths.includes(fp);\n const suffix = isDep ? ' (dependency)' : '';\n console.log(` - ${fp}${suffix}`);\n }\n\n // Install\n const targetDir = process.cwd() + '/.jai1';\n const installed = await componentsService.getInstalled();\n let added = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const fp of resolvedPaths) {\n try {\n const info = installed[fp];\n\n if (info && !options.force && info.modified) {\n console.log(`⚠️ ${fp}: modified locally. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n\n console.log(`📥 Downloading ${fp}...`);\n await componentsService.install(config, fp, targetDir);\n\n if (info) updated++;\n else added++;\n\n console.log(`✅ ${fp}`);\n } catch (error) {\n console.log(`❌ ${fp}: ${error instanceof Error ? error.message : 'Error'}`);\n }\n }\n\n console.log(`\\n✅ Complete: ${added} added, ${updated} updated, ${skipped} skipped`);\n console.log(`📁 Location: ${targetDir}`);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport type { Jai1Config } from '../../types/framework.types.js';\nimport { ComponentsService, type Component, type Tag } from '../../services/components.service.js';\nimport { ProgressBar } from '../shared/ProgressBar.js';\nimport { StatusIcon } from '../shared/StatusIcon.js';\n\ntype ViewState = 'browse' | 'installing' | 'summary';\n\ninterface UnifiedApplyAppProps {\n config: Jai1Config;\n force?: boolean;\n onExit: () => void;\n}\n\ninterface InstallProgress {\n filepath: string;\n status: 'pending' | 'downloading' | 'success' | 'error';\n error?: string;\n}\n\n/**\n * Unified Apply App - All-in-one interface\n */\nexport const UnifiedApplyApp: React.FC<UnifiedApplyAppProps> = ({\n config,\n force = false,\n onExit\n}) => {\n const { exit } = useApp();\n\n // View state\n const [viewState, setViewState] = useState<ViewState>('browse');\n\n // Data state\n const [components, setComponents] = useState<Component[]>([]);\n const [tags, setTags] = useState<Tag[]>([]);\n const [installedPaths, setInstalledPaths] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<Set<string>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n const [focusArea, setFocusArea] = useState<'search' | 'packages' | 'components'>('components');\n const [selectedPackageIndex, setSelectedPackageIndex] = useState(0);\n\n // Install state\n const [installProgress, setInstallProgress] = useState<InstallProgress[]>([]);\n const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });\n\n const service = new ComponentsService();\n\n // Load data on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const [comps, tagList, installed] = await Promise.all([\n service.list(config),\n service.listTags(config),\n service.getInstalled(),\n ]);\n setComponents(comps);\n setTags(tagList);\n setInstalledPaths(new Set(Object.keys(installed)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data');\n } finally {\n setLoading(false);\n }\n };\n loadData();\n }, []);\n\n // Filter components based on search\n const filteredComponents = useMemo(() => {\n if (!searchQuery.trim()) return components;\n const query = searchQuery.toLowerCase();\n return components.filter(c =>\n c.filepath.toLowerCase().includes(query) ||\n c.name.toLowerCase().includes(query) ||\n (c.tags && c.tags.some(t => t.toLowerCase().includes(query)))\n );\n }, [components, searchQuery]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Summary view - exit on Enter or q\n if (viewState === 'summary') {\n if (key.return || input === 'q' || key.escape) {\n onExit();\n }\n return;\n }\n\n // Installing view - no input\n if (viewState === 'installing') {\n return;\n }\n\n // Browse view\n // Tab to switch focus areas\n if (key.tab) {\n if (focusArea === 'search') setFocusArea('packages');\n else if (focusArea === 'packages') setFocusArea('components');\n else setFocusArea('search');\n return;\n }\n\n // Escape to exit\n if (key.escape || input === 'q') {\n onExit();\n return;\n }\n\n // Enter to apply\n if (key.return && focusArea !== 'search') {\n if (selectedPaths.size > 0) {\n handleApply();\n }\n return;\n }\n\n // Navigation in components\n if (focusArea === 'components') {\n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex(prev => Math.min(filteredComponents.length - 1, prev + 1));\n } else if (input === ' ') {\n // Toggle selection\n const current = filteredComponents[cursorIndex];\n if (current) {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n if (next.has(current.filepath)) {\n next.delete(current.filepath);\n } else {\n next.add(current.filepath);\n }\n return next;\n });\n }\n } else if (input === 'a') {\n // Select all filtered\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n } else if (input === 'c') {\n // Clear selection\n setSelectedPaths(new Set());\n }\n }\n\n // Navigation in packages\n if (focusArea === 'packages') {\n if (key.leftArrow) {\n setSelectedPackageIndex(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedPackageIndex(prev => Math.min(tags.length - 1, prev + 1));\n } else if (input === ' ' || key.return) {\n // Quick select package\n const tag = tags[selectedPackageIndex];\n if (tag) {\n const packageComponents = components.filter(c => c.tags?.includes(tag.tag));\n setSelectedPaths(prev => {\n const next = new Set(prev);\n packageComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n // Also filter to this package\n setSearchQuery(tag.tag);\n }\n }\n }\n });\n\n // Handle apply\n const handleApply = async () => {\n setViewState('installing');\n const targetDir = process.cwd() + '/.jai1';\n const pathsToInstall = Array.from(selectedPaths);\n\n // Resolve dependencies\n const resolvedPaths = await service.resolveWithDependencies(config, pathsToInstall);\n const installed = await service.getInstalled();\n\n // Initialize progress\n const initialProgress: InstallProgress[] = resolvedPaths.map(fp => ({\n filepath: fp,\n status: 'pending' as const,\n }));\n setInstallProgress(initialProgress);\n setInstallStats({ total: resolvedPaths.length, completed: 0, added: 0, updated: 0, failed: 0 });\n\n let added = 0, updated = 0, failed = 0;\n\n for (let i = 0; i < resolvedPaths.length; i++) {\n const fp = resolvedPaths[i]!;\n\n // Update to downloading\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'downloading' as const } : p\n ));\n\n try {\n const info = installed[fp];\n if (info && !force && info.modified) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: 'Modified locally' } : p\n ));\n failed++;\n } else {\n await service.install(config, fp, targetDir);\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'success' as const } : p\n ));\n if (info) updated++;\n else added++;\n }\n } catch (err) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: err instanceof Error ? err.message : 'Error' } : p\n ));\n failed++;\n }\n\n setInstallStats({ total: resolvedPaths.length, completed: i + 1, added, updated, failed });\n }\n\n setViewState('summary');\n };\n\n // Render loading\n if (loading) {\n return (\n <Box padding={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /> Đang tải components...</Text>\n </Box>\n );\n }\n\n // Render error\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">❌ Error: {error}</Text>\n <Text dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n // Render installing\n if (viewState === 'installing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Installing Components</Text>\n </Box>\n\n <Box marginBottom={1}>\n <ProgressBar current={installStats.completed} total={installStats.total} width={50} />\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {installProgress.slice(-8).map((item) => (\n <Box key={item.filepath}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'downloading' ? 'loading' : 'pending'\n } />\n <Text> {item.filepath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text>\n 📊 <Text color=\"green\">{installStats.added} added</Text>\n {' · '}<Text color=\"cyan\">{installStats.updated} updated</Text>\n {' · '}<Text color=\"red\">{installStats.failed} failed</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render summary\n if (viewState === 'summary') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">✅ Installation Complete!</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text>{installStats.total} components processed:</Text>\n <Text> └─ <Text color=\"green\">{installStats.added}</Text> newly added</Text>\n <Text> └─ <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {installStats.failed > 0 && <Text> └─ <Text color=\"red\">{installStats.failed}</Text> failed</Text>}\n </Box>\n\n <Box marginTop={1}>\n <Text>📁 Location: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Press Enter or q to exit</Text>\n </Box>\n </Box>\n );\n }\n\n // Render browse (main view)\n const visibleComponents = filteredComponents.slice(0, 12);\n const hasMore = filteredComponents.length > 12;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Jai1 Apply</Text>\n <Text dimColor> - Select components to install</Text>\n </Box>\n\n {/* Search Box */}\n <Box marginBottom={1}>\n <Text color={focusArea === 'search' ? 'cyan' : 'gray'}>🔍 Search: </Text>\n {focusArea === 'search' ? (\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"Type to filter...\"\n />\n ) : (\n <Text>{searchQuery || <Text dimColor>Press Tab to search</Text>}</Text>\n )}\n </Box>\n\n {/* Quick Packages */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold dimColor>Quick Apply (Packages):</Text>\n <Box marginTop={1} flexWrap=\"wrap\">\n {tags.slice(0, 6).map((tag, i) => {\n const isSelected = focusArea === 'packages' && i === selectedPackageIndex;\n return (\n <Box key={tag.tag} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n [{tag.tag}:{tag.count}]\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Components List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={focusArea === 'components' ? 'cyan' : 'gray'} padding={1}>\n <Box marginBottom={1}>\n <Text bold>Components </Text>\n <Text dimColor>({filteredComponents.length} shown{hasMore ? `, scroll for more` : ''})</Text>\n </Box>\n\n {visibleComponents.map((comp, i) => {\n const isCursor = i === cursorIndex && focusArea === 'components';\n const isChecked = selectedPaths.has(comp.filepath);\n const isInstalled = installedPaths.has(comp.filepath);\n\n return (\n <Box key={comp.filepath}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? '❯ ' : ' '}\n {isChecked ? '[✓]' : '[ ]'} {comp.filepath}\n </Text>\n <Text dimColor> {isInstalled ? '✓ installed' : '○ new'}</Text>\n </Box>\n );\n })}\n\n {filteredComponents.length === 0 && (\n <Text dimColor>No components match your search</Text>\n )}\n </Box>\n\n {/* Selected Preview */}\n {selectedPaths.size > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Selected: {selectedPaths.size} components</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n {Array.from(selectedPaths).slice(0, 4).map(fp => (\n <Text key={fp} dimColor>📌 {fp}</Text>\n ))}\n {selectedPaths.size > 4 && (\n <Text dimColor> ... and {selectedPaths.size - 4} more</Text>\n )}\n </Box>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Switch area · [↑↓] Navigate · [␣] Toggle · [a] Select all · [c] Clear · [Enter] Apply · [q] Quit\n </Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ProgressBarProps {\n current: number;\n total: number;\n width?: number;\n showPercentage?: boolean;\n color?: string;\n}\n\n/**\n * ASCII progress bar component\n */\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n current,\n total,\n width = 40,\n showPercentage = true,\n color = 'cyan',\n}) => {\n const percentage = total > 0 ? Math.round((current / total) * 100) : 0;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return (\n <Box>\n <Text color={color}>{bar}</Text>\n {showPercentage && (\n <Text dimColor> {current}/{total} ({percentage}%)</Text>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Text } from 'ink';\nimport { theme } from './theme.js';\n\nexport type Status = 'success' | 'error' | 'pending' | 'loading' | 'warning';\n\ninterface StatusIconProps {\n status: Status;\n text?: string;\n}\n\n/**\n * Status icon component with optional text\n */\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status, text }) => {\n const iconMap: Record<Status, string> = {\n success: theme.icons.success,\n error: theme.icons.error,\n pending: theme.icons.pending,\n loading: theme.icons.loading,\n warning: theme.icons.warning,\n };\n\n const colorMap: Record<Status, string> = {\n success: 'green',\n error: 'red',\n pending: 'gray',\n loading: 'yellow',\n warning: 'yellow',\n };\n\n const icon = iconMap[status];\n const color = colorMap[status];\n\n return (\n <Text color={color}>\n {icon} {text}\n </Text>\n );\n};\n","/**\n * Theme configuration for Ink UI components\n */\n\nexport const theme = {\n colors: {\n primary: '#6366f1', // Indigo\n success: '#22c55e', // Green\n warning: '#eab308', // Yellow\n error: '#ef4444', // Red\n muted: '#6b7280', // Gray\n border: '#374151', // Dark gray\n text: '#f3f4f6', // Light gray\n background: '#1a1a2e', // Dark background\n },\n\n icons: {\n success: '✅',\n error: '❌',\n pending: '○',\n loading: '⏳',\n package: '📦',\n folder: '📁',\n file: '📄',\n tip: '💡',\n warning: '⚠️',\n checkmark: '✓',\n arrow: '→',\n bullet: '•',\n },\n\n borders: {\n single: {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n },\n double: {\n topLeft: '╔',\n topRight: '╗',\n bottomLeft: '╚',\n bottomRight: '╝',\n horizontal: '═',\n vertical: '║',\n },\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n return new Command('update')\n .description('Update installed components to latest versions')\n .option('--force', 'Force update even if files are modified locally')\n .action(async (options: { force?: boolean }) => {\n await handleUpdate(options);\n });\n}\n\nasync function handleUpdate(options: { force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to add components.');\n return;\n }\n\n console.log('🔍 Checking for updates...');\n\n // Get checksums from API\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n console.log(`⚠️ ${fp}: Component not found on server (deprecated?)`);\n continue;\n }\n\n // Check if update needed based on checksum or version\n // Using checksum is more reliable for content changes\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n if (updates.length === 0) {\n console.log('✅ All components are up to date.');\n return;\n }\n\n console.log(`\\n📦 Found ${updates.length} updates:`);\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` - ${fp} (v${current.version} → v${latest.version})`);\n }\n console.log();\n\n if (!options.force) {\n const shouldUpdate = await confirm({ message: 'Update now?', default: true });\n if (!shouldUpdate) return;\n }\n\n // Perform updates\n const targetDir = process.cwd() + '/.jai1';\n let updatedCount = 0;\n const backupPaths: string[] = [];\n\n for (const fp of updates) {\n try {\n // Backup\n console.log(`📥 Updating ${fp}...`);\n const backupPath = await componentsService.backupFile(fp, targetDir);\n if (backupPath) {\n backupPaths.push(backupPath);\n // Simplify backup path for display\n const displayPath = backupPath.split('.jai1_backup/')[1];\n console.log(` Backed up: .../${displayPath}`);\n }\n\n // Install\n await componentsService.install(config, fp, targetDir);\n console.log(`✅ Updated`);\n updatedCount++;\n } catch (error) {\n console.log(`❌ Failed to update ${fp}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n console.log(`\\n✅ Update complete: ${updatedCount}/${updates.length} updated.`);\n\n if (backupPaths.length > 0) {\n console.log(`\\n📁 Backups created in .jai1_backup/`);\n\n // Default No for cleanup safety\n const cleanBackups = await confirm({ message: 'Clear these backups?', default: false });\n if (cleanBackups) {\n await componentsService.clearBackups(process.cwd());\n console.log('🗑️ Backups cleared.');\n } else {\n console.log('💡 Run \"jai1 clean\" to remove them later.');\n }\n }\n\n trackAction('components_update', { count: updatedCount });\n\n } catch (error) {\n throw new Error(`Update check failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { trackAction } from '../../services/tracking.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { compareVersions, formatVersion } from '../../utils/version.js';\n\ninterface CheckOptions {\n json?: boolean;\n}\n\n/**\n * Create check command for Jai1 Framework\n * Checks current version and compares with latest from server\n */\nexport function createCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check for framework updates')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleCheck(options: CheckOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to get started.');\n return;\n }\n\n console.log('Checking for updates...\\n');\n\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n // Component removed from server?\n continue;\n }\n\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n // Output status\n console.log(`📌 Components status:`);\n\n // Show updates first\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` ${fp} v${current.version} → v${latest.version} ⚠️ UPDATE`);\n }\n\n // Show up-to-date (limit showing all if too many?)\n // Let's show all for now, or just summary\n if (updates.length === 0 && upToDate.length > 0) {\n console.log(` ✓ All ${upToDate.length} components up to date.`);\n } else if (upToDate.length > 0) {\n console.log(` ✓ ${upToDate.length} components up to date.`);\n }\n\n console.log();\n if (updates.length > 0) {\n console.log(`Status: ${updates.length} component(s) update available!`);\n console.log(`Run 'jai1 update' to update.`);\n } else {\n console.log(`Status: ✅ All good!`);\n }\n\n } catch (error) {\n console.error('Error checking updates:', error instanceof Error ? error.message : error);\n }\n}\n\n","/**\n * IDE Command Group\n * Manages IDE integration commands: context, setup, sync\n */\nimport { Command } from 'commander';\nimport { createContextSubcommand } from './context.js';\nimport { createSetupSubcommand } from './setup.js';\nimport { createSyncSubcommand } from './sync.js';\n\n/**\n * Create IDE command group\n * Subcommands:\n * - context: Browse and explore IDE context\n * - setup: Configure IDE settings (VSCode optimizations)\n * - sync: Sync .jai1 content to IDE directories\n */\nexport function createIdeCommand(): Command {\n const ideCommand = new Command('ide')\n .description('IDE integration and configuration commands');\n\n // Add subcommands\n ideCommand.addCommand(createContextSubcommand());\n ideCommand.addCommand(createSetupSubcommand());\n ideCommand.addCommand(createSyncSubcommand());\n\n // Default action - show help\n ideCommand.action(() => {\n ideCommand.help();\n });\n\n return ideCommand;\n}\n","/**\n * IDE Context Subcommand\n * Browse and explore IDE context (rules, workflows, skills, etc.)\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../../types/context.types.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\n/**\n * Create context subcommand for IDE group\n */\nexport function createContextSubcommand(): Command {\n const cmd = new Command('context')\n .description('Browse and explore IDE context (rules, workflows, skills)')\n .option('--target <ide>', 'Open specific IDE context (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Show specific content type (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Show context statistics (non-interactive)')\n .action(async (options: { target?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.target) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.target)) {\n console.error(`❌ Invalid IDE: ${options.target}`);\n console.error(` Valid IDEs: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.target as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Invalid content type: ${options.type}`);\n console.error(` Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Scanning context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ No context found');\n console.log(' Run `jai1 apply` to install context for your IDE.\\n');\n return;\n }\n\n console.log('📊 Context Statistics\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('en-US')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Total: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Error scanning context:', error);\n process.exit(1);\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { IDE, ContentType, IDEContext, ContextItem } from '../../types/context.types.js';\nimport { MainMenuView } from './views/MainMenuView.js';\nimport { IDEOverviewView } from './views/IDEOverviewView.js';\nimport { ListView } from './views/ListView.js';\nimport { DetailView } from './views/DetailView.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\nexport type ContextScreen = 'menu' | 'overview' | 'list' | 'detail';\n\ninterface ContextAppProps {\n initialIDE?: IDE;\n initialType?: ContentType;\n onExit: () => void;\n}\n\n/**\n * ContextApp - Interactive Context Visualizer\n */\nexport const ContextApp: React.FC<ContextAppProps> = ({ initialIDE, initialType, onExit }) => {\n const { exit } = useApp();\n const [screen, setScreen] = useState<ContextScreen>('menu');\n const [selectedIDE, setSelectedIDE] = useState<IDE | null>(initialIDE || null);\n const [selectedType, setSelectedType] = useState<ContentType | null>(initialType || null);\n const [selectedItem, setSelectedItem] = useState<ContextItem | null>(null);\n\n const [ideContexts, setIdeContexts] = useState<IDEContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Scan context on mount\n useEffect(() => {\n const scanner = new ContextScannerService();\n scanner.scanAll().then(result => {\n setIdeContexts(result.ides);\n setLoading(false);\n\n // If initialIDE is set, jump to overview\n if (initialIDE) {\n setScreen('overview');\n }\n }).catch(error => {\n console.error('Failed to scan context:', error);\n setLoading(false);\n });\n }, [initialIDE]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // q to quit (global)\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Escape or Backspace to go back (NOT in detail view - DetailView handles its own input)\n if (screen !== 'detail' && (key.escape || key.backspace)) {\n handleBack();\n return;\n }\n });\n\n const handleBack = () => {\n if (screen === 'detail') {\n setScreen('list');\n setSelectedItem(null);\n setScrollPosition(0);\n } else if (screen === 'list') {\n setScreen('overview');\n setSelectedType(null);\n } else if (screen === 'overview') {\n setScreen('menu');\n setSelectedIDE(null);\n } else {\n onExit();\n }\n };\n\n const handleSelectIDE = (ide: IDE) => {\n setSelectedIDE(ide);\n setScreen('overview');\n };\n\n const handleSelectType = (type: ContentType) => {\n setSelectedType(type);\n setScreen('list');\n };\n\n const handleSelectItem = (item: ContextItem) => {\n setSelectedItem(item);\n setScreen('detail');\n setScrollPosition(0);\n };\n\n // Get current IDE context\n const currentIDEContext = ideContexts.find(ctx => ctx.ide === selectedIDE);\n\n // Get current items for selected type\n const currentItems = currentIDEContext?.items.filter(item => item.type === selectedType) || [];\n\n // Render appropriate view\n const renderContent = () => {\n if (loading) {\n return (\n <Box padding={1}>\n <Text>Đang quét context...</Text>\n </Box>\n );\n }\n\n switch (screen) {\n case 'menu':\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n case 'overview':\n return currentIDEContext ? (\n <IDEOverviewView\n ideContext={currentIDEContext}\n onSelectType={handleSelectType}\n onBack={handleBack}\n />\n ) : null;\n case 'list':\n return (\n <ListView\n items={currentItems}\n contentType={selectedType!}\n onSelect={handleSelectItem}\n onBack={handleBack}\n />\n );\n case 'detail':\n return selectedItem ? (\n <DetailView\n item={selectedItem}\n scrollPosition={scrollPosition}\n onBack={handleBack}\n />\n ) : null;\n default:\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n }\n };\n\n // Get footer hints based on screen\n const getFooterHints = () => {\n switch (screen) {\n case 'menu':\n return '[↑↓] Chọn · [Enter] Mở · [q] Thoát';\n case 'overview':\n return '[Tab/1-6] Chuyển tab · [Enter] Xem danh sách · [Esc/←] Quay lại · [q] Thoát';\n case 'list':\n return '[↑↓] Chọn · [Enter] Chi tiết · [Esc/←] Quay lại · [q] Thoát';\n case 'detail':\n return '[↑↓/j/k] Cuộn · [PgUp/u PgDn/d] Cuộn nhanh · [g/G] Đầu/Cuối · [Esc/←] Quay lại · [q] Thoát';\n default:\n return '[q] Thoát';\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📋 Jai1 Context</Text>\n <Text dimColor> - Khám phá context dự án</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{getFooterHints()}</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDE, IDEContext } from '../../../types/context.types.js';\n\ninterface MainMenuViewProps {\n ideContexts: IDEContext[];\n onSelect: (ide: IDE) => void;\n}\n\ninterface IDEMenuItem {\n ide: IDE;\n icon: string;\n title: string;\n itemCount: number;\n available: boolean;\n}\n\n/**\n * MainMenuView - IDE selector menu\n */\nexport const MainMenuView: React.FC<MainMenuViewProps> = ({ ideContexts, onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build menu items\n const menuItems: IDEMenuItem[] = [\n {\n ide: 'cursor',\n icon: '🔮',\n title: 'Cursor',\n itemCount: ideContexts.find(ctx => ctx.ide === 'cursor')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'cursor'),\n },\n {\n ide: 'windsurf',\n icon: '🏄',\n title: 'Windsurf',\n itemCount: ideContexts.find(ctx => ctx.ide === 'windsurf')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'windsurf'),\n },\n {\n ide: 'antigravity',\n icon: '🚀',\n title: 'Antigravity (Claude)',\n itemCount: ideContexts.find(ctx => ctx.ide === 'antigravity')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'antigravity'),\n },\n {\n ide: 'jai1',\n icon: '🤖',\n title: 'Jai1 Framework',\n itemCount: ideContexts.find(ctx => ctx.ide === 'jai1')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'jai1'),\n },\n ];\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item && item.available) {\n onSelect(item.ide);\n }\n }\n }, { isActive: true });\n\n // Format item count summary\n const formatSummary = (item: IDEMenuItem): string => {\n if (!item.available) {\n return 'Không có context';\n }\n\n const ctx = ideContexts.find(c => c.ide === item.ide);\n if (!ctx) return '';\n\n const parts: string[] = [];\n if (ctx.stats.byType.rules) parts.push(`${ctx.stats.byType.rules} rules`);\n if (ctx.stats.byType.workflows) parts.push(`${ctx.stats.byType.workflows} workflows`);\n if (ctx.stats.byType.skills) parts.push(`${ctx.stats.byType.skills} skills`);\n if (ctx.stats.byType.agents) parts.push(`${ctx.stats.byType.agents} agents`);\n if (ctx.stats.byType.prompts) parts.push(`${ctx.stats.byType.prompts} prompts`);\n\n return parts.join(', ') || `${item.itemCount} items`;\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"cyan\">Jai1 Context</Text>!</Text>\n <Text dimColor>\n Khám phá và quản lý context cho các IDE hỗ trợ Agentic Coding.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn IDE để khám phá:</Text>\n\n {menuItems.map((item, index) => {\n const isSelected = index === selectedIndex;\n const dimmed = !item.available;\n\n return (\n <Box key={item.ide} marginY={0}>\n <Text color={isSelected ? 'cyan' : dimmed ? 'gray' : 'white'} dimColor={dimmed}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.available && (\n <Text dimColor> - {formatSummary(item)}</Text>\n )}\n {!item.available && (\n <Text dimColor> - Không có context</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n {ideContexts.length === 0 && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\n <Text color=\"yellow\">⚠️ Không tìm thấy context nào</Text>\n <Text dimColor>Hãy chạy </Text>\n <Text color=\"cyan\">jai1 apply</Text>\n <Text dimColor> để cài đặt context cho IDE của bạn.</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDEContext, ContentType } from '../../../types/context.types.js';\n\ninterface IDEOverviewViewProps {\n ideContext: IDEContext;\n onSelectType: (type: ContentType) => void;\n onBack: () => void;\n}\n\ninterface ContentTypeTab {\n type: ContentType;\n label: string;\n icon: string;\n count: number;\n}\n\n/**\n * IDEOverviewView - Overview of an IDE's context with tabs\n */\nexport const IDEOverviewView: React.FC<IDEOverviewViewProps> = ({\n ideContext,\n onSelectType,\n onBack,\n}) => {\n const [selectedTabIndex, setSelectedTabIndex] = useState(0);\n\n // Build tabs from available content types\n const tabs: ContentTypeTab[] = [];\n\n if (ideContext.stats.byType.rules) {\n tabs.push({\n type: 'rules',\n label: 'Rules',\n icon: '📜',\n count: ideContext.stats.byType.rules,\n });\n }\n if (ideContext.stats.byType.workflows) {\n tabs.push({\n type: 'workflows',\n label: 'Workflows',\n icon: '🔄',\n count: ideContext.stats.byType.workflows,\n });\n }\n if (ideContext.stats.byType.skills) {\n tabs.push({\n type: 'skills',\n label: 'Skills',\n icon: '🛠',\n count: ideContext.stats.byType.skills,\n });\n }\n if (ideContext.stats.byType.agents) {\n tabs.push({\n type: 'agents',\n label: 'Agents',\n icon: '🤖',\n count: ideContext.stats.byType.agents,\n });\n }\n if (ideContext.stats.byType.prompts) {\n tabs.push({\n type: 'prompts',\n label: 'Prompts',\n icon: '💬',\n count: ideContext.stats.byType.prompts,\n });\n }\n if (ideContext.stats.byType.context) {\n tabs.push({\n type: 'context',\n label: 'Context',\n icon: '📋',\n count: ideContext.stats.byType.context,\n });\n }\n\n useInput((input, key) => {\n // Tab navigation\n if (key.tab || key.rightArrow) {\n setSelectedTabIndex(prev => Math.min(tabs.length - 1, prev + 1));\n } else if (key.leftArrow) {\n setSelectedTabIndex(prev => Math.max(0, prev - 1));\n }\n\n // Number shortcuts (1-6)\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= tabs.length) {\n setSelectedTabIndex(num - 1);\n }\n\n // Enter to select\n if (key.return) {\n const tab = tabs[selectedTabIndex];\n if (tab) {\n onSelectType(tab.type);\n }\n }\n }, { isActive: true });\n\n // Get current tab\n const currentTab = tabs[selectedTabIndex];\n\n // Get items for current tab\n const currentItems = currentTab\n ? ideContext.items.filter(item => item.type === currentTab.type)\n : [];\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{ideContext.config.icon} {ideContext.config.name}</Text>\n </Box>\n\n {/* Summary Stats */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>📊 Tổng quan</Text>\n <Box marginTop={1}>\n <Text>\n 📁 Tổng: <Text bold color=\"cyan\">{ideContext.stats.totalItems} items</Text>\n </Text>\n <Text dimColor> · </Text>\n <Text>\n 💾 Kích thước: <Text bold>{formatSize(ideContext.stats.totalSize)}</Text>\n </Text>\n {ideContext.stats.lastModified && (\n <>\n <Text dimColor> · </Text>\n <Text>\n 🕐 Cập nhật: <Text bold>{formatDate(ideContext.stats.lastModified)}</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* Content Type Tabs */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {/* Tab Headers */}\n <Box marginBottom={1}>\n {tabs.map((tab, index) => {\n const isSelected = index === selectedTabIndex;\n return (\n <Box key={tab.type} marginRight={1}>\n <Text\n color={isSelected ? 'cyan' : 'gray'}\n bold={isSelected}\n inverse={isSelected}\n >\n {' '}{tab.icon} {tab.label} ({tab.count}){' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Tab Content Preview */}\n {currentTab && currentItems.length > 0 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Preview (nhấn Enter để xem chi tiết):</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {currentItems.slice(0, 5).map(item => (\n <Box key={item.id} marginY={0}>\n <Text>• {item.name}</Text>\n {item.description && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n ))}\n {currentItems.length > 5 && (\n <Text dimColor>... và {currentItems.length - 5} items khác</Text>\n )}\n </Box>\n </Box>\n )}\n\n {currentTab && currentItems.length === 0 && (\n <Text dimColor>Không có items nào trong {currentTab.label}</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem, ContentType } from '../../../types/context.types.js';\n\ninterface ListViewProps {\n items: ContextItem[];\n contentType: ContentType;\n onSelect: (item: ContextItem) => void;\n onBack: () => void;\n}\n\n/**\n * ListView - List view for context items\n */\nexport const ListView: React.FC<ListViewProps> = ({ items, contentType, onSelect, onBack }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(items.length - 1, prev + 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item) {\n onSelect(item);\n }\n }\n }, { isActive: true });\n\n // Get type label\n const getTypeLabel = (): string => {\n switch (contentType) {\n case 'rules':\n return '📜 Rules';\n case 'workflows':\n return '🔄 Workflows';\n case 'skills':\n return '🛠 Skills';\n case 'agents':\n return '🤖 Agents';\n case 'prompts':\n return '💬 Prompts';\n case 'context':\n return '📋 Context';\n default:\n return contentType;\n }\n };\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n if (items.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text dimColor>Không có items nào</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n <Text dimColor> - {items.length} items</Text>\n </Box>\n\n {/* Items List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <Box key={item.id} flexDirection=\"column\" marginY={0}>\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.name}\n </Text>\n <Text dimColor> ({formatSize(item.fileSize)})</Text>\n </Box>\n\n {isSelected && (\n <Box marginLeft={3} flexDirection=\"column\">\n {item.description && (\n <Text dimColor>📝 {item.description}</Text>\n )}\n\n {/* Rules-specific metadata */}\n {contentType === 'rules' && (\n <>\n {item.alwaysApply && (\n <Text dimColor>✅ Always active</Text>\n )}\n {item.globs && item.globs.length > 0 && (\n <Text dimColor>🎯 Globs: {item.globs.join(', ')}</Text>\n )}\n </>\n )}\n\n {/* Skills-specific metadata */}\n {contentType === 'skills' && (\n <Box>\n {item.hasScripts && <Text dimColor>📦 scripts/ </Text>}\n {item.hasReferences && <Text dimColor>📚 references/ </Text>}\n {item.hasAssets && <Text dimColor>🎨 assets/ </Text>}\n </Box>\n )}\n\n {/* Agents-specific metadata */}\n {contentType === 'agents' && item.model && (\n <Text dimColor>🔧 Model: {item.model}</Text>\n )}\n\n <Text dimColor>📁 {item.relativePath}</Text>\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem } from '../../../types/context.types.js';\n\ninterface DetailViewProps {\n item: ContextItem;\n scrollPosition: number;\n onBack: () => void;\n}\n\n/**\n * DetailView - Detail view for a context item with metadata and preview\n */\nexport const DetailView: React.FC<DetailViewProps> = ({ item, scrollPosition: initialScroll, onBack }) => {\n // Local scroll state\n const [scrollPosition, setScrollPosition] = useState(initialScroll);\n const maxVisibleLines = 25;\n const maxScroll = Math.max(0, item.previewLines.length - maxVisibleLines);\n\n // Handle keyboard input for scrolling\n useInput((input, key) => {\n // Scroll controls\n if (key.upArrow || input === 'k') {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageDown || input === 'd') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 5));\n } else if (key.pageUp || input === 'u') {\n setScrollPosition(prev => Math.max(0, prev - 5));\n } else if (input === 'g') {\n setScrollPosition(0);\n } else if (input === 'G') {\n setScrollPosition(maxScroll);\n }\n // Back navigation\n else if (key.escape || key.backspace) {\n onBack();\n }\n }, { isActive: true });\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Get visible preview lines based on scroll\n const visibleLines = item.previewLines.slice(\n scrollPosition,\n scrollPosition + maxVisibleLines\n );\n\n const hasMoreAbove = scrollPosition > 0;\n const hasMoreBelow = scrollPosition + maxVisibleLines < item.previewLines.length;\n\n // Calculate scroll percentage\n const scrollPercentage = item.previewLines.length <= maxVisibleLines\n ? 100\n : Math.round((scrollPosition / maxScroll) * 100);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header with compact metadata */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">{item.name}</Text>\n <Box>\n <Text dimColor>{item.relativePath} • {formatSize(item.fileSize)}</Text>\n {item.description && <Text dimColor> • {item.description}</Text>}\n </Box>\n <Box>\n {/* Type-specific metadata in one line */}\n {item.type === 'rules' && item.globs && item.globs.length > 0 && (\n <Text dimColor>globs: {item.globs.join(', ')}</Text>\n )}\n {item.type === 'agents' && item.model && (\n <Text dimColor>model: {item.model}</Text>\n )}\n {item.type === 'skills' && (\n <Text dimColor>\n {item.hasScripts && '📦 scripts '}\n {item.hasReferences && '📚 refs '}\n {item.hasAssets && '🎨 assets'}\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Preview Panel */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Box justifyContent=\"space-between\">\n <Text bold>👁️ Preview</Text>\n {item.previewLines.length > maxVisibleLines && (\n <Text dimColor>\n [{scrollPosition + 1}-{Math.min(scrollPosition + maxVisibleLines, item.previewLines.length)}/{item.lineCount}] {scrollPercentage}%\n </Text>\n )}\n </Box>\n\n {hasMoreAbove && (\n <Box justifyContent=\"center\">\n <Text dimColor>▲ ▲ ▲ ({scrollPosition} dòng ở trên) ▲ ▲ ▲</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleLines.map((line, index) => {\n const lineNumber = scrollPosition + index + 1;\n return (\n <Box key={index}>\n <Text dimColor>{lineNumber.toString().padStart(3, ' ')}│ </Text>\n <Text>{line}</Text>\n </Box>\n );\n })}\n </Box>\n\n {hasMoreBelow && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>\n ▼ ▼ ▼ ({item.lineCount - scrollPosition - visibleLines.length} dòng ở dưới) ▼ ▼ ▼\n </Text>\n </Box>\n )}\n\n {item.previewLines.length === 0 && (\n <Text dimColor>Không có nội dung để hiển thị</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport type {\n IDE,\n ContentType,\n ContextItem,\n IDEContext,\n ProjectContext,\n ContextStats,\n} from '../types/context.types.js';\nimport { IDE_CONFIGS, getAllIDEs } from '../constants/ide-configs.js';\n\n/**\n * Service for scanning and parsing context files\n */\nexport class ContextScannerService {\n private projectPath: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Scan all IDEs for context\n */\n async scanAll(): Promise<ProjectContext> {\n const ides = await this.detectIDEs();\n const ideContexts: IDEContext[] = [];\n\n for (const ide of ides) {\n try {\n const context = await this.scanIDE(ide);\n if (context.items.length > 0) {\n ideContexts.push(context);\n }\n } catch (error) {\n // Skip IDEs that fail to scan\n console.error(`Failed to scan ${ide}:`, error);\n }\n }\n\n const totalItems = ideContexts.reduce((sum, ctx) => sum + ctx.items.length, 0);\n\n return {\n projectPath: this.projectPath,\n ides: ideContexts,\n totalItems,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific IDE\n */\n async scanIDE(ide: IDE): Promise<IDEContext> {\n const config = IDE_CONFIGS[ide];\n const items: ContextItem[] = [];\n\n // Scan each content type\n for (const [type, relativePath] of Object.entries(config.contentPaths)) {\n if (!relativePath) continue;\n\n const contentType = type as ContentType;\n try {\n const typeItems = await this.scanType(ide, contentType);\n items.push(...typeItems);\n } catch (error) {\n // Skip types that fail to scan (directory doesn't exist, etc.)\n }\n }\n\n const stats = this.calculateStats(items);\n\n return {\n ide,\n config,\n items,\n stats,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific content type\n */\n async scanType(ide: IDE, type: ContentType): Promise<ContextItem[]> {\n const config = IDE_CONFIGS[ide];\n const relativePath = config.contentPaths[type];\n if (!relativePath) return [];\n\n let dirPath: string;\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1', relativePath);\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework', relativePath);\n\n // Use whichever path exists\n if (await this.pathExists(jai1Path)) {\n dirPath = jai1Path;\n } else if (await this.pathExists(frameworkPath)) {\n dirPath = frameworkPath;\n } else {\n return [];\n }\n } else {\n dirPath = path.join(this.projectPath, config.basePath, relativePath);\n\n // Check if directory exists\n try {\n await fs.access(dirPath);\n } catch {\n return [];\n }\n }\n\n const extensions = config.fileExtensions[type] || [];\n const items: ContextItem[] = [];\n\n // Special handling for skills (folders with SKILL.md)\n if (type === 'skills') {\n const skillItems = await this.scanSkills(dirPath, ide);\n items.push(...skillItems);\n } else {\n // Regular files\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n\n if (!stat.isFile()) continue;\n\n // Check if file matches extensions\n const matchesExtension = extensions.some(ext => file.endsWith(ext));\n if (!matchesExtension) continue;\n\n try {\n const item = await this.parseContextItem(filepath, ide, type);\n items.push(item);\n } catch (error) {\n console.error(`Failed to parse ${filepath}:`, error);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Scan skills (folders with SKILL.md)\n */\n private async scanSkills(skillsDir: string, ide: IDE): Promise<ContextItem[]> {\n const items: ContextItem[] = [];\n\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = path.join(skillsDir, entry.name);\n const skillFilePath = path.join(skillPath, 'SKILL.md');\n\n // Check if SKILL.md exists\n try {\n await fs.access(skillFilePath);\n } catch {\n continue;\n }\n\n // Parse SKILL.md\n const item = await this.parseContextItem(skillFilePath, ide, 'skills');\n\n // Check for additional folders\n item.hasScripts = await this.pathExists(path.join(skillPath, 'scripts'));\n item.hasReferences = await this.pathExists(path.join(skillPath, 'references'));\n item.hasAssets = await this.pathExists(path.join(skillPath, 'assets'));\n\n items.push(item);\n }\n } catch (error) {\n console.error(`Failed to scan skills:`, error);\n }\n\n return items;\n }\n\n /**\n * Parse a context item from file\n */\n private async parseContextItem(\n filepath: string,\n ide: IDE,\n type: ContentType\n ): Promise<ContextItem> {\n const content = await fs.readFile(filepath, 'utf-8');\n const stat = await fs.stat(filepath);\n\n // Parse frontmatter\n const { data: frontmatter, content: bodyContent } = matter(content);\n\n // Extract description\n const config = IDE_CONFIGS[ide];\n const description = frontmatter[config.frontmatterSchema.descriptionField] as string | undefined;\n\n // Extract globs/trigger info\n let globs: string[] | undefined;\n let alwaysApply: boolean | undefined;\n\n if (config.frontmatterSchema.alwaysApplyField) {\n const alwaysField = frontmatter[config.frontmatterSchema.alwaysApplyField];\n alwaysApply = alwaysField === true || alwaysField === 'always' || alwaysField === 'always_on';\n }\n\n const triggerValue = frontmatter[config.frontmatterSchema.triggerField];\n if (typeof triggerValue === 'string') {\n globs = [triggerValue];\n } else if (Array.isArray(triggerValue)) {\n globs = triggerValue;\n }\n\n // Extract preview lines\n const { previewLines, lineCount } = this.extractPreview(bodyContent, 20);\n\n // Generate ID\n const relativePath = path.relative(this.projectPath, filepath);\n const id = `${ide}-${type}-${path.basename(filepath, path.extname(filepath))}`;\n\n // Extract name\n const name = frontmatter.name || path.basename(filepath, path.extname(filepath));\n\n return {\n id,\n ide,\n type,\n name,\n filepath,\n relativePath,\n frontmatter,\n description,\n globs,\n alwaysApply,\n model: frontmatter.model as string | undefined,\n fileSize: stat.size,\n modifiedAt: stat.mtime,\n previewLines,\n lineCount,\n };\n }\n\n /**\n * Extract preview lines (after frontmatter)\n */\n private extractPreview(content: string, maxLines: number = 20): { previewLines: string[]; lineCount: number } {\n const lines = content.split('\\n');\n const previewLines = lines.slice(0, maxLines);\n const lineCount = lines.length;\n\n return { previewLines, lineCount };\n }\n\n /**\n * Detect available IDEs in project\n */\n async detectIDEs(): Promise<IDE[]> {\n const ides: IDE[] = [];\n\n for (const ide of getAllIDEs()) {\n const config = IDE_CONFIGS[ide];\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1');\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework');\n\n if (await this.pathExists(jai1Path) || await this.pathExists(frameworkPath)) {\n ides.push(ide);\n }\n } else {\n const idePath = path.join(this.projectPath, config.basePath);\n if (await this.pathExists(idePath)) {\n ides.push(ide);\n }\n }\n }\n\n return ides;\n }\n\n /**\n * Check if path exists\n */\n private async pathExists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate statistics from items\n */\n private calculateStats(items: ContextItem[]): ContextStats {\n const byType: Partial<Record<ContentType, number>> = {};\n\n for (const item of items) {\n byType[item.type] = (byType[item.type] || 0) + 1;\n }\n\n const totalSize = items.reduce((sum, item) => sum + item.fileSize, 0);\n\n const lastModified = items.length > 0\n ? items.reduce((latest, item) =>\n item.modifiedAt > latest ? item.modifiedAt : latest,\n items[0]!.modifiedAt\n )\n : null;\n\n return {\n totalItems: items.length,\n byType,\n totalSize,\n lastModified,\n };\n }\n}\n","import type { IDE, IDEConfig } from '../types/context.types.js';\n\n/**\n * IDE configurations for context scanning\n */\nexport const IDE_CONFIGS: Record<IDE, IDEConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n contentPaths: {\n rules: 'rules',\n workflows: 'commands', // Cursor uses \"commands\" for workflows\n },\n fileExtensions: {\n rules: ['.mdc'], // Cursor-specific markdown\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always'\n descriptionField: 'description',\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity (Claude)',\n icon: '🚀',\n basePath: '.agent',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always_on'\n descriptionField: 'description',\n },\n },\n jai1: {\n id: 'jai1',\n name: 'Jai1 Framework',\n icon: '🤖',\n basePath: '.jai1', // Or packages/jai1-framework\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n skills: 'skills', // Folders with SKILL.md\n agents: 'agents',\n prompts: 'prompts',\n context: 'context',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n skills: ['SKILL.md'], // Special handling for skill folders\n agents: ['.md'],\n prompts: ['.md'],\n context: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n};\n\n/**\n * Get IDE config by ID\n */\nexport function getIDEConfig(ide: IDE): IDEConfig {\n return IDE_CONFIGS[ide];\n}\n\n/**\n * Get all IDE IDs\n */\nexport function getAllIDEs(): IDE[] {\n return Object.keys(IDE_CONFIGS) as IDE[];\n}\n","/**\n * IDE Setup Subcommand\n * Configure IDE settings (VSCode optimizations, etc.)\n * \n * This is a wrapper that re-exports the existing vscode command\n * but as a subcommand under 'ide setup'\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Disable all telemetry and data collection',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Disable/reduce language server load (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Disable built-in Git for better performance',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Exclude directories from file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Exclude directories from search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Disable auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Optimize rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Hide unnecessary UI elements',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\n/**\n * Create setup subcommand for IDE group\n * Manages IDE settings (VSCode optimizations)\n */\nexport function createSetupSubcommand(): Command {\n const setupCommand = new Command('setup')\n .description('Configure IDE settings and optimizations');\n\n // Interactive mode (default)\n setupCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n setupCommand\n .command('enable')\n .description('Enable specific optimization groups')\n .argument('[groups...]', 'Group names to enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n setupCommand\n .command('disable')\n .description('Disable specific optimization groups (restore to default)')\n .argument('[groups...]', 'Group names to disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n setupCommand\n .command('max-performance')\n .description('Enable all optimizations for maximum performance')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n setupCommand\n .command('reset')\n .description('Reset to default settings (remove all optimizations)')\n .argument('[groups...]', 'Group names to reset (empty = reset all)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n setupCommand\n .command('list')\n .description('List all available optimization groups')\n .action(() => {\n console.log('🔧 Available optimization groups:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return setupCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 IDE Settings Manager\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Usage: │');\n console.log('│ • Use ↑↓ keys to navigate │');\n console.log('│ • Press SPACE to select/deselect group │');\n console.log('│ • Press ENTER to confirm and apply │');\n console.log('│ • Press Ctrl+C to cancel │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'What do you want to do?',\n choices: [\n { name: '✅ Enable optimization groups', value: 'enable' },\n { name: '❌ Disable optimization groups', value: 'disable' },\n { name: '🚀 Max Performance (enable all)', value: 'max' },\n { name: '🔄 Reset to defaults', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Select groups to ${action} (SPACE to select, ENTER to confirm):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ No groups selected!');\n console.log(' 💡 Tip: Press SPACE to select at least 1 group before pressing ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Operation cancelled.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Invalid groups: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Run \"jai1 ide setup list\" to see available groups.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Created .vscode/ directory');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Read current settings from settings.json');\n } catch {\n console.warn('⚠️ Cannot read settings.json (may contain comments).');\n const confirmOverwrite = await confirm({\n message: 'Overwrite current settings.json file?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Operation cancelled.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 ${action === 'enable' ? 'Enabling' : 'Disabling'} groups:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Updated IDE settings at: ${settingsPath}`);\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ No settings.json file found');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset ALL settings to default (delete entire file)?'\n : `Reset groups: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Operation cancelled.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Deleted settings.json file');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n","/**\n * IDE Sync Subcommand\n * Sync .jai1 content to IDE directories (rules, workflows, commands)\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\n\n/**\n * Create sync subcommand for IDE group\n * Syncs .jai1 content to IDE-specific directories\n */\nexport function createSyncSubcommand(): Command {\n const cmd = new Command('sync')\n .description('Sync .jai1 content to IDE directories (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runSync(options);\n });\n\n return cmd;\n}\n\nasync function runSync(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Sync rules and workflows to IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ No content found in .jai1/');\n console.log(' 💡 Create files in .jai1/rules/ or .jai1/workflows/ first.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Select target IDE(s) (SPACE to select, ENTER to confirm):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ No IDE selected!');\n console.log(' 💡 Select at least 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Select content types to sync:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ No content type selected!');\n console.log(' 💡 Select at least 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with sync?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Sync cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Syncing...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Sync complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n","/**\n * Migration service for IDE content migration\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport matter from 'gray-matter';\nimport type {\n MigrateIDE,\n MigrateContentType,\n SourceContentItem,\n MigrationResult,\n ScanSummary,\n IDEMigrationConfig,\n} from '../types/migrate-ide.types.js';\nimport { IDE_MIGRATION_CONFIGS } from '../constants/ide-migration-configs.js';\n\nexport class MigrateIdeService {\n private projectPath: string;\n private jai1Path: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.jai1Path = path.join(projectPath, '.jai1');\n }\n\n /**\n * Scan .jai1/ directory for content\n */\n async scanJai1Content(): Promise<ScanSummary> {\n const rules = await this.scanContentType('rules');\n const workflows = await this.scanContentType('workflows');\n const commands: SourceContentItem[] = [];\n\n return {\n rules,\n workflows,\n commands,\n totalCount: rules.length + workflows.length + commands.length,\n };\n }\n\n /**\n * Scan a specific content type\n */\n private async scanContentType(type: MigrateContentType): Promise<SourceContentItem[]> {\n const items: SourceContentItem[] = [];\n const dirPath = path.join(this.jai1Path, type);\n\n try {\n await fs.access(dirPath);\n } catch {\n return items;\n }\n\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(filepath, 'utf-8');\n const { data: frontmatter } = matter(content);\n\n items.push({\n type,\n name: path.basename(file, '.md'),\n filepath,\n relativePath: path.relative(this.projectPath, filepath),\n description: frontmatter.description as string | undefined,\n globs: this.extractGlobs(frontmatter),\n alwaysApply: this.extractAlwaysApply(frontmatter),\n });\n }\n\n return items;\n }\n\n /**\n * Generate stub file content with @ reference\n */\n generateStubContent(\n ide: MigrateIDE,\n sourceItem: SourceContentItem\n ): string {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) throw new Error(`Unknown IDE: ${ide}`);\n\n // Generate IDE-specific frontmatter\n const frontmatter = config.generateFrontmatter({\n description: sourceItem.description,\n globs: sourceItem.globs,\n alwaysApply: sourceItem.alwaysApply,\n sourceFile: sourceItem.relativePath,\n });\n\n // Generate @ reference\n const reference = `@${sourceItem.relativePath}`;\n\n // Combine frontmatter and reference\n if (frontmatter) {\n return `${frontmatter}\\n\\n${reference}\\n`;\n }\n return `${reference}\\n`;\n }\n\n /**\n * Migrate content to specific IDEs\n */\n async migrate(\n ides: MigrateIDE[],\n contentTypes: MigrateContentType[],\n content: ScanSummary,\n onProgress?: (result: MigrationResult) => void\n ): Promise<MigrationResult[]> {\n const results: MigrationResult[] = [];\n\n for (const ide of ides) {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) continue;\n\n // Migrate each content type\n for (const type of contentTypes) {\n const items = type === 'rules' ? content.rules :\n type === 'workflows' ? content.workflows :\n content.commands;\n\n for (const item of items) {\n const result = await this.migrateItem(ide, config, item);\n results.push(result);\n onProgress?.(result);\n }\n }\n }\n\n return results;\n }\n\n /**\n * Migrate a single item\n */\n private async migrateItem(\n ide: MigrateIDE,\n config: IDEMigrationConfig,\n item: SourceContentItem\n ): Promise<MigrationResult> {\n try {\n // Determine target path\n const targetPath = this.getTargetPath(config, item);\n\n if (!targetPath) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'skipped',\n error: `IDE ${config.id} does not support ${item.type}`,\n };\n }\n\n // Ensure directory exists\n const targetDir = path.dirname(targetPath);\n await fs.mkdir(targetDir, { recursive: true });\n\n // Check if file exists\n let status: 'created' | 'updated' = 'created';\n try {\n await fs.access(targetPath);\n status = 'updated';\n } catch {\n // File doesn't exist, will be created\n }\n\n // Generate stub content\n const stubContent = this.generateStubContent(ide, item);\n\n // Write file\n await fs.writeFile(targetPath, stubContent, 'utf-8');\n\n return {\n source: item,\n targetIDE: ide,\n targetPath,\n status,\n };\n } catch (error) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Get target file path for an item\n */\n private getTargetPath(config: IDEMigrationConfig, item: SourceContentItem): string | null {\n let contentPath: string | null = null;\n\n switch (item.type) {\n case 'rules':\n contentPath = config.rulesPath;\n break;\n case 'workflows':\n contentPath = config.workflowsPath;\n break;\n case 'commands':\n contentPath = config.commandsPath;\n break;\n }\n\n if (!contentPath) {\n return null;\n }\n\n const filename = `${item.name}${config.fileExtension}`;\n return path.join(this.projectPath, config.basePath, contentPath, filename);\n }\n\n // Helper methods\n private extractGlobs(frontmatter: Record<string, unknown>): string[] | undefined {\n const globs = frontmatter.globs;\n if (typeof globs === 'string') return [globs];\n if (Array.isArray(globs)) return globs as string[];\n return undefined;\n }\n\n private extractAlwaysApply(frontmatter: Record<string, unknown>): boolean {\n return frontmatter.alwaysApply === true ||\n frontmatter.trigger === 'always' ||\n frontmatter.trigger === 'always_on';\n }\n}\n","/**\n * IDE migration configurations\n */\nimport type { IDEMigrationConfig, FrontmatterOptions, MigrateIDE } from '../types/migrate-ide.types.js';\n\nexport const IDE_MIGRATION_CONFIGS: Record<MigrateIDE, IDEMigrationConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n rulesPath: 'rules',\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.mdc',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const lines = ['---'];\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n if (opts.globs && opts.globs.length > 0) {\n lines.push(`globs: ${opts.globs.join(', ')}`);\n }\n lines.push(`alwaysApply: ${opts.alwaysApply}`);\n lines.push('---');\n return lines.join('\\n');\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n icon: '🚀',\n basePath: '.agent',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n claudecode: {\n id: 'claudecode',\n name: 'Claude Code',\n icon: '🤖',\n basePath: '.claude',\n rulesPath: null,\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n if (opts.description) {\n return `---\\ndescription: ${opts.description}\\n---`;\n }\n return '';\n },\n },\n opencode: {\n id: 'opencode',\n name: 'OpenCode',\n icon: '💻',\n basePath: '.opencode',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n};\n\nexport function getMigrationIDEs(): MigrateIDE[] {\n return Object.keys(IDE_MIGRATION_CONFIGS) as MigrateIDE[];\n}\n\nexport function getIDEConfig(ide: MigrateIDE): IDEMigrationConfig | undefined {\n return IDE_MIGRATION_CONFIGS[ide];\n}\n","/**\n * Learn Command\n * Interactive guide center for Agentic Coding\n * \n * Renamed from 'guide' to 'learn' for clarity and brevity\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create learn command - Agentic Coding guide center\n */\nexport function createLearnCommand(): Command {\n const cmd = new Command('learn')\n .description('Interactive Agentic Coding learning center')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { MenuView } from './views/MenuView.js';\nimport { IntroView } from './views/IntroView.js';\nimport { RulesView } from './views/RulesView.js';\nimport { WorkflowsView } from './views/WorkflowsView.js';\nimport { PromptsView } from './views/PromptsView.js';\nimport { SkillsView } from './views/SkillsView.js';\nimport { AgenticGuideView } from './views/AgenticGuideView.js';\n\nexport type GuideTopic = 'menu' | 'intro' | 'rules' | 'workflows' | 'prompts' | 'skills' | 'agentic';\n\ninterface GuideAppProps {\n initialTopic?: string;\n onExit: () => void;\n}\n\nconst TOPIC_MAP: Record<string, GuideTopic> = {\n intro: 'intro',\n rules: 'rules',\n workflows: 'workflows',\n prompts: 'prompts',\n skills: 'skills',\n agentic: 'agentic',\n};\n\n/**\n * GuideApp - Interactive Agentic Coding Guide Center\n */\nexport const GuideApp: React.FC<GuideAppProps> = ({ initialTopic, onExit }) => {\n const { exit } = useApp();\n const [currentTopic, setCurrentTopic] = useState<GuideTopic>('menu');\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Set initial topic from CLI option\n useEffect(() => {\n if (initialTopic && TOPIC_MAP[initialTopic]) {\n setCurrentTopic(TOPIC_MAP[initialTopic]!);\n }\n }, [initialTopic]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape or Backspace to go back to menu\n if (key.escape || (currentTopic !== 'menu' && key.backspace)) {\n if (currentTopic === 'menu') {\n onExit();\n } else {\n setCurrentTopic('menu');\n setScrollPosition(0);\n }\n return;\n }\n\n // q to quit\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Scroll in content views\n if (currentTopic !== 'menu' && currentTopic !== 'agentic') {\n if (key.upArrow) {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollPosition(prev => prev + 1);\n } else if (key.pageDown) {\n setScrollPosition(prev => prev + 5);\n } else if (key.pageUp) {\n setScrollPosition(prev => Math.max(0, prev - 5));\n }\n }\n });\n\n const handleSelectTopic = (topic: GuideTopic) => {\n setCurrentTopic(topic);\n setScrollPosition(0);\n };\n\n const handleBack = () => {\n setCurrentTopic('menu');\n setScrollPosition(0);\n };\n\n // Render appropriate view\n const renderContent = () => {\n switch (currentTopic) {\n case 'menu':\n return <MenuView onSelect={handleSelectTopic} />;\n case 'intro':\n return <IntroView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'rules':\n return <RulesView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'workflows':\n return <WorkflowsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'prompts':\n return <PromptsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'skills':\n return <SkillsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'agentic':\n return <AgenticGuideView onBack={handleBack} />;\n default:\n return <MenuView onSelect={handleSelectTopic} />;\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"magenta\">🎓 Jai1 Guide</Text>\n <Text dimColor> - Trung tâm hướng dẫn Agentic Coding</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {currentTopic === 'menu'\n ? '[↑↓] Chọn · [Enter] Mở · [q] Thoát'\n : '[↑↓/PgUp/PgDn] Cuộn · [Esc/←] Quay lại · [q] Thoát'\n }\n </Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { GuideTopic } from '../GuideApp.js';\n\ninterface MenuViewProps {\n onSelect: (topic: GuideTopic) => void;\n}\n\ninterface MenuItem {\n id: GuideTopic;\n icon: string;\n title: string;\n description: string;\n badge?: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n {\n id: 'intro',\n icon: '📖',\n title: 'Giới thiệu Agentic Coding',\n description: 'Tổng quan về AI-assisted development và Jai1 Framework',\n },\n {\n id: 'rules',\n icon: '📜',\n title: 'IDE Rules',\n description: 'Quy tắc hướng dẫn AI hiểu context dự án của bạn',\n },\n {\n id: 'workflows',\n icon: '🔄',\n title: 'Workflows',\n description: 'Quy trình làm việc step-by-step (Cursor: Commands)',\n },\n {\n id: 'prompts',\n icon: '💬',\n title: 'Prompts',\n description: 'Cách viết prompts hiệu quả cho AI',\n },\n {\n id: 'skills',\n icon: '🛠',\n title: 'Skills',\n description: 'Mở rộng khả năng AI với skills chuyên biệt',\n },\n {\n id: 'agentic',\n icon: '🤖',\n title: 'Agentic Guide',\n description: 'Hỏi đáp trực tiếp với AI (interactive Q&A)',\n badge: 'Beta',\n },\n];\n\n/**\n * MenuView - Main menu showing all guide topics\n */\nexport const MenuView: React.FC<MenuViewProps> = ({ onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(MENU_ITEMS.length - 1, prev + 1));\n } else if (key.return) {\n const item = MENU_ITEMS[selectedIndex];\n if (item) {\n onSelect(item.id);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"magenta\">Jai1 Guide</Text>!</Text>\n <Text dimColor>\n Đây là trung tâm hướng dẫn giúp bạn làm chủ Agentic Coding -\n </Text>\n <Text dimColor>\n phương pháp phát triển phần mềm với sự hỗ trợ của AI.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn chủ đề để tìm hiểu:</Text>\n\n {MENU_ITEMS.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.badge && (\n <Text color=\"yellow\" dimColor> [{item.badge}]</Text>\n )}\n {isSelected && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n <Box marginTop={1}>\n <Text dimColor>💡 Tip: Dùng </Text>\n <Text color=\"cyan\">jai1 guide --topic rules</Text>\n <Text dimColor> để mở trực tiếp một chủ đề</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface IntroViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst INTRO_CONTENT = [\n {\n type: 'header' as const,\n text: '📖 Giới thiệu Agentic Coding',\n },\n {\n type: 'section' as const,\n title: 'Agentic Coding là gì?',\n content: `Agentic Coding (hay Agentic Software Development - ASD) là phương pháp \nphát triển phần mềm với sự hỗ trợ của AI agents. AI không chỉ suggest code, \nmà còn chủ động:\n • Đọc và hiểu codebase của bạn\n • Thực thi commands và scripts\n • Tạo, sửa, xóa files\n • Chạy tests và debug\n • Tương tác với terminal và browser`,\n },\n {\n type: 'section' as const,\n title: 'Jai1 Framework là gì?',\n content: `Jai1 là framework giúp bạn làm việc hiệu quả với AI agents trong các IDE:\n • Cursor\n • Windsurf \n • Claude Code\n • GitHub Copilot Workspace\n • Codeium\n\nFramework cung cấp:\n 📜 Rules - Quy tắc hướng dẫn AI hiểu dự án\n 🔄 Workflows - Quy trình làm việc step-by-step\n 💬 Prompts - Templates prompts hiệu quả\n 🛠 Skills - Mở rộng khả năng AI`,\n },\n {\n type: 'section' as const,\n title: 'Tại sao cần Jai1?',\n content: `AI agents mạnh mẽ, nhưng cần \"context\" để làm việc hiệu quả:\n \n ❌ Không có context:\n \"Tạo một API endpoint\" → AI không biết tech stack, conventions\n\n ✅ Có Jai1 Framework:\n \"Tạo một API endpoint\" → AI đọc rules, hiểu bạn dùng HonoJS,\n biết cấu trúc thư mục, coding conventions, tự động follow best practices`,\n },\n {\n type: 'section' as const,\n title: 'Bắt đầu nhanh',\n content: `1. Khởi tạo Jai1 trong dự án:\n $ jai1 init\n\n2. Cài đặt components cần thiết:\n $ jai1 apply\n\n3. Sử dụng workflows trong IDE:\n Gõ @workflow hoặc /workflow để trigger\n\n4. Tùy chỉnh rules theo dự án của bạn:\n Sửa files trong .jai1/rules/`,\n },\n {\n type: 'tip' as const,\n text: 'Tiếp theo, tìm hiểu về Rules - nền tảng quan trọng nhất của Agentic Coding!',\n },\n];\n\n/**\n * IntroView - Introduction to Agentic Coding\n */\nexport const IntroView: React.FC<IntroViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={INTRO_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ContentItem {\n type: 'header' | 'section' | 'tip' | 'warning';\n text?: string;\n title?: string;\n content?: string;\n}\n\ninterface ContentViewProps {\n content: ContentItem[];\n scrollPosition: number;\n}\n\n/**\n * ContentView - Scrollable content container for guide views\n */\nexport const ContentView: React.FC<ContentViewProps> = ({ content, scrollPosition }) => {\n // Flatten content into lines for scrolling\n const renderContent = () => {\n const lines: React.ReactNode[] = [];\n\n content.forEach((item, idx) => {\n switch (item.type) {\n case 'header':\n lines.push(\n <Box key={`header-${idx}`} marginBottom={1}>\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={2}\n paddingY={0}\n >\n <Text bold color=\"magenta\">{item.text}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'section':\n lines.push(\n <Box key={`section-${idx}`} flexDirection=\"column\" marginBottom={1}>\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n <Text bold color=\"cyan\">{item.title}</Text>\n </Box>\n <Box marginLeft={1} marginTop={1}>\n <Text>{item.content}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'tip':\n lines.push(\n <Box\n key={`tip-${idx}`}\n borderStyle=\"round\"\n borderColor=\"green\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"green\">💡 Tip: {item.text}</Text>\n </Box>\n );\n break;\n\n case 'warning':\n lines.push(\n <Box\n key={`warning-${idx}`}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"yellow\">⚠️ Lưu ý: {item.text}</Text>\n </Box>\n );\n break;\n }\n });\n\n return lines;\n };\n\n const allLines = renderContent();\n const visibleLines = allLines.slice(scrollPosition, scrollPosition + 15);\n const hasMore = scrollPosition + 15 < allLines.length;\n const hasPrevious = scrollPosition > 0;\n\n return (\n <Box flexDirection=\"column\">\n {/* Scroll indicator top */}\n {hasPrevious && (\n <Box justifyContent=\"center\">\n <Text dimColor>↑ Cuộn lên để xem thêm</Text>\n </Box>\n )}\n\n {/* Content */}\n <Box flexDirection=\"column\">\n {visibleLines}\n </Box>\n\n {/* Scroll indicator bottom */}\n {hasMore && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>↓ Cuộn xuống để xem thêm ({allLines.length - scrollPosition - 15} items)</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface RulesViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst RULES_CONTENT = [\n {\n type: 'header' as const,\n text: '📜 IDE Rules - Quy tắc cho AI',\n },\n {\n type: 'section' as const,\n title: 'Rules là gì?',\n content: `Rules là các file Markdown chứa hướng dẫn cho AI agent. \nChúng giúp AI hiểu:\n • Tech stack của dự án (Laravel, NestJS, React...)\n • Coding conventions (naming, patterns...)\n • Cấu trúc thư mục và architecture\n • Business logic và domain knowledge`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Thư mục │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Rules │ .cursor/rules/ │\n│ Windsurf │ Rules │ .windsurf/rules/ │\n│ Antigravity │ Rules │ .agent/rules/ │\n│ Claude Code │ CLAUDE.md │ CLAUDE.md (root) │\n│ Copilot │ Instructions │ .github/copilot/ │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Rule file',\n content: `---\ndescription: [Mô tả ngắn khi nào rule này được apply]\nglobs: [Optional - file patterns để auto-apply]\n---\n\n# Tên Rule\n\n## Purpose\nGiải thích mục đích của rule\n\n## Conventions\nCác quy tắc cần tuân theo\n\n## Examples\nVí dụ minh họa (nếu cần)`,\n },\n {\n type: 'section' as const,\n title: 'Các loại Rules',\n content: `1. Global Rules (always active)\n • Conventions chung của dự án\n • Tech stack và dependencies\n • Coding style guidelines\n\n2. Contextual Rules (auto-applied by globs)\n • Frontend rules (cho *.tsx, *.vue...)\n • Backend rules (cho routes, controllers...)\n • Testing rules (cho *.test.*, *.spec.*)\n\n3. On-demand Rules\n • Gọi khi cần bằng @ruleName\n • Ví dụ: @database-migration, @api-design`,\n },\n {\n type: 'section' as const,\n title: 'Best Practices',\n content: `✅ DO:\n • Viết rules ngắn gọn, dễ đọc\n • Focus vào \"what to do\", không phải \"how to do\"\n • Cập nhật rules khi dự án thay đổi\n • Chia nhỏ rules theo domain/feature\n\n❌ DON'T:\n • Viết rules quá dài (>1000 tokens)\n • Copy-paste toàn bộ documentation\n • Include code examples quá chi tiết\n • Hardcode paths hoặc values`,\n },\n {\n type: 'tip' as const,\n text: 'Dùng \"jai1 apply rules/...\" để cài đặt rules mẫu cho tech stack của bạn!',\n },\n];\n\n/**\n * RulesView - Guide for IDE Rules\n */\nexport const RulesView: React.FC<RulesViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={RULES_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface WorkflowsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst WORKFLOWS_CONTENT = [\n {\n type: 'header' as const,\n text: '🔄 Workflows - Quy trình làm việc',\n },\n {\n type: 'section' as const,\n title: 'Workflows là gì?',\n content: `Workflows là tập hợp các bước tuần tự để AI thực hiện một tác vụ phức tạp.\nThay vì viết prompt dài dòng, bạn chỉ cần trigger workflow.\n\nVí dụ: /develop-feature\n → AI tự động: đọc task → plan → code → test → commit`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Cách trigger │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Commands │ / hoặc @command │\n│ Windsurf │ Workflows │ @workflow │\n│ Antigravity │ Workflows │ /workflow │\n│ Claude Code │ (Manual) │ Gọi CLAUDE.md │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc Workflow file',\n content: `---\ndescription: [Mô tả ngắn về workflow]\n---\n\n# Tên Workflow\n\n## ⚠️ CRITICAL RULES\nCác quy tắc bắt buộc phải tuân theo\n\n## 🎯 INPUT\nNhững gì cần có trước khi bắt đầu\n\n## 🔄 WORKFLOW PHASES\n### Phase 1: [Tên phase]\n- Step-by-step instructions\n- Commands to run\n- Validations to check\n\n### Phase 2: [Tên phase]\n...\n\n## ✅ QUALITY CHECKLIST\nChecklist kiểm tra khi hoàn thành`,\n },\n {\n type: 'section' as const,\n title: 'Workflows có sẵn trong Jai1',\n content: `/develop-feature Phát triển feature mới với auto-implement\n/fix-feature Sửa bugs với root cause analysis\n/commit-it Safe commit với security checks\n/gen-single-docs Generate documentation cho feature\n/setup-honojs Setup HonoJS + Drizzle cho dự án\n/create-prd Tạo Product Requirements Document`,\n },\n {\n type: 'section' as const,\n title: 'Đặc điểm của Workflow tốt',\n content: `✅ Continuous Execution\n • AI chạy liền mạch, không dừng hỏi user trừ khi thật sự cần\n\n✅ Progress Tracking\n • Tạo todo.md để track tiến độ\n • Hỗ trợ auto-resume từ checkpoint\n\n✅ Quality Gates\n • Có validation ở mỗi phase\n • Checklist kiểm tra cuối cùng\n\n✅ Error Handling\n • Xử lý errors gracefully\n • Có rollback plan khi thất bại`,\n },\n {\n type: 'tip' as const,\n text: 'Workflows mạnh nhất khi kết hợp với Rules - AI sẽ follow cả quy trình lẫn conventions!',\n },\n];\n\n/**\n * WorkflowsView - Guide for Workflows\n */\nexport const WorkflowsView: React.FC<WorkflowsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={WORKFLOWS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface PromptsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst PROMPTS_CONTENT = [\n {\n type: 'header' as const,\n text: '💬 Prompts - Giao tiếp hiệu quả với AI',\n },\n {\n type: 'section' as const,\n title: 'Prompts trong Agentic Coding',\n content: `Trong Agentic Coding, prompts không chỉ là \"hỏi một câu\" - \nmà là cách bạn định hướng AI thực hiện công việc phức tạp.\n\nVới Jai1 Framework, AI đã có sẵn context từ Rules,\nnên prompts của bạn có thể ngắn gọn và tập trung vào mục đích.`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Patterns hiệu quả',\n content: `1. ⚡ Quick Task Pattern\n \"Tạo API endpoint cho user registration\"\n → AI tự áp dụng conventions từ rules\n\n2. 📋 Task with Context Pattern \n \"Tạo API endpoint cho user registration.\n Bảng users: id, email, password_hash, created_at\"\n → Thêm context cụ thể cho task\n\n3. 🔄 Workflow Trigger Pattern\n \"@workflow develop-feature: Implement user login\"\n → Trigger toàn bộ workflow\n\n4. 🎯 Constraint Pattern\n \"Refactor UserService. Giữ nguyên public interface, \n chỉ extract private methods\"\n → Định rõ giới hạn`,\n },\n {\n type: 'section' as const,\n title: 'DO vs DON\\'T',\n content: `✅ NÊN:\n • Nêu rõ mục đích (\"để làm gì\")\n • Cung cấp context cụ thể\n • Định scope rõ ràng\n • Mention files/functions liên quan\n\n❌ KHÔNG NÊN:\n • Viết quá dài (AI mất focus)\n • Yêu cầu mơ hồ (\"fix bugs\")\n • Giả định AI biết context không có trong rules\n • Hỏi nhiều việc trong 1 prompt`,\n },\n {\n type: 'section' as const,\n title: 'Levels of Prompting',\n content: `Level 1: Simple (có Rules)\n \"Tạo model Product\"\n → AI follow conventions từ rules\n\nLevel 2: Guided (có context)\n \"Tạo model Product với: name, price, category_id, status\"\n → AI có thêm thông tin cụ thể\n\nLevel 3: Workflow\n \"@workflow: develop-feature Product CRUD\"\n → AI chạy toàn bộ quy trình\n\nLevel 4: Collaborative\n Chat multi-turn với AI để refine solution\n → Phù hợp với complex problems`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Templates trong Jai1',\n content: `Jai1 cung cấp prompt templates cho các use cases phổ biến:\n\n prompts/code-review.md Review và improve code\n prompts/debug-issue.md Debug với context đầy đủ\n prompts/explain-code.md Giải thích code cho team\n prompts/refactor.md Refactor patterns\n \nCài đặt: jai1 apply prompts/...`,\n },\n {\n type: 'tip' as const,\n text: 'Prompts ngắn + Rules tốt = Kết quả chính xác nhất!',\n },\n];\n\n/**\n * PromptsView - Guide for effective prompts\n */\nexport const PromptsView: React.FC<PromptsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={PROMPTS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface SkillsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst SKILLS_CONTENT = [\n {\n type: 'header' as const,\n text: '🛠 Skills - Mở rộng khả năng AI',\n },\n {\n type: 'section' as const,\n title: 'Skills là gì?',\n content: `Skills là \"kỹ năng\" chuyên biệt mà AI có thể học và sử dụng.\nMỗi skill là một gói hướng dẫn chi tiết cho một tác vụ cụ thể.\n\nKhác với Rules (context chung) và Workflows (quy trình):\n • Rules: \"Dự án dùng Laravel, naming convention như này...\"\n • Workflows: \"Để phát triển feature, làm theo các bước 1-2-3...\"\n • Skills: \"Để generate commit message, phân tích diff như này...\"`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Skill',\n content: `skills/\n└── skill-name/\n ├── SKILL.md # Main instruction file\n ├── scripts/ # Scripts hỗ trợ (optional)\n ├── references/ # Reference materials (optional)\n └── assets/ # Assets như templates (optional)\n\nSKILL.md format:\n---\nname: skill-name\ndescription: Mô tả ngắn\ntriggers: [patterns kích hoạt skill]\n---\n\n## Purpose\n## Steps\n## Examples`,\n },\n {\n type: 'section' as const,\n title: 'Skills có sẵn trong Jai1',\n content: `🎯 Development Skills:\n gen-commit-message Tạo commit message từ staged changes\n gen-prd Generate Product Requirements Document\n skill-creator Hướng dẫn tạo skill mới\n\n🖼 Media Skills:\n merge-mp4-files Merge video files với ffmpeg\n vid-scene-gen Generate video scene prompts\n\n📝 Documentation Skills:\n gen-frd Generate Functional Requirements Doc\n gen-tdd Generate Technical Design Doc`,\n },\n {\n type: 'section' as const,\n title: 'Cách sử dụng Skills',\n content: `1. Trigger bằng pattern:\n \"skill:gen-commit-message\"\n \"Dùng skill gen-commit-message để tạo message\"\n\n2. Kết hợp với Workflow:\n Workflows có thể gọi skills bên trong các phase\n\n3. Direct call trong chat:\n \"@skill/gen-commit-message\" (tùy IDE)`,\n },\n {\n type: 'section' as const,\n title: 'Tạo Skill mới',\n content: `Dùng workflow skill-creator:\n\n1. Xác định use case cụ thể\n2. Viết SKILL.md với format chuẩn\n3. Thêm scripts/references nếu cần\n4. Test với AI\n\nBest Practices:\n ✅ Skill nên focused vào 1 task\n ✅ Steps rõ ràng, actionable\n ✅ Có examples minh họa\n ❌ Không làm skill quá generic`,\n },\n {\n type: 'tip' as const,\n text: 'Skills giống như teaching AI một kỹ năng mới - càng chi tiết, AI càng làm tốt!',\n },\n];\n\n/**\n * SkillsView - Guide for Skills\n */\nexport const SkillsView: React.FC<SkillsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={SKILLS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport Spinner from 'ink-spinner';\n\ninterface AgenticGuideViewProps {\n onBack: () => void;\n}\n\ninterface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: Date;\n}\n\n// Suggested questions for quick access\nconst SUGGESTED_QUESTIONS = [\n 'Rules là gì?',\n 'Setup Jai1',\n 'Best practices workflows',\n 'Rules vs Skills',\n];\n\n// Mock responses\nconst MOCK_RESPONSES: Record<string, string> = {\n 'rules': `Rules là các file Markdown định nghĩa context cho AI.\nGiúp AI hiểu tech stack, conventions, architecture.\nVị trí: .cursor/rules/, .windsurf/rules/\nTip: Chạy \"jai1 apply rules/\" để cài rules mẫu!`,\n\n 'setup': `Setup Jai1:\n1. jai1 init\n2. jai1 apply (chọn components)\n3. jai1 vscode sync\n4. Tùy chỉnh .jai1/rules/ theo dự án`,\n\n 'workflows': `Best Practices Workflows:\n• Continuous execution (không dừng hỏi user)\n• Progress tracking với todo.md\n• Chia nhỏ thành phases rõ ràng\n• Quality gates ở mỗi phase`,\n\n 'skills': `Rules vs Skills:\n• Rules: Context chung, always active\n• Skills: Kỹ năng chuyên biệt, on-demand\nDùng cả hai: Rules cho context, Skills cho actions!`,\n\n 'default': `Tôi có thể trả lời về:\n• Rules - Quy tắc cho AI\n• Workflows - Quy trình làm việc\n• Skills - Kỹ năng mở rộng\n• Setup - Cài đặt Jai1\n\nThử hỏi: \"Rules là gì?\" hoặc \"Setup Jai1\"`,\n};\n\nfunction getMockResponse(message: string): string {\n const lower = message.toLowerCase();\n\n if (lower.includes('rule') || lower.includes('quy tắc')) {\n return MOCK_RESPONSES['rules']!;\n }\n if (lower.includes('setup') || lower.includes('init') || lower.includes('cài đặt')) {\n return MOCK_RESPONSES['setup']!;\n }\n if (lower.includes('workflow') || lower.includes('quy trình')) {\n return MOCK_RESPONSES['workflows']!;\n }\n if (lower.includes('skill') || lower.includes('khác')) {\n return MOCK_RESPONSES['skills']!;\n }\n\n return MOCK_RESPONSES['default']!;\n}\n\n/**\n * AgenticGuideView - Interactive Chat UI for AI Q&A\n */\nexport const AgenticGuideView: React.FC<AgenticGuideViewProps> = ({ onBack }) => {\n const [messages, setMessages] = useState<ChatMessage[]>([\n {\n id: 'welcome',\n role: 'system',\n content: 'Chào mừng đến Agentic Guide! Hỏi về Agentic Coding.',\n timestamp: new Date(),\n },\n ]);\n const [inputValue, setInputValue] = useState('');\n const [isTyping, setIsTyping] = useState(false);\n const [selectedSuggestion, setSelectedSuggestion] = useState(0);\n const [focusArea, setFocusArea] = useState<'suggestions' | 'input'>('input');\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape to go back\n if (key.escape) {\n onBack();\n return;\n }\n\n // Tab to switch focus\n if (key.tab) {\n setFocusArea(prev => prev === 'input' ? 'suggestions' : 'input');\n return;\n }\n\n // Handle suggestions navigation when focused\n if (focusArea === 'suggestions') {\n if (key.leftArrow) {\n setSelectedSuggestion(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedSuggestion(prev => Math.min(SUGGESTED_QUESTIONS.length - 1, prev + 1));\n } else if (key.return) {\n const question = SUGGESTED_QUESTIONS[selectedSuggestion];\n if (question) {\n handleSendMessage(question);\n setFocusArea('input');\n }\n }\n }\n });\n\n // Send message handler\n const handleSendMessage = async (text: string) => {\n if (!text.trim() || isTyping) return;\n\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInputValue('');\n setIsTyping(true);\n\n // Simulate AI thinking delay\n await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 700));\n\n const response = getMockResponse(text);\n\n const assistantMessage: ChatMessage = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response,\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, assistantMessage]);\n setIsTyping(false);\n };\n\n // Handle input submit\n const handleSubmit = (value: string) => {\n handleSendMessage(value);\n };\n\n // Render message content with proper line breaks\n const renderMessageContent = (content: string) => {\n const lines = content.split('\\n');\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i}>{line || ' '}</Text>\n ))}\n </Box>\n );\n };\n\n // Get visible messages (last 4 to prevent overflow)\n const visibleMessages = messages.slice(-4);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color=\"magenta\">🤖 Agentic Guide</Text>\n <Text dimColor> - Hỏi đáp AI</Text>\n <Box flexGrow={1} />\n <Text backgroundColor=\"green\" color=\"black\" bold> BETA </Text>\n </Box>\n\n {/* Chat Messages Area */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n padding={1}\n marginBottom={1}\n minHeight={10}\n >\n {visibleMessages.map((msg) => (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={1}>\n {msg.role === 'user' ? (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\" bold>Bạn:</Text>\n <Box marginLeft={2}>\n <Text>{msg.content}</Text>\n </Box>\n </Box>\n ) : msg.role === 'assistant' ? (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>AI:</Text>\n <Box marginLeft={2}>\n {renderMessageContent(msg.content)}\n </Box>\n </Box>\n ) : (\n <Box>\n <Text dimColor italic>{msg.content}</Text>\n </Box>\n )}\n </Box>\n ))}\n\n {/* Typing indicator */}\n {isTyping && (\n <Box>\n <Text color=\"green\">\n <Spinner type=\"dots\" /> AI đang trả lời...\n </Text>\n </Box>\n )}\n\n {/* Scroll hint */}\n {messages.length > 4 && (\n <Box justifyContent=\"center\">\n <Text dimColor>({messages.length - 4} tin nhắn trước)</Text>\n </Box>\n )}\n </Box>\n\n {/* Suggested Questions */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor bold>💡 Gợi ý:</Text>\n <Box marginTop={1}>\n {SUGGESTED_QUESTIONS.map((q, i) => {\n const isSelected = focusArea === 'suggestions' && i === selectedSuggestion;\n return (\n <Box key={i} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n {isSelected ? '❯' : ' '} {i + 1}. {q}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Input Box */}\n <Box\n borderStyle=\"round\"\n borderColor={focusArea === 'input' ? 'cyan' : 'gray'}\n paddingX={1}\n marginBottom={1}\n >\n <Text color={focusArea === 'input' ? 'cyan' : 'gray'}>❯ </Text>\n {focusArea === 'input' ? (\n <TextInput\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder=\"Nhập câu hỏi...\"\n focus={true}\n />\n ) : (\n <Text dimColor>Nhấn Tab để nhập...</Text>\n )}\n </Box>\n\n {/* Help */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Chuyển · [Enter] Gửi/Chọn · [←→] Di chuyển gợi ý · [Esc] Quay lại\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Chat Command\n * Interactive chat with Jai1 LLM Proxy\n * Fullscreen terminal experience\n */\nimport { Command } from 'commander';\nimport React from 'react';\nimport { render } from 'ink';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ChatApp } from '../ui/llm/LlmApp.js';\nimport { ValidationError } from '../errors/index.js';\n\ninterface ChatCommandOptions {\n model?: string;\n}\n\n/**\n * Handle chat command\n */\nasync function handleChatCommand(options: ChatCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n // Render fullscreen app\n const { waitUntilExit, clear } = render(\n React.createElement(ChatApp, {\n service,\n initialModel: options.model,\n }),\n {\n // Enable fullscreen mode - clears terminal on exit\n exitOnCtrlC: false, // We handle exit via Esc\n }\n );\n\n await waitUntilExit();\n\n // Clear screen on exit for clean terminal\n clear();\n}\n\n/**\n * Create chat command\n */\nexport function createChatCommand(): Command {\n const cmd = new Command('chat')\n .description('Interactive AI chat with Jai1 LLM Proxy')\n .option('--model <model>', 'Initial model to use (e.g., gpt-4o, claude-3-opus)')\n .action(async (options: ChatCommandOptions) => {\n await handleChatCommand(options);\n });\n\n return cmd;\n}\n","/**\n * LLM Proxy Service\n * Client for interacting with Jai1 LLM proxy API\n */\nimport type { Jai1Config } from '../types/framework.types.js';\nimport type {\n ModelsResponse,\n UserLimits,\n UsageStats,\n CompletionMessage,\n ChatCompletionChunk,\n ModelWithUsage,\n} from '../types/llm.types.js';\n\nexport class LlmProxyService {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(config: Jai1Config) {\n // Remove trailing slash if present\n this.baseUrl = config.apiUrl.replace(/\\/$/, '');\n this.apiKey = config.accessKey;\n }\n\n /**\n * Get the base URL for the LLM proxy (OpenAI-compatible endpoint)\n */\n getBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Fetch available models\n */\n async getModels(): Promise<ModelsResponse> {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Fetch user limits\n */\n async getLimits(): Promise<UserLimits> {\n const response = await fetch(`${this.baseUrl}/v1/me/limits`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch limits: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result.data;\n }\n\n /**\n * Fetch usage statistics\n */\n async getUsage(days = 7): Promise<UsageStats> {\n const response = await fetch(`${this.baseUrl}/v1/me/usage?days=${days}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch usage: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get models with usage information\n */\n async getModelsWithUsage(): Promise<ModelWithUsage[]> {\n const [modelsRes, limits, usage] = await Promise.all([\n this.getModels(),\n this.getLimits(),\n this.getUsage(1), // Today only\n ]);\n\n // Use GMT+7 timezone to match API date recording\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n\n return modelsRes.data.map((model) => {\n const allowed = limits.allowedModels.includes(model.id);\n const dailyLimit = limits.rateLimits[model.id] ?? limits.rateLimits[model.id.toLowerCase()];\n\n // Find usage record - try exact match first, then case-insensitive\n const usageRecord = usage.data.find(\n (u) => u.model === model.id && u.date === today\n ) || usage.data.find(\n (u) => u.model.toLowerCase() === model.id.toLowerCase() && u.date === today\n );\n const usedToday = usageRecord?.count || 0;\n\n return {\n ...model,\n allowed,\n dailyLimit,\n usedToday,\n };\n });\n }\n\n /**\n * Non-streaming chat completion (for translation and complete responses)\n * @returns Complete response content\n */\n async chat(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): Promise<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n const result = await response.json();\n return result.choices[0]?.message?.content || '';\n }\n\n /**\n * Stream chat completion\n * @yields Streamed text chunks\n */\n async *chatStream(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): AsyncGenerator<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk;\n const content = parsed.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n } catch (e) {\n // Skip malformed('Failed to parse SSE chunk:', e);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate sample cURL command\n */\n generateCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey.slice(0, 12)}...\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n\n /**\n * Generate full cURL command with actual API key\n */\n generateFullCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n}\n","/**\n * ChatApp - Main LLM Proxy Chat Application\n * Interactive TUI for chatting with LLM API\n * Simple layout to avoid re-render flickering\n */\nimport React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { LlmProxyService } from '../../services/llm-proxy.service.js';\nimport { useChat } from './hooks/useChat.js';\nimport { useLlmApi } from './hooks/useLlmApi.js';\nimport { ChatPanel } from './components/ChatPanel.js';\nimport { ModelSelector } from './components/ModelSelector.js';\nimport { SlashCommand } from './components/SlashCommandMenu.js';\n\n// Available slash commands - defined outside component to prevent recreation\nconst SLASH_COMMANDS: SlashCommand[] = [\n { name: 'model', description: 'Change the AI model', aliases: ['m'] },\n { name: 'stats', description: 'Show model usage statistics', aliases: ['s'] },\n { name: 'quit', description: 'Exit the chat', aliases: ['q', 'exit'] },\n];\n\ninterface ChatAppProps {\n service: LlmProxyService;\n initialModel?: string;\n}\n\ntype ViewType = 'loading' | 'chat' | 'model' | 'stats';\n\nexport const ChatApp: React.FC<ChatAppProps> = ({ service, initialModel }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n // Capture terminal inner height once on mount (subtract header + footer = ~6 lines)\n const contentHeight = useRef(Math.max(10, (stdout?.rows || 24) - 6));\n\n // Core state\n const [currentView, setCurrentView] = useState<ViewType>('loading');\n const [showSlashMenu, setShowSlashMenu] = useState(false);\n const [slashMenuIndex, setSlashMenuIndex] = useState(0);\n const [inputValue, setInputValue] = useState('');\n const [selectedModel, setSelectedModel] = useState<string>('');\n\n // API data\n const { models, loading, refetch } = useLlmApi(service);\n\n // Chat state\n const { messages, isStreaming, sendMessage } = useChat(service);\n\n // Set initial model when loaded\n useEffect(() => {\n if (models.length > 0 && !selectedModel) {\n const first = models.find((m) => m.allowed);\n if (first) {\n setSelectedModel(initialModel || first.id);\n setCurrentView('chat');\n }\n }\n }, [models, selectedModel, initialModel]);\n\n // Filter commands based on input\n const filteredCommands = useMemo(() => {\n if (!inputValue.startsWith('/')) return SLASH_COMMANDS;\n const filter = inputValue.slice(1).toLowerCase();\n return SLASH_COMMANDS.filter(\n (cmd) => cmd.name.includes(filter) || cmd.aliases?.some((a) => a.includes(filter))\n );\n }, [inputValue]);\n\n // Handlers\n const cycleModel = useCallback(() => {\n const allowed = models.filter((m) => m.allowed);\n if (allowed.length === 0) return;\n const idx = allowed.findIndex((m) => m.id === selectedModel);\n setSelectedModel(allowed[(idx + 1) % allowed.length]!.id);\n }, [models, selectedModel]);\n\n const execCommand = useCallback((cmd: string) => {\n const c = cmd.toLowerCase().replace(/^\\//, '');\n if (c === 'model' || c === 'm') { setCurrentView('model'); return true; }\n if (c === 'stats' || c === 's') { setCurrentView('stats'); refetch(); return true; }\n if (c === 'quit' || c === 'q' || c === 'exit') { exit(); return true; }\n return false;\n }, [refetch, exit]);\n\n // Keyboard input\n useInput((input, key) => {\n if (showSlashMenu) {\n if (key.upArrow) { setSlashMenuIndex((i) => Math.max(0, i - 1)); return; }\n if (key.downArrow) { setSlashMenuIndex((i) => Math.min(filteredCommands.length - 1, i + 1)); return; }\n if (key.return && filteredCommands[slashMenuIndex]) {\n setShowSlashMenu(false);\n execCommand(filteredCommands[slashMenuIndex].name);\n setInputValue('');\n return;\n }\n }\n if (key.escape) {\n if (showSlashMenu) { setShowSlashMenu(false); setInputValue(''); }\n else if (currentView !== 'chat' && currentView !== 'loading') { setCurrentView('chat'); }\n else { exit(); }\n return;\n }\n if (key.tab && currentView === 'chat' && !showSlashMenu && !isStreaming) {\n cycleModel();\n }\n }, { isActive: true });\n\n const onInputChange = useCallback((v: string) => {\n setInputValue(v);\n const show = v.startsWith('/');\n setShowSlashMenu(show);\n if (show && v === '/') setSlashMenuIndex(0);\n }, []);\n\n const onSubmit = useCallback((v: string) => {\n const t = v.trim();\n setShowSlashMenu(false);\n if (t.startsWith('/') && execCommand(t)) { setInputValue(''); return; }\n if (t && !isStreaming && selectedModel) { sendMessage(t, selectedModel); setInputValue(''); }\n }, [execCommand, isStreaming, selectedModel, sendMessage]);\n\n const onSelectModel = useCallback((id: string) => {\n setSelectedModel(id);\n setCurrentView('chat');\n }, []);\n\n // Render stats\n const statsView = useMemo(() => {\n const allowed = models.filter((m) => m.allowed);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">📊 Model Usage Statistics</Text>\n {allowed.map((m) => {\n const limit = m.dailyLimit ?? 0;\n const used = m.usedToday ?? 0;\n const pct = limit > 0 ? Math.round((used / limit) * 100) : 0;\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n return (\n <Box key={m.id} flexDirection=\"column\">\n <Text color={m.id === selectedModel ? 'yellow' : 'white'}>\n {m.id === selectedModel ? '► ' : ' '}{m.id}\n </Text>\n <Text color={pct > 80 ? 'red' : pct > 50 ? 'yellow' : 'green'}>\n {' '}{bar} <Text dimColor>{used}/{limit}</Text>\n </Text>\n </Box>\n );\n })}\n <Text dimColor>[Esc] Back</Text>\n </Box>\n );\n }, [models, selectedModel]);\n\n // Footer text\n const footer = currentView === 'model' || currentView === 'stats'\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Back'\n : showSlashMenu\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Cancel'\n : '[Tab] Next Model • [/] Commands • [Esc] Quit';\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box borderStyle=\"double\" borderColor=\"magenta\" paddingX={1}>\n <Text bold color=\"magenta\">🤖 Jai1 Chat</Text>\n <Box flexGrow={1} />\n <Text dimColor>Model: </Text>\n <Text color=\"yellow\" bold>{selectedModel || '...'}</Text>\n </Box>\n\n {/* Content */}\n {currentView === 'loading' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\">\n <Text><Spinner type=\"dots\" /> Loading...</Text>\n </Box>\n ) : currentView === 'model' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n <ModelSelector\n models={models}\n currentModel={selectedModel}\n onSelect={onSelectModel}\n onCancel={() => setCurrentView('chat')}\n />\n </Box>\n ) : currentView === 'stats' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n {statsView}\n </Box>\n ) : (\n <ChatPanel\n messages={messages}\n isStreaming={isStreaming}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onSubmit={onSubmit}\n inputFocused={!showSlashMenu}\n showSlashMenu={showSlashMenu}\n slashCommands={filteredCommands}\n slashMenuIndex={slashMenuIndex}\n minHeight={contentHeight.current}\n />\n )}\n\n {/* Footer */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * useChat hook\n * Manages chat state and streaming responses\n */\nimport { useState, useCallback } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ChatMessage, CompletionMessage } from '../../../types/llm.types.js';\n\nexport function useChat(service: LlmProxyService) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendMessage = useCallback(\n async (content: string, model: string) => {\n if (!content.trim() || isStreaming) return;\n\n // Add user message\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant message placeholder\n const assistantMessageId = `assistant-${Date.now()}`;\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n try {\n // Convert chat messages to completion messages\n const completionMessages: CompletionMessage[] = [\n ...messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n {\n role: 'user' as const,\n content: content.trim(),\n },\n ];\n\n // Stream response\n let fullContent = '';\n for await (const chunk of service.chatStream(completionMessages, model)) {\n fullContent += chunk;\n\n // Update message content incrementally\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: fullContent }\n : msg\n )\n );\n }\n\n setIsStreaming(false);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n\n // Update last message with error\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: `Error: ${errorMessage}` }\n : msg\n )\n );\n\n setIsStreaming(false);\n }\n },\n [service, messages, isStreaming]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n clearMessages,\n };\n}\n","/**\n * useLlmApi hook\n * Manages LLM API data fetching and state\n * Only fetches once on mount - use refetch for manual updates\n */\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ModelWithUsage, UserLimits, UsageStats } from '../../../types/llm.types.js';\n\ninterface LlmApiState {\n models: ModelWithUsage[];\n limits: UserLimits | null;\n usage: UsageStats | null;\n loading: boolean;\n error: string | null;\n}\n\nexport function useLlmApi(service: LlmProxyService) {\n const [state, setState] = useState<LlmApiState>({\n models: [],\n limits: null,\n usage: null,\n loading: true,\n error: null,\n });\n\n // Track if we've already fetched\n const hasFetched = useRef(false);\n\n const fetchData = useCallback(async (showLoading = false) => {\n // Only show loading on initial fetch\n if (showLoading) {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n }\n\n try {\n const [models, limits, usage] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n service.getUsage(7),\n ]);\n\n setState({\n models,\n limits,\n usage,\n loading: false,\n error: null,\n });\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n }));\n }\n }, [service]);\n\n // Only fetch once on mount\n useEffect(() => {\n if (!hasFetched.current) {\n hasFetched.current = true;\n fetchData(true);\n }\n }, []);\n\n // Refetch without showing loading state (for background updates)\n const refetch = useCallback(() => {\n fetchData(false);\n }, [fetchData]);\n\n return {\n ...state,\n refetch,\n };\n}\n","/**\n * ChatPanel component\n * Simple, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { MessageItem } from './MessageItem.js';\nimport { InputBox } from './InputBox.js';\nimport { SlashCommand } from './SlashCommandMenu.js';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface ChatPanelProps {\n messages: ChatMessage[];\n isStreaming: boolean;\n inputValue: string;\n onInputChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputFocused?: boolean;\n showSlashMenu?: boolean;\n slashCommands?: SlashCommand[];\n slashMenuIndex?: number;\n minHeight?: number;\n}\n\n// Memoized message list to prevent re-renders\nconst MessageList = memo(({ messages }: { messages: ChatMessage[] }) => {\n const visible = messages.slice(-8);\n const hidden = messages.length - visible.length;\n\n if (visible.length === 0) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" padding={1}>\n <Text dimColor>Start a conversation...</Text>\n <Text dimColor>Type / for commands</Text>\n </Box>\n );\n }\n\n return (\n <>\n {hidden > 0 && <Text dimColor>({hidden} earlier)</Text>}\n {visible.map((m) => <MessageItem key={m.id} message={m} />)}\n </>\n );\n});\n\n// Memoized slash menu\nconst SlashMenu = memo(({ commands, index }: { commands: SlashCommand[]; index: number }) => (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">Commands</Text>\n {commands.map((cmd, i) => (\n <Text\n key={cmd.name}\n backgroundColor={i === index ? 'cyan' : undefined}\n color={i === index ? 'black' : 'white'}\n >\n {i === index ? '› ' : ' '}/{cmd.name} - {cmd.description}\n </Text>\n ))}\n </Box>\n));\n\nexport const ChatPanel: React.FC<ChatPanelProps> = ({\n messages,\n isStreaming,\n inputValue,\n onInputChange,\n onSubmit,\n inputFocused = true,\n showSlashMenu = false,\n slashCommands = [],\n slashMenuIndex = 0,\n minHeight = 15,\n}) => {\n // Subtract space for input box (~3 lines) and slash menu if shown (~5 lines)\n const messagesMinHeight = Math.max(5, minHeight - 4 - (showSlashMenu ? 5 : 0));\n\n return (\n <Box flexDirection=\"column\">\n {/* Messages */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} minHeight={messagesMinHeight}>\n <MessageList messages={messages} />\n {isStreaming && (\n <Text color=\"green\"><Spinner type=\"dots\" /> Responding...</Text>\n )}\n </Box>\n\n {/* Slash menu */}\n {showSlashMenu && slashCommands.length > 0 && (\n <SlashMenu commands={slashCommands} index={slashMenuIndex} />\n )}\n\n {/* Input */}\n <InputBox\n value={inputValue}\n onChange={onInputChange}\n onSubmit={onSubmit}\n disabled={isStreaming}\n focused={inputFocused}\n />\n </Box>\n );\n};\n","/**\n * MessageItem component\n * Memoized to prevent re-renders\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface MessageItemProps {\n message: ChatMessage;\n}\n\nexport const MessageItem = memo<MessageItemProps>(({ message }) => {\n if (message.role === 'user') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"cyan\" bold>You:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n if (message.role === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"green\" bold>Jai1:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>{message.content}</Text>\n </Box>\n );\n});\n","/**\n * InputBox component\n * Memoized, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface InputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n disabled?: boolean;\n focused?: boolean;\n}\n\nexport const InputBox = memo<InputBoxProps>(({\n value,\n onChange,\n onSubmit,\n disabled = false,\n focused = true,\n}) => (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">❯ </Text>\n {!disabled ? (\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder=\"Type your message...\"\n focus={focused}\n />\n ) : (\n <Text dimColor>Waiting...</Text>\n )}\n </Box>\n));\n","/**\n * ModelSelector component\n * Overlay for selecting LLM model\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelWithUsage } from '../../../types/llm.types.js';\n\ninterface ModelSelectorProps {\n models: ModelWithUsage[];\n currentModel: string;\n onSelect: (modelId: string) => void;\n onCancel: () => void;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n currentModel,\n onSelect,\n onCancel,\n}) => {\n const allowedModels = models.filter((m) => m.allowed);\n const currentIndex = allowedModels.findIndex((m) => m.id === currentModel);\n const [selectedIndex, setSelectedIndex] = useState(Math.max(0, currentIndex));\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(allowedModels.length - 1, prev + 1));\n } else if (key.return) {\n const selected = allowedModels[selectedIndex];\n if (selected) {\n onSelect(selected.id);\n }\n }\n });\n\n if (allowedModels.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"red\"\n padding={1}\n width={60}\n >\n <Text color=\"red\" bold>\n No models available\n </Text>\n <Text dimColor>Press Esc to close</Text>\n </Box>\n );\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n width={70}\n >\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⚙️ Select Model\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n {allowedModels.map((model, i) => {\n const isSelected = i === selectedIndex;\n const isCurrent = model.id === currentModel;\n const icon = isSelected ? '●' : '○';\n\n let usageText = '';\n if (model.dailyLimit !== undefined && model.usedToday !== undefined) {\n usageText = ` (${model.usedToday}/${model.dailyLimit})`;\n }\n\n return (\n <Box key={model.id} marginY={0}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'white'}\n >\n {isSelected ? '❯ ' : ' '}\n {icon} {model.id}\n {isCurrent ? ' ✓' : ''}\n {usageText}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[↑↓] Navigate [Enter] Select [Esc] Cancel</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * API Keys Command\n * Show OpenAI-compatible API credentials and info\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return '****';\n return key.slice(0, 8) + '****' + key.slice(-4);\n}\n\n/**\n * Handle api-keys command\n */\nasync function handleApiKeysCommand(options: { full?: boolean }): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n console.log('📡 Jai1 LLM Proxy - OpenAI Compatible API');\n console.log('─────────────────────────────────────────\\n');\n\n console.log('🔑 API Credentials');\n console.log(` BASE_URL: ${service.getBaseUrl()}`);\n console.log(` API_KEY: ${options.full ? service.getApiKey() : maskKey(service.getApiKey())}\\n`);\n\n try {\n const [models, limits] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n ]);\n\n const allowedModels = models.filter((m) => m.allowed);\n\n console.log('📦 Available Models');\n if (allowedModels.length === 0) {\n console.log(' No models available\\n');\n } else {\n allowedModels.forEach((model) => {\n const usageText =\n model.dailyLimit !== undefined && model.usedToday !== undefined\n ? ` (${model.usedToday}/${model.dailyLimit} today)`\n : '';\n console.log(` ✓ ${model.id}${usageText}`);\n });\n console.log();\n }\n\n const defaultModel = allowedModels[0]?.id || 'gpt-4o';\n console.log('📝 Sample cURL\\n');\n const curlSample = options.full\n ? service.generateFullCurlSample(defaultModel)\n : service.generateCurlSample(defaultModel);\n const curlLines = curlSample.split('\\n');\n curlLines.forEach((line) => console.log(` ${line}`));\n console.log();\n\n console.log('💡 Usage:');\n console.log(' - Use as drop-in replacement for OpenAI API');\n console.log(' - Compatible with: OpenAI SDK, LangChain, LlamaIndex, etc.');\n console.log(' - Run \"jai1 chat\" for interactive mode');\n console.log(' - Run \"jai1 api-keys --full\" to show full API key');\n } catch (error) {\n console.error(\n '\\n❌ Failed to fetch API info:',\n error instanceof Error ? error.message : String(error)\n );\n console.log('\\n💡 Check your API URL and access key with \"jai1 status\"');\n }\n}\n\n/**\n * Create api-keys command\n */\nexport function createApiKeysCommand(): Command {\n const cmd = new Command('api-keys')\n .description('Show OpenAI-compatible API credentials and info')\n .option('--full', 'Show full API key (unmasked)')\n .action(async (options: { full?: boolean }) => {\n await handleApiKeysCommand(options);\n });\n\n return cmd;\n}\n","/**\n * Translate Command\n * Translate text, files, or folders using LLM Proxy\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { TranslationService } from '../services/translation.service.js';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\nimport type { TranslateOptions } from '../types/translate.types.js';\n\ninterface TranslateCommandOptions extends TranslateOptions {\n model?: string;\n}\n\n/**\n * Handle translate command\n */\nasync function handleTranslate(input: string, options: TranslateCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chưa xác thực. Chạy \"jai1 auth\" trước.');\n }\n\n const llmService = new LlmProxyService(config);\n const translationService = new TranslationService(llmService, options, options.model);\n\n // Detect input type\n const inputType = await translationService.detectInputType(input);\n\n // Handle based on type\n switch (inputType) {\n case 'text':\n await handleTextTranslation(translationService, input, options);\n break;\n case 'file':\n await handleFileTranslation(translationService, input, options);\n break;\n case 'folder':\n await handleFolderTranslation(translationService, input, options);\n break;\n }\n}\n\n/**\n * Handle text translation\n */\nasync function handleTextTranslation(\n service: TranslationService,\n text: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log('🌐 Đang dịch văn bản...');\n }\n\n const result = await service.translateText(text);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success && result.translatedContent) {\n console.log(`✅ Hoàn tất! Ngôn ngữ: ${result.targetLanguage}\\n`);\n console.log(result.translatedContent);\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle file translation\n */\nasync function handleFileTranslation(\n service: TranslationService,\n filePath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang dịch file: ${filePath}`);\n }\n\n const result = await service.translateFile(filePath);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success) {\n if (options.dryRun) {\n console.log(`✅ Preview mode - sẽ lưu: ${result.outputPath}`);\n } else {\n console.log(`✅ Đã lưu: ${result.outputPath}`);\n }\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle folder translation\n */\nasync function handleFolderTranslation(\n service: TranslationService,\n folderPath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang quét thư mục: ${folderPath}\\n`);\n }\n\n const result = await service.translateFolder(folderPath, (progress) => {\n if (!options.json) {\n const fileName = progress.currentFile.split('/').pop() || progress.currentFile;\n process.stdout.write(\n `\\r🌐 Đang xử lý: ${progress.current}/${progress.total} - ${fileName}${' '.repeat(20)}`\n );\n }\n });\n\n if (!options.json) {\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(100) + '\\r');\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display summary\n console.log(`\\n✅ Hoàn tất! ${result.summary.success}/${result.summary.total} file đã dịch`);\n\n if (result.summary.failed > 0) {\n console.log(`\\n⚠️ ${result.summary.failed} file gặp lỗi:`);\n result.results\n .filter((r) => !r.success)\n .forEach((r) => {\n const fileName = r.inputPath.split('/').pop() || r.inputPath;\n console.log(` ❌ ${fileName}: ${r.error}`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n💡 Chạy không có --dry-run để lưu file.');\n }\n}\n\n/**\n * Create translate command\n */\nexport function createTranslateCommand(): Command {\n const cmd = new Command('translate')\n .description('Dịch văn bản, file hoặc thư mục bằng AI')\n .argument('<input>', 'Chuỗi văn bản, đường dẫn file hoặc thư mục')\n .option('--to <language>', 'Mã ngôn ngữ đích (mặc định: vi)', 'vi')\n .option('-o, --output <path>', 'Đường dẫn output (file/thư mục)')\n .option('--dry-run', 'Xem trước không lưu file')\n .option('--concurrency <number>', 'Số file xử lý song song (mặc định: 3)', '3')\n .option('--model <model>', 'Model LLM (mặc định: gpt-5.1-codex-mini)')\n .option('--json', 'Xuất kết quả dạng JSON')\n .action(async (input: string, options: TranslateCommandOptions) => {\n await handleTranslate(input, options);\n });\n\n return cmd;\n}\n","/**\n * Translation Service\n * Handles translation of text, files, and folders using LLM Proxy\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { LlmProxyService } from './llm-proxy.service.js';\nimport type { CompletionMessage } from '../types/llm.types.js';\nimport type {\n TranslateOptions,\n TranslationResult,\n FileTranslationResult,\n FolderTranslationResult,\n TranslationProgress,\n TRANSLATABLE_EXTENSIONS,\n TranslatableExtension,\n} from '../types/translate.types.js';\n\nconst TRANSLATABLE_EXTS = ['.md', '.txt', '.json', '.yaml', '.yml'] as const;\n\nexport class TranslationService {\n private readonly llmService: LlmProxyService;\n private readonly options: TranslateOptions;\n private readonly model: string;\n\n constructor(llmService: LlmProxyService, options: TranslateOptions, model?: string) {\n this.llmService = llmService;\n this.options = options;\n this.model = model || 'gpt-5.1-codex-mini'; // Default fast model for translation\n }\n\n /**\n * Detect input type\n */\n async detectInputType(input: string): Promise<'text' | 'file' | 'folder'> {\n try {\n const stat = await fs.stat(input);\n if (stat.isDirectory()) return 'folder';\n if (stat.isFile()) return 'file';\n } catch {\n // Path doesn't exist, treat as text\n }\n return 'text';\n }\n\n /**\n * Translate text string\n */\n async translateText(text: string): Promise<TranslationResult> {\n try {\n const translatedContent = await this.translateWithRetry(text, 'text');\n return {\n success: true,\n inputType: 'text',\n input: text,\n output: translatedContent,\n targetLanguage: this.options.to,\n translatedContent,\n };\n } catch (error) {\n return {\n success: false,\n inputType: 'text',\n input: text,\n output: '',\n targetLanguage: this.options.to,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate single file\n */\n async translateFile(filePath: string): Promise<FileTranslationResult> {\n try {\n // Read file content\n const content = await fs.readFile(filePath, 'utf-8');\n\n // Detect file type\n const ext = path.extname(filePath).toLowerCase();\n const fileType = this.getFileType(ext);\n\n // Translate content\n const translatedContent = await this.translateWithRetry(content, fileType);\n\n // Generate output path\n const outputPath = this.generateOutputPath(filePath);\n\n // Write output (unless dry-run)\n if (!this.options.dryRun) {\n await fs.writeFile(outputPath, translatedContent, 'utf-8');\n }\n\n return {\n inputPath: filePath,\n outputPath,\n success: true,\n };\n } catch (error) {\n return {\n inputPath: filePath,\n outputPath: '',\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate entire folder recursively\n */\n async translateFolder(\n folderPath: string,\n onProgress?: (progress: TranslationProgress) => void\n ): Promise<FolderTranslationResult> {\n const files = await this.discoverFiles(folderPath);\n const concurrency = parseInt(this.options.concurrency || '3', 10);\n const limit = pLimit(concurrency);\n\n const results: FileTranslationResult[] = [];\n let current = 0;\n\n const tasks = files.map((file) =>\n limit(async () => {\n current++;\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: 'translating',\n });\n\n const result = await this.translateFile(file);\n results.push(result);\n\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: result.success ? 'done' : 'error',\n });\n\n return result;\n })\n );\n\n await Promise.all(tasks);\n\n return this.summarizeResults(folderPath, results);\n }\n\n /**\n * Generate output path with language suffix\n */\n private generateOutputPath(inputPath: string): string {\n if (this.options.output) {\n return this.options.output;\n }\n\n const ext = path.extname(inputPath);\n const base = path.basename(inputPath, ext);\n const dir = path.dirname(inputPath);\n const lang = this.options.to;\n\n return path.join(dir, `${base}.${lang}${ext}`);\n }\n\n /**\n * Discover translatable files in folder recursively\n */\n private async discoverFiles(folderPath: string): Promise<string[]> {\n const entries = await fs.readdir(folderPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(folderPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const subFiles = await this.discoverFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (TRANSLATABLE_EXTS.includes(ext as TranslatableExtension)) {\n // Skip already translated files (e.g., file.vi.md)\n if (!this.isTranslatedFile(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n return files;\n }\n\n /**\n * Check if filename indicates already translated file\n */\n private isTranslatedFile(filename: string): boolean {\n // Pattern: .{lang}.{ext} (e.g., .vi.md, .en.txt)\n const pattern = /\\.[a-z]{2}\\.(md|txt|json|ya?ml)$/i;\n return pattern.test(filename);\n }\n\n /**\n * Build translation prompt based on content type\n */\n private buildPrompt(content: string, fileType: string): CompletionMessage[] {\n const targetLang = this.options.to;\n let systemPrompt = '';\n\n switch (fileType) {\n case 'markdown':\n systemPrompt = `You are a professional translator.\nTranslate the following Markdown content to ${targetLang}.\nPreserve all formatting including:\n- Markdown syntax (headers, lists, code blocks, links, tables)\n- Line breaks and paragraph structure\n- Code snippets (do not translate code, only comments if present)\n- HTML tags if present\n\nReturn ONLY the translated content, no explanations.`;\n break;\n\n case 'json':\n systemPrompt = `You are translating a JSON localization file.\nTranslate all string values to ${targetLang}.\nPreserve the JSON structure and keys exactly.\nReturn valid JSON only, no explanations.`;\n break;\n\n case 'yaml':\n systemPrompt = `You are translating a YAML configuration file.\nTranslate all string values to ${targetLang}.\nPreserve the YAML structure and keys exactly.\nReturn valid YAML only, no explanations.`;\n break;\n\n default:\n systemPrompt = `You are a professional translator.\nTranslate the following text to ${targetLang}.\nPreserve all formatting and line breaks.\nReturn ONLY the translated content, no explanations.`;\n }\n\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: content },\n ];\n }\n\n /**\n * Get file type from extension\n */\n private getFileType(ext: string): string {\n switch (ext.toLowerCase()) {\n case '.md':\n return 'markdown';\n case '.json':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'text';\n }\n }\n\n /**\n * Translate with retry logic\n */\n private async translateWithRetry(content: string, fileType: string): Promise<string> {\n return pRetry(\n async () => {\n const messages = this.buildPrompt(content, fileType);\n const result = await this.llmService.chat(messages, this.model);\n return result;\n },\n {\n retries: 3,\n onFailedAttempt: (error) => {\n if (error.message.includes('rate limit')) {\n console.log('⚠️ Rate limit, đang thử lại...');\n }\n },\n }\n );\n }\n\n /**\n * Summarize folder translation results\n */\n private summarizeResults(\n folderPath: string,\n results: FileTranslationResult[]\n ): FolderTranslationResult {\n const summary = {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n skipped: 0,\n };\n\n return {\n inputFolder: folderPath,\n outputFolder: this.options.output || folderPath,\n results,\n summary,\n };\n }\n}\n","/**\n * Upgrade Command\n * Update jai1-client to the latest version\n * \n * Renamed from 'self-update' to 'upgrade' for clarity\n * - 'update' = update installed components\n * - 'upgrade' = upgrade the CLI tool itself\n */\nimport { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create upgrade command\n */\nexport function createUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force upgrade without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleUpgrade(options);\n });\n}\n\nasync function handleUpgrade(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 upgrade\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Upgrade cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully upgraded to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('upgrade', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Upgrade failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually upgrading with:${colors.reset}`);\n\n // Show manual upgrade command for detected package manager\n const manualCommands = {\n npm: `npm install -g @jvittechs/jai1-cli@latest`,\n pnpm: `pnpm add -g @jvittechs/jai1-cli@latest`,\n yarn: `yarn global add @jvittechs/jai1-cli@latest`,\n bun: `bun add -g @jvittechs/jai1-cli@latest`\n };\n\n console.error(` ${colors.cyan}${manualCommands[packageManager]}${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager was used to install jai1\n * Priority:\n * 1. Check how jai1 was installed (via global bin path) - MOST RELIABLE\n * 2. Check npm_config_user_agent environment variable\n * 3. Default to npm (safest fallback)\n * \n * Supports both Windows and Unix paths\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // 1. Try to detect from actual jai1 installation path (MOST RELIABLE)\n try {\n const jai1Path = execSync('which jai1 || where jai1', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore']\n }).trim();\n\n if (jai1Path) {\n // Normalize path separators for consistent matching (Windows uses \\, Unix uses /)\n const normalizedPath = jai1Path.toLowerCase().replace(/\\\\/g, '/');\n\n // pnpm global paths:\n // - Unix: ~/.local/share/pnpm or ~/Library/pnpm\n // - Windows: C:/Users/username/AppData/Local/pnpm\n if (normalizedPath.includes('/pnpm/')) return 'pnpm';\n\n // yarn global paths:\n // - Unix: ~/.yarn or ~/Library/Yarn\n // - Windows: C:/Users/username/AppData/Local/Yarn\n if (normalizedPath.includes('/.yarn/') || normalizedPath.includes('/yarn/')) return 'yarn';\n\n // bun global paths:\n // - Unix: ~/.bun\n // - Windows: C:/Users/username/.bun\n if (normalizedPath.includes('/.bun/')) return 'bun';\n\n // npm global paths:\n // Unix:\n // - nvm: ~/.nvm/versions/node/vX.X.X/bin/\n // - system: /usr/local/bin/ or /usr/bin/\n // - npm prefix: ~/.npm-global/bin/ or similar\n // - node_modules: anywhere with /node_modules/.bin/\n // Windows:\n // - AppData: C:/Users/username/AppData/Roaming/npm/\n // - Program Files: C:/Program Files/nodejs/\n // - node_modules: anywhere with /node_modules/\n if (normalizedPath.includes('/.nvm/') ||\n normalizedPath.includes('/node_modules/') ||\n normalizedPath.includes('/lib/node_modules/') ||\n normalizedPath.includes('/npm-global/') ||\n normalizedPath.includes('/usr/local/bin/') ||\n normalizedPath.includes('/usr/bin/') ||\n normalizedPath.includes('/appdata/roaming/npm/') ||\n normalizedPath.includes('/program files/nodejs/')) {\n return 'npm';\n }\n }\n } catch {\n // Ignore errors, continue with other detection methods\n }\n\n // 2. Check user agent for package manager (when running via npm/pnpm/yarn scripts)\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (userAgent.includes('npm')) return 'npm';\n\n // 3. Default to npm (safest and most common)\n // DO NOT check for available package managers here - it causes false positives!\n // If user has pnpm installed but used npm to install jai1, we should use npm.\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","/**\n * Clean Command\n * Clean up backups, cache, and temporary files\n * \n * Renamed from 'clear-backups' to 'clean' for broader scope\n */\nimport { Command } from 'commander';\nimport { confirm, select } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\ninterface CleanTarget {\n name: string;\n description: string;\n path: string;\n check: () => Promise<{ exists: boolean; count?: number; size?: string }>;\n clean: () => Promise<void>;\n}\n\n/**\n * Create clean command\n */\nexport function createCleanCommand(): Command {\n return new Command('clean')\n .description('Clean up backups, cache, and temporary files')\n .option('-y, --yes', 'Skip confirmation')\n .option('--backups', 'Clean only backup files')\n .option('--all', 'Clean all (backups + cache)')\n .action(async (options: { yes?: boolean; backups?: boolean; all?: boolean }) => {\n await handleClean(options);\n });\n}\n\nasync function handleClean(options: { yes?: boolean; backups?: boolean; all?: boolean }) {\n const cwd = process.cwd();\n const service = new ComponentsService();\n\n // Define clean targets\n const targets: CleanTarget[] = [\n {\n name: 'Backups',\n description: 'Component backup files (.jai1_backup/)',\n path: join(cwd, '.jai1_backup'),\n check: async () => {\n const backups = await service.listBackups(cwd);\n return { exists: backups.length > 0, count: backups.length };\n },\n clean: async () => {\n await service.clearBackups(cwd);\n }\n },\n // Future targets can be added here:\n // {\n // name: 'Cache',\n // description: 'Downloaded component cache',\n // path: join(homedir(), '.jai1', 'cache'),\n // ...\n // }\n ];\n\n console.log('🧹 Clean up jai1-client files\\n');\n\n // Check what's available to clean\n const availableTargets: Array<{ target: CleanTarget; info: { exists: boolean; count?: number } }> = [];\n\n for (const target of targets) {\n const info = await target.check();\n if (info.exists) {\n availableTargets.push({ target, info });\n }\n }\n\n if (availableTargets.length === 0) {\n console.log('✨ Nothing to clean up!');\n return;\n }\n\n // If specific option provided\n if (options.backups) {\n const backupTarget = targets.find(t => t.name === 'Backups');\n if (backupTarget) {\n await cleanTarget(backupTarget, options.yes);\n }\n return;\n }\n\n if (options.all) {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n return;\n }\n\n // Interactive mode\n console.log('Found the following items:\\n');\n for (const { target, info } of availableTargets) {\n const countStr = info.count ? ` (${info.count} items)` : '';\n console.log(` 📁 ${target.name}${countStr}`);\n console.log(` ${target.description}`);\n console.log(` Path: ${target.path}\\n`);\n }\n\n const action = await select({\n message: 'What do you want to clean?',\n choices: [\n ...availableTargets.map(({ target, info }) => ({\n name: `${target.name}${info.count ? ` (${info.count} items)` : ''}`,\n value: target.name\n })),\n { name: '🧹 Clean all', value: 'all' },\n { name: '❌ Cancel', value: 'cancel' }\n ]\n });\n\n if (action === 'cancel') {\n console.log('\\n❌ Operation cancelled.');\n return;\n }\n\n if (action === 'all') {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n } else {\n const target = targets.find(t => t.name === action);\n if (target) {\n await cleanTarget(target, options.yes);\n }\n }\n}\n\nasync function cleanTarget(target: CleanTarget, skipConfirm?: boolean): Promise<void> {\n const info = await target.check();\n\n if (!info.exists) {\n console.log(`✨ ${target.name}: Nothing to clean.`);\n return;\n }\n\n const countStr = info.count ? ` (${info.count} items)` : '';\n\n if (!skipConfirm) {\n const confirmed = await confirm({\n message: `Delete ${target.name}${countStr}?`,\n default: false\n });\n\n if (!confirmed) {\n console.log(`⏭️ Skipped ${target.name}`);\n return;\n }\n }\n\n try {\n await target.clean();\n console.log(`✅ Cleaned ${target.name}${countStr}`);\n } catch (error) {\n console.error(`❌ Failed to clean ${target.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { checkConnectivity } from '../../services/redmine-connectivity.service.js';\n\ninterface CheckOptions {\n config?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine check command\n */\nexport function createRedmineCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check Redmine connectivity')\n .option('-c, --config <path>', 'Config file path', 'redmine.config.yaml')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleRedmineCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleRedmineCheck(options: CheckOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const result = await checkConnectivity(config);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅', result.message);\n if (result.details?.project) {\n console.log(\n ` Project: ${result.details.project.name} (${result.details.project.identifier})`\n );\n console.log(` Project ID: ${result.details.project.id}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineConfigSchema } from '../types/redmine.types.js';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\n\n/**\n * Service for managing Redmine configuration\n */\nexport class RedmineConfigService {\n private configPath: string;\n\n constructor(configPath?: string) {\n this.configPath = configPath ?? resolve(process.cwd(), 'redmine.config.yaml');\n }\n\n /**\n * Load Redmine configuration from YAML file\n */\n async load(): Promise<RedmineConfig> {\n try {\n const content = await readFile(this.configPath, 'utf-8');\n const rawConfig = parse(content);\n\n return RedmineConfigSchema.parse(rawConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n throw new NotFoundError(`Configuration file not found: ${this.configPath}`);\n }\n\n throw new ValidationError(\n `Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validate configuration object\n */\n validate(config: unknown): RedmineConfig {\n try {\n return RedmineConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\n// Export schema for use in types file\nexport { RedmineConfigSchema };\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst RetryConfigSchema = z.object({\n retries: z.number().min(0).default(3),\n baseMs: z.number().min(100).default(300),\n});\n\nconst FilenameConfigSchema = z.object({\n pattern: z.string().default('{issueId}-{slug}.md'),\n slug: z.object({\n maxLength: z.number().min(10).default(80),\n dedupe: z.boolean().default(true),\n lowercase: z.boolean().default(true),\n }),\n renameOnTitleChange: z.boolean().default(false),\n});\n\nconst CommentsConfigSchema = z.object({\n anchors: z.object({\n start: z.string().default('<!-- redmine:comments:start -->'),\n end: z.string().default('<!-- redmine:comments:end -->'),\n }),\n trackBy: z.enum(['journalId', 'createdOn']).default('journalId'),\n});\n\nconst DefaultsConfigSchema = z.object({\n include: z.array(z.enum(['journals', 'relations', 'attachments'])).default(['journals']),\n status: z.string().default('*'),\n pageSize: z.number().min(1).max(100).default(100),\n concurrency: z.number().min(1).max(10).default(4),\n retry: RetryConfigSchema.default({}),\n});\n\nconst ProjectConfigSchema = z.object({\n id: z.number(),\n identifier: z.string(),\n});\n\nconst RedmineConfigSchema = z.object({\n baseUrl: z.string().url(),\n apiAccessToken: z.string().min(1),\n project: ProjectConfigSchema,\n outputDir: z.string().default('.jai1/redmine'),\n defaults: DefaultsConfigSchema.default({}),\n filename: FilenameConfigSchema.default({}),\n comments: CommentsConfigSchema.default({}),\n});\n\nexport type RedmineConfig = z.infer<typeof RedmineConfigSchema>;\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\nexport type FilenameConfig = z.infer<typeof FilenameConfigSchema>;\nexport type CommentsConfig = z.infer<typeof CommentsConfigSchema>;\nexport type DefaultsConfig = z.infer<typeof DefaultsConfigSchema>;\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\n// Export schema for use in service\nexport { RedmineConfigSchema };\n","import { fetch } from 'undici';\nimport pRetry from 'p-retry';\nimport pLimit from 'p-limit';\nimport type { RedmineConfig, RetryConfig } from './config.js';\n\nexport interface RedmineIssue {\n id: number;\n subject: string;\n description: string;\n status: { id: number; name: string };\n priority: { id: number; name: string };\n author: { id: number; name: string };\n assigned_to?: { id: number; name: string };\n created_on: string;\n updated_on: string;\n project: { id: number; name: string };\n tracker: { id: number; name: string };\n journals?: RedmineJournal[];\n relations?: RedmineRelation[];\n attachments?: RedmineAttachment[];\n}\n\nexport interface RedmineJournal {\n id: number;\n user: { id: number; name: string };\n notes?: string;\n created_on: string;\n details?: Array<{\n name: string;\n old_value: string;\n new_value: string;\n }>;\n}\n\nexport interface RedmineRelation {\n id: number;\n issue_to_id: number;\n relation_type: string;\n delay?: number;\n}\n\nexport interface RedmineAttachment {\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: { id: number; name: string };\n created_on: string;\n content_url?: string;\n}\n\nexport interface RedmineIssueResponse {\n issue: RedmineIssue;\n}\n\nexport interface RedmineIssuesResponse {\n issues: RedmineIssue[];\n total_count: number;\n offset: number;\n limit: number;\n}\n\nexport interface RedmineProjectResponse {\n project: {\n id: number;\n identifier: string;\n name: string;\n created_on: string;\n updated_on: string;\n };\n}\n\nexport class RedmineApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: unknown\n ) {\n super(message);\n this.name = 'RedmineApiError';\n }\n}\n\nexport class RedmineApiClient {\n private readonly baseUrl: string;\n private readonly apiAccessToken: string;\n private readonly retryConfig: RetryConfig;\n private readonly concurrencyLimit: pLimit.Limit;\n\n constructor(config: RedmineConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiAccessToken = config.apiAccessToken;\n this.retryConfig = config.defaults.retry;\n this.concurrencyLimit = pLimit(config.defaults.concurrency);\n }\n\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers = {\n 'X-Redmine-API-Key': this.apiAccessToken,\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const attempt = async (): Promise<T> => {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const errorData = (await response.json()) as { errors?: string[] };\n if (errorData.errors && Array.isArray(errorData.errors)) {\n errorMessage = errorData.errors.join(', ');\n }\n } catch {\n // Ignore JSON parsing errors for error response\n }\n\n throw new RedmineApiError(errorMessage, response.status);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json() as Promise<T>;\n }\n\n return response.text() as unknown as T;\n };\n\n return pRetry(attempt, {\n retries: this.retryConfig.retries,\n onFailedAttempt: (error) => {\n console.warn(\n `Request failed (attempt ${error.attemptNumber}/${error.retriesLeft + 1}): ${error.message}`\n );\n },\n factor: 2,\n minTimeout: this.retryConfig.baseMs,\n maxTimeout: this.retryConfig.baseMs * 8,\n });\n }\n\n async checkConnectivity(): Promise<boolean> {\n try {\n await this.request<RedmineProjectResponse>('/projects.json?limit=1');\n return true;\n } catch (error) {\n if (error instanceof RedmineApiError) {\n throw error;\n }\n throw new RedmineApiError(\n `Connectivity check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async getProject(identifier: string): Promise<RedmineProjectResponse> {\n return this.request<RedmineProjectResponse>(`/projects/${identifier}.json`);\n }\n\n async getIssue(issueId: number, include?: string[]): Promise<RedmineIssueResponse> {\n const params = new URLSearchParams();\n if (include && include.length > 0) {\n params.append('include', include.join(','));\n }\n\n const path = `/issues/${issueId}.json${params.toString() ? `?${params.toString()}` : ''}`;\n return this.request<RedmineIssueResponse>(path);\n }\n\n async getIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n offset?: number;\n include?: string[];\n updatedSince?: string;\n } = {}\n ): Promise<RedmineIssuesResponse> {\n const params = new URLSearchParams();\n params.append('project_id', projectId.toString());\n\n if (options.status && options.status !== '*') {\n params.append('status_id', options.status);\n }\n\n if (options.pageSize) {\n params.append('limit', options.pageSize.toString());\n }\n\n if (options.offset) {\n params.append('offset', options.offset.toString());\n }\n\n if (options.include && options.include.length > 0) {\n params.append('include', options.include.join(','));\n }\n\n if (options.updatedSince) {\n params.append('updated_on', `>=${options.updatedSince}`);\n }\n\n const path = `/issues.json?${params.toString()}`;\n return this.request<RedmineIssuesResponse>(path);\n }\n\n async getAllIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n const allIssues: RedmineIssue[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n allIssues.push(...response.issues);\n\n if (options.onProgress) {\n options.onProgress(allIssues.length, response.total_count);\n }\n\n hasMore = allIssues.length < response.total_count;\n offset += pageSize;\n }\n\n return allIssues;\n }\n\n async getIssuesConcurrently(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n\n // First, get the total count\n const initialResponse = await this.getIssues(projectId, {\n ...options,\n pageSize: 1,\n });\n\n const totalCount = initialResponse.total_count;\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const pagePromises = Array.from({ length: totalPages }, (_, index) => {\n const offset = index * pageSize;\n\n return this.concurrencyLimit(async () => {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n if (options.onProgress) {\n options.onProgress(offset + response.issues.length, totalCount);\n }\n\n return response.issues;\n });\n });\n\n const pageResults = await Promise.all(pagePromises);\n return pageResults.flat();\n }\n}\n","import type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineApiClient, RedmineApiError } from '../api.js';\n\nexport interface ConnectivityResult {\n success: boolean;\n message: string;\n details?: {\n baseUrl: string;\n project?: {\n id: number;\n identifier: string;\n name: string;\n };\n };\n}\n\nexport async function checkConnectivity(config: RedmineConfig): Promise<ConnectivityResult> {\n const client = new RedmineApiClient(config);\n\n try {\n const isConnected = await client.checkConnectivity();\n\n if (!isConnected) {\n return {\n success: false,\n message: 'Failed to connect to Redmine API',\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n const projectResponse = await client.getProject(config.project.identifier);\n\n return {\n success: true,\n message: `Successfully connected to Redmine and found project \"${projectResponse.project.name}\"`,\n details: {\n baseUrl: config.baseUrl,\n project: projectResponse.project,\n },\n };\n } catch (error) {\n if (error instanceof RedmineApiError) {\n let message = `Redmine API error: ${error.message}`;\n\n if (error.status === 401) {\n message = 'Authentication failed - please check your API access token';\n } else if (error.status === 403) {\n message = 'Access forbidden - insufficient permissions for the project';\n } else if (error.status === 404) {\n message = `Project \"${config.project.identifier}\" not found or inaccessible`;\n }\n\n return {\n success: false,\n message,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n return {\n success: false,\n message: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncIssue, extractIssueIdFromUrl } from '../../sync-issue.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface SyncIssueOptions {\n id?: string;\n url?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync issue command\n */\nexport function createSyncIssueCommand(): Command {\n const cmd = new Command('issue')\n .description('Sync a single issue')\n .option('-i, --id <number>', 'Issue ID')\n .option('-u, --url <url>', 'Issue URL')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncIssueOptions) => {\n await handleSyncIssue(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncIssue(options: SyncIssueOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n let issueId: number;\n\n if (options.id) {\n issueId = parseInt(options.id, 10);\n if (isNaN(issueId)) {\n throw new ValidationError('Invalid issue ID');\n }\n } else if (options.url) {\n const extractedId = extractIssueIdFromUrl(options.url);\n if (!extractedId) {\n throw new ValidationError('Could not extract issue ID from URL');\n }\n issueId = extractedId;\n } else {\n throw new ValidationError('Either --id or --url must be provided');\n }\n\n const result = await syncIssue(issueId, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n const icon = result.action === 'skipped' ? '⏭️' : '✅';\n console.log(`${icon} ${result.message}`);\n if (result.filePath) {\n console.log(` File: ${result.filePath}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { resolve, relative } from 'node:path';\nimport type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport {\n mapIssueToFrontmatter,\n mapIssueToContent,\n mapJournalsToComments,\n extractNewJournals,\n shouldUpdateIssue,\n shouldUpdateComments,\n} from './mappers.js';\nimport { generateFilename } from './slug.util.js';\nimport {\n readMarkdownFile,\n writeMarkdownFile,\n extractIssueIdFromFrontmatter,\n extractLastJournalId,\n} from './file.util.js';\n\nexport interface SyncIssueOptions {\n dryRun?: boolean;\n outputDir?: string;\n}\n\nexport interface SyncIssueResult {\n success: boolean;\n issueId: number;\n filename: string;\n filePath: string;\n action: 'created' | 'updated' | 'skipped';\n message: string;\n changes?: {\n content?: boolean;\n comments?: boolean;\n frontmatter?: boolean;\n };\n}\n\nexport async function syncIssue(\n issueId: number,\n config: RedmineConfig,\n options: SyncIssueOptions = {}\n): Promise<SyncIssueResult> {\n const client = new RedmineApiClient(config);\n const outputDir = options.outputDir || config.outputDir;\n\n try {\n const include = config.defaults.include;\n const response = await client.getIssue(issueId, include);\n const issue = response.issue;\n\n const filename = generateFilename(issue.id, issue.subject, config.filename);\n const filePath = resolve(outputDir, filename);\n const relativePath = relative(process.cwd(), filePath);\n\n const existingFile = await readMarkdownFile(filePath);\n const existingIssueId = extractIssueIdFromFrontmatter(existingFile.frontmatter);\n const existingLastJournalId = extractLastJournalId(existingFile.frontmatter);\n\n if (existingIssueId && existingIssueId !== issue.id) {\n return {\n success: false,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `File ${filename} contains issue ${existingIssueId}, not ${issue.id}`,\n };\n }\n\n const needsUpdate = shouldUpdateIssue(issue, existingFile.frontmatter);\n const needsCommentsUpdate = shouldUpdateComments(\n issue.journals || [],\n existingFile.frontmatter\n );\n\n if (!needsUpdate && !needsCommentsUpdate) {\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `Issue ${issueId} is already up to date`,\n };\n }\n\n const frontmatter = mapIssueToFrontmatter(issue);\n const content = mapIssueToContent(issue);\n\n let comments: string | undefined;\n if (needsCommentsUpdate && issue.journals) {\n const newJournals = extractNewJournals(issue.journals, existingLastJournalId);\n if (newJournals.length > 0) {\n const newComments = mapJournalsToComments(newJournals, config.comments);\n if (existingFile.comments) {\n comments = `${existingFile.comments}\\n\\n---\\n\\n${newComments}`;\n } else {\n comments = newComments;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n\n const changes: SyncIssueResult['changes'] = {};\n if (needsUpdate) {\n changes.frontmatter = true;\n changes.content = true;\n }\n if (needsCommentsUpdate) {\n changes.comments = true;\n }\n\n if (options.dryRun) {\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Would ${action} issue ${issueId} (dry run)`,\n changes,\n };\n }\n\n await writeMarkdownFile(\n filePath,\n {\n frontmatter,\n content,\n comments,\n },\n config.comments\n );\n\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Successfully ${action} issue ${issueId}`,\n changes,\n };\n } catch (error) {\n return {\n success: false,\n issueId,\n filename: '',\n filePath: '',\n action: 'skipped',\n message: `Failed to sync issue ${issueId}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport function extractIssueIdFromUrl(url: string): number | null {\n const match = url.match(/\\/issues\\/(\\d+)(?:\\/|$)/);\n if (match) {\n const issueId = parseInt(match[1], 10);\n return isNaN(issueId) ? null : issueId;\n }\n return null;\n}\n","import type { RedmineIssue, RedmineJournal } from './api.js';\nimport type { CommentsConfig } from './config.js';\n\nexport interface IssueFrontmatter {\n id: number;\n subject: string;\n status: string;\n priority: string;\n author: string;\n assigned_to?: string;\n created_on: string;\n updated_on: string;\n project: string;\n tracker: string;\n lastJournalId?: number;\n relations?: Array<{\n type: string;\n issue_id: number;\n delay?: number;\n }>;\n attachments?: Array<{\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: string;\n created_on: string;\n content_url?: string;\n }>;\n}\n\nexport function mapIssueToFrontmatter(issue: RedmineIssue): IssueFrontmatter {\n const frontmatter: IssueFrontmatter = {\n id: issue.id,\n subject: issue.subject,\n status: issue.status.name,\n priority: issue.priority.name,\n author: issue.author.name,\n created_on: issue.created_on,\n updated_on: issue.updated_on,\n project: issue.project.name,\n tracker: issue.tracker.name,\n };\n\n if (issue.assigned_to) {\n frontmatter.assigned_to = issue.assigned_to.name;\n }\n\n if (issue.relations && issue.relations.length > 0) {\n frontmatter.relations = issue.relations.map((relation) => ({\n type: relation.relation_type,\n issue_id: relation.issue_to_id,\n delay: relation.delay,\n }));\n }\n\n if (issue.attachments && issue.attachments.length > 0) {\n frontmatter.attachments = issue.attachments.map((attachment) => ({\n id: attachment.id,\n filename: attachment.filename,\n filesize: attachment.filesize,\n content_type: attachment.content_type,\n author: attachment.author.name,\n created_on: attachment.created_on,\n content_url: attachment.content_url,\n }));\n }\n\n if (issue.journals && issue.journals.length > 0) {\n const lastJournal = issue.journals.reduce((latest, journal) =>\n journal.id > latest.id ? journal : latest\n );\n frontmatter.lastJournalId = lastJournal.id;\n }\n\n return frontmatter;\n}\n\nexport function mapIssueToContent(issue: RedmineIssue): string {\n let content = '';\n\n if (issue.description) {\n content += issue.description;\n }\n\n return content;\n}\n\nexport function mapJournalsToComments(journals: RedmineJournal[], config: CommentsConfig): string {\n if (!journals || journals.length === 0) {\n return '';\n }\n\n let comments = '';\n\n const sortedJournals = [...journals].sort((a, b) => {\n if (config.trackBy === 'journalId') {\n return a.id - b.id;\n }\n return new Date(a.created_on).getTime() - new Date(b.created_on).getTime();\n });\n\n for (const journal of sortedJournals) {\n if (!journal.notes || journal.notes.trim() === '') {\n continue;\n }\n\n const date = new Date(journal.created_on).toISOString().split('T')[0];\n const time = new Date(journal.created_on).toTimeString().split(' ')[0].substring(0, 5);\n\n comments += `## ${journal.user.name} - ${date} ${time}\\n\\n`;\n comments += `${journal.notes}\\n\\n`;\n\n if (journal.details && journal.details.length > 0) {\n comments += '**Changes:**\\n';\n for (const detail of journal.details) {\n const oldValue = detail.old_value || '(none)';\n const newValue = detail.new_value || '(none)';\n comments += `- ${detail.name}: ${oldValue} → ${newValue}\\n`;\n }\n comments += '\\n';\n }\n\n comments += '---\\n\\n';\n }\n\n return comments.trim();\n}\n\nexport function extractNewJournals(\n allJournals: RedmineJournal[],\n lastJournalId: number | null\n): RedmineJournal[] {\n if (!lastJournalId) {\n return allJournals;\n }\n\n return allJournals.filter((journal) => journal.id > lastJournalId);\n}\n\nexport function shouldUpdateIssue(\n remoteIssue: RedmineIssue,\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localUpdatedOn = localFrontmatter.updated_on as string;\n const remoteUpdatedOn = remoteIssue.updated_on;\n\n if (!localUpdatedOn) {\n return true;\n }\n\n return new Date(remoteUpdatedOn) > new Date(localUpdatedOn);\n}\n\nexport function shouldUpdateComments(\n remoteJournals: RedmineJournal[],\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localLastJournalId = localFrontmatter.lastJournalId as number;\n\n if (!localLastJournalId) {\n return remoteJournals.length > 0;\n }\n\n return remoteJournals.some((journal) => journal.id > localLastJournalId);\n}\n","import slugify from 'slugify';\nimport type { FilenameConfig } from './config.js';\n\nexport function generateSlug(\n title: string,\n config: FilenameConfig['slug'],\n existingSlugs: Set<string> = new Set()\n): string {\n let slug = slugify(title, {\n lower: config.lowercase,\n strict: true,\n remove: /[^\\w\\s-]/g,\n });\n\n slug = slug.substring(0, config.maxLength);\n\n if (!config.dedupe) {\n return slug;\n }\n\n let finalSlug = slug;\n let counter = 1;\n\n while (existingSlugs.has(finalSlug)) {\n const suffix = `-${counter}`;\n const maxLength = config.maxLength - suffix.length;\n finalSlug = `${slug.substring(0, maxLength)}${suffix}`;\n counter++;\n }\n\n existingSlugs.add(finalSlug);\n return finalSlug;\n}\n\nexport function generateFilename(\n issueId: number,\n title: string,\n config: FilenameConfig,\n existingSlugs: Set<string> = new Set()\n): string {\n const slug = generateSlug(title, config.slug, existingSlugs);\n\n return config.pattern.replace('{issueId}', issueId.toString()).replace('{slug}', slug);\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport matter from 'gray-matter';\nimport type { CommentsConfig } from './config.js';\n\nexport interface MarkdownData {\n frontmatter: Record<string, unknown>;\n content: string;\n comments?: string;\n}\n\nexport interface ParsedMarkdown {\n frontmatter: Record<string, unknown>;\n content: string;\n comments: string | null;\n rawContent: string;\n}\n\nexport async function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n}\n\nexport async function readMarkdownFile(filePath: string): Promise<ParsedMarkdown> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return parseMarkdownContent(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: '',\n };\n }\n throw error;\n }\n}\n\nexport function parseMarkdownContent(content: string): ParsedMarkdown {\n if (!content.trim()) {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: content,\n };\n }\n\n const { data: frontmatter, content: body } = matter(content);\n\n const comments = extractCommentsSection(body);\n const mainContent = removeCommentsSection(body);\n\n return {\n frontmatter,\n content: mainContent,\n comments,\n rawContent: content,\n };\n}\n\nexport function extractCommentsSection(content: string): string | null {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return null;\n }\n\n const startIndex = content.indexOf(startMatch[0]) + startMatch[0].length;\n const endIndex = content.indexOf(endMatch[0]);\n\n if (startIndex >= endIndex) {\n return null;\n }\n\n return content.substring(startIndex, endIndex).trim();\n}\n\nexport function removeCommentsSection(content: string): string {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return content;\n }\n\n const startIndex = content.indexOf(startMatch[0]);\n const endIndex = content.indexOf(endMatch[0]) + endMatch[0].length;\n\n return content.substring(0, startIndex) + content.substring(endIndex).trim();\n}\n\nexport function buildMarkdownContent(data: MarkdownData, config: CommentsConfig): string {\n let content = '';\n\n if (Object.keys(data.frontmatter).length > 0) {\n const frontmatterYaml = matter.stringify('', data.frontmatter).replace(/^---\\n|\\n---\\n?$/g, '');\n content += `---\\n${frontmatterYaml}---\\n\\n`;\n }\n\n content += data.content;\n\n if (data.comments) {\n content += `\\n\\n${config.anchors.start}\\n${data.comments}\\n${config.anchors.end}`;\n }\n\n return content;\n}\n\nexport async function writeMarkdownFile(\n filePath: string,\n data: MarkdownData,\n config: CommentsConfig\n): Promise<void> {\n await ensureDir(filePath);\n const content = buildMarkdownContent(data, config);\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport function extractIssueIdFromFrontmatter(frontmatter: Record<string, unknown>): number | null {\n const id = frontmatter.id as number | string | undefined;\n if (typeof id === 'number') {\n return id;\n }\n if (typeof id === 'string') {\n const parsed = parseInt(id, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n\nexport function extractLastJournalId(frontmatter: Record<string, unknown>): number | null {\n const lastJournalId = frontmatter.lastJournalId as number | string | undefined;\n if (typeof lastJournalId === 'number') {\n return lastJournalId;\n }\n if (typeof lastJournalId === 'string') {\n const parsed = parseInt(lastJournalId, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncProject } from '../../sync-project.js';\n\ninterface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n concurrency?: string;\n pageSize?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync project command\n */\nexport function createSyncProjectCommand(): Command {\n const cmd = new Command('project')\n .description('Sync all issues in a project')\n .option('-s, --status <status>', 'Filter by status (default: *)', '*')\n .option('--updated-since <date>', 'Only sync issues updated since YYYY-MM-DD')\n .option('--concurrency <number>', 'Number of concurrent requests')\n .option('--page-size <number>', 'Page size for API requests')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncProjectOptions) => {\n await handleSyncProject(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncProject(options: SyncProjectOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const syncOptions: Parameters<typeof syncProject>[1] = {\n status: options.status,\n updatedSince: options.updatedSince,\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n ...(options.concurrency && { concurrency: parseInt(options.concurrency, 10) }),\n ...(options.pageSize && { pageSize: parseInt(options.pageSize, 10) }),\n onProgress: options.json\n ? undefined\n : (current: number, total: number) => {\n process.stdout.write(`\\rProgress: ${current}/${total} issues`);\n },\n };\n\n const result = await syncProject(config, syncOptions);\n\n if (!options.json) {\n process.stdout.write('\\r'); // Clear progress line\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅ Sync completed successfully');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n if (result.failed > 0) {\n console.log(` Failed: ${result.failed}`);\n }\n } else {\n console.log('❌ Sync completed with errors');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n console.log(` Failed: ${result.failed}`);\n\n if (result.errors.length > 0) {\n console.log('\\nErrors:');\n result.errors.forEach((error) => {\n console.log(` Issue ${error.issueId}: ${error.error}`);\n });\n }\n\n process.exit(5);\n }\n }\n}\n","import type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport { syncIssue } from './sync-issue.js';\n\nexport interface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n dryRun?: boolean;\n outputDir?: string;\n concurrency?: number;\n pageSize?: number;\n onProgress?: (current: number, total: number) => void;\n}\n\nexport interface SyncProjectResult {\n success: boolean;\n totalIssues: number;\n processed: number;\n created: number;\n updated: number;\n skipped: number;\n failed: number;\n errors: Array<{\n issueId: number;\n error: string;\n }>;\n}\n\nexport async function syncProject(\n config: RedmineConfig,\n options: SyncProjectOptions = {}\n): Promise<SyncProjectResult> {\n const client = new RedmineApiClient(config);\n const pageSize = options.pageSize || config.defaults.pageSize;\n\n const result: SyncProjectResult = {\n success: true,\n totalIssues: 0,\n processed: 0,\n created: 0,\n updated: 0,\n skipped: 0,\n failed: 0,\n errors: [],\n };\n\n try {\n const issues = await client.getIssuesConcurrently(config.project.id, {\n status: options.status || config.defaults.status,\n pageSize,\n include: config.defaults.include,\n updatedSince: options.updatedSince,\n onProgress: options.onProgress,\n });\n\n result.totalIssues = issues.length;\n\n if (issues.length === 0) {\n return result;\n }\n\n const syncPromises = issues.map(async (issue) => {\n const syncResult = await syncIssue(issue.id, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n result.processed++;\n\n if (syncResult.success) {\n switch (syncResult.action) {\n case 'created':\n result.created++;\n break;\n case 'updated':\n result.updated++;\n break;\n case 'skipped':\n result.skipped++;\n break;\n }\n } else {\n result.failed++;\n result.errors.push({\n issueId: syncResult.issueId,\n error: syncResult.message,\n });\n }\n\n return syncResult;\n });\n\n await Promise.all(syncPromises);\n\n result.success = result.failed === 0;\n return result;\n } catch (error) {\n result.success = false;\n result.errors.push({\n issueId: 0,\n error: `Failed to fetch issues: ${error instanceof Error ? error.message : String(error)}`,\n });\n return result;\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../../types/framework.types.js';\n\n/**\n * Create info command for Jai1 Framework\n * Shows configuration and status information\n */\nexport function createInfoCommand(): Command {\n const cmd = new Command('info')\n .description('Show jai1-client configuration and status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleInfo(options);\n });\n\n return cmd;\n}\n\nasync function handleInfo(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('Jai1 Client Info');\n console.log('────────────────\\n');\n console.log(`Config Location: ${info.configPath}`);\n console.log(`API URL: ${info.apiUrl}`);\n console.log(`Access Key: ${info.accessKey}`);\n console.log(`Framework Version: ${info.version}`);\n console.log(`Last Updated: ${info.lastUpdated}`);\n console.log(`Framework Location: ${info.frameworkPath}`);\n console.log();\n console.log('Project Status:');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Synced version: ${info.projectStatus.version || 'Unknown'}`);\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create self-update command\n */\nexport function createSelfUpdateCommand(): Command {\n return new Command('self-update')\n .description('Update jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force update without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleSelfUpdate(options);\n });\n}\n\nasync function handleSelfUpdate(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 self-update\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Update cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully updated to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('self_update', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Update failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually updating with:${colors.reset}`);\n console.error(` ${colors.cyan}npm install -g @jvittechs/jai1-cli@latest${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager is being used\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check user agent for package manager\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n // Check which command is available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // pnpm not available\n }\n\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n // yarn not available\n }\n\n try {\n execSync('bun --version', { stdio: 'ignore' });\n return 'bun';\n } catch {\n // bun not available\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\n\nexport function createClearBackupsCommand(): Command {\n return new Command('clear-backups')\n .description('Clear backup files')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options) => {\n const service = new ComponentsService();\n const backups = await service.listBackups(process.cwd());\n\n if (backups.length === 0) {\n console.log('No backups found.');\n return;\n }\n\n console.log(`Found ${backups.length} backup(s):`);\n if (backups.length <= 5) {\n backups.forEach(b => console.log(` - ${b}`));\n } else {\n backups.slice(0, 5).forEach(b => console.log(` - ${b}`));\n console.log(` ...and ${backups.length - 5} more`);\n }\n console.log();\n\n if (!options.yes) {\n const ok = await confirm({ message: 'Delete all backups?', default: false });\n if (!ok) return;\n }\n\n await service.clearBackups(process.cwd());\n console.log('✅ Backups cleared.');\n });\n}\n","import { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Tắt tất cả telemetry và thu thập dữ liệu',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Tắt/giảm tải các language servers (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Tắt Git tích hợp để cải thiện hiệu suất',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Loại trừ các thư mục khỏi file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Loại trừ các thư mục khỏi search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Tắt auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Tối ưu rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Ẩn các UI elements không cần thiết',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\nexport function createVSCodeCommand(): Command {\n const vscodeCommand = new Command('vscode')\n .description('Quản lý cài đặt VSCode cho dự án hiện tại');\n\n // Interactive mode (default)\n vscodeCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n vscodeCommand\n .command('enable')\n .description('Enable các nhóm tối ưu cụ thể')\n .argument('[groups...]', 'Tên các nhóm cần enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n vscodeCommand\n .command('disable')\n .description('Disable các nhóm tối ưu cụ thể (restore về default)')\n .argument('[groups...]', 'Tên các nhóm cần disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n vscodeCommand\n .command('max-performance')\n .description('Enable tất cả các tối ưu để đạt hiệu suất tối đa')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n vscodeCommand\n .command('reset')\n .description('Reset về settings mặc định (xóa tất cả tối ưu)')\n .argument('[groups...]', 'Tên các nhóm cần reset (để trống = reset tất cả)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n vscodeCommand\n .command('list')\n .description('Liệt kê tất cả các nhóm tối ưu có sẵn')\n .action(() => {\n console.log('🔧 Các nhóm tối ưu có sẵn:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return vscodeCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 Quản lý cài đặt VSCode\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Hướng dẫn sử dụng: │');\n console.log('│ • Dùng phím ↑↓ để di chuyển │');\n console.log('│ • Nhấn SPACE để chọn/bỏ chọn nhóm │');\n console.log('│ • Nhấn ENTER để xác nhận và áp dụng │');\n console.log('│ • Nhấn Ctrl+C để hủy │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'Bạn muốn làm gì?',\n choices: [\n { name: '✅ Enable các nhóm tối ưu', value: 'enable' },\n { name: '❌ Disable các nhóm tối ưu', value: 'disable' },\n { name: '🚀 Max Performance (enable tất cả)', value: 'max' },\n { name: '🔄 Reset về mặc định', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Chọn các nhóm để ${action === 'enable' ? 'enable' : 'disable'} (SPACE để chọn, ENTER để xác nhận):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn nhóm nào!');\n console.log(' 💡 Mẹo: Hãy nhấn SPACE để chọn ít nhất 1 nhóm trước khi nhấn ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Đã hủy thao tác.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Nhóm không hợp lệ: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Chạy \"jai1 vscode list\" để xem danh sách nhóm có sẵn.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Đã tạo thư mục .vscode/');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Đã đọc cài đặt hiện tại từ settings.json');\n } catch {\n console.warn('⚠️ Không thể đọc settings.json (có thể chứa comments).');\n const confirmOverwrite = await confirm({\n message: 'Ghi đè file settings.json hiện tại?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 Đang ${action === 'enable' ? 'enable' : 'disable'} các nhóm:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Đã cập nhật cài đặt VSCode tại: ${settingsPath}`);\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ Không tìm thấy file settings.json');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset TẤT CẢ settings về mặc định (xóa toàn bộ file)?'\n : `Reset các nhóm: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Đã xóa file settings.json');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create guide command - Agentic Coding guide center\n */\nexport function createGuideCommand(): Command {\n const cmd = new Command('guide')\n .description('Interactive guide center for Agentic Coding')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../types/context.types.js';\nimport { ContextScannerService } from '../services/context-scanner.service.js';\n\n/**\n * Create context command - Visualize project context\n */\nexport function createContextCommand(): Command {\n const cmd = new Command('context')\n .description('Khám phá và quản lý context dự án cho các IDE')\n .option('--ide <ide>', 'Mở trực tiếp IDE cụ thể (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Hiển thị loại context cụ thể (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Hiển thị thống kê context (non-interactive)')\n .action(async (options: { ide?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.ide) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.ide)) {\n console.error(`❌ IDE không hợp lệ: ${options.ide}`);\n console.error(` IDE hợp lệ: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.ide as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Loại context không hợp lệ: ${options.type}`);\n console.error(` Loại hợp lệ: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Đang quét context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ Không tìm thấy context nào');\n console.log(' Hãy chạy `jai1 apply` để cài đặt context cho IDE của bạn.\\n');\n return;\n }\n\n console.log('📊 Thống kê Context\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('vi-VN')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Tổng: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Lỗi khi quét context:', error);\n process.exit(1);\n }\n}\n","/**\n * migrate-ide command - Migrate .jai1 content to IDE directories\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../constants/ide-migration-configs.js';\n\n/**\n * Create migrate-ide command\n */\nexport function createMigrateIdeCommand(): Command {\n const cmd = new Command('migrate-ide')\n .description('Migrate .jai1 rules và workflows sang IDEs (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runMigrateIde(options);\n });\n\n return cmd;\n}\n\nasync function runMigrateIde(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Migrate rules và workflows sang IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ Không tìm thấy content trong .jai1/');\n console.log(' 💡 Hãy tạo files trong .jai1/rules/ hoặc .jai1/workflows/ trước.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Chọn IDE(s) để migrate (SPACE để chọn, ENTER để xác nhận):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn IDE nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Chọn content types để migrate:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn content type nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with migration?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Migration cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Migrating...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Migration complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n"],"mappings":";;;AAEA,SAAS,WAAAA,iBAAe;;;ACCjB,IAAM,YAAN,cAAwB,MAAM;AAAA,EACjC,YACI,SACO,UACT;AACE,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC3C,YAAY,SAAiB;AACzB,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EAChB;AACJ;AAeO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EACzC,YAAY,SAAiB;AACzB,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EAChB;AACJ;AAKO,IAAM,eAAN,cAA2B,UAAU;AAAA,EACxC,YAAY,SAAiB;AACzB,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EAChB;AACJ;;;ACnDA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,KAAO;AAAA,IACL,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,KAAK;AAAA,EACP;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,EACX,QAAU;AAAA,EACV,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,UAAY;AAAA,EACZ,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,iBAAiB;AAAA,EACnB;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,YAAc;AAAA,IACd,WAAa;AAAA,IACb,eAAe;AAAA,IACf,KAAO;AAAA,IACP,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAS;AAAA,IACT,SAAW;AAAA,IACX,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,oCAAoC;AAAA,IACpC,6BAA6B;AAAA,IAC7B,uBAAuB;AAAA,IACvB,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AC/EA,SAAS,YAAY,UAAU;AAC/B,SAAS,YAAY;AACrB,SAAS,eAAe;AAOjB,IAAM,gBAAN,MAAoB;AAAA,EACN;AAAA,EACA;AAAA,EAEjB,cAAc;AACV,SAAK,YAAY,KAAK,QAAQ,GAAG,OAAO;AACxC,SAAK,aAAa,KAAK,KAAK,WAAW,aAAa;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAA2B;AAC7B,QAAI;AACA,YAAM,GAAG,OAAO,KAAK,UAAU;AAC/B,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAmC;AACrC,QAAI,CAAE,MAAM,KAAK,OAAO,GAAI;AACxB,aAAO;AAAA,IACX;AAEA,QAAI;AACA,YAAM,UAAU,MAAM,GAAG,SAAS,KAAK,YAAY,OAAO;AAC1D,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpF;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,QAAmC;AAC1C,QAAI;AAEA,YAAM,GAAG,MAAM,KAAK,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAG/D,YAAM,GAAG,UAAU,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG;AAAA,QACjE,MAAM;AAAA,MACV,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,YAAM,IAAI;AAAA,QACN,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpF;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACnB,WAAO,KAAK;AAAA,EAChB;AACJ;;;AC/EA,IAAM,SAAS;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACV;AAGA,IAAI,gBAAgB;AACpB,IAAI,sBAAqC;AACzC,IAAM,oBAAoB,KAAK,KAAK;AAMpC,eAAsB,uBAAsC;AACxD,MAAI;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,gBAAgB,qBAAqB,qBAAqB;AAChE,UAAI,eAAe,qBAAqB,gBAAY,OAAO,GAAG;AAC1D,+BAAuB,mBAAmB;AAAA,MAC9C;AACA;AAAA,IACJ;AAEA,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAGA,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAI;AAAA;AAAA,IACpC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd;AAAA,IACJ;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,oBAAgB;AAChB,0BAAsB,KAAK;AAE3B,QAAI,eAAe,KAAK,SAAS,gBAAY,OAAO,GAAG;AACnD,6BAAuB,KAAK,OAAO;AAAA,IACvC;AAAA,EACJ,QAAQ;AAAA,EAER;AACJ;AAKA,SAAS,eAAe,QAAgB,OAAwB;AAC5D,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,IAAI,WAAW,CAAC,KAAK;AAE3B,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACtB;AAEA,SAAO;AACX;AAKA,SAAS,uBAAuB,eAA6B;AACzD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,OAAO,MAAM,2WAA+D,OAAO,KAAK,EAAE;AACzG,UAAQ,IAAI,GAAG,OAAO,MAAM,SAAI,OAAO,KAAK,KAAK,OAAO,IAAI,kCAAwB,OAAO,KAAK,IAAI,gBAAY,OAAO,WAAM,OAAO,IAAI,GAAG,aAAa,GAAG,OAAO,KAAK,qBAAqB,OAAO,MAAM,SAAI,OAAO,KAAK,EAAE;AAC3N,UAAQ,IAAI,GAAG,OAAO,MAAM,SAAI,OAAO,KAAK,UAAU,OAAO,IAAI,eAAe,OAAO,KAAK,sCAAsC,OAAO,MAAM,SAAI,OAAO,KAAK,EAAE;AACjK,UAAQ,IAAI,GAAG,OAAO,MAAM,2WAA+D,OAAO,KAAK,EAAE;AACzG,UAAQ,IAAI,EAAE;AAClB;;;AC1FA,SAAS,eAAe;;;ACCxB,SAAS,UAAU,SAAS,MAAM,UAAU,WAAAC,gBAAe;AAC3D,SAAS,WAAW,mBAAmB;AA0BvC,SAAS,gBAAwC;AAC7C,SAAO;AAAA,IACH,IAAI,SAAS;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,MAAM,KAAK;AAAA,IACX;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,SAASC,SAAQ;AAAA,EACrB;AACJ;AAMO,IAAM,kBAAN,MAAsB;AAAA,EACjB;AAAA,EAER,cAAc;AACV,SAAK,gBAAgB,IAAI,cAAc;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAM,QAAwB,QAAwC;AACxE,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,UAAI,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,QAAQ;AAChD;AAAA,MACJ;AAEA,YAAM,WAAW,GAAG,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AAGpD,WAAK,kBAAkB,UAAU,OAAO,WAAW,QAAQ,MAAM,EAAE;AAAA,QAC/D,MAAM;AAAA,QAEN;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,QAAwB,QAA2C;AAC/E,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,UAAI,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,QAAQ;AAChD,eAAO;AAAA,MACX;AAEA,YAAM,WAAW,GAAG,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC;AACpD,aAAO,MAAM,KAAK,kBAAkB,UAAU,OAAO,WAAW,QAAQ,MAAM;AAAA,IAClF,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAc,kBACV,UACA,WACA,QACA,QACgB;AAChB,QAAI;AAEA,YAAM,iBAAiB;AAAA,QACnB,GAAG,cAAc;AAAA,QACjB,GAAG;AAAA,MACP;AAEA,YAAM,WAAW,MAAM,MAAM,UAAU;AAAA,QACnC,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,QACvB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACjB;AAAA,UACA,QAAQ;AAAA,UACR,eAAe,gBAAY;AAAA,QAC/B,CAAC;AAAA;AAAA,QAED,QAAQ,YAAY,QAAQ,GAAK;AAAA,MACrC,CAAC;AAED,aAAO,SAAS;AAAA,IACpB,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;AAGA,IAAI,mBAA2C;AAKxC,SAAS,qBAAsC;AAClD,MAAI,CAAC,kBAAkB;AACnB,uBAAmB,IAAI,gBAAgB;AAAA,EAC3C;AACA,SAAO;AACX;AAMO,SAAS,YAAY,QAAwB,QAA+B;AAC/E,qBAAmB,EAAE,MAAM,QAAQ,MAAM;AAC7C;AAMA,eAAsB,gBAAgB,QAAwB,QAA2C;AACrG,SAAO,mBAAmB,EAAE,UAAU,QAAQ,MAAM;AACxD;;;ADpJO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAI,QAAQ,MAAM,EACzB,YAAY,wCAAwC,EACpD,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,OAAO,YAAyB;AACpC,UAAM,WAAW,OAAO;AAAA,EAC5B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,WAAW,SAAqC;AAC3D,QAAM,gBAAgB,IAAI,cAAc;AAExC,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB;AAGpB,QAAM,iBAAiB,MAAM,cAAc,KAAK;AAChD,MAAI,gBAAgB;AAChB,YAAQ,IAAI,kDAAwC,cAAc,cAAc,CAAC;AACjF,YAAQ,IAAI,0DAA0D;AACtE,YAAQ,IAAI,EAAE;AAAA,EAClB;AAGA,MAAI,QAAQ,UAAU,QAAQ,WAAW;AAErC,aAAS,QAAQ;AACjB,gBAAY,QAAQ;AAAA,EACxB,WAAW,QAAQ,UAAU,QAAQ,WAAW;AAE5C,UAAM,IAAI;AAAA,MACN;AAAA,IACJ;AAAA,EACJ,OAAO;AAEH,oBAAgB;AAChB,YAAQ,IAAI,6BAAsB;AAClC,YAAQ,IAAI,0GAAqB;AAGjC,UAAM,WAAW,MAAM,OAAO,UAAU;AACxC,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAChC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,UAAM,WAAW,CAAC,WAAoC;AAClD,aAAO,IAAI,QAAQ,CAACC,aAAY;AAC5B,WAAG,SAAS,QAAQ,CAAC,WAAW;AAC5B,UAAAA,SAAQ,MAAM;AAAA,QAClB,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAEA,aAAS,MAAM,SAAS,mCAAmC;AAC3D,QAAI,CAAC,QAAQ;AACT,eAAS;AAAA,IACb;AAEA,gBAAY,MAAM,SAAS,cAAc;AACzC,QAAI,CAAC,WAAW;AACZ,SAAG,MAAM;AACT,YAAM,IAAI,gBAAgB,wBAAwB;AAAA,IACtD;AAEA,OAAG,MAAM;AAAA,EACb;AAGA,MAAI;AACA,QAAI,IAAI,MAAM;AAAA,EAClB,QAAQ;AACJ,UAAM,IAAI,gBAAgB,wBAAwB;AAAA,EACtD;AAEA,UAAQ,IAAI,4BAA4B;AAUxC,QAAM,cAAc,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,aAAa;AAAA,EACjB,CAAC;AAGD,QAAM,gBAAgB,QAAQ;AAAA,IAC1B,YAAY,cAAc,cAAc;AAAA,IACxC,MAAM,gBAAgB,gBAAgB;AAAA,IACtC,YAAY,CAAC,CAAC;AAAA,EAClB,CAAC;AAED,UAAQ,IAAI,iCAA4B,cAAc,cAAc,CAAC;AACrE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,wDAAwD;AACxE;;;AE9GA,SAAS,WAAAC,gBAAe;;;ACNxB,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AA2CpB,IAAM,oBAAN,MAAwB;AAAA,EACV;AAAA,EACA;AAAA,EAEjB,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,WAAWC,MAAKC,SAAQ,GAAG,SAAS,OAAO;AAChD,SAAK,eAAeD,MAAK,aAAa,SAAS,eAAe;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAAoB,SAAmE;AAC9F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,IAAK,QAAO,IAAI,OAAO,QAAQ,GAAG;AAC/C,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AAExD,UAAM,MAAM,GAAG,OAAO,MAAM,kBAAkB,OAAO,SAAS,IAAI,MAAM,OAAO,SAAS,IAAI,EAAE;AAE9F,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,mCAAmC,SAAS,MAAM,EAAE;AAAA,IAC/E;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAoC;AAC/C,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,aAAa;AAAA,MACtD,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,6BAA6B,SAAS,MAAM,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,QAAoB,UAAsC;AAChE,UAAM,cAAc,mBAAmB,QAAQ;AAC/C,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,mBAAmB,WAAW,IAAI;AAAA,MAC3E,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,UAAI,SAAS,WAAW,KAAK;AACzB,cAAM,IAAI,MAAM,wBAAwB,QAAQ,EAAE;AAAA,MACtD;AACA,YAAM,IAAI,aAAa,iCAAiC,SAAS,MAAM,EAAE;AAAA,IAC7E;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAA0C;AACpD,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS,EAAE,mBAAmB,OAAO,UAAU;AAAA,IACnD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,uCAAuC,SAAS,MAAM,EAAE;AAAA,IACnF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAoB,UAAkB,WAAkC;AAClF,UAAM,YAAY,MAAM,KAAK,IAAI,QAAQ,QAAQ;AAEjD,QAAI,CAAC,UAAU,SAAS;AACpB,YAAM,IAAI,MAAM,aAAa,QAAQ,iBAAiB;AAAA,IAC1D;AAEA,UAAM,aAAaA,MAAK,WAAW,QAAQ;AAC3C,UAAM,eAAeA,MAAK,YAAY,IAAI;AAE1C,UAAME,IAAG,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAEhD,QAAI,kBAAkB,UAAU;AAChC,QAAI,UAAU,gBAAgB,YAAY,UAAU,gBAAgB,OAAO;AAEvE,UAAI;AACJ,UAAI,UAAU,gBAAgB,UAAU;AAEpC,cAAM,aAAa,OAAO,KAAK,UAAU,SAAS,QAAQ;AAC1D,qBAAa,WAAW,UAAU,EAAE,SAAS,OAAO;AACpD,0BAAkB;AAAA,MACtB,OAAO;AAEH,qBAAa,UAAU;AAAA,MAC3B;AAEA,YAAM,SAAS,KAAK,MAAM,UAAU;AAGpC,YAAM,WAAWF,MAAK,WAAW,QAAQ;AACzC,YAAME,IAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAG5C,YAAMA,IAAG,UAAUF,MAAK,UAAU,UAAU,GAAG,OAAO,IAAI;AAG1D,iBAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAC9D,YAAI,cAAc,WAAY;AAC9B,cAAM,gBAAgBA,MAAK,UAAU,SAAS;AAC9C,cAAME,IAAG,MAAMF,MAAK,eAAe,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,cAAME,IAAG,UAAU,eAAe,OAAO;AAAA,MAC7C;AAAA,IACJ,OAAO;AAGH,UAAI,UAAU,gBAAgB,YAAY;AACtC,0BAAkB,UAAU;AAAA,MAChC;AAEA,YAAMA,IAAG,UAAU,YAAY,UAAU,OAAO;AAAA,IACpD;AAGA,UAAM,KAAK,cAAc,UAAU,UAAU,SAAS,KAAK,kBAAkB,eAAe,CAAC;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAA4D;AAC9D,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,SAAS,KAAK,cAAc,OAAO;AAC5D,aAAO,KAAK,MAAM,OAAO;AAAA,IAC7B,QAAQ;AACJ,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,UAAkB,SAAiB,UAAiC;AACpF,UAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,cAAU,QAAQ,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,UAAU;AAAA,IACd;AAEA,UAAMA,IAAG,MAAMF,MAAK,KAAK,cAAc,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE,UAAME,IAAG,UAAU,KAAK,cAAc,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAoB,WAAqF;AACxH,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,6BAA6B;AAAA,MACtE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,QAC1B,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,IACtC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,aAAa,iCAAiC,SAAS,MAAM,EAAE;AAAA,IAC7E;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,QAAoB,WAAwC;AACtF,UAAM,WAAW,oBAAI,IAAY;AACjC,UAAM,QAAQ,CAAC,GAAG,SAAS;AAC3B,UAAM,OAAO,oBAAI,IAAY;AAE7B,WAAO,MAAM,SAAS,GAAG;AACrB,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,KAAK,IAAI,OAAO,EAAG;AACvB,WAAK,IAAI,OAAO;AAChB,eAAS,IAAI,OAAO;AAEpB,UAAI;AAIA,cAAM,YAAY,MAAM,KAAK,IAAI,QAAQ,OAAO;AAEhD,YAAI,UAAU,cAAc;AACxB,qBAAW,OAAO,UAAU,cAAc;AACtC,gBAAI,CAAC,IAAI,SAAU;AAEnB,kBAAM,UAAU,OAAO,QAAQ,WAAW,MAAM,IAAI;AACpD,gBAAI,CAAC,KAAK,IAAI,OAAO,GAAG;AACpB,oBAAM,KAAK,OAAO;AAAA,YACtB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,KAAK,+CAA+C,OAAO,KAAK,KAAK,EAAE;AAAA,MACnF;AAAA,IACJ;AAEA,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAkB,WAA2C;AAC1E,UAAM,aAAaF,MAAK,WAAW,QAAQ;AAE3C,QAAI;AACA,YAAME,IAAG,OAAO,UAAU;AAAA,IAC9B,QAAQ;AACJ,aAAO;AAAA,IACX;AAEA,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,UAAM,YAAYF,MAAK,WAAW,MAAM,gBAAgB,SAAS;AACjE,UAAM,aAAaA,MAAK,WAAW,QAAQ;AAE3C,UAAM,QAAQ,MAAME,IAAG,KAAK,UAAU;AAEtC,UAAMA,IAAG,MAAMF,MAAK,YAAY,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAE1D,QAAI,MAAM,YAAY,GAAG;AACrB,YAAME,IAAG,GAAG,YAAY,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3D,OAAO;AACH,YAAMA,IAAG,SAAS,YAAY,UAAU;AAAA,IAC5C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,aAAwC;AACtD,UAAM,aAAaF,MAAK,aAAa,cAAc;AACnD,QAAI;AACA,YAAM,UAAU,MAAME,IAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,aAAO,QACF,OAAO,OAAK,EAAE,YAAY,CAAC,EAC3B,IAAI,OAAK,EAAE,IAAI,EACf,KAAK,EACL,QAAQ;AAAA,IACjB,QAAQ;AACJ,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,aAAoC;AACnD,UAAM,aAAaF,MAAK,aAAa,cAAc;AACnD,QAAI;AACA,YAAME,IAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC5D,SAAS,OAAO;AAAA,IAEhB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,SAAyB;AACvC,WAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,UAAU,GAAG,EAAE;AAAA,EAC7E;AACJ;;;AD1UA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAMjB,SAAS,sBAA+B;AAC3C,QAAM,MAAM,IAAIC,SAAQ,QAAQ,EAC3B,YAAY,oDAAoD,EAChE,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAyB;AACpC,UAAM,aAAa,OAAO;AAAA,EAC9B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,aAAa,SAAqC;AAC7D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,gBAAgBF,MAAKC,SAAQ,GAAG,SAAS,WAAW;AAC1D,QAAM,gBAAgB,MAAM,iBAAiB;AAC7C,QAAM,sBAAsB,MAAM,kBAAkB,aAAa;AACjE,QAAM,iBAAiB,OAAO,KAAK,mBAAmB,EAAE;AAExD,QAAM,OAAO;AAAA,IACT,YAAY,cAAc,cAAc;AAAA,IACxC,QAAQ,OAAO;AAAA,IACf,WAAW,QAAQ,OAAO,SAAS;AAAA,IACnC,SAAS,OAAO,WAAW;AAAA,IAC3B,aAAa,OAAO,eAAe;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,EACJ;AAEA,UAAQ,IAAI,8BAAuB;AACnC,UAAQ,IAAI,kIAAyB;AAGrC,UAAQ,IAAI,yBAAkB;AAC9B,UAAQ,IAAI,kBAAkB,KAAK,UAAU,EAAE;AAC/C,UAAQ,IAAI,kBAAkB,KAAK,MAAM,EAAE;AAC3C,UAAQ,IAAI,kBAAkB,KAAK,SAAS,EAAE;AAC9C,UAAQ,IAAI;AAGZ,UAAQ,IAAI,qBAAc;AAC1B,UAAQ,IAAI,kBAAkB,KAAK,OAAO,EAAE;AAC5C,UAAQ,IAAI,kBAAkB,KAAK,WAAW,EAAE;AAChD,UAAQ,IAAI,kBAAkB,KAAK,aAAa,EAAE;AAClD,UAAQ,IAAI;AAGZ,UAAQ,IAAI,mBAAY;AACxB,UAAQ,IAAI,uBAAuB,KAAK,cAAc,SAAS,WAAM,QAAG,EAAE;AAC1E,MAAI,KAAK,cAAc,QAAQ;AAC3B,YAAQ,IAAI,uBAAuB,cAAc,YAAY;AAAA,EACjE;AACA,UAAQ,IAAI;AAGZ,MAAI,CAAC,KAAK,cAAc,QAAQ;AAC5B,YAAQ,IAAI,oEAA6D;AAAA,EAC7E,WAAW,iBAAiB,GAAG;AAC3B,YAAQ,IAAI,4DAAqD;AAAA,EACrE;AACJ;AAEA,SAAS,QAAQ,KAAqB;AAClC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,SAAS,IAAI,MAAM,EAAE;AAChC;AAEA,eAAe,mBAAmE;AAC9E,QAAM,cAAcD,MAAK,QAAQ,IAAI,GAAG,OAAO;AAC/C,MAAI;AACA,UAAMD,IAAG,OAAO,WAAW;AAE3B,WAAO,EAAE,QAAQ,MAAM,SAAS,SAAS;AAAA,EAC7C,QAAQ;AACJ,WAAO,EAAE,QAAQ,MAAM;AAAA,EAC3B;AACJ;;;AE3GA,OAAOI,YAAW;AAClB,SAAS,cAAc;AACvB,SAAS,WAAAC,gBAAe;;;ACFxB,OAAOC,UAAS,UAAU,WAAW,eAAe;AACpD,SAAS,OAAAC,MAAK,QAAAC,OAAM,UAAU,cAAc;AAC5C,OAAO,aAAa;AACpB,OAAO,eAAe;;;ACHtB,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAanB,IAAM,cAA0C,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AACZ,MAAM;AACF,QAAM,aAAa,QAAQ,IAAI,KAAK,MAAO,UAAU,QAAS,GAAG,IAAI;AACrE,QAAM,SAAS,KAAK,MAAO,aAAa,MAAO,KAAK;AACpD,QAAM,QAAQ,QAAQ;AAEtB,QAAM,MAAM,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,KAAK;AAEjD,SACI,oCAAC,WACG,oCAAC,QAAK,SAAe,GAAI,GACxB,kBACG,oCAAC,QAAK,UAAQ,QAAC,KAAE,SAAQ,KAAE,OAAM,MAAG,YAAW,IAAE,CAEzD;AAER;;;ACnCA,OAAOC,YAAW;AAClB,SAAS,QAAAC,aAAY;;;ACGd,IAAM,QAAQ;AAAA,EACjB,QAAQ;AAAA,IACJ,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,QAAQ;AAAA;AAAA,IACR,MAAM;AAAA;AAAA,IACN,YAAY;AAAA;AAAA,EAChB;AAAA,EAEA,OAAO;AAAA,IACH,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACZ;AAAA,EAEA,SAAS;AAAA,IACL,QAAQ;AAAA,MACJ,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACJ,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;;;ADnCO,IAAM,aAAwC,CAAC,EAAE,QAAQ,KAAK,MAAM;AACvE,QAAM,UAAkC;AAAA,IACpC,SAAS,MAAM,MAAM;AAAA,IACrB,OAAO,MAAM,MAAM;AAAA,IACnB,SAAS,MAAM,MAAM;AAAA,IACrB,SAAS,MAAM,MAAM;AAAA,IACrB,SAAS,MAAM,MAAM;AAAA,EACzB;AAEA,QAAM,WAAmC;AAAA,IACrC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACb;AAEA,QAAM,OAAO,QAAQ,MAAM;AAC3B,QAAM,QAAQ,SAAS,MAAM;AAE7B,SACI,gBAAAC,OAAA,cAACC,OAAA,EAAK,SACD,MAAK,KAAE,IACZ;AAER;;;AFbO,IAAM,kBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA,QAAQ;AAAA,EACR;AACJ,MAAM;AACF,QAAM,EAAE,KAAK,IAAI,OAAO;AAGxB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAoB,QAAQ;AAG9D,QAAM,CAAC,YAAY,aAAa,IAAI,SAAsB,CAAC,CAAC;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAgB,CAAC,CAAC;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAGtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAsB,oBAAI,IAAI,CAAC;AACzE,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,WAAW,YAAY,IAAI,SAA+C,YAAY;AAC7F,QAAM,CAAC,sBAAsB,uBAAuB,IAAI,SAAS,CAAC;AAGlE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA4B,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAE5G,QAAM,UAAU,IAAI,kBAAkB;AAGtC,YAAU,MAAM;AACZ,UAAM,WAAW,YAAY;AACzB,UAAI;AACA,mBAAW,IAAI;AACf,cAAM,CAAC,OAAO,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAClD,QAAQ,KAAK,MAAM;AAAA,UACnB,QAAQ,SAAS,MAAM;AAAA,UACvB,QAAQ,aAAa;AAAA,QACzB,CAAC;AACD,sBAAc,KAAK;AACnB,gBAAQ,OAAO;AACf,0BAAkB,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,MACrD,SAAS,KAAK;AACV,iBAAS,eAAe,QAAQ,IAAI,UAAU,qBAAqB;AAAA,MACvE,UAAE;AACE,mBAAW,KAAK;AAAA,MACpB;AAAA,IACJ;AACA,aAAS;AAAA,EACb,GAAG,CAAC,CAAC;AAGL,QAAM,qBAAqB,QAAQ,MAAM;AACrC,QAAI,CAAC,YAAY,KAAK,EAAG,QAAO;AAChC,UAAM,QAAQ,YAAY,YAAY;AACtC,WAAO,WAAW;AAAA,MAAO,OACrB,EAAE,SAAS,YAAY,EAAE,SAAS,KAAK,KACvC,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KAClC,EAAE,QAAQ,EAAE,KAAK,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,IAC/D;AAAA,EACJ,GAAG,CAAC,YAAY,WAAW,CAAC;AAG5B,WAAS,CAAC,OAAO,QAAQ;AAErB,QAAI,cAAc,WAAW;AACzB,UAAI,IAAI,UAAU,UAAU,OAAO,IAAI,QAAQ;AAC3C,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,cAAc;AAC5B;AAAA,IACJ;AAIA,QAAI,IAAI,KAAK;AACT,UAAI,cAAc,SAAU,cAAa,UAAU;AAAA,eAC1C,cAAc,WAAY,cAAa,YAAY;AAAA,UACvD,cAAa,QAAQ;AAC1B;AAAA,IACJ;AAGA,QAAI,IAAI,UAAU,UAAU,KAAK;AAC7B,aAAO;AACP;AAAA,IACJ;AAGA,QAAI,IAAI,UAAU,cAAc,UAAU;AACtC,UAAI,cAAc,OAAO,GAAG;AACxB,oBAAY;AAAA,MAChB;AACA;AAAA,IACJ;AAGA,QAAI,cAAc,cAAc;AAC5B,UAAI,IAAI,SAAS;AACb,uBAAe,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MAChD,WAAW,IAAI,WAAW;AACtB,uBAAe,UAAQ,KAAK,IAAI,mBAAmB,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MAC5E,WAAW,UAAU,KAAK;AAEtB,cAAM,UAAU,mBAAmB,WAAW;AAC9C,YAAI,SAAS;AACT,2BAAiB,UAAQ;AACrB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,gBAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG;AAC5B,mBAAK,OAAO,QAAQ,QAAQ;AAAA,YAChC,OAAO;AACH,mBAAK,IAAI,QAAQ,QAAQ;AAAA,YAC7B;AACA,mBAAO;AAAA,UACX,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,UAAU,KAAK;AAEtB,yBAAiB,UAAQ;AACrB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,6BAAmB,QAAQ,OAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AACpD,iBAAO;AAAA,QACX,CAAC;AAAA,MACL,WAAW,UAAU,KAAK;AAEtB,yBAAiB,oBAAI,IAAI,CAAC;AAAA,MAC9B;AAAA,IACJ;AAGA,QAAI,cAAc,YAAY;AAC1B,UAAI,IAAI,WAAW;AACf,gCAAwB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACzD,WAAW,IAAI,YAAY;AACvB,gCAAwB,UAAQ,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MACvE,WAAW,UAAU,OAAO,IAAI,QAAQ;AAEpC,cAAM,MAAM,KAAK,oBAAoB;AACrC,YAAI,KAAK;AACL,gBAAM,oBAAoB,WAAW,OAAO,OAAK,EAAE,MAAM,SAAS,IAAI,GAAG,CAAC;AAC1E,2BAAiB,UAAQ;AACrB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,8BAAkB,QAAQ,OAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AACnD,mBAAO;AAAA,UACX,CAAC;AAED,yBAAe,IAAI,GAAG;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,QAAM,cAAc,YAAY;AAC5B,iBAAa,YAAY;AACzB,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,UAAM,iBAAiB,MAAM,KAAK,aAAa;AAG/C,UAAM,gBAAgB,MAAM,QAAQ,wBAAwB,QAAQ,cAAc;AAClF,UAAM,YAAY,MAAM,QAAQ,aAAa;AAG7C,UAAM,kBAAqC,cAAc,IAAI,SAAO;AAAA,MAChE,UAAU;AAAA,MACV,QAAQ;AAAA,IACZ,EAAE;AACF,uBAAmB,eAAe;AAClC,oBAAgB,EAAE,OAAO,cAAc,QAAQ,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC;AAE9F,QAAI,QAAQ,GAAG,UAAU,GAAG,SAAS;AAErC,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC3C,YAAM,KAAK,cAAc,CAAC;AAG1B,yBAAmB,UAAQ,KAAK;AAAA,QAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,cAAuB,IAAI;AAAA,MACnE,CAAC;AAED,UAAI;AACA,cAAM,OAAO,UAAU,EAAE;AACzB,YAAI,QAAQ,CAAC,SAAS,KAAK,UAAU;AACjC,6BAAmB,UAAQ,KAAK;AAAA,YAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,SAAkB,OAAO,mBAAmB,IAAI;AAAA,UACxF,CAAC;AACD;AAAA,QACJ,OAAO;AACH,gBAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS;AAC3C,6BAAmB,UAAQ,KAAK;AAAA,YAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,UAAmB,IAAI;AAAA,UAC/D,CAAC;AACD,cAAI,KAAM;AAAA,cACL;AAAA,QACT;AAAA,MACJ,SAAS,KAAK;AACV,2BAAmB,UAAQ,KAAK;AAAA,UAAI,OAChC,EAAE,aAAa,KAAK,EAAE,GAAG,GAAG,QAAQ,SAAkB,OAAO,eAAe,QAAQ,IAAI,UAAU,QAAQ,IAAI;AAAA,QAClH,CAAC;AACD;AAAA,MACJ;AAEA,sBAAgB,EAAE,OAAO,cAAc,QAAQ,WAAW,IAAI,GAAG,OAAO,SAAS,OAAO,CAAC;AAAA,IAC7F;AAEA,iBAAa,SAAS;AAAA,EAC1B;AAGA,MAAI,SAAS;AACT,WACI,gBAAAC,OAAA,cAACC,MAAA,EAAI,SAAS,KACV,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,UAAO,gBAAAF,OAAA,cAAC,WAAQ,MAAK,QAAO,GAAE,mCAAuB,CACrE;AAAA,EAER;AAGA,MAAI,OAAO;AACP,WACI,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,SAAM,kBAAU,KAAM,GAClC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,iBAAe,CAClC;AAAA,EAER;AAGA,MAAI,cAAc,cAAc;AAC5B,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,iCAAwB,CACpD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAAC,eAAY,SAAS,aAAa,WAAW,OAAO,aAAa,OAAO,OAAO,IAAI,CACxF,GAEA,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,QAAQ,MAClF,gBAAgB,MAAM,EAAE,EAAE,IAAI,CAAC,SAC5B,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,KAAK,YACX,gBAAAD,OAAA,cAAC,cAAW,QACR,KAAK,WAAW,YAAY,YACxB,KAAK,WAAW,UAAU,UACtB,KAAK,WAAW,gBAAgB,YAAY,WACtD,GACF,gBAAAA,OAAA,cAACE,OAAA,MAAK,KAAE,KAAK,QAAS,GACrB,KAAK,SAAS,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,OAAM,UAAQ,QAAC,MAAG,KAAK,OAAM,GAAC,CAC7D,CACH,CACL,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,cACC,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,OAAM,QAAM,GAChD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,SAAQ,UAAQ,GACvD,UAAM,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,aAAa,QAAO,SAAO,CACzD,CACJ,CACJ;AAAA,EAER;AAGA,MAAI,cAAc,WAAW;AACzB,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,WAAQ,+BAAwB,CACrD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,OAAA,cAACE,OAAA,MAAM,aAAa,OAAM,wBAAsB,GAChD,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,WAAS,aAAa,KAAM,GAAO,cAAY,GACtE,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,aAAa,OAAQ,GAAO,UAAQ,GAClE,aAAa,SAAS,KAAK,gBAAAF,OAAA,cAACE,OAAA,MAAK,mBAAK,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,SAAO,aAAa,MAAO,GAAO,SAAO,CAChG,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,MAAK,wBAAa,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAM,UAAQ,QAAQ,IAAI,GAAE,QAAM,CAAO,CACtE,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,KACZ,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,0BAAwB,CAC3C,CACJ;AAAA,EAER;AAGA,QAAM,oBAAoB,mBAAmB,MAAM,GAAG,EAAE;AACxD,QAAM,UAAU,mBAAmB,SAAS;AAE5C,SACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KAEjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,sBAAa,GACrC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,iCAA+B,CAClD,GAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,cAAc,WAAW,SAAS,UAAQ,oBAAW,GACjE,cAAc,WACX,gBAAAF,OAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,MACP,UAAU;AAAA,MACV,aAAY;AAAA;AAAA,EAChB,IAEA,gBAAAA,OAAA,cAACE,OAAA,MAAM,eAAe,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,qBAAmB,CAAQ,CAExE,GAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,GAAG,eAAc,YAChC,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,UAAQ,QAAC,yBAAuB,GAC3C,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,UAAS,UACvB,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,MAAM;AAC9B,UAAM,aAAa,cAAc,cAAc,MAAM;AACrD,WACI,gBAAAD,OAAA,cAACC,MAAA,EAAI,KAAK,IAAI,KAAK,aAAa,KAC5B,gBAAAD,OAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,iBAAiB,aAAa,SAAS;AAAA,QACvC,OAAO,aAAa,UAAU;AAAA;AAAA,MACjC;AAAA,MACK,IAAI;AAAA,MAAI;AAAA,MAAE,IAAI;AAAA,MAAM;AAAA,IAC1B,CACJ;AAAA,EAER,CAAC,CACL,CACJ,GAGA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,cAAc,eAAe,SAAS,QAAQ,SAAS,KAChH,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,aAAW,GACtB,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,mBAAmB,QAAO,UAAO,UAAU,sBAAsB,IAAG,GAAC,CAC1F,GAEC,kBAAkB,IAAI,CAAC,MAAM,MAAM;AAChC,UAAM,WAAW,MAAM,eAAe,cAAc;AACpD,UAAM,YAAY,cAAc,IAAI,KAAK,QAAQ;AACjD,UAAM,cAAc,eAAe,IAAI,KAAK,QAAQ;AAEpD,WACI,gBAAAF,OAAA,cAACC,MAAA,EAAI,KAAK,KAAK,YACX,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,WAAW,SAAS,WAC5B,WAAW,YAAO,MAClB,YAAY,aAAQ,OAAM,KAAE,KAAK,QACtC,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,KAAE,cAAc,qBAAgB,YAAQ,CAC3D;AAAA,EAER,CAAC,GAEA,mBAAmB,WAAW,KAC3B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,iCAA+B,CAEtD,GAGC,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,eAAc,YAC7B,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,cAAW,cAAc,MAAK,aAAW,GACpD,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,YAAY,KACnC,MAAM,KAAK,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,QACvC,gBAAAD,OAAA,cAACE,OAAA,EAAK,KAAK,IAAI,UAAQ,QAAC,cAAI,EAAG,CAClC,GACA,cAAc,OAAO,KAClB,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,eAAY,cAAc,OAAO,GAAE,OAAK,CAE/D,CACJ,GAIJ,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,yIAEf,CACJ,CACJ;AAER;;;ADvZO,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIC,SAAQ,OAAO,EAC1B,YAAY,mDAAmD,EAC/D,SAAS,cAAc,4DAA4D,EACnF,OAAO,WAAW,0CAA0C,EAC5D,OAAO,oBAAoB,oCAAoC,EAC/D,OAAO,OAAO,OAAiB,YAAwD;AACpF,UAAM,gBAAgB,IAAI,cAAc;AACxC,UAAM,SAAS,MAAM,cAAc,KAAK;AACxC,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,gBAAgB,yCAAyC;AAAA,IACvE;AAGA,QAAI,QAAQ,gBAAgB,SAAS,MAAM,SAAS,GAAG;AACnD,YAAM,oBAAoB,QAAQ,OAAO,OAAO;AAChD;AAAA,IACJ;AAGA,UAAM,EAAE,cAAc,IAAI;AAAA,MACtBC,OAAM,cAAc,iBAAiB;AAAA,QACjC;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;AAKA,eAAe,oBACX,QACA,OACA,SACF;AACE,QAAM,oBAAoB,IAAI,kBAAkB;AAEhD,MAAI,MAAM,WAAW,GAAG;AACpB,YAAQ,IAAI,qFAAgF;AAC5F,YAAQ,IAAI,mEAA4D;AACxE;AAAA,EACJ;AAGA,QAAM,OAAO,MAAM,kBAAkB,SAAS,MAAM;AACpD,QAAM,eAAe,KAAK,IAAI,OAAK,EAAE,GAAG;AAExC,MAAI;AAEJ,MAAI,MAAM,WAAW,KAAK,aAAa,SAAS,MAAM,CAAC,CAAE,GAAG;AAExD,YAAQ,IAAI,+BAAwB,MAAM,CAAC,CAAC,MAAM;AAClD,UAAM,aAAa,MAAM,kBAAkB,KAAK,QAAQ,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;AACzE,gBAAY,WAAW,IAAI,OAAK,EAAE,QAAQ;AAAA,EAC9C,OAAO;AAEH,gBAAY;AAAA,EAChB;AAGA,UAAQ,IAAI,qCAA8B;AAC1C,QAAM,gBAAgB,MAAM,kBAAkB,wBAAwB,QAAQ,SAAS;AAEvF,UAAQ,IAAI,wBAAiB,cAAc,MAAM,gBAAgB;AACjE,aAAW,MAAM,eAAe;AAC5B,UAAM,QAAQ,CAAC,UAAU,SAAS,EAAE;AACpC,UAAM,SAAS,QAAQ,kBAAkB;AACzC,YAAQ,IAAI,QAAQ,EAAE,GAAG,MAAM,EAAE;AAAA,EACrC;AAGA,QAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,QAAM,YAAY,MAAM,kBAAkB,aAAa;AACvD,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,aAAW,MAAM,eAAe;AAC5B,QAAI;AACA,YAAM,OAAO,UAAU,EAAE;AAEzB,UAAI,QAAQ,CAAC,QAAQ,SAAS,KAAK,UAAU;AACzC,gBAAQ,IAAI,iBAAO,EAAE,+CAA+C;AACpE;AACA;AAAA,MACJ;AAEA,cAAQ,IAAI,yBAAkB,EAAE,KAAK;AACrC,YAAM,kBAAkB,QAAQ,QAAQ,IAAI,SAAS;AAErD,UAAI,KAAM;AAAA,UACL;AAEL,cAAQ,IAAI,UAAK,EAAE,EAAE;AAAA,IACzB,SAAS,OAAO;AACZ,cAAQ,IAAI,UAAK,EAAE,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,EAAE;AAAA,IAC9E;AAAA,EACJ;AAEA,UAAQ,IAAI;AAAA,mBAAiB,KAAK,WAAW,OAAO,aAAa,OAAO,UAAU;AAClF,UAAQ,IAAI,uBAAgB,SAAS,EAAE;AAC3C;;;AKzHA,SAAS,WAAAC,gBAAe;AACxB,SAAS,eAAe;AASjB,SAAS,sBAA+B;AAC3C,SAAO,IAAIC,SAAQ,QAAQ,EACtB,YAAY,gDAAgD,EAC5D,OAAO,WAAW,iDAAiD,EACnE,OAAO,OAAO,YAAiC;AAC5C,UAAM,aAAa,OAAO;AAAA,EAC9B,CAAC;AACT;AAEA,eAAe,aAAa,SAA8B;AACtD,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AACxC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,YAAY,MAAM,kBAAkB,aAAa;AACvD,QAAM,YAAY,OAAO,KAAK,SAAS;AAEvC,MAAI,UAAU,WAAW,GAAG;AACxB,YAAQ,IAAI,8DAA8D;AAC1E;AAAA,EACJ;AAEA,UAAQ,IAAI,mCAA4B;AAGxC,MAAI;AACA,UAAM,YAAY,MAAM,kBAAkB,aAAa,QAAQ,SAAS;AACxE,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAqB,CAAC;AAE5B,eAAW,MAAM,WAAW;AACxB,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAE3B,UAAI,CAAC,QAAQ;AACT,gBAAQ,IAAI,iBAAO,EAAE,+CAA+C;AACpE;AAAA,MACJ;AAIA,UAAI,QAAQ,aAAa,OAAO,UAAU;AACtC,gBAAQ,KAAK,EAAE;AAAA,MACnB,OAAO;AACH,iBAAS,KAAK,EAAE;AAAA,MACpB;AAAA,IACJ;AAEA,QAAI,QAAQ,WAAW,GAAG;AACtB,cAAQ,IAAI,uCAAkC;AAC9C;AAAA,IACJ;AAEA,YAAQ,IAAI;AAAA,kBAAc,QAAQ,MAAM,WAAW;AACnD,eAAW,MAAM,SAAS;AACtB,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAC3B,cAAQ,IAAI,QAAQ,EAAE,MAAM,QAAQ,OAAO,YAAO,OAAO,OAAO,GAAG;AAAA,IACvE;AACA,YAAQ,IAAI;AAEZ,QAAI,CAAC,QAAQ,OAAO;AAChB,YAAM,eAAe,MAAM,QAAQ,EAAE,SAAS,eAAe,SAAS,KAAK,CAAC;AAC5E,UAAI,CAAC,aAAc;AAAA,IACvB;AAGA,UAAM,YAAY,QAAQ,IAAI,IAAI;AAClC,QAAI,eAAe;AACnB,UAAM,cAAwB,CAAC;AAE/B,eAAW,MAAM,SAAS;AACtB,UAAI;AAEA,gBAAQ,IAAI,sBAAe,EAAE,KAAK;AAClC,cAAM,aAAa,MAAM,kBAAkB,WAAW,IAAI,SAAS;AACnE,YAAI,YAAY;AACZ,sBAAY,KAAK,UAAU;AAE3B,gBAAM,cAAc,WAAW,MAAM,eAAe,EAAE,CAAC;AACvD,kBAAQ,IAAI,qBAAqB,WAAW,EAAE;AAAA,QAClD;AAGA,cAAM,kBAAkB,QAAQ,QAAQ,IAAI,SAAS;AACrD,gBAAQ,IAAI,gBAAW;AACvB;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,IAAI,2BAAsB,EAAE,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MACvG;AAAA,IACJ;AAEA,YAAQ,IAAI;AAAA,0BAAwB,YAAY,IAAI,QAAQ,MAAM,WAAW;AAE7E,QAAI,YAAY,SAAS,GAAG;AACxB,cAAQ,IAAI;AAAA,2CAAuC;AAGnD,YAAM,eAAe,MAAM,QAAQ,EAAE,SAAS,wBAAwB,SAAS,MAAM,CAAC;AACtF,UAAI,cAAc;AACd,cAAM,kBAAkB,aAAa,QAAQ,IAAI,CAAC;AAClD,gBAAQ,IAAI,mCAAuB;AAAA,MACvC,OAAO;AACH,gBAAQ,IAAI,kDAA2C;AAAA,MAC3D;AAAA,IACJ;AAEA,gBAAY,qBAAqB,EAAE,OAAO,aAAa,CAAC;AAAA,EAE5D,SAAS,OAAO;AACZ,UAAM,IAAI,MAAM,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACtG;AACJ;;;AC7HA,SAAS,WAAAC,gBAAe;AAejB,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIC,SAAQ,OAAO,EAC1B,YAAY,6BAA6B,EACzC,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAA0B;AACrC,UAAM,YAAY,OAAO;AAAA,EAC7B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,YAAY,SAAsC;AAC7D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,YAAY,MAAM,kBAAkB,aAAa;AACvD,QAAM,YAAY,OAAO,KAAK,SAAS;AAEvC,MAAI,UAAU,WAAW,GAAG;AACxB,YAAQ,IAAI,2DAA2D;AACvE;AAAA,EACJ;AAEA,UAAQ,IAAI,2BAA2B;AAEvC,MAAI;AACA,UAAM,YAAY,MAAM,kBAAkB,aAAa,QAAQ,SAAS;AACxE,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAqB,CAAC;AAE5B,eAAW,MAAM,WAAW;AACxB,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAE3B,UAAI,CAAC,QAAQ;AAET;AAAA,MACJ;AAEA,UAAI,QAAQ,aAAa,OAAO,UAAU;AACtC,gBAAQ,KAAK,EAAE;AAAA,MACnB,OAAO;AACH,iBAAS,KAAK,EAAE;AAAA,MACpB;AAAA,IACJ;AAGA,YAAQ,IAAI,8BAAuB;AAGnC,eAAW,MAAM,SAAS;AACtB,YAAM,UAAU,UAAU,EAAE;AAC5B,YAAM,SAAS,UAAU,EAAE;AAC3B,cAAQ,IAAI,MAAM,EAAE,KAAK,QAAQ,OAAO,YAAO,OAAO,OAAO,uBAAa;AAAA,IAC9E;AAIA,QAAI,QAAQ,WAAW,KAAK,SAAS,SAAS,GAAG;AAC7C,cAAQ,IAAI,iBAAY,SAAS,MAAM,yBAAyB;AAAA,IACpE,WAAW,SAAS,SAAS,GAAG;AAC5B,cAAQ,IAAI,aAAQ,SAAS,MAAM,yBAAyB;AAAA,IAChE;AAEA,YAAQ,IAAI;AACZ,QAAI,QAAQ,SAAS,GAAG;AACpB,cAAQ,IAAI,WAAW,QAAQ,MAAM,iCAAiC;AACtE,cAAQ,IAAI,8BAA8B;AAAA,IAC9C,OAAO;AACH,cAAQ,IAAI,0BAAqB;AAAA,IACrC;AAAA,EAEJ,SAAS,OAAO;AACZ,YAAQ,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,EAC3F;AACJ;;;AC3FA,SAAS,WAAAC,gBAAe;;;ACAxB,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,gBAAe;;;ACNxB,OAAOC,UAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,WAAU,UAAAC,eAAc;;;ACD5C,OAAOC,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAmB7B,IAAM,eAA4C,CAAC,EAAE,aAAa,SAAS,MAAM;AACpF,QAAM,CAAC,eAAe,gBAAgB,IAAIH,UAAS,CAAC;AAGpD,QAAM,YAA2B;AAAA,IAC7B;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,QAAQ,GAAG,MAAM,cAAc;AAAA,MAC9E,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,QAAQ;AAAA,IAC3D;AAAA,IACA;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,UAAU,GAAG,MAAM,cAAc;AAAA,MAChF,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,UAAU;AAAA,IAC7D;AAAA,IACA;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,aAAa,GAAG,MAAM,cAAc;AAAA,MACnF,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,aAAa;AAAA,IAChE;AAAA,IACA;AAAA,MACI,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,MAAM,GAAG,MAAM,cAAc;AAAA,MAC5E,WAAW,YAAY,KAAK,SAAO,IAAI,QAAQ,MAAM;AAAA,IACzD;AAAA,EACJ;AAEA,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACrB,QAAI,IAAI,SAAS;AACb,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD,WAAW,IAAI,WAAW;AACtB,uBAAiB,UAAQ,KAAK,IAAI,UAAU,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACrE,WAAW,IAAI,QAAQ;AACnB,YAAM,OAAO,UAAU,aAAa;AACpC,UAAI,QAAQ,KAAK,WAAW;AACxB,iBAAS,KAAK,GAAG;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAGrB,QAAM,gBAAgB,CAAC,SAA8B;AACjD,QAAI,CAAC,KAAK,WAAW;AACjB,aAAO;AAAA,IACX;AAEA,UAAM,MAAM,YAAY,KAAK,OAAK,EAAE,QAAQ,KAAK,GAAG;AACpD,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,QAAkB,CAAC;AACzB,QAAI,IAAI,MAAM,OAAO,MAAO,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,KAAK,QAAQ;AACxE,QAAI,IAAI,MAAM,OAAO,UAAW,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,SAAS,YAAY;AACpF,QAAI,IAAI,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,MAAM,SAAS;AAC3E,QAAI,IAAI,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,MAAM,SAAS;AAC3E,QAAI,IAAI,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,IAAI,MAAM,OAAO,OAAO,UAAU;AAE9E,WAAO,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,SAAS;AAAA,EAChD;AAEA,SACI,gBAAAJ,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA;AAAA,IAEd,gBAAAF,OAAA,cAACG,OAAA,MAAK,6CAAkB,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,cAAY,GAAO,GAAC;AAAA,IACpE,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,8FAEf;AAAA,EACJ,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,cAAc,KAAG,4CAAqB,GAEhD,UAAU,IAAI,CAAC,MAAM,UAAU;AAC5B,UAAM,aAAa,UAAU;AAC7B,UAAM,SAAS,CAAC,KAAK;AAErB,WACI,gBAAAH,OAAA,cAACE,MAAA,EAAI,KAAK,KAAK,KAAK,SAAS,KACzB,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAO,aAAa,SAAS,SAAS,SAAS,SAAS,UAAU,UACnE,aAAa,YAAO,MACpB,KAAK,MAAK,KAAE,KAAK,KACtB,GACC,KAAK,aACF,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,cAAc,IAAI,CAAE,GAE1C,CAAC,KAAK,aACH,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,2BAAmB,CAE1C;AAAA,EAER,CAAC,CACL,GAGC,YAAY,WAAW,KACpB,gBAAAH,OAAA,cAACE,MAAA,EAAI,WAAW,GAAG,aAAY,SAAQ,aAAY,UAAS,SAAS,KACjE,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAM,YAAS,wDAA8B,GACnD,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,mBAAS,GACxB,gBAAAH,OAAA,cAACG,OAAA,EAAK,OAAM,UAAO,YAAU,GAC7B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,uEAAoC,CACvD,CAER;AAER;;;AC3IA,OAAOE,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAmB7B,IAAM,kBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,kBAAkB,mBAAmB,IAAIH,UAAS,CAAC;AAG1D,QAAM,OAAyB,CAAC;AAEhC,MAAI,WAAW,MAAM,OAAO,OAAO;AAC/B,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,WAAW;AACnC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,QAAQ;AAChC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,QAAQ;AAChC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,SAAS;AACjC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AACA,MAAI,WAAW,MAAM,OAAO,SAAS;AACjC,SAAK,KAAK;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,WAAW,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,EACL;AAEA,EAAAG,UAAS,CAAC,OAAO,QAAQ;AAErB,QAAI,IAAI,OAAO,IAAI,YAAY;AAC3B,0BAAoB,UAAQ,KAAK,IAAI,KAAK,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACnE,WAAW,IAAI,WAAW;AACtB,0BAAoB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACrD;AAGA,UAAM,MAAM,SAAS,OAAO,EAAE;AAC9B,QAAI,CAAC,MAAM,GAAG,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ;AAC/C,0BAAoB,MAAM,CAAC;AAAA,IAC/B;AAGA,QAAI,IAAI,QAAQ;AACZ,YAAM,MAAM,KAAK,gBAAgB;AACjC,UAAI,KAAK;AACL,qBAAa,IAAI,IAAI;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAGrB,QAAM,aAAa,KAAK,gBAAgB;AAGxC,QAAM,eAAe,aACf,WAAW,MAAM,OAAO,UAAQ,KAAK,SAAS,WAAW,IAAI,IAC7D,CAAC;AAGP,QAAM,aAAa,CAAC,UAA0B;AAC1C,QAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,QAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChD;AAGA,QAAM,aAAa,CAAC,SAAuB;AACvC,WAAO,KAAK,mBAAmB,SAAS;AAAA,MACpC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACT,CAAC;AAAA,EACL;AAEA,SACI,gBAAAJ,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,WAAW,OAAO,MAAK,KAAE,WAAW,OAAO,IAAK,CAC7E,GAGA,gBAAAH,OAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA;AAAA,IAEd,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,QAAC,0BAAY;AAAA,IACvB,gBAAAH,OAAA,cAACE,MAAA,EAAI,WAAW,KACZ,gBAAAF,OAAA,cAACG,OAAA,MAAK,yBACO,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,WAAW,MAAM,YAAW,QAAM,CACxE,GACA,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,QAAG,GAClB,gBAAAH,OAAA,cAACG,OAAA,MAAK,uCACa,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,QAAE,WAAW,WAAW,MAAM,SAAS,CAAE,CACtE,GACC,WAAW,MAAM,gBACd,gBAAAH,OAAA,cAAAA,OAAA,gBACI,gBAAAA,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,QAAG,GAClB,gBAAAH,OAAA,cAACG,OAAA,MAAK,kCACW,gBAAAH,OAAA,cAACG,OAAA,EAAK,MAAI,QAAE,WAAW,WAAW,MAAM,YAAY,CAAE,CACvE,CACJ,CAER;AAAA,EACJ,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KAExE,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACd,KAAK,IAAI,CAAC,KAAK,UAAU;AACtB,UAAM,aAAa,UAAU;AAC7B,WACI,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,IAAI,MAAM,aAAa,KAC7B,gBAAAF,OAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,OAAO,aAAa,SAAS;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS;AAAA;AAAA,MAER;AAAA,MAAK,IAAI;AAAA,MAAK;AAAA,MAAE,IAAI;AAAA,MAAM;AAAA,MAAG,IAAI;AAAA,MAAM;AAAA,MAAE;AAAA,IAC9C,CACJ;AAAA,EAER,CAAC,CACL,GAGC,cAAc,aAAa,SAAS,KACjC,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,YACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,2DAAqC,GACpD,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,WAAW,KAClC,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,UAC1B,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,KAAK,IAAI,SAAS,KACxB,gBAAAF,OAAA,cAACG,OAAA,MAAK,WAAG,KAAK,IAAK,GAClB,KAAK,eACF,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,KAAK,WAAY,CAE5C,CACH,GACA,aAAa,SAAS,KACnB,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,cAAQ,aAAa,SAAS,GAAE,gBAAW,CAElE,CACJ,GAGH,cAAc,aAAa,WAAW,KACnC,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,sCAA0B,WAAW,KAAM,CAElE,CACJ;AAER;;;AC/MA,OAAOE,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAa7B,IAAM,WAAoC,CAAC,EAAE,OAAO,aAAa,UAAU,OAAO,MAAM;AAC3F,QAAM,CAAC,eAAe,gBAAgB,IAAIH,UAAS,CAAC;AAEpD,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACrB,QAAI,IAAI,SAAS;AACb,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD,WAAW,IAAI,WAAW;AACtB,uBAAiB,UAAQ,KAAK,IAAI,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACjE,WAAW,IAAI,QAAQ;AACnB,YAAM,OAAO,MAAM,aAAa;AAChC,UAAI,MAAM;AACN,iBAAS,IAAI;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAGrB,QAAM,eAAe,MAAc;AAC/B,YAAQ,aAAa;AAAA,MACjB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAGA,QAAM,aAAa,CAAC,UAA0B;AAC1C,QAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,QAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,MAAI,MAAM,WAAW,GAAG;AACpB,WACI,gBAAAJ,OAAA,cAACE,MAAA,EAAI,eAAc,YACf,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,aAAa,CAAE,CAC5C,GACA,gBAAAH,OAAA,cAACE,MAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,SAAS,KACjD,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,6BAAkB,CACrC,CACJ;AAAA,EAER;AAEA,SACI,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA,cAACE,MAAA,EAAI,cAAc,KACf,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,aAAa,CAAE,GACxC,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,MAAM,QAAO,QAAM,CAC1C,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACvE,MAAM,IAAI,CAAC,MAAM,UAAU;AACxB,UAAM,aAAa,UAAU;AAE7B,WACI,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,KAAK,IAAI,eAAc,UAAS,SAAS,KAC/C,gBAAAF,OAAA,cAACE,MAAA,MACG,gBAAAF,OAAA,cAACG,OAAA,EAAK,OAAO,aAAa,SAAS,WAC9B,aAAa,YAAO,MACpB,KAAK,IACV,GACA,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,MAAG,WAAW,KAAK,QAAQ,GAAE,GAAC,CACjD,GAEC,cACG,gBAAAH,OAAA,cAACE,MAAA,EAAI,YAAY,GAAG,eAAc,YAC7B,KAAK,eACF,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,cAAI,KAAK,WAAY,GAIvC,gBAAgB,WACb,gBAAAH,OAAA,cAAAA,OAAA,gBACK,KAAK,eACF,gBAAAA,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,sBAAe,GAEjC,KAAK,SAAS,KAAK,MAAM,SAAS,KAC/B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,qBAAW,KAAK,MAAM,KAAK,IAAI,CAAE,CAExD,GAIH,gBAAgB,YACb,gBAAAH,OAAA,cAACE,MAAA,MACI,KAAK,cAAc,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,qBAAY,GAC9C,KAAK,iBAAiB,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,wBAAe,GACpD,KAAK,aAAa,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,oBAAW,CACjD,GAIH,gBAAgB,YAAY,KAAK,SAC9B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,qBAAW,KAAK,KAAM,GAGzC,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,cAAI,KAAK,YAAa,CACzC,CAER;AAAA,EAER,CAAC,CACL,CACJ;AAER;;;ACtIA,OAAOE,UAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAY7B,IAAM,aAAwC,CAAC,EAAE,MAAM,gBAAgB,eAAe,OAAO,MAAM;AAEtG,QAAM,CAAC,gBAAgB,iBAAiB,IAAIH,UAAS,aAAa;AAClE,QAAM,kBAAkB;AACxB,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,aAAa,SAAS,eAAe;AAGxE,EAAAG,UAAS,CAAC,OAAO,QAAQ;AAErB,QAAI,IAAI,WAAW,UAAU,KAAK;AAC9B,wBAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACnD,WAAW,IAAI,aAAa,UAAU,KAAK;AACvC,wBAAkB,UAAQ,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,IAC3D,WAAW,IAAI,YAAY,UAAU,KAAK;AACtC,wBAAkB,UAAQ,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,IAC3D,WAAW,IAAI,UAAU,UAAU,KAAK;AACpC,wBAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACnD,WAAW,UAAU,KAAK;AACtB,wBAAkB,CAAC;AAAA,IACvB,WAAW,UAAU,KAAK;AACtB,wBAAkB,SAAS;AAAA,IAC/B,WAES,IAAI,UAAU,IAAI,WAAW;AAClC,aAAO;AAAA,IACX;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAErB,QAAM,aAAa,CAAC,UAA0B;AAC1C,QAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,QAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChD;AAGA,QAAM,aAAa,CAAC,SAAuB;AACvC,WAAO,KAAK,eAAe,SAAS;AAAA,MAChC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACZ,CAAC;AAAA,EACL;AAGA,QAAM,eAAe,KAAK,aAAa;AAAA,IACnC;AAAA,IACA,iBAAiB;AAAA,EACrB;AAEA,QAAM,eAAe,iBAAiB;AACtC,QAAM,eAAe,iBAAiB,kBAAkB,KAAK,aAAa;AAG1E,QAAM,mBAAmB,KAAK,aAAa,UAAU,kBAC/C,MACA,KAAK,MAAO,iBAAiB,YAAa,GAAG;AAEnD,SACI,gBAAAJ,OAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,KAAK,IAAK,GACnC,gBAAAH,OAAA,cAACE,MAAA,MACG,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAE,KAAK,cAAa,YAAI,WAAW,KAAK,QAAQ,CAAE,GAC/D,KAAK,eAAe,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,YAAI,KAAK,WAAY,CAC7D,GACA,gBAAAH,OAAA,cAACE,MAAA,MAEI,KAAK,SAAS,WAAW,KAAK,SAAS,KAAK,MAAM,SAAS,KACxD,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,WAAQ,KAAK,MAAM,KAAK,IAAI,CAAE,GAEhD,KAAK,SAAS,YAAY,KAAK,SAC5B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,WAAQ,KAAK,KAAM,GAErC,KAAK,SAAS,YACX,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QACT,KAAK,cAAc,sBACnB,KAAK,iBAAiB,mBACtB,KAAK,aAAa,kBACvB,CAER,CACJ,GAGA,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAF,OAAA,cAACE,MAAA,EAAI,gBAAe,mBAChB,gBAAAF,OAAA,cAACG,OAAA,EAAK,MAAI,QAAC,0BAAY,GACtB,KAAK,aAAa,SAAS,mBACxB,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,KACT,iBAAiB,GAAE,KAAE,KAAK,IAAI,iBAAiB,iBAAiB,KAAK,aAAa,MAAM,GAAE,KAAE,KAAK,WAAU,MAAG,kBAAiB,GACrI,CAER,GAEC,gBACG,gBAAAH,OAAA,cAACE,MAAA,EAAI,gBAAe,YAChB,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,0BAAQ,gBAAe,+CAAmB,CAC7D,GAGJ,gBAAAH,OAAA,cAACE,MAAA,EAAI,eAAc,UAAS,WAAW,KAClC,aAAa,IAAI,CAAC,MAAM,UAAU;AAC/B,UAAM,aAAa,iBAAiB,QAAQ;AAC5C,WACI,gBAAAF,OAAA,cAACE,MAAA,EAAI,KAAK,SACN,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAE,WAAW,SAAS,EAAE,SAAS,GAAG,GAAG,GAAE,SAAE,GACzD,gBAAAH,OAAA,cAACG,OAAA,MAAM,IAAK,CAChB;AAAA,EAER,CAAC,CACL,GAEC,gBACG,gBAAAH,OAAA,cAACE,MAAA,EAAI,gBAAe,UAAS,WAAW,KACpC,gBAAAF,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,0BACH,KAAK,YAAY,iBAAiB,aAAa,QAAO,sDAClE,CACJ,GAGH,KAAK,aAAa,WAAW,KAC1B,gBAAAH,OAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,8DAA6B,CAEpD,CACJ;AAER;;;AC9IA,SAAS,YAAYE,WAAU;AAC/B,OAAO,UAAU;AACjB,OAAO,YAAY;;;ACGZ,IAAM,cAAsC;AAAA,EAC/C,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,MAAM;AAAA;AAAA,MACd,WAAW,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,KAAK;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,KAAK;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACF,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA;AAAA,IACV,cAAc;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,MACZ,OAAO,CAAC,KAAK;AAAA,MACb,WAAW,CAAC,KAAK;AAAA,MACjB,QAAQ,CAAC,UAAU;AAAA;AAAA,MACnB,QAAQ,CAAC,KAAK;AAAA,MACd,SAAS,CAAC,KAAK;AAAA,MACf,SAAS,CAAC,KAAK;AAAA,IACnB;AAAA,IACA,mBAAmB;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACtB;AAAA,EACJ;AACJ;AAYO,SAAS,aAAoB;AAChC,SAAO,OAAO,KAAK,WAAW;AAClC;;;ADxFO,IAAM,wBAAN,MAA4B;AAAA,EACvB;AAAA,EAER,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAmC;AACrC,UAAM,OAAO,MAAM,KAAK,WAAW;AACnC,UAAM,cAA4B,CAAC;AAEnC,eAAW,OAAO,MAAM;AACpB,UAAI;AACA,cAAM,UAAU,MAAM,KAAK,QAAQ,GAAG;AACtC,YAAI,QAAQ,MAAM,SAAS,GAAG;AAC1B,sBAAY,KAAK,OAAO;AAAA,QAC5B;AAAA,MACJ,SAAS,OAAO;AAEZ,gBAAQ,MAAM,kBAAkB,GAAG,KAAK,KAAK;AAAA,MACjD;AAAA,IACJ;AAEA,UAAM,aAAa,YAAY,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,MAAM,QAAQ,CAAC;AAE7E,WAAO;AAAA,MACH,aAAa,KAAK;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,oBAAI,KAAK;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,KAA+B;AACzC,UAAM,SAAS,YAAY,GAAG;AAC9B,UAAM,QAAuB,CAAC;AAG9B,eAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AACpE,UAAI,CAAC,aAAc;AAEnB,YAAM,cAAc;AACpB,UAAI;AACA,cAAM,YAAY,MAAM,KAAK,SAAS,KAAK,WAAW;AACtD,cAAM,KAAK,GAAG,SAAS;AAAA,MAC3B,SAAS,OAAO;AAAA,MAEhB;AAAA,IACJ;AAEA,UAAM,QAAQ,KAAK,eAAe,KAAK;AAEvC,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,oBAAI,KAAK;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAU,MAA2C;AAChE,UAAM,SAAS,YAAY,GAAG;AAC9B,UAAM,eAAe,OAAO,aAAa,IAAI;AAC7C,QAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,QAAI;AAGJ,QAAI,QAAQ,QAAQ;AAChB,YAAM,WAAW,KAAK,KAAK,KAAK,aAAa,SAAS,YAAY;AAClE,YAAM,gBAAgB,KAAK,KAAK,KAAK,aAAa,2BAA2B,YAAY;AAGzF,UAAI,MAAM,KAAK,WAAW,QAAQ,GAAG;AACjC,kBAAU;AAAA,MACd,WAAW,MAAM,KAAK,WAAW,aAAa,GAAG;AAC7C,kBAAU;AAAA,MACd,OAAO;AACH,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ,OAAO;AACH,gBAAU,KAAK,KAAK,KAAK,aAAa,OAAO,UAAU,YAAY;AAGnE,UAAI;AACA,cAAMC,IAAG,OAAO,OAAO;AAAA,MAC3B,QAAQ;AACJ,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ;AAEA,UAAM,aAAa,OAAO,eAAe,IAAI,KAAK,CAAC;AACnD,UAAM,QAAuB,CAAC;AAG9B,QAAI,SAAS,UAAU;AACnB,YAAM,aAAa,MAAM,KAAK,WAAW,SAAS,GAAG;AACrD,YAAM,KAAK,GAAG,UAAU;AAAA,IAC5B,OAAO;AAEH,YAAM,QAAQ,MAAMA,IAAG,QAAQ,OAAO;AAEtC,iBAAW,QAAQ,OAAO;AACtB,cAAM,WAAW,KAAK,KAAK,SAAS,IAAI;AACxC,cAAM,OAAO,MAAMA,IAAG,KAAK,QAAQ;AAEnC,YAAI,CAAC,KAAK,OAAO,EAAG;AAGpB,cAAM,mBAAmB,WAAW,KAAK,SAAO,KAAK,SAAS,GAAG,CAAC;AAClE,YAAI,CAAC,iBAAkB;AAEvB,YAAI;AACA,gBAAM,OAAO,MAAM,KAAK,iBAAiB,UAAU,KAAK,IAAI;AAC5D,gBAAM,KAAK,IAAI;AAAA,QACnB,SAAS,OAAO;AACZ,kBAAQ,MAAM,mBAAmB,QAAQ,KAAK,KAAK;AAAA,QACvD;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,WAAmB,KAAkC;AAC1E,UAAM,QAAuB,CAAC;AAE9B,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAEnE,iBAAW,SAAS,SAAS;AACzB,YAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,cAAM,YAAY,KAAK,KAAK,WAAW,MAAM,IAAI;AACjD,cAAM,gBAAgB,KAAK,KAAK,WAAW,UAAU;AAGrD,YAAI;AACA,gBAAMA,IAAG,OAAO,aAAa;AAAA,QACjC,QAAQ;AACJ;AAAA,QACJ;AAGA,cAAM,OAAO,MAAM,KAAK,iBAAiB,eAAe,KAAK,QAAQ;AAGrE,aAAK,aAAa,MAAM,KAAK,WAAW,KAAK,KAAK,WAAW,SAAS,CAAC;AACvE,aAAK,gBAAgB,MAAM,KAAK,WAAW,KAAK,KAAK,WAAW,YAAY,CAAC;AAC7E,aAAK,YAAY,MAAM,KAAK,WAAW,KAAK,KAAK,WAAW,QAAQ,CAAC;AAErE,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,0BAA0B,KAAK;AAAA,IACjD;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACV,UACA,KACA,MACoB;AACpB,UAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AACnD,UAAM,OAAO,MAAMA,IAAG,KAAK,QAAQ;AAGnC,UAAM,EAAE,MAAM,aAAa,SAAS,YAAY,IAAI,OAAO,OAAO;AAGlE,UAAM,SAAS,YAAY,GAAG;AAC9B,UAAM,cAAc,YAAY,OAAO,kBAAkB,gBAAgB;AAGzE,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,kBAAkB,kBAAkB;AAC3C,YAAM,cAAc,YAAY,OAAO,kBAAkB,gBAAgB;AACzE,oBAAc,gBAAgB,QAAQ,gBAAgB,YAAY,gBAAgB;AAAA,IACtF;AAEA,UAAM,eAAe,YAAY,OAAO,kBAAkB,YAAY;AACtE,QAAI,OAAO,iBAAiB,UAAU;AAClC,cAAQ,CAAC,YAAY;AAAA,IACzB,WAAW,MAAM,QAAQ,YAAY,GAAG;AACpC,cAAQ;AAAA,IACZ;AAGA,UAAM,EAAE,cAAc,UAAU,IAAI,KAAK,eAAe,aAAa,EAAE;AAGvE,UAAM,eAAe,KAAK,SAAS,KAAK,aAAa,QAAQ;AAC7D,UAAM,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,SAAS,UAAU,KAAK,QAAQ,QAAQ,CAAC,CAAC;AAG5E,UAAM,OAAO,YAAY,QAAQ,KAAK,SAAS,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAE/E,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,YAAY;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,SAAiB,WAAmB,IAAmD;AAC1G,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,eAAe,MAAM,MAAM,GAAG,QAAQ;AAC5C,UAAM,YAAY,MAAM;AAExB,WAAO,EAAE,cAAc,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA6B;AAC/B,UAAM,OAAc,CAAC;AAErB,eAAW,OAAO,WAAW,GAAG;AAC5B,YAAM,SAAS,YAAY,GAAG;AAG9B,UAAI,QAAQ,QAAQ;AAChB,cAAM,WAAW,KAAK,KAAK,KAAK,aAAa,OAAO;AACpD,cAAM,gBAAgB,KAAK,KAAK,KAAK,aAAa,yBAAyB;AAE3E,YAAI,MAAM,KAAK,WAAW,QAAQ,KAAK,MAAM,KAAK,WAAW,aAAa,GAAG;AACzE,eAAK,KAAK,GAAG;AAAA,QACjB;AAAA,MACJ,OAAO;AACH,cAAM,UAAU,KAAK,KAAK,KAAK,aAAa,OAAO,QAAQ;AAC3D,YAAI,MAAM,KAAK,WAAW,OAAO,GAAG;AAChC,eAAK,KAAK,GAAG;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,UAAoC;AACzD,QAAI;AACA,YAAMA,IAAG,OAAO,QAAQ;AACxB,aAAO;AAAA,IACX,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAoC;AACvD,UAAM,SAA+C,CAAC;AAEtD,eAAW,QAAQ,OAAO;AACtB,aAAO,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA,IACnD;AAEA,UAAM,YAAY,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,UAAU,CAAC;AAEpE,UAAM,eAAe,MAAM,SAAS,IAC9B,MAAM;AAAA,MAAO,CAAC,QAAQ,SACpB,KAAK,aAAa,SAAS,KAAK,aAAa;AAAA,MAC7C,MAAM,CAAC,EAAG;AAAA,IACd,IACE;AAEN,WAAO;AAAA,MACH,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ;;;ALrTO,IAAM,aAAwC,CAAC,EAAE,YAAY,aAAa,OAAO,MAAM;AAC1F,QAAM,EAAE,KAAK,IAAIC,QAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAwB,MAAM;AAC1D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAqB,cAAc,IAAI;AAC7E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA6B,eAAe,IAAI;AACxF,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA6B,IAAI;AAEzE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuB,CAAC,CAAC;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AAGtD,EAAAC,WAAU,MAAM;AACZ,UAAM,UAAU,IAAI,sBAAsB;AAC1C,YAAQ,QAAQ,EAAE,KAAK,YAAU;AAC7B,qBAAe,OAAO,IAAI;AAC1B,iBAAW,KAAK;AAGhB,UAAI,YAAY;AACZ,kBAAU,UAAU;AAAA,MACxB;AAAA,IACJ,CAAC,EAAE,MAAM,WAAS;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAW,KAAK;AAAA,IACpB,CAAC;AAAA,EACL,GAAG,CAAC,UAAU,CAAC;AAGf,EAAAC,UAAS,CAAC,OAAO,QAAQ;AAErB,QAAI,UAAU,KAAK;AACf,aAAO;AACP;AAAA,IACJ;AAGA,QAAI,WAAW,aAAa,IAAI,UAAU,IAAI,YAAY;AACtD,iBAAW;AACX;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,QAAM,aAAa,MAAM;AACrB,QAAI,WAAW,UAAU;AACrB,gBAAU,MAAM;AAChB,sBAAgB,IAAI;AACpB,wBAAkB,CAAC;AAAA,IACvB,WAAW,WAAW,QAAQ;AAC1B,gBAAU,UAAU;AACpB,sBAAgB,IAAI;AAAA,IACxB,WAAW,WAAW,YAAY;AAC9B,gBAAU,MAAM;AAChB,qBAAe,IAAI;AAAA,IACvB,OAAO;AACH,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,kBAAkB,CAAC,QAAa;AAClC,mBAAe,GAAG;AAClB,cAAU,UAAU;AAAA,EACxB;AAEA,QAAM,mBAAmB,CAAC,SAAsB;AAC5C,oBAAgB,IAAI;AACpB,cAAU,MAAM;AAAA,EACpB;AAEA,QAAM,mBAAmB,CAAC,SAAsB;AAC5C,oBAAgB,IAAI;AACpB,cAAU,QAAQ;AAClB,sBAAkB,CAAC;AAAA,EACvB;AAGA,QAAM,oBAAoB,YAAY,KAAK,SAAO,IAAI,QAAQ,WAAW;AAGzE,QAAM,eAAe,mBAAmB,MAAM,OAAO,UAAQ,KAAK,SAAS,YAAY,KAAK,CAAC;AAG7F,QAAM,gBAAgB,MAAM;AACxB,QAAI,SAAS;AACT,aACI,gBAAAC,OAAA,cAACC,MAAA,EAAI,SAAS,KACV,gBAAAD,OAAA,cAACE,OAAA,MAAK,8BAAoB,CAC9B;AAAA,IAER;AAEA,YAAQ,QAAQ;AAAA,MACZ,KAAK;AACD,eAAO,gBAAAF,OAAA,cAAC,gBAAa,aAA0B,UAAU,iBAAiB;AAAA,MAC9E,KAAK;AACD,eAAO,oBACH,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACG,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,QAAQ;AAAA;AAAA,QACZ,IACA;AAAA,MACR,KAAK;AACD,eACI,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO;AAAA,YACP,aAAa;AAAA,YACb,UAAU;AAAA,YACV,QAAQ;AAAA;AAAA,QACZ;AAAA,MAER,KAAK;AACD,eAAO,eACH,gBAAAA,OAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAM;AAAA,YACN;AAAA,YACA,QAAQ;AAAA;AAAA,QACZ,IACA;AAAA,MACR;AACI,eAAO,gBAAAA,OAAA,cAAC,gBAAa,aAA0B,UAAU,iBAAiB;AAAA,IAClF;AAAA,EACJ;AAGA,QAAM,iBAAiB,MAAM;AACzB,YAAQ,QAAQ;AAAA,MACZ,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAEA,SACI,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KAEjC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACf,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,wBAAe,GACvC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,yCAAyB,CAC5C,GAGC,cAAc,GAGf,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,eAAe,CAAE,CACrC,CACJ;AAER;;;ADnKO,SAAS,0BAAmC;AAC/C,QAAM,MAAM,IAAIC,SAAQ,SAAS,EAC5B,YAAY,2DAA2D,EACvE,OAAO,kBAAkB,iEAAiE,EAC1F,OAAO,iBAAiB,wEAAwE,EAChG,OAAO,WAAW,2CAA2C,EAC7D,OAAO,OAAO,YAAiE;AAE5E,QAAI;AACJ,QAAI,QAAQ,QAAQ;AAChB,YAAM,YAAY,CAAC,UAAU,YAAY,eAAe,MAAM;AAC9D,UAAI,CAAC,UAAU,SAAS,QAAQ,MAAM,GAAG;AACrC,gBAAQ,MAAM,uBAAkB,QAAQ,MAAM,EAAE;AAChD,gBAAQ,MAAM,kBAAkB,UAAU,KAAK,IAAI,CAAC,EAAE;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,mBAAa,QAAQ;AAAA,IACzB;AAGA,QAAI;AACJ,QAAI,QAAQ,MAAM;AACd,YAAM,aAAa,CAAC,SAAS,aAAa,UAAU,UAAU,WAAW,SAAS;AAClF,UAAI,CAAC,WAAW,SAAS,QAAQ,IAAI,GAAG;AACpC,gBAAQ,MAAM,gCAA2B,QAAQ,IAAI,EAAE;AACvD,gBAAQ,MAAM,mBAAmB,WAAW,KAAK,IAAI,CAAC,EAAE;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,oBAAc,QAAQ;AAAA,IAC1B;AAGA,QAAI,QAAQ,OAAO;AACf,YAAM,WAAW;AACjB;AAAA,IACJ;AAGA,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,QAAM,cAAc,YAAY;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;AAKA,eAAe,aAA4B;AACvC,QAAM,UAAU,IAAI,sBAAsB;AAE1C,UAAQ,IAAI,iCAA0B;AAEtC,MAAI;AACA,UAAM,UAAU,MAAM,QAAQ,QAAQ;AAEtC,QAAI,QAAQ,KAAK,WAAW,GAAG;AAC3B,cAAQ,IAAI,gCAAsB;AAClC,cAAQ,IAAI,wDAAwD;AACpE;AAAA,IACJ;AAEA,YAAQ,IAAI,gCAAyB;AACrC,YAAQ,IAAI,sBAAe,QAAQ,WAAW,EAAE;AAChD,YAAQ,IAAI,wBAAiB,QAAQ,SAAS,eAAe,OAAO,CAAC;AAAA,CAAI;AAEzE,eAAW,cAAc,QAAQ,MAAM;AACnC,cAAQ,IAAI,GAAG,WAAW,OAAO,IAAI,IAAI,WAAW,OAAO,IAAI,EAAE;AACjE,cAAQ,IAAI,YAAY,WAAW,OAAO,QAAQ,EAAE;AACpD,cAAQ,IAAI,aAAa,WAAW,MAAM,UAAU,EAAE;AAEtD,YAAM,QAAkB,CAAC;AACzB,UAAI,WAAW,MAAM,OAAO,MAAO,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,KAAK,QAAQ;AACtF,UAAI,WAAW,MAAM,OAAO,UAAW,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,SAAS,YAAY;AAClG,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAC5F,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAE5F,UAAI,MAAM,SAAS,GAAG;AAClB,gBAAQ,IAAI,iBAAiB,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACnD;AAEA,cAAQ,IAAI,EAAE;AAAA,IAClB;AAEA,YAAQ,IAAI,iBAAY,QAAQ,UAAU;AAAA,CAAU;AAAA,EACxD,SAAS,OAAO;AACZ,YAAQ,MAAM,kCAA6B,KAAK;AAChD,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;;;AQ3GA,SAAS,WAAAC,gBAAe;AACxB,SAAS,UAAU,WAAAC,UAAS,cAAc;AAC1C,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,kBAAkB;AAS3B,IAAM,qBAAoD;AAAA,EACtD,WAAW;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,4BAA4B;AAAA,MAC5B,8BAA8B;AAAA,MAC9B,+BAA+B;AAAA,MAC/B,kDAAkD;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,MAEN,6DAA6D;AAAA,MAC7D,8CAA8C;AAAA,MAC9C,yCAAyC;AAAA,MACzC,8BAA8B;AAAA;AAAA,MAE9B,gDAAgD;AAAA;AAAA,MAEhD,iBAAiB;AAAA;AAAA,MAEjB,mBAAmB;AAAA;AAAA,MAEnB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,wBAAwB;AAAA;AAAA,MAExB,8BAA8B;AAAA,IAClC;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACD,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,eAAe;AAAA,MACf,+BAA+B;AAAA,MAC/B,2BAA2B;AAAA,MAC3B,YAAY;AAAA,MACZ,uBAAuB;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,wBAAwB;AAAA,QACpB,sBAAsB;AAAA,QACtB,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,mBAAmB;AAAA;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,kBAAkB;AAAA,QACd,mBAAmB;AAAA,QACnB,uBAAuB;AAAA,QACvB,oBAAoB;AAAA,QACpB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,MACjB;AAAA,MACA,yBAAyB;AAAA,IAC7B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,yBAAyB;AAAA,MACzB,+BAA+B;AAAA,MAC/B,eAAe;AAAA,MACf,oCAAoC;AAAA,IACxC;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,0BAA0B;AAAA,MAC1B,2BAA2B;AAAA,MAC3B,kCAAkC;AAAA,MAClC,8BAA8B;AAAA,MAC9B,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAC1B,iCAAiC;AAAA,MACjC,oCAAoC;AAAA,MACpC,2BAA2B;AAAA,QACvB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,MACA,gCAAgC;AAAA,MAChC,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,iCAAiC;AAAA,MACjC,+BAA+B;AAAA,MAC/B,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA;AAAA,MAC7B,2BAA2B;AAAA,IAC/B;AAAA,EACJ;AACJ;AAMO,SAAS,wBAAiC;AAC7C,QAAM,eAAe,IAAIH,SAAQ,OAAO,EACnC,YAAY,0CAA0C;AAG3D,eAAa,OAAO,YAAY;AAC5B,UAAM,gBAAgB;AAAA,EAC1B,CAAC;AAGD,eACK,QAAQ,QAAQ,EAChB,YAAY,qCAAqC,EACjD,SAAS,eAAe,8DAA8D,EACtF,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAM,oBAAoB,QAAQ;AAAA,IACtC,OAAO;AACH,YAAM,YAAY,QAAQ,QAAQ;AAAA,IACtC;AAAA,EACJ,CAAC;AAGL,eACK,QAAQ,SAAS,EACjB,YAAY,2DAA2D,EACvE,SAAS,eAAe,wBAAwB,EAChD,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAM,oBAAoB,SAAS;AAAA,IACvC,OAAO;AACH,YAAM,YAAY,QAAQ,SAAS;AAAA,IACvC;AAAA,EACJ,CAAC;AAGL,eACK,QAAQ,iBAAiB,EACzB,YAAY,kDAAkD,EAC9D,OAAO,YAAY;AAChB,UAAM,YAAY,OAAO,KAAK,kBAAkB;AAChD,UAAM,YAAY,WAAW,QAAQ;AAAA,EACzC,CAAC;AAGL,eACK,QAAQ,OAAO,EACf,YAAY,sDAAsD,EAClE,SAAS,eAAe,0CAA0C,EAClE,OAAO,OAAO,WAAqB;AAChC,UAAM,cAAc,MAAM;AAAA,EAC9B,CAAC;AAGL,eACK,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,MAAM;AACV,YAAQ,IAAI,6CAAsC;AAClD,WAAO,QAAQ,kBAAkB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,IAAI,EAAE;AACjD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,WAAW,EAAE;AACxD,cAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,kBAAkB;AAC7B,UAAQ,IAAI,mCAA4B;AACxC,UAAQ,IAAI,4UAAyD;AACrE,UAAQ,IAAI,0EAAyD;AACrE,UAAQ,IAAI,kFAAyD;AACrE,UAAQ,IAAI,wEAAyD;AACrE,UAAQ,IAAI,wEAAyD;AACrE,UAAQ,IAAI,wEAAyD;AACrE,UAAQ,IAAI,8UAA2D;AAEvE,QAAM,SAAS,MAAM,OAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACL,EAAE,MAAM,qCAAgC,OAAO,SAAS;AAAA,MACxD,EAAE,MAAM,sCAAiC,OAAO,UAAU;AAAA,MAC1D,EAAE,MAAM,0CAAmC,OAAO,MAAM;AAAA,MACxD,EAAE,MAAM,+BAAwB,OAAO,QAAQ;AAAA,IACnD;AAAA,EACJ,CAAC;AAED,MAAI,WAAW,OAAO;AAClB,UAAM,YAAY,OAAO,KAAK,kBAAkB;AAChD,UAAM,YAAY,WAAW,QAAQ;AAAA,EACzC,WAAW,WAAW,SAAS;AAC3B,UAAM,cAAc,CAAC,CAAC;AAAA,EAC1B,OAAO;AACH,UAAM,oBAAoB,MAA8B;AAAA,EAC5D;AACJ;AAEA,eAAe,oBAAoB,QAA8B;AAC7D,QAAM,UAAU,OAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IACtE,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM,WAAW;AAAA,IAC1C,OAAO;AAAA,EACX,EAAE;AAEF,MAAI;AACA,UAAM,iBAAiB,MAAM,SAAS;AAAA,MAClC,SAAS,oBAAoB,MAAM;AAAA,MACnC;AAAA,IACJ,CAAC;AAED,QAAI,eAAe,WAAW,GAAG;AAC7B,cAAQ,IAAI,qCAA2B;AACvC,cAAQ,IAAI,iFAA0E;AACtF;AAAA,IACJ;AAEA,UAAM,YAAY,gBAAgB,MAAM;AAAA,EAC5C,QAAQ;AACJ,YAAQ,IAAI,+BAA0B;AAAA,EAC1C;AACJ;AAEA,eAAe,YAAY,WAAqB,QAA8B;AAC1E,QAAM,YAAYG,MAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,MAAK,KAAK,WAAW,eAAe;AAGzD,QAAM,gBAAgB,UAAU,OAAO,SAAO,CAAC,mBAAmB,GAAG,CAAC;AACtE,MAAI,cAAc,SAAS,GAAG;AAC1B,YAAQ,IAAI;AAAA,yBAAuB,cAAc,KAAK,IAAI,CAAC,EAAE;AAC7D,YAAQ,IAAI,iEAA0D;AACtE;AAAA,EACJ;AAGA,MAAI,CAAC,WAAW,SAAS,GAAG;AACxB,UAAMD,IAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAQ,IAAI,sCAA+B;AAAA,EAC/C;AAGA,MAAI,kBAA2C,CAAC;AAChD,MAAI,WAAW,YAAY,GAAG;AAC1B,QAAI;AACA,YAAM,UAAU,MAAMA,IAAG,SAAS,cAAc,OAAO;AACvD,wBAAkB,KAAK,MAAM,OAAO;AACpC,cAAQ,IAAI,oDAA6C;AAAA,IAC7D,QAAQ;AACJ,cAAQ,KAAK,iEAAuD;AACpE,YAAM,mBAAmB,MAAMD,SAAQ;AAAA,QACnC,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,kBAAkB;AACnB,gBAAQ,IAAI,6BAAwB;AACpC;AAAA,MACJ;AACA,wBAAkB,CAAC;AAAA,IACvB;AAAA,EACJ;AAGA,QAAM,cAAc,EAAE,GAAG,gBAAgB;AAEzC,UAAQ,IAAI;AAAA,YAAQ,WAAW,WAAW,aAAa,WAAW;AAAA,CAAY;AAE9E,aAAW,OAAO,WAAW;AACzB,UAAM,QAAQ,mBAAmB,GAAG;AACpC,YAAQ,IAAI,MAAM,WAAW,WAAW,WAAM,QAAG,IAAI,MAAM,IAAI,EAAE;AAEjE,QAAI,WAAW,UAAU;AAErB,iBAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACrE,YAAI,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,CAAC,MAAM,QAAQ,YAAY,KACxF,OAAO,YAAY,UAAU,MAAM,YAAY,YAAY,UAAU,MAAM,MAAM;AACjF,sBAAY,UAAU,IAAI;AAAA,YACtB,GAAI,YAAY,UAAU;AAAA,YAC1B,GAAG;AAAA,UACP;AAAA,QACJ,OAAO;AACH,sBAAY,UAAU,IAAI;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,OAAO;AAEH,iBAAW,cAAc,OAAO,KAAK,MAAM,QAAQ,GAAG;AAClD,eAAO,YAAY,UAAU;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AAGA,QAAMC,IAAG,UAAU,cAAc,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AACrE,UAAQ,IAAI;AAAA,kCAAgC,YAAY,EAAE;AAC1D,UAAQ,IAAI,mDAA4C;AAC5D;AAEA,eAAe,cAAc,WAAqB;AAC9C,QAAM,YAAYC,MAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,MAAK,KAAK,WAAW,eAAe;AAEzD,MAAI,CAAC,WAAW,YAAY,GAAG;AAC3B,YAAQ,IAAI,6CAAmC;AAC/C;AAAA,EACJ;AAEA,QAAM,eAAe,MAAMF,SAAQ;AAAA,IAC/B,SAAS,UAAU,WAAW,IACxB,wDACA,iBAAiB,UAAU,KAAK,IAAI,CAAC;AAAA,IAC3C,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,cAAc;AACf,YAAQ,IAAI,6BAAwB;AACpC;AAAA,EACJ;AAEA,MAAI,UAAU,WAAW,GAAG;AAExB,UAAMC,IAAG,OAAO,YAAY;AAC5B,YAAQ,IAAI,qCAAgC;AAAA,EAChD,OAAO;AAEH,UAAM,YAAY,WAAW,SAAS;AAAA,EAC1C;AAEA,UAAQ,IAAI,mDAA4C;AAC5D;;;AC/XA,SAAS,WAAAE,gBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,gBAAe;;;ACFlC,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AACjB,OAAOC,aAAY;;;ACAZ,IAAM,wBAAgE;AAAA,EACzE,QAAQ;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAC/C,YAAM,QAAQ,CAAC,KAAK;AACpB,UAAI,KAAK,aAAa;AAClB,cAAM,KAAK,gBAAgB,KAAK,WAAW,EAAE;AAAA,MACjD;AACA,UAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACrC,cAAM,KAAK,UAAU,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAChD;AACA,YAAM,KAAK,gBAAgB,KAAK,WAAW,EAAE;AAC7C,YAAM,KAAK,KAAK;AAChB,aAAO,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAC/C,YAAM,UAAU,KAAK,cAAc,WAAW;AAC9C,aAAO;AAAA,WAAiB,OAAO;AAAA;AAAA,IACnC;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAC/C,YAAM,UAAU,KAAK,cAAc,WAAW;AAC9C,aAAO;AAAA,WAAiB,OAAO;AAAA;AAAA,IACnC;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAC/C,UAAI,KAAK,aAAa;AAClB,eAAO;AAAA,eAAqB,KAAK,WAAW;AAAA;AAAA,MAChD;AACA,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,qBAAqB,CAAC,SAA6B;AAC/C,YAAM,UAAU,KAAK,cAAc,WAAW;AAC9C,aAAO;AAAA,WAAiB,OAAO;AAAA;AAAA,IACnC;AAAA,EACJ;AACJ;AAEO,SAAS,mBAAiC;AAC7C,SAAO,OAAO,KAAK,qBAAqB;AAC5C;;;AD1EO,IAAM,oBAAN,MAAwB;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YAAY,cAAsB,QAAQ,IAAI,GAAG;AAC7C,SAAK,cAAc;AACnB,SAAK,WAAWC,MAAK,KAAK,aAAa,OAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAwC;AAC1C,UAAM,QAAQ,MAAM,KAAK,gBAAgB,OAAO;AAChD,UAAM,YAAY,MAAM,KAAK,gBAAgB,WAAW;AACxD,UAAM,WAAgC,CAAC;AAEvC,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,MAAM,SAAS,UAAU,SAAS,SAAS;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,MAAwD;AAClF,UAAM,QAA6B,CAAC;AACpC,UAAM,UAAUA,MAAK,KAAK,KAAK,UAAU,IAAI;AAE7C,QAAI;AACA,YAAMC,IAAG,OAAO,OAAO;AAAA,IAC3B,QAAQ;AACJ,aAAO;AAAA,IACX;AAEA,UAAM,QAAQ,MAAMA,IAAG,QAAQ,OAAO;AAEtC,eAAW,QAAQ,OAAO;AACtB,UAAI,CAAC,KAAK,SAAS,KAAK,EAAG;AAE3B,YAAM,WAAWD,MAAK,KAAK,SAAS,IAAI;AACxC,YAAM,OAAO,MAAMC,IAAG,KAAK,QAAQ;AACnC,UAAI,CAAC,KAAK,OAAO,EAAG;AAEpB,YAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AACnD,YAAM,EAAE,MAAM,YAAY,IAAIC,QAAO,OAAO;AAE5C,YAAM,KAAK;AAAA,QACP;AAAA,QACA,MAAMF,MAAK,SAAS,MAAM,KAAK;AAAA,QAC/B;AAAA,QACA,cAAcA,MAAK,SAAS,KAAK,aAAa,QAAQ;AAAA,QACtD,aAAa,YAAY;AAAA,QACzB,OAAO,KAAK,aAAa,WAAW;AAAA,QACpC,aAAa,KAAK,mBAAmB,WAAW;AAAA,MACpD,CAAC;AAAA,IACL;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,oBACI,KACA,YACM;AACN,UAAM,SAAS,sBAAsB,GAAG;AACxC,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,gBAAgB,GAAG,EAAE;AAGlD,UAAM,cAAc,OAAO,oBAAoB;AAAA,MAC3C,aAAa,WAAW;AAAA,MACxB,OAAO,WAAW;AAAA,MAClB,aAAa,WAAW;AAAA,MACxB,YAAY,WAAW;AAAA,IAC3B,CAAC;AAGD,UAAM,YAAY,IAAI,WAAW,YAAY;AAG7C,QAAI,aAAa;AACb,aAAO,GAAG,WAAW;AAAA;AAAA,EAAO,SAAS;AAAA;AAAA,IACzC;AACA,WAAO,GAAG,SAAS;AAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACF,MACA,cACA,SACA,YAC0B;AAC1B,UAAM,UAA6B,CAAC;AAEpC,eAAW,OAAO,MAAM;AACpB,YAAM,SAAS,sBAAsB,GAAG;AACxC,UAAI,CAAC,OAAQ;AAGb,iBAAW,QAAQ,cAAc;AAC7B,cAAM,QAAQ,SAAS,UAAU,QAAQ,QAC3B,SAAS,cAAc,QAAQ,YAC/B,QAAQ;AAEtB,mBAAW,QAAQ,OAAO;AACtB,gBAAM,SAAS,MAAM,KAAK,YAAY,KAAK,QAAQ,IAAI;AACvD,kBAAQ,KAAK,MAAM;AACnB,uBAAa,MAAM;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YACV,KACA,QACA,MACwB;AACxB,QAAI;AAEA,YAAM,aAAa,KAAK,cAAc,QAAQ,IAAI;AAElD,UAAI,CAAC,YAAY;AACb,eAAO;AAAA,UACH,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO,OAAO,OAAO,EAAE,qBAAqB,KAAK,IAAI;AAAA,QACzD;AAAA,MACJ;AAGA,YAAM,YAAYA,MAAK,QAAQ,UAAU;AACzC,YAAMC,IAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG7C,UAAI,SAAgC;AACpC,UAAI;AACA,cAAMA,IAAG,OAAO,UAAU;AAC1B,iBAAS;AAAA,MACb,QAAQ;AAAA,MAER;AAGA,YAAM,cAAc,KAAK,oBAAoB,KAAK,IAAI;AAGtD,YAAMA,IAAG,UAAU,YAAY,aAAa,OAAO;AAEnD,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,QAA4B,MAAwC;AACtF,QAAI,cAA6B;AAEjC,YAAQ,KAAK,MAAM;AAAA,MACf,KAAK;AACD,sBAAc,OAAO;AACrB;AAAA,MACJ,KAAK;AACD,sBAAc,OAAO;AACrB;AAAA,MACJ,KAAK;AACD,sBAAc,OAAO;AACrB;AAAA,IACR;AAEA,QAAI,CAAC,aAAa;AACd,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,GAAG,KAAK,IAAI,GAAG,OAAO,aAAa;AACpD,WAAOD,MAAK,KAAK,KAAK,aAAa,OAAO,UAAU,aAAa,QAAQ;AAAA,EAC7E;AAAA;AAAA,EAGQ,aAAa,aAA4D;AAC7E,UAAM,QAAQ,YAAY;AAC1B,QAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAK;AAC5C,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,WAAO;AAAA,EACX;AAAA,EAEQ,mBAAmB,aAA+C;AACtE,WAAO,YAAY,gBAAgB,QAC5B,YAAY,YAAY,YACxB,YAAY,YAAY;AAAA,EACnC;AACJ;;;AD/NO,SAAS,uBAAgC;AAC5C,QAAM,MAAM,IAAIG,SAAQ,MAAM,EACzB,YAAY,6EAA6E,EACzF,OAAO,mBAAmB,mEAAmE,EAC7F,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,aAAa,uCAAuC,EAC3D,OAAO,OAAO,YAIT;AACF,UAAM,QAAQ,OAAO;AAAA,EACzB,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,QAAQ,SAIpB;AACC,QAAM,UAAU,IAAI,kBAAkB;AAEtC,UAAQ,IAAI,kDAA2C;AAGvD,UAAQ,IAAI,wCAAiC;AAC7C,QAAM,UAAU,MAAM,QAAQ,gBAAgB;AAE9C,MAAI,QAAQ,eAAe,GAAG;AAC1B,YAAQ,IAAI,4CAAkC;AAC9C,YAAQ,IAAI,wEAAiE;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,UAAQ,IAAI,aAAa,QAAQ,MAAM,MAAM,WAAW,QAAQ,UAAU,MAAM;AAAA,CAAc;AAG9F,MAAI;AACJ,MAAI,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAG;AACvC,mBAAe,QAAQ;AAAA,EAC3B,OAAO;AACH,UAAM,aAAa,iBAAiB,EAAE,IAAI,SAAO;AAC7C,YAAM,SAAS,sBAAsB,GAAG;AACxC,aAAO;AAAA,QACH,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAAA,QACnC,OAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAED,mBAAe,MAAMC,UAAS;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,QAAI,aAAa,WAAW,GAAG;AAC3B,cAAQ,IAAI,kCAAwB;AACpC,cAAQ,IAAI,uCAAgC;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,MAAI;AACJ,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACzC,oBAAgB,QAAQ;AAAA,EAC5B,OAAO;AACH,UAAM,cAAc;AAAA,MAChB,EAAE,MAAM,UAAU,QAAQ,MAAM,MAAM,WAAW,OAAO,QAA8B;AAAA,MACtF,EAAE,MAAM,cAAc,QAAQ,UAAU,MAAM,WAAW,OAAO,YAAkC;AAAA,MAClG,EAAE,MAAM,aAAa,QAAQ,SAAS,MAAM,WAAW,OAAO,WAAiC;AAAA,IACnG;AAEA,oBAAgB,MAAMA,UAAS;AAAA,MAC3B,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,QAAI,cAAc,WAAW,GAAG;AAC5B,cAAQ,IAAI,2CAAiC;AAC7C,cAAQ,IAAI,gDAAyC;AACrD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,QAAM,aAAa,cAAc,OAAO,CAAC,KAAK,SAAS;AACnD,WAAO,OAAO,SAAS,UAAU,QAAQ,MAAM,SAC3C,SAAS,cAAc,QAAQ,UAAU,SACrC,QAAQ,SAAS;AAAA,EAC7B,GAAG,CAAC;AACJ,QAAM,aAAa,aAAa,aAAa;AAG7C,UAAQ,IAAI,wBAAiB;AAC7B,UAAQ,IAAI,YAAY,aAAa,IAAI,SAAO,sBAAsB,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAC7F,UAAQ,IAAI,qBAAqB,cAAc,KAAK,IAAI,CAAC,EAAE;AAC3D,UAAQ,IAAI,0BAA0B,UAAU;AAAA,CAAe;AAE/D,MAAI,QAAQ,QAAQ;AAChB,YAAQ,IAAI,gDAAyC;AAAA,EACzD;AAGA,QAAM,YAAY,MAAMC,SAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,WAAW;AACZ,YAAQ,IAAI,4BAAuB;AACnC,YAAQ,KAAK,CAAC;AAAA,EAClB;AAGA,UAAQ,IAAI,0BAAmB;AAC/B,MAAI,YAAY;AAEhB,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,WAAW;AACR;AACA,YAAM,OAAO,OAAO,WAAW,YAAY,WACvC,OAAO,WAAW,YAAY,WAC1B,OAAO,WAAW,UAAU,WAAM;AAE1C,YAAM,aAAa,KAAK,MAAO,YAAY,aAAc,GAAG;AAC5D,cAAQ,IAAI,MAAM,IAAI,KAAK,UAAU,MAAM,OAAO,UAAU,EAAE;AAE9D,UAAI,OAAO,WAAW,WAAW,OAAO,OAAO;AAC3C,gBAAQ,IAAI,gBAAgB,OAAO,KAAK,EAAE;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,SAAS,QAAQ,OAAO,OAAK,EAAE,WAAW,OAAO,EAAE;AAEzD,UAAQ,IAAI,2BAAsB;AAClC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,MAAI,UAAU,EAAG,SAAQ,IAAI,eAAe,OAAO,EAAE;AACrD,MAAI,SAAS,EAAG,SAAQ,IAAI,cAAc,MAAM,EAAE;AAClD,UAAQ,IAAI,EAAE;AAClB;;;AVpJO,SAAS,mBAA4B;AACxC,QAAM,aAAa,IAAIC,SAAQ,KAAK,EAC/B,YAAY,4CAA4C;AAG7D,aAAW,WAAW,wBAAwB,CAAC;AAC/C,aAAW,WAAW,sBAAsB,CAAC;AAC7C,aAAW,WAAW,qBAAqB,CAAC;AAG5C,aAAW,OAAO,MAAM;AACpB,eAAW,KAAK;AAAA,EACpB,CAAC;AAED,SAAO;AACX;;;AazBA,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,iBAAe;;;ACRxB,OAAOC,WAAS,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,WAAU,UAAAC,eAAc;;;ACD5C,OAAOC,WAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAepC,IAAM,aAAyB;AAAA,EAC3B;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,EACX;AACJ;AAKO,IAAM,WAAoC,CAAC,EAAE,SAAS,MAAM;AAC/D,QAAM,CAAC,eAAe,gBAAgB,IAAIH,UAAS,CAAC;AAEpD,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACrB,QAAI,IAAI,SAAS;AACb,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAClD,WAAW,IAAI,WAAW;AACtB,uBAAiB,UAAQ,KAAK,IAAI,WAAW,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IACtE,WAAW,IAAI,QAAQ;AACnB,YAAM,OAAO,WAAW,aAAa;AACrC,UAAI,MAAM;AACN,iBAAS,KAAK,EAAE;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,SACI,gBAAAJ,QAAA,cAACE,MAAA,EAAI,eAAc,YAEf,gBAAAF,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA;AAAA,IAEd,gBAAAF,QAAA,cAACG,OAAA,MAAK,6CAAkB,gBAAAH,QAAA,cAACG,OAAA,EAAK,MAAI,MAAC,OAAM,aAAU,YAAU,GAAO,GAAC;AAAA,IACrE,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,2GAEf;AAAA,IACA,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,+GAEf;AAAA,EACJ,GAGA,gBAAAH,QAAA,cAACE,MAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAF,QAAA,cAACG,OAAA,EAAK,MAAI,MAAC,cAAc,KAAG,gEAAwB,GAEnD,WAAW,IAAI,CAAC,MAAM,UAAU;AAC7B,UAAM,aAAa,UAAU;AAC7B,WACI,gBAAAH,QAAA,cAACE,MAAA,EAAI,KAAK,KAAK,IAAI,SAAS,KACxB,gBAAAF,QAAA,cAACG,OAAA,EAAK,OAAO,aAAa,SAAS,WAC9B,aAAa,YAAO,MACpB,KAAK,MAAK,KAAE,KAAK,KACtB,GACC,KAAK,SACF,gBAAAH,QAAA,cAACG,OAAA,EAAK,OAAM,UAAS,UAAQ,QAAC,MAAG,KAAK,OAAM,GAAC,GAEhD,cACG,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,OAAI,KAAK,WAAY,CAE5C;AAAA,EAER,CAAC,CACL,GAGA,gBAAAH,QAAA,cAACE,MAAA,EAAI,WAAW,KACZ,gBAAAF,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,yBAAa,GAC5B,gBAAAH,QAAA,cAACG,OAAA,EAAK,OAAM,UAAO,0BAAwB,GAC3C,gBAAAH,QAAA,cAACG,OAAA,EAAK,UAAQ,QAAC,0EAA2B,CAC9C,CACJ;AAER;;;AC7HA,OAAOE,aAAW;;;ACAlB,OAAOC,aAAW;AAClB,SAAS,OAAAC,MAAK,QAAAC,cAAY;AAiBnB,IAAM,cAA0C,CAAC,EAAE,SAAS,eAAe,MAAM;AAEpF,QAAM,gBAAgB,MAAM;AACxB,UAAM,QAA2B,CAAC;AAElC,YAAQ,QAAQ,CAAC,MAAM,QAAQ;AAC3B,cAAQ,KAAK,MAAM;AAAA,QACf,KAAK;AACD,gBAAM;AAAA,YACF,gBAAAF,QAAA,cAACC,MAAA,EAAI,KAAK,UAAU,GAAG,IAAI,cAAc,KACrC,gBAAAD,QAAA;AAAA,cAACC;AAAA,cAAA;AAAA,gBACG,aAAY;AAAA,gBACZ,aAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,UAAU;AAAA;AAAA,cAEV,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,aAAW,KAAK,IAAK;AAAA,YAC1C,CACJ;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,gBAAM;AAAA,YACF,gBAAAF,QAAA,cAACC,MAAA,EAAI,KAAK,WAAW,GAAG,IAAI,eAAc,UAAS,cAAc,KAC7D,gBAAAD,QAAA;AAAA,cAACC;AAAA,cAAA;AAAA,gBACG,aAAY;AAAA,gBACZ,aAAY;AAAA,gBACZ,UAAU;AAAA;AAAA,cAEV,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAQ,KAAK,KAAM;AAAA,YACxC,GACA,gBAAAF,QAAA,cAACC,MAAA,EAAI,YAAY,GAAG,WAAW,KAC3B,gBAAAD,QAAA,cAACE,QAAA,MAAM,KAAK,OAAQ,CACxB,CACJ;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,gBAAM;AAAA,YACF,gBAAAF,QAAA;AAAA,cAACC;AAAA,cAAA;AAAA,gBACG,KAAK,OAAO,GAAG;AAAA,gBACf,aAAY;AAAA,gBACZ,aAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,WAAW;AAAA;AAAA,cAEX,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,mBAAS,KAAK,IAAK;AAAA,YAC3C;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,gBAAM;AAAA,YACF,gBAAAF,QAAA;AAAA,cAACC;AAAA,cAAA;AAAA,gBACG,KAAK,WAAW,GAAG;AAAA,gBACnB,aAAY;AAAA,gBACZ,aAAY;AAAA,gBACZ,SAAS;AAAA,gBACT,WAAW;AAAA;AAAA,cAEX,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,YAAS,gCAAW,KAAK,IAAK;AAAA,YAC9C;AAAA,UACJ;AACA;AAAA,MACR;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,cAAc;AAC/B,QAAM,eAAe,SAAS,MAAM,gBAAgB,iBAAiB,EAAE;AACvE,QAAM,UAAU,iBAAiB,KAAK,SAAS;AAC/C,QAAM,cAAc,iBAAiB;AAErC,SACI,gBAAAF,QAAA,cAACC,MAAA,EAAI,eAAc,YAEd,eACG,gBAAAD,QAAA,cAACC,MAAA,EAAI,gBAAe,YAChB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,kDAAsB,CACzC,GAIJ,gBAAAF,QAAA,cAACC,MAAA,EAAI,eAAc,YACd,YACL,GAGC,WACG,gBAAAD,QAAA,cAACC,MAAA,EAAI,gBAAe,UAAS,WAAW,KACpC,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,0DAA2B,SAAS,SAAS,iBAAiB,IAAG,SAAO,CAC3F,CAER;AAER;;;AD5GA,IAAM,gBAAgB;AAAA,EAClB;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AACJ;AAKO,IAAM,YAAsC,CAAC,EAAE,gBAAgB,OAAO,MAAM;AAC/E,SAAO,gBAAAC,QAAA,cAAC,eAAY,SAAS,eAAe,gBAAgC;AAChF;;;AEhFA,OAAOC,aAAW;AASlB,IAAM,gBAAgB;AAAA,EAClB;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAab;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AACJ;AAKO,IAAM,YAAsC,CAAC,EAAE,gBAAgB,OAAO,MAAM;AAC/E,SAAO,gBAAAC,QAAA,cAAC,eAAY,SAAS,eAAe,gBAAgC;AAChF;;;ACnGA,OAAOC,aAAW;AASlB,IAAM,oBAAoB;AAAA,EACtB;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AACJ;AAKO,IAAM,gBAA8C,CAAC,EAAE,gBAAgB,OAAO,MAAM;AACvF,SAAO,gBAAAC,QAAA,cAAC,eAAY,SAAS,mBAAmB,gBAAgC;AACpF;;;ACrGA,OAAOC,aAAW;AASlB,IAAM,kBAAkB;AAAA,EACpB;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AACJ;AAKO,IAAM,cAA0C,CAAC,EAAE,gBAAgB,OAAO,MAAM;AACnF,SAAO,gBAAAC,QAAA,cAAC,eAAY,SAAS,iBAAiB,gBAAgC;AAClF;;;ACrGA,OAAOC,aAAW;AASlB,IAAM,iBAAiB;AAAA,EACnB;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb;AAAA,EACA;AAAA,IACI,MAAM;AAAA,IACN,MAAM;AAAA,EACV;AACJ;AAKO,IAAM,aAAwC,CAAC,EAAE,gBAAgB,OAAO,MAAM;AACjF,SAAO,gBAAAC,QAAA,cAAC,eAAY,SAAS,gBAAgB,gBAAgC;AACjF;;;ACtGA,OAAOC,WAAS,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACpC,OAAOC,gBAAe;AACtB,OAAOC,cAAa;AAcpB,IAAM,sBAAsB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAGA,IAAM,iBAAyC;AAAA,EAC3C,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,UAAU;AAAA;AAAA;AAAA;AAAA,EAKV,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOf;AAEA,SAAS,gBAAgB,SAAyB;AAC9C,QAAM,QAAQ,QAAQ,YAAY;AAElC,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,cAAS,GAAG;AACrD,WAAO,eAAe,OAAO;AAAA,EACjC;AACA,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,sBAAS,GAAG;AAChF,WAAO,eAAe,OAAO;AAAA,EACjC;AACA,MAAI,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,cAAW,GAAG;AAC3D,WAAO,eAAe,WAAW;AAAA,EACrC;AACA,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,SAAM,GAAG;AACnD,WAAO,eAAe,QAAQ;AAAA,EAClC;AAEA,SAAO,eAAe,SAAS;AACnC;AAKO,IAAM,mBAAoD,CAAC,EAAE,OAAO,MAAM;AAC7E,QAAM,CAAC,UAAU,WAAW,IAAIL,UAAwB;AAAA,IACpD;AAAA,MACI,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW,oBAAI,KAAK;AAAA,IACxB;AAAA,EACJ,CAAC;AACD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE;AAC/C,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,CAAC;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAkC,OAAO;AAG3E,EAAAG,UAAS,CAAC,OAAO,QAAQ;AAErB,QAAI,IAAI,QAAQ;AACZ,aAAO;AACP;AAAA,IACJ;AAGA,QAAI,IAAI,KAAK;AACT,mBAAa,UAAQ,SAAS,UAAU,gBAAgB,OAAO;AAC/D;AAAA,IACJ;AAGA,QAAI,cAAc,eAAe;AAC7B,UAAI,IAAI,WAAW;AACf,8BAAsB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACvD,WAAW,IAAI,YAAY;AACvB,8BAAsB,UAAQ,KAAK,IAAI,oBAAoB,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,MACpF,WAAW,IAAI,QAAQ;AACnB,cAAM,WAAW,oBAAoB,kBAAkB;AACvD,YAAI,UAAU;AACV,4BAAkB,QAAQ;AAC1B,uBAAa,OAAO;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,QAAM,oBAAoB,OAAO,SAAiB;AAC9C,QAAI,CAAC,KAAK,KAAK,KAAK,SAAU;AAE9B,UAAM,cAA2B;AAAA,MAC7B,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,MACtB,MAAM;AAAA,MACN,SAAS,KAAK,KAAK;AAAA,MACnB,WAAW,oBAAI,KAAK;AAAA,IACxB;AAEA,gBAAY,UAAQ,CAAC,GAAG,MAAM,WAAW,CAAC;AAC1C,kBAAc,EAAE;AAChB,gBAAY,IAAI;AAGhB,UAAM,IAAI,QAAQ,CAAAG,aAAW,WAAWA,UAAS,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC;AAE3E,UAAM,WAAW,gBAAgB,IAAI;AAErC,UAAM,mBAAgC;AAAA,MAClC,IAAI,aAAa,KAAK,IAAI,CAAC;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW,oBAAI,KAAK;AAAA,IACxB;AAEA,gBAAY,UAAQ,CAAC,GAAG,MAAM,gBAAgB,CAAC;AAC/C,gBAAY,KAAK;AAAA,EACrB;AAGA,QAAM,eAAe,CAAC,UAAkB;AACpC,sBAAkB,KAAK;AAAA,EAC3B;AAGA,QAAM,uBAAuB,CAAC,YAAoB;AAC9C,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,WACI,gBAAAP,QAAA,cAACE,OAAA,EAAI,eAAc,YACd,MAAM,IAAI,CAAC,MAAM,MACd,gBAAAF,QAAA,cAACG,QAAA,EAAK,KAAK,KAAI,QAAQ,GAAI,CAC9B,CACL;AAAA,EAER;AAGA,QAAM,kBAAkB,SAAS,MAAM,EAAE;AAEzC,SACI,gBAAAH,QAAA,cAACE,OAAA,EAAI,eAAc,YAEf,gBAAAF,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAM,aAAU,yBAAgB;AAAA,IAC3C,gBAAAH,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,4BAAa;AAAA,IAC5B,gBAAAH,QAAA,cAACE,OAAA,EAAI,UAAU,GAAG;AAAA,IAClB,gBAAAF,QAAA,cAACG,QAAA,EAAK,iBAAgB,SAAQ,OAAM,SAAQ,MAAI,QAAC,QAAM;AAAA,EAC3D,GAGA,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA,MACd,WAAW;AAAA;AAAA,IAEV,gBAAgB,IAAI,CAAC,QAClB,gBAAAF,QAAA,cAACE,OAAA,EAAI,KAAK,IAAI,IAAI,eAAc,UAAS,cAAc,KAClD,IAAI,SAAS,SACV,gBAAAF,QAAA,cAACE,OAAA,EAAI,eAAc,YACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,QAAO,MAAI,QAAC,WAAI,GAC5B,gBAAAH,QAAA,cAACE,OAAA,EAAI,YAAY,KACb,gBAAAF,QAAA,cAACG,QAAA,MAAM,IAAI,OAAQ,CACvB,CACJ,IACA,IAAI,SAAS,cACb,gBAAAH,QAAA,cAACE,OAAA,EAAI,eAAc,YACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,SAAQ,MAAI,QAAC,KAAG,GAC5B,gBAAAH,QAAA,cAACE,OAAA,EAAI,YAAY,KACZ,qBAAqB,IAAI,OAAO,CACrC,CACJ,IAEA,gBAAAF,QAAA,cAACE,OAAA,MACG,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,MAAC,QAAM,QAAE,IAAI,OAAQ,CACvC,CAER,CACH;AAAA,IAGA,YACG,gBAAAH,QAAA,cAACE,OAAA,MACG,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,WACR,gBAAAH,QAAA,cAACM,UAAA,EAAQ,MAAK,QAAO,GAAE,oCAC3B,CACJ;AAAA,IAIH,SAAS,SAAS,KACf,gBAAAN,QAAA,cAACE,OAAA,EAAI,gBAAe,YAChB,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,KAAE,SAAS,SAAS,GAAE,iCAAgB,CACzD;AAAA,EAER,GAGA,gBAAAH,QAAA,cAACE,OAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,MAAC,MAAI,QAAC,0BAAS,GAC7B,gBAAAH,QAAA,cAACE,OAAA,EAAI,WAAW,KACX,oBAAoB,IAAI,CAAC,GAAG,MAAM;AAC/B,UAAM,aAAa,cAAc,iBAAiB,MAAM;AACxD,WACI,gBAAAF,QAAA,cAACE,OAAA,EAAI,KAAK,GAAG,aAAa,KACtB,gBAAAF,QAAA;AAAA,MAACG;AAAA,MAAA;AAAA,QACG,iBAAiB,aAAa,SAAS;AAAA,QACvC,OAAO,aAAa,UAAU;AAAA;AAAA,MAE7B,aAAa,WAAM;AAAA,MAAI;AAAA,MAAE,IAAI;AAAA,MAAE;AAAA,MAAG;AAAA,IACvC,CACJ;AAAA,EAER,CAAC,CACL,CACJ,GAGA,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,aAAY;AAAA,MACZ,aAAa,cAAc,UAAU,SAAS;AAAA,MAC9C,UAAU;AAAA,MACV,cAAc;AAAA;AAAA,IAEd,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAO,cAAc,UAAU,SAAS,UAAQ,SAAE;AAAA,IACvD,cAAc,UACX,gBAAAH,QAAA;AAAA,MAACK;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,aAAY;AAAA,QACZ,OAAO;AAAA;AAAA,IACX,IAEA,gBAAAL,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,yCAAmB;AAAA,EAE1C,GAGA,gBAAAH,QAAA,cAACE,OAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,KACnD,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,6HAEf,CACJ,CACJ;AAER;;;AR/QA,IAAM,YAAwC;AAAA,EAC1C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACb;AAKO,IAAM,WAAoC,CAAC,EAAE,cAAc,OAAO,MAAM;AAC3E,QAAM,EAAE,KAAK,IAAIK,QAAO;AACxB,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAqB,MAAM;AACnE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,CAAC;AAGtD,EAAAC,WAAU,MAAM;AACZ,QAAI,gBAAgB,UAAU,YAAY,GAAG;AACzC,sBAAgB,UAAU,YAAY,CAAE;AAAA,IAC5C;AAAA,EACJ,GAAG,CAAC,YAAY,CAAC;AAGjB,EAAAC,UAAS,CAAC,OAAO,QAAQ;AAErB,QAAI,IAAI,UAAW,iBAAiB,UAAU,IAAI,WAAY;AAC1D,UAAI,iBAAiB,QAAQ;AACzB,eAAO;AAAA,MACX,OAAO;AACH,wBAAgB,MAAM;AACtB,0BAAkB,CAAC;AAAA,MACvB;AACA;AAAA,IACJ;AAGA,QAAI,UAAU,KAAK;AACf,aAAO;AACP;AAAA,IACJ;AAGA,QAAI,iBAAiB,UAAU,iBAAiB,WAAW;AACvD,UAAI,IAAI,SAAS;AACb,0BAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACnD,WAAW,IAAI,WAAW;AACtB,0BAAkB,UAAQ,OAAO,CAAC;AAAA,MACtC,WAAW,IAAI,UAAU;AACrB,0BAAkB,UAAQ,OAAO,CAAC;AAAA,MACtC,WAAW,IAAI,QAAQ;AACnB,0BAAkB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,QAAM,oBAAoB,CAAC,UAAsB;AAC7C,oBAAgB,KAAK;AACrB,sBAAkB,CAAC;AAAA,EACvB;AAEA,QAAM,aAAa,MAAM;AACrB,oBAAgB,MAAM;AACtB,sBAAkB,CAAC;AAAA,EACvB;AAGA,QAAM,gBAAgB,MAAM;AACxB,YAAQ,cAAc;AAAA,MAClB,KAAK;AACD,eAAO,gBAAAC,QAAA,cAAC,YAAS,UAAU,mBAAmB;AAAA,MAClD,KAAK;AACD,eAAO,gBAAAA,QAAA,cAAC,aAAU,gBAAgC,QAAQ,YAAY;AAAA,MAC1E,KAAK;AACD,eAAO,gBAAAA,QAAA,cAAC,aAAU,gBAAgC,QAAQ,YAAY;AAAA,MAC1E,KAAK;AACD,eAAO,gBAAAA,QAAA,cAAC,iBAAc,gBAAgC,QAAQ,YAAY;AAAA,MAC9E,KAAK;AACD,eAAO,gBAAAA,QAAA,cAAC,eAAY,gBAAgC,QAAQ,YAAY;AAAA,MAC5E,KAAK;AACD,eAAO,gBAAAA,QAAA,cAAC,cAAW,gBAAgC,QAAQ,YAAY;AAAA,MAC3E,KAAK;AACD,eAAO,gBAAAA,QAAA,cAAC,oBAAiB,QAAQ,YAAY;AAAA,MACjD;AACI,eAAO,gBAAAA,QAAA,cAAC,YAAS,UAAU,mBAAmB;AAAA,IACtD;AAAA,EACJ;AAEA,SACI,gBAAAA,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,SAAS,KAEjC,gBAAAD,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,aAAU,sBAAa,GACxC,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yDAAqC,CACxD,GAGC,cAAc,GAGf,gBAAAF,QAAA,cAACC,OAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,KACjE,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QACT,iBAAiB,SACZ,oEACA,sFAEV,CACJ,CACJ;AAER;;;ADlHO,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,4CAA4C,EACxD,OAAO,mBAAmB,gEAAgE,EAC1F,OAAO,OAAO,YAAgC;AAC3C,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,QAAM,cAAc,UAAU;AAAA,QAC1B,cAAc,QAAQ;AAAA,QACtB,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;;;AU3BA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;;;ACOhB,IAAM,kBAAN,MAAsB;AAAA,EACR;AAAA,EACA;AAAA,EAEjB,YAAY,QAAoB;AAE5B,SAAK,UAAU,OAAO,OAAO,QAAQ,OAAO,EAAE;AAC9C,SAAK,SAAS,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB;AACjB,WAAO,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoB;AAChB,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAqC;AACvC,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,cAAc;AAAA,MACtD,SAAS;AAAA,QACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,IACpE;AAEA,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAiC;AACnC,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,iBAAiB;AAAA,MACzD,SAAS;AAAA,QACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAO,GAAwB;AAC1C,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,qBAAqB,IAAI,IAAI;AAAA,MACrE,SAAS;AAAA,QACL,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,0BAA0B,SAAS,UAAU,EAAE;AAAA,IACnE;AAEA,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAgD;AAClD,UAAM,CAAC,WAAW,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MACjD,KAAK,UAAU;AAAA,MACf,KAAK,UAAU;AAAA,MACf,KAAK,SAAS,CAAC;AAAA;AAAA,IACnB,CAAC;AAGD,UAAM,SAAQ,oBAAI,KAAK,GAAE,mBAAmB,SAAS,EAAE,UAAU,mBAAmB,CAAC;AAErF,WAAO,UAAU,KAAK,IAAI,CAAC,UAAU;AACjC,YAAM,UAAU,OAAO,cAAc,SAAS,MAAM,EAAE;AACtD,YAAM,aAAa,OAAO,WAAW,MAAM,EAAE,KAAK,OAAO,WAAW,MAAM,GAAG,YAAY,CAAC;AAG1F,YAAM,cAAc,MAAM,KAAK;AAAA,QAC3B,CAAC,MAAM,EAAE,UAAU,MAAM,MAAM,EAAE,SAAS;AAAA,MAC9C,KAAK,MAAM,KAAK;AAAA,QACZ,CAAC,MAAM,EAAE,MAAM,YAAY,MAAM,MAAM,GAAG,YAAY,KAAK,EAAE,SAAS;AAAA,MAC1E;AACA,YAAM,YAAY,aAAa,SAAS;AAExC,aAAO;AAAA,QACH,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KACF,UACA,OACA,QACe;AACf,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,wBAAwB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,IACtD;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO,QAAQ,CAAC,GAAG,SAAS,WAAW;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WACH,UACA,OACA,QACsB;AACtB,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,wBAAwB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACxC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,IACtD;AAEA,QAAI,CAAC,SAAS,MAAM;AAChB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IAC3C;AAEA,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,YAAY;AAEhC,QAAI;AACA,aAAO,MAAM;AACT,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,cAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,cAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,MAAM,EAAE;AAEnE,mBAAW,QAAQ,OAAO;AACtB,cAAI,KAAK,WAAW,QAAQ,GAAG;AAC3B,kBAAM,OAAO,KAAK,MAAM,CAAC;AACzB,gBAAI,SAAS,UAAU;AACnB;AAAA,YACJ;AAEA,gBAAI;AACA,oBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,oBAAM,UAAU,OAAO,QAAQ,CAAC,GAAG,OAAO;AAC1C,kBAAI,SAAS;AACT,sBAAM;AAAA,cACV;AAAA,YACJ,SAAS,GAAG;AAAA,YAEZ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,UAAE;AACE,aAAO,YAAY;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAuB;AACtC,WAAO,QAAQ,KAAK,WAAW,CAAC;AAAA,8BACV,KAAK,OAAO,MAAM,GAAG,EAAE,CAAC;AAAA;AAAA;AAAA,gBAGtC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAuB;AAC1C,WAAO,QAAQ,KAAK,WAAW,CAAC;AAAA,8BACV,KAAK,MAAM;AAAA;AAAA;AAAA,gBAGzB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB;AACJ;;;ACvPA,OAAOC,WAAS,YAAAC,YAAU,aAAAC,YAAW,WAAAC,UAAS,eAAAC,cAAa,UAAAC,eAAc;AACzE,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,YAAU,UAAAC,SAAQ,iBAAiB;AACvD,OAAOC,cAAa;;;ACHpB,SAAS,YAAAC,YAAU,mBAAmB;AAI/B,SAAS,QAAQ,SAA0B;AAC9C,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AAEtD,QAAM,cAAc;AAAA,IAChB,OAAO,SAAiB,UAAkB;AACtC,UAAI,CAAC,QAAQ,KAAK,KAAK,YAAa;AAGpC,YAAM,cAA2B;AAAA,QAC7B,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,QAAQ,KAAK;AAAA,QACtB,WAAW,oBAAI,KAAK;AAAA,MACxB;AAEA,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC;AAC5C,eAAS,IAAI;AACb,qBAAe,IAAI;AAGnB,YAAM,qBAAqB,aAAa,KAAK,IAAI,CAAC;AAClD,YAAM,mBAAgC;AAAA,QAClC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,oBAAI,KAAK;AAAA,MACxB;AAEA,kBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,gBAAgB,CAAC;AAEjD,UAAI;AAEA,cAAM,qBAA0C;AAAA,UAC5C,GAAG,SAAS,IAAI,CAAC,OAAO;AAAA,YACpB,MAAM,EAAE;AAAA,YACR,SAAS,EAAE;AAAA,UACf,EAAE;AAAA,UACF;AAAA,YACI,MAAM;AAAA,YACN,SAAS,QAAQ,KAAK;AAAA,UAC1B;AAAA,QACJ;AAGA,YAAI,cAAc;AAClB,yBAAiB,SAAS,QAAQ,WAAW,oBAAoB,KAAK,GAAG;AACrE,yBAAe;AAGf;AAAA,YAAY,CAAC,SACT,KAAK;AAAA,cAAI,CAAC,QACN,IAAI,OAAO,qBACL,EAAE,GAAG,KAAK,SAAS,YAAY,IAC/B;AAAA,YACV;AAAA,UACJ;AAAA,QACJ;AAEA,uBAAe,KAAK;AAAA,MACxB,SAAS,KAAK;AACV,cAAM,eAAe,eAAe,QAAQ,IAAI,UAAU;AAC1D,iBAAS,YAAY;AAGrB;AAAA,UAAY,CAAC,SACT,KAAK;AAAA,YAAI,CAAC,QACN,IAAI,OAAO,qBACL,EAAE,GAAG,KAAK,SAAS,UAAU,YAAY,GAAG,IAC5C;AAAA,UACV;AAAA,QACJ;AAEA,uBAAe,KAAK;AAAA,MACxB;AAAA,IACJ;AAAA,IACA,CAAC,SAAS,UAAU,WAAW;AAAA,EACnC;AAEA,QAAM,gBAAgB,YAAY,MAAM;AACpC,gBAAY,CAAC,CAAC;AACd,aAAS,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;;;AC/FA,SAAS,YAAAC,YAAU,aAAAC,YAAW,eAAAC,cAAa,cAAc;AAYlD,SAAS,UAAU,SAA0B;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIF,WAAsB;AAAA,IAC5C,QAAQ,CAAC;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,EACX,CAAC;AAGD,QAAM,aAAa,OAAO,KAAK;AAE/B,QAAM,YAAYE,aAAY,OAAO,cAAc,UAAU;AAEzD,QAAI,aAAa;AACb,eAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAAA,IAChE;AAEA,QAAI;AACA,YAAM,CAAC,QAAQ,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC9C,QAAQ,mBAAmB;AAAA,QAC3B,QAAQ,UAAU;AAAA,QAClB,QAAQ,SAAS,CAAC;AAAA,MACtB,CAAC;AAED,eAAS;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,MACX,CAAC;AAAA,IACL,SAAS,KAAK;AACV,eAAS,CAAC,UAAU;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAChD,EAAE;AAAA,IACN;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAGZ,EAAAD,WAAU,MAAM;AACZ,QAAI,CAAC,WAAW,SAAS;AACrB,iBAAW,UAAU;AACrB,gBAAU,IAAI;AAAA,IAClB;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,UAAUC,aAAY,MAAM;AAC9B,cAAU,KAAK;AAAA,EACnB,GAAG,CAAC,SAAS,CAAC;AAEd,SAAO;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EACJ;AACJ;;;ACvEA,OAAOC,WAAS,QAAAC,aAAY;AAC5B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,OAAOC,cAAa;;;ACFpB,OAAOC,WAAS,YAAY;AAC5B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAOnB,IAAM,cAAc,KAAuB,CAAC,EAAE,QAAQ,MAAM;AAC/D,MAAI,QAAQ,SAAS,QAAQ;AACzB,WACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,QAAO,MAAI,QAAC,MAAI,GAC5B,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,QAAQ,OAAQ,CACvC;AAAA,EAER;AAEA,MAAI,QAAQ,SAAS,aAAa;AAC9B,WACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,cAAc,KACtC,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAM,SAAQ,MAAI,QAAC,OAAK,GAC9B,gBAAAF,QAAA,cAACE,QAAA,EAAK,MAAK,UAAQ,QAAQ,OAAQ,CACvC;AAAA,EAER;AAEA,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,cAAc,KACf,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,MAAC,QAAM,QAAE,QAAQ,OAAQ,CAC3C;AAER,CAAC;;;AChCD,OAAOC,WAAS,QAAAC,aAAY;AAC5B,SAAS,OAAAC,OAAK,QAAAC,cAAY;AAC1B,OAAOC,gBAAe;AAUf,IAAM,WAAWH,MAAoB,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,UAAU;AACd,MACI,gBAAAD,QAAA,cAACE,OAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,UAAU,KAClD,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,UAAO,SAAE,GACpB,CAAC,WACE,gBAAAH,QAAA;AAAA,EAACI;AAAA,EAAA;AAAA,IACG;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAY;AAAA,IACZ,OAAO;AAAA;AACX,IAEA,gBAAAJ,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,YAAU,CAEjC,CACH;;;AFXD,IAAM,cAAcE,MAAK,CAAC,EAAE,SAAS,MAAmC;AACpE,QAAM,UAAU,SAAS,MAAM,EAAE;AACjC,QAAM,SAAS,SAAS,SAAS,QAAQ;AAEzC,MAAI,QAAQ,WAAW,GAAG;AACtB,WACI,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,YAAW,UAAS,SAAS,KACrD,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,yBAAuB,GACtC,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,qBAAmB,CACtC;AAAA,EAER;AAEA,SACI,gBAAAF,QAAA,cAAAA,QAAA,gBACK,SAAS,KAAK,gBAAAA,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,KAAE,QAAO,WAAS,GAC/C,QAAQ,IAAI,CAAC,MAAM,gBAAAF,QAAA,cAAC,eAAY,KAAK,EAAE,IAAI,SAAS,GAAG,CAAE,CAC9D;AAER,CAAC;AAGD,IAAM,YAAYD,MAAK,CAAC,EAAE,UAAU,MAAM,MACtC,gBAAAC,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,UAAU,KACzE,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,UAAQ,GAC/B,SAAS,IAAI,CAAC,KAAK,MAChB,gBAAAF,QAAA;AAAA,EAACE;AAAA,EAAA;AAAA,IACG,KAAK,IAAI;AAAA,IACT,iBAAiB,MAAM,QAAQ,SAAS;AAAA,IACxC,OAAO,MAAM,QAAQ,UAAU;AAAA;AAAA,EAE9B,MAAM,QAAQ,YAAO;AAAA,EAAK;AAAA,EAAE,IAAI;AAAA,EAAK;AAAA,EAAI,IAAI;AAClD,CACH,CACL,CACH;AAEM,IAAM,YAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB,CAAC;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY;AAChB,MAAM;AAEF,QAAM,oBAAoB,KAAK,IAAI,GAAG,YAAY,KAAK,gBAAgB,IAAI,EAAE;AAE7E,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YAEf,gBAAAD,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,GAAG,WAAW,qBACtF,gBAAAD,QAAA,cAAC,eAAY,UAAoB,GAChC,eACG,gBAAAA,QAAA,cAACE,QAAA,EAAK,OAAM,WAAQ,gBAAAF,QAAA,cAACG,UAAA,EAAQ,MAAK,QAAO,GAAE,gBAAc,CAEjE,GAGC,iBAAiB,cAAc,SAAS,KACrC,gBAAAH,QAAA,cAAC,aAAU,UAAU,eAAe,OAAO,gBAAgB,GAI/D,gBAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAO;AAAA,MACP,UAAU;AAAA,MACV;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA;AAAA,EACb,CACJ;AAER;;;AGnGA,OAAOI,WAAS,YAAAC,kBAAgB;AAChC,SAAS,OAAAC,OAAK,QAAAC,QAAM,YAAAC,kBAAgB;AAU7B,IAAM,gBAA8C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AACpD,QAAM,eAAe,cAAc,UAAU,CAAC,MAAM,EAAE,OAAO,YAAY;AACzE,QAAM,CAAC,eAAe,gBAAgB,IAAIH,WAAS,KAAK,IAAI,GAAG,YAAY,CAAC;AAE5E,EAAAG,WAAS,CAAC,OAAO,QAAQ;AACrB,QAAI,IAAI,QAAQ;AACZ,eAAS;AACT;AAAA,IACJ;AAEA,QAAI,IAAI,SAAS;AACb,uBAAiB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACpD,WAAW,IAAI,WAAW;AACtB,uBAAiB,CAAC,SAAS,KAAK,IAAI,cAAc,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IAC3E,WAAW,IAAI,QAAQ;AACnB,YAAM,WAAW,cAAc,aAAa;AAC5C,UAAI,UAAU;AACV,iBAAS,SAAS,EAAE;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,MAAI,cAAc,WAAW,GAAG;AAC5B,WACI,gBAAAJ,QAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA;AAAA,MAEP,gBAAAF,QAAA,cAACG,QAAA,EAAK,OAAM,OAAM,MAAI,QAAC,qBAEvB;AAAA,MACA,gBAAAH,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,oBAAkB;AAAA,IACrC;AAAA,EAER;AAEA,SACI,gBAAAH,QAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACG,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA;AAAA,IAEP,gBAAAF,QAAA,cAACE,OAAA,EAAI,cAAc,KACf,gBAAAF,QAAA,cAACG,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,4BAExB,CACJ;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,eAAc,UAAS,cAAc,KACrC,cAAc,IAAI,CAAC,OAAO,MAAM;AAC7B,YAAM,aAAa,MAAM;AACzB,YAAM,YAAY,MAAM,OAAO;AAC/B,YAAM,OAAO,aAAa,WAAM;AAEhC,UAAI,YAAY;AAChB,UAAI,MAAM,eAAe,UAAa,MAAM,cAAc,QAAW;AACjE,oBAAY,KAAK,MAAM,SAAS,IAAI,MAAM,UAAU;AAAA,MACxD;AAEA,aACI,gBAAAF,QAAA,cAACE,OAAA,EAAI,KAAK,MAAM,IAAI,SAAS,KACzB,gBAAAF,QAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACG,iBAAiB,aAAa,SAAS;AAAA,UACvC,OAAO,aAAa,UAAU;AAAA;AAAA,QAE7B,aAAa,YAAO;AAAA,QACpB;AAAA,QAAK;AAAA,QAAE,MAAM;AAAA,QACb,YAAY,YAAO;AAAA,QACnB;AAAA,MACL,CACJ;AAAA,IAER,CAAC,CACL;AAAA,IAEA,gBAAAH,QAAA,cAACE,OAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,KACnD,gBAAAF,QAAA,cAACG,QAAA,EAAK,UAAQ,QAAC,uDAA2C,CAC9D;AAAA,EACJ;AAER;;;AN1FA,IAAM,iBAAiC;AAAA,EACnC,EAAE,MAAM,SAAS,aAAa,uBAAuB,SAAS,CAAC,GAAG,EAAE;AAAA,EACpE,EAAE,MAAM,SAAS,aAAa,+BAA+B,SAAS,CAAC,GAAG,EAAE;AAAA,EAC5E,EAAE,MAAM,QAAQ,aAAa,iBAAiB,SAAS,CAAC,KAAK,MAAM,EAAE;AACzE;AASO,IAAM,UAAkC,CAAC,EAAE,SAAS,aAAa,MAAM;AAC1E,QAAM,EAAE,KAAK,IAAIE,QAAO;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAG7B,QAAM,gBAAgBC,QAAO,KAAK,IAAI,KAAK,QAAQ,QAAQ,MAAM,CAAC,CAAC;AAGnE,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAmB,SAAS;AAClE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,CAAC;AACtD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,EAAE;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAiB,EAAE;AAG7D,QAAM,EAAE,QAAQ,SAAS,QAAQ,IAAI,UAAU,OAAO;AAGtD,QAAM,EAAE,UAAU,aAAa,YAAY,IAAI,QAAQ,OAAO;AAG9D,EAAAC,WAAU,MAAM;AACZ,QAAI,OAAO,SAAS,KAAK,CAAC,eAAe;AACrC,YAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO;AAC1C,UAAI,OAAO;AACP,yBAAiB,gBAAgB,MAAM,EAAE;AACzC,uBAAe,MAAM;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,QAAQ,eAAe,YAAY,CAAC;AAGxC,QAAM,mBAAmBC,SAAQ,MAAM;AACnC,QAAI,CAAC,WAAW,WAAW,GAAG,EAAG,QAAO;AACxC,UAAM,SAAS,WAAW,MAAM,CAAC,EAAE,YAAY;AAC/C,WAAO,eAAe;AAAA,MAClB,CAAC,QAAQ,IAAI,KAAK,SAAS,MAAM,KAAK,IAAI,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IACrF;AAAA,EACJ,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,aAAaC,aAAY,MAAM;AACjC,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC9C,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,aAAa;AAC3D,qBAAiB,SAAS,MAAM,KAAK,QAAQ,MAAM,EAAG,EAAE;AAAA,EAC5D,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,QAAM,cAAcA,aAAY,CAAC,QAAgB;AAC7C,UAAM,IAAI,IAAI,YAAY,EAAE,QAAQ,OAAO,EAAE;AAC7C,QAAI,MAAM,WAAW,MAAM,KAAK;AAAE,qBAAe,OAAO;AAAG,aAAO;AAAA,IAAM;AACxE,QAAI,MAAM,WAAW,MAAM,KAAK;AAAE,qBAAe,OAAO;AAAG,cAAQ;AAAG,aAAO;AAAA,IAAM;AACnF,QAAI,MAAM,UAAU,MAAM,OAAO,MAAM,QAAQ;AAAE,WAAK;AAAG,aAAO;AAAA,IAAM;AACtE,WAAO;AAAA,EACX,GAAG,CAAC,SAAS,IAAI,CAAC;AAGlB,EAAAC,WAAS,CAAC,OAAO,QAAQ;AACrB,QAAI,eAAe;AACf,UAAI,IAAI,SAAS;AAAE,0BAAkB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAG;AAAA,MAAQ;AACzE,UAAI,IAAI,WAAW;AAAE,0BAAkB,CAAC,MAAM,KAAK,IAAI,iBAAiB,SAAS,GAAG,IAAI,CAAC,CAAC;AAAG;AAAA,MAAQ;AACrG,UAAI,IAAI,UAAU,iBAAiB,cAAc,GAAG;AAChD,yBAAiB,KAAK;AACtB,oBAAY,iBAAiB,cAAc,EAAE,IAAI;AACjD,sBAAc,EAAE;AAChB;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,IAAI,QAAQ;AACZ,UAAI,eAAe;AAAE,yBAAiB,KAAK;AAAG,sBAAc,EAAE;AAAA,MAAG,WACxD,gBAAgB,UAAU,gBAAgB,WAAW;AAAE,uBAAe,MAAM;AAAA,MAAG,OACnF;AAAE,aAAK;AAAA,MAAG;AACf;AAAA,IACJ;AACA,QAAI,IAAI,OAAO,gBAAgB,UAAU,CAAC,iBAAiB,CAAC,aAAa;AACrE,iBAAW;AAAA,IACf;AAAA,EACJ,GAAG,EAAE,UAAU,KAAK,CAAC;AAErB,QAAM,gBAAgBD,aAAY,CAAC,MAAc;AAC7C,kBAAc,CAAC;AACf,UAAM,OAAO,EAAE,WAAW,GAAG;AAC7B,qBAAiB,IAAI;AACrB,QAAI,QAAQ,MAAM,IAAK,mBAAkB,CAAC;AAAA,EAC9C,GAAG,CAAC,CAAC;AAEL,QAAM,WAAWA,aAAY,CAAC,MAAc;AACxC,UAAM,IAAI,EAAE,KAAK;AACjB,qBAAiB,KAAK;AACtB,QAAI,EAAE,WAAW,GAAG,KAAK,YAAY,CAAC,GAAG;AAAE,oBAAc,EAAE;AAAG;AAAA,IAAQ;AACtE,QAAI,KAAK,CAAC,eAAe,eAAe;AAAE,kBAAY,GAAG,aAAa;AAAG,oBAAc,EAAE;AAAA,IAAG;AAAA,EAChG,GAAG,CAAC,aAAa,aAAa,eAAe,WAAW,CAAC;AAEzD,QAAM,gBAAgBA,aAAY,CAAC,OAAe;AAC9C,qBAAiB,EAAE;AACnB,mBAAe,MAAM;AAAA,EACzB,GAAG,CAAC,CAAC;AAGL,QAAM,YAAYD,SAAQ,MAAM;AAC5B,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC9C,WACI,gBAAAG,QAAA,cAACC,OAAA,EAAI,eAAc,UAAS,aAAY,SAAQ,aAAY,QAAO,SAAS,KACxE,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,UAAO,kCAAyB,GAChD,QAAQ,IAAI,CAAC,MAAM;AAChB,YAAM,QAAQ,EAAE,cAAc;AAC9B,YAAM,OAAO,EAAE,aAAa;AAC5B,YAAM,MAAM,QAAQ,IAAI,KAAK,MAAO,OAAO,QAAS,GAAG,IAAI;AAC3D,YAAM,MAAM,SAAI,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC,CAAC;AACjF,aACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,KAAK,EAAE,IAAI,eAAc,YAC1B,gBAAAD,QAAA,cAACE,QAAA,EAAK,OAAO,EAAE,OAAO,gBAAgB,WAAW,WAC5C,EAAE,OAAO,gBAAgB,YAAO,MAAM,EAAE,EAC7C,GACA,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAO,MAAM,KAAK,QAAQ,MAAM,KAAK,WAAW,WACjD,QAAQ,KAAI,KAAC,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAK,KAAE,KAAM,CAC/C,CACJ;AAAA,IAER,CAAC,GACD,gBAAAF,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,YAAU,CAC7B;AAAA,EAER,GAAG,CAAC,QAAQ,aAAa,CAAC;AAG1B,QAAM,SAAS,gBAAgB,WAAW,gBAAgB,UACpD,oEACA,gBACA,sEACA;AAEN,SACI,gBAAAF,QAAA,cAACC,OAAA,EAAI,eAAc,YAEf,gBAAAD,QAAA,cAACC,OAAA,EAAI,aAAY,UAAS,aAAY,WAAU,UAAU,KACtD,gBAAAD,QAAA,cAACE,QAAA,EAAK,MAAI,MAAC,OAAM,aAAU,qBAAY,GACvC,gBAAAF,QAAA,cAACC,OAAA,EAAI,UAAU,GAAG,GAClB,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAC,SAAO,GACtB,gBAAAF,QAAA,cAACE,QAAA,EAAK,OAAM,UAAS,MAAI,QAAE,iBAAiB,KAAM,CACtD,GAGC,gBAAgB,YACb,gBAAAF,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,YAAW,UAAS,gBAAe,YAClF,gBAAAD,QAAA,cAACE,QAAA,MAAK,gBAAAF,QAAA,cAACG,UAAA,EAAQ,MAAK,QAAO,GAAE,aAAW,CAC5C,IACA,gBAAgB,UAChB,gBAAAH,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,gBAAe,UAAS,YAAW,YAClF,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,cAAc;AAAA,MACd,UAAU;AAAA,MACV,UAAU,MAAM,eAAe,MAAM;AAAA;AAAA,EACzC,CACJ,IACA,gBAAgB,UAChB,gBAAAA,QAAA,cAACC,OAAA,EAAI,SAAS,GAAG,WAAW,cAAc,SAAS,gBAAe,UAAS,YAAW,YACjF,SACL,IAEA,gBAAAD,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA,WAAW,cAAc;AAAA;AAAA,EAC7B,GAIJ,gBAAAA,QAAA,cAACC,OAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,KACnD,gBAAAD,QAAA,cAACE,QAAA,EAAK,UAAQ,QAAE,MAAO,CAC3B,CACJ;AAER;;;AF9LA,eAAe,kBAAkB,SAA4C;AACzE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,UAAU,IAAI,gBAAgB,MAAM;AAG1C,QAAM,EAAE,eAAe,MAAM,IAAIE;AAAA,IAC7BC,QAAM,cAAc,SAAS;AAAA,MACzB;AAAA,MACA,cAAc,QAAQ;AAAA,IAC1B,CAAC;AAAA,IACD;AAAA;AAAA,MAEI,aAAa;AAAA;AAAA,IACjB;AAAA,EACJ;AAEA,QAAM,cAAc;AAGpB,QAAM;AACV;AAKO,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,yCAAyC,EACrD,OAAO,mBAAmB,oDAAoD,EAC9E,OAAO,OAAO,YAAgC;AAC3C,UAAM,kBAAkB,OAAO;AAAA,EACnC,CAAC;AAEL,SAAO;AACX;;;ASxDA,SAAS,WAAAC,iBAAe;AAKxB,SAASC,SAAQ,KAAqB;AAClC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,IAAI,MAAM,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM,EAAE;AAClD;AAKA,eAAe,qBAAqB,SAA4C;AAC5E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,UAAU,IAAI,gBAAgB,MAAM;AAE1C,UAAQ,IAAI,kDAA2C;AACvD,UAAQ,IAAI,0PAA6C;AAEzD,UAAQ,IAAI,2BAAoB;AAChC,UAAQ,IAAI,gBAAgB,QAAQ,WAAW,CAAC,EAAE;AAClD,UAAQ,IAAI,gBAAgB,QAAQ,OAAO,QAAQ,UAAU,IAAIA,SAAQ,QAAQ,UAAU,CAAC,CAAC;AAAA,CAAI;AAEjG,MAAI;AACA,UAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvC,QAAQ,mBAAmB;AAAA,MAC3B,QAAQ,UAAU;AAAA,IACtB,CAAC;AAED,UAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAEpD,YAAQ,IAAI,4BAAqB;AACjC,QAAI,cAAc,WAAW,GAAG;AAC5B,cAAQ,IAAI,0BAA0B;AAAA,IAC1C,OAAO;AACH,oBAAc,QAAQ,CAAC,UAAU;AAC7B,cAAM,YACF,MAAM,eAAe,UAAa,MAAM,cAAc,SAChD,KAAK,MAAM,SAAS,IAAI,MAAM,UAAU,YACxC;AACV,gBAAQ,IAAI,aAAQ,MAAM,EAAE,GAAG,SAAS,EAAE;AAAA,MAC9C,CAAC;AACD,cAAQ,IAAI;AAAA,IAChB;AAEA,UAAM,eAAe,cAAc,CAAC,GAAG,MAAM;AAC7C,YAAQ,IAAI,yBAAkB;AAC9B,UAAM,aAAa,QAAQ,OACrB,QAAQ,uBAAuB,YAAY,IAC3C,QAAQ,mBAAmB,YAAY;AAC7C,UAAM,YAAY,WAAW,MAAM,IAAI;AACvC,cAAU,QAAQ,CAAC,SAAS,QAAQ,IAAI,MAAM,IAAI,EAAE,CAAC;AACrD,YAAQ,IAAI;AAEZ,YAAQ,IAAI,kBAAW;AACvB,YAAQ,IAAI,gDAAgD;AAC5D,YAAQ,IAAI,+DAA+D;AAC3E,YAAQ,IAAI,2CAA2C;AACvD,YAAQ,IAAI,sDAAsD;AAAA,EACtE,SAAS,OAAO;AACZ,YAAQ;AAAA,MACJ;AAAA,MACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACzD;AACA,YAAQ,IAAI,kEAA2D;AAAA,EAC3E;AACJ;AAKO,SAAS,uBAAgC;AAC5C,QAAM,MAAM,IAAIC,UAAQ,UAAU,EAC7B,YAAY,iDAAiD,EAC7D,OAAO,UAAU,8BAA8B,EAC/C,OAAO,OAAO,YAAgC;AAC3C,UAAM,qBAAqB,OAAO;AAAA,EACtC,CAAC;AAEL,SAAO;AACX;;;ACvFA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AACjB,OAAO,YAAY;AACnB,OAAO,YAAY;AAanB,IAAM,oBAAoB,CAAC,OAAO,QAAQ,SAAS,SAAS,MAAM;AAE3D,IAAM,qBAAN,MAAyB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,YAA6B,SAA2B,OAAgB;AAChF,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,QAAQ,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAoD;AACtE,QAAI;AACA,YAAM,OAAO,MAAMD,IAAG,KAAK,KAAK;AAChC,UAAI,KAAK,YAAY,EAAG,QAAO;AAC/B,UAAI,KAAK,OAAO,EAAG,QAAO;AAAA,IAC9B,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAA0C;AAC1D,QAAI;AACA,YAAM,oBAAoB,MAAM,KAAK,mBAAmB,MAAM,MAAM;AACpE,aAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB,KAAK,QAAQ;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB,KAAK,QAAQ;AAAA,QAC7B,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,UAAkD;AAClE,QAAI;AAEA,YAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AAGnD,YAAM,MAAMC,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,YAAM,WAAW,KAAK,YAAY,GAAG;AAGrC,YAAM,oBAAoB,MAAM,KAAK,mBAAmB,SAAS,QAAQ;AAGzE,YAAM,aAAa,KAAK,mBAAmB,QAAQ;AAGnD,UAAI,CAAC,KAAK,QAAQ,QAAQ;AACtB,cAAMD,IAAG,UAAU,YAAY,mBAAmB,OAAO;AAAA,MAC7D;AAEA,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,QACA,SAAS;AAAA,MACb;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACF,YACA,YACgC;AAChC,UAAM,QAAQ,MAAM,KAAK,cAAc,UAAU;AACjD,UAAM,cAAc,SAAS,KAAK,QAAQ,eAAe,KAAK,EAAE;AAChE,UAAM,QAAQ,OAAO,WAAW;AAEhC,UAAM,UAAmC,CAAC;AAC1C,QAAI,UAAU;AAEd,UAAM,QAAQ,MAAM;AAAA,MAAI,CAAC,SACrB,MAAM,YAAY;AACd;AACA,qBAAa;AAAA,UACT;AAAA,UACA,OAAO,MAAM;AAAA,UACb,aAAa;AAAA,UACb,QAAQ;AAAA,QACZ,CAAC;AAED,cAAM,SAAS,MAAM,KAAK,cAAc,IAAI;AAC5C,gBAAQ,KAAK,MAAM;AAEnB,qBAAa;AAAA,UACT;AAAA,UACA,OAAO,MAAM;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,OAAO,UAAU,SAAS;AAAA,QACtC,CAAC;AAED,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAEA,UAAM,QAAQ,IAAI,KAAK;AAEvB,WAAO,KAAK,iBAAiB,YAAY,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,WAA2B;AAClD,QAAI,KAAK,QAAQ,QAAQ;AACrB,aAAO,KAAK,QAAQ;AAAA,IACxB;AAEA,UAAM,MAAMC,MAAK,QAAQ,SAAS;AAClC,UAAM,OAAOA,MAAK,SAAS,WAAW,GAAG;AACzC,UAAM,MAAMA,MAAK,QAAQ,SAAS;AAClC,UAAM,OAAO,KAAK,QAAQ;AAE1B,WAAOA,MAAK,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,EAAE;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,YAAuC;AAC/D,UAAM,UAAU,MAAMD,IAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,UAAM,QAAkB,CAAC;AAEzB,eAAW,SAAS,SAAS;AACzB,YAAM,WAAWC,MAAK,KAAK,YAAY,MAAM,IAAI;AAEjD,UAAI,MAAM,YAAY,GAAG;AAErB,YAAI,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,gBAAgB;AAC9D,gBAAM,WAAW,MAAM,KAAK,cAAc,QAAQ;AAClD,gBAAM,KAAK,GAAG,QAAQ;AAAA,QAC1B;AAAA,MACJ,WAAW,MAAM,OAAO,GAAG;AACvB,cAAM,MAAMA,MAAK,QAAQ,MAAM,IAAI,EAAE,YAAY;AACjD,YAAI,kBAAkB,SAAS,GAA4B,GAAG;AAE1D,cAAI,CAAC,KAAK,iBAAiB,MAAM,IAAI,GAAG;AACpC,kBAAM,KAAK,QAAQ;AAAA,UACvB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,UAA2B;AAEhD,UAAM,UAAU;AAChB,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAAiB,UAAuC;AACxE,UAAM,aAAa,KAAK,QAAQ;AAChC,QAAI,eAAe;AAEnB,YAAQ,UAAU;AAAA,MACd,KAAK;AACD,uBAAe;AAAA,8CACe,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxC;AAAA,MAEJ,KAAK;AACD,uBAAe;AAAA,iCACE,UAAU;AAAA;AAAA;AAG3B;AAAA,MAEJ,KAAK;AACD,uBAAe;AAAA,iCACE,UAAU;AAAA;AAAA;AAG3B;AAAA,MAEJ;AACI,uBAAe;AAAA,kCACG,UAAU;AAAA;AAAA;AAAA,IAGpC;AAEA,WAAO;AAAA,MACH,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,MACxC,EAAE,MAAM,QAAQ,QAAiB;AAAA,IACrC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAqB;AACrC,YAAQ,IAAI,YAAY,GAAG;AAAA,MACvB,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,SAAiB,UAAmC;AACjF,WAAO;AAAA,MACH,YAAY;AACR,cAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,cAAM,SAAS,MAAM,KAAK,WAAW,KAAK,UAAU,KAAK,KAAK;AAC9D,eAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,SAAS;AAAA,QACT,iBAAiB,CAAC,UAAU;AACxB,cAAI,MAAM,QAAQ,SAAS,YAAY,GAAG;AACtC,oBAAQ,IAAI,0DAAiC;AAAA,UACjD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACJ,YACA,SACuB;AACvB,UAAM,UAAU;AAAA,MACZ,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,MAC1C,QAAQ,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE;AAAA,MAC1C,SAAS;AAAA,IACb;AAEA,WAAO;AAAA,MACH,aAAa;AAAA,MACb,cAAc,KAAK,QAAQ,UAAU;AAAA,MACrC;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ;;;ADzSA,eAAe,gBAAgB,OAAe,SAAiD;AAC3F,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,oEAAwC;AAAA,EACtE;AAEA,QAAM,aAAa,IAAI,gBAAgB,MAAM;AAC7C,QAAM,qBAAqB,IAAI,mBAAmB,YAAY,SAAS,QAAQ,KAAK;AAGpF,QAAM,YAAY,MAAM,mBAAmB,gBAAgB,KAAK;AAGhE,UAAQ,WAAW;AAAA,IACf,KAAK;AACD,YAAM,sBAAsB,oBAAoB,OAAO,OAAO;AAC9D;AAAA,IACJ,KAAK;AACD,YAAM,sBAAsB,oBAAoB,OAAO,OAAO;AAC9D;AAAA,IACJ,KAAK;AACD,YAAM,wBAAwB,oBAAoB,OAAO,OAAO;AAChE;AAAA,EACR;AACJ;AAKA,eAAe,sBACX,SACA,MACA,SACa;AACb,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,IAAI,oDAAyB;AAAA,EACzC;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc,IAAI;AAE/C,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACJ;AAEA,MAAI,OAAO,WAAW,OAAO,mBAAmB;AAC5C,YAAQ,IAAI,8CAAyB,OAAO,cAAc;AAAA,CAAI;AAC9D,YAAQ,IAAI,OAAO,iBAAiB;AAAA,EACxC,OAAO;AACH,YAAQ,MAAM,oBAAU,OAAO,KAAK,EAAE;AACtC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,sBACX,SACA,UACA,SACa;AACb,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,IAAI,uCAAsB,QAAQ,EAAE;AAAA,EAChD;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc,QAAQ;AAEnD,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACJ;AAEA,MAAI,OAAO,SAAS;AAChB,QAAI,QAAQ,QAAQ;AAChB,cAAQ,IAAI,2CAA4B,OAAO,UAAU,EAAE;AAAA,IAC/D,OAAO;AACH,cAAQ,IAAI,+BAAa,OAAO,UAAU,EAAE;AAAA,IAChD;AAAA,EACJ,OAAO;AACH,YAAQ,MAAM,oBAAU,OAAO,KAAK,EAAE;AACtC,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;AAKA,eAAe,wBACX,SACA,YACA,SACa;AACb,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,IAAI,kDAAyB,UAAU;AAAA,CAAI;AAAA,EACvD;AAEA,QAAM,SAAS,MAAM,QAAQ,gBAAgB,YAAY,CAAC,aAAa;AACnE,QAAI,CAAC,QAAQ,MAAM;AACf,YAAM,WAAW,SAAS,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK,SAAS;AACnE,cAAQ,OAAO;AAAA,QACX,wCAAoB,SAAS,OAAO,IAAI,SAAS,KAAK,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;AAAA,MACzF;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,MAAI,CAAC,QAAQ,MAAM;AAEf,YAAQ,OAAO,MAAM,OAAO,IAAI,OAAO,GAAG,IAAI,IAAI;AAAA,EACtD;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACJ;AAGA,UAAQ,IAAI;AAAA,2BAAiB,OAAO,QAAQ,OAAO,IAAI,OAAO,QAAQ,KAAK,4BAAe;AAE1F,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC3B,YAAQ,IAAI;AAAA,gBAAS,OAAO,QAAQ,MAAM,0BAAgB;AAC1D,WAAO,QACF,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EACxB,QAAQ,CAAC,MAAM;AACZ,YAAM,WAAW,EAAE,UAAU,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE;AACnD,cAAQ,IAAI,aAAQ,QAAQ,KAAK,EAAE,KAAK,EAAE;AAAA,IAC9C,CAAC;AAAA,EACT;AAEA,MAAI,QAAQ,QAAQ;AAChB,YAAQ,IAAI,4EAA2C;AAAA,EAC3D;AACJ;AAKO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIC,UAAQ,WAAW,EAC9B,YAAY,4EAAyC,EACrD,SAAS,WAAW,8FAA4C,EAChE,OAAO,mBAAmB,qEAAmC,IAAI,EACjE,OAAO,uBAAuB,+DAAiC,EAC/D,OAAO,aAAa,4CAA0B,EAC9C,OAAO,0BAA0B,qEAAyC,GAAG,EAC7E,OAAO,mBAAmB,yDAA0C,EACpE,OAAO,UAAU,4CAAwB,EACzC,OAAO,OAAO,OAAe,YAAqC;AAC/D,UAAM,gBAAgB,OAAO,OAAO;AAAA,EACxC,CAAC;AAEL,SAAO;AACX;;;AEpKA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,gBAAe;AACxB,SAAS,gBAAgB;AAOzB,IAAMC,UAAS;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACV;AAKO,SAAS,uBAAgC;AAC5C,SAAO,IAAIC,UAAQ,SAAS,EACvB,YAAY,2CAA2C,EACvD,OAAO,WAAW,2CAA2C,EAC7D,OAAO,WAAW,oCAAoC,EACtD,OAAO,OAAO,YAAkD;AAC7D,UAAM,cAAc,OAAO;AAAA,EAC/B,CAAC;AACT;AAEA,eAAe,cAAc,SAA+C;AACxE,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,MAAI;AAEA,YAAQ,IAAI,GAAGD,QAAO,IAAI,oCAA6BA,QAAO,KAAK,EAAE;AAErE,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAK;AAAA;AAAA,IACrC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,gCAAgC,SAAS,UAAU,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,gBAAgB,KAAK;AAC3B,UAAM,iBAAiB,gBAAY;AAEnC,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,mBAAmBA,QAAO,KAAK,IAAI,cAAc,EAAE;AAC/E,YAAQ,IAAI,GAAGA,QAAO,IAAI,kBAAkBA,QAAO,KAAK,KAAK,aAAa;AAAA,CAAI;AAE9E,QAAI,CAACE,gBAAe,eAAe,cAAc,GAAG;AAChD,cAAQ,IAAI,GAAGF,QAAO,KAAK,+CAA0CA,QAAO,KAAK;AAAA,CAAI;AACrF;AAAA,IACJ;AAGA,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK,EAAE;AACzG,YAAQ,IAAI,GAAGA,QAAO,MAAM,SAAIA,QAAO,KAAK,KAAKA,QAAO,IAAI,kCAAwBA,QAAO,KAAK,IAAI,cAAc,WAAMA,QAAO,IAAI,GAAG,aAAa,GAAGA,QAAO,KAAK,qBAAqBA,QAAO,MAAM,SAAIA,QAAO,KAAK,EAAE;AACtN,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK;AAAA,CAAI;AAG3G,QAAI,QAAQ,OAAO;AACf,cAAQ,IAAI,GAAGA,QAAO,IAAI,oDAAoDA,QAAO,KAAK;AAAA,CAAI;AAC9F;AAAA,IACJ;AAGA,QAAI,CAAC,QAAQ,OAAO;AAChB,YAAM,eAAe,MAAMG,SAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,cAAc;AACf,gBAAQ,IAAI,GAAGH,QAAO,MAAM,mCAAyBA,QAAO,KAAK;AAAA,CAAI;AACrE;AAAA,MACJ;AAAA,IACJ;AAGA,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,yCAAkCA,QAAO,KAAK;AAAA,CAAI;AAE9E,QAAI;AAEA,YAAMI,kBAAiB,qBAAqB;AAC5C,YAAM,iBAAiB,kBAAkBA,eAAc;AAEvD,cAAQ,IAAI,GAAGJ,QAAO,IAAI,SAASI,eAAc,MAAMJ,QAAO,KAAK,EAAE;AAGrE,eAAS,gBAAgB;AAAA,QACrB,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI;AAAA,MAC5C,CAAC;AAED,cAAQ,IAAI;AAAA,EAAKA,QAAO,KAAK,2CAAsC,aAAa,IAAIA,QAAO,KAAK;AAAA,CAAI;AAGpG,kBAAY,WAAW;AAAA,QACnB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,iBAAiBI;AAAA,MACrB,CAAC;AAAA,IAEL,SAAS,OAAO;AACZ,cAAQ,MAAM;AAAA,EAAKJ,QAAO,GAAG,yBAAoBA,QAAO,KAAK,EAAE;AAC/D,cAAQ,MAAM,GAAGA,QAAO,GAAG,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,GAAGA,QAAO,KAAK;AAAA,CAAI;AAChH,cAAQ,MAAM,GAAGA,QAAO,MAAM,iDAA0CA,QAAO,KAAK,EAAE;AAGtF,YAAM,iBAAiB;AAAA,QACnB,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,MACT;AAEA,cAAQ,MAAM,MAAMA,QAAO,IAAI,GAAG,eAAe,cAAc,CAAC,GAAGA,QAAO,KAAK;AAAA,CAAI;AACnF,YAAM;AAAA,IACV;AAAA,EAEJ,SAAS,OAAO;AACZ,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,iBAAiB,GAAG;AACrE,YAAM,IAAI,gBAAgB,yEAAyE;AAAA,IACvG;AACA,UAAM;AAAA,EACV;AACJ;AAKA,SAASE,gBAAe,QAAgB,OAAwB;AAC5D,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,IAAI,WAAW,CAAC,KAAK;AAE3B,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACtB;AAEA,SAAO;AACX;AAWA,SAAS,uBAAwD;AAE7D,MAAI;AACA,UAAM,WAAW,SAAS,4BAA4B;AAAA,MAClD,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IACpC,CAAC,EAAE,KAAK;AAER,QAAI,UAAU;AAEV,YAAM,iBAAiB,SAAS,YAAY,EAAE,QAAQ,OAAO,GAAG;AAKhE,UAAI,eAAe,SAAS,QAAQ,EAAG,QAAO;AAK9C,UAAI,eAAe,SAAS,SAAS,KAAK,eAAe,SAAS,QAAQ,EAAG,QAAO;AAKpF,UAAI,eAAe,SAAS,QAAQ,EAAG,QAAO;AAY9C,UAAI,eAAe,SAAS,QAAQ,KAChC,eAAe,SAAS,gBAAgB,KACxC,eAAe,SAAS,oBAAoB,KAC5C,eAAe,SAAS,cAAc,KACtC,eAAe,SAAS,iBAAiB,KACzC,eAAe,SAAS,WAAW,KACnC,eAAe,SAAS,uBAAuB,KAC/C,eAAe,SAAS,wBAAwB,GAAG;AACnD,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ,QAAQ;AAAA,EAER;AAGA,QAAM,YAAY,QAAQ,IAAI,yBAAyB;AAEvD,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AACtC,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AAKtC,SAAO;AACX;AAKA,SAAS,kBAAkBE,iBAAyD;AAChF,QAAM,cAAc;AAEpB,UAAQA,iBAAgB;AAAA,IACpB,KAAK;AACD,aAAO,eAAe,WAAW;AAAA,IACrC,KAAK;AACD,aAAO,mBAAmB,WAAW;AAAA,IACzC,KAAK;AACD,aAAO,cAAc,WAAW;AAAA,IACpC,KAAK;AAAA,IACL;AACI,aAAO,kBAAkB,WAAW;AAAA,EAC5C;AACJ;;;AC5PA,SAAS,WAAAC,iBAAe;AACxB,SAAS,WAAAC,UAAS,UAAAC,eAAc;AAGhC,SAAS,QAAAC,aAAY;AAcd,SAAS,qBAA8B;AAC1C,SAAO,IAAIC,UAAQ,OAAO,EACrB,YAAY,8CAA8C,EAC1D,OAAO,aAAa,mBAAmB,EACvC,OAAO,aAAa,yBAAyB,EAC7C,OAAO,SAAS,6BAA6B,EAC7C,OAAO,OAAO,YAAiE;AAC5E,UAAM,YAAY,OAAO;AAAA,EAC7B,CAAC;AACT;AAEA,eAAe,YAAY,SAA8D;AACrF,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,UAAU,IAAI,kBAAkB;AAGtC,QAAM,UAAyB;AAAA,IAC3B;AAAA,MACI,MAAM;AAAA,MACN,aAAa;AAAA,MACb,MAAMD,MAAK,KAAK,cAAc;AAAA,MAC9B,OAAO,YAAY;AACf,cAAM,UAAU,MAAM,QAAQ,YAAY,GAAG;AAC7C,eAAO,EAAE,QAAQ,QAAQ,SAAS,GAAG,OAAO,QAAQ,OAAO;AAAA,MAC/D;AAAA,MACA,OAAO,YAAY;AACf,cAAM,QAAQ,aAAa,GAAG;AAAA,MAClC;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQJ;AAEA,UAAQ,IAAI,wCAAiC;AAG7C,QAAM,mBAA8F,CAAC;AAErG,aAAW,UAAU,SAAS;AAC1B,UAAM,OAAO,MAAM,OAAO,MAAM;AAChC,QAAI,KAAK,QAAQ;AACb,uBAAiB,KAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,iBAAiB,WAAW,GAAG;AAC/B,YAAQ,IAAI,6BAAwB;AACpC;AAAA,EACJ;AAGA,MAAI,QAAQ,SAAS;AACjB,UAAM,eAAe,QAAQ,KAAK,OAAK,EAAE,SAAS,SAAS;AAC3D,QAAI,cAAc;AACd,YAAM,YAAY,cAAc,QAAQ,GAAG;AAAA,IAC/C;AACA;AAAA,EACJ;AAEA,MAAI,QAAQ,KAAK;AACb,eAAW,EAAE,OAAO,KAAK,kBAAkB;AACvC,YAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,IACzC;AACA;AAAA,EACJ;AAGA,UAAQ,IAAI,8BAA8B;AAC1C,aAAW,EAAE,QAAQ,KAAK,KAAK,kBAAkB;AAC7C,UAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,YAAY;AACzD,YAAQ,IAAI,eAAQ,OAAO,IAAI,GAAG,QAAQ,EAAE;AAC5C,YAAQ,IAAI,QAAQ,OAAO,WAAW,EAAE;AACxC,YAAQ,IAAI,cAAc,OAAO,IAAI;AAAA,CAAI;AAAA,EAC7C;AAEA,QAAM,SAAS,MAAME,QAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACL,GAAG,iBAAiB,IAAI,CAAC,EAAE,QAAQ,KAAK,OAAO;AAAA,QAC3C,MAAM,GAAG,OAAO,IAAI,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,YAAY,EAAE;AAAA,QACjE,OAAO,OAAO;AAAA,MAClB,EAAE;AAAA,MACF,EAAE,MAAM,uBAAgB,OAAO,MAAM;AAAA,MACrC,EAAE,MAAM,iBAAY,OAAO,SAAS;AAAA,IACxC;AAAA,EACJ,CAAC;AAED,MAAI,WAAW,UAAU;AACrB,YAAQ,IAAI,+BAA0B;AACtC;AAAA,EACJ;AAEA,MAAI,WAAW,OAAO;AAClB,eAAW,EAAE,OAAO,KAAK,kBAAkB;AACvC,YAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,IACzC;AAAA,EACJ,OAAO;AACH,UAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AAClD,QAAI,QAAQ;AACR,YAAM,YAAY,QAAQ,QAAQ,GAAG;AAAA,IACzC;AAAA,EACJ;AACJ;AAEA,eAAe,YAAY,QAAqB,aAAsC;AAClF,QAAM,OAAO,MAAM,OAAO,MAAM;AAEhC,MAAI,CAAC,KAAK,QAAQ;AACd,YAAQ,IAAI,UAAK,OAAO,IAAI,qBAAqB;AACjD;AAAA,EACJ;AAEA,QAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,YAAY;AAEzD,MAAI,CAAC,aAAa;AACd,UAAM,YAAY,MAAMC,SAAQ;AAAA,MAC5B,SAAS,UAAU,OAAO,IAAI,GAAG,QAAQ;AAAA,MACzC,SAAS;AAAA,IACb,CAAC;AAED,QAAI,CAAC,WAAW;AACZ,cAAQ,IAAI,yBAAe,OAAO,IAAI,EAAE;AACxC;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI;AACA,UAAM,OAAO,MAAM;AACnB,YAAQ,IAAI,kBAAa,OAAO,IAAI,GAAG,QAAQ,EAAE;AAAA,EACrD,SAAS,OAAO;AACZ,YAAQ,MAAM,0BAAqB,OAAO,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACjH;AACJ;;;ACjKA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,gBAAgB;AACzB,SAAS,eAAe;;;ACExB,SAAS,SAAS;AAElB,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACpC,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG;AACzC,CAAC;AAED,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,SAAS,EAAE,OAAO,EAAE,QAAQ,qBAAqB;AAAA,EACjD,MAAM,EAAE,OAAO;AAAA,IACb,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,IACxC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAChC,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACrC,CAAC;AAAA,EACD,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAChD,CAAC;AAED,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,SAAS,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,OAAO,EAAE,QAAQ,iCAAiC;AAAA,IAC3D,KAAK,EAAE,OAAO,EAAE,QAAQ,+BAA+B;AAAA,EACzD,CAAC;AAAA,EACD,SAAS,EAAE,KAAK,CAAC,aAAa,WAAW,CAAC,EAAE,QAAQ,WAAW;AACjE,CAAC;AAED,IAAM,uBAAuB,EAAE,OAAO;AAAA,EACpC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,aAAa,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,EACvF,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAC9B,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAG;AAAA,EAChD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAChD,OAAO,kBAAkB,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,IAAI,EAAE,OAAO;AAAA,EACb,YAAY,EAAE,OAAO;AACvB,CAAC;AAED,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,OAAO,EAAE,IAAI;AAAA,EACxB,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChC,SAAS;AAAA,EACT,WAAW,EAAE,OAAO,EAAE,QAAQ,eAAe;AAAA,EAC7C,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAAA,EACzC,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAAA,EACzC,UAAU,qBAAqB,QAAQ,CAAC,CAAC;AAC3C,CAAC;;;AD7CD,SAAS,aAAa;AACtB,SAAS,KAAAC,UAAS;AAMX,IAAM,uBAAN,MAA2B;AAAA,EACtB;AAAA,EAER,YAAY,YAAqB;AAC7B,SAAK,aAAa,cAAc,QAAQ,QAAQ,IAAI,GAAG,qBAAqB;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAA+B;AACjC,QAAI;AACA,YAAM,UAAU,MAAM,SAAS,KAAK,YAAY,OAAO;AACvD,YAAM,YAAY,MAAM,OAAO;AAE/B,aAAO,oBAAoB,MAAM,SAAS;AAAA,IAC9C,SAAS,OAAO;AACZ,UAAI,iBAAiBC,GAAE,UAAU;AAC7B,cAAM,IAAI,gBAAgB,oCAAoC,MAAM,OAAO,EAAE;AAAA,MACjF;AAEA,UAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU;AACtE,cAAM,IAAI,cAAc,iCAAiC,KAAK,UAAU,EAAE;AAAA,MAC9E;AAEA,YAAM,IAAI;AAAA,QACN,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC3F;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAgC;AACrC,QAAI;AACA,aAAO,oBAAoB,MAAM,MAAM;AAAA,IAC3C,SAAS,OAAO;AACZ,UAAI,iBAAiBA,GAAE,UAAU;AAC7B,cAAM,IAAI,gBAAgB,oCAAoC,MAAM,OAAO,EAAE;AAAA,MACjF;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACpB,WAAO,KAAK;AAAA,EAChB;AACJ;;;AE9DA,SAAS,SAAAC,cAAa;AACtB,OAAOC,aAAY;AACnB,OAAOC,aAAY;AAsEZ,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACE,SACO,QACA,UACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,EAAE;AAC/C,SAAK,iBAAiB,OAAO;AAC7B,SAAK,cAAc,OAAO,SAAS;AACnC,SAAK,mBAAmBA,QAAO,OAAO,SAAS,WAAW;AAAA,EAC5D;AAAA,EAEA,MAAc,QAAWC,OAAc,UAAuB,CAAC,GAAe;AAC5E,UAAM,MAAM,GAAG,KAAK,OAAO,GAAGA,KAAI;AAElC,UAAM,UAAU;AAAA,MACd,qBAAqB,KAAK;AAAA,MAC1B,gBAAgB;AAAA,MAChB,GAAG,QAAQ;AAAA,IACb;AAEA,UAAM,UAAU,YAAwB;AACtC,YAAM,WAAW,MAAMH,OAAM,KAAK;AAAA,QAChC,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,eAAe,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU;AAElE,YAAI;AACF,gBAAM,YAAa,MAAM,SAAS,KAAK;AACvC,cAAI,UAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,GAAG;AACvD,2BAAe,UAAU,OAAO,KAAK,IAAI;AAAA,UAC3C;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,cAAM,IAAI,gBAAgB,cAAc,SAAS,MAAM;AAAA,MACzD;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAC3D,eAAO,SAAS,KAAK;AAAA,MACvB;AAEA,aAAO,SAAS,KAAK;AAAA,IACvB;AAEA,WAAOC,QAAO,SAAS;AAAA,MACrB,SAAS,KAAK,YAAY;AAAA,MAC1B,iBAAiB,CAAC,UAAU;AAC1B,gBAAQ;AAAA,UACN,2BAA2B,MAAM,aAAa,IAAI,MAAM,cAAc,CAAC,MAAM,MAAM,OAAO;AAAA,QAC5F;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,YAAY,KAAK,YAAY;AAAA,MAC7B,YAAY,KAAK,YAAY,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAsC;AAC1C,QAAI;AACF,YAAM,KAAK,QAAgC,wBAAwB;AACnE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,iBAAiB;AACpC,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAqD;AACpE,WAAO,KAAK,QAAgC,aAAa,UAAU,OAAO;AAAA,EAC5E;AAAA,EAEA,MAAM,SAAS,SAAiB,SAAmD;AACjF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,aAAO,OAAO,WAAW,QAAQ,KAAK,GAAG,CAAC;AAAA,IAC5C;AAEA,UAAME,QAAO,WAAW,OAAO,QAAQ,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AACvF,WAAO,KAAK,QAA8BA,KAAI;AAAA,EAChD;AAAA,EAEA,MAAM,UACJ,WACA,UAMI,CAAC,GAC2B;AAChC,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,OAAO,cAAc,UAAU,SAAS,CAAC;AAEhD,QAAI,QAAQ,UAAU,QAAQ,WAAW,KAAK;AAC5C,aAAO,OAAO,aAAa,QAAQ,MAAM;AAAA,IAC3C;AAEA,QAAI,QAAQ,UAAU;AACpB,aAAO,OAAO,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,IACpD;AAEA,QAAI,QAAQ,QAAQ;AAClB,aAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AAAA,IACnD;AAEA,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,aAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,GAAG,CAAC;AAAA,IACpD;AAEA,QAAI,QAAQ,cAAc;AACxB,aAAO,OAAO,cAAc,KAAK,QAAQ,YAAY,EAAE;AAAA,IACzD;AAEA,UAAMA,QAAO,gBAAgB,OAAO,SAAS,CAAC;AAC9C,WAAO,KAAK,QAA+BA,KAAI;AAAA,EACjD;AAAA,EAEA,MAAM,aACJ,WACA,UAMI,CAAC,GACoB;AACzB,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,YAA4B,CAAC;AACnC,QAAI,SAAS;AACb,QAAI,UAAU;AAEd,WAAO,SAAS;AACd,YAAM,WAAW,MAAM,KAAK,UAAU,WAAW;AAAA,QAC/C,GAAG;AAAA,QACH;AAAA,QACA;AAAA,MACF,CAAC;AAED,gBAAU,KAAK,GAAG,SAAS,MAAM;AAEjC,UAAI,QAAQ,YAAY;AACtB,gBAAQ,WAAW,UAAU,QAAQ,SAAS,WAAW;AAAA,MAC3D;AAEA,gBAAU,UAAU,SAAS,SAAS;AACtC,gBAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBACJ,WACA,UAMI,CAAC,GACoB;AACzB,UAAM,WAAW,QAAQ,YAAY;AAGrC,UAAM,kBAAkB,MAAM,KAAK,UAAU,WAAW;AAAA,MACtD,GAAG;AAAA,MACH,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,aAAa,gBAAgB;AACnC,UAAM,aAAa,KAAK,KAAK,aAAa,QAAQ;AAElD,UAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,UAAU;AACpE,YAAM,SAAS,QAAQ;AAEvB,aAAO,KAAK,iBAAiB,YAAY;AACvC,cAAM,WAAW,MAAM,KAAK,UAAU,WAAW;AAAA,UAC/C,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,QAAQ,YAAY;AACtB,kBAAQ,WAAW,SAAS,SAAS,OAAO,QAAQ,UAAU;AAAA,QAChE;AAEA,eAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,cAAc,MAAM,QAAQ,IAAI,YAAY;AAClD,WAAO,YAAY,KAAK;AAAA,EAC1B;AACF;;;ACjRA,eAAsB,kBAAkB,QAAoD;AAC1F,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAE1C,MAAI;AACF,UAAM,cAAc,MAAM,OAAO,kBAAkB;AAEnD,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,UACP,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM,OAAO,WAAW,OAAO,QAAQ,UAAU;AAEzE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,wDAAwD,gBAAgB,QAAQ,IAAI;AAAA,MAC7F,SAAS;AAAA,QACP,SAAS,OAAO;AAAA,QAChB,SAAS,gBAAgB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,iBAAiB;AACpC,UAAI,UAAU,sBAAsB,MAAM,OAAO;AAEjD,UAAI,MAAM,WAAW,KAAK;AACxB,kBAAU;AAAA,MACZ,WAAW,MAAM,WAAW,KAAK;AAC/B,kBAAU;AAAA,MACZ,WAAW,MAAM,WAAW,KAAK;AAC/B,kBAAU,YAAY,OAAO,QAAQ,UAAU;AAAA,MACjD;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,SAAS;AAAA,UACP,SAAS,OAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACrF,SAAS;AAAA,QACP,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AJ3DO,SAAS,4BAAqC;AACjD,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,4BAA4B,EACxC,OAAO,uBAAuB,oBAAoB,qBAAqB,EACvE,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAA0B;AACrC,UAAM,mBAAmB,OAAO;AAAA,EACpC,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,mBAAmB,SAAsC;AACpE,QAAM,gBAAgB,IAAI,qBAAqB,QAAQ,MAAM;AAC7D,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAM,SAAS,MAAM,kBAAkB,MAAM;AAE7C,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACH,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAI,UAAK,OAAO,OAAO;AAC/B,UAAI,OAAO,SAAS,SAAS;AACzB,gBAAQ;AAAA,UACJ,eAAe,OAAO,QAAQ,QAAQ,IAAI,KAAK,OAAO,QAAQ,QAAQ,UAAU;AAAA,QACpF;AACA,gBAAQ,IAAI,kBAAkB,OAAO,QAAQ,QAAQ,EAAE,EAAE;AAAA,MAC7D;AAAA,IACJ,OAAO;AACH,cAAQ,MAAM,UAAK,OAAO,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACJ;;;AK9CA,SAAS,WAAAC,iBAAe;;;ACAxB,SAAS,WAAAC,UAAS,gBAAgB;;;AC+B3B,SAAS,sBAAsB,OAAuC;AAC3E,QAAM,cAAgC;AAAA,IACpC,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM,OAAO;AAAA,IACrB,UAAU,MAAM,SAAS;AAAA,IACzB,QAAQ,MAAM,OAAO;AAAA,IACrB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,MAAM,QAAQ;AAAA,EACzB;AAEA,MAAI,MAAM,aAAa;AACrB,gBAAY,cAAc,MAAM,YAAY;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,MAAM,UAAU,SAAS,GAAG;AACjD,gBAAY,YAAY,MAAM,UAAU,IAAI,CAAC,cAAc;AAAA,MACzD,MAAM,SAAS;AAAA,MACf,UAAU,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,IAClB,EAAE;AAAA,EACJ;AAEA,MAAI,MAAM,eAAe,MAAM,YAAY,SAAS,GAAG;AACrD,gBAAY,cAAc,MAAM,YAAY,IAAI,CAAC,gBAAgB;AAAA,MAC/D,IAAI,WAAW;AAAA,MACf,UAAU,WAAW;AAAA,MACrB,UAAU,WAAW;AAAA,MACrB,cAAc,WAAW;AAAA,MACzB,QAAQ,WAAW,OAAO;AAAA,MAC1B,YAAY,WAAW;AAAA,MACvB,aAAa,WAAW;AAAA,IAC1B,EAAE;AAAA,EACJ;AAEA,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,UAAM,cAAc,MAAM,SAAS;AAAA,MAAO,CAAC,QAAQ,YACjD,QAAQ,KAAK,OAAO,KAAK,UAAU;AAAA,IACrC;AACA,gBAAY,gBAAgB,YAAY;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,UAAU;AAEd,MAAI,MAAM,aAAa;AACrB,eAAW,MAAM;AAAA,EACnB;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,UAA4B,QAAgC;AAChG,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AAEf,QAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAClD,QAAI,OAAO,YAAY,aAAa;AAClC,aAAO,EAAE,KAAK,EAAE;AAAA,IAClB;AACA,WAAO,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ;AAAA,EAC3E,CAAC;AAED,aAAW,WAAW,gBAAgB;AACpC,QAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,KAAK,MAAM,IAAI;AACjD;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,KAAK,QAAQ,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACpE,UAAM,OAAO,IAAI,KAAK,QAAQ,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC;AAErF,gBAAY,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI;AAAA;AAAA;AACrD,gBAAY,GAAG,QAAQ,KAAK;AAAA;AAAA;AAE5B,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,kBAAY;AACZ,iBAAW,UAAU,QAAQ,SAAS;AACpC,cAAM,WAAW,OAAO,aAAa;AACrC,cAAM,WAAW,OAAO,aAAa;AACrC,oBAAY,KAAK,OAAO,IAAI,KAAK,QAAQ,WAAM,QAAQ;AAAA;AAAA,MACzD;AACA,kBAAY;AAAA,IACd;AAEA,gBAAY;AAAA,EACd;AAEA,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,mBACd,aACA,eACkB;AAClB,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,YAAY,OAAO,CAAC,YAAY,QAAQ,KAAK,aAAa;AACnE;AAEO,SAAS,kBACd,aACA,kBACS;AACT,QAAM,iBAAiB,iBAAiB;AACxC,QAAM,kBAAkB,YAAY;AAEpC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,cAAc;AAC5D;AAEO,SAAS,qBACd,gBACA,kBACS;AACT,QAAM,qBAAqB,iBAAiB;AAE5C,MAAI,CAAC,oBAAoB;AACvB,WAAO,eAAe,SAAS;AAAA,EACjC;AAEA,SAAO,eAAe,KAAK,CAAC,YAAY,QAAQ,KAAK,kBAAkB;AACzE;;;ACrKA,OAAO,aAAa;AAGb,SAAS,aACd,OACA,QACA,gBAA6B,oBAAI,IAAI,GAC7B;AACR,MAAI,OAAO,QAAQ,OAAO;AAAA,IACxB,OAAO,OAAO;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,SAAO,KAAK,UAAU,GAAG,OAAO,SAAS;AAEzC,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AAChB,MAAI,UAAU;AAEd,SAAO,cAAc,IAAI,SAAS,GAAG;AACnC,UAAM,SAAS,IAAI,OAAO;AAC1B,UAAM,YAAY,OAAO,YAAY,OAAO;AAC5C,gBAAY,GAAG,KAAK,UAAU,GAAG,SAAS,CAAC,GAAG,MAAM;AACpD;AAAA,EACF;AAEA,gBAAc,IAAI,SAAS;AAC3B,SAAO;AACT;AAEO,SAAS,iBACd,SACA,OACA,QACA,gBAA6B,oBAAI,IAAI,GAC7B;AACR,QAAM,OAAO,aAAa,OAAO,OAAO,MAAM,aAAa;AAE3D,SAAO,OAAO,QAAQ,QAAQ,aAAa,QAAQ,SAAS,CAAC,EAAE,QAAQ,UAAU,IAAI;AACvF;;;AC3CA,SAAS,YAAAC,WAAU,WAAW,aAAa;AAC3C,SAAS,eAAe;AACxB,OAAOC,aAAY;AAgBnB,eAAsB,UAAU,UAAiC;AAC/D,QAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACtC;AAEA,eAAsB,iBAAiB,UAA2C;AAChF,MAAI;AACF,UAAM,UAAU,MAAMD,UAAS,UAAU,OAAO;AAChD,WAAO,qBAAqB,OAAO;AAAA,EACrC,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,QACL,aAAa,CAAC;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,qBAAqB,SAAiC;AACpE,MAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAIC,QAAO,OAAO;AAE3D,QAAM,WAAW,uBAAuB,IAAI;AAC5C,QAAM,cAAc,sBAAsB,IAAI;AAE9C,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAEO,SAAS,uBAAuB,SAAgC;AACrE,QAAM,aAAa,QAAQ,MAAM,iCAAiC;AAClE,QAAM,WAAW,QAAQ,MAAM,+BAA+B;AAE9D,MAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,QAAQ,WAAW,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE;AAClE,QAAM,WAAW,QAAQ,QAAQ,SAAS,CAAC,CAAC;AAE5C,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,UAAU,YAAY,QAAQ,EAAE,KAAK;AACtD;AAEO,SAAS,sBAAsB,SAAyB;AAC7D,QAAM,aAAa,QAAQ,MAAM,iCAAiC;AAClE,QAAM,WAAW,QAAQ,MAAM,+BAA+B;AAE9D,MAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,QAAQ,WAAW,CAAC,CAAC;AAChD,QAAM,WAAW,QAAQ,QAAQ,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,EAAE;AAE5D,SAAO,QAAQ,UAAU,GAAG,UAAU,IAAI,QAAQ,UAAU,QAAQ,EAAE,KAAK;AAC7E;AAEO,SAAS,qBAAqB,MAAoB,QAAgC;AACvF,MAAI,UAAU;AAEd,MAAI,OAAO,KAAK,KAAK,WAAW,EAAE,SAAS,GAAG;AAC5C,UAAM,kBAAkBA,QAAO,UAAU,IAAI,KAAK,WAAW,EAAE,QAAQ,qBAAqB,EAAE;AAC9F,eAAW;AAAA,EAAQ,eAAe;AAAA;AAAA;AAAA,EACpC;AAEA,aAAW,KAAK;AAEhB,MAAI,KAAK,UAAU;AACjB,eAAW;AAAA;AAAA,EAAO,OAAO,QAAQ,KAAK;AAAA,EAAK,KAAK,QAAQ;AAAA,EAAK,OAAO,QAAQ,GAAG;AAAA,EACjF;AAEA,SAAO;AACT;AAEA,eAAsB,kBACpB,UACA,MACA,QACe;AACf,QAAM,UAAU,QAAQ;AACxB,QAAM,UAAU,qBAAqB,MAAM,MAAM;AACjD,QAAM,UAAU,UAAU,SAAS,OAAO;AAC5C;AAEO,SAAS,8BAA8B,aAAqD;AACjG,QAAM,KAAK,YAAY;AACvB,MAAI,OAAO,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,UAAU;AAC1B,UAAM,SAAS,SAAS,IAAI,EAAE;AAC9B,WAAO,MAAM,MAAM,IAAI,OAAO;AAAA,EAChC;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,aAAqD;AACxF,QAAM,gBAAgB,YAAY;AAClC,MAAI,OAAO,kBAAkB,UAAU;AACrC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,kBAAkB,UAAU;AACrC,UAAM,SAAS,SAAS,eAAe,EAAE;AACzC,WAAO,MAAM,MAAM,IAAI,OAAO;AAAA,EAChC;AACA,SAAO;AACT;;;AH1GA,eAAsB,UACpB,SACA,QACA,UAA4B,CAAC,GACH;AAC1B,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,QAAM,YAAY,QAAQ,aAAa,OAAO;AAE9C,MAAI;AACF,UAAM,UAAU,OAAO,SAAS;AAChC,UAAM,WAAW,MAAM,OAAO,SAAS,SAAS,OAAO;AACvD,UAAM,QAAQ,SAAS;AAEvB,UAAM,WAAW,iBAAiB,MAAM,IAAI,MAAM,SAAS,OAAO,QAAQ;AAC1E,UAAM,WAAWC,SAAQ,WAAW,QAAQ;AAC5C,UAAM,eAAe,SAAS,QAAQ,IAAI,GAAG,QAAQ;AAErD,UAAM,eAAe,MAAM,iBAAiB,QAAQ;AACpD,UAAM,kBAAkB,8BAA8B,aAAa,WAAW;AAC9E,UAAM,wBAAwB,qBAAqB,aAAa,WAAW;AAE3E,QAAI,mBAAmB,oBAAoB,MAAM,IAAI;AACnD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,QAAQ,QAAQ,mBAAmB,eAAe,SAAS,MAAM,EAAE;AAAA,MAC9E;AAAA,IACF;AAEA,UAAM,cAAc,kBAAkB,OAAO,aAAa,WAAW;AACrE,UAAM,sBAAsB;AAAA,MAC1B,MAAM,YAAY,CAAC;AAAA,MACnB,aAAa;AAAA,IACf;AAEA,QAAI,CAAC,eAAe,CAAC,qBAAqB;AACxC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,SAAS,OAAO;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,cAAc,sBAAsB,KAAK;AAC/C,UAAM,UAAU,kBAAkB,KAAK;AAEvC,QAAI;AACJ,QAAI,uBAAuB,MAAM,UAAU;AACzC,YAAM,cAAc,mBAAmB,MAAM,UAAU,qBAAqB;AAC5E,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,cAAc,sBAAsB,aAAa,OAAO,QAAQ;AACtE,YAAI,aAAa,UAAU;AACzB,qBAAW,GAAG,aAAa,QAAQ;AAAA;AAAA;AAAA;AAAA,EAAc,WAAW;AAAA,QAC9D,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,mBAAW,aAAa,YAAY;AAAA,MACtC;AAAA,IACF,OAAO;AACL,iBAAW,aAAa,YAAY;AAAA,IACtC;AAEA,UAAM,UAAsC,CAAC;AAC7C,QAAI,aAAa;AACf,cAAQ,cAAc;AACtB,cAAQ,UAAU;AAAA,IACpB;AACA,QAAI,qBAAqB;AACvB,cAAQ,WAAW;AAAA,IACrB;AAEA,QAAI,QAAQ,QAAQ;AAClB,YAAMC,UAAS,kBAAkB,YAAY;AAC7C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,QACV,QAAAA;AAAA,QACA,SAAS,SAASA,OAAM,UAAU,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT;AAEA,UAAM,SAAS,kBAAkB,YAAY;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,MAAM;AAAA,MACf;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,SAAS,gBAAgB,MAAM,UAAU,OAAO;AAAA,MAChD;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS,wBAAwB,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrG;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,KAA4B;AAChE,QAAM,QAAQ,IAAI,MAAM,yBAAyB;AACjD,MAAI,OAAO;AACT,UAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,WAAO,MAAM,OAAO,IAAI,OAAO;AAAA,EACjC;AACA,SAAO;AACT;;;ADvJO,SAAS,yBAAkC;AAC9C,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,qBAAqB,EACjC,OAAO,qBAAqB,UAAU,EACtC,OAAO,mBAAmB,WAAW,EACrC,OAAO,aAAa,gCAAgC,EACpD,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAA8B;AACzC,UAAM,gBAAgB,OAAO;AAAA,EACjC,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,gBAAgB,SAA0C;AACrE,QAAM,gBAAgB,IAAI,qBAAqB,QAAQ,MAAM;AAC7D,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI;AAEJ,MAAI,QAAQ,IAAI;AACZ,cAAU,SAAS,QAAQ,IAAI,EAAE;AACjC,QAAI,MAAM,OAAO,GAAG;AAChB,YAAM,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AAAA,EACJ,WAAW,QAAQ,KAAK;AACpB,UAAM,cAAc,sBAAsB,QAAQ,GAAG;AACrD,QAAI,CAAC,aAAa;AACd,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACnE;AACA,cAAU;AAAA,EACd,OAAO;AACH,UAAM,IAAI,gBAAgB,uCAAuC;AAAA,EACrE;AAEA,QAAM,SAAS,MAAM,UAAU,SAAS,QAAQ;AAAA,IAC5C,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,EACvB,CAAC;AAED,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACH,QAAI,OAAO,SAAS;AAChB,YAAM,OAAO,OAAO,WAAW,YAAY,iBAAO;AAClD,cAAQ,IAAI,GAAG,IAAI,IAAI,OAAO,OAAO,EAAE;AACvC,UAAI,OAAO,UAAU;AACjB,gBAAQ,IAAI,YAAY,OAAO,QAAQ,EAAE;AAAA,MAC7C;AAAA,IACJ,OAAO;AACH,cAAQ,MAAM,UAAK,OAAO,OAAO;AACjC,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACJ;;;AKzEA,SAAS,WAAAC,iBAAe;;;AC4BxB,eAAsB,YACpB,QACA,UAA8B,CAAC,GACH;AAC5B,QAAM,SAAS,IAAI,iBAAiB,MAAM;AAC1C,QAAM,WAAW,QAAQ,YAAY,OAAO,SAAS;AAErD,QAAM,SAA4B;AAAA,IAChC,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,sBAAsB,OAAO,QAAQ,IAAI;AAAA,MACnE,QAAQ,QAAQ,UAAU,OAAO,SAAS;AAAA,MAC1C;AAAA,MACA,SAAS,OAAO,SAAS;AAAA,MACzB,cAAc,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,IACtB,CAAC;AAED,WAAO,cAAc,OAAO;AAE5B,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,OAAO,IAAI,OAAO,UAAU;AAC/C,YAAM,aAAa,MAAM,UAAU,MAAM,IAAI,QAAQ;AAAA,QACnD,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,MACrB,CAAC;AAED,aAAO;AAEP,UAAI,WAAW,SAAS;AACtB,gBAAQ,WAAW,QAAQ;AAAA,UACzB,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,UACF,KAAK;AACH,mBAAO;AACP;AAAA,QACJ;AAAA,MACF,OAAO;AACL,eAAO;AACP,eAAO,OAAO,KAAK;AAAA,UACjB,SAAS,WAAW;AAAA,UACpB,OAAO,WAAW;AAAA,QACpB,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,QAAQ,IAAI,YAAY;AAE9B,WAAO,UAAU,OAAO,WAAW;AACnC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,UAAU;AACjB,WAAO,OAAO,KAAK;AAAA,MACjB,SAAS;AAAA,MACT,OAAO,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC1F,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;ADtFO,SAAS,2BAAoC;AAChD,QAAM,MAAM,IAAIC,UAAQ,SAAS,EAC5B,YAAY,8BAA8B,EAC1C,OAAO,yBAAyB,iCAAiC,GAAG,EACpE,OAAO,0BAA0B,2CAA2C,EAC5E,OAAO,0BAA0B,+BAA+B,EAChE,OAAO,wBAAwB,4BAA4B,EAC3D,OAAO,aAAa,gCAAgC,EACpD,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,2BAA2B,kBAAkB,EACpD,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,YAAgC;AAC3C,UAAM,kBAAkB,OAAO;AAAA,EACnC,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,kBAAkB,SAA4C;AACzE,QAAM,gBAAgB,IAAI,qBAAqB,QAAQ,MAAM;AAC7D,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,QAAM,cAAiD;AAAA,IACnD,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,GAAI,QAAQ,eAAe,EAAE,aAAa,SAAS,QAAQ,aAAa,EAAE,EAAE;AAAA,IAC5E,GAAI,QAAQ,YAAY,EAAE,UAAU,SAAS,QAAQ,UAAU,EAAE,EAAE;AAAA,IACnE,YAAY,QAAQ,OACd,SACA,CAAC,SAAiB,UAAkB;AAClC,cAAQ,OAAO,MAAM,eAAe,OAAO,IAAI,KAAK,SAAS;AAAA,IACjE;AAAA,EACR;AAEA,QAAM,SAAS,MAAM,YAAY,QAAQ,WAAW;AAEpD,MAAI,CAAC,QAAQ,MAAM;AACf,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC7B;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/C,OAAO;AACH,QAAI,OAAO,SAAS;AAChB,cAAQ,IAAI,oCAA+B;AAC3C,cAAQ,IAAI,oBAAoB,OAAO,WAAW,EAAE;AACpD,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,UAAI,OAAO,SAAS,GAAG;AACnB,gBAAQ,IAAI,cAAc,OAAO,MAAM,EAAE;AAAA,MAC7C;AAAA,IACJ,OAAO;AACH,cAAQ,IAAI,mCAA8B;AAC1C,cAAQ,IAAI,oBAAoB,OAAO,WAAW,EAAE;AACpD,cAAQ,IAAI,iBAAiB,OAAO,SAAS,EAAE;AAC/C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,eAAe,OAAO,OAAO,EAAE;AAC3C,cAAQ,IAAI,cAAc,OAAO,MAAM,EAAE;AAEzC,UAAI,OAAO,OAAO,SAAS,GAAG;AAC1B,gBAAQ,IAAI,WAAW;AACvB,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC7B,kBAAQ,IAAI,YAAY,MAAM,OAAO,KAAK,MAAM,KAAK,EAAE;AAAA,QAC3D,CAAC;AAAA,MACL;AAEA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AACJ;;;AE3FA,SAAS,WAAAC,iBAAe;AAGxB,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAOjB,SAAS,oBAA6B;AACzC,QAAM,MAAM,IAAIC,UAAQ,MAAM,EACzB,YAAY,2CAA2C,EACvD,OAAO,UAAU,gBAAgB,EACjC,OAAO,aAAa,2BAA2B,EAC/C,OAAO,OAAO,YAAyB;AACpC,UAAM,WAAW,OAAO;AAAA,EAC5B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,WAAW,SAAqC;AAC3D,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,QAAM,gBAAgBF,MAAKC,SAAQ,GAAG,SAAS,WAAW;AAC1D,QAAM,gBAAgB,MAAME,kBAAiB;AAE7C,QAAM,OAAO;AAAA,IACT,YAAY,cAAc,cAAc;AAAA,IACxC,QAAQ,OAAO;AAAA,IACf,WAAWC,SAAQ,OAAO,SAAS;AAAA,IACnC,SAAS,OAAO,WAAW;AAAA,IAC3B,aAAa,OAAO,eAAe;AAAA,IACnC;AAAA,IACA;AAAA,EACJ;AAEA,MAAI,QAAQ,MAAM;AACd,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,EACJ;AAEA,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,oGAAoB;AAChC,UAAQ,IAAI,uBAAuB,KAAK,UAAU,EAAE;AACpD,UAAQ,IAAI,uBAAuB,KAAK,MAAM,EAAE;AAChD,UAAQ,IAAI,uBAAuB,KAAK,SAAS,EAAE;AACnD,UAAQ,IAAI,uBAAuB,KAAK,OAAO,EAAE;AACjD,UAAQ,IAAI,uBAAuB,KAAK,WAAW,EAAE;AACrD,UAAQ,IAAI,uBAAuB,KAAK,aAAa,EAAE;AACvD,UAAQ,IAAI;AACZ,UAAQ,IAAI,iBAAiB;AAC7B,UAAQ,IAAI,uBAAuB,KAAK,cAAc,SAAS,WAAM,QAAG,EAAE;AAC1E,MAAI,KAAK,cAAc,QAAQ;AAC3B,YAAQ,IAAI,uBAAuB,KAAK,cAAc,WAAW,SAAS,EAAE;AAAA,EAChF;AACJ;AAEA,SAASA,SAAQ,KAAqB;AAClC,MAAI,IAAI,UAAU,EAAG,QAAO;AAC5B,SAAO,SAAS,IAAI,MAAM,EAAE;AAChC;AAEA,eAAeD,oBAAmE;AAC9E,QAAM,cAAcH,MAAK,QAAQ,IAAI,GAAG,OAAO;AAC/C,MAAI;AACA,UAAMD,IAAG,OAAO,WAAW;AAE3B,WAAO,EAAE,QAAQ,MAAM,SAAS,SAAS;AAAA,EAC7C,QAAQ;AACJ,WAAO,EAAE,QAAQ,MAAM;AAAA,EAC3B;AACJ;;;AChFA,SAAS,WAAAM,iBAAe;AACxB,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,iBAAgB;AAOzB,IAAMC,UAAS;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACV;AAKO,SAAS,0BAAmC;AAC/C,SAAO,IAAIC,UAAQ,aAAa,EAC3B,YAAY,0CAA0C,EACtD,OAAO,WAAW,2CAA2C,EAC7D,OAAO,WAAW,mCAAmC,EACrD,OAAO,OAAO,YAAkD;AAC7D,UAAM,iBAAiB,OAAO;AAAA,EAClC,CAAC;AACT;AAEA,eAAe,iBAAiB,SAA+C;AAC3E,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,SAAS,MAAM,cAAc,KAAK;AAExC,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,gBAAgB,yCAAyC;AAAA,EACvE;AAEA,MAAI;AAEA,YAAQ,IAAI,GAAGD,QAAO,IAAI,oCAA6BA,QAAO,KAAK,EAAE;AAErE,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,MAAM,wBAAwB;AAAA,MACjE,SAAS;AAAA,QACL,mBAAmB,OAAO;AAAA,MAC9B;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAK;AAAA;AAAA,IACrC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,gCAAgC,SAAS,UAAU,EAAE;AAAA,IACzE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,gBAAgB,KAAK;AAC3B,UAAM,iBAAiB,gBAAY;AAEnC,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,mBAAmBA,QAAO,KAAK,IAAI,cAAc,EAAE;AAC/E,YAAQ,IAAI,GAAGA,QAAO,IAAI,kBAAkBA,QAAO,KAAK,KAAK,aAAa;AAAA,CAAI;AAE9E,QAAI,CAACE,gBAAe,eAAe,cAAc,GAAG;AAChD,cAAQ,IAAI,GAAGF,QAAO,KAAK,+CAA0CA,QAAO,KAAK;AAAA,CAAI;AACrF;AAAA,IACJ;AAGA,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK,EAAE;AACzG,YAAQ,IAAI,GAAGA,QAAO,MAAM,SAAIA,QAAO,KAAK,KAAKA,QAAO,IAAI,kCAAwBA,QAAO,KAAK,IAAI,cAAc,WAAMA,QAAO,IAAI,GAAG,aAAa,GAAGA,QAAO,KAAK,qBAAqBA,QAAO,MAAM,SAAIA,QAAO,KAAK,EAAE;AACtN,YAAQ,IAAI,GAAGA,QAAO,MAAM,2WAA+DA,QAAO,KAAK;AAAA,CAAI;AAG3G,QAAI,QAAQ,OAAO;AACf,cAAQ,IAAI,GAAGA,QAAO,IAAI,wDAAwDA,QAAO,KAAK;AAAA,CAAI;AAClG;AAAA,IACJ;AAGA,QAAI,CAAC,QAAQ,OAAO;AAChB,YAAM,eAAe,MAAMG,SAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,cAAc;AACf,gBAAQ,IAAI,GAAGH,QAAO,MAAM,kCAAwBA,QAAO,KAAK;AAAA,CAAI;AACpE;AAAA,MACJ;AAAA,IACJ;AAGA,YAAQ,IAAI;AAAA,EAAKA,QAAO,IAAI,yCAAkCA,QAAO,KAAK;AAAA,CAAI;AAE9E,QAAI;AAEA,YAAMI,kBAAiBC,sBAAqB;AAC5C,YAAM,iBAAiBC,mBAAkBF,eAAc;AAEvD,cAAQ,IAAI,GAAGJ,QAAO,IAAI,SAASI,eAAc,MAAMJ,QAAO,KAAK,EAAE;AAGrE,MAAAO,UAAS,gBAAgB;AAAA,QACrB,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,KAAK,aAAa,IAAI;AAAA,MAC5C,CAAC;AAED,cAAQ,IAAI;AAAA,EAAKP,QAAO,KAAK,0CAAqC,aAAa,IAAIA,QAAO,KAAK;AAAA,CAAI;AAGnG,kBAAY,eAAe;AAAA,QACvB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,iBAAiBI;AAAA,MACrB,CAAC;AAAA,IAEL,SAAS,OAAO;AACZ,cAAQ,MAAM;AAAA,EAAKJ,QAAO,GAAG,wBAAmBA,QAAO,KAAK,EAAE;AAC9D,cAAQ,MAAM,GAAGA,QAAO,GAAG,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,GAAGA,QAAO,KAAK;AAAA,CAAI;AAChH,cAAQ,MAAM,GAAGA,QAAO,MAAM,gDAAyCA,QAAO,KAAK,EAAE;AACrF,cAAQ,MAAM,MAAMA,QAAO,IAAI,4CAA4CA,QAAO,KAAK;AAAA,CAAI;AAC3F,YAAM;AAAA,IACV;AAAA,EAEJ,SAAS,OAAO;AACZ,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,iBAAiB,GAAG;AACrE,YAAM,IAAI,gBAAgB,yEAAyE;AAAA,IACvG;AACA,UAAM;AAAA,EACV;AACJ;AAKA,SAASE,gBAAe,QAAgB,OAAwB;AAC5D,QAAM,cAAc,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,QAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAE9C,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,IAAI,WAAW,CAAC,KAAK;AAE3B,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAAA,EACtB;AAEA,SAAO;AACX;AAKA,SAASG,wBAAwD;AAE7D,QAAM,YAAY,QAAQ,IAAI,yBAAyB;AAEvD,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,KAAK,EAAG,QAAO;AAGtC,MAAI;AACA,IAAAE,UAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACX,QAAQ;AAAA,EAER;AAEA,MAAI;AACA,IAAAA,UAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAC9C,WAAO;AAAA,EACX,QAAQ;AAAA,EAER;AAEA,MAAI;AACA,IAAAA,UAAS,iBAAiB,EAAE,OAAO,SAAS,CAAC;AAC7C,WAAO;AAAA,EACX,QAAQ;AAAA,EAER;AAGA,SAAO;AACX;AAKA,SAASD,mBAAkBF,iBAAyD;AAChF,QAAM,cAAc;AAEpB,UAAQA,iBAAgB;AAAA,IACpB,KAAK;AACD,aAAO,eAAe,WAAW;AAAA,IACrC,KAAK;AACD,aAAO,mBAAmB,WAAW;AAAA,IACzC,KAAK;AACD,aAAO,cAAc,WAAW;AAAA,IACpC,KAAK;AAAA,IACL;AACI,aAAO,kBAAkB,WAAW;AAAA,EAC5C;AACJ;;;AC3MA,SAAS,WAAAI,iBAAe;AACxB,SAAS,WAAAC,gBAAe;AAGjB,SAAS,4BAAqC;AACjD,SAAO,IAAIC,UAAQ,eAAe,EAC7B,YAAY,oBAAoB,EAChC,OAAO,aAAa,mBAAmB,EACvC,OAAO,OAAO,YAAY;AACvB,UAAM,UAAU,IAAI,kBAAkB;AACtC,UAAM,UAAU,MAAM,QAAQ,YAAY,QAAQ,IAAI,CAAC;AAEvD,QAAI,QAAQ,WAAW,GAAG;AACtB,cAAQ,IAAI,mBAAmB;AAC/B;AAAA,IACJ;AAEA,YAAQ,IAAI,SAAS,QAAQ,MAAM,aAAa;AAChD,QAAI,QAAQ,UAAU,GAAG;AACrB,cAAQ,QAAQ,OAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC;AAAA,IAC/C,OAAO;AACH,cAAQ,MAAM,GAAG,CAAC,EAAE,QAAQ,OAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC;AACvD,cAAQ,IAAI,aAAa,QAAQ,SAAS,CAAC,OAAO;AAAA,IACtD;AACA,YAAQ,IAAI;AAEZ,QAAI,CAAC,QAAQ,KAAK;AACd,YAAM,KAAK,MAAMC,SAAQ,EAAE,SAAS,uBAAuB,SAAS,MAAM,CAAC;AAC3E,UAAI,CAAC,GAAI;AAAA,IACb;AAEA,UAAM,QAAQ,aAAa,QAAQ,IAAI,CAAC;AACxC,YAAQ,IAAI,yBAAoB;AAAA,EACpC,CAAC;AACT;;;AClCA,SAAS,WAAAC,iBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,UAAS,UAAAC,eAAc;AAC1C,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,cAAAC,mBAAkB;AAS3B,IAAMC,sBAAoD;AAAA,EACtD,WAAW;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,4BAA4B;AAAA,MAC5B,8BAA8B;AAAA,MAC9B,+BAA+B;AAAA,MAC/B,kDAAkD;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA;AAAA,MAEN,6DAA6D;AAAA,MAC7D,8CAA8C;AAAA,MAC9C,yCAAyC;AAAA,MACzC,8BAA8B;AAAA;AAAA,MAE9B,gDAAgD;AAAA;AAAA,MAEhD,iBAAiB;AAAA;AAAA,MAEjB,mBAAmB;AAAA;AAAA,MAEnB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,wBAAwB;AAAA;AAAA,MAExB,8BAA8B;AAAA,IAClC;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACD,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,eAAe;AAAA,MACf,+BAA+B;AAAA,MAC/B,2BAA2B;AAAA,MAC3B,YAAY;AAAA,MACZ,uBAAuB;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,wBAAwB;AAAA,QACpB,sBAAsB;AAAA,QACtB,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACtB;AAAA,MACA,iBAAiB;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,mBAAmB;AAAA;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,kBAAkB;AAAA,QACd,mBAAmB;AAAA,QACnB,uBAAuB;AAAA,QACvB,oBAAoB;AAAA,QACpB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,aAAa;AAAA,MACjB;AAAA,MACA,yBAAyB;AAAA,IAC7B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,yBAAyB;AAAA,MACzB,+BAA+B;AAAA,MAC/B,eAAe;AAAA,MACf,oCAAoC;AAAA,IACxC;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,0BAA0B;AAAA,MAC1B,2BAA2B;AAAA,MAC3B,kCAAkC;AAAA,MAClC,8BAA8B;AAAA,MAC9B,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAC1B,iCAAiC;AAAA,MACjC,oCAAoC;AAAA,MACpC,2BAA2B;AAAA,QACvB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,WAAW;AAAA,MACf;AAAA,MACA,gCAAgC;AAAA,MAChC,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACN,iCAAiC;AAAA,MACjC,+BAA+B;AAAA,MAC/B,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA;AAAA,MAC7B,2BAA2B;AAAA,IAC/B;AAAA,EACJ;AACJ;AAEO,SAAS,sBAA+B;AAC3C,QAAM,gBAAgB,IAAIP,UAAQ,QAAQ,EACrC,YAAY,kFAA2C;AAG5D,gBAAc,OAAO,YAAY;AAC7B,UAAMQ,iBAAgB;AAAA,EAC1B,CAAC;AAGD,gBACK,QAAQ,QAAQ,EAChB,YAAY,yDAA+B,EAC3C,SAAS,eAAe,8EAAgE,EACxF,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAMC,qBAAoB,QAAQ;AAAA,IACtC,OAAO;AACH,YAAMC,aAAY,QAAQ,QAAQ;AAAA,IACtC;AAAA,EACJ,CAAC;AAGL,gBACK,QAAQ,SAAS,EACjB,YAAY,oFAAqD,EACjE,SAAS,eAAe,wCAA0B,EAClD,OAAO,OAAO,WAAqB;AAChC,QAAI,OAAO,WAAW,GAAG;AACrB,YAAMD,qBAAoB,SAAS;AAAA,IACvC,OAAO;AACH,YAAMC,aAAY,QAAQ,SAAS;AAAA,IACvC;AAAA,EACJ,CAAC;AAGL,gBACK,QAAQ,iBAAiB,EACzB,YAAY,iHAAkD,EAC9D,OAAO,YAAY;AAChB,UAAM,YAAY,OAAO,KAAKH,mBAAkB;AAChD,UAAMG,aAAY,WAAW,QAAQ;AAAA,EACzC,CAAC;AAGL,gBACK,QAAQ,OAAO,EACf,YAAY,2FAAgD,EAC5D,SAAS,eAAe,yFAAkD,EAC1E,OAAO,OAAO,WAAqB;AAChC,UAAMC,eAAc,MAAM;AAAA,EAC9B,CAAC;AAGL,gBACK,QAAQ,MAAM,EACd,YAAY,iFAAuC,EACnD,OAAO,MAAM;AACV,YAAQ,IAAI,8DAA+B;AAC3C,WAAO,QAAQJ,mBAAkB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,IAAI,EAAE;AACjD,cAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC,MAAM,MAAM,WAAW,EAAE;AACxD,cAAQ,IAAI;AAAA,IAChB,CAAC;AAAA,EACL,CAAC;AAEL,SAAO;AACX;AAEA,eAAeC,mBAAkB;AAC7B,UAAQ,IAAI,0DAA8B;AAC1C,UAAQ,IAAI,4UAAyD;AACrE,UAAQ,IAAI,mGAAyD;AACrE,UAAQ,IAAI,uGAAyD;AACrE,UAAQ,IAAI,yGAAyD;AACrE,UAAQ,IAAI,0GAAyD;AACrE,UAAQ,IAAI,4FAAyD;AACrE,UAAQ,IAAI,8UAA2D;AAEvE,QAAM,SAAS,MAAML,QAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACL,EAAE,MAAM,iDAA4B,OAAO,SAAS;AAAA,MACpD,EAAE,MAAM,kDAA6B,OAAO,UAAU;AAAA,MACtD,EAAE,MAAM,uDAAsC,OAAO,MAAM;AAAA,MAC3D,EAAE,MAAM,mDAAwB,OAAO,QAAQ;AAAA,IACnD;AAAA,EACJ,CAAC;AAED,MAAI,WAAW,OAAO;AAClB,UAAM,YAAY,OAAO,KAAKI,mBAAkB;AAChD,UAAMG,aAAY,WAAW,QAAQ;AAAA,EACzC,WAAW,WAAW,SAAS;AAC3B,UAAMC,eAAc,CAAC,CAAC;AAAA,EAC1B,OAAO;AACH,UAAMF,qBAAoB,MAA8B;AAAA,EAC5D;AACJ;AAEA,eAAeA,qBAAoB,QAA8B;AAC7D,QAAM,UAAU,OAAO,QAAQF,mBAAkB,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,IACtE,MAAM,GAAG,MAAM,IAAI,MAAM,MAAM,WAAW;AAAA,IAC1C,OAAO;AAAA,EACX,EAAE;AAEF,MAAI;AACA,UAAM,iBAAiB,MAAMN,UAAS;AAAA,MAClC,SAAS,yCAAoB,WAAW,WAAW,WAAW,SAAS;AAAA,MACvE;AAAA,IACJ,CAAC;AAED,QAAI,eAAe,WAAW,GAAG;AAC7B,cAAQ,IAAI,8DAA+B;AAC3C,cAAQ,IAAI,qIAAwE;AACpF;AAAA,IACJ;AAEA,UAAMS,aAAY,gBAAgB,MAAM;AAAA,EAC5C,QAAQ;AACJ,YAAQ,IAAI,2CAAsB;AAAA,EACtC;AACJ;AAEA,eAAeA,aAAY,WAAqB,QAA8B;AAC1E,QAAM,YAAYL,MAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,MAAK,KAAK,WAAW,eAAe;AAGzD,QAAM,gBAAgB,UAAU,OAAO,SAAO,CAACE,oBAAmB,GAAG,CAAC;AACtE,MAAI,cAAc,SAAS,GAAG;AAC1B,YAAQ,IAAI;AAAA,4CAA0B,cAAc,KAAK,IAAI,CAAC,EAAE;AAChE,YAAQ,IAAI,iGAA6D;AACzE;AAAA,EACJ;AAGA,MAAI,CAACD,YAAW,SAAS,GAAG;AACxB,UAAMF,IAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAQ,IAAI,0DAA4B;AAAA,EAC5C;AAGA,MAAI,kBAA2C,CAAC;AAChD,MAAIE,YAAW,YAAY,GAAG;AAC1B,QAAI;AACA,YAAM,UAAU,MAAMF,IAAG,SAAS,cAAc,OAAO;AACvD,wBAAkB,KAAK,MAAM,OAAO;AACpC,cAAQ,IAAI,kGAA6C;AAAA,IAC7D,QAAQ;AACJ,cAAQ,KAAK,kGAAyD;AACtE,YAAM,mBAAmB,MAAMF,SAAQ;AAAA,QACnC,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,kBAAkB;AACnB,gBAAQ,IAAI,yCAAoB;AAChC;AAAA,MACJ;AACA,wBAAkB,CAAC;AAAA,IACvB;AAAA,EACJ;AAGA,QAAM,cAAc,EAAE,GAAG,gBAAgB;AAEzC,UAAQ,IAAI;AAAA,sBAAa,WAAW,WAAW,WAAW,SAAS;AAAA,CAAc;AAEjF,aAAW,OAAO,WAAW;AACzB,UAAM,QAAQK,oBAAmB,GAAG;AACpC,YAAQ,IAAI,MAAM,WAAW,WAAW,WAAM,QAAG,IAAI,MAAM,IAAI,EAAE;AAEjE,QAAI,WAAW,UAAU;AAErB,iBAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACrE,YAAI,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,CAAC,MAAM,QAAQ,YAAY,KACxF,OAAO,YAAY,UAAU,MAAM,YAAY,YAAY,UAAU,MAAM,MAAM;AACjF,sBAAY,UAAU,IAAI;AAAA,YACtB,GAAI,YAAY,UAAU;AAAA,YAC1B,GAAG;AAAA,UACP;AAAA,QACJ,OAAO;AACH,sBAAY,UAAU,IAAI;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,OAAO;AAEH,iBAAW,cAAc,OAAO,KAAK,MAAM,QAAQ,GAAG;AAClD,eAAO,YAAY,UAAU;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AAGA,QAAMH,IAAG,UAAU,cAAc,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AACrE,UAAQ,IAAI;AAAA,6EAAuC,YAAY,EAAE;AACjE,UAAQ,IAAI,sHAAuD;AACvE;AAEA,eAAeO,eAAc,WAAqB;AAC9C,QAAM,YAAYN,MAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AACpD,QAAM,eAAeA,MAAK,KAAK,WAAW,eAAe;AAEzD,MAAI,CAACC,YAAW,YAAY,GAAG;AAC3B,YAAQ,IAAI,8DAAyC;AACrD;AAAA,EACJ;AAEA,QAAM,eAAe,MAAMJ,SAAQ;AAAA,IAC/B,SAAS,UAAU,WAAW,IACxB,mGACA,yBAAmB,UAAU,KAAK,IAAI,CAAC;AAAA,IAC7C,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,cAAc;AACf,YAAQ,IAAI,yCAAoB;AAChC;AAAA,EACJ;AAEA,MAAI,UAAU,WAAW,GAAG;AAExB,UAAME,IAAG,OAAO,YAAY;AAC5B,YAAQ,IAAI,+CAA+B;AAAA,EAC/C,OAAO;AAEH,UAAMM,aAAY,WAAW,SAAS;AAAA,EAC1C;AAEA,UAAQ,IAAI,sHAAuD;AACvE;;;ACxXA,OAAOE,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,iBAAe;AAMjB,SAAS,qBAA8B;AAC1C,QAAM,MAAM,IAAIC,UAAQ,OAAO,EAC1B,YAAY,6CAA6C,EACzD,OAAO,mBAAmB,gEAAgE,EAC1F,OAAO,OAAO,YAAgC;AAC3C,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,QAAM,cAAc,UAAU;AAAA,QAC1B,cAAc,QAAQ;AAAA,QACtB,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;;;AC1BA,OAAOC,aAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,SAAS,WAAAC,iBAAe;AAQjB,SAAS,uBAAgC;AAC5C,QAAM,MAAM,IAAIC,UAAQ,SAAS,EAC5B,YAAY,2EAA+C,EAC3D,OAAO,eAAe,wFAA+D,EACrF,OAAO,iBAAiB,mGAA0E,EAClG,OAAO,WAAW,+DAA6C,EAC/D,OAAO,OAAO,YAA8D;AAEzE,QAAI;AACJ,QAAI,QAAQ,KAAK;AACb,YAAM,YAAY,CAAC,UAAU,YAAY,eAAe,MAAM;AAC9D,UAAI,CAAC,UAAU,SAAS,QAAQ,GAAG,GAAG;AAClC,gBAAQ,MAAM,yCAAuB,QAAQ,GAAG,EAAE;AAClD,gBAAQ,MAAM,4BAAkB,UAAU,KAAK,IAAI,CAAC,EAAE;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,mBAAa,QAAQ;AAAA,IACzB;AAGA,QAAI;AACJ,QAAI,QAAQ,MAAM;AACd,YAAM,aAAa,CAAC,SAAS,aAAa,UAAU,UAAU,WAAW,SAAS;AAClF,UAAI,CAAC,WAAW,SAAS,QAAQ,IAAI,GAAG;AACpC,gBAAQ,MAAM,uDAAgC,QAAQ,IAAI,EAAE;AAC5D,gBAAQ,MAAM,kCAAmB,WAAW,KAAK,IAAI,CAAC,EAAE;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAClB;AACA,oBAAc,QAAQ;AAAA,IAC1B;AAGA,QAAI,QAAQ,OAAO;AACf,YAAMC,YAAW;AACjB;AAAA,IACJ;AAGA,UAAM,EAAE,cAAc,IAAIC;AAAA,MACtBC,QAAM,cAAc,YAAY;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,QAAQ,MAAM;AACV,kBAAQ,KAAK,CAAC;AAAA,QAClB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,cAAc;AAAA,EACxB,CAAC;AAEL,SAAO;AACX;AAKA,eAAeF,cAA4B;AACvC,QAAM,UAAU,IAAI,sBAAsB;AAE1C,UAAQ,IAAI,0CAA2B;AAEvC,MAAI;AACA,UAAM,UAAU,MAAM,QAAQ,QAAQ;AAEtC,QAAI,QAAQ,KAAK,WAAW,GAAG;AAC3B,cAAQ,IAAI,wDAAgC;AAC5C,cAAQ,IAAI,yGAAgE;AAC5E;AAAA,IACJ;AAEA,YAAQ,IAAI,sCAAuB;AACnC,YAAQ,IAAI,sBAAe,QAAQ,WAAW,EAAE;AAChD,YAAQ,IAAI,wBAAiB,QAAQ,SAAS,eAAe,OAAO,CAAC;AAAA,CAAI;AAEzE,eAAW,cAAc,QAAQ,MAAM;AACnC,cAAQ,IAAI,GAAG,WAAW,OAAO,IAAI,IAAI,WAAW,OAAO,IAAI,EAAE;AACjE,cAAQ,IAAI,YAAY,WAAW,OAAO,QAAQ,EAAE;AACpD,cAAQ,IAAI,aAAa,WAAW,MAAM,UAAU,EAAE;AAEtD,YAAM,QAAkB,CAAC;AACzB,UAAI,WAAW,MAAM,OAAO,MAAO,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,KAAK,QAAQ;AACtF,UAAI,WAAW,MAAM,OAAO,UAAW,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,SAAS,YAAY;AAClG,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,OAAQ,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,SAAS;AACzF,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAC5F,UAAI,WAAW,MAAM,OAAO,QAAS,OAAM,KAAK,GAAG,WAAW,MAAM,OAAO,OAAO,UAAU;AAE5F,UAAI,MAAM,SAAS,GAAG;AAClB,gBAAQ,IAAI,iBAAiB,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACnD;AAEA,cAAQ,IAAI,EAAE;AAAA,IAClB;AAEA,YAAQ,IAAI,qBAAW,QAAQ,UAAU;AAAA,CAAU;AAAA,EACvD,SAAS,OAAO;AACZ,YAAQ,MAAM,wCAA2B,KAAK;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ;;;AC3GA,SAAS,WAAAG,iBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAQ3B,SAAS,0BAAmC;AAC/C,QAAM,MAAM,IAAIC,UAAQ,aAAa,EAChC,YAAY,qFAAkF,EAC9F,OAAO,mBAAmB,mEAAmE,EAC7F,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,aAAa,uCAAuC,EAC3D,OAAO,OAAO,YAIT;AACF,UAAM,cAAc,OAAO;AAAA,EAC/B,CAAC;AAEL,SAAO;AACX;AAEA,eAAe,cAAc,SAI1B;AACC,QAAM,UAAU,IAAI,kBAAkB;AAEtC,UAAQ,IAAI,yDAA+C;AAG3D,UAAQ,IAAI,wCAAiC;AAC7C,QAAM,UAAU,MAAM,QAAQ,gBAAgB;AAE9C,MAAI,QAAQ,eAAe,GAAG;AAC1B,YAAQ,IAAI,gEAA2C;AACvD,YAAQ,IAAI,qGAAuE;AACnF,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,UAAQ,IAAI,aAAa,QAAQ,MAAM,MAAM,WAAW,QAAQ,UAAU,MAAM;AAAA,CAAc;AAG9F,MAAI;AACJ,MAAI,QAAQ,OAAO,QAAQ,IAAI,SAAS,GAAG;AACvC,mBAAe,QAAQ;AAAA,EAC3B,OAAO;AACH,UAAM,aAAa,iBAAiB,EAAE,IAAI,SAAO;AAC7C,YAAM,SAAS,sBAAsB,GAAG;AACxC,aAAO;AAAA,QACH,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAAA,QACnC,OAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAED,mBAAe,MAAMC,UAAS;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,QAAI,aAAa,WAAW,GAAG;AAC3B,cAAQ,IAAI,0DAA8B;AAC1C,cAAQ,IAAI,wDAAiC;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,MAAI;AACJ,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACzC,oBAAgB,QAAQ;AAAA,EAC5B,OAAO;AACH,UAAM,cAAc;AAAA,MAChB,EAAE,MAAM,UAAU,QAAQ,MAAM,MAAM,WAAW,OAAO,QAA8B;AAAA,MACtF,EAAE,MAAM,cAAc,QAAQ,UAAU,MAAM,WAAW,OAAO,YAAkC;AAAA,MAClG,EAAE,MAAM,aAAa,QAAQ,SAAS,MAAM,WAAW,OAAO,WAAiC;AAAA,IACnG;AAEA,oBAAgB,MAAMA,UAAS;AAAA,MAC3B,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,QAAI,cAAc,WAAW,GAAG;AAC5B,cAAQ,IAAI,mEAAuC;AACnD,cAAQ,IAAI,iEAA0C;AACtD,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAGA,QAAM,aAAa,cAAc,OAAO,CAAC,KAAK,SAAS;AACnD,WAAO,OAAO,SAAS,UAAU,QAAQ,MAAM,SAClC,SAAS,cAAc,QAAQ,UAAU,SACzC,QAAQ,SAAS;AAAA,EAClC,GAAG,CAAC;AACJ,QAAM,aAAa,aAAa,aAAa;AAG7C,UAAQ,IAAI,wBAAiB;AAC7B,UAAQ,IAAI,YAAY,aAAa,IAAI,SAAO,sBAAsB,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAC7F,UAAQ,IAAI,qBAAqB,cAAc,KAAK,IAAI,CAAC,EAAE;AAC3D,UAAQ,IAAI,0BAA0B,UAAU;AAAA,CAAe;AAE/D,MAAI,QAAQ,QAAQ;AAChB,YAAQ,IAAI,gDAAyC;AAAA,EACzD;AAGA,QAAM,YAAY,MAAMC,SAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACb,CAAC;AAED,MAAI,CAAC,WAAW;AACZ,YAAQ,IAAI,iCAA4B;AACxC,YAAQ,KAAK,CAAC;AAAA,EAClB;AAGA,UAAQ,IAAI,4BAAqB;AACjC,MAAI,YAAY;AAEhB,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,WAAW;AACR;AACA,YAAM,OAAO,OAAO,WAAW,YAAY,WAC/B,OAAO,WAAW,YAAY,WAC9B,OAAO,WAAW,UAAU,WAAM;AAE9C,YAAM,aAAa,KAAK,MAAO,YAAY,aAAc,GAAG;AAC5D,cAAQ,IAAI,MAAM,IAAI,KAAK,UAAU,MAAM,OAAO,UAAU,EAAE;AAE9D,UAAI,OAAO,WAAW,WAAW,OAAO,OAAO;AAC3C,gBAAQ,IAAI,gBAAgB,OAAO,KAAK,EAAE;AAAA,MAC9C;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAC5D,QAAM,SAAS,QAAQ,OAAO,OAAK,EAAE,WAAW,OAAO,EAAE;AAEzD,UAAQ,IAAI,gCAA2B;AACvC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,UAAQ,IAAI,eAAe,OAAO,EAAE;AACpC,MAAI,UAAU,EAAG,SAAQ,IAAI,eAAe,OAAO,EAAE;AACrD,MAAI,SAAS,EAAG,SAAQ,IAAI,cAAc,MAAM,EAAE;AAClD,UAAQ,IAAI,EAAE;AAClB;;;AvErGA,IAAM,UAAU,IAAIC,UAAQ;AAG5B,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,QAAQ,KAAK,SAAS,WAAW,GAAG;AACrE,UAAQ,IAAI,gBAAY,OAAO;AAE/B,MAAI,CAAC,QAAQ,KAAK,SAAS,qBAAqB,GAAG;AACjD,UAAM,qBAAqB;AAAA,EAC7B;AACA,UAAQ,KAAK,CAAC;AAChB;AAEA,QACG,KAAK,MAAM,EACX,YAAY,+BAA+B;AAI9C,QAEG,OAAO,aAAa,wBAAwB,EAC5C,OAAO,UAAU,wBAAwB,EACzC,OAAO,uBAAuB,kCAAkC;AAKnE,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,oBAAoB,CAAC;AAKxC,QAAQ,WAAW,mBAAmB,CAAC;AACvC,QAAQ,WAAW,oBAAoB,CAAC;AACxC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,QAAQ,WAAW,iBAAiB,CAAC;AAKrC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,qBAAqB,CAAC;AACzC,QAAQ,WAAW,uBAAuB,CAAC;AAK3C,QAAQ,WAAW,qBAAqB,CAAC;AACzC,QAAQ,WAAW,mBAAmB,CAAC;AAKvC,IAAM,iBAAiB,IAAIA,UAAQ,SAAS,EACzC,YAAY,+BAA+B;AAE9C,eAAe,WAAW,0BAA0B,CAAC;AAErD,IAAM,cAAc,IAAIA,UAAQ,MAAM,EACnC,YAAY,uCAAuC;AAEtD,YAAY,WAAW,uBAAuB,CAAC;AAC/C,YAAY,WAAW,yBAAyB,CAAC;AAEjD,eAAe,WAAW,WAAW;AAErC,QAAQ,WAAW,cAAc;AASjC,QAAQ,WAAW,kBAAkB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAGxD,QAAQ,WAAW,wBAAwB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAG9D,QAAQ,WAAW,0BAA0B,GAAG,EAAE,QAAQ,KAAK,CAAC;AAGhE,QAAQ,WAAW,oBAAoB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAG1D,QAAQ,WAAW,mBAAmB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAGzD,QAAQ,WAAW,qBAAqB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAG3D,QAAQ,WAAW,wBAAwB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAI9D,QAAQ,GAAG,aAAa,CAAC,aAAa;AACpC,UAAQ,MAAM,2BAAsB,SAAS,CAAC,CAAC,EAAE;AACjD,UAAQ,MAAM,uBAAuB;AACrC,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,0BAAmB;AACjC,UAAQ,MAAM,2DAA2D;AACzE,UAAQ,MAAM,gEAAgE;AAC9E,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wBAAiB;AAC/B,UAAQ,MAAM,8DAA8D;AAC5E,UAAQ,MAAM,gDAAgD;AAC9D,UAAQ,MAAM,gDAAgD;AAC9D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,wBAAY;AAC1B,UAAQ,MAAM,mDAAmD;AACjE,UAAQ,MAAM,2CAA2C;AACzD,UAAQ,MAAM,+CAA+C;AAC7D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,sBAAe;AAC7B,UAAQ,MAAM,qDAAqD;AACnE,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,uBAAgB;AAC9B,UAAQ,MAAM,wCAAwC;AACtD,UAAQ,MAAM,2DAA2D;AACzE,UAAQ,MAAM,+DAA+D;AAC7E,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,yBAAkB;AAChC,UAAQ,MAAM,0DAA0D;AACxE,UAAQ,MAAM,+CAA+C;AAC7D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,0BAAmB;AACjC,UAAQ,MAAM,iDAAiD;AAC/D,UAAQ,MAAM,EAAE;AAChB,UAAQ,MAAM,yCAAyC;AACvD,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,QAAQ,GAAG,sBAAsB,CAAC,UAAU;AAC1C,MAAI,iBAAiB,WAAW;AAC9B,YAAQ,MAAM,UAAK,MAAM,OAAO;AAChC,YAAQ,KAAK,MAAM,QAAQ;AAAA,EAC7B,WAAW,iBAAiB,OAAO;AACjC,YAAQ,MAAM,4BAAuB,MAAM,OAAO;AAClD,QAAI,QAAQ,KAAK,EAAE,SAAS;AAC1B,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGD,QAAQ,WAAW,QAAQ,IAAI,EAAE,KAAK,YAAY;AAChD,QAAM,OAAO,QAAQ,KAAK;AAG1B,MAAI,CAAC,KAAK,iBAAiB;AACzB,UAAM,qBAAqB;AAAA,EAC7B;AACF,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,UAAQ,MAAM,UAAK,MAAM,OAAO;AAChC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["Command","homedir","homedir","resolve","Command","fs","join","homedir","join","homedir","fs","fs","join","homedir","Command","React","Command","React","Box","Text","React","Text","React","Text","React","Box","Text","Command","React","Command","Command","Command","Command","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","React","useState","Box","Text","useInput","React","useState","Box","Text","useInput","React","useState","Box","Text","useInput","fs","fs","useApp","useState","useEffect","useInput","React","Box","Text","Command","render","React","Command","confirm","fs","path","Command","checkbox","confirm","fs","path","matter","path","fs","matter","Command","checkbox","confirm","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","React","React","Box","Text","React","React","React","React","React","React","React","React","React","React","useState","Box","Text","useInput","TextInput","Spinner","resolve","useApp","useState","useEffect","useInput","React","Box","Text","Command","render","React","Command","React","render","React","useState","useEffect","useMemo","useCallback","useRef","Box","Text","useInput","useApp","Spinner","useState","useState","useEffect","useCallback","React","memo","Box","Text","Spinner","React","Box","Text","React","memo","Box","Text","TextInput","memo","React","Box","Text","Spinner","React","useState","Box","Text","useInput","useApp","useRef","useState","useEffect","useMemo","useCallback","useInput","React","Box","Text","Spinner","render","React","Command","Command","maskKey","Command","Command","fs","path","Command","Command","confirm","colors","Command","isNewerVersion","confirm","packageManager","Command","confirm","select","join","Command","select","confirm","Command","z","z","fetch","pRetry","pLimit","path","Command","Command","resolve","readFile","matter","resolve","action","Command","Command","Command","Command","fs","join","homedir","Command","getProjectStatus","maskKey","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","detectPackageManager","getInstallCommand","execSync","Command","confirm","Command","confirm","Command","checkbox","confirm","select","fs","path","existsSync","PERFORMANCE_GROUPS","interactiveMode","selectGroupsToApply","applyGroups","resetSettings","React","render","Command","Command","render","React","React","render","Command","Command","printStats","render","React","Command","checkbox","confirm","Command","checkbox","confirm","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/errors/index.ts","../package.json","../src/services/config.service.ts","../src/services/version-check.service.ts","../src/commands/framework/auth.ts","../src/services/tracking.service.ts","../src/commands/status.ts","../src/services/components.service.ts","../src/commands/apply.ts","../src/ui/apply/UnifiedApplyApp.tsx","../src/ui/shared/ProgressBar.tsx","../src/ui/shared/StatusIcon.tsx","../src/ui/shared/theme.ts","../src/commands/update.ts","../src/commands/framework/check.ts","../src/commands/ide/index.ts","../src/commands/ide/context.ts","../src/ui/context/ContextApp.tsx","../src/ui/context/views/MainMenuView.tsx","../src/ui/context/views/IDEOverviewView.tsx","../src/ui/context/views/ListView.tsx","../src/ui/context/views/DetailView.tsx","../src/services/context-scanner.service.ts","../src/constants/ide-configs.ts","../src/commands/ide/setup.ts","../src/commands/ide/sync.ts","../src/services/migrate-ide.service.ts","../src/constants/ide-migration-configs.ts","../src/commands/learn.ts","../src/ui/guide/GuideApp.tsx","../src/ui/guide/views/MenuView.tsx","../src/ui/guide/views/IntroView.tsx","../src/ui/guide/components/ContentView.tsx","../src/ui/guide/views/RulesView.tsx","../src/ui/guide/views/WorkflowsView.tsx","../src/ui/guide/views/PromptsView.tsx","../src/ui/guide/views/SkillsView.tsx","../src/ui/guide/views/AgenticGuideView.tsx","../src/commands/chat.ts","../src/services/llm-proxy.service.ts","../src/ui/llm/LlmApp.tsx","../src/ui/llm/hooks/useChat.ts","../src/ui/llm/hooks/useLlmApi.ts","../src/ui/llm/components/ChatPanel.tsx","../src/ui/llm/components/MessageItem.tsx","../src/ui/llm/components/InputBox.tsx","../src/ui/llm/components/ModelSelector.tsx","../src/commands/api-keys.ts","../src/commands/translate.ts","../src/services/translation.service.ts","../src/commands/upgrade.ts","../src/commands/clean.ts","../src/commands/redmine/check.ts","../src/services/redmine-config.service.ts","../src/types/redmine.types.ts","../src/api.ts","../src/services/redmine-connectivity.service.ts","../src/commands/redmine/sync-issue.ts","../src/sync-issue.ts","../src/mappers.ts","../src/slug.util.ts","../src/file.util.ts","../src/commands/redmine/sync-project.ts","../src/sync-project.ts","../src/commands/framework/info.ts","../src/commands/self-update.ts","../src/commands/clear-backups.ts","../src/commands/vscode/index.ts","../src/commands/guide.ts","../src/commands/context.ts","../src/commands/migrate-ide.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { Jai1Error } from './errors/index.js';\nimport packageJson from '../package.json' with { type: 'json' };\nimport { checkForClientUpdate } from './services/version-check.service.js';\n\n// ============================================\n// SETUP & AUTH COMMANDS\n// ============================================\nimport { createAuthCommand } from './commands/framework/auth.js';\nimport { createStatusCommand } from './commands/status.js';\n\n// ============================================\n// COMPONENT MANAGEMENT COMMANDS\n// ============================================\nimport { createApplyCommand } from './commands/apply.js';\nimport { createUpdateCommand } from './commands/update.js';\nimport { createCheckCommand } from './commands/framework/check.js';\n\n// ============================================\n// IDE COMMANDS (grouped)\n// ============================================\nimport { createIdeCommand } from './commands/ide/index.js';\n\n// ============================================\n// LEARNING COMMAND\n// ============================================\nimport { createLearnCommand } from './commands/learn.js';\n\n// ============================================\n// LLM PROXY COMMAND\n// ============================================\nimport { createChatCommand } from './commands/chat.js';\nimport { createApiKeysCommand } from './commands/api-keys.js';\nimport { createTranslateCommand } from './commands/translate.js';\n\n// ============================================\n// MAINTENANCE COMMANDS\n// ============================================\nimport { createUpgradeCommand } from './commands/upgrade.js';\nimport { createCleanCommand } from './commands/clean.js';\n\n// ============================================\n// EXTERNAL INTEGRATIONS\n// ============================================\nimport { createRedmineCheckCommand } from './commands/redmine/check.js';\nimport { createSyncIssueCommand } from './commands/redmine/sync-issue.js';\nimport { createSyncProjectCommand } from './commands/redmine/sync-project.js';\n\n// ============================================\n// LEGACY ALIASES (for backward compatibility)\n// ============================================\nimport { createInfoCommand } from './commands/framework/info.js';\nimport { createSelfUpdateCommand } from './commands/self-update.js';\nimport { createClearBackupsCommand } from './commands/clear-backups.js';\nimport { createVSCodeCommand } from './commands/vscode/index.js';\nimport { createGuideCommand } from './commands/guide.js';\nimport { createContextCommand } from './commands/context.js';\nimport { createMigrateIdeCommand } from './commands/migrate-ide.js';\n\nconst program = new Command();\n\n// Manual version check to support update checking\nif (process.argv.includes('-v') || process.argv.includes('--version')) {\n console.log(packageJson.version);\n // Check for updates\n if (!process.argv.includes('--skip-update-check')) {\n await checkForClientUpdate();\n }\n process.exit(0);\n}\n\nprogram\n .name('jai1')\n .description('Jai1 Framework Management CLI')\n// .version() removed to custom handle update check (handled above)\n\n// Global options\nprogram\n // .option('-v, --version', 'output the version number') // Handled manually\n .option('--verbose', 'Enable verbose logging')\n .option('--json', 'Output results as JSON')\n .option('--skip-update-check', 'Skip checking for client updates');\n\n// ============================================\n// 🔧 SETUP & INFO\n// ============================================\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createStatusCommand());\n\n// ============================================\n// 📦 COMPONENT MANAGEMENT\n// ============================================\nprogram.addCommand(createApplyCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createCheckCommand());\n\n// ============================================\n// 🖥️ IDE INTEGRATION (grouped)\n// ============================================\nprogram.addCommand(createIdeCommand());\n\n// ============================================\n// 📚 LEARNING\n// ============================================\nprogram.addCommand(createLearnCommand());\n\n// ============================================\n// 🤖 LLM PROXY\n// ============================================\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createApiKeysCommand());\nprogram.addCommand(createTranslateCommand());\n\n// ============================================\n// 🔧 MAINTENANCE\n// ============================================\nprogram.addCommand(createUpgradeCommand());\nprogram.addCommand(createCleanCommand());\n\n// ============================================\n// 🔗 EXTERNAL INTEGRATIONS\n// ============================================\nconst redmineCommand = new Command('redmine')\n .description('Redmine context sync commands');\n\nredmineCommand.addCommand(createRedmineCheckCommand());\n\nconst syncCommand = new Command('sync')\n .description('Sync Redmine issues to markdown files');\n\nsyncCommand.addCommand(createSyncIssueCommand());\nsyncCommand.addCommand(createSyncProjectCommand());\n\nredmineCommand.addCommand(syncCommand);\n\nprogram.addCommand(redmineCommand);\n\n// ============================================\n// 🔄 LEGACY ALIASES (backward compatibility)\n// Hidden from help, but still work\n// ============================================\n\n\n// Legacy: info -> status\nprogram.addCommand(createInfoCommand(), { hidden: true });\n\n// Legacy: self-update -> upgrade \nprogram.addCommand(createSelfUpdateCommand(), { hidden: true });\n\n// Legacy: clear-backups -> clean\nprogram.addCommand(createClearBackupsCommand(), { hidden: true });\n\n// Legacy: vscode -> ide setup\nprogram.addCommand(createVSCodeCommand(), { hidden: true });\n\n// Legacy: guide -> learn\nprogram.addCommand(createGuideCommand(), { hidden: true });\n\n// Legacy: context -> ide context\nprogram.addCommand(createContextCommand(), { hidden: true });\n\n// Legacy: migrate-ide -> ide sync\nprogram.addCommand(createMigrateIdeCommand(), { hidden: true });\n\n\n// Handle unknown commands\nprogram.on('command:*', (operands) => {\n console.error(`❌ Unknown command: ${operands[0]}`);\n console.error('\\nAvailable commands:');\n console.error('');\n console.error(' 🔧 Setup & Info');\n console.error(' auth Authenticate and configure jai1-client');\n console.error(' status Show configuration and installed components');\n console.error('');\n console.error(' 📦 Components');\n console.error(' apply Install/apply components (interactive UI)');\n console.error(' update Update installed components');\n console.error(' check Check for component updates');\n console.error('');\n console.error(' 🖥️ IDE');\n console.error(' ide context Browse and explore IDE context');\n console.error(' ide setup Configure IDE settings');\n console.error(' ide sync Sync .jai1 content to IDEs');\n console.error('');\n console.error(' 📚 Learning');\n console.error(' learn Interactive Agentic Coding guide');\n console.error('');\n console.error(' 🤖 LLM Proxy');\n console.error(' chat Interactive AI chat');\n console.error(' api-keys Show OpenAI-compatible API credentials');\n console.error(' translate Translate text, files, or folders using AI');\n console.error('');\n console.error(' 🔧 Maintenance');\n console.error(' upgrade Upgrade jai1-client to latest version');\n console.error(' clean Clean up backups and cache');\n console.error('');\n console.error(' 🔗 Integrations');\n console.error(' redmine Redmine integration commands');\n console.error('');\n console.error('Use \"jai1 --help\" for more information.');\n process.exit(1);\n});\n\n// Error handling\nprocess.on('unhandledRejection', (error) => {\n if (error instanceof Jai1Error) {\n console.error('❌', error.message);\n process.exit(error.exitCode);\n } else if (error instanceof Error) {\n console.error('❌ Unexpected error:', error.message);\n if (program.opts().verbose) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n});\n\n// Parse and execute\nprogram.parseAsync(process.argv).then(async () => {\n const opts = program.opts();\n\n // Check for client updates after command execution (unless skipped)\n if (!opts.skipUpdateCheck) {\n await checkForClientUpdate();\n }\n}).catch((error) => {\n console.error('❌', error.message);\n process.exit(1);\n});\n","/**\n * Base error class for jai1-client\n */\nexport class Jai1Error extends Error {\n constructor(\n message: string,\n public exitCode: number\n ) {\n super(message);\n this.name = 'Jai1Error';\n }\n}\n\n/**\n * Validation error (exit code 2)\n */\nexport class ValidationError extends Jai1Error {\n constructor(message: string) {\n super(message, 2);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Authentication error (exit code 3)\n */\nexport class AuthenticationError extends Jai1Error {\n constructor(message: string) {\n super(message, 3);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Not found error (exit code 4)\n */\nexport class NotFoundError extends Jai1Error {\n constructor(message: string) {\n super(message, 4);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network/System error (exit code 5)\n */\nexport class NetworkError extends Jai1Error {\n constructor(message: string) {\n super(message, 5);\n this.name = 'NetworkError';\n }\n}\n","{\n \"name\": \"@jvittechs/jai1-cli\",\n \"version\": \"0.1.59\",\n \"description\": \"Unified CLI for Jai1 Framework Management and Redmine Context Sync\",\n \"type\": \"module\",\n \"bin\": {\n \"jai1\": \"dist/cli.js\"\n },\n \"exports\": {\n \".\": \"./dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"redmine.config.example.yaml\",\n \"scripts/redmine-sync-issue.sh\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"license\": \"MIT\",\n \"author\": \"JVIT <dev@jvit.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/jvittechs/jai.git\",\n \"directory\": \"packages/cli\"\n },\n \"homepage\": \"https://github.com/jvittechs/jai/tree/main/packages/cli#readme\",\n \"keywords\": [\n \"jai1\",\n \"framework\",\n \"redmine\",\n \"cli\",\n \"markdown\",\n \"issues\",\n \"context\",\n \"agentic\",\n \"coding\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/cli.ts --dts --format esm --target node22 --out-dir dist --sourcemap\",\n \"dev\": \"tsx src/cli.ts --help\",\n \"lint\": \"eslint .\",\n \"test\": \"vitest run\",\n \"release\": \"node scripts/release.js\",\n \"smart-publish\": \"node scripts/smart-publish.js\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^8.0.2\",\n \"adm-zip\": \"^0.5.16\",\n \"cli-progress\": \"^3.12.0\",\n \"clipboardy\": \"^4.0.0\",\n \"commander\": \"^12.1.0\",\n \"gray-matter\": \"^4.0.3\",\n \"ink\": \"^5.0.1\",\n \"ink-spinner\": \"^5.0.0\",\n \"ink-text-input\": \"^6.0.0\",\n \"p-limit\": \"^5.0.0\",\n \"p-queue\": \"^7.4.1\",\n \"p-retry\": \"^6.2.0\",\n \"react\": \"^18.3.1\",\n \"slugify\": \"^1.6.6\",\n \"undici\": \"^6.19.5\",\n \"yaml\": \"^2.5.0\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.7\",\n \"@types/node\": \"^24.10.1\",\n \"@types/react\": \"^18.3.12\",\n \"@typescript-eslint/eslint-plugin\": \"^8.6.0\",\n \"@typescript-eslint/parser\": \"^8.6.0\",\n \"@vitest/coverage-v8\": \"^2.1.4\",\n \"eslint\": \"^9.9.0\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"tsx\": \"^4.19.2\",\n \"typescript\": \"^5.6.3\",\n \"vitest\": \"^2.1.4\"\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { Jai1Config } from '../types/framework.types.js';\n\n/**\n * Service for managing Jai1 global configuration\n * Config stored in ~/.jai1/config.json\n */\nexport class ConfigService {\n private readonly configDir: string;\n private readonly configPath: string;\n\n constructor() {\n this.configDir = join(homedir(), '.jai1');\n this.configPath = join(this.configDir, 'config.json');\n }\n\n /**\n * Check if config file exists\n */\n async exists(): Promise<boolean> {\n try {\n await fs.access(this.configPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Load configuration from file\n * @returns Config object or null if not found\n */\n async load(): Promise<Jai1Config | null> {\n if (!(await this.exists())) {\n return null;\n }\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n return JSON.parse(content) as Jai1Config;\n } catch (error) {\n throw new Error(\n `Failed to load config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Save configuration to file\n * Creates directory if it doesn't exist\n * Sets proper file permissions (600)\n */\n async save(config: Jai1Config): Promise<void> {\n try {\n // Ensure directory exists with restricted permissions\n await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 });\n\n // Write config with restricted permissions\n await fs.writeFile(this.configPath, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\n } catch (error) {\n throw new Error(\n `Failed to save config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Get config directory path\n */\n getConfigDir(): string {\n return this.configDir;\n }\n}\n","import { ConfigService } from './config.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n// Cache to avoid checking too frequently\nlet lastCheckTime = 0;\nlet cachedLatestVersion: string | null = null;\nconst CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Check if there's a newer version of jai1-client available\n * This runs silently and only shows a message if update is available\n */\nexport async function checkForClientUpdate(): Promise<void> {\n try {\n // Check only once per hour\n const now = Date.now();\n if (now - lastCheckTime < CHECK_INTERVAL_MS && cachedLatestVersion) {\n if (isNewerVersion(cachedLatestVersion, packageJson.version)) {\n showUpdateNotification(cachedLatestVersion);\n }\n return;\n }\n\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n return; // Not initialized, skip check\n }\n\n // Fetch latest client version from API\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(5000), // 5 second timeout\n });\n\n if (!response.ok) {\n return; // Silently fail\n }\n\n const data = await response.json() as { version: string };\n lastCheckTime = now;\n cachedLatestVersion = data.version;\n\n if (isNewerVersion(data.version, packageJson.version)) {\n showUpdateNotification(data.version);\n }\n } catch {\n // Silently fail - don't interrupt user flow\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Show update notification to user\n */\nfunction showUpdateNotification(latestVersion: string): void {\n console.log('');\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${packageJson.version} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} Run: ${colors.cyan}jai1 upgrade${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}`);\n console.log('');\n}\n\n/**\n * Get current client version\n */\nexport function getClientVersion(): string {\n return packageJson.version;\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { trackActionSync } from '../../services/tracking.service.js';\nimport { ValidationError, AuthenticationError } from '../../errors/index.js';\nimport type { InitOptions } from '../../types/framework.types.js';\n\n/**\n * Create auth command for Jai1 Framework\n * Allows both interactive and non-interactive modes\n */\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth')\n .description('Authenticate and configure jai1-client')\n .option('--api-url <url>', 'Jai1 Store API URL')\n .option('--access-key <key>', 'Your access key')\n .action(async (options: InitOptions) => {\n await handleAuth(options);\n });\n\n return cmd;\n}\n\nasync function handleAuth(options: InitOptions): Promise<void> {\n const configService = new ConfigService();\n\n let apiUrl: string;\n let accessKey: string;\n let isInteractive = false;\n\n // Check if config already exists\n const existingConfig = await configService.load();\n if (existingConfig) {\n console.log('⚠️ Configuration already exists at:', configService.getConfigPath());\n console.log(' Run this command again with new values to overwrite.');\n console.log('');\n }\n\n // Interactive vs Non-Interactive mode\n if (options.apiUrl && options.accessKey) {\n // Non-interactive mode\n apiUrl = options.apiUrl;\n accessKey = options.accessKey;\n } else if (options.apiUrl || options.accessKey) {\n // Partial options provided - error\n throw new ValidationError(\n 'Both --api-url and --access-key are required in non-interactive mode'\n );\n } else {\n // Interactive mode\n isInteractive = true;\n console.log('🚀 Jai1 Client Setup');\n console.log('─────────────────\\n');\n\n // For now, use simple readline until inquirer is installed\n const readline = await import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n resolve(answer);\n });\n });\n };\n\n apiUrl = await question('API URL (https://store.jai1.io): ');\n if (!apiUrl) {\n apiUrl = 'https://store.jai1.io';\n }\n\n accessKey = await question('Access Key: ');\n if (!accessKey) {\n rl.close();\n throw new ValidationError('Access key is required');\n }\n\n rl.close();\n }\n\n // Validate API URL format\n try {\n new URL(apiUrl);\n } catch {\n throw new ValidationError('Invalid API URL format');\n }\n\n console.log('\\nValidating access key...');\n\n // TODO: Validate access key with API\n // For now, just save it\n // const isValid = await validateAccessKey(apiUrl, accessKey);\n // if (!isValid) {\n // throw new AuthenticationError('Invalid access key');\n // }\n\n // Save config\n await configService.save({\n apiUrl,\n accessKey,\n version: null,\n lastUpdated: null,\n });\n\n // Track auth action (sync to ensure it completes before exit)\n await trackActionSync('auth', {\n configPath: configService.getConfigPath(),\n mode: isInteractive ? 'interactive' : 'non-interactive',\n isReconfig: !!existingConfig,\n });\n\n console.log('✓ Configuration saved to', configService.getConfigPath());\n console.log('');\n console.log(\"You're all set! Run 'jai1 check' to check for updates.\");\n}\n","import { ConfigService } from './config.service.js';\nimport { platform, release, arch, hostname, homedir } from 'os';\nimport { version as nodeVersion } from 'process';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n/**\n * Tracking action categories\n */\nexport type TrackingAction =\n | 'init'\n | 'download'\n | 'version_check'\n | 'sync'\n | 'update'\n | 'redmine_check'\n | 'redmine_sync_issue'\n | 'redmine_sync_project'\n | 'vscode'\n | 'info'\n | 'check';\n\nexport interface TrackingDetail {\n [key: string]: unknown;\n}\n\n/**\n * Get basic system info for logging\n */\nfunction getSystemInfo(): Record<string, string> {\n return {\n os: platform(),\n osRelease: release(),\n arch: arch(),\n nodeVersion: nodeVersion,\n hostname: hostname(),\n homeDir: homedir(),\n };\n}\n\n/**\n * Service for tracking CLI usage to server\n * Tracking is fire-and-forget, errors are silently ignored\n */\nexport class TrackingService {\n private configService: ConfigService;\n\n constructor() {\n this.configService = new ConfigService();\n }\n\n /**\n * Track a CLI action (fire-and-forget)\n * WARNING: Process may exit before request completes\n * Use trackSync for important events\n *\n * @param action - The action being performed\n * @param detail - Optional additional details\n */\n async track(action: TrackingAction, detail?: TrackingDetail): Promise<void> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n\n // Fire and forget - don't await\n this.sendTrackingEvent(trackUrl, config.accessKey, action, detail).catch(\n () => {\n // Silently ignore tracking errors\n }\n );\n } catch {\n // Silently ignore config errors\n }\n }\n\n /**\n * Track a CLI action synchronously (waits for completion)\n * Use this for important events before process exit\n */\n async trackSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n try {\n const config = await this.configService.load();\n if (!config || !config.accessKey || !config.apiUrl) {\n return false;\n }\n\n const trackUrl = `${config.apiUrl.replace(/\\/$/, '')}/api/track`;\n return await this.sendTrackingEvent(trackUrl, config.accessKey, action, detail);\n } catch {\n return false;\n }\n }\n\n private async sendTrackingEvent(\n trackUrl: string,\n accessKey: string,\n action: TrackingAction,\n detail?: TrackingDetail\n ): Promise<boolean> {\n try {\n // Merge detail with system info\n const enrichedDetail = {\n ...getSystemInfo(),\n ...detail,\n };\n\n const response = await fetch(trackUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'JAI1-Access-Key': accessKey,\n },\n body: JSON.stringify({\n action,\n detail: enrichedDetail,\n clientVersion: packageJson.version,\n }),\n // Timeout to avoid blocking too long\n signal: AbortSignal.timeout(10000),\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n// Singleton instance for convenience\nlet trackingInstance: TrackingService | null = null;\n\n/**\n * Get or create tracking service instance\n */\nexport function getTrackingService(): TrackingService {\n if (!trackingInstance) {\n trackingInstance = new TrackingService();\n }\n return trackingInstance;\n}\n\n/**\n * Convenience function to track an action (fire-and-forget)\n * WARNING: May not complete before process exit\n */\nexport function trackAction(action: TrackingAction, detail?: TrackingDetail): void {\n getTrackingService().track(action, detail);\n}\n\n/**\n * Convenience function to track an action synchronously\n * Use this for important events at end of commands\n */\nexport async function trackActionSync(action: TrackingAction, detail?: TrackingDetail): Promise<boolean> {\n return getTrackingService().trackSync(action, detail);\n}\n","/**\n * Status Command\n * Show jai1-client configuration and installed components status\n * \n * Renamed from 'info' to 'status' for clarity (common CLI pattern)\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../types/framework.types.js';\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Show configuration and installed components status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleStatus(options);\n });\n\n return cmd;\n}\n\nasync function handleStatus(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n const installedComponents = await componentsService.getInstalled();\n const componentCount = Object.keys(installedComponents).length;\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n componentCount,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('📊 Jai1 Client Status');\n console.log('─────────────────────\\n');\n\n // Configuration section\n console.log('🔧 Configuration');\n console.log(` Config: ${info.configPath}`);\n console.log(` API URL: ${info.apiUrl}`);\n console.log(` Access Key: ${info.accessKey}`);\n console.log();\n\n // Framework section\n console.log('📦 Framework');\n console.log(` Version: ${info.version}`);\n console.log(` Updated: ${info.lastUpdated}`);\n console.log(` Location: ${info.frameworkPath}`);\n console.log();\n\n // Project section\n console.log('📁 Project');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Components: ${componentCount} installed`);\n }\n console.log();\n\n // Quick tips\n if (!info.projectStatus.exists) {\n console.log('💡 Run \"jai1 apply\" to install components for this project.');\n } else if (componentCount > 0) {\n console.log('💡 Run \"jai1 check\" to check for component updates.');\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { gunzipSync } from 'zlib';\nimport { createHash } from 'crypto';\nimport type { Jai1Config } from '../types/framework.types.js';\nimport { NetworkError } from '../errors/index.js';\n\n/**\n * Component from API\n */\nexport interface Component {\n id: number;\n filepath: string;\n name: string;\n description: string | null;\n content: string | null;\n contentType: 'markdown' | 'bundle' | 'zip'; // 'zip' for legacy compatibility\n version: string;\n downloads: number;\n status: string;\n tags?: string[];\n dependencies?: { filepath: string; required: boolean }[];\n}\n\n/**\n * Tag from API\n */\nexport interface Tag {\n tag: string;\n count: number;\n}\n\n/**\n * Installed component info\n */\nexport interface InstalledComponent {\n filepath: string;\n version: string;\n checksum: string;\n installedAt: string;\n modified: boolean;\n}\n\n/**\n * Service for managing components\n */\nexport class ComponentsService {\n private readonly cacheDir: string;\n private readonly manifestFile: string;\n\n constructor(projectRoot: string = process.cwd()) {\n this.cacheDir = join(homedir(), '.jai1', 'cache');\n this.manifestFile = join(projectRoot, '.jai1', 'manifest.json');\n }\n\n /**\n * List components from API\n */\n async list(config: Jai1Config, options?: { tag?: string; search?: string }): Promise<Component[]> {\n const params = new URLSearchParams();\n if (options?.tag) params.set('tag', options.tag);\n if (options?.search) params.set('search', options.search);\n\n const url = `${config.apiUrl}/api/components${params.toString() ? '?' + params.toString() : ''}`;\n\n const response = await fetch(url, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * List available tags\n */\n async listTags(config: Jai1Config): Promise<Tag[]> {\n const response = await fetch(`${config.apiUrl}/api/tags`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to list tags: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { tags: Tag[] };\n return data.tags;\n }\n\n /**\n * Get single component\n */\n async get(config: Jai1Config, filepath: string): Promise<Component> {\n const encodedPath = encodeURIComponent(filepath);\n const response = await fetch(`${config.apiUrl}/api/components/${encodedPath}`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`Component not found: ${filepath}`);\n }\n throw new NetworkError(`Failed to get component: HTTP ${response.status}`);\n }\n\n return await response.json() as Component;\n }\n\n /**\n * Get core components\n */\n async getCore(config: Jai1Config): Promise<Component[]> {\n const response = await fetch(`${config.apiUrl}/api/components/core`, {\n headers: { 'JAI1-Access-Key': config.accessKey },\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get core components: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { components: Component[] };\n return data.components;\n }\n\n /**\n * Download and install a component\n */\n async install(config: Jai1Config, filepath: string, targetDir: string): Promise<void> {\n const component = await this.get(config, filepath);\n\n if (!component.content) {\n throw new Error(`Component ${filepath} has no content`);\n }\n\n const targetPath = join(targetDir, filepath);\n const targetFolder = join(targetPath, '..');\n\n await fs.mkdir(targetFolder, { recursive: true });\n\n let checksumContent = component.content; // Default for simple types\n if (component.contentType === 'bundle' || component.contentType === 'zip') {\n // Decompress if gzipped (bundle type), or parse directly (legacy zip)\n let bundleJson: string;\n if (component.contentType === 'bundle') {\n // Gzipped base64 content\n const compressed = Buffer.from(component.content, 'base64');\n bundleJson = gunzipSync(compressed).toString('utf-8');\n checksumContent = bundleJson;\n } else {\n // Legacy: raw JSON string\n bundleJson = component.content;\n }\n\n const bundle = JSON.parse(bundleJson) as { main: string; assets: Record<string, string> };\n\n // Extract skill folder\n const skillDir = join(targetDir, filepath);\n await fs.mkdir(skillDir, { recursive: true });\n\n // Write main SKILL.md\n await fs.writeFile(join(skillDir, 'SKILL.md'), bundle.main);\n\n // Write assets\n for (const [assetPath, content] of Object.entries(bundle.assets)) {\n if (assetPath === 'SKILL.md') continue;\n const assetFullPath = join(skillDir, assetPath);\n await fs.mkdir(join(assetFullPath, '..'), { recursive: true });\n await fs.writeFile(assetFullPath, content);\n }\n } else {\n // Checksum content for markdown is just the content\n // For bundle it was set above\n if (component.contentType === 'markdown') {\n checksumContent = component.content;\n }\n // Regular markdown file\n await fs.writeFile(targetPath, component.content);\n }\n\n // Update installed.json\n await this.markInstalled(filepath, component.version, this.calculateChecksum(checksumContent));\n }\n\n /**\n * Get installed components\n */\n async getInstalled(): Promise<Record<string, InstalledComponent>> {\n try {\n const content = await fs.readFile(this.manifestFile, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n\n /**\n * Mark component as installed\n */\n async markInstalled(filepath: string, version: string, checksum: string): Promise<void> {\n const installed = await this.getInstalled();\n installed[filepath] = {\n filepath,\n version,\n checksum,\n installedAt: new Date().toISOString(),\n modified: false,\n };\n\n await fs.mkdir(join(this.manifestFile, '..'), { recursive: true });\n await fs.writeFile(this.manifestFile, JSON.stringify(installed, null, 2));\n }\n\n /**\n * Get checksums for multiple components\n */\n async getChecksums(config: Jai1Config, filepaths: string[]): Promise<Record<string, { version: string; checksum: string }>> {\n const response = await fetch(`${config.apiUrl}/api/components/checksums`, {\n method: 'POST',\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ filepaths }),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to get checksums: HTTP ${response.status}`);\n }\n\n const data = await response.json() as { checksums: Record<string, { version: string; checksum: string }> };\n return data.checksums;\n }\n\n /**\n * Resolve dependencies recursively\n */\n async resolveWithDependencies(config: Jai1Config, filepaths: string[]): Promise<string[]> {\n const resolved = new Set<string>();\n const queue = [...filepaths];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (seen.has(current)) continue;\n seen.add(current);\n resolved.add(current);\n\n try {\n // We need metadata to check deps\n // For efficiency, we could batch fetch metadata, but for now simple get is fine\n // Optimization: getBatch API could be used here\n const component = await this.get(config, current);\n\n if (component.dependencies) {\n for (const dep of component.dependencies) {\n if (!dep.filepath) continue; // Should have filepath\n // Handle both string and object format if API changes\n const depPath = typeof dep === 'string' ? dep : dep.filepath;\n if (!seen.has(depPath)) {\n queue.push(depPath);\n }\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not resolve dependencies for ${current}: ${error}`);\n }\n }\n\n return Array.from(resolved);\n }\n\n /**\n * Backup component file before update\n */\n async backupFile(filepath: string, targetDir: string): Promise<string | null> {\n const sourcePath = join(targetDir, filepath);\n\n try {\n await fs.access(sourcePath);\n } catch {\n return null; // File doesn't exist, no backup needed\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupDir = join(targetDir, '..', '.jai1_backup', timestamp);\n const backupPath = join(backupDir, filepath);\n\n const stats = await fs.stat(sourcePath);\n\n await fs.mkdir(join(backupPath, '..'), { recursive: true });\n\n if (stats.isDirectory()) {\n await fs.cp(sourcePath, backupPath, { recursive: true });\n } else {\n await fs.copyFile(sourcePath, backupPath);\n }\n\n return backupPath;\n }\n\n /**\n * List all backup directories\n */\n async listBackups(projectRoot: string): Promise<string[]> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n const entries = await fs.readdir(backupRoot, { withFileTypes: true });\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n .reverse();\n } catch {\n return [];\n }\n }\n\n /**\n * Clear all backups\n */\n async clearBackups(projectRoot: string): Promise<void> {\n const backupRoot = join(projectRoot, '.jai1_backup');\n try {\n await fs.rm(backupRoot, { recursive: true, force: true });\n } catch (error) {\n // Ignore error if dir doesn't exist\n }\n }\n\n /**\n * Calculate SHA256 checksum (matches server logic)\n */\n calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { UnifiedApplyApp } from '../ui/apply/UnifiedApplyApp.js';\n\n/**\n * Create apply command with Unified Ink UI\n */\nexport function createApplyCommand(): Command {\n const cmd = new Command('apply')\n .description('Apply components to your project (interactive UI)')\n .argument('[items...]', 'Package name or component filepaths (non-interactive mode)')\n .option('--force', 'Force overwrite even if modified locally')\n .option('--no-interactive', 'Disable interactive UI (for CI/CD)')\n .action(async (items: string[], options: { force?: boolean; interactive?: boolean }) => {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n // Non-interactive mode or direct arguments\n if (options.interactive === false || items.length > 0) {\n await nonInteractiveApply(config, items, options);\n return;\n }\n\n // Interactive mode with Unified Ink UI\n const { waitUntilExit } = render(\n React.createElement(UnifiedApplyApp, {\n config: config,\n force: options.force,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Non-interactive apply (for CLI args or CI/CD)\n */\nasync function nonInteractiveApply(\n config: any,\n items: string[],\n options: { force?: boolean }\n) {\n const componentsService = new ComponentsService();\n\n if (items.length === 0) {\n console.log('❌ No items specified. Use interactive mode or provide package/component names.');\n console.log('💡 Usage: jai1 apply <package> or jai1 apply <filepath...>');\n return;\n }\n\n // Check if first arg is a package\n const tags = await componentsService.listTags(config);\n const packageNames = tags.map(t => t.tag);\n\n let filepaths: string[];\n\n if (items.length === 1 && packageNames.includes(items[0]!)) {\n // Package mode\n console.log(`📦 Applying package '${items[0]}'...`);\n const components = await componentsService.list(config, { tag: items[0] });\n filepaths = components.map(c => c.filepath);\n } else {\n // Direct filepaths\n filepaths = items;\n }\n\n // Resolve dependencies\n console.log('🔍 Resolving dependencies...');\n const resolvedPaths = await componentsService.resolveWithDependencies(config, filepaths);\n\n console.log(`📦 Will apply ${resolvedPaths.length} component(s):`);\n for (const fp of resolvedPaths) {\n const isDep = !filepaths.includes(fp);\n const suffix = isDep ? ' (dependency)' : '';\n console.log(` - ${fp}${suffix}`);\n }\n\n // Install\n const targetDir = process.cwd() + '/.jai1';\n const installed = await componentsService.getInstalled();\n let added = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const fp of resolvedPaths) {\n try {\n const info = installed[fp];\n\n if (info && !options.force && info.modified) {\n console.log(`⚠️ ${fp}: modified locally. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n\n console.log(`📥 Downloading ${fp}...`);\n await componentsService.install(config, fp, targetDir);\n\n if (info) updated++;\n else added++;\n\n console.log(`✅ ${fp}`);\n } catch (error) {\n console.log(`❌ ${fp}: ${error instanceof Error ? error.message : 'Error'}`);\n }\n }\n\n console.log(`\\n✅ Complete: ${added} added, ${updated} updated, ${skipped} skipped`);\n console.log(`📁 Location: ${targetDir}`);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport type { Jai1Config } from '../../types/framework.types.js';\nimport { ComponentsService, type Component, type Tag } from '../../services/components.service.js';\nimport { ProgressBar } from '../shared/ProgressBar.js';\nimport { StatusIcon } from '../shared/StatusIcon.js';\n\ntype ViewState = 'browse' | 'installing' | 'summary';\n\ninterface UnifiedApplyAppProps {\n config: Jai1Config;\n force?: boolean;\n onExit: () => void;\n}\n\ninterface InstallProgress {\n filepath: string;\n status: 'pending' | 'downloading' | 'success' | 'error';\n error?: string;\n}\n\n/**\n * Unified Apply App - All-in-one interface\n */\nexport const UnifiedApplyApp: React.FC<UnifiedApplyAppProps> = ({\n config,\n force = false,\n onExit\n}) => {\n const { exit } = useApp();\n\n // View state\n const [viewState, setViewState] = useState<ViewState>('browse');\n\n // Data state\n const [components, setComponents] = useState<Component[]>([]);\n const [tags, setTags] = useState<Tag[]>([]);\n const [installedPaths, setInstalledPaths] = useState<Set<string>>(new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedPaths, setSelectedPaths] = useState<Set<string>>(new Set());\n const [cursorIndex, setCursorIndex] = useState(0);\n const [focusArea, setFocusArea] = useState<'search' | 'packages' | 'components'>('components');\n const [selectedPackageIndex, setSelectedPackageIndex] = useState(0);\n\n // Install state\n const [installProgress, setInstallProgress] = useState<InstallProgress[]>([]);\n const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });\n\n const service = new ComponentsService();\n\n // Load data on mount\n useEffect(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const [comps, tagList, installed] = await Promise.all([\n service.list(config),\n service.listTags(config),\n service.getInstalled(),\n ]);\n setComponents(comps);\n setTags(tagList);\n setInstalledPaths(new Set(Object.keys(installed)));\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data');\n } finally {\n setLoading(false);\n }\n };\n loadData();\n }, []);\n\n // Filter components based on search\n const filteredComponents = useMemo(() => {\n if (!searchQuery.trim()) return components;\n const query = searchQuery.toLowerCase();\n return components.filter(c =>\n c.filepath.toLowerCase().includes(query) ||\n c.name.toLowerCase().includes(query) ||\n (c.tags && c.tags.some(t => t.toLowerCase().includes(query)))\n );\n }, [components, searchQuery]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Summary view - exit on Enter or q\n if (viewState === 'summary') {\n if (key.return || input === 'q' || key.escape) {\n onExit();\n }\n return;\n }\n\n // Installing view - no input\n if (viewState === 'installing') {\n return;\n }\n\n // Browse view\n // Tab to switch focus areas\n if (key.tab) {\n if (focusArea === 'search') setFocusArea('packages');\n else if (focusArea === 'packages') setFocusArea('components');\n else setFocusArea('search');\n return;\n }\n\n // Escape to exit\n if (key.escape || input === 'q') {\n onExit();\n return;\n }\n\n // Enter to apply\n if (key.return && focusArea !== 'search') {\n if (selectedPaths.size > 0) {\n handleApply();\n }\n return;\n }\n\n // Navigation in components\n if (focusArea === 'components') {\n if (key.upArrow) {\n setCursorIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setCursorIndex(prev => Math.min(filteredComponents.length - 1, prev + 1));\n } else if (input === ' ') {\n // Toggle selection\n const current = filteredComponents[cursorIndex];\n if (current) {\n setSelectedPaths(prev => {\n const next = new Set(prev);\n if (next.has(current.filepath)) {\n next.delete(current.filepath);\n } else {\n next.add(current.filepath);\n }\n return next;\n });\n }\n } else if (input === 'a') {\n // Select all filtered\n setSelectedPaths(prev => {\n const next = new Set(prev);\n filteredComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n } else if (input === 'c') {\n // Clear selection\n setSelectedPaths(new Set());\n }\n }\n\n // Navigation in packages\n if (focusArea === 'packages') {\n if (key.leftArrow) {\n setSelectedPackageIndex(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedPackageIndex(prev => Math.min(tags.length - 1, prev + 1));\n } else if (input === ' ' || key.return) {\n // Quick select package\n const tag = tags[selectedPackageIndex];\n if (tag) {\n const packageComponents = components.filter(c => c.tags?.includes(tag.tag));\n setSelectedPaths(prev => {\n const next = new Set(prev);\n packageComponents.forEach(c => next.add(c.filepath));\n return next;\n });\n // Also filter to this package\n setSearchQuery(tag.tag);\n }\n }\n }\n });\n\n // Handle apply\n const handleApply = async () => {\n setViewState('installing');\n const targetDir = process.cwd() + '/.jai1';\n const pathsToInstall = Array.from(selectedPaths);\n\n // Resolve dependencies\n const resolvedPaths = await service.resolveWithDependencies(config, pathsToInstall);\n const installed = await service.getInstalled();\n\n // Initialize progress\n const initialProgress: InstallProgress[] = resolvedPaths.map(fp => ({\n filepath: fp,\n status: 'pending' as const,\n }));\n setInstallProgress(initialProgress);\n setInstallStats({ total: resolvedPaths.length, completed: 0, added: 0, updated: 0, failed: 0 });\n\n let added = 0, updated = 0, failed = 0;\n\n for (let i = 0; i < resolvedPaths.length; i++) {\n const fp = resolvedPaths[i]!;\n\n // Update to downloading\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'downloading' as const } : p\n ));\n\n try {\n const info = installed[fp];\n if (info && !force && info.modified) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: 'Modified locally' } : p\n ));\n failed++;\n } else {\n await service.install(config, fp, targetDir);\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'success' as const } : p\n ));\n if (info) updated++;\n else added++;\n }\n } catch (err) {\n setInstallProgress(prev => prev.map(p =>\n p.filepath === fp ? { ...p, status: 'error' as const, error: err instanceof Error ? err.message : 'Error' } : p\n ));\n failed++;\n }\n\n setInstallStats({ total: resolvedPaths.length, completed: i + 1, added, updated, failed });\n }\n\n setViewState('summary');\n };\n\n // Render loading\n if (loading) {\n return (\n <Box padding={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /> Đang tải components...</Text>\n </Box>\n );\n }\n\n // Render error\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\">❌ Error: {error}</Text>\n <Text dimColor>Press q to exit</Text>\n </Box>\n );\n }\n\n // Render installing\n if (viewState === 'installing') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Installing Components</Text>\n </Box>\n\n <Box marginBottom={1}>\n <ProgressBar current={installStats.completed} total={installStats.total} width={50} />\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} height={10}>\n {installProgress.slice(-8).map((item) => (\n <Box key={item.filepath}>\n <StatusIcon status={\n item.status === 'success' ? 'success' :\n item.status === 'error' ? 'error' :\n item.status === 'downloading' ? 'loading' : 'pending'\n } />\n <Text> {item.filepath}</Text>\n {item.error && <Text color=\"red\" dimColor> ({item.error})</Text>}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text>\n 📊 <Text color=\"green\">{installStats.added} added</Text>\n {' · '}<Text color=\"cyan\">{installStats.updated} updated</Text>\n {' · '}<Text color=\"red\">{installStats.failed} failed</Text>\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Render summary\n if (viewState === 'summary') {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"green\">✅ Installation Complete!</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text>{installStats.total} components processed:</Text>\n <Text> └─ <Text color=\"green\">{installStats.added}</Text> newly added</Text>\n <Text> └─ <Text color=\"cyan\">{installStats.updated}</Text> updated</Text>\n {installStats.failed > 0 && <Text> └─ <Text color=\"red\">{installStats.failed}</Text> failed</Text>}\n </Box>\n\n <Box marginTop={1}>\n <Text>📁 Location: <Text color=\"cyan\">{process.cwd()}/.jai1</Text></Text>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>Press Enter or q to exit</Text>\n </Box>\n </Box>\n );\n }\n\n // Render browse (main view)\n const visibleComponents = filteredComponents.slice(0, 12);\n const hasMore = filteredComponents.length > 12;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📦 Jai1 Apply</Text>\n <Text dimColor> - Select components to install</Text>\n </Box>\n\n {/* Search Box */}\n <Box marginBottom={1}>\n <Text color={focusArea === 'search' ? 'cyan' : 'gray'}>🔍 Search: </Text>\n {focusArea === 'search' ? (\n <TextInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder=\"Type to filter...\"\n />\n ) : (\n <Text>{searchQuery || <Text dimColor>Press Tab to search</Text>}</Text>\n )}\n </Box>\n\n {/* Quick Packages */}\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold dimColor>Quick Apply (Packages):</Text>\n <Box marginTop={1} flexWrap=\"wrap\">\n {tags.slice(0, 6).map((tag, i) => {\n const isSelected = focusArea === 'packages' && i === selectedPackageIndex;\n return (\n <Box key={tag.tag} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n [{tag.tag}:{tag.count}]\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Components List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={focusArea === 'components' ? 'cyan' : 'gray'} padding={1}>\n <Box marginBottom={1}>\n <Text bold>Components </Text>\n <Text dimColor>({filteredComponents.length} shown{hasMore ? `, scroll for more` : ''})</Text>\n </Box>\n\n {visibleComponents.map((comp, i) => {\n const isCursor = i === cursorIndex && focusArea === 'components';\n const isChecked = selectedPaths.has(comp.filepath);\n const isInstalled = installedPaths.has(comp.filepath);\n\n return (\n <Box key={comp.filepath}>\n <Text color={isCursor ? 'cyan' : 'white'}>\n {isCursor ? '❯ ' : ' '}\n {isChecked ? '[✓]' : '[ ]'} {comp.filepath}\n </Text>\n <Text dimColor> {isInstalled ? '✓ installed' : '○ new'}</Text>\n </Box>\n );\n })}\n\n {filteredComponents.length === 0 && (\n <Text dimColor>No components match your search</Text>\n )}\n </Box>\n\n {/* Selected Preview */}\n {selectedPaths.size > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Selected: {selectedPaths.size} components</Text>\n <Box flexDirection=\"column\" marginLeft={2}>\n {Array.from(selectedPaths).slice(0, 4).map(fp => (\n <Text key={fp} dimColor>📌 {fp}</Text>\n ))}\n {selectedPaths.size > 4 && (\n <Text dimColor> ... and {selectedPaths.size - 4} more</Text>\n )}\n </Box>\n </Box>\n )}\n\n {/* Help */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Switch area · [↑↓] Navigate · [␣] Toggle · [a] Select all · [c] Clear · [Enter] Apply · [q] Quit\n </Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ProgressBarProps {\n current: number;\n total: number;\n width?: number;\n showPercentage?: boolean;\n color?: string;\n}\n\n/**\n * ASCII progress bar component\n */\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n current,\n total,\n width = 40,\n showPercentage = true,\n color = 'cyan',\n}) => {\n const percentage = total > 0 ? Math.round((current / total) * 100) : 0;\n const filled = Math.round((percentage / 100) * width);\n const empty = width - filled;\n\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return (\n <Box>\n <Text color={color}>{bar}</Text>\n {showPercentage && (\n <Text dimColor> {current}/{total} ({percentage}%)</Text>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Text } from 'ink';\nimport { theme } from './theme.js';\n\nexport type Status = 'success' | 'error' | 'pending' | 'loading' | 'warning';\n\ninterface StatusIconProps {\n status: Status;\n text?: string;\n}\n\n/**\n * Status icon component with optional text\n */\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status, text }) => {\n const iconMap: Record<Status, string> = {\n success: theme.icons.success,\n error: theme.icons.error,\n pending: theme.icons.pending,\n loading: theme.icons.loading,\n warning: theme.icons.warning,\n };\n\n const colorMap: Record<Status, string> = {\n success: 'green',\n error: 'red',\n pending: 'gray',\n loading: 'yellow',\n warning: 'yellow',\n };\n\n const icon = iconMap[status];\n const color = colorMap[status];\n\n return (\n <Text color={color}>\n {icon} {text}\n </Text>\n );\n};\n","/**\n * Theme configuration for Ink UI components\n */\n\nexport const theme = {\n colors: {\n primary: '#6366f1', // Indigo\n success: '#22c55e', // Green\n warning: '#eab308', // Yellow\n error: '#ef4444', // Red\n muted: '#6b7280', // Gray\n border: '#374151', // Dark gray\n text: '#f3f4f6', // Light gray\n background: '#1a1a2e', // Dark background\n },\n\n icons: {\n success: '✅',\n error: '❌',\n pending: '○',\n loading: '⏳',\n package: '📦',\n folder: '📁',\n file: '📄',\n tip: '💡',\n warning: '⚠️',\n checkmark: '✓',\n arrow: '→',\n bullet: '•',\n },\n\n borders: {\n single: {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n },\n double: {\n topLeft: '╔',\n topRight: '╗',\n bottomLeft: '╚',\n bottomRight: '╝',\n horizontal: '═',\n vertical: '║',\n },\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ConfigService } from '../services/config.service.js';\nimport { ComponentsService } from '../services/components.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n return new Command('update')\n .description('Update installed components to latest versions')\n .option('--force', 'Force update even if files are modified locally')\n .action(async (options: { force?: boolean }) => {\n await handleUpdate(options);\n });\n}\n\nasync function handleUpdate(options: { force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to add components.');\n return;\n }\n\n console.log('🔍 Checking for updates...');\n\n // Get checksums from API\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n console.log(`⚠️ ${fp}: Component not found on server (deprecated?)`);\n continue;\n }\n\n // Check if update needed based on checksum or version\n // Using checksum is more reliable for content changes\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n if (updates.length === 0) {\n console.log('✅ All components are up to date.');\n return;\n }\n\n console.log(`\\n📦 Found ${updates.length} updates:`);\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` - ${fp} (v${current.version} → v${latest.version})`);\n }\n console.log();\n\n if (!options.force) {\n const shouldUpdate = await confirm({ message: 'Update now?', default: true });\n if (!shouldUpdate) return;\n }\n\n // Perform updates\n const targetDir = process.cwd() + '/.jai1';\n let updatedCount = 0;\n const backupPaths: string[] = [];\n\n for (const fp of updates) {\n try {\n // Backup\n console.log(`📥 Updating ${fp}...`);\n const backupPath = await componentsService.backupFile(fp, targetDir);\n if (backupPath) {\n backupPaths.push(backupPath);\n // Simplify backup path for display\n const displayPath = backupPath.split('.jai1_backup/')[1];\n console.log(` Backed up: .../${displayPath}`);\n }\n\n // Install\n await componentsService.install(config, fp, targetDir);\n console.log(`✅ Updated`);\n updatedCount++;\n } catch (error) {\n console.log(`❌ Failed to update ${fp}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n console.log(`\\n✅ Update complete: ${updatedCount}/${updates.length} updated.`);\n\n if (backupPaths.length > 0) {\n console.log(`\\n📁 Backups created in .jai1_backup/`);\n\n // Default No for cleanup safety\n const cleanBackups = await confirm({ message: 'Clear these backups?', default: false });\n if (cleanBackups) {\n await componentsService.clearBackups(process.cwd());\n console.log('🗑️ Backups cleared.');\n } else {\n console.log('💡 Run \"jai1 clean\" to remove them later.');\n }\n }\n\n trackAction('components_update', { count: updatedCount });\n\n } catch (error) {\n throw new Error(`Update check failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ComponentsService } from '../../services/components.service.js';\nimport { trackAction } from '../../services/tracking.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { compareVersions, formatVersion } from '../../utils/version.js';\n\ninterface CheckOptions {\n json?: boolean;\n}\n\n/**\n * Create check command for Jai1 Framework\n * Checks current version and compares with latest from server\n */\nexport function createCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check for framework updates')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleCheck(options: CheckOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const componentsService = new ComponentsService();\n const installed = await componentsService.getInstalled();\n const filepaths = Object.keys(installed);\n\n if (filepaths.length === 0) {\n console.log('No components installed. Run \"jai1 apply\" to get started.');\n return;\n }\n\n console.log('Checking for updates...\\n');\n\n try {\n const checksums = await componentsService.getChecksums(config, filepaths);\n const updates: string[] = [];\n const upToDate: string[] = [];\n\n for (const fp of filepaths) {\n const current = installed[fp];\n const latest = checksums[fp];\n\n if (!latest) {\n // Component removed from server?\n continue;\n }\n\n if (current.checksum !== latest.checksum) {\n updates.push(fp);\n } else {\n upToDate.push(fp);\n }\n }\n\n // Output status\n console.log(`📌 Components status:`);\n\n // Show updates first\n for (const fp of updates) {\n const current = installed[fp];\n const latest = checksums[fp];\n console.log(` ${fp} v${current.version} → v${latest.version} ⚠️ UPDATE`);\n }\n\n // Show up-to-date (limit showing all if too many?)\n // Let's show all for now, or just summary\n if (updates.length === 0 && upToDate.length > 0) {\n console.log(` ✓ All ${upToDate.length} components up to date.`);\n } else if (upToDate.length > 0) {\n console.log(` ✓ ${upToDate.length} components up to date.`);\n }\n\n console.log();\n if (updates.length > 0) {\n console.log(`Status: ${updates.length} component(s) update available!`);\n console.log(`Run 'jai1 update' to update.`);\n } else {\n console.log(`Status: ✅ All good!`);\n }\n\n } catch (error) {\n console.error('Error checking updates:', error instanceof Error ? error.message : error);\n }\n}\n\n","/**\n * IDE Command Group\n * Manages IDE integration commands: context, setup, sync\n */\nimport { Command } from 'commander';\nimport { createContextSubcommand } from './context.js';\nimport { createSetupSubcommand } from './setup.js';\nimport { createSyncSubcommand } from './sync.js';\n\n/**\n * Create IDE command group\n * Subcommands:\n * - context: Browse and explore IDE context\n * - setup: Configure IDE settings (VSCode optimizations)\n * - sync: Sync .jai1 content to IDE directories\n */\nexport function createIdeCommand(): Command {\n const ideCommand = new Command('ide')\n .description('IDE integration and configuration commands');\n\n // Add subcommands\n ideCommand.addCommand(createContextSubcommand());\n ideCommand.addCommand(createSetupSubcommand());\n ideCommand.addCommand(createSyncSubcommand());\n\n // Default action - show help\n ideCommand.action(() => {\n ideCommand.help();\n });\n\n return ideCommand;\n}\n","/**\n * IDE Context Subcommand\n * Browse and explore IDE context (rules, workflows, skills, etc.)\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../../types/context.types.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\n/**\n * Create context subcommand for IDE group\n */\nexport function createContextSubcommand(): Command {\n const cmd = new Command('context')\n .description('Browse and explore IDE context (rules, workflows, skills)')\n .option('--target <ide>', 'Open specific IDE context (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Show specific content type (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Show context statistics (non-interactive)')\n .action(async (options: { target?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.target) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.target)) {\n console.error(`❌ Invalid IDE: ${options.target}`);\n console.error(` Valid IDEs: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.target as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Invalid content type: ${options.type}`);\n console.error(` Valid types: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Scanning context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ No context found');\n console.log(' Run `jai1 apply` to install context for your IDE.\\n');\n return;\n }\n\n console.log('📊 Context Statistics\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('en-US')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Total: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Error scanning context:', error);\n process.exit(1);\n }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport type { IDE, ContentType, IDEContext, ContextItem } from '../../types/context.types.js';\nimport { MainMenuView } from './views/MainMenuView.js';\nimport { IDEOverviewView } from './views/IDEOverviewView.js';\nimport { ListView } from './views/ListView.js';\nimport { DetailView } from './views/DetailView.js';\nimport { ContextScannerService } from '../../services/context-scanner.service.js';\n\nexport type ContextScreen = 'menu' | 'overview' | 'list' | 'detail';\n\ninterface ContextAppProps {\n initialIDE?: IDE;\n initialType?: ContentType;\n onExit: () => void;\n}\n\n/**\n * ContextApp - Interactive Context Visualizer\n */\nexport const ContextApp: React.FC<ContextAppProps> = ({ initialIDE, initialType, onExit }) => {\n const { exit } = useApp();\n const [screen, setScreen] = useState<ContextScreen>('menu');\n const [selectedIDE, setSelectedIDE] = useState<IDE | null>(initialIDE || null);\n const [selectedType, setSelectedType] = useState<ContentType | null>(initialType || null);\n const [selectedItem, setSelectedItem] = useState<ContextItem | null>(null);\n\n const [ideContexts, setIdeContexts] = useState<IDEContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Scan context on mount\n useEffect(() => {\n const scanner = new ContextScannerService();\n scanner.scanAll().then(result => {\n setIdeContexts(result.ides);\n setLoading(false);\n\n // If initialIDE is set, jump to overview\n if (initialIDE) {\n setScreen('overview');\n }\n }).catch(error => {\n console.error('Failed to scan context:', error);\n setLoading(false);\n });\n }, [initialIDE]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // q to quit (global)\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Escape or Backspace to go back (NOT in detail view - DetailView handles its own input)\n if (screen !== 'detail' && (key.escape || key.backspace)) {\n handleBack();\n return;\n }\n });\n\n const handleBack = () => {\n if (screen === 'detail') {\n setScreen('list');\n setSelectedItem(null);\n setScrollPosition(0);\n } else if (screen === 'list') {\n setScreen('overview');\n setSelectedType(null);\n } else if (screen === 'overview') {\n setScreen('menu');\n setSelectedIDE(null);\n } else {\n onExit();\n }\n };\n\n const handleSelectIDE = (ide: IDE) => {\n setSelectedIDE(ide);\n setScreen('overview');\n };\n\n const handleSelectType = (type: ContentType) => {\n setSelectedType(type);\n setScreen('list');\n };\n\n const handleSelectItem = (item: ContextItem) => {\n setSelectedItem(item);\n setScreen('detail');\n setScrollPosition(0);\n };\n\n // Get current IDE context\n const currentIDEContext = ideContexts.find(ctx => ctx.ide === selectedIDE);\n\n // Get current items for selected type\n const currentItems = currentIDEContext?.items.filter(item => item.type === selectedType) || [];\n\n // Render appropriate view\n const renderContent = () => {\n if (loading) {\n return (\n <Box padding={1}>\n <Text>Đang quét context...</Text>\n </Box>\n );\n }\n\n switch (screen) {\n case 'menu':\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n case 'overview':\n return currentIDEContext ? (\n <IDEOverviewView\n ideContext={currentIDEContext}\n onSelectType={handleSelectType}\n onBack={handleBack}\n />\n ) : null;\n case 'list':\n return (\n <ListView\n items={currentItems}\n contentType={selectedType!}\n onSelect={handleSelectItem}\n onBack={handleBack}\n />\n );\n case 'detail':\n return selectedItem ? (\n <DetailView\n item={selectedItem}\n scrollPosition={scrollPosition}\n onBack={handleBack}\n />\n ) : null;\n default:\n return <MainMenuView ideContexts={ideContexts} onSelect={handleSelectIDE} />;\n }\n };\n\n // Get footer hints based on screen\n const getFooterHints = () => {\n switch (screen) {\n case 'menu':\n return '[↑↓] Chọn · [Enter] Mở · [q] Thoát';\n case 'overview':\n return '[Tab/1-6] Chuyển tab · [Enter] Xem danh sách · [Esc/←] Quay lại · [q] Thoát';\n case 'list':\n return '[↑↓] Chọn · [Enter] Chi tiết · [Esc/←] Quay lại · [q] Thoát';\n case 'detail':\n return '[↑↓/j/k] Cuộn · [PgUp/u PgDn/d] Cuộn nhanh · [g/G] Đầu/Cuối · [Esc/←] Quay lại · [q] Thoát';\n default:\n return '[q] Thoát';\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">📋 Jai1 Context</Text>\n <Text dimColor> - Khám phá context dự án</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{getFooterHints()}</Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDE, IDEContext } from '../../../types/context.types.js';\n\ninterface MainMenuViewProps {\n ideContexts: IDEContext[];\n onSelect: (ide: IDE) => void;\n}\n\ninterface IDEMenuItem {\n ide: IDE;\n icon: string;\n title: string;\n itemCount: number;\n available: boolean;\n}\n\n/**\n * MainMenuView - IDE selector menu\n */\nexport const MainMenuView: React.FC<MainMenuViewProps> = ({ ideContexts, onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build menu items\n const menuItems: IDEMenuItem[] = [\n {\n ide: 'cursor',\n icon: '🔮',\n title: 'Cursor',\n itemCount: ideContexts.find(ctx => ctx.ide === 'cursor')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'cursor'),\n },\n {\n ide: 'windsurf',\n icon: '🏄',\n title: 'Windsurf',\n itemCount: ideContexts.find(ctx => ctx.ide === 'windsurf')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'windsurf'),\n },\n {\n ide: 'antigravity',\n icon: '🚀',\n title: 'Antigravity (Claude)',\n itemCount: ideContexts.find(ctx => ctx.ide === 'antigravity')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'antigravity'),\n },\n {\n ide: 'jai1',\n icon: '🤖',\n title: 'Jai1 Framework',\n itemCount: ideContexts.find(ctx => ctx.ide === 'jai1')?.stats.totalItems || 0,\n available: ideContexts.some(ctx => ctx.ide === 'jai1'),\n },\n ];\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(menuItems.length - 1, prev + 1));\n } else if (key.return) {\n const item = menuItems[selectedIndex];\n if (item && item.available) {\n onSelect(item.ide);\n }\n }\n }, { isActive: true });\n\n // Format item count summary\n const formatSummary = (item: IDEMenuItem): string => {\n if (!item.available) {\n return 'Không có context';\n }\n\n const ctx = ideContexts.find(c => c.ide === item.ide);\n if (!ctx) return '';\n\n const parts: string[] = [];\n if (ctx.stats.byType.rules) parts.push(`${ctx.stats.byType.rules} rules`);\n if (ctx.stats.byType.workflows) parts.push(`${ctx.stats.byType.workflows} workflows`);\n if (ctx.stats.byType.skills) parts.push(`${ctx.stats.byType.skills} skills`);\n if (ctx.stats.byType.agents) parts.push(`${ctx.stats.byType.agents} agents`);\n if (ctx.stats.byType.prompts) parts.push(`${ctx.stats.byType.prompts} prompts`);\n\n return parts.join(', ') || `${item.itemCount} items`;\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"cyan\">Jai1 Context</Text>!</Text>\n <Text dimColor>\n Khám phá và quản lý context cho các IDE hỗ trợ Agentic Coding.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn IDE để khám phá:</Text>\n\n {menuItems.map((item, index) => {\n const isSelected = index === selectedIndex;\n const dimmed = !item.available;\n\n return (\n <Box key={item.ide} marginY={0}>\n <Text color={isSelected ? 'cyan' : dimmed ? 'gray' : 'white'} dimColor={dimmed}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.available && (\n <Text dimColor> - {formatSummary(item)}</Text>\n )}\n {!item.available && (\n <Text dimColor> - Không có context</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n {ideContexts.length === 0 && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"yellow\" padding={1}>\n <Text color=\"yellow\">⚠️ Không tìm thấy context nào</Text>\n <Text dimColor>Hãy chạy </Text>\n <Text color=\"cyan\">jai1 apply</Text>\n <Text dimColor> để cài đặt context cho IDE của bạn.</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { IDEContext, ContentType } from '../../../types/context.types.js';\n\ninterface IDEOverviewViewProps {\n ideContext: IDEContext;\n onSelectType: (type: ContentType) => void;\n onBack: () => void;\n}\n\ninterface ContentTypeTab {\n type: ContentType;\n label: string;\n icon: string;\n count: number;\n}\n\n/**\n * IDEOverviewView - Overview of an IDE's context with tabs\n */\nexport const IDEOverviewView: React.FC<IDEOverviewViewProps> = ({\n ideContext,\n onSelectType,\n onBack,\n}) => {\n const [selectedTabIndex, setSelectedTabIndex] = useState(0);\n\n // Build tabs from available content types\n const tabs: ContentTypeTab[] = [];\n\n if (ideContext.stats.byType.rules) {\n tabs.push({\n type: 'rules',\n label: 'Rules',\n icon: '📜',\n count: ideContext.stats.byType.rules,\n });\n }\n if (ideContext.stats.byType.workflows) {\n tabs.push({\n type: 'workflows',\n label: 'Workflows',\n icon: '🔄',\n count: ideContext.stats.byType.workflows,\n });\n }\n if (ideContext.stats.byType.skills) {\n tabs.push({\n type: 'skills',\n label: 'Skills',\n icon: '🛠',\n count: ideContext.stats.byType.skills,\n });\n }\n if (ideContext.stats.byType.agents) {\n tabs.push({\n type: 'agents',\n label: 'Agents',\n icon: '🤖',\n count: ideContext.stats.byType.agents,\n });\n }\n if (ideContext.stats.byType.prompts) {\n tabs.push({\n type: 'prompts',\n label: 'Prompts',\n icon: '💬',\n count: ideContext.stats.byType.prompts,\n });\n }\n if (ideContext.stats.byType.context) {\n tabs.push({\n type: 'context',\n label: 'Context',\n icon: '📋',\n count: ideContext.stats.byType.context,\n });\n }\n\n useInput((input, key) => {\n // Tab navigation\n if (key.tab || key.rightArrow) {\n setSelectedTabIndex(prev => Math.min(tabs.length - 1, prev + 1));\n } else if (key.leftArrow) {\n setSelectedTabIndex(prev => Math.max(0, prev - 1));\n }\n\n // Number shortcuts (1-6)\n const num = parseInt(input, 10);\n if (!isNaN(num) && num >= 1 && num <= tabs.length) {\n setSelectedTabIndex(num - 1);\n }\n\n // Enter to select\n if (key.return) {\n const tab = tabs[selectedTabIndex];\n if (tab) {\n onSelectType(tab.type);\n }\n }\n }, { isActive: true });\n\n // Get current tab\n const currentTab = tabs[selectedTabIndex];\n\n // Get items for current tab\n const currentItems = currentTab\n ? ideContext.items.filter(item => item.type === currentTab.type)\n : [];\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleDateString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n };\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{ideContext.config.icon} {ideContext.config.name}</Text>\n </Box>\n\n {/* Summary Stats */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n marginBottom={1}\n >\n <Text bold>📊 Tổng quan</Text>\n <Box marginTop={1}>\n <Text>\n 📁 Tổng: <Text bold color=\"cyan\">{ideContext.stats.totalItems} items</Text>\n </Text>\n <Text dimColor> · </Text>\n <Text>\n 💾 Kích thước: <Text bold>{formatSize(ideContext.stats.totalSize)}</Text>\n </Text>\n {ideContext.stats.lastModified && (\n <>\n <Text dimColor> · </Text>\n <Text>\n 🕐 Cập nhật: <Text bold>{formatDate(ideContext.stats.lastModified)}</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* Content Type Tabs */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {/* Tab Headers */}\n <Box marginBottom={1}>\n {tabs.map((tab, index) => {\n const isSelected = index === selectedTabIndex;\n return (\n <Box key={tab.type} marginRight={1}>\n <Text\n color={isSelected ? 'cyan' : 'gray'}\n bold={isSelected}\n inverse={isSelected}\n >\n {' '}{tab.icon} {tab.label} ({tab.count}){' '}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Tab Content Preview */}\n {currentTab && currentItems.length > 0 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Preview (nhấn Enter để xem chi tiết):</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {currentItems.slice(0, 5).map(item => (\n <Box key={item.id} marginY={0}>\n <Text>• {item.name}</Text>\n {item.description && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n ))}\n {currentItems.length > 5 && (\n <Text dimColor>... và {currentItems.length - 5} items khác</Text>\n )}\n </Box>\n </Box>\n )}\n\n {currentTab && currentItems.length === 0 && (\n <Text dimColor>Không có items nào trong {currentTab.label}</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem, ContentType } from '../../../types/context.types.js';\n\ninterface ListViewProps {\n items: ContextItem[];\n contentType: ContentType;\n onSelect: (item: ContextItem) => void;\n onBack: () => void;\n}\n\n/**\n * ListView - List view for context items\n */\nexport const ListView: React.FC<ListViewProps> = ({ items, contentType, onSelect, onBack }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(items.length - 1, prev + 1));\n } else if (key.return) {\n const item = items[selectedIndex];\n if (item) {\n onSelect(item);\n }\n }\n }, { isActive: true });\n\n // Get type label\n const getTypeLabel = (): string => {\n switch (contentType) {\n case 'rules':\n return '📜 Rules';\n case 'workflows':\n return '🔄 Workflows';\n case 'skills':\n return '🛠 Skills';\n case 'agents':\n return '🤖 Agents';\n case 'prompts':\n return '💬 Prompts';\n case 'context':\n return '📋 Context';\n default:\n return contentType;\n }\n };\n\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n if (items.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n </Box>\n <Box borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text dimColor>Không có items nào</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{getTypeLabel()}</Text>\n <Text dimColor> - {items.length} items</Text>\n </Box>\n\n {/* Items List */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n\n return (\n <Box key={item.id} flexDirection=\"column\" marginY={0}>\n <Box>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.name}\n </Text>\n <Text dimColor> ({formatSize(item.fileSize)})</Text>\n </Box>\n\n {isSelected && (\n <Box marginLeft={3} flexDirection=\"column\">\n {item.description && (\n <Text dimColor>📝 {item.description}</Text>\n )}\n\n {/* Rules-specific metadata */}\n {contentType === 'rules' && (\n <>\n {item.alwaysApply && (\n <Text dimColor>✅ Always active</Text>\n )}\n {item.globs && item.globs.length > 0 && (\n <Text dimColor>🎯 Globs: {item.globs.join(', ')}</Text>\n )}\n </>\n )}\n\n {/* Skills-specific metadata */}\n {contentType === 'skills' && (\n <Box>\n {item.hasScripts && <Text dimColor>📦 scripts/ </Text>}\n {item.hasReferences && <Text dimColor>📚 references/ </Text>}\n {item.hasAssets && <Text dimColor>🎨 assets/ </Text>}\n </Box>\n )}\n\n {/* Agents-specific metadata */}\n {contentType === 'agents' && item.model && (\n <Text dimColor>🔧 Model: {item.model}</Text>\n )}\n\n <Text dimColor>📁 {item.relativePath}</Text>\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ContextItem } from '../../../types/context.types.js';\n\ninterface DetailViewProps {\n item: ContextItem;\n scrollPosition: number;\n onBack: () => void;\n}\n\n/**\n * DetailView - Detail view for a context item with metadata and preview\n */\nexport const DetailView: React.FC<DetailViewProps> = ({ item, scrollPosition: initialScroll, onBack }) => {\n // Local scroll state\n const [scrollPosition, setScrollPosition] = useState(initialScroll);\n const maxVisibleLines = 25;\n const maxScroll = Math.max(0, item.previewLines.length - maxVisibleLines);\n\n // Handle keyboard input for scrolling\n useInput((input, key) => {\n // Scroll controls\n if (key.upArrow || input === 'k') {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow || input === 'j') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 1));\n } else if (key.pageDown || input === 'd') {\n setScrollPosition(prev => Math.min(maxScroll, prev + 5));\n } else if (key.pageUp || input === 'u') {\n setScrollPosition(prev => Math.max(0, prev - 5));\n } else if (input === 'g') {\n setScrollPosition(0);\n } else if (input === 'G') {\n setScrollPosition(maxScroll);\n }\n // Back navigation\n else if (key.escape || key.backspace) {\n onBack();\n }\n }, { isActive: true });\n // Format file size\n const formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n };\n\n // Format date\n const formatDate = (date: Date): string => {\n return date.toLocaleString('vi-VN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n // Get visible preview lines based on scroll\n const visibleLines = item.previewLines.slice(\n scrollPosition,\n scrollPosition + maxVisibleLines\n );\n\n const hasMoreAbove = scrollPosition > 0;\n const hasMoreBelow = scrollPosition + maxVisibleLines < item.previewLines.length;\n\n // Calculate scroll percentage\n const scrollPercentage = item.previewLines.length <= maxVisibleLines\n ? 100\n : Math.round((scrollPosition / maxScroll) * 100);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header with compact metadata */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"cyan\">{item.name}</Text>\n <Box>\n <Text dimColor>{item.relativePath} • {formatSize(item.fileSize)}</Text>\n {item.description && <Text dimColor> • {item.description}</Text>}\n </Box>\n <Box>\n {/* Type-specific metadata in one line */}\n {item.type === 'rules' && item.globs && item.globs.length > 0 && (\n <Text dimColor>globs: {item.globs.join(', ')}</Text>\n )}\n {item.type === 'agents' && item.model && (\n <Text dimColor>model: {item.model}</Text>\n )}\n {item.type === 'skills' && (\n <Text dimColor>\n {item.hasScripts && '📦 scripts '}\n {item.hasReferences && '📚 refs '}\n {item.hasAssets && '🎨 assets'}\n </Text>\n )}\n </Box>\n </Box>\n\n {/* Preview Panel */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Box justifyContent=\"space-between\">\n <Text bold>👁️ Preview</Text>\n {item.previewLines.length > maxVisibleLines && (\n <Text dimColor>\n [{scrollPosition + 1}-{Math.min(scrollPosition + maxVisibleLines, item.previewLines.length)}/{item.lineCount}] {scrollPercentage}%\n </Text>\n )}\n </Box>\n\n {hasMoreAbove && (\n <Box justifyContent=\"center\">\n <Text dimColor>▲ ▲ ▲ ({scrollPosition} dòng ở trên) ▲ ▲ ▲</Text>\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n {visibleLines.map((line, index) => {\n const lineNumber = scrollPosition + index + 1;\n return (\n <Box key={index}>\n <Text dimColor>{lineNumber.toString().padStart(3, ' ')}│ </Text>\n <Text>{line}</Text>\n </Box>\n );\n })}\n </Box>\n\n {hasMoreBelow && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>\n ▼ ▼ ▼ ({item.lineCount - scrollPosition - visibleLines.length} dòng ở dưới) ▼ ▼ ▼\n </Text>\n </Box>\n )}\n\n {item.previewLines.length === 0 && (\n <Text dimColor>Không có nội dung để hiển thị</Text>\n )}\n </Box>\n </Box>\n );\n};\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport type {\n IDE,\n ContentType,\n ContextItem,\n IDEContext,\n ProjectContext,\n ContextStats,\n} from '../types/context.types.js';\nimport { IDE_CONFIGS, getAllIDEs } from '../constants/ide-configs.js';\n\n/**\n * Service for scanning and parsing context files\n */\nexport class ContextScannerService {\n private projectPath: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Scan all IDEs for context\n */\n async scanAll(): Promise<ProjectContext> {\n const ides = await this.detectIDEs();\n const ideContexts: IDEContext[] = [];\n\n for (const ide of ides) {\n try {\n const context = await this.scanIDE(ide);\n if (context.items.length > 0) {\n ideContexts.push(context);\n }\n } catch (error) {\n // Skip IDEs that fail to scan\n console.error(`Failed to scan ${ide}:`, error);\n }\n }\n\n const totalItems = ideContexts.reduce((sum, ctx) => sum + ctx.items.length, 0);\n\n return {\n projectPath: this.projectPath,\n ides: ideContexts,\n totalItems,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific IDE\n */\n async scanIDE(ide: IDE): Promise<IDEContext> {\n const config = IDE_CONFIGS[ide];\n const items: ContextItem[] = [];\n\n // Scan each content type\n for (const [type, relativePath] of Object.entries(config.contentPaths)) {\n if (!relativePath) continue;\n\n const contentType = type as ContentType;\n try {\n const typeItems = await this.scanType(ide, contentType);\n items.push(...typeItems);\n } catch (error) {\n // Skip types that fail to scan (directory doesn't exist, etc.)\n }\n }\n\n const stats = this.calculateStats(items);\n\n return {\n ide,\n config,\n items,\n stats,\n scanTime: new Date(),\n };\n }\n\n /**\n * Scan specific content type\n */\n async scanType(ide: IDE, type: ContentType): Promise<ContextItem[]> {\n const config = IDE_CONFIGS[ide];\n const relativePath = config.contentPaths[type];\n if (!relativePath) return [];\n\n let dirPath: string;\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1', relativePath);\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework', relativePath);\n\n // Use whichever path exists\n if (await this.pathExists(jai1Path)) {\n dirPath = jai1Path;\n } else if (await this.pathExists(frameworkPath)) {\n dirPath = frameworkPath;\n } else {\n return [];\n }\n } else {\n dirPath = path.join(this.projectPath, config.basePath, relativePath);\n\n // Check if directory exists\n try {\n await fs.access(dirPath);\n } catch {\n return [];\n }\n }\n\n const extensions = config.fileExtensions[type] || [];\n const items: ContextItem[] = [];\n\n // Special handling for skills (folders with SKILL.md)\n if (type === 'skills') {\n const skillItems = await this.scanSkills(dirPath, ide);\n items.push(...skillItems);\n } else {\n // Regular files\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n\n if (!stat.isFile()) continue;\n\n // Check if file matches extensions\n const matchesExtension = extensions.some(ext => file.endsWith(ext));\n if (!matchesExtension) continue;\n\n try {\n const item = await this.parseContextItem(filepath, ide, type);\n items.push(item);\n } catch (error) {\n console.error(`Failed to parse ${filepath}:`, error);\n }\n }\n }\n\n return items;\n }\n\n /**\n * Scan skills (folders with SKILL.md)\n */\n private async scanSkills(skillsDir: string, ide: IDE): Promise<ContextItem[]> {\n const items: ContextItem[] = [];\n\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = path.join(skillsDir, entry.name);\n const skillFilePath = path.join(skillPath, 'SKILL.md');\n\n // Check if SKILL.md exists\n try {\n await fs.access(skillFilePath);\n } catch {\n continue;\n }\n\n // Parse SKILL.md\n const item = await this.parseContextItem(skillFilePath, ide, 'skills');\n\n // Check for additional folders\n item.hasScripts = await this.pathExists(path.join(skillPath, 'scripts'));\n item.hasReferences = await this.pathExists(path.join(skillPath, 'references'));\n item.hasAssets = await this.pathExists(path.join(skillPath, 'assets'));\n\n items.push(item);\n }\n } catch (error) {\n console.error(`Failed to scan skills:`, error);\n }\n\n return items;\n }\n\n /**\n * Parse a context item from file\n */\n private async parseContextItem(\n filepath: string,\n ide: IDE,\n type: ContentType\n ): Promise<ContextItem> {\n const content = await fs.readFile(filepath, 'utf-8');\n const stat = await fs.stat(filepath);\n\n // Parse frontmatter\n const { data: frontmatter, content: bodyContent } = matter(content);\n\n // Extract description\n const config = IDE_CONFIGS[ide];\n const description = frontmatter[config.frontmatterSchema.descriptionField] as string | undefined;\n\n // Extract globs/trigger info\n let globs: string[] | undefined;\n let alwaysApply: boolean | undefined;\n\n if (config.frontmatterSchema.alwaysApplyField) {\n const alwaysField = frontmatter[config.frontmatterSchema.alwaysApplyField];\n alwaysApply = alwaysField === true || alwaysField === 'always' || alwaysField === 'always_on';\n }\n\n const triggerValue = frontmatter[config.frontmatterSchema.triggerField];\n if (typeof triggerValue === 'string') {\n globs = [triggerValue];\n } else if (Array.isArray(triggerValue)) {\n globs = triggerValue;\n }\n\n // Extract preview lines\n const { previewLines, lineCount } = this.extractPreview(bodyContent, 20);\n\n // Generate ID\n const relativePath = path.relative(this.projectPath, filepath);\n const id = `${ide}-${type}-${path.basename(filepath, path.extname(filepath))}`;\n\n // Extract name\n const name = frontmatter.name || path.basename(filepath, path.extname(filepath));\n\n return {\n id,\n ide,\n type,\n name,\n filepath,\n relativePath,\n frontmatter,\n description,\n globs,\n alwaysApply,\n model: frontmatter.model as string | undefined,\n fileSize: stat.size,\n modifiedAt: stat.mtime,\n previewLines,\n lineCount,\n };\n }\n\n /**\n * Extract preview lines (after frontmatter)\n */\n private extractPreview(content: string, maxLines: number = 20): { previewLines: string[]; lineCount: number } {\n const lines = content.split('\\n');\n const previewLines = lines.slice(0, maxLines);\n const lineCount = lines.length;\n\n return { previewLines, lineCount };\n }\n\n /**\n * Detect available IDEs in project\n */\n async detectIDEs(): Promise<IDE[]> {\n const ides: IDE[] = [];\n\n for (const ide of getAllIDEs()) {\n const config = IDE_CONFIGS[ide];\n\n // For jai1, check both .jai1 and packages/jai1-framework\n if (ide === 'jai1') {\n const jai1Path = path.join(this.projectPath, '.jai1');\n const frameworkPath = path.join(this.projectPath, 'packages/jai1-framework');\n\n if (await this.pathExists(jai1Path) || await this.pathExists(frameworkPath)) {\n ides.push(ide);\n }\n } else {\n const idePath = path.join(this.projectPath, config.basePath);\n if (await this.pathExists(idePath)) {\n ides.push(ide);\n }\n }\n }\n\n return ides;\n }\n\n /**\n * Check if path exists\n */\n private async pathExists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate statistics from items\n */\n private calculateStats(items: ContextItem[]): ContextStats {\n const byType: Partial<Record<ContentType, number>> = {};\n\n for (const item of items) {\n byType[item.type] = (byType[item.type] || 0) + 1;\n }\n\n const totalSize = items.reduce((sum, item) => sum + item.fileSize, 0);\n\n const lastModified = items.length > 0\n ? items.reduce((latest, item) =>\n item.modifiedAt > latest ? item.modifiedAt : latest,\n items[0]!.modifiedAt\n )\n : null;\n\n return {\n totalItems: items.length,\n byType,\n totalSize,\n lastModified,\n };\n }\n}\n","import type { IDE, IDEConfig } from '../types/context.types.js';\n\n/**\n * IDE configurations for context scanning\n */\nexport const IDE_CONFIGS: Record<IDE, IDEConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n contentPaths: {\n rules: 'rules',\n workflows: 'commands', // Cursor uses \"commands\" for workflows\n },\n fileExtensions: {\n rules: ['.mdc'], // Cursor-specific markdown\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always'\n descriptionField: 'description',\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity (Claude)',\n icon: '🚀',\n basePath: '.agent',\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'trigger',\n alwaysApplyField: 'trigger', // Value: 'always_on'\n descriptionField: 'description',\n },\n },\n jai1: {\n id: 'jai1',\n name: 'Jai1 Framework',\n icon: '🤖',\n basePath: '.jai1', // Or packages/jai1-framework\n contentPaths: {\n rules: 'rules',\n workflows: 'workflows',\n skills: 'skills', // Folders with SKILL.md\n agents: 'agents',\n prompts: 'prompts',\n context: 'context',\n },\n fileExtensions: {\n rules: ['.md'],\n workflows: ['.md'],\n skills: ['SKILL.md'], // Special handling for skill folders\n agents: ['.md'],\n prompts: ['.md'],\n context: ['.md'],\n },\n frontmatterSchema: {\n triggerField: 'globs',\n alwaysApplyField: 'alwaysApply',\n descriptionField: 'description',\n },\n },\n};\n\n/**\n * Get IDE config by ID\n */\nexport function getIDEConfig(ide: IDE): IDEConfig {\n return IDE_CONFIGS[ide];\n}\n\n/**\n * Get all IDE IDs\n */\nexport function getAllIDEs(): IDE[] {\n return Object.keys(IDE_CONFIGS) as IDE[];\n}\n","/**\n * IDE Setup Subcommand\n * Configure IDE settings (VSCode optimizations, etc.)\n * \n * This is a wrapper that re-exports the existing vscode command\n * but as a subcommand under 'ide setup'\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Disable all telemetry and data collection',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Disable/reduce language server load (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Disable built-in Git for better performance',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Exclude directories from file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Exclude directories from search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Disable auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Optimize rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Hide unnecessary UI elements',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\n/**\n * Create setup subcommand for IDE group\n * Manages IDE settings (VSCode optimizations)\n */\nexport function createSetupSubcommand(): Command {\n const setupCommand = new Command('setup')\n .description('Configure IDE settings and optimizations');\n\n // Interactive mode (default)\n setupCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n setupCommand\n .command('enable')\n .description('Enable specific optimization groups')\n .argument('[groups...]', 'Group names to enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n setupCommand\n .command('disable')\n .description('Disable specific optimization groups (restore to default)')\n .argument('[groups...]', 'Group names to disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n setupCommand\n .command('max-performance')\n .description('Enable all optimizations for maximum performance')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n setupCommand\n .command('reset')\n .description('Reset to default settings (remove all optimizations)')\n .argument('[groups...]', 'Group names to reset (empty = reset all)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n setupCommand\n .command('list')\n .description('List all available optimization groups')\n .action(() => {\n console.log('🔧 Available optimization groups:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return setupCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 IDE Settings Manager\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Usage: │');\n console.log('│ • Use ↑↓ keys to navigate │');\n console.log('│ • Press SPACE to select/deselect group │');\n console.log('│ • Press ENTER to confirm and apply │');\n console.log('│ • Press Ctrl+C to cancel │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'What do you want to do?',\n choices: [\n { name: '✅ Enable optimization groups', value: 'enable' },\n { name: '❌ Disable optimization groups', value: 'disable' },\n { name: '🚀 Max Performance (enable all)', value: 'max' },\n { name: '🔄 Reset to defaults', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Select groups to ${action} (SPACE to select, ENTER to confirm):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ No groups selected!');\n console.log(' 💡 Tip: Press SPACE to select at least 1 group before pressing ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Operation cancelled.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Invalid groups: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Run \"jai1 ide setup list\" to see available groups.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Created .vscode/ directory');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Read current settings from settings.json');\n } catch {\n console.warn('⚠️ Cannot read settings.json (may contain comments).');\n const confirmOverwrite = await confirm({\n message: 'Overwrite current settings.json file?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Operation cancelled.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 ${action === 'enable' ? 'Enabling' : 'Disabling'} groups:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Updated IDE settings at: ${settingsPath}`);\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ No settings.json file found');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset ALL settings to default (delete entire file)?'\n : `Reset groups: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Operation cancelled.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Deleted settings.json file');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Tip: Restart your IDE to apply changes.');\n}\n","/**\n * IDE Sync Subcommand\n * Sync .jai1 content to IDE directories (rules, workflows, commands)\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../../constants/ide-migration-configs.js';\n\n/**\n * Create sync subcommand for IDE group\n * Syncs .jai1 content to IDE-specific directories\n */\nexport function createSyncSubcommand(): Command {\n const cmd = new Command('sync')\n .description('Sync .jai1 content to IDE directories (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runSync(options);\n });\n\n return cmd;\n}\n\nasync function runSync(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Sync rules and workflows to IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ No content found in .jai1/');\n console.log(' 💡 Create files in .jai1/rules/ or .jai1/workflows/ first.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Select target IDE(s) (SPACE to select, ENTER to confirm):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ No IDE selected!');\n console.log(' 💡 Select at least 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Select content types to sync:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ No content type selected!');\n console.log(' 💡 Select at least 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with sync?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Sync cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Syncing...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Sync complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n","/**\n * Migration service for IDE content migration\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport matter from 'gray-matter';\nimport type {\n MigrateIDE,\n MigrateContentType,\n SourceContentItem,\n MigrationResult,\n ScanSummary,\n IDEMigrationConfig,\n} from '../types/migrate-ide.types.js';\nimport { IDE_MIGRATION_CONFIGS } from '../constants/ide-migration-configs.js';\n\nexport class MigrateIdeService {\n private projectPath: string;\n private jai1Path: string;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.jai1Path = path.join(projectPath, '.jai1');\n }\n\n /**\n * Scan .jai1/ directory for content\n */\n async scanJai1Content(): Promise<ScanSummary> {\n const rules = await this.scanContentType('rules');\n const workflows = await this.scanContentType('workflows');\n const commands: SourceContentItem[] = [];\n\n return {\n rules,\n workflows,\n commands,\n totalCount: rules.length + workflows.length + commands.length,\n };\n }\n\n /**\n * Scan a specific content type\n */\n private async scanContentType(type: MigrateContentType): Promise<SourceContentItem[]> {\n const items: SourceContentItem[] = [];\n const dirPath = path.join(this.jai1Path, type);\n\n try {\n await fs.access(dirPath);\n } catch {\n return items;\n }\n\n const files = await fs.readdir(dirPath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const filepath = path.join(dirPath, file);\n const stat = await fs.stat(filepath);\n if (!stat.isFile()) continue;\n\n const content = await fs.readFile(filepath, 'utf-8');\n const { data: frontmatter } = matter(content);\n\n items.push({\n type,\n name: path.basename(file, '.md'),\n filepath,\n relativePath: path.relative(this.projectPath, filepath),\n description: frontmatter.description as string | undefined,\n globs: this.extractGlobs(frontmatter),\n alwaysApply: this.extractAlwaysApply(frontmatter),\n });\n }\n\n return items;\n }\n\n /**\n * Generate stub file content with @ reference\n */\n generateStubContent(\n ide: MigrateIDE,\n sourceItem: SourceContentItem\n ): string {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) throw new Error(`Unknown IDE: ${ide}`);\n\n // Generate IDE-specific frontmatter\n const frontmatter = config.generateFrontmatter({\n description: sourceItem.description,\n globs: sourceItem.globs,\n alwaysApply: sourceItem.alwaysApply,\n sourceFile: sourceItem.relativePath,\n });\n\n // Generate @ reference\n const reference = `@${sourceItem.relativePath}`;\n\n // Combine frontmatter and reference\n if (frontmatter) {\n return `${frontmatter}\\n\\n${reference}\\n`;\n }\n return `${reference}\\n`;\n }\n\n /**\n * Migrate content to specific IDEs\n */\n async migrate(\n ides: MigrateIDE[],\n contentTypes: MigrateContentType[],\n content: ScanSummary,\n onProgress?: (result: MigrationResult) => void\n ): Promise<MigrationResult[]> {\n const results: MigrationResult[] = [];\n\n for (const ide of ides) {\n const config = IDE_MIGRATION_CONFIGS[ide];\n if (!config) continue;\n\n // Migrate each content type\n for (const type of contentTypes) {\n const items = type === 'rules' ? content.rules :\n type === 'workflows' ? content.workflows :\n content.commands;\n\n for (const item of items) {\n const result = await this.migrateItem(ide, config, item);\n results.push(result);\n onProgress?.(result);\n }\n }\n }\n\n return results;\n }\n\n /**\n * Migrate a single item\n */\n private async migrateItem(\n ide: MigrateIDE,\n config: IDEMigrationConfig,\n item: SourceContentItem\n ): Promise<MigrationResult> {\n try {\n // Determine target path\n const targetPath = this.getTargetPath(config, item);\n\n if (!targetPath) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'skipped',\n error: `IDE ${config.id} does not support ${item.type}`,\n };\n }\n\n // Ensure directory exists\n const targetDir = path.dirname(targetPath);\n await fs.mkdir(targetDir, { recursive: true });\n\n // Check if file exists\n let status: 'created' | 'updated' = 'created';\n try {\n await fs.access(targetPath);\n status = 'updated';\n } catch {\n // File doesn't exist, will be created\n }\n\n // Generate stub content\n const stubContent = this.generateStubContent(ide, item);\n\n // Write file\n await fs.writeFile(targetPath, stubContent, 'utf-8');\n\n return {\n source: item,\n targetIDE: ide,\n targetPath,\n status,\n };\n } catch (error) {\n return {\n source: item,\n targetIDE: ide,\n targetPath: '',\n status: 'error',\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Get target file path for an item\n */\n private getTargetPath(config: IDEMigrationConfig, item: SourceContentItem): string | null {\n let contentPath: string | null = null;\n\n switch (item.type) {\n case 'rules':\n contentPath = config.rulesPath;\n break;\n case 'workflows':\n contentPath = config.workflowsPath;\n break;\n case 'commands':\n contentPath = config.commandsPath;\n break;\n }\n\n if (!contentPath) {\n return null;\n }\n\n const filename = `${item.name}${config.fileExtension}`;\n return path.join(this.projectPath, config.basePath, contentPath, filename);\n }\n\n // Helper methods\n private extractGlobs(frontmatter: Record<string, unknown>): string[] | undefined {\n const globs = frontmatter.globs;\n if (typeof globs === 'string') return [globs];\n if (Array.isArray(globs)) return globs as string[];\n return undefined;\n }\n\n private extractAlwaysApply(frontmatter: Record<string, unknown>): boolean {\n return frontmatter.alwaysApply === true ||\n frontmatter.trigger === 'always' ||\n frontmatter.trigger === 'always_on';\n }\n}\n","/**\n * IDE migration configurations\n */\nimport type { IDEMigrationConfig, FrontmatterOptions, MigrateIDE } from '../types/migrate-ide.types.js';\n\nexport const IDE_MIGRATION_CONFIGS: Record<MigrateIDE, IDEMigrationConfig> = {\n cursor: {\n id: 'cursor',\n name: 'Cursor',\n icon: '🔮',\n basePath: '.cursor',\n rulesPath: 'rules',\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.mdc',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const lines = ['---'];\n if (opts.description) {\n lines.push(`description: ${opts.description}`);\n }\n if (opts.globs && opts.globs.length > 0) {\n lines.push(`globs: ${opts.globs.join(', ')}`);\n }\n lines.push(`alwaysApply: ${opts.alwaysApply}`);\n lines.push('---');\n return lines.join('\\n');\n },\n },\n windsurf: {\n id: 'windsurf',\n name: 'Windsurf',\n icon: '🏄',\n basePath: '.windsurf',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n antigravity: {\n id: 'antigravity',\n name: 'Antigravity',\n icon: '🚀',\n basePath: '.agent',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n claudecode: {\n id: 'claudecode',\n name: 'Claude Code',\n icon: '🤖',\n basePath: '.claude',\n rulesPath: null,\n workflowsPath: null,\n commandsPath: 'commands',\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n if (opts.description) {\n return `---\\ndescription: ${opts.description}\\n---`;\n }\n return '';\n },\n },\n opencode: {\n id: 'opencode',\n name: 'OpenCode',\n icon: '💻',\n basePath: '.opencode',\n rulesPath: 'rules',\n workflowsPath: 'workflows',\n commandsPath: null,\n fileExtension: '.md',\n generateFrontmatter: (opts: FrontmatterOptions) => {\n const trigger = opts.alwaysApply ? 'always' : 'glob';\n return `---\\ntrigger: ${trigger}\\n---`;\n },\n },\n};\n\nexport function getMigrationIDEs(): MigrateIDE[] {\n return Object.keys(IDE_MIGRATION_CONFIGS) as MigrateIDE[];\n}\n\nexport function getIDEConfig(ide: MigrateIDE): IDEMigrationConfig | undefined {\n return IDE_MIGRATION_CONFIGS[ide];\n}\n","/**\n * Learn Command\n * Interactive guide center for Agentic Coding\n * \n * Renamed from 'guide' to 'learn' for clarity and brevity\n */\nimport React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create learn command - Agentic Coding guide center\n */\nexport function createLearnCommand(): Command {\n const cmd = new Command('learn')\n .description('Interactive Agentic Coding learning center')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { MenuView } from './views/MenuView.js';\nimport { IntroView } from './views/IntroView.js';\nimport { RulesView } from './views/RulesView.js';\nimport { WorkflowsView } from './views/WorkflowsView.js';\nimport { PromptsView } from './views/PromptsView.js';\nimport { SkillsView } from './views/SkillsView.js';\nimport { AgenticGuideView } from './views/AgenticGuideView.js';\n\nexport type GuideTopic = 'menu' | 'intro' | 'rules' | 'workflows' | 'prompts' | 'skills' | 'agentic';\n\ninterface GuideAppProps {\n initialTopic?: string;\n onExit: () => void;\n}\n\nconst TOPIC_MAP: Record<string, GuideTopic> = {\n intro: 'intro',\n rules: 'rules',\n workflows: 'workflows',\n prompts: 'prompts',\n skills: 'skills',\n agentic: 'agentic',\n};\n\n/**\n * GuideApp - Interactive Agentic Coding Guide Center\n */\nexport const GuideApp: React.FC<GuideAppProps> = ({ initialTopic, onExit }) => {\n const { exit } = useApp();\n const [currentTopic, setCurrentTopic] = useState<GuideTopic>('menu');\n const [scrollPosition, setScrollPosition] = useState(0);\n\n // Set initial topic from CLI option\n useEffect(() => {\n if (initialTopic && TOPIC_MAP[initialTopic]) {\n setCurrentTopic(TOPIC_MAP[initialTopic]!);\n }\n }, [initialTopic]);\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape or Backspace to go back to menu\n if (key.escape || (currentTopic !== 'menu' && key.backspace)) {\n if (currentTopic === 'menu') {\n onExit();\n } else {\n setCurrentTopic('menu');\n setScrollPosition(0);\n }\n return;\n }\n\n // q to quit\n if (input === 'q') {\n onExit();\n return;\n }\n\n // Scroll in content views\n if (currentTopic !== 'menu' && currentTopic !== 'agentic') {\n if (key.upArrow) {\n setScrollPosition(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setScrollPosition(prev => prev + 1);\n } else if (key.pageDown) {\n setScrollPosition(prev => prev + 5);\n } else if (key.pageUp) {\n setScrollPosition(prev => Math.max(0, prev - 5));\n }\n }\n });\n\n const handleSelectTopic = (topic: GuideTopic) => {\n setCurrentTopic(topic);\n setScrollPosition(0);\n };\n\n const handleBack = () => {\n setCurrentTopic('menu');\n setScrollPosition(0);\n };\n\n // Render appropriate view\n const renderContent = () => {\n switch (currentTopic) {\n case 'menu':\n return <MenuView onSelect={handleSelectTopic} />;\n case 'intro':\n return <IntroView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'rules':\n return <RulesView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'workflows':\n return <WorkflowsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'prompts':\n return <PromptsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'skills':\n return <SkillsView scrollPosition={scrollPosition} onBack={handleBack} />;\n case 'agentic':\n return <AgenticGuideView onBack={handleBack} />;\n default:\n return <MenuView onSelect={handleSelectTopic} />;\n }\n };\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"magenta\">🎓 Jai1 Guide</Text>\n <Text dimColor> - Trung tâm hướng dẫn Agentic Coding</Text>\n </Box>\n\n {/* Content */}\n {renderContent()}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n {currentTopic === 'menu'\n ? '[↑↓] Chọn · [Enter] Mở · [q] Thoát'\n : '[↑↓/PgUp/PgDn] Cuộn · [Esc/←] Quay lại · [q] Thoát'\n }\n </Text>\n </Box>\n </Box>\n );\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { GuideTopic } from '../GuideApp.js';\n\ninterface MenuViewProps {\n onSelect: (topic: GuideTopic) => void;\n}\n\ninterface MenuItem {\n id: GuideTopic;\n icon: string;\n title: string;\n description: string;\n badge?: string;\n}\n\nconst MENU_ITEMS: MenuItem[] = [\n {\n id: 'intro',\n icon: '📖',\n title: 'Giới thiệu Agentic Coding',\n description: 'Tổng quan về AI-assisted development và Jai1 Framework',\n },\n {\n id: 'rules',\n icon: '📜',\n title: 'IDE Rules',\n description: 'Quy tắc hướng dẫn AI hiểu context dự án của bạn',\n },\n {\n id: 'workflows',\n icon: '🔄',\n title: 'Workflows',\n description: 'Quy trình làm việc step-by-step (Cursor: Commands)',\n },\n {\n id: 'prompts',\n icon: '💬',\n title: 'Prompts',\n description: 'Cách viết prompts hiệu quả cho AI',\n },\n {\n id: 'skills',\n icon: '🛠',\n title: 'Skills',\n description: 'Mở rộng khả năng AI với skills chuyên biệt',\n },\n {\n id: 'agentic',\n icon: '🤖',\n title: 'Agentic Guide',\n description: 'Hỏi đáp trực tiếp với AI (interactive Q&A)',\n badge: 'Beta',\n },\n];\n\n/**\n * MenuView - Main menu showing all guide topics\n */\nexport const MenuView: React.FC<MenuViewProps> = ({ onSelect }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(MENU_ITEMS.length - 1, prev + 1));\n } else if (key.return) {\n const item = MENU_ITEMS[selectedIndex];\n if (item) {\n onSelect(item.id);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Welcome message */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"magenta\"\n padding={1}\n marginBottom={1}\n >\n <Text>Chào mừng đến với <Text bold color=\"magenta\">Jai1 Guide</Text>!</Text>\n <Text dimColor>\n Đây là trung tâm hướng dẫn giúp bạn làm chủ Agentic Coding -\n </Text>\n <Text dimColor>\n phương pháp phát triển phần mềm với sự hỗ trợ của AI.\n </Text>\n </Box>\n\n {/* Menu items */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1}>\n <Text bold marginBottom={1}>Chọn chủ đề để tìm hiểu:</Text>\n\n {MENU_ITEMS.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? 'cyan' : 'white'}>\n {isSelected ? '❯ ' : ' '}\n {item.icon} {item.title}\n </Text>\n {item.badge && (\n <Text color=\"yellow\" dimColor> [{item.badge}]</Text>\n )}\n {isSelected && (\n <Text dimColor> - {item.description}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Quick tips */}\n <Box marginTop={1}>\n <Text dimColor>💡 Tip: Dùng </Text>\n <Text color=\"cyan\">jai1 guide --topic rules</Text>\n <Text dimColor> để mở trực tiếp một chủ đề</Text>\n </Box>\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface IntroViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst INTRO_CONTENT = [\n {\n type: 'header' as const,\n text: '📖 Giới thiệu Agentic Coding',\n },\n {\n type: 'section' as const,\n title: 'Agentic Coding là gì?',\n content: `Agentic Coding (hay Agentic Software Development - ASD) là phương pháp \nphát triển phần mềm với sự hỗ trợ của AI agents. AI không chỉ suggest code, \nmà còn chủ động:\n • Đọc và hiểu codebase của bạn\n • Thực thi commands và scripts\n • Tạo, sửa, xóa files\n • Chạy tests và debug\n • Tương tác với terminal và browser`,\n },\n {\n type: 'section' as const,\n title: 'Jai1 Framework là gì?',\n content: `Jai1 là framework giúp bạn làm việc hiệu quả với AI agents trong các IDE:\n • Cursor\n • Windsurf \n • Claude Code\n • GitHub Copilot Workspace\n • Codeium\n\nFramework cung cấp:\n 📜 Rules - Quy tắc hướng dẫn AI hiểu dự án\n 🔄 Workflows - Quy trình làm việc step-by-step\n 💬 Prompts - Templates prompts hiệu quả\n 🛠 Skills - Mở rộng khả năng AI`,\n },\n {\n type: 'section' as const,\n title: 'Tại sao cần Jai1?',\n content: `AI agents mạnh mẽ, nhưng cần \"context\" để làm việc hiệu quả:\n \n ❌ Không có context:\n \"Tạo một API endpoint\" → AI không biết tech stack, conventions\n\n ✅ Có Jai1 Framework:\n \"Tạo một API endpoint\" → AI đọc rules, hiểu bạn dùng HonoJS,\n biết cấu trúc thư mục, coding conventions, tự động follow best practices`,\n },\n {\n type: 'section' as const,\n title: 'Bắt đầu nhanh',\n content: `1. Khởi tạo Jai1 trong dự án:\n $ jai1 init\n\n2. Cài đặt components cần thiết:\n $ jai1 apply\n\n3. Sử dụng workflows trong IDE:\n Gõ @workflow hoặc /workflow để trigger\n\n4. Tùy chỉnh rules theo dự án của bạn:\n Sửa files trong .jai1/rules/`,\n },\n {\n type: 'tip' as const,\n text: 'Tiếp theo, tìm hiểu về Rules - nền tảng quan trọng nhất của Agentic Coding!',\n },\n];\n\n/**\n * IntroView - Introduction to Agentic Coding\n */\nexport const IntroView: React.FC<IntroViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={INTRO_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface ContentItem {\n type: 'header' | 'section' | 'tip' | 'warning';\n text?: string;\n title?: string;\n content?: string;\n}\n\ninterface ContentViewProps {\n content: ContentItem[];\n scrollPosition: number;\n}\n\n/**\n * ContentView - Scrollable content container for guide views\n */\nexport const ContentView: React.FC<ContentViewProps> = ({ content, scrollPosition }) => {\n // Flatten content into lines for scrolling\n const renderContent = () => {\n const lines: React.ReactNode[] = [];\n\n content.forEach((item, idx) => {\n switch (item.type) {\n case 'header':\n lines.push(\n <Box key={`header-${idx}`} marginBottom={1}>\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={2}\n paddingY={0}\n >\n <Text bold color=\"magenta\">{item.text}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'section':\n lines.push(\n <Box key={`section-${idx}`} flexDirection=\"column\" marginBottom={1}>\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n >\n <Text bold color=\"cyan\">{item.title}</Text>\n </Box>\n <Box marginLeft={1} marginTop={1}>\n <Text>{item.content}</Text>\n </Box>\n </Box>\n );\n break;\n\n case 'tip':\n lines.push(\n <Box\n key={`tip-${idx}`}\n borderStyle=\"round\"\n borderColor=\"green\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"green\">💡 Tip: {item.text}</Text>\n </Box>\n );\n break;\n\n case 'warning':\n lines.push(\n <Box\n key={`warning-${idx}`}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n padding={1}\n marginTop={1}\n >\n <Text color=\"yellow\">⚠️ Lưu ý: {item.text}</Text>\n </Box>\n );\n break;\n }\n });\n\n return lines;\n };\n\n const allLines = renderContent();\n const visibleLines = allLines.slice(scrollPosition, scrollPosition + 15);\n const hasMore = scrollPosition + 15 < allLines.length;\n const hasPrevious = scrollPosition > 0;\n\n return (\n <Box flexDirection=\"column\">\n {/* Scroll indicator top */}\n {hasPrevious && (\n <Box justifyContent=\"center\">\n <Text dimColor>↑ Cuộn lên để xem thêm</Text>\n </Box>\n )}\n\n {/* Content */}\n <Box flexDirection=\"column\">\n {visibleLines}\n </Box>\n\n {/* Scroll indicator bottom */}\n {hasMore && (\n <Box justifyContent=\"center\" marginTop={1}>\n <Text dimColor>↓ Cuộn xuống để xem thêm ({allLines.length - scrollPosition - 15} items)</Text>\n </Box>\n )}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface RulesViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst RULES_CONTENT = [\n {\n type: 'header' as const,\n text: '📜 IDE Rules - Quy tắc cho AI',\n },\n {\n type: 'section' as const,\n title: 'Rules là gì?',\n content: `Rules là các file Markdown chứa hướng dẫn cho AI agent. \nChúng giúp AI hiểu:\n • Tech stack của dự án (Laravel, NestJS, React...)\n • Coding conventions (naming, patterns...)\n • Cấu trúc thư mục và architecture\n • Business logic và domain knowledge`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Thư mục │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Rules │ .cursor/rules/ │\n│ Windsurf │ Rules │ .windsurf/rules/ │\n│ Antigravity │ Rules │ .agent/rules/ │\n│ Claude Code │ CLAUDE.md │ CLAUDE.md (root) │\n│ Copilot │ Instructions │ .github/copilot/ │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Rule file',\n content: `---\ndescription: [Mô tả ngắn khi nào rule này được apply]\nglobs: [Optional - file patterns để auto-apply]\n---\n\n# Tên Rule\n\n## Purpose\nGiải thích mục đích của rule\n\n## Conventions\nCác quy tắc cần tuân theo\n\n## Examples\nVí dụ minh họa (nếu cần)`,\n },\n {\n type: 'section' as const,\n title: 'Các loại Rules',\n content: `1. Global Rules (always active)\n • Conventions chung của dự án\n • Tech stack và dependencies\n • Coding style guidelines\n\n2. Contextual Rules (auto-applied by globs)\n • Frontend rules (cho *.tsx, *.vue...)\n • Backend rules (cho routes, controllers...)\n • Testing rules (cho *.test.*, *.spec.*)\n\n3. On-demand Rules\n • Gọi khi cần bằng @ruleName\n • Ví dụ: @database-migration, @api-design`,\n },\n {\n type: 'section' as const,\n title: 'Best Practices',\n content: `✅ DO:\n • Viết rules ngắn gọn, dễ đọc\n • Focus vào \"what to do\", không phải \"how to do\"\n • Cập nhật rules khi dự án thay đổi\n • Chia nhỏ rules theo domain/feature\n\n❌ DON'T:\n • Viết rules quá dài (>1000 tokens)\n • Copy-paste toàn bộ documentation\n • Include code examples quá chi tiết\n • Hardcode paths hoặc values`,\n },\n {\n type: 'tip' as const,\n text: 'Dùng \"jai1 apply rules/...\" để cài đặt rules mẫu cho tech stack của bạn!',\n },\n];\n\n/**\n * RulesView - Guide for IDE Rules\n */\nexport const RulesView: React.FC<RulesViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={RULES_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface WorkflowsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst WORKFLOWS_CONTENT = [\n {\n type: 'header' as const,\n text: '🔄 Workflows - Quy trình làm việc',\n },\n {\n type: 'section' as const,\n title: 'Workflows là gì?',\n content: `Workflows là tập hợp các bước tuần tự để AI thực hiện một tác vụ phức tạp.\nThay vì viết prompt dài dòng, bạn chỉ cần trigger workflow.\n\nVí dụ: /develop-feature\n → AI tự động: đọc task → plan → code → test → commit`,\n },\n {\n type: 'section' as const,\n title: 'Tên gọi trong các IDE',\n content: `┌─────────────┬──────────────────┬─────────────────────┐\n│ IDE │ Tên gọi │ Cách trigger │\n├─────────────┼──────────────────┼─────────────────────┤\n│ Cursor │ Commands │ / hoặc @command │\n│ Windsurf │ Workflows │ @workflow │\n│ Antigravity │ Workflows │ /workflow │\n│ Claude Code │ (Manual) │ Gọi CLAUDE.md │\n└─────────────┴──────────────────┴─────────────────────┘`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc Workflow file',\n content: `---\ndescription: [Mô tả ngắn về workflow]\n---\n\n# Tên Workflow\n\n## ⚠️ CRITICAL RULES\nCác quy tắc bắt buộc phải tuân theo\n\n## 🎯 INPUT\nNhững gì cần có trước khi bắt đầu\n\n## 🔄 WORKFLOW PHASES\n### Phase 1: [Tên phase]\n- Step-by-step instructions\n- Commands to run\n- Validations to check\n\n### Phase 2: [Tên phase]\n...\n\n## ✅ QUALITY CHECKLIST\nChecklist kiểm tra khi hoàn thành`,\n },\n {\n type: 'section' as const,\n title: 'Workflows có sẵn trong Jai1',\n content: `/develop-feature Phát triển feature mới với auto-implement\n/fix-feature Sửa bugs với root cause analysis\n/commit-it Safe commit với security checks\n/gen-single-docs Generate documentation cho feature\n/setup-honojs Setup HonoJS + Drizzle cho dự án\n/create-prd Tạo Product Requirements Document`,\n },\n {\n type: 'section' as const,\n title: 'Đặc điểm của Workflow tốt',\n content: `✅ Continuous Execution\n • AI chạy liền mạch, không dừng hỏi user trừ khi thật sự cần\n\n✅ Progress Tracking\n • Tạo todo.md để track tiến độ\n • Hỗ trợ auto-resume từ checkpoint\n\n✅ Quality Gates\n • Có validation ở mỗi phase\n • Checklist kiểm tra cuối cùng\n\n✅ Error Handling\n • Xử lý errors gracefully\n • Có rollback plan khi thất bại`,\n },\n {\n type: 'tip' as const,\n text: 'Workflows mạnh nhất khi kết hợp với Rules - AI sẽ follow cả quy trình lẫn conventions!',\n },\n];\n\n/**\n * WorkflowsView - Guide for Workflows\n */\nexport const WorkflowsView: React.FC<WorkflowsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={WORKFLOWS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface PromptsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst PROMPTS_CONTENT = [\n {\n type: 'header' as const,\n text: '💬 Prompts - Giao tiếp hiệu quả với AI',\n },\n {\n type: 'section' as const,\n title: 'Prompts trong Agentic Coding',\n content: `Trong Agentic Coding, prompts không chỉ là \"hỏi một câu\" - \nmà là cách bạn định hướng AI thực hiện công việc phức tạp.\n\nVới Jai1 Framework, AI đã có sẵn context từ Rules,\nnên prompts của bạn có thể ngắn gọn và tập trung vào mục đích.`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Patterns hiệu quả',\n content: `1. ⚡ Quick Task Pattern\n \"Tạo API endpoint cho user registration\"\n → AI tự áp dụng conventions từ rules\n\n2. 📋 Task with Context Pattern \n \"Tạo API endpoint cho user registration.\n Bảng users: id, email, password_hash, created_at\"\n → Thêm context cụ thể cho task\n\n3. 🔄 Workflow Trigger Pattern\n \"@workflow develop-feature: Implement user login\"\n → Trigger toàn bộ workflow\n\n4. 🎯 Constraint Pattern\n \"Refactor UserService. Giữ nguyên public interface, \n chỉ extract private methods\"\n → Định rõ giới hạn`,\n },\n {\n type: 'section' as const,\n title: 'DO vs DON\\'T',\n content: `✅ NÊN:\n • Nêu rõ mục đích (\"để làm gì\")\n • Cung cấp context cụ thể\n • Định scope rõ ràng\n • Mention files/functions liên quan\n\n❌ KHÔNG NÊN:\n • Viết quá dài (AI mất focus)\n • Yêu cầu mơ hồ (\"fix bugs\")\n • Giả định AI biết context không có trong rules\n • Hỏi nhiều việc trong 1 prompt`,\n },\n {\n type: 'section' as const,\n title: 'Levels of Prompting',\n content: `Level 1: Simple (có Rules)\n \"Tạo model Product\"\n → AI follow conventions từ rules\n\nLevel 2: Guided (có context)\n \"Tạo model Product với: name, price, category_id, status\"\n → AI có thêm thông tin cụ thể\n\nLevel 3: Workflow\n \"@workflow: develop-feature Product CRUD\"\n → AI chạy toàn bộ quy trình\n\nLevel 4: Collaborative\n Chat multi-turn với AI để refine solution\n → Phù hợp với complex problems`,\n },\n {\n type: 'section' as const,\n title: 'Prompt Templates trong Jai1',\n content: `Jai1 cung cấp prompt templates cho các use cases phổ biến:\n\n prompts/code-review.md Review và improve code\n prompts/debug-issue.md Debug với context đầy đủ\n prompts/explain-code.md Giải thích code cho team\n prompts/refactor.md Refactor patterns\n \nCài đặt: jai1 apply prompts/...`,\n },\n {\n type: 'tip' as const,\n text: 'Prompts ngắn + Rules tốt = Kết quả chính xác nhất!',\n },\n];\n\n/**\n * PromptsView - Guide for effective prompts\n */\nexport const PromptsView: React.FC<PromptsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={PROMPTS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ContentView } from '../components/ContentView.js';\n\ninterface SkillsViewProps {\n scrollPosition: number;\n onBack: () => void;\n}\n\nconst SKILLS_CONTENT = [\n {\n type: 'header' as const,\n text: '🛠 Skills - Mở rộng khả năng AI',\n },\n {\n type: 'section' as const,\n title: 'Skills là gì?',\n content: `Skills là \"kỹ năng\" chuyên biệt mà AI có thể học và sử dụng.\nMỗi skill là một gói hướng dẫn chi tiết cho một tác vụ cụ thể.\n\nKhác với Rules (context chung) và Workflows (quy trình):\n • Rules: \"Dự án dùng Laravel, naming convention như này...\"\n • Workflows: \"Để phát triển feature, làm theo các bước 1-2-3...\"\n • Skills: \"Để generate commit message, phân tích diff như này...\"`,\n },\n {\n type: 'section' as const,\n title: 'Cấu trúc một Skill',\n content: `skills/\n└── skill-name/\n ├── SKILL.md # Main instruction file\n ├── scripts/ # Scripts hỗ trợ (optional)\n ├── references/ # Reference materials (optional)\n └── assets/ # Assets như templates (optional)\n\nSKILL.md format:\n---\nname: skill-name\ndescription: Mô tả ngắn\ntriggers: [patterns kích hoạt skill]\n---\n\n## Purpose\n## Steps\n## Examples`,\n },\n {\n type: 'section' as const,\n title: 'Skills có sẵn trong Jai1',\n content: `🎯 Development Skills:\n gen-commit-message Tạo commit message từ staged changes\n gen-prd Generate Product Requirements Document\n skill-creator Hướng dẫn tạo skill mới\n\n🖼 Media Skills:\n merge-mp4-files Merge video files với ffmpeg\n vid-scene-gen Generate video scene prompts\n\n📝 Documentation Skills:\n gen-frd Generate Functional Requirements Doc\n gen-tdd Generate Technical Design Doc`,\n },\n {\n type: 'section' as const,\n title: 'Cách sử dụng Skills',\n content: `1. Trigger bằng pattern:\n \"skill:gen-commit-message\"\n \"Dùng skill gen-commit-message để tạo message\"\n\n2. Kết hợp với Workflow:\n Workflows có thể gọi skills bên trong các phase\n\n3. Direct call trong chat:\n \"@skill/gen-commit-message\" (tùy IDE)`,\n },\n {\n type: 'section' as const,\n title: 'Tạo Skill mới',\n content: `Dùng workflow skill-creator:\n\n1. Xác định use case cụ thể\n2. Viết SKILL.md với format chuẩn\n3. Thêm scripts/references nếu cần\n4. Test với AI\n\nBest Practices:\n ✅ Skill nên focused vào 1 task\n ✅ Steps rõ ràng, actionable\n ✅ Có examples minh họa\n ❌ Không làm skill quá generic`,\n },\n {\n type: 'tip' as const,\n text: 'Skills giống như teaching AI một kỹ năng mới - càng chi tiết, AI càng làm tốt!',\n },\n];\n\n/**\n * SkillsView - Guide for Skills\n */\nexport const SkillsView: React.FC<SkillsViewProps> = ({ scrollPosition, onBack }) => {\n return <ContentView content={SKILLS_CONTENT} scrollPosition={scrollPosition} />;\n};\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport Spinner from 'ink-spinner';\n\ninterface AgenticGuideViewProps {\n onBack: () => void;\n}\n\ninterface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: Date;\n}\n\n// Suggested questions for quick access\nconst SUGGESTED_QUESTIONS = [\n 'Rules là gì?',\n 'Setup Jai1',\n 'Best practices workflows',\n 'Rules vs Skills',\n];\n\n// Mock responses\nconst MOCK_RESPONSES: Record<string, string> = {\n 'rules': `Rules là các file Markdown định nghĩa context cho AI.\nGiúp AI hiểu tech stack, conventions, architecture.\nVị trí: .cursor/rules/, .windsurf/rules/\nTip: Chạy \"jai1 apply rules/\" để cài rules mẫu!`,\n\n 'setup': `Setup Jai1:\n1. jai1 init\n2. jai1 apply (chọn components)\n3. jai1 vscode sync\n4. Tùy chỉnh .jai1/rules/ theo dự án`,\n\n 'workflows': `Best Practices Workflows:\n• Continuous execution (không dừng hỏi user)\n• Progress tracking với todo.md\n• Chia nhỏ thành phases rõ ràng\n• Quality gates ở mỗi phase`,\n\n 'skills': `Rules vs Skills:\n• Rules: Context chung, always active\n• Skills: Kỹ năng chuyên biệt, on-demand\nDùng cả hai: Rules cho context, Skills cho actions!`,\n\n 'default': `Tôi có thể trả lời về:\n• Rules - Quy tắc cho AI\n• Workflows - Quy trình làm việc\n• Skills - Kỹ năng mở rộng\n• Setup - Cài đặt Jai1\n\nThử hỏi: \"Rules là gì?\" hoặc \"Setup Jai1\"`,\n};\n\nfunction getMockResponse(message: string): string {\n const lower = message.toLowerCase();\n\n if (lower.includes('rule') || lower.includes('quy tắc')) {\n return MOCK_RESPONSES['rules']!;\n }\n if (lower.includes('setup') || lower.includes('init') || lower.includes('cài đặt')) {\n return MOCK_RESPONSES['setup']!;\n }\n if (lower.includes('workflow') || lower.includes('quy trình')) {\n return MOCK_RESPONSES['workflows']!;\n }\n if (lower.includes('skill') || lower.includes('khác')) {\n return MOCK_RESPONSES['skills']!;\n }\n\n return MOCK_RESPONSES['default']!;\n}\n\n/**\n * AgenticGuideView - Interactive Chat UI for AI Q&A\n */\nexport const AgenticGuideView: React.FC<AgenticGuideViewProps> = ({ onBack }) => {\n const [messages, setMessages] = useState<ChatMessage[]>([\n {\n id: 'welcome',\n role: 'system',\n content: 'Chào mừng đến Agentic Guide! Hỏi về Agentic Coding.',\n timestamp: new Date(),\n },\n ]);\n const [inputValue, setInputValue] = useState('');\n const [isTyping, setIsTyping] = useState(false);\n const [selectedSuggestion, setSelectedSuggestion] = useState(0);\n const [focusArea, setFocusArea] = useState<'suggestions' | 'input'>('input');\n\n // Handle keyboard input\n useInput((input, key) => {\n // Escape to go back\n if (key.escape) {\n onBack();\n return;\n }\n\n // Tab to switch focus\n if (key.tab) {\n setFocusArea(prev => prev === 'input' ? 'suggestions' : 'input');\n return;\n }\n\n // Handle suggestions navigation when focused\n if (focusArea === 'suggestions') {\n if (key.leftArrow) {\n setSelectedSuggestion(prev => Math.max(0, prev - 1));\n } else if (key.rightArrow) {\n setSelectedSuggestion(prev => Math.min(SUGGESTED_QUESTIONS.length - 1, prev + 1));\n } else if (key.return) {\n const question = SUGGESTED_QUESTIONS[selectedSuggestion];\n if (question) {\n handleSendMessage(question);\n setFocusArea('input');\n }\n }\n }\n });\n\n // Send message handler\n const handleSendMessage = async (text: string) => {\n if (!text.trim() || isTyping) return;\n\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text.trim(),\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, userMessage]);\n setInputValue('');\n setIsTyping(true);\n\n // Simulate AI thinking delay\n await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 700));\n\n const response = getMockResponse(text);\n\n const assistantMessage: ChatMessage = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response,\n timestamp: new Date(),\n };\n\n setMessages(prev => [...prev, assistantMessage]);\n setIsTyping(false);\n };\n\n // Handle input submit\n const handleSubmit = (value: string) => {\n handleSendMessage(value);\n };\n\n // Render message content with proper line breaks\n const renderMessageContent = (content: string) => {\n const lines = content.split('\\n');\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, i) => (\n <Text key={i}>{line || ' '}</Text>\n ))}\n </Box>\n );\n };\n\n // Get visible messages (last 4 to prevent overflow)\n const visibleMessages = messages.slice(-4);\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box\n borderStyle=\"double\"\n borderColor=\"magenta\"\n paddingX={1}\n marginBottom={1}\n >\n <Text bold color=\"magenta\">🤖 Agentic Guide</Text>\n <Text dimColor> - Hỏi đáp AI</Text>\n <Box flexGrow={1} />\n <Text backgroundColor=\"green\" color=\"black\" bold> BETA </Text>\n </Box>\n\n {/* Chat Messages Area */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n padding={1}\n marginBottom={1}\n minHeight={10}\n >\n {visibleMessages.map((msg) => (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={1}>\n {msg.role === 'user' ? (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\" bold>Bạn:</Text>\n <Box marginLeft={2}>\n <Text>{msg.content}</Text>\n </Box>\n </Box>\n ) : msg.role === 'assistant' ? (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>AI:</Text>\n <Box marginLeft={2}>\n {renderMessageContent(msg.content)}\n </Box>\n </Box>\n ) : (\n <Box>\n <Text dimColor italic>{msg.content}</Text>\n </Box>\n )}\n </Box>\n ))}\n\n {/* Typing indicator */}\n {isTyping && (\n <Box>\n <Text color=\"green\">\n <Spinner type=\"dots\" /> AI đang trả lời...\n </Text>\n </Box>\n )}\n\n {/* Scroll hint */}\n {messages.length > 4 && (\n <Box justifyContent=\"center\">\n <Text dimColor>({messages.length - 4} tin nhắn trước)</Text>\n </Box>\n )}\n </Box>\n\n {/* Suggested Questions */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text dimColor bold>💡 Gợi ý:</Text>\n <Box marginTop={1}>\n {SUGGESTED_QUESTIONS.map((q, i) => {\n const isSelected = focusArea === 'suggestions' && i === selectedSuggestion;\n return (\n <Box key={i} marginRight={1}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'gray'}\n >\n {isSelected ? '❯' : ' '} {i + 1}. {q}\n </Text>\n </Box>\n );\n })}\n </Box>\n </Box>\n\n {/* Input Box */}\n <Box\n borderStyle=\"round\"\n borderColor={focusArea === 'input' ? 'cyan' : 'gray'}\n paddingX={1}\n marginBottom={1}\n >\n <Text color={focusArea === 'input' ? 'cyan' : 'gray'}>❯ </Text>\n {focusArea === 'input' ? (\n <TextInput\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder=\"Nhập câu hỏi...\"\n focus={true}\n />\n ) : (\n <Text dimColor>Nhấn Tab để nhập...</Text>\n )}\n </Box>\n\n {/* Help */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n [Tab] Chuyển · [Enter] Gửi/Chọn · [←→] Di chuyển gợi ý · [Esc] Quay lại\n </Text>\n </Box>\n </Box>\n );\n};\n","/**\n * Chat Command\n * Interactive chat with Jai1 LLM Proxy\n * Fullscreen terminal experience\n */\nimport { Command } from 'commander';\nimport React from 'react';\nimport { render } from 'ink';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ChatApp } from '../ui/llm/LlmApp.js';\nimport { ValidationError } from '../errors/index.js';\n\ninterface ChatCommandOptions {\n model?: string;\n}\n\n/**\n * Handle chat command\n */\nasync function handleChatCommand(options: ChatCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n // Render fullscreen app\n const { waitUntilExit, clear } = render(\n React.createElement(ChatApp, {\n service,\n initialModel: options.model,\n }),\n {\n // Enable fullscreen mode - clears terminal on exit\n exitOnCtrlC: false, // We handle exit via Esc\n }\n );\n\n await waitUntilExit();\n\n // Clear screen on exit for clean terminal\n clear();\n}\n\n/**\n * Create chat command\n */\nexport function createChatCommand(): Command {\n const cmd = new Command('chat')\n .description('Interactive AI chat with Jai1 LLM Proxy')\n .option('--model <model>', 'Initial model to use (e.g., gpt-4o, claude-3-opus)')\n .action(async (options: ChatCommandOptions) => {\n await handleChatCommand(options);\n });\n\n return cmd;\n}\n","/**\n * LLM Proxy Service\n * Client for interacting with Jai1 LLM proxy API\n */\nimport type { Jai1Config } from '../types/framework.types.js';\nimport type {\n ModelsResponse,\n UserLimits,\n UsageStats,\n CompletionMessage,\n ChatCompletionChunk,\n ModelWithUsage,\n} from '../types/llm.types.js';\n\nexport class LlmProxyService {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(config: Jai1Config) {\n // Remove trailing slash if present\n this.baseUrl = config.apiUrl.replace(/\\/$/, '');\n this.apiKey = config.accessKey;\n }\n\n /**\n * Get the base URL for the LLM proxy (OpenAI-compatible endpoint)\n */\n getBaseUrl(): string {\n return `${this.baseUrl}/v1`;\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey;\n }\n\n /**\n * Fetch available models\n */\n async getModels(): Promise<ModelsResponse> {\n const response = await fetch(`${this.baseUrl}/v1/models`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Fetch user limits\n */\n async getLimits(): Promise<UserLimits> {\n const response = await fetch(`${this.baseUrl}/v1/me/limits`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch limits: ${response.statusText}`);\n }\n\n const result = await response.json();\n return result.data;\n }\n\n /**\n * Fetch usage statistics\n */\n async getUsage(days = 7): Promise<UsageStats> {\n const response = await fetch(`${this.baseUrl}/v1/me/usage?days=${days}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch usage: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Get models with usage information\n */\n async getModelsWithUsage(): Promise<ModelWithUsage[]> {\n const [modelsRes, limits, usage] = await Promise.all([\n this.getModels(),\n this.getLimits(),\n this.getUsage(1), // Today only\n ]);\n\n // Use GMT+7 timezone to match API date recording\n const today = new Date().toLocaleDateString('en-CA', { timeZone: 'Asia/Ho_Chi_Minh' });\n\n return modelsRes.data.map((model) => {\n const allowed = limits.allowedModels.includes(model.id);\n const dailyLimit = limits.rateLimits[model.id] ?? limits.rateLimits[model.id.toLowerCase()];\n\n // Find usage record - try exact match first, then case-insensitive\n const usageRecord = usage.data.find(\n (u) => u.model === model.id && u.date === today\n ) || usage.data.find(\n (u) => u.model.toLowerCase() === model.id.toLowerCase() && u.date === today\n );\n const usedToday = usageRecord?.count || 0;\n\n return {\n ...model,\n allowed,\n dailyLimit,\n usedToday,\n };\n });\n }\n\n /**\n * Non-streaming chat completion (for translation and complete responses)\n * @returns Complete response content\n */\n async chat(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): Promise<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: false,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n const result = await response.json();\n return result.choices[0]?.message?.content || '';\n }\n\n /**\n * Stream chat completion\n * @yields Streamed text chunks\n */\n async *chatStream(\n messages: CompletionMessage[],\n model: string,\n signal?: AbortSignal\n ): AsyncGenerator<string> {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n }),\n signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Chat completion failed: ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as ChatCompletionChunk;\n const content = parsed.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n } catch (e) {\n // Skip malformed('Failed to parse SSE chunk:', e);\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Generate sample cURL command\n */\n generateCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey.slice(0, 12)}...\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n\n /**\n * Generate full cURL command with actual API key\n */\n generateFullCurlSample(model: string): string {\n return `curl ${this.getBaseUrl()}/chat/completions \\\\\n -H \"Authorization: Bearer ${this.apiKey}\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\n \"model\": \"${model}\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Hello!\"}\n ]\n }'`;\n }\n}\n","/**\n * ChatApp - Main LLM Proxy Chat Application\n * Interactive TUI for chatting with LLM API\n * Simple layout to avoid re-render flickering\n */\nimport React, { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { LlmProxyService } from '../../services/llm-proxy.service.js';\nimport { useChat } from './hooks/useChat.js';\nimport { useLlmApi } from './hooks/useLlmApi.js';\nimport { ChatPanel } from './components/ChatPanel.js';\nimport { ModelSelector } from './components/ModelSelector.js';\nimport { SlashCommand } from './components/SlashCommandMenu.js';\n\n// Available slash commands - defined outside component to prevent recreation\nconst SLASH_COMMANDS: SlashCommand[] = [\n { name: 'model', description: 'Change the AI model', aliases: ['m'] },\n { name: 'stats', description: 'Show model usage statistics', aliases: ['s'] },\n { name: 'quit', description: 'Exit the chat', aliases: ['q', 'exit'] },\n];\n\ninterface ChatAppProps {\n service: LlmProxyService;\n initialModel?: string;\n}\n\ntype ViewType = 'loading' | 'chat' | 'model' | 'stats';\n\nexport const ChatApp: React.FC<ChatAppProps> = ({ service, initialModel }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n // Capture terminal inner height once on mount (subtract header + footer = ~6 lines)\n const contentHeight = useRef(Math.max(10, (stdout?.rows || 24) - 6));\n\n // Core state\n const [currentView, setCurrentView] = useState<ViewType>('loading');\n const [showSlashMenu, setShowSlashMenu] = useState(false);\n const [slashMenuIndex, setSlashMenuIndex] = useState(0);\n const [inputValue, setInputValue] = useState('');\n const [selectedModel, setSelectedModel] = useState<string>('');\n\n // API data\n const { models, loading, refetch } = useLlmApi(service);\n\n // Chat state\n const { messages, isStreaming, sendMessage } = useChat(service);\n\n // Set initial model when loaded\n useEffect(() => {\n if (models.length > 0 && !selectedModel) {\n const first = models.find((m) => m.allowed);\n if (first) {\n setSelectedModel(initialModel || first.id);\n setCurrentView('chat');\n }\n }\n }, [models, selectedModel, initialModel]);\n\n // Filter commands based on input\n const filteredCommands = useMemo(() => {\n if (!inputValue.startsWith('/')) return SLASH_COMMANDS;\n const filter = inputValue.slice(1).toLowerCase();\n return SLASH_COMMANDS.filter(\n (cmd) => cmd.name.includes(filter) || cmd.aliases?.some((a) => a.includes(filter))\n );\n }, [inputValue]);\n\n // Handlers\n const cycleModel = useCallback(() => {\n const allowed = models.filter((m) => m.allowed);\n if (allowed.length === 0) return;\n const idx = allowed.findIndex((m) => m.id === selectedModel);\n setSelectedModel(allowed[(idx + 1) % allowed.length]!.id);\n }, [models, selectedModel]);\n\n const execCommand = useCallback((cmd: string) => {\n const c = cmd.toLowerCase().replace(/^\\//, '');\n if (c === 'model' || c === 'm') { setCurrentView('model'); return true; }\n if (c === 'stats' || c === 's') { setCurrentView('stats'); refetch(); return true; }\n if (c === 'quit' || c === 'q' || c === 'exit') { exit(); return true; }\n return false;\n }, [refetch, exit]);\n\n // Keyboard input\n useInput((input, key) => {\n if (showSlashMenu) {\n if (key.upArrow) { setSlashMenuIndex((i) => Math.max(0, i - 1)); return; }\n if (key.downArrow) { setSlashMenuIndex((i) => Math.min(filteredCommands.length - 1, i + 1)); return; }\n if (key.return && filteredCommands[slashMenuIndex]) {\n setShowSlashMenu(false);\n execCommand(filteredCommands[slashMenuIndex].name);\n setInputValue('');\n return;\n }\n }\n if (key.escape) {\n if (showSlashMenu) { setShowSlashMenu(false); setInputValue(''); }\n else if (currentView !== 'chat' && currentView !== 'loading') { setCurrentView('chat'); }\n else { exit(); }\n return;\n }\n if (key.tab && currentView === 'chat' && !showSlashMenu && !isStreaming) {\n cycleModel();\n }\n }, { isActive: true });\n\n const onInputChange = useCallback((v: string) => {\n setInputValue(v);\n const show = v.startsWith('/');\n setShowSlashMenu(show);\n if (show && v === '/') setSlashMenuIndex(0);\n }, []);\n\n const onSubmit = useCallback((v: string) => {\n const t = v.trim();\n setShowSlashMenu(false);\n if (t.startsWith('/') && execCommand(t)) { setInputValue(''); return; }\n if (t && !isStreaming && selectedModel) { sendMessage(t, selectedModel); setInputValue(''); }\n }, [execCommand, isStreaming, selectedModel, sendMessage]);\n\n const onSelectModel = useCallback((id: string) => {\n setSelectedModel(id);\n setCurrentView('chat');\n }, []);\n\n // Render stats\n const statsView = useMemo(() => {\n const allowed = models.filter((m) => m.allowed);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" padding={1}>\n <Text bold color=\"cyan\">📊 Model Usage Statistics</Text>\n {allowed.map((m) => {\n const limit = m.dailyLimit ?? 0;\n const used = m.usedToday ?? 0;\n const pct = limit > 0 ? Math.round((used / limit) * 100) : 0;\n const bar = '█'.repeat(Math.round(pct / 5)) + '░'.repeat(20 - Math.round(pct / 5));\n return (\n <Box key={m.id} flexDirection=\"column\">\n <Text color={m.id === selectedModel ? 'yellow' : 'white'}>\n {m.id === selectedModel ? '► ' : ' '}{m.id}\n </Text>\n <Text color={pct > 80 ? 'red' : pct > 50 ? 'yellow' : 'green'}>\n {' '}{bar} <Text dimColor>{used}/{limit}</Text>\n </Text>\n </Box>\n );\n })}\n <Text dimColor>[Esc] Back</Text>\n </Box>\n );\n }, [models, selectedModel]);\n\n // Footer text\n const footer = currentView === 'model' || currentView === 'stats'\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Back'\n : showSlashMenu\n ? '[↑↓] Navigate • [Enter] Select • [Esc] Cancel'\n : '[Tab] Next Model • [/] Commands • [Esc] Quit';\n\n return (\n <Box flexDirection=\"column\">\n {/* Header */}\n <Box borderStyle=\"double\" borderColor=\"magenta\" paddingX={1}>\n <Text bold color=\"magenta\">🤖 Jai1 Chat</Text>\n <Box flexGrow={1} />\n <Text dimColor>Model: </Text>\n <Text color=\"yellow\" bold>{selectedModel || '...'}</Text>\n </Box>\n\n {/* Content */}\n {currentView === 'loading' ? (\n <Box padding={2} minHeight={contentHeight.current} alignItems=\"center\" justifyContent=\"center\">\n <Text><Spinner type=\"dots\" /> Loading...</Text>\n </Box>\n ) : currentView === 'model' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n <ModelSelector\n models={models}\n currentModel={selectedModel}\n onSelect={onSelectModel}\n onCancel={() => setCurrentView('chat')}\n />\n </Box>\n ) : currentView === 'stats' ? (\n <Box padding={1} minHeight={contentHeight.current} justifyContent=\"center\" alignItems=\"center\">\n {statsView}\n </Box>\n ) : (\n <ChatPanel\n messages={messages}\n isStreaming={isStreaming}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onSubmit={onSubmit}\n inputFocused={!showSlashMenu}\n showSlashMenu={showSlashMenu}\n slashCommands={filteredCommands}\n slashMenuIndex={slashMenuIndex}\n minHeight={contentHeight.current}\n />\n )}\n\n {/* Footer */}\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * useChat hook\n * Manages chat state and streaming responses\n */\nimport { useState, useCallback } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ChatMessage, CompletionMessage } from '../../../types/llm.types.js';\n\nexport function useChat(service: LlmProxyService) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const sendMessage = useCallback(\n async (content: string, model: string) => {\n if (!content.trim() || isStreaming) return;\n\n // Add user message\n const userMessage: ChatMessage = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant message placeholder\n const assistantMessageId = `assistant-${Date.now()}`;\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n try {\n // Convert chat messages to completion messages\n const completionMessages: CompletionMessage[] = [\n ...messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n {\n role: 'user' as const,\n content: content.trim(),\n },\n ];\n\n // Stream response\n let fullContent = '';\n for await (const chunk of service.chatStream(completionMessages, model)) {\n fullContent += chunk;\n\n // Update message content incrementally\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: fullContent }\n : msg\n )\n );\n }\n\n setIsStreaming(false);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n\n // Update last message with error\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, content: `Error: ${errorMessage}` }\n : msg\n )\n );\n\n setIsStreaming(false);\n }\n },\n [service, messages, isStreaming]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n isStreaming,\n error,\n sendMessage,\n clearMessages,\n };\n}\n","/**\n * useLlmApi hook\n * Manages LLM API data fetching and state\n * Only fetches once on mount - use refetch for manual updates\n */\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { LlmProxyService } from '../../../services/llm-proxy.service.js';\nimport type { ModelWithUsage, UserLimits, UsageStats } from '../../../types/llm.types.js';\n\ninterface LlmApiState {\n models: ModelWithUsage[];\n limits: UserLimits | null;\n usage: UsageStats | null;\n loading: boolean;\n error: string | null;\n}\n\nexport function useLlmApi(service: LlmProxyService) {\n const [state, setState] = useState<LlmApiState>({\n models: [],\n limits: null,\n usage: null,\n loading: true,\n error: null,\n });\n\n // Track if we've already fetched\n const hasFetched = useRef(false);\n\n const fetchData = useCallback(async (showLoading = false) => {\n // Only show loading on initial fetch\n if (showLoading) {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n }\n\n try {\n const [models, limits, usage] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n service.getUsage(7),\n ]);\n\n setState({\n models,\n limits,\n usage,\n loading: false,\n error: null,\n });\n } catch (err) {\n setState((prev) => ({\n ...prev,\n loading: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n }));\n }\n }, [service]);\n\n // Only fetch once on mount\n useEffect(() => {\n if (!hasFetched.current) {\n hasFetched.current = true;\n fetchData(true);\n }\n }, []);\n\n // Refetch without showing loading state (for background updates)\n const refetch = useCallback(() => {\n fetchData(false);\n }, [fetchData]);\n\n return {\n ...state,\n refetch,\n };\n}\n","/**\n * ChatPanel component\n * Simple, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { MessageItem } from './MessageItem.js';\nimport { InputBox } from './InputBox.js';\nimport { SlashCommand } from './SlashCommandMenu.js';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface ChatPanelProps {\n messages: ChatMessage[];\n isStreaming: boolean;\n inputValue: string;\n onInputChange: (value: string) => void;\n onSubmit: (value: string) => void;\n inputFocused?: boolean;\n showSlashMenu?: boolean;\n slashCommands?: SlashCommand[];\n slashMenuIndex?: number;\n minHeight?: number;\n}\n\n// Memoized message list to prevent re-renders\nconst MessageList = memo(({ messages }: { messages: ChatMessage[] }) => {\n const visible = messages.slice(-8);\n const hidden = messages.length - visible.length;\n\n if (visible.length === 0) {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" padding={1}>\n <Text dimColor>Start a conversation...</Text>\n <Text dimColor>Type / for commands</Text>\n </Box>\n );\n }\n\n return (\n <>\n {hidden > 0 && <Text dimColor>({hidden} earlier)</Text>}\n {visible.map((m) => <MessageItem key={m.id} message={m} />)}\n </>\n );\n});\n\n// Memoized slash menu\nconst SlashMenu = memo(({ commands, index }: { commands: SlashCommand[]; index: number }) => (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">Commands</Text>\n {commands.map((cmd, i) => (\n <Text\n key={cmd.name}\n backgroundColor={i === index ? 'cyan' : undefined}\n color={i === index ? 'black' : 'white'}\n >\n {i === index ? '› ' : ' '}/{cmd.name} - {cmd.description}\n </Text>\n ))}\n </Box>\n));\n\nexport const ChatPanel: React.FC<ChatPanelProps> = ({\n messages,\n isStreaming,\n inputValue,\n onInputChange,\n onSubmit,\n inputFocused = true,\n showSlashMenu = false,\n slashCommands = [],\n slashMenuIndex = 0,\n minHeight = 15,\n}) => {\n // Subtract space for input box (~3 lines) and slash menu if shown (~5 lines)\n const messagesMinHeight = Math.max(5, minHeight - 4 - (showSlashMenu ? 5 : 0));\n\n return (\n <Box flexDirection=\"column\">\n {/* Messages */}\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" padding={1} minHeight={messagesMinHeight}>\n <MessageList messages={messages} />\n {isStreaming && (\n <Text color=\"green\"><Spinner type=\"dots\" /> Responding...</Text>\n )}\n </Box>\n\n {/* Slash menu */}\n {showSlashMenu && slashCommands.length > 0 && (\n <SlashMenu commands={slashCommands} index={slashMenuIndex} />\n )}\n\n {/* Input */}\n <InputBox\n value={inputValue}\n onChange={onInputChange}\n onSubmit={onSubmit}\n disabled={isStreaming}\n focused={inputFocused}\n />\n </Box>\n );\n};\n","/**\n * MessageItem component\n * Memoized to prevent re-renders\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport type { ChatMessage } from '../../../types/llm.types.js';\n\ninterface MessageItemProps {\n message: ChatMessage;\n}\n\nexport const MessageItem = memo<MessageItemProps>(({ message }) => {\n if (message.role === 'user') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"cyan\" bold>You:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n if (message.role === 'assistant') {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color=\"green\" bold>Jai1:</Text>\n <Text wrap=\"wrap\">{message.content}</Text>\n </Box>\n );\n }\n\n return (\n <Box marginBottom={1}>\n <Text dimColor italic>{message.content}</Text>\n </Box>\n );\n});\n","/**\n * InputBox component\n * Memoized, stable layout\n */\nimport React, { memo } from 'react';\nimport { Box, Text } from 'ink';\nimport TextInput from 'ink-text-input';\n\ninterface InputBoxProps {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n disabled?: boolean;\n focused?: boolean;\n}\n\nexport const InputBox = memo<InputBoxProps>(({\n value,\n onChange,\n onSubmit,\n disabled = false,\n focused = true,\n}) => (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">❯ </Text>\n {!disabled ? (\n <TextInput\n value={value}\n onChange={onChange}\n onSubmit={onSubmit}\n placeholder=\"Type your message...\"\n focus={focused}\n />\n ) : (\n <Text dimColor>Waiting...</Text>\n )}\n </Box>\n));\n","/**\n * ModelSelector component\n * Overlay for selecting LLM model\n */\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport type { ModelWithUsage } from '../../../types/llm.types.js';\n\ninterface ModelSelectorProps {\n models: ModelWithUsage[];\n currentModel: string;\n onSelect: (modelId: string) => void;\n onCancel: () => void;\n}\n\nexport const ModelSelector: React.FC<ModelSelectorProps> = ({\n models,\n currentModel,\n onSelect,\n onCancel,\n}) => {\n const allowedModels = models.filter((m) => m.allowed);\n const currentIndex = allowedModels.findIndex((m) => m.id === currentModel);\n const [selectedIndex, setSelectedIndex] = useState(Math.max(0, currentIndex));\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(allowedModels.length - 1, prev + 1));\n } else if (key.return) {\n const selected = allowedModels[selectedIndex];\n if (selected) {\n onSelect(selected.id);\n }\n }\n });\n\n if (allowedModels.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"red\"\n padding={1}\n width={60}\n >\n <Text color=\"red\" bold>\n No models available\n </Text>\n <Text dimColor>Press Esc to close</Text>\n </Box>\n );\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"cyan\"\n padding={1}\n width={70}\n >\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n ⚙️ Select Model\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginBottom={1}>\n {allowedModels.map((model, i) => {\n const isSelected = i === selectedIndex;\n const isCurrent = model.id === currentModel;\n const icon = isSelected ? '●' : '○';\n\n let usageText = '';\n if (model.dailyLimit !== undefined && model.usedToday !== undefined) {\n usageText = ` (${model.usedToday}/${model.dailyLimit})`;\n }\n\n return (\n <Box key={model.id} marginY={0}>\n <Text\n backgroundColor={isSelected ? 'cyan' : undefined}\n color={isSelected ? 'black' : 'white'}\n >\n {isSelected ? '❯ ' : ' '}\n {icon} {model.id}\n {isCurrent ? ' ✓' : ''}\n {usageText}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>[↑↓] Navigate [Enter] Select [Esc] Cancel</Text>\n </Box>\n </Box>\n );\n};\n","/**\n * API Keys Command\n * Show OpenAI-compatible API credentials and info\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { ValidationError } from '../errors/index.js';\n\nfunction maskKey(key: string): string {\n if (key.length <= 8) return '****';\n return key.slice(0, 8) + '****' + key.slice(-4);\n}\n\n/**\n * Handle api-keys command\n */\nasync function handleApiKeysCommand(options: { full?: boolean }): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const service = new LlmProxyService(config);\n\n console.log('📡 Jai1 LLM Proxy - OpenAI Compatible API');\n console.log('─────────────────────────────────────────\\n');\n\n console.log('🔑 API Credentials');\n console.log(` BASE_URL: ${service.getBaseUrl()}`);\n console.log(` API_KEY: ${options.full ? service.getApiKey() : maskKey(service.getApiKey())}\\n`);\n\n try {\n const [models, limits] = await Promise.all([\n service.getModelsWithUsage(),\n service.getLimits(),\n ]);\n\n const allowedModels = models.filter((m) => m.allowed);\n\n console.log('📦 Available Models');\n if (allowedModels.length === 0) {\n console.log(' No models available\\n');\n } else {\n allowedModels.forEach((model) => {\n const usageText =\n model.dailyLimit !== undefined && model.usedToday !== undefined\n ? ` (${model.usedToday}/${model.dailyLimit} today)`\n : '';\n console.log(` ✓ ${model.id}${usageText}`);\n });\n console.log();\n }\n\n const defaultModel = allowedModels[0]?.id || 'gpt-4o';\n console.log('📝 Sample cURL\\n');\n const curlSample = options.full\n ? service.generateFullCurlSample(defaultModel)\n : service.generateCurlSample(defaultModel);\n const curlLines = curlSample.split('\\n');\n curlLines.forEach((line) => console.log(` ${line}`));\n console.log();\n\n console.log('💡 Usage:');\n console.log(' - Use as drop-in replacement for OpenAI API');\n console.log(' - Compatible with: OpenAI SDK, LangChain, LlamaIndex, etc.');\n console.log(' - Run \"jai1 chat\" for interactive mode');\n console.log(' - Run \"jai1 api-keys --full\" to show full API key');\n } catch (error) {\n console.error(\n '\\n❌ Failed to fetch API info:',\n error instanceof Error ? error.message : String(error)\n );\n console.log('\\n💡 Check your API URL and access key with \"jai1 status\"');\n }\n}\n\n/**\n * Create api-keys command\n */\nexport function createApiKeysCommand(): Command {\n const cmd = new Command('api-keys')\n .description('Show OpenAI-compatible API credentials and info')\n .option('--full', 'Show full API key (unmasked)')\n .action(async (options: { full?: boolean }) => {\n await handleApiKeysCommand(options);\n });\n\n return cmd;\n}\n","/**\n * Translate Command\n * Translate text, files, or folders using LLM Proxy\n */\nimport { Command } from 'commander';\nimport { ConfigService } from '../services/config.service.js';\nimport { LlmProxyService } from '../services/llm-proxy.service.js';\nimport { TranslationService } from '../services/translation.service.js';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\nimport type { TranslateOptions } from '../types/translate.types.js';\n\ninterface TranslateCommandOptions extends TranslateOptions {\n model?: string;\n}\n\n/**\n * Handle translate command\n */\nasync function handleTranslate(input: string, options: TranslateCommandOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Chưa xác thực. Chạy \"jai1 auth\" trước.');\n }\n\n const llmService = new LlmProxyService(config);\n const translationService = new TranslationService(llmService, options, options.model);\n\n // Detect input type\n const inputType = await translationService.detectInputType(input);\n\n // Handle based on type\n switch (inputType) {\n case 'text':\n await handleTextTranslation(translationService, input, options);\n break;\n case 'file':\n await handleFileTranslation(translationService, input, options);\n break;\n case 'folder':\n await handleFolderTranslation(translationService, input, options);\n break;\n }\n}\n\n/**\n * Handle text translation\n */\nasync function handleTextTranslation(\n service: TranslationService,\n text: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log('🌐 Đang dịch văn bản...');\n }\n\n const result = await service.translateText(text);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success && result.translatedContent) {\n console.log(`✅ Hoàn tất! Ngôn ngữ: ${result.targetLanguage}\\n`);\n console.log(result.translatedContent);\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle file translation\n */\nasync function handleFileTranslation(\n service: TranslationService,\n filePath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang dịch file: ${filePath}`);\n }\n\n const result = await service.translateFile(filePath);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.success) {\n if (options.dryRun) {\n console.log(`✅ Preview mode - sẽ lưu: ${result.outputPath}`);\n } else {\n console.log(`✅ Đã lưu: ${result.outputPath}`);\n }\n } else {\n console.error(`❌ Lỗi: ${result.error}`);\n process.exit(1);\n }\n}\n\n/**\n * Handle folder translation\n */\nasync function handleFolderTranslation(\n service: TranslationService,\n folderPath: string,\n options: TranslateOptions\n): Promise<void> {\n if (!options.json) {\n console.log(`🌐 Đang quét thư mục: ${folderPath}\\n`);\n }\n\n const result = await service.translateFolder(folderPath, (progress) => {\n if (!options.json) {\n const fileName = progress.currentFile.split('/').pop() || progress.currentFile;\n process.stdout.write(\n `\\r🌐 Đang xử lý: ${progress.current}/${progress.total} - ${fileName}${' '.repeat(20)}`\n );\n }\n });\n\n if (!options.json) {\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(100) + '\\r');\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display summary\n console.log(`\\n✅ Hoàn tất! ${result.summary.success}/${result.summary.total} file đã dịch`);\n\n if (result.summary.failed > 0) {\n console.log(`\\n⚠️ ${result.summary.failed} file gặp lỗi:`);\n result.results\n .filter((r) => !r.success)\n .forEach((r) => {\n const fileName = r.inputPath.split('/').pop() || r.inputPath;\n console.log(` ❌ ${fileName}: ${r.error}`);\n });\n }\n\n if (options.dryRun) {\n console.log('\\n💡 Chạy không có --dry-run để lưu file.');\n }\n}\n\n/**\n * Create translate command\n */\nexport function createTranslateCommand(): Command {\n const cmd = new Command('translate')\n .description('Dịch văn bản, file hoặc thư mục bằng AI')\n .argument('<input>', 'Chuỗi văn bản, đường dẫn file hoặc thư mục')\n .option('--to <language>', 'Mã ngôn ngữ đích (mặc định: vi)', 'vi')\n .option('-o, --output <path>', 'Đường dẫn output (file/thư mục)')\n .option('--dry-run', 'Xem trước không lưu file')\n .option('--concurrency <number>', 'Số file xử lý song song (mặc định: 3)', '3')\n .option('--model <model>', 'Model LLM (mặc định: gpt-5.1-codex-mini)')\n .option('--json', 'Xuất kết quả dạng JSON')\n .action(async (input: string, options: TranslateCommandOptions) => {\n await handleTranslate(input, options);\n });\n\n return cmd;\n}\n","/**\n * Translation Service\n * Handles translation of text, files, and folders using LLM Proxy\n */\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { LlmProxyService } from './llm-proxy.service.js';\nimport type { CompletionMessage } from '../types/llm.types.js';\nimport type {\n TranslateOptions,\n TranslationResult,\n FileTranslationResult,\n FolderTranslationResult,\n TranslationProgress,\n TRANSLATABLE_EXTENSIONS,\n TranslatableExtension,\n} from '../types/translate.types.js';\n\nconst TRANSLATABLE_EXTS = ['.md', '.txt', '.json', '.yaml', '.yml'] as const;\n\nexport class TranslationService {\n private readonly llmService: LlmProxyService;\n private readonly options: TranslateOptions;\n private readonly model: string;\n\n constructor(llmService: LlmProxyService, options: TranslateOptions, model?: string) {\n this.llmService = llmService;\n this.options = options;\n this.model = model || 'gpt-5.1-codex-mini'; // Default fast model for translation\n }\n\n /**\n * Detect input type\n */\n async detectInputType(input: string): Promise<'text' | 'file' | 'folder'> {\n try {\n const stat = await fs.stat(input);\n if (stat.isDirectory()) return 'folder';\n if (stat.isFile()) return 'file';\n } catch {\n // Path doesn't exist, treat as text\n }\n return 'text';\n }\n\n /**\n * Translate text string\n */\n async translateText(text: string): Promise<TranslationResult> {\n try {\n const translatedContent = await this.translateWithRetry(text, 'text');\n return {\n success: true,\n inputType: 'text',\n input: text,\n output: translatedContent,\n targetLanguage: this.options.to,\n translatedContent,\n };\n } catch (error) {\n return {\n success: false,\n inputType: 'text',\n input: text,\n output: '',\n targetLanguage: this.options.to,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate single file\n */\n async translateFile(filePath: string): Promise<FileTranslationResult> {\n try {\n // Read file content\n const content = await fs.readFile(filePath, 'utf-8');\n\n // Detect file type\n const ext = path.extname(filePath).toLowerCase();\n const fileType = this.getFileType(ext);\n\n // Translate content\n const translatedContent = await this.translateWithRetry(content, fileType);\n\n // Generate output path\n const outputPath = this.generateOutputPath(filePath);\n\n // Write output (unless dry-run)\n if (!this.options.dryRun) {\n await fs.writeFile(outputPath, translatedContent, 'utf-8');\n }\n\n return {\n inputPath: filePath,\n outputPath,\n success: true,\n };\n } catch (error) {\n return {\n inputPath: filePath,\n outputPath: '',\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Translate entire folder recursively\n */\n async translateFolder(\n folderPath: string,\n onProgress?: (progress: TranslationProgress) => void\n ): Promise<FolderTranslationResult> {\n const files = await this.discoverFiles(folderPath);\n const concurrency = parseInt(this.options.concurrency || '3', 10);\n const limit = pLimit(concurrency);\n\n const results: FileTranslationResult[] = [];\n let current = 0;\n\n const tasks = files.map((file) =>\n limit(async () => {\n current++;\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: 'translating',\n });\n\n const result = await this.translateFile(file);\n results.push(result);\n\n onProgress?.({\n current,\n total: files.length,\n currentFile: file,\n status: result.success ? 'done' : 'error',\n });\n\n return result;\n })\n );\n\n await Promise.all(tasks);\n\n return this.summarizeResults(folderPath, results);\n }\n\n /**\n * Generate output path with language suffix\n */\n private generateOutputPath(inputPath: string): string {\n if (this.options.output) {\n return this.options.output;\n }\n\n const ext = path.extname(inputPath);\n const base = path.basename(inputPath, ext);\n const dir = path.dirname(inputPath);\n const lang = this.options.to;\n\n return path.join(dir, `${base}.${lang}${ext}`);\n }\n\n /**\n * Discover translatable files in folder recursively\n */\n private async discoverFiles(folderPath: string): Promise<string[]> {\n const entries = await fs.readdir(folderPath, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(folderPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip hidden directories and node_modules\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const subFiles = await this.discoverFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (TRANSLATABLE_EXTS.includes(ext as TranslatableExtension)) {\n // Skip already translated files (e.g., file.vi.md)\n if (!this.isTranslatedFile(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n }\n\n return files;\n }\n\n /**\n * Check if filename indicates already translated file\n */\n private isTranslatedFile(filename: string): boolean {\n // Pattern: .{lang}.{ext} (e.g., .vi.md, .en.txt)\n const pattern = /\\.[a-z]{2}\\.(md|txt|json|ya?ml)$/i;\n return pattern.test(filename);\n }\n\n /**\n * Build translation prompt based on content type\n */\n private buildPrompt(content: string, fileType: string): CompletionMessage[] {\n const targetLang = this.options.to;\n let systemPrompt = '';\n\n switch (fileType) {\n case 'markdown':\n systemPrompt = `You are a professional translator.\nTranslate the following Markdown content to ${targetLang}.\nPreserve all formatting including:\n- Markdown syntax (headers, lists, code blocks, links, tables)\n- Line breaks and paragraph structure\n- Code snippets (do not translate code, only comments if present)\n- HTML tags if present\n\nReturn ONLY the translated content, no explanations.`;\n break;\n\n case 'json':\n systemPrompt = `You are translating a JSON localization file.\nTranslate all string values to ${targetLang}.\nPreserve the JSON structure and keys exactly.\nReturn valid JSON only, no explanations.`;\n break;\n\n case 'yaml':\n systemPrompt = `You are translating a YAML configuration file.\nTranslate all string values to ${targetLang}.\nPreserve the YAML structure and keys exactly.\nReturn valid YAML only, no explanations.`;\n break;\n\n default:\n systemPrompt = `You are a professional translator.\nTranslate the following text to ${targetLang}.\nPreserve all formatting and line breaks.\nReturn ONLY the translated content, no explanations.`;\n }\n\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: content },\n ];\n }\n\n /**\n * Get file type from extension\n */\n private getFileType(ext: string): string {\n switch (ext.toLowerCase()) {\n case '.md':\n return 'markdown';\n case '.json':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n default:\n return 'text';\n }\n }\n\n /**\n * Translate with retry logic\n */\n private async translateWithRetry(content: string, fileType: string): Promise<string> {\n return pRetry(\n async () => {\n const messages = this.buildPrompt(content, fileType);\n const result = await this.llmService.chat(messages, this.model);\n return result;\n },\n {\n retries: 3,\n onFailedAttempt: (error) => {\n if (error.message.includes('rate limit')) {\n console.log('⚠️ Rate limit, đang thử lại...');\n }\n },\n }\n );\n }\n\n /**\n * Summarize folder translation results\n */\n private summarizeResults(\n folderPath: string,\n results: FileTranslationResult[]\n ): FolderTranslationResult {\n const summary = {\n total: results.length,\n success: results.filter((r) => r.success).length,\n failed: results.filter((r) => !r.success).length,\n skipped: 0,\n };\n\n return {\n inputFolder: folderPath,\n outputFolder: this.options.output || folderPath,\n results,\n summary,\n };\n }\n}\n","/**\n * Upgrade Command\n * Update jai1-client to the latest version\n * \n * Renamed from 'self-update' to 'upgrade' for clarity\n * - 'update' = update installed components\n * - 'upgrade' = upgrade the CLI tool itself\n */\nimport { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create upgrade command\n */\nexport function createUpgradeCommand(): Command {\n return new Command('upgrade')\n .description('Upgrade jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force upgrade without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleUpgrade(options);\n });\n}\n\nasync function handleUpgrade(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 upgrade\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Upgrade cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully upgraded to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('upgrade', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Upgrade failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually upgrading with:${colors.reset}`);\n\n // Show manual upgrade command for detected package manager\n const manualCommands = {\n npm: `npm install -g @jvittechs/jai1-cli@latest`,\n pnpm: `pnpm add -g @jvittechs/jai1-cli@latest`,\n yarn: `yarn global add @jvittechs/jai1-cli@latest`,\n bun: `bun add -g @jvittechs/jai1-cli@latest`\n };\n\n console.error(` ${colors.cyan}${manualCommands[packageManager]}${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager was used to install jai1\n * Priority:\n * 1. Check how jai1 was installed (via global bin path) - MOST RELIABLE\n * 2. Check npm_config_user_agent environment variable\n * 3. Default to npm (safest fallback)\n * \n * Supports both Windows and Unix paths\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // 1. Try to detect from actual jai1 installation path (MOST RELIABLE)\n try {\n const jai1Path = execSync('which jai1 || where jai1', {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'ignore']\n }).trim();\n\n if (jai1Path) {\n // Normalize path separators for consistent matching (Windows uses \\, Unix uses /)\n const normalizedPath = jai1Path.toLowerCase().replace(/\\\\/g, '/');\n\n // pnpm global paths:\n // - Unix: ~/.local/share/pnpm or ~/Library/pnpm\n // - Windows: C:/Users/username/AppData/Local/pnpm\n if (normalizedPath.includes('/pnpm/')) return 'pnpm';\n\n // yarn global paths:\n // - Unix: ~/.yarn or ~/Library/Yarn\n // - Windows: C:/Users/username/AppData/Local/Yarn\n if (normalizedPath.includes('/.yarn/') || normalizedPath.includes('/yarn/')) return 'yarn';\n\n // bun global paths:\n // - Unix: ~/.bun\n // - Windows: C:/Users/username/.bun\n if (normalizedPath.includes('/.bun/')) return 'bun';\n\n // npm global paths:\n // Unix:\n // - nvm: ~/.nvm/versions/node/vX.X.X/bin/\n // - system: /usr/local/bin/ or /usr/bin/\n // - npm prefix: ~/.npm-global/bin/ or similar\n // - node_modules: anywhere with /node_modules/.bin/\n // Windows:\n // - AppData: C:/Users/username/AppData/Roaming/npm/\n // - Program Files: C:/Program Files/nodejs/\n // - node_modules: anywhere with /node_modules/\n if (normalizedPath.includes('/.nvm/') ||\n normalizedPath.includes('/node_modules/') ||\n normalizedPath.includes('/lib/node_modules/') ||\n normalizedPath.includes('/npm-global/') ||\n normalizedPath.includes('/usr/local/bin/') ||\n normalizedPath.includes('/usr/bin/') ||\n normalizedPath.includes('/appdata/roaming/npm/') ||\n normalizedPath.includes('/program files/nodejs/')) {\n return 'npm';\n }\n }\n } catch {\n // Ignore errors, continue with other detection methods\n }\n\n // 2. Check user agent for package manager (when running via npm/pnpm/yarn scripts)\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n if (userAgent.includes('npm')) return 'npm';\n\n // 3. Default to npm (safest and most common)\n // DO NOT check for available package managers here - it causes false positives!\n // If user has pnpm installed but used npm to install jai1, we should use npm.\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","/**\n * Clean Command\n * Clean up backups, cache, and temporary files\n * \n * Renamed from 'clear-backups' to 'clean' for broader scope\n */\nimport { Command } from 'commander';\nimport { confirm, select } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\n\ninterface CleanTarget {\n name: string;\n description: string;\n path: string;\n check: () => Promise<{ exists: boolean; count?: number; size?: string }>;\n clean: () => Promise<void>;\n}\n\n/**\n * Create clean command\n */\nexport function createCleanCommand(): Command {\n return new Command('clean')\n .description('Clean up backups, cache, and temporary files')\n .option('-y, --yes', 'Skip confirmation')\n .option('--backups', 'Clean only backup files')\n .option('--all', 'Clean all (backups + cache)')\n .action(async (options: { yes?: boolean; backups?: boolean; all?: boolean }) => {\n await handleClean(options);\n });\n}\n\nasync function handleClean(options: { yes?: boolean; backups?: boolean; all?: boolean }) {\n const cwd = process.cwd();\n const service = new ComponentsService();\n\n // Define clean targets\n const targets: CleanTarget[] = [\n {\n name: 'Backups',\n description: 'Component backup files (.jai1_backup/)',\n path: join(cwd, '.jai1_backup'),\n check: async () => {\n const backups = await service.listBackups(cwd);\n return { exists: backups.length > 0, count: backups.length };\n },\n clean: async () => {\n await service.clearBackups(cwd);\n }\n },\n // Future targets can be added here:\n // {\n // name: 'Cache',\n // description: 'Downloaded component cache',\n // path: join(homedir(), '.jai1', 'cache'),\n // ...\n // }\n ];\n\n console.log('🧹 Clean up jai1-client files\\n');\n\n // Check what's available to clean\n const availableTargets: Array<{ target: CleanTarget; info: { exists: boolean; count?: number } }> = [];\n\n for (const target of targets) {\n const info = await target.check();\n if (info.exists) {\n availableTargets.push({ target, info });\n }\n }\n\n if (availableTargets.length === 0) {\n console.log('✨ Nothing to clean up!');\n return;\n }\n\n // If specific option provided\n if (options.backups) {\n const backupTarget = targets.find(t => t.name === 'Backups');\n if (backupTarget) {\n await cleanTarget(backupTarget, options.yes);\n }\n return;\n }\n\n if (options.all) {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n return;\n }\n\n // Interactive mode\n console.log('Found the following items:\\n');\n for (const { target, info } of availableTargets) {\n const countStr = info.count ? ` (${info.count} items)` : '';\n console.log(` 📁 ${target.name}${countStr}`);\n console.log(` ${target.description}`);\n console.log(` Path: ${target.path}\\n`);\n }\n\n const action = await select({\n message: 'What do you want to clean?',\n choices: [\n ...availableTargets.map(({ target, info }) => ({\n name: `${target.name}${info.count ? ` (${info.count} items)` : ''}`,\n value: target.name\n })),\n { name: '🧹 Clean all', value: 'all' },\n { name: '❌ Cancel', value: 'cancel' }\n ]\n });\n\n if (action === 'cancel') {\n console.log('\\n❌ Operation cancelled.');\n return;\n }\n\n if (action === 'all') {\n for (const { target } of availableTargets) {\n await cleanTarget(target, options.yes);\n }\n } else {\n const target = targets.find(t => t.name === action);\n if (target) {\n await cleanTarget(target, options.yes);\n }\n }\n}\n\nasync function cleanTarget(target: CleanTarget, skipConfirm?: boolean): Promise<void> {\n const info = await target.check();\n\n if (!info.exists) {\n console.log(`✨ ${target.name}: Nothing to clean.`);\n return;\n }\n\n const countStr = info.count ? ` (${info.count} items)` : '';\n\n if (!skipConfirm) {\n const confirmed = await confirm({\n message: `Delete ${target.name}${countStr}?`,\n default: false\n });\n\n if (!confirmed) {\n console.log(`⏭️ Skipped ${target.name}`);\n return;\n }\n }\n\n try {\n await target.clean();\n console.log(`✅ Cleaned ${target.name}${countStr}`);\n } catch (error) {\n console.error(`❌ Failed to clean ${target.name}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { checkConnectivity } from '../../services/redmine-connectivity.service.js';\n\ninterface CheckOptions {\n config?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine check command\n */\nexport function createRedmineCheckCommand(): Command {\n const cmd = new Command('check')\n .description('Check Redmine connectivity')\n .option('-c, --config <path>', 'Config file path', 'redmine.config.yaml')\n .option('--json', 'Output as JSON')\n .action(async (options: CheckOptions) => {\n await handleRedmineCheck(options);\n });\n\n return cmd;\n}\n\nasync function handleRedmineCheck(options: CheckOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const result = await checkConnectivity(config);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅', result.message);\n if (result.details?.project) {\n console.log(\n ` Project: ${result.details.project.name} (${result.details.project.identifier})`\n );\n console.log(` Project ID: ${result.details.project.id}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineConfigSchema } from '../types/redmine.types.js';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\nimport { ValidationError, NotFoundError } from '../errors/index.js';\n\n/**\n * Service for managing Redmine configuration\n */\nexport class RedmineConfigService {\n private configPath: string;\n\n constructor(configPath?: string) {\n this.configPath = configPath ?? resolve(process.cwd(), 'redmine.config.yaml');\n }\n\n /**\n * Load Redmine configuration from YAML file\n */\n async load(): Promise<RedmineConfig> {\n try {\n const content = await readFile(this.configPath, 'utf-8');\n const rawConfig = parse(content);\n\n return RedmineConfigSchema.parse(rawConfig);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n throw new NotFoundError(`Configuration file not found: ${this.configPath}`);\n }\n\n throw new ValidationError(\n `Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Validate configuration object\n */\n validate(config: unknown): RedmineConfig {\n try {\n return RedmineConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new ValidationError(`Configuration validation failed: ${error.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n}\n\n// Export schema for use in types file\nexport { RedmineConfigSchema };\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { z } from 'zod';\n\nconst RetryConfigSchema = z.object({\n retries: z.number().min(0).default(3),\n baseMs: z.number().min(100).default(300),\n});\n\nconst FilenameConfigSchema = z.object({\n pattern: z.string().default('{issueId}-{slug}.md'),\n slug: z.object({\n maxLength: z.number().min(10).default(80),\n dedupe: z.boolean().default(true),\n lowercase: z.boolean().default(true),\n }),\n renameOnTitleChange: z.boolean().default(false),\n});\n\nconst CommentsConfigSchema = z.object({\n anchors: z.object({\n start: z.string().default('<!-- redmine:comments:start -->'),\n end: z.string().default('<!-- redmine:comments:end -->'),\n }),\n trackBy: z.enum(['journalId', 'createdOn']).default('journalId'),\n});\n\nconst DefaultsConfigSchema = z.object({\n include: z.array(z.enum(['journals', 'relations', 'attachments'])).default(['journals']),\n status: z.string().default('*'),\n pageSize: z.number().min(1).max(100).default(100),\n concurrency: z.number().min(1).max(10).default(4),\n retry: RetryConfigSchema.default({}),\n});\n\nconst ProjectConfigSchema = z.object({\n id: z.number(),\n identifier: z.string(),\n});\n\nconst RedmineConfigSchema = z.object({\n baseUrl: z.string().url(),\n apiAccessToken: z.string().min(1),\n project: ProjectConfigSchema,\n outputDir: z.string().default('.jai1/redmine'),\n defaults: DefaultsConfigSchema.default({}),\n filename: FilenameConfigSchema.default({}),\n comments: CommentsConfigSchema.default({}),\n});\n\nexport type RedmineConfig = z.infer<typeof RedmineConfigSchema>;\nexport type RetryConfig = z.infer<typeof RetryConfigSchema>;\nexport type FilenameConfig = z.infer<typeof FilenameConfigSchema>;\nexport type CommentsConfig = z.infer<typeof CommentsConfigSchema>;\nexport type DefaultsConfig = z.infer<typeof DefaultsConfigSchema>;\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\n// Export schema for use in service\nexport { RedmineConfigSchema };\n","import { fetch } from 'undici';\nimport pRetry from 'p-retry';\nimport pLimit from 'p-limit';\nimport type { RedmineConfig, RetryConfig } from './config.js';\n\nexport interface RedmineIssue {\n id: number;\n subject: string;\n description: string;\n status: { id: number; name: string };\n priority: { id: number; name: string };\n author: { id: number; name: string };\n assigned_to?: { id: number; name: string };\n created_on: string;\n updated_on: string;\n project: { id: number; name: string };\n tracker: { id: number; name: string };\n journals?: RedmineJournal[];\n relations?: RedmineRelation[];\n attachments?: RedmineAttachment[];\n}\n\nexport interface RedmineJournal {\n id: number;\n user: { id: number; name: string };\n notes?: string;\n created_on: string;\n details?: Array<{\n name: string;\n old_value: string;\n new_value: string;\n }>;\n}\n\nexport interface RedmineRelation {\n id: number;\n issue_to_id: number;\n relation_type: string;\n delay?: number;\n}\n\nexport interface RedmineAttachment {\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: { id: number; name: string };\n created_on: string;\n content_url?: string;\n}\n\nexport interface RedmineIssueResponse {\n issue: RedmineIssue;\n}\n\nexport interface RedmineIssuesResponse {\n issues: RedmineIssue[];\n total_count: number;\n offset: number;\n limit: number;\n}\n\nexport interface RedmineProjectResponse {\n project: {\n id: number;\n identifier: string;\n name: string;\n created_on: string;\n updated_on: string;\n };\n}\n\nexport class RedmineApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public response?: unknown\n ) {\n super(message);\n this.name = 'RedmineApiError';\n }\n}\n\nexport class RedmineApiClient {\n private readonly baseUrl: string;\n private readonly apiAccessToken: string;\n private readonly retryConfig: RetryConfig;\n private readonly concurrencyLimit: pLimit.Limit;\n\n constructor(config: RedmineConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.apiAccessToken = config.apiAccessToken;\n this.retryConfig = config.defaults.retry;\n this.concurrencyLimit = pLimit(config.defaults.concurrency);\n }\n\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n const headers = {\n 'X-Redmine-API-Key': this.apiAccessToken,\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const attempt = async (): Promise<T> => {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const errorData = (await response.json()) as { errors?: string[] };\n if (errorData.errors && Array.isArray(errorData.errors)) {\n errorMessage = errorData.errors.join(', ');\n }\n } catch {\n // Ignore JSON parsing errors for error response\n }\n\n throw new RedmineApiError(errorMessage, response.status);\n }\n\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json() as Promise<T>;\n }\n\n return response.text() as unknown as T;\n };\n\n return pRetry(attempt, {\n retries: this.retryConfig.retries,\n onFailedAttempt: (error) => {\n console.warn(\n `Request failed (attempt ${error.attemptNumber}/${error.retriesLeft + 1}): ${error.message}`\n );\n },\n factor: 2,\n minTimeout: this.retryConfig.baseMs,\n maxTimeout: this.retryConfig.baseMs * 8,\n });\n }\n\n async checkConnectivity(): Promise<boolean> {\n try {\n await this.request<RedmineProjectResponse>('/projects.json?limit=1');\n return true;\n } catch (error) {\n if (error instanceof RedmineApiError) {\n throw error;\n }\n throw new RedmineApiError(\n `Connectivity check failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async getProject(identifier: string): Promise<RedmineProjectResponse> {\n return this.request<RedmineProjectResponse>(`/projects/${identifier}.json`);\n }\n\n async getIssue(issueId: number, include?: string[]): Promise<RedmineIssueResponse> {\n const params = new URLSearchParams();\n if (include && include.length > 0) {\n params.append('include', include.join(','));\n }\n\n const path = `/issues/${issueId}.json${params.toString() ? `?${params.toString()}` : ''}`;\n return this.request<RedmineIssueResponse>(path);\n }\n\n async getIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n offset?: number;\n include?: string[];\n updatedSince?: string;\n } = {}\n ): Promise<RedmineIssuesResponse> {\n const params = new URLSearchParams();\n params.append('project_id', projectId.toString());\n\n if (options.status && options.status !== '*') {\n params.append('status_id', options.status);\n }\n\n if (options.pageSize) {\n params.append('limit', options.pageSize.toString());\n }\n\n if (options.offset) {\n params.append('offset', options.offset.toString());\n }\n\n if (options.include && options.include.length > 0) {\n params.append('include', options.include.join(','));\n }\n\n if (options.updatedSince) {\n params.append('updated_on', `>=${options.updatedSince}`);\n }\n\n const path = `/issues.json?${params.toString()}`;\n return this.request<RedmineIssuesResponse>(path);\n }\n\n async getAllIssues(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n const allIssues: RedmineIssue[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n allIssues.push(...response.issues);\n\n if (options.onProgress) {\n options.onProgress(allIssues.length, response.total_count);\n }\n\n hasMore = allIssues.length < response.total_count;\n offset += pageSize;\n }\n\n return allIssues;\n }\n\n async getIssuesConcurrently(\n projectId: number,\n options: {\n status?: string;\n pageSize?: number;\n include?: string[];\n updatedSince?: string;\n onProgress?: (current: number, total: number) => void;\n } = {}\n ): Promise<RedmineIssue[]> {\n const pageSize = options.pageSize || 100;\n\n // First, get the total count\n const initialResponse = await this.getIssues(projectId, {\n ...options,\n pageSize: 1,\n });\n\n const totalCount = initialResponse.total_count;\n const totalPages = Math.ceil(totalCount / pageSize);\n\n const pagePromises = Array.from({ length: totalPages }, (_, index) => {\n const offset = index * pageSize;\n\n return this.concurrencyLimit(async () => {\n const response = await this.getIssues(projectId, {\n ...options,\n pageSize,\n offset,\n });\n\n if (options.onProgress) {\n options.onProgress(offset + response.issues.length, totalCount);\n }\n\n return response.issues;\n });\n });\n\n const pageResults = await Promise.all(pagePromises);\n return pageResults.flat();\n }\n}\n","import type { RedmineConfig } from '../types/redmine.types.js';\nimport { RedmineApiClient, RedmineApiError } from '../api.js';\n\nexport interface ConnectivityResult {\n success: boolean;\n message: string;\n details?: {\n baseUrl: string;\n project?: {\n id: number;\n identifier: string;\n name: string;\n };\n };\n}\n\nexport async function checkConnectivity(config: RedmineConfig): Promise<ConnectivityResult> {\n const client = new RedmineApiClient(config);\n\n try {\n const isConnected = await client.checkConnectivity();\n\n if (!isConnected) {\n return {\n success: false,\n message: 'Failed to connect to Redmine API',\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n const projectResponse = await client.getProject(config.project.identifier);\n\n return {\n success: true,\n message: `Successfully connected to Redmine and found project \"${projectResponse.project.name}\"`,\n details: {\n baseUrl: config.baseUrl,\n project: projectResponse.project,\n },\n };\n } catch (error) {\n if (error instanceof RedmineApiError) {\n let message = `Redmine API error: ${error.message}`;\n\n if (error.status === 401) {\n message = 'Authentication failed - please check your API access token';\n } else if (error.status === 403) {\n message = 'Access forbidden - insufficient permissions for the project';\n } else if (error.status === 404) {\n message = `Project \"${config.project.identifier}\" not found or inaccessible`;\n }\n\n return {\n success: false,\n message,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n\n return {\n success: false,\n message: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,\n details: {\n baseUrl: config.baseUrl,\n },\n };\n }\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncIssue, extractIssueIdFromUrl } from '../../sync-issue.js';\nimport { ValidationError } from '../../errors/index.js';\n\ninterface SyncIssueOptions {\n id?: string;\n url?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync issue command\n */\nexport function createSyncIssueCommand(): Command {\n const cmd = new Command('issue')\n .description('Sync a single issue')\n .option('-i, --id <number>', 'Issue ID')\n .option('-u, --url <url>', 'Issue URL')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncIssueOptions) => {\n await handleSyncIssue(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncIssue(options: SyncIssueOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n let issueId: number;\n\n if (options.id) {\n issueId = parseInt(options.id, 10);\n if (isNaN(issueId)) {\n throw new ValidationError('Invalid issue ID');\n }\n } else if (options.url) {\n const extractedId = extractIssueIdFromUrl(options.url);\n if (!extractedId) {\n throw new ValidationError('Could not extract issue ID from URL');\n }\n issueId = extractedId;\n } else {\n throw new ValidationError('Either --id or --url must be provided');\n }\n\n const result = await syncIssue(issueId, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n const icon = result.action === 'skipped' ? '⏭️' : '✅';\n console.log(`${icon} ${result.message}`);\n if (result.filePath) {\n console.log(` File: ${result.filePath}`);\n }\n } else {\n console.error('❌', result.message);\n process.exit(4);\n }\n }\n}\n","import { resolve, relative } from 'node:path';\nimport type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport {\n mapIssueToFrontmatter,\n mapIssueToContent,\n mapJournalsToComments,\n extractNewJournals,\n shouldUpdateIssue,\n shouldUpdateComments,\n} from './mappers.js';\nimport { generateFilename } from './slug.util.js';\nimport {\n readMarkdownFile,\n writeMarkdownFile,\n extractIssueIdFromFrontmatter,\n extractLastJournalId,\n} from './file.util.js';\n\nexport interface SyncIssueOptions {\n dryRun?: boolean;\n outputDir?: string;\n}\n\nexport interface SyncIssueResult {\n success: boolean;\n issueId: number;\n filename: string;\n filePath: string;\n action: 'created' | 'updated' | 'skipped';\n message: string;\n changes?: {\n content?: boolean;\n comments?: boolean;\n frontmatter?: boolean;\n };\n}\n\nexport async function syncIssue(\n issueId: number,\n config: RedmineConfig,\n options: SyncIssueOptions = {}\n): Promise<SyncIssueResult> {\n const client = new RedmineApiClient(config);\n const outputDir = options.outputDir || config.outputDir;\n\n try {\n const include = config.defaults.include;\n const response = await client.getIssue(issueId, include);\n const issue = response.issue;\n\n const filename = generateFilename(issue.id, issue.subject, config.filename);\n const filePath = resolve(outputDir, filename);\n const relativePath = relative(process.cwd(), filePath);\n\n const existingFile = await readMarkdownFile(filePath);\n const existingIssueId = extractIssueIdFromFrontmatter(existingFile.frontmatter);\n const existingLastJournalId = extractLastJournalId(existingFile.frontmatter);\n\n if (existingIssueId && existingIssueId !== issue.id) {\n return {\n success: false,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `File ${filename} contains issue ${existingIssueId}, not ${issue.id}`,\n };\n }\n\n const needsUpdate = shouldUpdateIssue(issue, existingFile.frontmatter);\n const needsCommentsUpdate = shouldUpdateComments(\n issue.journals || [],\n existingFile.frontmatter\n );\n\n if (!needsUpdate && !needsCommentsUpdate) {\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action: 'skipped',\n message: `Issue ${issueId} is already up to date`,\n };\n }\n\n const frontmatter = mapIssueToFrontmatter(issue);\n const content = mapIssueToContent(issue);\n\n let comments: string | undefined;\n if (needsCommentsUpdate && issue.journals) {\n const newJournals = extractNewJournals(issue.journals, existingLastJournalId);\n if (newJournals.length > 0) {\n const newComments = mapJournalsToComments(newJournals, config.comments);\n if (existingFile.comments) {\n comments = `${existingFile.comments}\\n\\n---\\n\\n${newComments}`;\n } else {\n comments = newComments;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n } else {\n comments = existingFile.comments || undefined;\n }\n\n const changes: SyncIssueResult['changes'] = {};\n if (needsUpdate) {\n changes.frontmatter = true;\n changes.content = true;\n }\n if (needsCommentsUpdate) {\n changes.comments = true;\n }\n\n if (options.dryRun) {\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Would ${action} issue ${issueId} (dry run)`,\n changes,\n };\n }\n\n await writeMarkdownFile(\n filePath,\n {\n frontmatter,\n content,\n comments,\n },\n config.comments\n );\n\n const action = existingIssueId ? 'updated' : 'created';\n return {\n success: true,\n issueId: issue.id,\n filename,\n filePath: relativePath,\n action,\n message: `Successfully ${action} issue ${issueId}`,\n changes,\n };\n } catch (error) {\n return {\n success: false,\n issueId,\n filename: '',\n filePath: '',\n action: 'skipped',\n message: `Failed to sync issue ${issueId}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport function extractIssueIdFromUrl(url: string): number | null {\n const match = url.match(/\\/issues\\/(\\d+)(?:\\/|$)/);\n if (match) {\n const issueId = parseInt(match[1], 10);\n return isNaN(issueId) ? null : issueId;\n }\n return null;\n}\n","import type { RedmineIssue, RedmineJournal } from './api.js';\nimport type { CommentsConfig } from './config.js';\n\nexport interface IssueFrontmatter {\n id: number;\n subject: string;\n status: string;\n priority: string;\n author: string;\n assigned_to?: string;\n created_on: string;\n updated_on: string;\n project: string;\n tracker: string;\n lastJournalId?: number;\n relations?: Array<{\n type: string;\n issue_id: number;\n delay?: number;\n }>;\n attachments?: Array<{\n id: number;\n filename: string;\n filesize: number;\n content_type: string;\n author: string;\n created_on: string;\n content_url?: string;\n }>;\n}\n\nexport function mapIssueToFrontmatter(issue: RedmineIssue): IssueFrontmatter {\n const frontmatter: IssueFrontmatter = {\n id: issue.id,\n subject: issue.subject,\n status: issue.status.name,\n priority: issue.priority.name,\n author: issue.author.name,\n created_on: issue.created_on,\n updated_on: issue.updated_on,\n project: issue.project.name,\n tracker: issue.tracker.name,\n };\n\n if (issue.assigned_to) {\n frontmatter.assigned_to = issue.assigned_to.name;\n }\n\n if (issue.relations && issue.relations.length > 0) {\n frontmatter.relations = issue.relations.map((relation) => ({\n type: relation.relation_type,\n issue_id: relation.issue_to_id,\n delay: relation.delay,\n }));\n }\n\n if (issue.attachments && issue.attachments.length > 0) {\n frontmatter.attachments = issue.attachments.map((attachment) => ({\n id: attachment.id,\n filename: attachment.filename,\n filesize: attachment.filesize,\n content_type: attachment.content_type,\n author: attachment.author.name,\n created_on: attachment.created_on,\n content_url: attachment.content_url,\n }));\n }\n\n if (issue.journals && issue.journals.length > 0) {\n const lastJournal = issue.journals.reduce((latest, journal) =>\n journal.id > latest.id ? journal : latest\n );\n frontmatter.lastJournalId = lastJournal.id;\n }\n\n return frontmatter;\n}\n\nexport function mapIssueToContent(issue: RedmineIssue): string {\n let content = '';\n\n if (issue.description) {\n content += issue.description;\n }\n\n return content;\n}\n\nexport function mapJournalsToComments(journals: RedmineJournal[], config: CommentsConfig): string {\n if (!journals || journals.length === 0) {\n return '';\n }\n\n let comments = '';\n\n const sortedJournals = [...journals].sort((a, b) => {\n if (config.trackBy === 'journalId') {\n return a.id - b.id;\n }\n return new Date(a.created_on).getTime() - new Date(b.created_on).getTime();\n });\n\n for (const journal of sortedJournals) {\n if (!journal.notes || journal.notes.trim() === '') {\n continue;\n }\n\n const date = new Date(journal.created_on).toISOString().split('T')[0];\n const time = new Date(journal.created_on).toTimeString().split(' ')[0].substring(0, 5);\n\n comments += `## ${journal.user.name} - ${date} ${time}\\n\\n`;\n comments += `${journal.notes}\\n\\n`;\n\n if (journal.details && journal.details.length > 0) {\n comments += '**Changes:**\\n';\n for (const detail of journal.details) {\n const oldValue = detail.old_value || '(none)';\n const newValue = detail.new_value || '(none)';\n comments += `- ${detail.name}: ${oldValue} → ${newValue}\\n`;\n }\n comments += '\\n';\n }\n\n comments += '---\\n\\n';\n }\n\n return comments.trim();\n}\n\nexport function extractNewJournals(\n allJournals: RedmineJournal[],\n lastJournalId: number | null\n): RedmineJournal[] {\n if (!lastJournalId) {\n return allJournals;\n }\n\n return allJournals.filter((journal) => journal.id > lastJournalId);\n}\n\nexport function shouldUpdateIssue(\n remoteIssue: RedmineIssue,\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localUpdatedOn = localFrontmatter.updated_on as string;\n const remoteUpdatedOn = remoteIssue.updated_on;\n\n if (!localUpdatedOn) {\n return true;\n }\n\n return new Date(remoteUpdatedOn) > new Date(localUpdatedOn);\n}\n\nexport function shouldUpdateComments(\n remoteJournals: RedmineJournal[],\n localFrontmatter: Record<string, unknown>\n): boolean {\n const localLastJournalId = localFrontmatter.lastJournalId as number;\n\n if (!localLastJournalId) {\n return remoteJournals.length > 0;\n }\n\n return remoteJournals.some((journal) => journal.id > localLastJournalId);\n}\n","import slugify from 'slugify';\nimport type { FilenameConfig } from './config.js';\n\nexport function generateSlug(\n title: string,\n config: FilenameConfig['slug'],\n existingSlugs: Set<string> = new Set()\n): string {\n let slug = slugify(title, {\n lower: config.lowercase,\n strict: true,\n remove: /[^\\w\\s-]/g,\n });\n\n slug = slug.substring(0, config.maxLength);\n\n if (!config.dedupe) {\n return slug;\n }\n\n let finalSlug = slug;\n let counter = 1;\n\n while (existingSlugs.has(finalSlug)) {\n const suffix = `-${counter}`;\n const maxLength = config.maxLength - suffix.length;\n finalSlug = `${slug.substring(0, maxLength)}${suffix}`;\n counter++;\n }\n\n existingSlugs.add(finalSlug);\n return finalSlug;\n}\n\nexport function generateFilename(\n issueId: number,\n title: string,\n config: FilenameConfig,\n existingSlugs: Set<string> = new Set()\n): string {\n const slug = generateSlug(title, config.slug, existingSlugs);\n\n return config.pattern.replace('{issueId}', issueId.toString()).replace('{slug}', slug);\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport matter from 'gray-matter';\nimport type { CommentsConfig } from './config.js';\n\nexport interface MarkdownData {\n frontmatter: Record<string, unknown>;\n content: string;\n comments?: string;\n}\n\nexport interface ParsedMarkdown {\n frontmatter: Record<string, unknown>;\n content: string;\n comments: string | null;\n rawContent: string;\n}\n\nexport async function ensureDir(filePath: string): Promise<void> {\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n}\n\nexport async function readMarkdownFile(filePath: string): Promise<ParsedMarkdown> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return parseMarkdownContent(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: '',\n };\n }\n throw error;\n }\n}\n\nexport function parseMarkdownContent(content: string): ParsedMarkdown {\n if (!content.trim()) {\n return {\n frontmatter: {},\n content: '',\n comments: null,\n rawContent: content,\n };\n }\n\n const { data: frontmatter, content: body } = matter(content);\n\n const comments = extractCommentsSection(body);\n const mainContent = removeCommentsSection(body);\n\n return {\n frontmatter,\n content: mainContent,\n comments,\n rawContent: content,\n };\n}\n\nexport function extractCommentsSection(content: string): string | null {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return null;\n }\n\n const startIndex = content.indexOf(startMatch[0]) + startMatch[0].length;\n const endIndex = content.indexOf(endMatch[0]);\n\n if (startIndex >= endIndex) {\n return null;\n }\n\n return content.substring(startIndex, endIndex).trim();\n}\n\nexport function removeCommentsSection(content: string): string {\n const startMatch = content.match(/<!-- redmine:comments:start -->/);\n const endMatch = content.match(/<!-- redmine:comments:end -->/);\n\n if (!startMatch || !endMatch) {\n return content;\n }\n\n const startIndex = content.indexOf(startMatch[0]);\n const endIndex = content.indexOf(endMatch[0]) + endMatch[0].length;\n\n return content.substring(0, startIndex) + content.substring(endIndex).trim();\n}\n\nexport function buildMarkdownContent(data: MarkdownData, config: CommentsConfig): string {\n let content = '';\n\n if (Object.keys(data.frontmatter).length > 0) {\n const frontmatterYaml = matter.stringify('', data.frontmatter).replace(/^---\\n|\\n---\\n?$/g, '');\n content += `---\\n${frontmatterYaml}---\\n\\n`;\n }\n\n content += data.content;\n\n if (data.comments) {\n content += `\\n\\n${config.anchors.start}\\n${data.comments}\\n${config.anchors.end}`;\n }\n\n return content;\n}\n\nexport async function writeMarkdownFile(\n filePath: string,\n data: MarkdownData,\n config: CommentsConfig\n): Promise<void> {\n await ensureDir(filePath);\n const content = buildMarkdownContent(data, config);\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport function extractIssueIdFromFrontmatter(frontmatter: Record<string, unknown>): number | null {\n const id = frontmatter.id as number | string | undefined;\n if (typeof id === 'number') {\n return id;\n }\n if (typeof id === 'string') {\n const parsed = parseInt(id, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n\nexport function extractLastJournalId(frontmatter: Record<string, unknown>): number | null {\n const lastJournalId = frontmatter.lastJournalId as number | string | undefined;\n if (typeof lastJournalId === 'number') {\n return lastJournalId;\n }\n if (typeof lastJournalId === 'string') {\n const parsed = parseInt(lastJournalId, 10);\n return isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n","import { Command } from 'commander';\nimport { RedmineConfigService } from '../../services/redmine-config.service.js';\nimport { syncProject } from '../../sync-project.js';\n\ninterface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n concurrency?: string;\n pageSize?: string;\n dryRun?: boolean;\n config?: string;\n outputDir?: string;\n json?: boolean;\n}\n\n/**\n * Create redmine sync project command\n */\nexport function createSyncProjectCommand(): Command {\n const cmd = new Command('project')\n .description('Sync all issues in a project')\n .option('-s, --status <status>', 'Filter by status (default: *)', '*')\n .option('--updated-since <date>', 'Only sync issues updated since YYYY-MM-DD')\n .option('--concurrency <number>', 'Number of concurrent requests')\n .option('--page-size <number>', 'Page size for API requests')\n .option('--dry-run', 'Preview without making changes')\n .option('-c, --config <path>', 'Config file path')\n .option('-o, --output-dir <path>', 'Output directory')\n .option('--json', 'Output as JSON')\n .action(async (options: SyncProjectOptions) => {\n await handleSyncProject(options);\n });\n\n return cmd;\n}\n\nasync function handleSyncProject(options: SyncProjectOptions): Promise<void> {\n const configService = new RedmineConfigService(options.config);\n const config = await configService.load();\n\n const syncOptions: Parameters<typeof syncProject>[1] = {\n status: options.status,\n updatedSince: options.updatedSince,\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n ...(options.concurrency && { concurrency: parseInt(options.concurrency, 10) }),\n ...(options.pageSize && { pageSize: parseInt(options.pageSize, 10) }),\n onProgress: options.json\n ? undefined\n : (current: number, total: number) => {\n process.stdout.write(`\\rProgress: ${current}/${total} issues`);\n },\n };\n\n const result = await syncProject(config, syncOptions);\n\n if (!options.json) {\n process.stdout.write('\\r'); // Clear progress line\n }\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n if (result.success) {\n console.log('✅ Sync completed successfully');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n if (result.failed > 0) {\n console.log(` Failed: ${result.failed}`);\n }\n } else {\n console.log('❌ Sync completed with errors');\n console.log(` Total issues: ${result.totalIssues}`);\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${result.created}`);\n console.log(` Updated: ${result.updated}`);\n console.log(` Skipped: ${result.skipped}`);\n console.log(` Failed: ${result.failed}`);\n\n if (result.errors.length > 0) {\n console.log('\\nErrors:');\n result.errors.forEach((error) => {\n console.log(` Issue ${error.issueId}: ${error.error}`);\n });\n }\n\n process.exit(5);\n }\n }\n}\n","import type { RedmineConfig } from './config.js';\nimport { RedmineApiClient } from './api.js';\nimport { syncIssue } from './sync-issue.js';\n\nexport interface SyncProjectOptions {\n status?: string;\n updatedSince?: string;\n dryRun?: boolean;\n outputDir?: string;\n concurrency?: number;\n pageSize?: number;\n onProgress?: (current: number, total: number) => void;\n}\n\nexport interface SyncProjectResult {\n success: boolean;\n totalIssues: number;\n processed: number;\n created: number;\n updated: number;\n skipped: number;\n failed: number;\n errors: Array<{\n issueId: number;\n error: string;\n }>;\n}\n\nexport async function syncProject(\n config: RedmineConfig,\n options: SyncProjectOptions = {}\n): Promise<SyncProjectResult> {\n const client = new RedmineApiClient(config);\n const pageSize = options.pageSize || config.defaults.pageSize;\n\n const result: SyncProjectResult = {\n success: true,\n totalIssues: 0,\n processed: 0,\n created: 0,\n updated: 0,\n skipped: 0,\n failed: 0,\n errors: [],\n };\n\n try {\n const issues = await client.getIssuesConcurrently(config.project.id, {\n status: options.status || config.defaults.status,\n pageSize,\n include: config.defaults.include,\n updatedSince: options.updatedSince,\n onProgress: options.onProgress,\n });\n\n result.totalIssues = issues.length;\n\n if (issues.length === 0) {\n return result;\n }\n\n const syncPromises = issues.map(async (issue) => {\n const syncResult = await syncIssue(issue.id, config, {\n dryRun: options.dryRun,\n outputDir: options.outputDir,\n });\n\n result.processed++;\n\n if (syncResult.success) {\n switch (syncResult.action) {\n case 'created':\n result.created++;\n break;\n case 'updated':\n result.updated++;\n break;\n case 'skipped':\n result.skipped++;\n break;\n }\n } else {\n result.failed++;\n result.errors.push({\n issueId: syncResult.issueId,\n error: syncResult.message,\n });\n }\n\n return syncResult;\n });\n\n await Promise.all(syncPromises);\n\n result.success = result.failed === 0;\n return result;\n } catch (error) {\n result.success = false;\n result.errors.push({\n issueId: 0,\n error: `Failed to fetch issues: ${error instanceof Error ? error.message : String(error)}`,\n });\n return result;\n }\n}\n","import { Command } from 'commander';\nimport { ConfigService } from '../../services/config.service.js';\nimport { ValidationError } from '../../errors/index.js';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport type { InfoOptions } from '../../types/framework.types.js';\n\n/**\n * Create info command for Jai1 Framework\n * Shows configuration and status information\n */\nexport function createInfoCommand(): Command {\n const cmd = new Command('info')\n .description('Show jai1-client configuration and status')\n .option('--json', 'Output as JSON')\n .option('--verbose', 'Show detailed information')\n .action(async (options: InfoOptions) => {\n await handleInfo(options);\n });\n\n return cmd;\n}\n\nasync function handleInfo(options: InfoOptions): Promise<void> {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n const frameworkPath = join(homedir(), '.jai1', 'framework');\n const projectStatus = await getProjectStatus();\n\n const info = {\n configPath: configService.getConfigPath(),\n apiUrl: config.apiUrl,\n accessKey: maskKey(config.accessKey),\n version: config.version || 'Not downloaded',\n lastUpdated: config.lastUpdated || 'Never',\n frameworkPath,\n projectStatus,\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log('Jai1 Client Info');\n console.log('────────────────\\n');\n console.log(`Config Location: ${info.configPath}`);\n console.log(`API URL: ${info.apiUrl}`);\n console.log(`Access Key: ${info.accessKey}`);\n console.log(`Framework Version: ${info.version}`);\n console.log(`Last Updated: ${info.lastUpdated}`);\n console.log(`Framework Location: ${info.frameworkPath}`);\n console.log();\n console.log('Project Status:');\n console.log(` .jai1/ exists: ${info.projectStatus.exists ? '✓' : '✗'}`);\n if (info.projectStatus.exists) {\n console.log(` Synced version: ${info.projectStatus.version || 'Unknown'}`);\n }\n}\n\nfunction maskKey(key: string): string {\n if (key.length <= 4) return '****';\n return '****' + key.slice(-4);\n}\n\nasync function getProjectStatus(): Promise<{ exists: boolean; version?: string }> {\n const projectJai1 = join(process.cwd(), '.jai1');\n try {\n await fs.access(projectJai1);\n // Try to read version from project\n return { exists: true, version: 'Synced' };\n } catch {\n return { exists: false };\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { ConfigService } from '../services/config.service.js';\nimport { ValidationError } from '../errors/index.js';\nimport { trackAction } from '../services/tracking.service.js';\nimport packageJson from '../../package.json' with { type: 'json' };\n\n// Colors for terminal output\nconst colors = {\n yellow: '\\x1b[33m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n red: '\\x1b[31m',\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Create self-update command\n */\nexport function createSelfUpdateCommand(): Command {\n return new Command('self-update')\n .description('Update jai1-client to the latest version')\n .option('--check', 'Only check for updates without installing')\n .option('--force', 'Force update without confirmation')\n .action(async (options: { check?: boolean; force?: boolean }) => {\n await handleSelfUpdate(options);\n });\n}\n\nasync function handleSelfUpdate(options: { check?: boolean; force?: boolean }) {\n const configService = new ConfigService();\n const config = await configService.load();\n\n if (!config) {\n throw new ValidationError('Not initialized. Run \"jai1 auth\" first.');\n }\n\n try {\n // Fetch latest version from API\n console.log(`${colors.cyan}🔍 Checking for updates...${colors.reset}`);\n\n const response = await fetch(`${config.apiUrl}/api/versions/client`, {\n headers: {\n 'JAI1-Access-Key': config.accessKey,\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n throw new Error(`Failed to check for updates: ${response.statusText}`);\n }\n\n const data = await response.json() as { version: string };\n const latestVersion = data.version;\n const currentVersion = packageJson.version;\n\n console.log(`\\n${colors.bold}Current version:${colors.reset} ${currentVersion}`);\n console.log(`${colors.bold}Latest version:${colors.reset} ${latestVersion}\\n`);\n\n if (!isNewerVersion(latestVersion, currentVersion)) {\n console.log(`${colors.green}✅ You're already on the latest version!${colors.reset}\\n`);\n return;\n }\n\n // Show update available\n console.log(`${colors.yellow}╭──────────────────────────────────────────────────────────╮${colors.reset}`);\n console.log(`${colors.yellow}│${colors.reset} ${colors.bold}⬆️ Update available!${colors.reset} ${currentVersion} → ${colors.cyan}${latestVersion}${colors.reset} ${colors.yellow}│${colors.reset}`);\n console.log(`${colors.yellow}╰──────────────────────────────────────────────────────────╯${colors.reset}\\n`);\n\n // If --check only, stop here\n if (options.check) {\n console.log(`${colors.cyan}Run \"jai1 self-update\" to install the latest version.${colors.reset}\\n`);\n return;\n }\n\n // Ask for confirmation unless --force\n if (!options.force) {\n const shouldUpdate = await confirm({\n message: 'Update to the latest version now?',\n default: true\n });\n\n if (!shouldUpdate) {\n console.log(`${colors.yellow}⏸️ Update cancelled.${colors.reset}\\n`);\n return;\n }\n }\n\n // Perform update\n console.log(`\\n${colors.cyan}📥 Installing latest version...${colors.reset}\\n`);\n\n try {\n // Detect package manager (npm, pnpm, yarn, bun)\n const packageManager = detectPackageManager();\n const installCommand = getInstallCommand(packageManager);\n\n console.log(`${colors.cyan}Using ${packageManager}...${colors.reset}`);\n\n // Execute installation\n execSync(installCommand, {\n stdio: 'inherit',\n env: { ...process.env, FORCE_COLOR: '1' }\n });\n\n console.log(`\\n${colors.green}✅ Successfully updated to version ${latestVersion}!${colors.reset}\\n`);\n\n // Track successful update\n trackAction('self_update', {\n from_version: currentVersion,\n to_version: latestVersion,\n package_manager: packageManager\n });\n\n } catch (error) {\n console.error(`\\n${colors.red}❌ Update failed!${colors.reset}`);\n console.error(`${colors.red}Error: ${error instanceof Error ? error.message : 'Unknown error'}${colors.reset}\\n`);\n console.error(`${colors.yellow}💡 You can try manually updating with:${colors.reset}`);\n console.error(` ${colors.cyan}npm install -g @jvittechs/jai1-cli@latest${colors.reset}\\n`);\n throw error;\n }\n\n } catch (error) {\n if (error instanceof Error && error.message.includes('Failed to check')) {\n throw new ValidationError('Cannot connect to update server. Please check your internet connection.');\n }\n throw error;\n }\n}\n\n/**\n * Compare versions to check if remote is newer than local\n */\nfunction isNewerVersion(remote: string, local: string): boolean {\n const remoteParts = remote.split('.').map(Number);\n const localParts = local.split('.').map(Number);\n\n for (let i = 0; i < 3; i++) {\n const r = remoteParts[i] || 0;\n const l = localParts[i] || 0;\n\n if (r > l) return true;\n if (r < l) return false;\n }\n\n return false;\n}\n\n/**\n * Detect which package manager is being used\n */\nfunction detectPackageManager(): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n // Check user agent for package manager\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n // Check which command is available\n try {\n execSync('pnpm --version', { stdio: 'ignore' });\n return 'pnpm';\n } catch {\n // pnpm not available\n }\n\n try {\n execSync('yarn --version', { stdio: 'ignore' });\n return 'yarn';\n } catch {\n // yarn not available\n }\n\n try {\n execSync('bun --version', { stdio: 'ignore' });\n return 'bun';\n } catch {\n // bun not available\n }\n\n // Default to npm\n return 'npm';\n}\n\n/**\n * Get install command for package manager\n */\nfunction getInstallCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun'): string {\n const packageName = '@jvittechs/jai1-cli@latest';\n\n switch (packageManager) {\n case 'pnpm':\n return `pnpm add -g ${packageName}`;\n case 'yarn':\n return `yarn global add ${packageName}`;\n case 'bun':\n return `bun add -g ${packageName}`;\n case 'npm':\n default:\n return `npm install -g ${packageName}`;\n }\n}\n","import { Command } from 'commander';\nimport { confirm } from '@inquirer/prompts';\nimport { ComponentsService } from '../services/components.service.js';\n\nexport function createClearBackupsCommand(): Command {\n return new Command('clear-backups')\n .description('Clear backup files')\n .option('-y, --yes', 'Skip confirmation')\n .action(async (options) => {\n const service = new ComponentsService();\n const backups = await service.listBackups(process.cwd());\n\n if (backups.length === 0) {\n console.log('No backups found.');\n return;\n }\n\n console.log(`Found ${backups.length} backup(s):`);\n if (backups.length <= 5) {\n backups.forEach(b => console.log(` - ${b}`));\n } else {\n backups.slice(0, 5).forEach(b => console.log(` - ${b}`));\n console.log(` ...and ${backups.length - 5} more`);\n }\n console.log();\n\n if (!options.yes) {\n const ok = await confirm({ message: 'Delete all backups?', default: false });\n if (!ok) return;\n }\n\n await service.clearBackups(process.cwd());\n console.log('✅ Backups cleared.');\n });\n}\n","import { Command } from 'commander';\nimport { checkbox, confirm, select } from '@inquirer/prompts';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\n\n// Performance Groups Definition\ninterface SettingsGroup {\n name: string;\n description: string;\n settings: Record<string, unknown>;\n}\n\nconst PERFORMANCE_GROUPS: Record<string, SettingsGroup> = {\n telemetry: {\n name: 'Telemetry',\n description: 'Tắt tất cả telemetry và thu thập dữ liệu',\n settings: {\n \"telemetry.telemetryLevel\": \"off\",\n \"telemetry.feedback.enabled\": false,\n \"workbench.enableExperiments\": false,\n \"workbench.settings.enableNaturalLanguageSearch\": false,\n }\n },\n languageServers: {\n name: 'Language Servers',\n description: 'Tắt/giảm tải các language servers (tsserver, eslint...)',\n settings: {\n // TypeScript\n \"typescript.tsserver.experimental.enableProjectDiagnostics\": false,\n \"typescript.disableAutomaticTypeAcquisition\": true,\n \"typescript.tsserver.maxTsServerMemory\": 2048,\n \"typescript.surveys.enabled\": false,\n // JavaScript\n \"js/ts.implicitProjectConfig.strictNullChecks\": false,\n // ESLint\n \"eslint.enable\": false,\n // Prettier\n \"prettier.enable\": false,\n // CSS/HTML\n \"css.validate\": false,\n \"html.validate.scripts\": false,\n \"html.validate.styles\": false,\n // JSON\n \"json.schemaDownload.enable\": false,\n }\n },\n git: {\n name: 'Git Integration',\n description: 'Tắt Git tích hợp để cải thiện hiệu suất',\n settings: {\n \"git.enabled\": false,\n \"git.autoRepositoryDetection\": false,\n \"git.decorations.enabled\": false,\n \"git.path\": null,\n \"scm.diffDecorations\": \"none\",\n }\n },\n fileWatcher: {\n name: 'File Watcher',\n description: 'Loại trừ các thư mục khỏi file watcher',\n settings: {\n \"files.watcherExclude\": {\n \"**/node_modules/**\": true,\n \"**/.git/**\": true,\n \"**/vendor/**\": true,\n \"**/dist/**\": true,\n \"**/build/**\": true,\n \"**/.next/**\": true,\n \"**/out/**\": true,\n \"**/.nuxt/**\": true,\n \"**/.cache/**\": true,\n \"**/coverage/**\": true,\n },\n \"files.exclude\": {\n \"**/.git\": true,\n \"**/.DS_Store\": true,\n \"**/node_modules\": false, // Keep visible but don't watch\n }\n }\n },\n search: {\n name: 'Search',\n description: 'Loại trừ các thư mục khỏi search',\n settings: {\n \"search.exclude\": {\n \"**/node_modules\": true,\n \"**/bower_components\": true,\n \"**/*.code-search\": true,\n \"**/dist\": true,\n \"**/build\": true,\n \"**/out\": true,\n \"**/.next\": true,\n \"**/.nuxt\": true,\n \"**/coverage\": true,\n \"**/.cache\": true,\n },\n \"search.followSymlinks\": false,\n }\n },\n extensions: {\n name: 'Extensions',\n description: 'Tắt auto-update extensions',\n settings: {\n \"extensions.autoUpdate\": false,\n \"extensions.autoCheckUpdates\": false,\n \"update.mode\": \"manual\",\n \"extensions.ignoreRecommendations\": true,\n }\n },\n editorRendering: {\n name: 'Editor Rendering',\n description: 'Tối ưu rendering (minimap, whitespace, highlights...)',\n settings: {\n \"editor.minimap.enabled\": false,\n \"editor.renderWhitespace\": \"none\",\n \"editor.renderControlCharacters\": false,\n \"editor.renderLineHighlight\": \"none\",\n \"editor.cursorBlinking\": \"solid\",\n \"editor.smoothScrolling\": false,\n \"editor.largeFileOptimizations\": true,\n \"editor.maxTokenizationLineLength\": 2000,\n \"editor.quickSuggestions\": {\n \"other\": true,\n \"comments\": false,\n \"strings\": false\n },\n \"editor.suggest.showStatusBar\": false,\n \"editor.hover.delay\": 500,\n \"editor.matchBrackets\": \"never\",\n }\n },\n uiElements: {\n name: 'UI Elements',\n description: 'Ẩn các UI elements không cần thiết',\n settings: {\n \"workbench.activityBar.visible\": false,\n \"workbench.statusBar.visible\": false,\n \"breadcrumbs.enabled\": false,\n \"window.menuBarVisibility\": \"compact\",\n \"workbench.editor.showTabs\": true, // Keep tabs for navigation\n \"workbench.startupEditor\": \"none\",\n }\n }\n};\n\nexport function createVSCodeCommand(): Command {\n const vscodeCommand = new Command('vscode')\n .description('Quản lý cài đặt VSCode cho dự án hiện tại');\n\n // Interactive mode (default)\n vscodeCommand.action(async () => {\n await interactiveMode();\n });\n\n // Enable subcommand\n vscodeCommand\n .command('enable')\n .description('Enable các nhóm tối ưu cụ thể')\n .argument('[groups...]', 'Tên các nhóm cần enable (telemetry, languageServers, git, ...)')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('enable');\n } else {\n await applyGroups(groups, 'enable');\n }\n });\n\n // Disable subcommand\n vscodeCommand\n .command('disable')\n .description('Disable các nhóm tối ưu cụ thể (restore về default)')\n .argument('[groups...]', 'Tên các nhóm cần disable')\n .action(async (groups: string[]) => {\n if (groups.length === 0) {\n await selectGroupsToApply('disable');\n } else {\n await applyGroups(groups, 'disable');\n }\n });\n\n // Max performance preset\n vscodeCommand\n .command('max-performance')\n .description('Enable tất cả các tối ưu để đạt hiệu suất tối đa')\n .action(async () => {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n });\n\n // Reset subcommand\n vscodeCommand\n .command('reset')\n .description('Reset về settings mặc định (xóa tất cả tối ưu)')\n .argument('[groups...]', 'Tên các nhóm cần reset (để trống = reset tất cả)')\n .action(async (groups: string[]) => {\n await resetSettings(groups);\n });\n\n // List subcommand\n vscodeCommand\n .command('list')\n .description('Liệt kê tất cả các nhóm tối ưu có sẵn')\n .action(() => {\n console.log('🔧 Các nhóm tối ưu có sẵn:\\n');\n Object.entries(PERFORMANCE_GROUPS).forEach(([key, group]) => {\n console.log(` ${key.padEnd(20)} - ${group.name}`);\n console.log(` ${' '.repeat(20)} ${group.description}`);\n console.log();\n });\n });\n\n return vscodeCommand;\n}\n\nasync function interactiveMode() {\n console.log('🔧 Quản lý cài đặt VSCode\\n');\n console.log('╭─────────────────────────────────────────────────────╮');\n console.log('│ 📌 Hướng dẫn sử dụng: │');\n console.log('│ • Dùng phím ↑↓ để di chuyển │');\n console.log('│ • Nhấn SPACE để chọn/bỏ chọn nhóm │');\n console.log('│ • Nhấn ENTER để xác nhận và áp dụng │');\n console.log('│ • Nhấn Ctrl+C để hủy │');\n console.log('╰─────────────────────────────────────────────────────╯\\n');\n\n const action = await select({\n message: 'Bạn muốn làm gì?',\n choices: [\n { name: '✅ Enable các nhóm tối ưu', value: 'enable' },\n { name: '❌ Disable các nhóm tối ưu', value: 'disable' },\n { name: '🚀 Max Performance (enable tất cả)', value: 'max' },\n { name: '🔄 Reset về mặc định', value: 'reset' },\n ],\n });\n\n if (action === 'max') {\n const allGroups = Object.keys(PERFORMANCE_GROUPS);\n await applyGroups(allGroups, 'enable');\n } else if (action === 'reset') {\n await resetSettings([]);\n } else {\n await selectGroupsToApply(action as 'enable' | 'disable');\n }\n}\n\nasync function selectGroupsToApply(action: 'enable' | 'disable') {\n const choices = Object.entries(PERFORMANCE_GROUPS).map(([key, group]) => ({\n name: `${group.name} - ${group.description}`,\n value: key,\n }));\n\n try {\n const selectedGroups = await checkbox({\n message: `Chọn các nhóm để ${action === 'enable' ? 'enable' : 'disable'} (SPACE để chọn, ENTER để xác nhận):`,\n choices,\n });\n\n if (selectedGroups.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn nhóm nào!');\n console.log(' 💡 Mẹo: Hãy nhấn SPACE để chọn ít nhất 1 nhóm trước khi nhấn ENTER.');\n return;\n }\n\n await applyGroups(selectedGroups, action);\n } catch {\n console.log('\\n❌ Đã hủy thao tác.');\n }\n}\n\nasync function applyGroups(groupKeys: string[], action: 'enable' | 'disable') {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n // Validate group keys\n const invalidGroups = groupKeys.filter(key => !PERFORMANCE_GROUPS[key]);\n if (invalidGroups.length > 0) {\n console.log(`\\n❌ Nhóm không hợp lệ: ${invalidGroups.join(', ')}`);\n console.log(' 💡 Chạy \"jai1 vscode list\" để xem danh sách nhóm có sẵn.');\n return;\n }\n\n // Ensure .vscode directory exists\n if (!existsSync(vscodeDir)) {\n await fs.mkdir(vscodeDir, { recursive: true });\n console.log('📁 Đã tạo thư mục .vscode/');\n }\n\n // Read existing settings\n let currentSettings: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf-8');\n currentSettings = JSON.parse(content);\n console.log('📄 Đã đọc cài đặt hiện tại từ settings.json');\n } catch {\n console.warn('⚠️ Không thể đọc settings.json (có thể chứa comments).');\n const confirmOverwrite = await confirm({\n message: 'Ghi đè file settings.json hiện tại?',\n default: false\n });\n\n if (!confirmOverwrite) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n currentSettings = {};\n }\n }\n\n // Apply or remove settings\n const newSettings = { ...currentSettings };\n\n console.log(`\\n📝 Đang ${action === 'enable' ? 'enable' : 'disable'} các nhóm:\\n`);\n\n for (const key of groupKeys) {\n const group = PERFORMANCE_GROUPS[key];\n console.log(` ${action === 'enable' ? '✓' : '✗'} ${group.name}`);\n\n if (action === 'enable') {\n // Merge settings\n for (const [settingKey, settingValue] of Object.entries(group.settings)) {\n if (typeof settingValue === 'object' && settingValue !== null && !Array.isArray(settingValue) &&\n typeof newSettings[settingKey] === 'object' && newSettings[settingKey] !== null) {\n newSettings[settingKey] = {\n ...(newSettings[settingKey] as Record<string, unknown>),\n ...settingValue\n };\n } else {\n newSettings[settingKey] = settingValue;\n }\n }\n } else {\n // Remove settings (disable)\n for (const settingKey of Object.keys(group.settings)) {\n delete newSettings[settingKey];\n }\n }\n }\n\n // Write back\n await fs.writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n console.log(`\\n✅ Đã cập nhật cài đặt VSCode tại: ${settingsPath}`);\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n\nasync function resetSettings(groupKeys: string[]) {\n const vscodeDir = path.join(process.cwd(), '.vscode');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n\n if (!existsSync(settingsPath)) {\n console.log('\\n⚠️ Không tìm thấy file settings.json');\n return;\n }\n\n const confirmReset = await confirm({\n message: groupKeys.length === 0\n ? 'Reset TẤT CẢ settings về mặc định (xóa toàn bộ file)?'\n : `Reset các nhóm: ${groupKeys.join(', ')}?`,\n default: false\n });\n\n if (!confirmReset) {\n console.log('❌ Đã hủy thao tác.');\n return;\n }\n\n if (groupKeys.length === 0) {\n // Reset all - delete file\n await fs.unlink(settingsPath);\n console.log('\\n✅ Đã xóa file settings.json');\n } else {\n // Reset specific groups\n await applyGroups(groupKeys, 'disable');\n }\n\n console.log('💡 Mẹo: Khởi động lại VSCode để áp dụng các thay đổi.');\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { GuideApp } from '../ui/guide/GuideApp.js';\n\n/**\n * Create guide command - Agentic Coding guide center\n */\nexport function createGuideCommand(): Command {\n const cmd = new Command('guide')\n .description('Interactive guide center for Agentic Coding')\n .option('--topic <topic>', 'Open specific topic (intro, rules, workflows, prompts, skills)')\n .action(async (options: { topic?: string }) => {\n const { waitUntilExit } = render(\n React.createElement(GuideApp, {\n initialTopic: options.topic,\n onExit: () => {\n process.exit(0);\n }\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { ContextApp } from '../ui/context/ContextApp.js';\nimport type { IDE, ContentType } from '../types/context.types.js';\nimport { ContextScannerService } from '../services/context-scanner.service.js';\n\n/**\n * Create context command - Visualize project context\n */\nexport function createContextCommand(): Command {\n const cmd = new Command('context')\n .description('Khám phá và quản lý context dự án cho các IDE')\n .option('--ide <ide>', 'Mở trực tiếp IDE cụ thể (cursor, windsurf, antigravity, jai1)')\n .option('--type <type>', 'Hiển thị loại context cụ thể (rules, workflows, skills, agents, prompts)')\n .option('--stats', 'Hiển thị thống kê context (non-interactive)')\n .action(async (options: { ide?: string; type?: string; stats?: boolean }) => {\n // Validate IDE option\n let initialIDE: IDE | undefined;\n if (options.ide) {\n const validIDEs = ['cursor', 'windsurf', 'antigravity', 'jai1'];\n if (!validIDEs.includes(options.ide)) {\n console.error(`❌ IDE không hợp lệ: ${options.ide}`);\n console.error(` IDE hợp lệ: ${validIDEs.join(', ')}`);\n process.exit(1);\n }\n initialIDE = options.ide as IDE;\n }\n\n // Validate type option\n let initialType: ContentType | undefined;\n if (options.type) {\n const validTypes = ['rules', 'workflows', 'skills', 'agents', 'prompts', 'context'];\n if (!validTypes.includes(options.type)) {\n console.error(`❌ Loại context không hợp lệ: ${options.type}`);\n console.error(` Loại hợp lệ: ${validTypes.join(', ')}`);\n process.exit(1);\n }\n initialType = options.type as ContentType;\n }\n\n // Stats mode - non-interactive\n if (options.stats) {\n await printStats();\n return;\n }\n\n // Interactive mode\n const { waitUntilExit } = render(\n React.createElement(ContextApp, {\n initialIDE,\n initialType,\n onExit: () => {\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n });\n\n return cmd;\n}\n\n/**\n * Print context statistics (non-interactive)\n */\nasync function printStats(): Promise<void> {\n const scanner = new ContextScannerService();\n\n console.log('🔍 Đang quét context...\\n');\n\n try {\n const context = await scanner.scanAll();\n\n if (context.ides.length === 0) {\n console.log('⚠️ Không tìm thấy context nào');\n console.log(' Hãy chạy `jai1 apply` để cài đặt context cho IDE của bạn.\\n');\n return;\n }\n\n console.log('📊 Thống kê Context\\n');\n console.log(`📁 Project: ${context.projectPath}`);\n console.log(`🕐 Scan time: ${context.scanTime.toLocaleString('vi-VN')}\\n`);\n\n for (const ideContext of context.ides) {\n console.log(`${ideContext.config.icon} ${ideContext.config.name}`);\n console.log(` Path: ${ideContext.config.basePath}`);\n console.log(` Items: ${ideContext.stats.totalItems}`);\n\n const types: string[] = [];\n if (ideContext.stats.byType.rules) types.push(`${ideContext.stats.byType.rules} rules`);\n if (ideContext.stats.byType.workflows) types.push(`${ideContext.stats.byType.workflows} workflows`);\n if (ideContext.stats.byType.skills) types.push(`${ideContext.stats.byType.skills} skills`);\n if (ideContext.stats.byType.agents) types.push(`${ideContext.stats.byType.agents} agents`);\n if (ideContext.stats.byType.prompts) types.push(`${ideContext.stats.byType.prompts} prompts`);\n if (ideContext.stats.byType.context) types.push(`${ideContext.stats.byType.context} context`);\n\n if (types.length > 0) {\n console.log(` Breakdown: ${types.join(', ')}`);\n }\n\n console.log('');\n }\n\n console.log(`✅ Tổng: ${context.totalItems} items\\n`);\n } catch (error) {\n console.error('❌ Lỗi khi quét context:', error);\n process.exit(1);\n }\n}\n","/**\n * migrate-ide command - Migrate .jai1 content to IDE directories\n */\nimport { Command } from 'commander';\nimport { checkbox, confirm } from '@inquirer/prompts';\nimport type { MigrateIDE, MigrateContentType } from '../types/migrate-ide.types.js';\nimport { MigrateIdeService } from '../services/migrate-ide.service.js';\nimport { IDE_MIGRATION_CONFIGS, getMigrationIDEs } from '../constants/ide-migration-configs.js';\n\n/**\n * Create migrate-ide command\n */\nexport function createMigrateIdeCommand(): Command {\n const cmd = new Command('migrate-ide')\n .description('Migrate .jai1 rules và workflows sang IDEs (Cursor, Windsurf, Claude Code, etc.)')\n .option('--ide <ides...>', 'Target IDEs (cursor, windsurf, antigravity, claudecode, opencode)')\n .option('--type <types...>', 'Content types (rules, workflows, commands)')\n .option('--dry-run', 'Preview changes without writing files')\n .action(async (options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n }) => {\n await runMigrateIde(options);\n });\n\n return cmd;\n}\n\nasync function runMigrateIde(options: {\n ide?: string[];\n type?: string[];\n dryRun?: boolean;\n}) {\n const service = new MigrateIdeService();\n\n console.log('\\n🔄 Migrate rules và workflows sang IDE(s)\\n');\n\n // Scan .jai1 content\n console.log('📁 Scanning .jai1/ directory...');\n const content = await service.scanJai1Content();\n\n if (content.totalCount === 0) {\n console.log('\\n⚠️ Không tìm thấy content trong .jai1/');\n console.log(' 💡 Hãy tạo files trong .jai1/rules/ hoặc .jai1/workflows/ trước.\\n');\n process.exit(1);\n }\n\n console.log(` Found: ${content.rules.length} rules, ${content.workflows.length} workflows\\n`);\n\n // Select IDEs\n let selectedIdes: MigrateIDE[];\n if (options.ide && options.ide.length > 0) {\n selectedIdes = options.ide as MigrateIDE[];\n } else {\n const ideChoices = getMigrationIDEs().map(ide => {\n const config = IDE_MIGRATION_CONFIGS[ide];\n return {\n name: `${config.icon} ${config.name}`,\n value: ide,\n };\n });\n\n selectedIdes = await checkbox({\n message: 'Chọn IDE(s) để migrate (SPACE để chọn, ENTER để xác nhận):',\n choices: ideChoices,\n });\n\n if (selectedIdes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn IDE nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 IDE.\\n');\n process.exit(0);\n }\n }\n\n // Select content types\n let selectedTypes: MigrateContentType[];\n if (options.type && options.type.length > 0) {\n selectedTypes = options.type as MigrateContentType[];\n } else {\n const typeChoices = [\n { name: `Rules (${content.rules.length} files)`, value: 'rules' as MigrateContentType },\n { name: `Workflows (${content.workflows.length} files)`, value: 'workflows' as MigrateContentType },\n { name: `Commands (${content.commands.length} files)`, value: 'commands' as MigrateContentType },\n ];\n\n selectedTypes = await checkbox({\n message: 'Chọn content types để migrate:',\n choices: typeChoices,\n });\n\n if (selectedTypes.length === 0) {\n console.log('\\n⚠️ Bạn chưa chọn content type nào!');\n console.log(' 💡 Hãy chọn ít nhất 1 content type.\\n');\n process.exit(0);\n }\n }\n\n // Calculate total files\n const totalItems = selectedTypes.reduce((sum, type) => {\n return sum + (type === 'rules' ? content.rules.length :\n type === 'workflows' ? content.workflows.length :\n content.commands.length);\n }, 0);\n const totalFiles = totalItems * selectedIdes.length;\n\n // Preview\n console.log('\\n📊 Preview:\\n');\n console.log(` IDEs: ${selectedIdes.map(ide => IDE_MIGRATION_CONFIGS[ide].name).join(', ')}`);\n console.log(` Content types: ${selectedTypes.join(', ')}`);\n console.log(` Will create/update: ${totalFiles} stub files\\n`);\n\n if (options.dryRun) {\n console.log('🔍 DRY RUN - No files will be written\\n');\n }\n\n // Confirm\n const confirmed = await confirm({\n message: 'Proceed with migration?',\n default: true,\n });\n\n if (!confirmed) {\n console.log('\\n❌ Migration cancelled.\\n');\n process.exit(0);\n }\n\n // Migrate\n console.log('\\n🔄 Migrating...\\n');\n let completed = 0;\n\n const results = await service.migrate(\n selectedIdes,\n selectedTypes,\n content,\n (result) => {\n completed++;\n const icon = result.status === 'created' ? '✓' :\n result.status === 'updated' ? '↻' :\n result.status === 'error' ? '✗' : '○';\n\n const percentage = Math.round((completed / totalFiles) * 100);\n console.log(` ${icon} [${percentage}%] ${result.targetPath}`);\n\n if (result.status === 'error' && result.error) {\n console.log(` Error: ${result.error}`);\n }\n }\n );\n\n // Summary\n const created = results.filter(r => r.status === 'created').length;\n const updated = results.filter(r => r.status === 'updated').length;\n const skipped = results.filter(r => r.status === 'skipped').length;\n const errors = results.filter(r => r.status === 'error').length;\n\n console.log('\\n✅ Migration complete!\\n');\n console.log(` Created: ${created}`);\n console.log(` Updated: ${updated}`);\n if (skipped > 0) console.log(` Skipped: ${skipped}`);\n if (errors > 0) console.log(` Errors: ${errors}`);\n console.log('');\n}\n"],"mappings":"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","names":["Command","homedir","homedir","resolve","Command","fs","join","homedir","join","homedir","fs","fs","join","homedir","Command","React","Command","React","Box","Text","React","Text","React","Text","React","Box","Text","Command","React","Command","Command","Command","Command","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","React","useState","Box","Text","useInput","React","useState","Box","Text","useInput","React","useState","Box","Text","useInput","fs","fs","useApp","useState","useEffect","useInput","React","Box","Text","Command","render","React","Command","confirm","fs","path","Command","checkbox","confirm","fs","path","matter","path","fs","matter","Command","checkbox","confirm","Command","React","render","Command","React","useState","useEffect","Box","Text","useInput","useApp","React","useState","Box","Text","useInput","React","React","Box","Text","React","React","React","React","React","React","React","React","React","React","useState","Box","Text","useInput","TextInput","Spinner","resolve","useApp","useState","useEffect","useInput","React","Box","Text","Command","render","React","Command","React","render","React","useState","useEffect","useMemo","useCallback","useRef","Box","Text","useInput","useApp","Spinner","useState","useState","useEffect","useCallback","React","memo","Box","Text","Spinner","React","Box","Text","React","memo","Box","Text","TextInput","memo","React","Box","Text","Spinner","React","useState","Box","Text","useInput","useApp","useRef","useState","useEffect","useMemo","useCallback","useInput","React","Box","Text","Spinner","render","React","Command","Command","maskKey","Command","Command","fs","path","Command","Command","confirm","colors","Command","isNewerVersion","confirm","packageManager","Command","confirm","select","join","Command","select","confirm","Command","z","z","fetch","pRetry","pLimit","path","Command","Command","resolve","readFile","matter","resolve","action","Command","Command","Command","Command","fs","join","homedir","Command","getProjectStatus","maskKey","Command","confirm","execSync","colors","Command","isNewerVersion","confirm","packageManager","detectPackageManager","getInstallCommand","execSync","Command","confirm","Command","confirm","Command","checkbox","confirm","select","fs","path","existsSync","PERFORMANCE_GROUPS","interactiveMode","selectGroupsToApply","applyGroups","resetSettings","React","render","Command","Command","render","React","React","render","Command","Command","printStats","render","React","Command","checkbox","confirm","Command","checkbox","confirm","Command"]}
|