@cannbot-ai/install-helper 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/ui/wizard.ts","../src/core/registry.ts","../src/core/detector.ts","../src/utils/paths.ts","../src/utils/i18n.ts","../src/core/manifest.ts","../src/utils/logger.ts","../src/utils/config.ts","../src/ui/theme.ts","../src/core/repository.ts","../src/core/scanner.ts","../src/core/skill-registry.ts","../src/core/installer.ts","../src/core/record.ts","../src/core/backup.ts","../src/ui/backup-prompts.ts","../src/core/skill-installer.ts","../src/ui/display.ts","../src/commands/list.ts","../src/commands/doctor.ts","../src/commands/status.ts","../src/commands/install.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/commands/info.ts","../src/commands/lang.ts","../src/index.ts"],"sourcesContent":["// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { installCommand } from \"./commands/install.js\";\nimport { uninstallCommand } from \"./commands/uninstall.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { langCommand } from \"./commands/lang.js\";\nimport { readConfig } from \"./utils/config.js\";\nimport { setLanguage } from \"./utils/i18n.js\";\n\nexport function createCLI(): Command {\n const config = readConfig();\n if (config.language) {\n setLanguage(config.language);\n }\n\n const program = new Command();\n\n program\n .name(\"install-helper\")\n .description(\"CANNBot Install Helper - Interactive installer for CANN operator development skills\")\n .version(\"1.0.3\");\n\n program\n .command(\"init\", { isDefault: false })\n .description(\"Run interactive installation wizard\")\n .action(async () => {\n await initCommand();\n });\n\n program\n .command(\"list\")\n .description(\"List available plugins\")\n .action(async () => {\n await listCommand();\n });\n\n program\n .command(\"doctor\")\n .description(\"Run health check\")\n .option(\"--fix\", \"Auto-fix detected issues\")\n .action(async (options: { fix?: boolean }) => {\n await doctorCommand(options);\n });\n\n program\n .command(\"status\")\n .description(\"Show installed plugins\")\n .action(async () => {\n await statusCommand();\n });\n\n program\n .command(\"install [names...]\")\n .description(\"Install plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--list\", \"List all available skills by category\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; list?: boolean }) => {\n await installCommand(names, options);\n });\n\n program\n .command(\"uninstall <names...>\")\n .description(\"Uninstall plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (names: string[], options: { tool?: string; level?: string }) => {\n await uninstallCommand(names, options);\n });\n\n program\n .command(\"update [plugins...]\")\n .description(\"Update installed plugins (git pull + reinstall)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (plugins: string[], options: { tool?: string; level?: string }) => {\n await updateCommand(plugins, options);\n });\n\n program\n .command(\"info <plugin>\")\n .description(\"Show plugin details\")\n .action(async (plugin: string) => {\n await infoCommand(plugin);\n });\n\n program\n .command(\"lang [action] [value]\")\n .description(\"Manage language settings (show/set)\")\n .action(async (action?: string, value?: string) => {\n await langCommand(action, value);\n });\n\n program.action(async () => {\n await initCommand();\n });\n\n return program;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { runWizard, selectToolWithDetection, stepLevel } from \"../ui/wizard.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { installSkills, interactiveSkillSelect } from \"../core/skill-installer.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner, printBanner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { selectTheme } from \"../ui/theme.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n if (\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\"));\n return pkg.name === \"@cannbot-ai/install-helper\";\n } catch { return false; }\n })()\n ) {\n logger.warn(t(\"init_pkg_dir_warn\"));\n logger.info(t(\"init_pkg_dir_hint\"));\n logger.info(t(\"init_pkg_dir_example\"));\n return;\n }\n\n printBanner(t(\"wizard_title\"));\n\n const spinner = createSpinner(t(\"loading_skills_list\"));\n spinner.start();\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n spinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n spinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n let step = 0;\n let mode: \"plugin\" | \"skill\" = \"plugin\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectMode();\n if (result === null) return;\n mode = result;\n step = 1;\n break;\n }\n case 1: {\n if (mode === \"plugin\") {\n const result = await pluginInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n } else {\n const result = await skillInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n }\n }\n }\n }\n}\n\nasync function selectMode(): Promise<\"plugin\" | \"skill\" | null> {\n printBoxTitle(t(\"wizard_select_mode_title\"));\n\n const CANCEL = \"__cancel__\";\n const choices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `> ${t(\"wizard_mode_plugin\")} — ${t(\"wizard_mode_plugin_desc\")}`,\n value: \"plugin\",\n },\n {\n name: `> ${t(\"wizard_mode_skill\")} — ${t(\"wizard_mode_skill_desc\")}`,\n value: \"skill\",\n },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_mode\"),\n choices,\n loop: false,\n theme: selectTheme,\n });\n if (result === CANCEL) return null;\n return result as \"plugin\" | \"skill\";\n}\n\nasync function pluginInstallFlow(): Promise<\"done\" | \"back\"> {\n const answers = await runWizard();\n\n if (!answers.confirmed) {\n if (answers.back) return \"back\";\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = answers.plugins.map((id) =>\n allPlugins.find((p) => p.id === id)\n );\n\n const total = answers.plugins.length;\n const results = [];\n\n for (let i = 0; i < answers.plugins.length; i++) {\n const pluginId = answers.plugins[i];\n const plugin = selectedPlugins[i];\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"install_progress\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool: answers.tool,\n level: answers.level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => ({\n pluginId: result.pluginId,\n displayName: selectedPlugins[index]?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n }));\n\n printInstallSummary(summary);\n\n const configRoot = getConfigRoot(answers.tool, answers.level);\n printEnhancedSummary(summary, answers.tool, configRoot);\n return \"done\";\n}\n\nasync function skillInstallFlow(): Promise<\"done\" | \"back\"> {\n let step = 0;\n let tool: AITool = \"opencode\";\n let level: InstallLevel = \"project\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectToolWithDetection();\n if (result === \"back\") return \"back\";\n if (result === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n tool = result;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel();\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n level = result;\n step = 2;\n break;\n }\n case 2: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") { step = 1; break; }\n if (selectedSkills === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(selectedSkills.length)))}...`);\n\n const results = await installSkills(selectedSkills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) {\n logger.success(`${progress} ${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${progress} ${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n return \"done\";\n }\n }\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel, WizardAnswers } from \"../types/index.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { detectTools, getToolDisplayName } from \"../core/detector.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { selectTheme, checkboxTheme } from \"./theme.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function selectToolWithDetection(): Promise<AITool | \"back\" | \"cancel\"> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) return \"back\";\n if (result === CANCEL) return \"cancel\";\n return result as AITool;\n}\n\nexport async function runWizard(): Promise<WizardAnswers> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n let selectedTool: AITool | undefined;\n let level: InstallLevel = \"project\";\n let plugins: string[] = [];\n\n let step = 0;\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false, back: true };\n }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false };\n }\n selectedTool = result as AITool;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel(config.lastLevel);\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level: \"project\", plugins: [], confirmed: false };\n }\n level = result as InstallLevel;\n step = 2;\n break;\n }\n case 2: {\n const result = await stepPlugins(selectedTool!, level);\n if (result === BACK) { step = 1; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n plugins = result as string[];\n step = 3;\n break;\n }\n case 3: {\n const result = await stepConfirm(selectedTool!, level, plugins);\n if (result === BACK) { step = 2; break; }\n if (result === CANCEL || result === false) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n updateConfig({ lastTool: selectedTool, lastLevel: level });\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins, confirmed: true };\n }\n }\n }\n}\n\nasync function stepTool(detectedTools: Awaited<ReturnType<typeof detectTools>>, lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_1_title\"));\n\n if (detectedTools.length === 0) {\n logger.error(t(\"error_tool_not_found\"));\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n }\n\n if (detectedTools.length === 1) {\n const tool = detectedTools[0];\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n logger.success(\n `${t(\"wizard_detected_tool\")}: ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`\n );\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> ${t(\"wizard_confirm_tool\")} ${getToolDisplayName(tool.name)}`, value: tool.name },\n { name: `> ${t(\"wizard_select_tool\")}`, value: \"manual\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n if (result === \"manual\") {\n return stepToolManual(lastTool);\n }\n return tool.name as AITool;\n }\n\n const choices: Array<{ name: string; value: string } | Separator> = detectedTools.map((tool) => {\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n return {\n name: `> ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`,\n value: tool.name,\n };\n });\n choices.push(new Separator(\"──────────────\"));\n choices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK });\n choices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL });\n\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nasync function stepToolManual(lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nexport async function stepLevel(lastLevel?: InstallLevel): Promise<InstallLevel | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_2_title\"));\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> project — ${t(\"install_level_project\")}`, value: \"project\" },\n { name: `> global — ${t(\"install_level_global\")}`, value: \"global\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_level\"),\n choices,\n default: lastLevel || \"project\",\n loop: false,\n theme: selectTheme,\n });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as InstallLevel;\n}\n\nasync function stepPlugins(tool: AITool, level: InstallLevel): Promise<string[] | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_3_title\"));\n\n const plugins = getAllPlugins();\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n\n const choices: Array<{ name: string; value: string; checked: boolean } | Separator> = plugins.map((p) => {\n const isInstalled = installedSet.has(p.id);\n const suffix = isInstalled ? ` [${t(\"wizard_already_installed\")}]` : \"\";\n return {\n name: `${p.displayName}${suffix} — ${p.description}`,\n value: p.id,\n checked: false,\n };\n });\n showOperationHints(true);\n const selected = await checkbox({\n message: t(\"wizard_select_plugins\"),\n choices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n const pluginIds = selected;\n\n // 如果什么都没勾选,显示操作菜单\n if (pluginIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") return BACK;\n return CANCEL;\n }\n\n return pluginIds;\n}\n\nasync function stepConfirm(\n tool: AITool,\n level: InstallLevel,\n plugins: string[]\n): Promise<true | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_4_title\"));\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = plugins.map((id) => allPlugins.find((p) => p.id === id));\n\n const displayPath = getConfigRoot(tool, level);\n const toolName = getToolDisplayName(tool);\n const levelText = level === \"project\" ? \"project\" : \"global\";\n logger.info(t(\"wizard_confirm_install_format\").replace(\"{count}\", chalk.bold(String(plugins.length))).replace(\"{tool}\", chalk.green(toolName)).replace(\"{level}\", chalk.cyan(levelText)));\n logger.info(`${t(\"wizard_install_path\")}: ${chalk.cyan(displayPath)}`);\n for (const plugin of selectedPlugins) {\n if (plugin) {\n logger.step(` • ${chalk.bold(plugin.displayName)}`);\n }\n }\n logger.blank();\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: \"> \" + t(\"wizard_confirm\"), value: \"confirm\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_confirm\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return true;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { readdirSync, readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { PluginEntry } from \"../types/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction loadPluginsFromYaml(): PluginEntry[] {\n const pluginsDir = join(__dirname, \"plugins.d\");\n const defaultsPath = join(pluginsDir, \"_defaults.yml\");\n\n let defaults: Record<string, unknown> = {};\n try {\n defaults = parseYaml(readFileSync(defaultsPath, \"utf-8\")) || {};\n } catch {\n }\n\n const plugins: PluginEntry[] = [];\n try {\n for (const file of readdirSync(pluginsDir)) {\n if (file.startsWith(\"_\") || !file.endsWith(\".yml\")) continue;\n try {\n const content = parseYaml(readFileSync(join(pluginsDir, file), \"utf-8\"));\n if (!content || !content.id) continue;\n plugins.push({\n id: content.id,\n dir: content.dir,\n displayName: content.displayName || content.id,\n script: content.script || defaults.script || \"init.sh\",\n aliases: content.aliases || [],\n skills: content.skills ?? defaults.skills ?? 0,\n agents: content.agents ?? defaults.agents ?? 0,\n description: content.description || \"\",\n });\n } catch {\n }\n }\n } catch {\n }\n return plugins;\n}\n\nexport const PLUGIN_REGISTRY: PluginEntry[] = loadPluginsFromYaml();\n\nexport function findPlugin(query: string): PluginEntry | undefined {\n const normalized = query.toLowerCase().trim();\n\n const exactMatch = PLUGIN_REGISTRY.find(\n (p) => p.id === normalized || p.id === query.trim()\n );\n if (exactMatch) return exactMatch;\n\n const aliasMatch = PLUGIN_REGISTRY.find((p) =>\n p.aliases.some((a) => a === normalized)\n );\n if (aliasMatch) return aliasMatch;\n\n const prefixMatch = PLUGIN_REGISTRY.find((p) => p.id.startsWith(normalized));\n if (prefixMatch) return prefixMatch;\n\n return undefined;\n}\n\nexport function getAllPlugins(): PluginEntry[] {\n return PLUGIN_REGISTRY;\n}\n\nexport function getPluginById(id: string): PluginEntry | undefined {\n return PLUGIN_REGISTRY.find((p) => p.id === id);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport type { AITool, DetectedTool } from \"../types/index.js\";\nimport { detectTraeVariant } from \"../utils/paths.js\";\n\nasync function getCommandVersion(\n cmd: string,\n args: string[] = [\"--version\"]\n): Promise<string | undefined> {\n try {\n const result = await execa(cmd, args, { timeout: 5000 });\n const output = result.stdout.trim();\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match ? match[1] : output.split(\"\\n\")[0];\n } catch {\n return undefined;\n }\n}\n\nasync function getCommandPath(cmd: string): Promise<string | undefined> {\n try {\n const result = await execa(\"which\", [cmd], { timeout: 5000 });\n return result.stdout.trim();\n } catch {\n return undefined;\n }\n}\n\nasync function detectOpenCode(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"opencode\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"opencode\");\n return { name: \"opencode\", version, path };\n}\n\nasync function detectClaude(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"claude\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"claude\");\n return { name: \"claude\", version, path };\n}\n\nasync function detectTrae(): Promise<DetectedTool | undefined> {\n const home = homedir();\n const variant = detectTraeVariant();\n\n let path: string | undefined;\n if (variant === \"ide\" && existsSync(join(home, \".trae-cn\"))) {\n path = join(home, \".trae-cn\");\n } else if (variant === \"plugin\" && existsSync(join(home, \".marscode\"))) {\n path = join(home, \".marscode\");\n } else if (variant === \"cli\" && existsSync(join(home, \".traecli\"))) {\n path = join(home, \".traecli\");\n } else if (variant === \"unknown\") {\n const cmdPath = await getCommandPath(\"trae\");\n if (cmdPath) path = cmdPath;\n }\n\n if (!path) return undefined;\n return { name: \"trae\", version: variant, path };\n}\n\nasync function detectCursor(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"cursor\");\n if (path) {\n const version = await getCommandVersion(\"cursor\");\n return { name: \"cursor\", version, path };\n }\n\n if (process.platform === \"darwin\") {\n const appPath = \"/Applications/Cursor.app\";\n if (existsSync(appPath)) {\n return { name: \"cursor\", path: appPath };\n }\n }\n\n return undefined;\n}\n\nasync function detectCopilot(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"gh\");\n if (!path) return undefined;\n\n try {\n await execa(\"gh\", [\"extension\", \"list\"], { timeout: 5000 });\n return { name: \"copilot\", path };\n } catch {\n return undefined;\n }\n}\n\nexport async function detectTools(): Promise<DetectedTool[]> {\n const detectors = [\n detectOpenCode,\n detectClaude,\n detectTrae,\n detectCursor,\n detectCopilot,\n ];\n\n const results = await Promise.allSettled(detectors.map((d) => d()));\n const tools: DetectedTool[] = [];\n\n for (const result of results) {\n if (result.status === \"fulfilled\" && result.value) {\n tools.push(result.value);\n }\n }\n\n return tools;\n}\n\nexport async function detectSingleTool(): Promise<DetectedTool | undefined> {\n const tools = await detectTools();\n return tools[0];\n}\n\nexport function getToolDisplayName(tool: AITool): string {\n const names: Record<AITool, string> = {\n opencode: \"OpenCode\",\n claude: \"Claude Code\",\n trae: \"Trae\",\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n };\n return names[tool];\n}\n\nexport function getAllTools(): AITool[] {\n return [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport type { AITool, InstallLevel, TraeVariant } from \"../types/index.js\";\nimport { t } from \"./i18n.js\";\n\nconst VALID_TOOLS: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\nconst VALID_LEVELS: InstallLevel[] = [\"project\", \"global\"];\n\nexport function validateTool(tool: string): AITool {\n if (!VALID_TOOLS.includes(tool as AITool)) {\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n return tool as AITool;\n}\n\nexport function validateLevel(level: string): InstallLevel {\n if (!VALID_LEVELS.includes(level as InstallLevel)) {\n throw new Error(\n t(\"error_invalid_level\")\n .replace(\"{level}\", level)\n .replace(\"{levels}\", VALID_LEVELS.join(\", \"))\n );\n }\n return level as InstallLevel;\n}\n\nexport function detectTraeVariant(): TraeVariant {\n const home = homedir();\n if (existsSync(join(home, \".trae-cn\"))) return \"ide\";\n if (existsSync(join(home, \".marscode\"))) return \"plugin\";\n if (existsSync(join(home, \".traecli\"))) return \"cli\";\n return \"unknown\";\n}\n\nexport function getConfigRoot(\n tool: AITool,\n level: InstallLevel,\n base?: string\n): string {\n const home = homedir();\n\n if (level === \"global\") {\n switch (tool) {\n case \"opencode\":\n return join(home, \".config\", \"opencode\");\n case \"claude\":\n return join(home, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(home, \".marscode\");\n case \"cli\":\n return join(home, \".traecli\");\n default:\n return join(home, \".trae-cn\");\n }\n }\n case \"cursor\":\n return join(home, \".cursor\");\n case \"copilot\":\n return join(home, \".copilot\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n }\n\n const baseDir = base || process.cwd();\n switch (tool) {\n case \"opencode\":\n return join(baseDir, \".opencode\");\n case \"claude\":\n return join(baseDir, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(baseDir, \".marscode\");\n case \"cli\":\n return join(baseDir, \".traecli\");\n default:\n return join(baseDir, \".trae\");\n }\n }\n case \"cursor\":\n return join(baseDir, \".cursor\");\n case \"copilot\":\n return join(baseDir, \".github\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n}\n\nexport function getConfigFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function getSkillsDir(configRoot: string): string {\n return join(configRoot, \"skills\");\n}\n\nexport function getAgentsDir(configRoot: string): string {\n return join(configRoot, \"agents\");\n}\n\nexport function getManifestPath(configRoot: string): string {\n return join(configRoot, \"cannbot-manifest.json\");\n}\n\nexport function getCannbotConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getCannbotRepoPath(): string {\n return join(getCannbotConfigDir(), \"repo\");\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ntype Messages = Record<string, string>;\n\nfunction loadLocale(locale: string): Messages {\n const localePath = join(__dirname, \"locales\", `${locale}.json`);\n try {\n const content = readFileSync(localePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n // Fallback to zh_CN if locale file not found\n const fallbackPath = join(__dirname, \"locales\", \"zh_CN.json\");\n try {\n const content = readFileSync(fallbackPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n}\n\nlet currentLang: \"zh_CN\" | \"en_US\" = \"zh_CN\";\nlet messages: Messages = loadLocale(\"zh_CN\");\n\nexport function setLanguage(lang: \"zh_CN\" | \"en_US\"): void {\n currentLang = lang;\n messages = loadLocale(lang);\n}\n\nexport function getLanguage(): \"zh_CN\" | \"en_US\" {\n return currentLang;\n}\n\nexport function t(key: string): string {\n return messages[key] !== undefined ? messages[key] : key;\n}\n\nexport const i18n = {\n setLanguage,\n getLanguage,\n t,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type {\n CannbotManifest,\n InstalledPlugin,\n AITool,\n InstallLevel,\n} from \"../types/index.js\";\nimport { getConfigRoot, getManifestPath } from \"../utils/paths.js\";\nimport { getAllPlugins } from \"./registry.js\";\n\nexport function readManifest(configRoot: string): CannbotManifest | null {\n const manifestPath = getManifestPath(configRoot);\n if (existsSync(manifestPath)) {\n try {\n const content = readFileSync(manifestPath, \"utf-8\");\n return JSON.parse(content) as CannbotManifest;\n } catch {\n // fall through\n }\n }\n return null;\n}\n\nexport function readAllManifests(configRoot: string): CannbotManifest[] {\n const manifests: CannbotManifest[] = [];\n const plugins = getAllPlugins();\n\n const standardPath = getManifestPath(configRoot);\n if (existsSync(standardPath)) {\n try {\n const content = readFileSync(standardPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n\n for (const plugin of plugins) {\n const pluginManifestPath = join(configRoot, `${plugin.id}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n try {\n const content = readFileSync(pluginManifestPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n }\n\n return manifests;\n}\n\nexport function scanInstalled(): InstalledPlugin[] {\n const plugins = getAllPlugins();\n const installed: InstalledPlugin[] = [];\n const tools: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n const levels: InstallLevel[] = [\"project\", \"global\"];\n\n for (const tool of tools) {\n for (const level of levels) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n\n for (const manifest of manifests) {\n const plugin = plugins.find((p) => p.id === manifest.team);\n if (!plugin) continue;\n\n // 验证实际文件是否存在\n if (!verifyPluginFilesExist(configRoot, manifest, tool, level)) {\n continue;\n }\n\n const alreadyAdded = installed.some(\n (p) => p.id === plugin.id && p.tool === tool && p.level === level\n );\n if (alreadyAdded) continue;\n\n installed.push({\n id: plugin.id,\n displayName: plugin.displayName,\n tool,\n level,\n skillsCount: manifest.installed_skills?.length || 0,\n agentsCount: manifest.installed_agents?.length || 0,\n installTime: manifest.install_time,\n configRoot,\n });\n }\n }\n }\n\n return installed;\n}\n\nfunction verifyPluginFilesExist(configRoot: string, manifest: CannbotManifest, tool: AITool, level: InstallLevel): boolean {\n const skillsDir = join(configRoot, \"skills\");\n const agentsDir = join(configRoot, \"agents\");\n \n // 验证 skills\n if (manifest.installed_skills && manifest.installed_skills.length > 0) {\n const hasAnySkill = manifest.installed_skills.some((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath);\n });\n if (!hasAnySkill) return false;\n }\n \n // 验证 agents\n if (manifest.installed_agents && manifest.installed_agents.length > 0) {\n const hasAnyAgent = manifest.installed_agents.some((agentId) => {\n const agentPath = join(agentsDir, agentId);\n return existsSync(agentPath);\n });\n if (!hasAnyAgent) return false;\n }\n \n // 验证 AGENTS.md\n // For opencode project level, AGENTS.md is in project root, not in configRoot\n let agentsMdPath: string;\n if (tool === \"opencode\" && level === \"project\") {\n // For opencode project level, AGENTS.md is in project root\n agentsMdPath = join(configRoot, \"..\", \"AGENTS.md\");\n } else {\n agentsMdPath = join(configRoot, \"AGENTS.md\");\n }\n if (!existsSync(agentsMdPath)) return false;\n \n return true;\n}\n\nexport function isPluginInstalled(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): boolean {\n const installed = scanInstalled();\n return installed.some(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n\nexport function getInstalledPlugin(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): InstalledPlugin | undefined {\n const installed = scanInstalled();\n return installed.find(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport { t } from \"./i18n.js\";\n\nexport const logger = {\n success: (msg: string) => console.log(chalk.green(\"✓\") + \" \" + msg),\n error: (msg: string) => console.log(chalk.red(\"✗\") + \" \" + msg),\n warn: (msg: string) => console.log(chalk.yellow(\"⚠\") + \" \" + msg),\n info: (msg: string) => console.log(chalk.cyan(\"→\") + \" \" + msg),\n step: (msg: string) => console.log(chalk.dim(msg)),\n blank: () => console.log(),\n};\n\nexport function createSpinner(text: string): Ora {\n return ora({ text, color: \"cyan\" });\n}\n\nexport function printBanner(subtitle?: string): void {\n console.log(chalk.cyan(`\n ____ _ _ _ _ _ ____ _\n / ___| / \\\\ | \\\\ | | \\\\ | | __ ) ___ | |_\n | | / _ \\\\ | \\\\| | \\\\| | _ \\\\ / _ \\\\| __|\n | |___ / ___ \\\\| |\\\\ | |\\\\ | |_) | (_) | |_\n \\\\____/_/ \\\\_\\\\_| \\\\_|_| \\\\_|____/ \\\\___/ \\\\__|\n`));\n if (subtitle) {\n console.log(chalk.bold(` ${subtitle}`));\n console.log();\n }\n}\n\nfunction getDisplayWidth(str: string): number {\n let width = 0;\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n if (\n (code >= 0x2E80 && code <= 0x9FFF) ||\n (code >= 0xF900 && code <= 0xFAFF) ||\n (code >= 0xFE30 && code <= 0xFE4F) ||\n (code >= 0xFF00 && code <= 0xFFEF) ||\n (code >= 0x3400 && code <= 0x4DBF) ||\n (code >= 0x20000 && code <= 0x2A6DF) ||\n (code >= 0x2A700 && code <= 0x2B73F) ||\n (code >= 0x2B740 && code <= 0x2B81F) ||\n (code >= 0x2B820 && code <= 0x2CEAF)\n ) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nexport function printBoxTitle(title: string, width: number = 65): void {\n const border = \"═\".repeat(width);\n const displayWidth = getDisplayWidth(title);\n const totalPadding = width - displayWidth;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n const paddedTitle = \" \".repeat(Math.max(0, leftPadding)) + title + \" \".repeat(Math.max(0, rightPadding));\n console.log();\n console.log(chalk.cyan.bold(` ╔${border}╗`));\n console.log(chalk.cyan.bold(` ║`) + chalk.cyan.bold(paddedTitle) + chalk.cyan.bold(`║`));\n console.log(chalk.cyan.bold(` ╚${border}╝`));\n console.log();\n}\n\nexport function showOperationHints(isCheckbox: boolean = false): void {\n if (isCheckbox) {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m ${t(\"hint_select_move\")} | \\x1b[36m${t(\"hint_select_space\")}\\x1b[0m ${t(\"hint_select_check\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}(${t(\"hint_checkbox_suffix\")})\\n`);\n } else {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m ${t(\"hint_select_move\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}\\n`);\n }\n}\n\nexport function printBox(content: string[]): void {\n const maxLen = Math.max(...content.map((line) => line.length));\n const border = \"─\".repeat(maxLen + 2);\n console.log(chalk.cyan(` ┌${border}┐`));\n for (const line of content) {\n console.log(chalk.cyan(\" │ \") + line.padEnd(maxLen) + chalk.cyan(\" │\"));\n }\n console.log(chalk.cyan(` └${border}┘`));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { parse, stringify } from \"yaml\";\nimport type { AppConfig } from \"../types/index.js\";\n\nexport function getConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.yaml\");\n}\n\nexport function readConfig(): AppConfig {\n const configPath = getConfigPath();\n if (!existsSync(configPath)) {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const parsed = parse(content) as Partial<AppConfig>;\n return {\n language: parsed.language || \"zh_CN\",\n lastTool: parsed.lastTool,\n lastLevel: parsed.lastLevel,\n repoPath: parsed.repoPath,\n installedPlugins: parsed.installedPlugins || [],\n };\n } catch {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n}\n\nexport function writeConfig(config: AppConfig): void {\n const configDir = getConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const configPath = getConfigPath();\n const content = stringify(config);\n writeFileSync(configPath, content, \"utf-8\");\n}\n\nexport function updateConfig(updates: Partial<AppConfig>): AppConfig {\n const config = readConfig();\n const updated = { ...config, ...updates };\n writeConfig(updated);\n return updated;\n}\n\nexport function addInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n if (!config.installedPlugins.includes(pluginId)) {\n config.installedPlugins.push(pluginId);\n writeConfig(config);\n }\n}\n\nexport function removeInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n config.installedPlugins = config.installedPlugins.filter(\n (id) => id !== pluginId\n );\n writeConfig(config);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nexport const selectTheme = {\n helpMode: \"never\" as const,\n};\n\nexport const checkboxTheme = {\n icon: {\n checked: \"\\x1b[32m☑\\x1b[22m\",\n unchecked: \"☐\",\n cursor: \"❯\",\n },\n helpMode: \"never\" as const,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa } from \"execa\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir, getCannbotRepoPath } from \"../utils/paths.js\";\nimport {\n scanSkills,\n getCurrentCommit,\n readScanCache,\n writeScanCache,\n} from \"./scanner.js\";\nimport { initFromScan } from \"./skill-registry.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction loadRepoUrl(): string {\n if (process.env.CANNBOT_REPO_URL) {\n return process.env.CANNBOT_REPO_URL;\n }\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n return config.repository?.url || \"https://gitcode.com/cann/cannbot-skills.git\";\n } catch {\n return \"https://gitcode.com/cann/cannbot-skills.git\";\n }\n}\n\nconst REPO_URL = loadRepoUrl();\n\nexport class RepositoryManager {\n private repoPath: string | undefined;\n\n constructor(customPath?: string) {\n this.repoPath = customPath;\n }\n\n async ensureRepo(): Promise<string> {\n if (this.repoPath && this.isValidRepo(this.repoPath)) {\n return this.repoPath;\n }\n\n const cwd = process.cwd();\n if (this.isValidRepo(cwd)) {\n this.repoPath = cwd;\n return cwd;\n }\n\n const envPath = process.env.CANNBOT_REPO_PATH;\n if (envPath && this.isValidRepo(envPath)) {\n this.repoPath = envPath;\n return envPath;\n }\n\n const cachedPath = getCannbotRepoPath();\n if (this.isValidRepo(cachedPath)) {\n this.repoPath = cachedPath;\n return cachedPath;\n }\n\n return await this.cloneRepo();\n }\n\n async ensureRepoAndScan(): Promise<string> {\n const repoPath = await this.ensureRepo();\n\n const cache = readScanCache();\n if (cache && cache.repoCommit === getCurrentCommit(repoPath)) {\n initFromScan(cache.skills);\n return repoPath;\n }\n\n const skills = scanSkills(repoPath);\n initFromScan(skills);\n\n writeScanCache({\n skills,\n repoCommit: getCurrentCommit(repoPath),\n timestamp: Date.now(),\n });\n\n return repoPath;\n }\n\n async updateRepo(): Promise<void> {\n const repoPath = await this.ensureRepo();\n try {\n await execa(\"git\", [\"pull\", \"--quiet\"], { cwd: repoPath, timeout: 30000 });\n } catch {\n // Ignore update failures\n }\n }\n\n getRepoPath(): string {\n if (!this.repoPath) {\n throw new Error(\"Repository not initialized. Call ensureRepo() first.\");\n }\n return this.repoPath;\n }\n\n private isValidRepo(path: string): boolean {\n if (!existsSync(path)) return false;\n const gitDir = join(path, \".git\");\n const pluginsDir = join(path, \"plugins-official\");\n return existsSync(gitDir) && existsSync(pluginsDir);\n }\n\n private async cloneRepo(): Promise<string> {\n const configDir = getCannbotConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const targetPath = getCannbotRepoPath();\n if (existsSync(targetPath)) {\n if (this.isValidRepo(targetPath)) {\n this.repoPath = targetPath;\n return targetPath;\n }\n }\n\n try {\n await execa(\n \"git\",\n [\"clone\", \"--depth\", \"1\", REPO_URL, targetPath],\n { timeout: 120000 }\n );\n this.repoPath = targetPath;\n return targetPath;\n } catch (error) {\n throw new Error(\n `Failed to clone repository: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n}\n\nexport function createRepositoryManager(customPath?: string): RepositoryManager {\n return new RepositoryManager(customPath);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ScannedSkill {\n id: string;\n description: string;\n source: string;\n filePath: string;\n}\n\nexport interface ScanCache {\n skills: ScannedSkill[];\n repoCommit: string;\n timestamp: number;\n}\n\nconst EXCLUDE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"asc-devkit\",\n \"cann-samples\",\n \"tilelang-ascend\",\n \".agents\",\n \".opencode\",\n \".claude\",\n \".claude-plugin\",\n \"dist\",\n \"build\",\n \"references\",\n \"hooks\",\n \"operators\",\n \"workflows\",\n \"tests\",\n \"docs\",\n \"scripts\",\n]);\n\nfunction loadScanConfig(): { skillDirs: string[]; pluginDirs: string[] } {\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n return {\n skillDirs: config.scanDirs || [\"ops\", \"model\", \"graph\", \"infra\", \"ops-lab\"],\n pluginDirs: config.pluginDirs || [\"plugins-official\", \"plugins-community\"],\n };\n } catch {\n return {\n skillDirs: [\"ops\", \"model\", \"graph\", \"infra\", \"ops-lab\"],\n pluginDirs: [\"plugins-official\", \"plugins-community\"],\n };\n }\n}\n\nconst scanConfig = loadScanConfig();\nconst SKILL_SCAN_DIRS = scanConfig.skillDirs;\nconst PLUGIN_SCAN_DIRS = scanConfig.pluginDirs;\n\nexport function scanSkills(repoPath: string): ScannedSkill[] {\n const skills: ScannedSkill[] = [];\n const seen = new Set<string>();\n\n for (const dir of SKILL_SCAN_DIRS) {\n const fullPath = join(repoPath, dir);\n if (!existsSync(fullPath)) continue;\n scanDirectory(fullPath, repoPath, dir, skills, seen);\n }\n\n for (const pluginDir of PLUGIN_SCAN_DIRS) {\n const pluginParent = join(repoPath, pluginDir);\n if (!existsSync(pluginParent)) continue;\n \n for (const plugin of safeReaddir(pluginParent)) {\n const pluginPath = join(pluginParent, plugin);\n if (!isDirectory(pluginPath)) continue;\n\n const skillsDir = join(pluginPath, \"skills\");\n if (existsSync(skillsDir)) {\n scanDirectory(skillsDir, repoPath, `${pluginDir}/${plugin}/skills`, skills, seen);\n }\n\n const skillDir = join(pluginPath, \"skill\");\n if (existsSync(skillDir)) {\n scanDirectory(skillDir, repoPath, `${pluginDir}/${plugin}/skill`, skills, seen);\n }\n }\n }\n\n return skills;\n}\n\nexport function parseFrontmatter(filePath: string): { name: string; description: string } | null {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n \n if (lines.length < 3) return null;\n if (lines[0].trim() !== \"---\") return null;\n\n let endIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === \"---\") {\n endIndex = i;\n break;\n }\n }\n\n if (endIndex === -1) return null;\n\n const yamlBlock = lines.slice(1, endIndex).map(l => l.replace(/\\r$/, \"\")).join(\"\\n\");\n const parsed = parseYaml(yamlBlock);\n\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!parsed.name || typeof parsed.name !== \"string\") return null;\n\n return {\n name: parsed.name.trim(),\n description: (parsed.description || \"\").trim(),\n };\n } catch {\n return null;\n }\n}\n\nexport function getCurrentCommit(repoPath: string): string {\n try {\n const headFile = join(repoPath, \".git\", \"HEAD\");\n if (!existsSync(headFile)) return \"unknown\";\n \n const headContent = readFileSync(headFile, \"utf-8\").trim();\n if (headContent.startsWith(\"ref: \")) {\n const refPath = join(repoPath, \".git\", headContent.slice(5));\n if (existsSync(refPath)) {\n return readFileSync(refPath, \"utf-8\").trim();\n }\n // Fallback to packed-refs for shallow clones\n const packedRefsPath = join(repoPath, \".git\", \"packed-refs\");\n if (existsSync(packedRefsPath)) {\n const packedRefs = readFileSync(packedRefsPath, \"utf-8\");\n const refName = headContent.slice(5);\n const lines = packedRefs.split(\"\\n\");\n for (const line of lines) {\n if (line.endsWith(refName)) {\n return line.split(\" \")[0];\n }\n }\n }\n }\n return headContent;\n } catch {\n return \"unknown\";\n }\n}\n\nexport function readScanCache(): ScanCache | null {\n try {\n const cachePath = getCachePath();\n if (!existsSync(cachePath)) return null;\n \n const content = readFileSync(cachePath, \"utf-8\");\n const cache = JSON.parse(content) as ScanCache;\n \n if (!cache.skills || !cache.timestamp) return null;\n \n const age = Date.now() - cache.timestamp;\n if (age > 24 * 60 * 60 * 1000) return null;\n \n return cache;\n } catch {\n return null;\n }\n}\n\nexport function writeScanCache(cache: ScanCache): void {\n try {\n const cachePath = getCachePath();\n const cacheDir = dirname(cachePath);\n if (!existsSync(cacheDir)) {\n mkdirSync(cacheDir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n }\n}\n\nfunction getCachePath(): string {\n return join(getCannbotConfigDir(), \"scan-cache.json\");\n}\n\nfunction scanDirectory(\n dirPath: string,\n repoPath: string,\n sourcePrefix: string,\n skills: ScannedSkill[],\n seen: Set<string>\n): void {\n // Check if dirPath itself contains SKILL.md (for skill/ directories)\n const selfSkillMd = join(dirPath, \"SKILL.md\");\n if (existsSync(selfSkillMd)) {\n const frontmatter = parseFrontmatter(selfSkillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: selfSkillMd,\n });\n }\n return; // Don't recurse into subdirectories\n }\n\n for (const entry of safeReaddir(dirPath)) {\n const fullPath = join(dirPath, entry);\n \n if (EXCLUDE_DIRS.has(entry)) continue;\n \n if (!isDirectory(fullPath)) continue;\n\n const skillMd = join(fullPath, \"SKILL.md\");\n if (existsSync(skillMd)) {\n const frontmatter = parseFrontmatter(skillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: skillMd,\n });\n }\n continue;\n }\n\n scanDirectory(fullPath, repoPath, sourcePrefix, skills, seen);\n }\n}\n\nfunction safeReaddir(dir: string): string[] {\n try {\n return readdirSync(dir);\n } catch {\n return [];\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport type { ScannedSkill } from \"./scanner.js\";\n\nexport interface SkillEntry {\n id: string;\n description: string;\n source: string;\n}\n\nexport interface SkillCategory {\n id: string;\n name: string;\n skills: SkillEntry[];\n}\n\nconst CATEGORY_DEFS: { id: string; name: string }[] = [\n { id: \"knowledge\", name: \"知识与参考\" },\n { id: \"env-tools\", name: \"环境与工具\" },\n { id: \"debug\", name: \"调试与诊断\" },\n { id: \"testing\", name: \"测试与质量\" },\n { id: \"ascendc\", name: \"AscendC 开发\" },\n { id: \"pypto\", name: \"PyPTO 开发\" },\n { id: \"tilelang\", name: \"TileLang 开发\" },\n { id: \"triton\", name: \"Triton 开发\" },\n { id: \"model\", name: \"模型推理优化\" },\n { id: \"graph\", name: \"图模式\" },\n { id: \"platform\", name: \"平台工具\" },\n { id: \"other\", name: \"其他 Skills\" },\n];\n\nlet dynamicSkills: SkillEntry[] = [];\nlet initialized = false;\n\nexport function initFromScan(scanned: ScannedSkill[]): void {\n dynamicSkills = scanned.map((s) => ({\n id: s.id,\n description: s.description,\n source: s.source,\n }));\n initialized = true;\n}\n\nexport function isScanInitialized(): boolean {\n return initialized;\n}\n\nconst STATIC_SKILL_CATEGORIES: SkillCategory[] = [\n {\n id: \"knowledge\",\n name: \"知识与参考\",\n skills: [\n { id: \"npu-arch\", description: \"NPU 架构知识、芯片型号映射\", source: \"ops\" },\n { id: \"ascendc-api-best-practices\", description: \"API 使用最佳实践\", source: \"ops\" },\n { id: \"ascendc-tiling-design\", description: \"Tiling 和 Kernel 设计方法论\", source: \"ops\" },\n { id: \"ascendc-docs-search\", description: \"API 文档索引 + 在线搜索\", source: \"ops\" },\n { id: \"ascendc-docs-gen\", description: \"算子文档写作参考\", source: \"ops\" },\n { id: \"ascendc-performance-best-practices\", description: \"性能优化经验总结\", source: \"ops\" },\n { id: \"ascendc-regbase-best-practice\", description: \"RegBase 算子 API 约束\", source: \"ops\" },\n { id: \"ops-precision-standard\", description: \"算子精度标准(atol/rtol)\", source: \"ops\" },\n { id: \"ops-spec-gen\", description: \"算子 spec.yaml 生成与校验\", source: \"ops\" },\n ],\n },\n {\n id: \"env-tools\",\n name: \"环境与工具\",\n skills: [\n { id: \"ascendc-env-check\", description: \"NPU 设备查询、CANN 环境验证\", source: \"ops\" },\n { id: \"cann-env-setup\", description: \"CANN 安装与环境配置指导\", source: \"ops\" },\n { id: \"ops-profiling\", description: \"NPU 性能采集与分析\", source: \"ops\" },\n { id: \"ops-simulator\", description: \"CANN Simulator 精度/性能仿真\", source: \"ops\" },\n { id: \"torch-ops-profiler\", description: \"torch_npu.profiler 性能报告\", source: \"ops\" },\n { id: \"aiss-tiling-solver\", description: \"AISS-TilingSolver 自动求解 Tiling 参数\", source: \"ops\" },\n ],\n },\n {\n id: \"debug\",\n name: \"调试与诊断\",\n skills: [\n { id: \"ascendc-precision-debug\", description: \"精度调试、症状-原因速查\", source: \"ops\" },\n { id: \"ascendc-runtime-debug\", description: \"运行时错误码解析\", source: \"ops\" },\n { id: \"ascendc-crash-debug\", description: \"卡死/崩溃调试、Coredump 分析\", source: \"ops\" },\n { id: \"ascendc-perf-optimize\", description: \"性能优化策略制定\", source: \"ops\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"npugraph_ex DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"npugraph_ex 编译期报错诊断\", source: \"graph\" },\n ],\n },\n {\n id: \"testing\",\n name: \"测试与质量\",\n skills: [\n { id: \"ascendc-code-review\", description: \"代码检视方法论\", source: \"ops\" },\n { id: \"ascendc-ut-develop\", description: \"UT 开发与覆盖率增强\", source: \"ops\" },\n { id: \"ascendc-st-design\", description: \"ST 测试用例设计\", source: \"ops\" },\n { id: \"ascendc-whitebox-design\", description: \"白盒测试用例生成\", source: \"ops\" },\n { id: \"ascendc-task-focus\", description: \"长任务聚焦防迷失\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"TileLang 测试设计\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"TileLang 代码格式检查\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"Triton 算子验证\", source: \"ops\" },\n ],\n },\n {\n id: \"ascendc\",\n name: \"AscendC 开发\",\n skills: [\n { id: \"ascendc-direct-invoke-template\", description: \"Kernel 直调工程模板\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-template\", description: \"自定义算子工程模板\", source: \"ops\" },\n { id: \"ascendc-direct-invoke-to-registry-invoke\", description: \"直调转注册调用\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-to-direct-invoke\", description: \"注册调用转直调\", source: \"ops\" },\n { id: \"ascendc-blaze-best-practice\", description: \"Matmul/GEMM Blaze 直调生成\", source: \"ops\" },\n { id: \"ascendc-simt-best-practices\", description: \"SIMT 最佳实践与 API 导航\", source: \"ops\" },\n { id: \"ascendc-simt-tiling-design\", description: \"SIMT 算子切分设计\", source: \"ops\" },\n { id: \"torch-ascendc-op-extension\", description: \"Ascend C 对接 PyTorch\", source: \"ops\" },\n { id: \"catlass-op-design\", description: \"Catlass 算子设计\", source: \"ops\" },\n { id: \"catlass-op-develop\", description: \"Catlass 算子开发\", source: \"ops\" },\n { id: \"catlass-op-perf-tune\", description: \"Catlass 性能调优\", source: \"ops\" },\n { id: \"cuda2ascend-simt\", description: \"CUDA 迁移到 Ascend C SIMT\", source: \"ops-lab\" },\n { id: \"ops-direct-invoke-flash\", description: \"从零构建 Ascend C 核函数\", source: \"plugins-official/ops-direct-invoke-flash/skills\" },\n { id: \"ops-registry-invoke-workflow\", description: \"注册调用工作流\", source: \"plugins-official/ops-registry-invoke\" },\n { id: \"ops-easyasc-dsl\", description: \"EasyASC DSL 算子开发\", source: \"plugins-community/ops-easyasc-dsl/skill\" },\n ],\n },\n {\n id: \"pypto\",\n name: \"PyPTO 开发\",\n skills: [\n { id: \"pypto-intent-understand\", description: \"需求意图理解与规格生成\", source: \"ops\" },\n { id: \"pypto-api-explore\", description: \"API 可行性探索与分析\", source: \"ops\" },\n { id: \"pypto-op-design\", description: \"算子方案设计生成\", source: \"ops\" },\n { id: \"pypto-golden-generate\", description: \"Golden 参考实现生成\", source: \"ops\" },\n { id: \"pypto-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"pypto-precision-debug\", description: \"精度问题排查\", source: \"ops\" },\n { id: \"pypto-precision-compare\", description: \"精度对比分析\", source: \"ops\" },\n { id: \"pypto-op-perf-tune\", description: \"性能分析与调优\", source: \"ops\" },\n ],\n },\n {\n id: \"tilelang\",\n name: \"TileLang 开发\",\n skills: [\n { id: \"tilelang-env-check\", description: \"环境检查与配置验证\", source: \"ops\" },\n { id: \"tilelang-submodule-pull\", description: \"三方库与子模块拉取\", source: \"ops\" },\n { id: \"tilelang-api-best-practices\", description: \"TileLang API 最佳实践\", source: \"ops\" },\n { id: \"tilelang-programming-model-guide\", description: \"Developer/Expert 模式选择\", source: \"ops\" },\n { id: \"tilelang-op-design\", description: \"算子设计文档生成\", source: \"ops\" },\n { id: \"tilelang-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"测试设计与覆盖率分析\", source: \"ops\" },\n { id: \"tilelang-perf-optimization\", description: \"性能调优与劣化检查\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"代码格式检查与修复\", source: \"ops\" },\n ],\n },\n {\n id: \"triton\",\n name: \"Triton 开发\",\n skills: [\n { id: \"triton-task-extractor\", description: \"算子任务提取与构建\", source: \"ops\" },\n { id: \"triton-op-designer\", description: \"算法草图设计\", source: \"ops\" },\n { id: \"triton-op-coding\", description: \"Triton 内核代码生成\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"算子精度和性能验证\", source: \"ops\" },\n { id: \"triton-latency-optimizer\", description: \"Triton 代码性能优化\", source: \"ops\" },\n ],\n },\n {\n id: \"model\",\n name: \"模型推理优化\",\n skills: [\n { id: \"model-infer-migrator\", description: \"框架适配与部署基线\", source: \"model\" },\n { id: \"model-infer-parallel-analysis\", description: \"并行策略分析(TP/EP/DP)\", source: \"model\" },\n { id: \"model-infer-parallel-impl\", description: \"并行切分实施\", source: \"model\" },\n { id: \"model-infer-kvcache\", description: \"KVCache 优化 + FA 替换\", source: \"model\" },\n { id: \"model-infer-fusion\", description: \"torch_npu 融合算子替换\", source: \"model\" },\n { id: \"model-infer-graph-mode\", description: \"torch.compile 图模式适配\", source: \"model\" },\n { id: \"model-infer-multi-stream\", description: \"多流并行优化\", source: \"model\" },\n { id: \"model-infer-prefetch\", description: \"权重预取适配\", source: \"model\" },\n { id: \"model-infer-superkernel\", description: \"SuperKernel 适配\", source: \"model\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n ],\n },\n {\n id: \"graph\",\n name: \"图模式\",\n skills: [\n { id: \"torch-npugraph-ex-knowledge\", description: \"npugraph_ex 使用指南\", source: \"graph\" },\n { id: \"torch-npugraph-ex-template\", description: \"npugraph_ex MRE 代码模板\", source: \"graph\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"编译期报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-runtime-error-diagnosis\", description: \"运行时报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-performance-diagnosis\", description: \"性能诊断\", source: \"graph\" },\n { id: \"torch-custom-ops-guide\", description: \"自定义算子入图指南\", source: \"graph\" },\n ],\n },\n {\n id: \"platform\",\n name: \"平台工具\",\n skills: [\n { id: \"gitcode-pr-handler\", description: \"GitCode PR 标题/描述生成\", source: \"infra\" },\n { id: \"gitcode-issue-gen\", description: \"GitCode Issue 生成与关联\", source: \"infra\" },\n { id: \"gitcode-issue-handler\", description: \"GitCode Issue 端到端处置\", source: \"infra\" },\n { id: \"gitcode-toolkit\", description: \"GitCode 协作通用参考\", source: \"infra\" },\n { id: \"cannbot-skill-reviewer\", description: \"Skill 入库质量审查\", source: \"infra\" },\n ],\n },\n];\n\nconst CATEGORY_MAP: Record<string, string> = {};\nfor (const cat of STATIC_SKILL_CATEGORIES) {\n for (const skill of cat.skills) {\n CATEGORY_MAP[skill.id] = cat.id;\n }\n}\n\nfunction getActiveSkills(): SkillEntry[] {\n if (initialized) return deduplicate(dynamicSkills);\n return deduplicate(STATIC_SKILL_CATEGORIES.flatMap((c) => c.skills));\n}\n\nfunction deduplicate(skills: SkillEntry[]): SkillEntry[] {\n const seen = new Set<string>();\n const result: SkillEntry[] = [];\n for (const skill of skills) {\n if (!seen.has(skill.id)) {\n result.push(skill);\n seen.add(skill.id);\n }\n }\n return result;\n}\n\nexport function findSkill(query: string): SkillEntry | undefined {\n const normalized = query.toLowerCase().trim();\n const pool = getActiveSkills();\n return pool.find((s) => s.id === normalized);\n}\n\nexport function getAllSkills(): SkillEntry[] {\n return getActiveSkills();\n}\n\nexport function getSkillsByCategory(categoryId: string): SkillEntry[] {\n return getAllCategories().find((c) => c.id === categoryId)?.skills ?? [];\n}\n\nexport function getAllCategories(): SkillCategory[] {\n const skills = getActiveSkills();\n return CATEGORY_DEFS.map((def) => ({\n id: def.id,\n name: def.name,\n skills: skills.filter((s) => {\n const catId = CATEGORY_MAP[s.id];\n if (catId) return catId === def.id;\n return def.id === \"other\";\n }),\n })).filter((cat) => cat.skills.length > 0);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult, BackupInfo } from \"../types/index.js\";\nimport { getPluginById } from \"./registry.js\";\nimport { readManifest } from \"./manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { scanInstalledFiles, writeRecord } from \"./record.js\";\nimport { detectCurrentPlugin, createBackup, getAgentsFileName } from \"./backup.js\";\nimport { showOverwriteWarning } from \"../ui/backup-prompts.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport async function installPlugin(\n opts: InstallOptions\n): Promise<InstallResult> {\n const plugin = getPluginById(opts.pluginId);\n if (!plugin) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Plugin not found: ${opts.pluginId}`],\n warnings: [],\n };\n }\n\n const scriptPath = join(opts.repoPath, plugin.dir, plugin.script);\n if (!existsSync(scriptPath)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Script not found: ${scriptPath}`],\n warnings: [],\n };\n }\n\n const args = [opts.level, opts.tool];\n if (opts.installPath) {\n args.push(opts.installPath);\n }\n\n const cwd = opts.installPath || process.cwd();\n\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n const agentsFile = join(configRoot, getAgentsFileName(opts.tool));\n let backupInfo: BackupInfo | null = null;\n\n if (existsSync(agentsFile)) {\n const currentPlugin = detectCurrentPlugin(configRoot, opts.tool);\n\n if (currentPlugin && currentPlugin.pluginId !== opts.pluginId) {\n let choice: \"overwrite\" | \"cancel\" = \"overwrite\";\n \n if (!opts.yes) {\n choice = await showOverwriteWarning(\n currentPlugin.pluginName,\n plugin.displayName\n );\n }\n\n if (choice === \"cancel\") {\n logger.info(t(\"backup_cancel\"));\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"backup_cancel\")],\n warnings: [],\n };\n }\n\n backupInfo = createBackup(\n configRoot,\n opts.tool,\n currentPlugin.pluginId,\n currentPlugin.pluginName\n );\n\n if (backupInfo) {\n logger.success(`${t(\"backup_created\")}: ${backupInfo.filePath}`);\n }\n }\n }\n\n try {\n const execOptions: any = {\n cwd,\n timeout: 300000,\n stdio: \"pipe\",\n input: opts.yes ? \"y\\n\" : undefined,\n };\n \n await execa(\"bash\", [scriptPath, ...args], execOptions);\n\n const manifest = readManifest(configRoot);\n\n let skillsCount = 0;\n let agentsCount = 0;\n\n if (manifest) {\n skillsCount = manifest.installed_skills?.length || 0;\n agentsCount = manifest.installed_agents?.length || 0;\n } else {\n skillsCount = plugin.skills;\n agentsCount = plugin.agents;\n }\n\n try {\n const record = scanInstalledFiles(\n opts.pluginId,\n plugin.displayName,\n opts.tool,\n opts.level,\n cwd,\n configRoot,\n manifest\n );\n \n if (backupInfo) {\n record.backup = {\n filePath: backupInfo.filePath,\n fromPluginId: backupInfo.pluginId,\n fromPluginName: backupInfo.pluginName,\n backupTime: backupInfo.backupTime,\n };\n }\n \n writeRecord(record);\n } catch {\n // Record writing is best-effort, don't fail install\n }\n\n return {\n success: true,\n pluginId: opts.pluginId,\n skillsCount,\n agentsCount,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [errorMessage],\n warnings: [],\n };\n }\n}\n\nexport async function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string,\n installPath?: string,\n yes?: boolean\n): Promise<InstallResult[]> {\n const results: InstallResult[] = [];\n\n for (const pluginId of pluginIds) {\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n installPath,\n yes,\n });\n results.push(result);\n }\n\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, lstatSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { getCannbotConfigDir, getConfigRoot } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel, CannbotManifest } from \"../types/index.js\";\n\nexport interface InstallRecord {\n pluginId: string;\n displayName: string;\n tool: AITool;\n level: InstallLevel;\n installPath: string;\n configRoot: string;\n installTime: string;\n files: string[];\n directories: string[];\n backup?: {\n filePath: string;\n fromPluginId: string;\n fromPluginName: string;\n backupTime: string;\n };\n}\n\nfunction getInstallsDir(): string {\n return join(getCannbotConfigDir(), \"installs\");\n}\n\nexport function getRecordPath(pluginId: string): string {\n return join(getInstallsDir(), `${pluginId}.json`);\n}\n\nexport function readRecord(pluginId: string): InstallRecord | null {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as InstallRecord;\n } catch {\n return null;\n }\n}\n\nexport function writeRecord(record: InstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n\n const recordPath = getRecordPath(record.pluginId);\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function deleteRecord(pluginId: string): void {\n const recordPath = getRecordPath(pluginId);\n if (existsSync(recordPath)) {\n unlinkSync(recordPath);\n }\n}\n\nexport function scanInstalledFiles(\n pluginId: string,\n displayName: string,\n tool: AITool,\n level: InstallLevel,\n installPath: string,\n configRoot: string,\n manifest: CannbotManifest | null\n): InstallRecord {\n const files: string[] = [];\n const directories: string[] = [];\n\n if (manifest) {\n const skillsDir = join(configRoot, \"skills\");\n if (existsSync(skillsDir)) {\n directories.push(skillsDir);\n for (const skillName of manifest.installed_skills || []) {\n const skillPath = join(skillsDir, skillName);\n if (existsSync(skillPath) || isSymlink(skillPath)) {\n files.push(skillPath);\n }\n }\n }\n\n const agentsDir = join(configRoot, \"agents\");\n if (existsSync(agentsDir)) {\n directories.push(agentsDir);\n for (const agentName of manifest.installed_agents || []) {\n const agentPath = join(agentsDir, agentName);\n const agentPathMd = join(agentsDir, agentName + \".md\");\n if (existsSync(agentPath) || isSymlink(agentPath)) {\n files.push(agentPath);\n } else if (existsSync(agentPathMd) || isSymlink(agentPathMd)) {\n files.push(agentPathMd);\n }\n }\n }\n }\n\n const workflowsLink = join(configRoot, \"workflows\");\n if (isSymlink(workflowsLink)) {\n files.push(workflowsLink);\n }\n\n const manifestPath = join(configRoot, \"cannbot-manifest.json\");\n if (existsSync(manifestPath)) {\n files.push(manifestPath);\n }\n\n const pluginManifestPath = join(configRoot, `${pluginId}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n files.push(pluginManifestPath);\n }\n\n const configFileName = tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n const configFilePath = level === \"project\"\n ? join(installPath, configFileName)\n : join(configRoot, configFileName);\n if (existsSync(configFilePath)) {\n files.push(configFilePath);\n }\n\n const repoLinks = [\"asc-devkit\", \"pypto\", \"tilelang-ascend\", \"cann-recipes-infer\", \"cann-samples\"];\n for (const repoName of repoLinks) {\n const repoLinkPath = join(installPath, repoName);\n if (isSymlink(repoLinkPath)) {\n files.push(repoLinkPath);\n }\n const repoLinkInConfig = join(configRoot, repoName);\n if (isSymlink(repoLinkInConfig)) {\n files.push(repoLinkInConfig);\n }\n }\n\n return {\n pluginId,\n displayName,\n tool,\n level,\n installPath,\n configRoot,\n installTime: new Date().toISOString(),\n files,\n directories,\n };\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n// === Skill-level install records ===\n\nexport interface SkillInstallEntry {\n skills: string[];\n installTime: string;\n}\n\nexport interface SkillInstallRecord {\n [tool: string]: {\n [level: string]: {\n [installPath: string]: SkillInstallEntry;\n };\n };\n}\n\nfunction getSkillRecordPath(): string {\n return join(getInstallsDir(), \"skills.json\");\n}\n\nexport function readSkillRecord(): SkillInstallRecord {\n const recordPath = getSkillRecordPath();\n if (!existsSync(recordPath)) {\n return {};\n }\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as SkillInstallRecord;\n } catch {\n return {};\n }\n}\n\nexport function writeSkillRecord(record: SkillInstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n const recordPath = getSkillRecordPath();\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function addSkillsToRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]) record[tool] = {};\n if (!record[tool][level]) record[tool][level] = {};\n if (!record[tool][level][installPath]) {\n record[tool][level][installPath] = { skills: [], installTime: \"\" };\n }\n const entry = record[tool][level][installPath];\n for (const id of skillIds) {\n if (!entry.skills.includes(id)) {\n entry.skills.push(id);\n }\n }\n entry.installTime = new Date().toISOString();\n writeSkillRecord(record);\n}\n\nexport function removeSkillsFromRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]?.[level]?.[installPath]) return;\n const entry = record[tool][level][installPath];\n entry.skills = entry.skills.filter((id) => !skillIds.includes(id));\n if (entry.skills.length === 0) {\n delete record[tool][level][installPath];\n if (Object.keys(record[tool][level]).length === 0) {\n delete record[tool][level];\n if (Object.keys(record[tool]).length === 0) {\n delete record[tool];\n }\n }\n }\n writeSkillRecord(record);\n}\n\nexport function getInstalledSkills(\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): string[] {\n const record = readSkillRecord();\n const recordedSkills = record[tool]?.[level]?.[installPath]?.skills || [];\n \n // 验证实际文件是否存在\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n \n return recordedSkills.filter((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\n });\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, copyFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport type { AITool, BackupInfo } from \"../types/index.js\";\nimport { readManifest } from \"./manifest.js\";\nimport { readRecord } from \"./record.js\";\nimport { findPlugin } from \"./registry.js\";\n\nexport function getAgentsFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function detectCurrentPlugin(\n configRoot: string,\n tool: AITool\n): { pluginId: string; pluginName: string } | null {\n const manifest = readManifest(configRoot);\n if (manifest?.team) {\n const plugin = findPlugin(manifest.team);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n if (!existsSync(agentsFile)) {\n return null;\n }\n\n const allRecords = readAllRecords();\n for (const record of allRecords) {\n if (record.configRoot === configRoot && record.tool === tool) {\n const plugin = findPlugin(record.pluginId);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n }\n\n return null;\n}\n\nexport function createBackup(\n configRoot: string,\n tool: AITool,\n fromPluginId: string,\n fromPluginName: string\n): BackupInfo | null {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n if (!existsSync(agentsFile)) {\n return null;\n }\n\n const timestamp = formatTimestamp(new Date());\n const backupFileName = `${getAgentsFileName(tool)}.cannbot-backup.${fromPluginId}.${timestamp}`;\n const backupPath = join(configRoot, backupFileName);\n\n try {\n copyFileSync(agentsFile, backupPath);\n return {\n filePath: backupPath,\n pluginId: fromPluginId,\n pluginName: fromPluginName,\n backupTime: timestamp,\n };\n } catch {\n return null;\n }\n}\n\nexport function findBackups(configRoot: string): BackupInfo[] {\n if (!existsSync(configRoot)) {\n return [];\n }\n\n const files = readdirSync(configRoot);\n const backups: BackupInfo[] = [];\n\n for (const file of files) {\n if (file.includes(\".cannbot-backup.\")) {\n const parts = file.split(\".cannbot-backup.\");\n if (parts.length === 2) {\n const pluginIdAndTime = parts[1];\n const lastDotIndex = pluginIdAndTime.lastIndexOf(\".\");\n if (lastDotIndex > 0) {\n const pluginId = pluginIdAndTime.substring(0, lastDotIndex);\n const timestamp = pluginIdAndTime.substring(lastDotIndex + 1);\n const plugin = findPlugin(pluginId);\n\n backups.push({\n filePath: join(configRoot, file),\n pluginId,\n pluginName: plugin?.displayName || pluginId,\n backupTime: timestamp,\n });\n }\n }\n }\n }\n\n return backups.sort((a, b) => b.backupTime.localeCompare(a.backupTime));\n}\n\nexport function restoreBackup(\n backupPath: string,\n configRoot: string,\n tool: AITool\n): boolean {\n try {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n copyFileSync(backupPath, agentsFile);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function deleteBackup(backupPath: string): boolean {\n try {\n if (existsSync(backupPath)) {\n unlinkSync(backupPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction formatTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}${month}${day}-${hours}${minutes}${seconds}`;\n}\n\nfunction readAllRecords(): any[] {\n const records: any[] = [];\n const plugins = [\n \"ops-direct-invoke\",\n \"ops-direct-invoke-flash\",\n \"ops-registry-invoke\",\n \"pypto-op-orchestrator\",\n \"triton-op-generator\",\n \"tilelang-op-orchestrator\",\n \"model-infer-optimize\",\n \"catlass-op-generator\",\n \"ops-code-reviewer\",\n \"torch-compile\",\n ];\n\n for (const pluginId of plugins) {\n const record = readRecord(pluginId);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { BackupInfo } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function showOverwriteWarning(\n currentPluginName: string,\n newPluginName: string\n): Promise<\"overwrite\" | \"cancel\"> {\n console.log();\n console.log(chalk.yellow(` ⚠️ ${t(\"backup_detected\")}`));\n console.log();\n console.log(` ${t(\"backup_current\")}: ${chalk.cyan(currentPluginName)}`);\n console.log(` ${t(\"backup_installing\")}: ${chalk.cyan(newPluginName)}`);\n console.log();\n console.log(` ${t(\"backup_overwrite_warning\")}`);\n console.log(` ${t(\"backup_auto_create\")}`);\n console.log();\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices: [\n { name: t(\"backup_overwrite\"), value: \"overwrite\" },\n { name: t(\"backup_cancel\"), value: \"cancel\" },\n ],\n });\n\n return choice;\n}\n\nexport async function showRestorePrompt(\n backups: BackupInfo[]\n): Promise<string | \"none\"> {\n console.log();\n console.log(chalk.cyan(` ${t(\"backup_restore_prompt\")}`));\n console.log();\n\n const choices = backups.map((b) => ({\n name: `${t(\"backup_restore\")} ${b.pluginName} (${b.backupTime})`,\n value: b.filePath,\n }));\n\n choices.push({ name: t(\"backup_only_uninstall\"), value: \"none\" });\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices,\n });\n\n return choice;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, symlinkSync, unlinkSync, readdirSync, rmdirSync, realpathSync, lstatSync } from \"fs\";\nimport { join } from \"path\";\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getAllCategories, findSkill, getAllSkills } from \"./skill-registry.js\";\nimport { addSkillsToRecord, removeSkillsFromRecord, getInstalledSkills } from \"./record.js\";\nimport { selectTheme, checkboxTheme } from \"../ui/theme.js\";\n\nexport interface SkillInstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport interface SkillUninstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport async function installSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n): Promise<SkillInstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const results: SkillInstallResult[] = [];\n const installedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const skill = findSkill(skillId);\n if (!skill) {\n results.push({ skillId, success: false, error: \"Skill not found in registry\" });\n continue;\n }\n\n const sourcePath = join(repoPath, skill.source, skill.id);\n const targetPath = join(skillsDir, skillId);\n\n if (!existsSync(sourcePath)) {\n results.push({ skillId, success: false, error: `Source not found: ${sourcePath}` });\n continue;\n }\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n }\n symlinkSync(realpathSync(sourcePath), targetPath);\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (installedIds.length > 0) {\n addSkillsToRecord(installedIds, tool, level, installPath);\n }\n\n return results;\n}\n\nexport async function uninstallSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel\n): Promise<SkillUninstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n const results: SkillUninstallResult[] = [];\n const removedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const targetPath = join(skillsDir, skillId);\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n results.push({ skillId, success: true });\n removedIds.push(skillId);\n logger.step(` ${t(\"uninstall_remove_label\")}: ${skillId}`);\n } else {\n results.push({ skillId, success: false, error: \"Not installed\" });\n logger.warn(`${skillId} ${t(\"uninstall_skill_not_installed\")}`);\n }\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (removedIds.length > 0) {\n removeSkillsFromRecord(removedIds, tool, level, installPath);\n }\n\n // Clean up empty skills directory\n if (existsSync(skillsDir)) {\n try {\n const entries = readdirSync(skillsDir);\n if (entries.length === 0) {\n rmdirSync(skillsDir);\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: skills/`);\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\nexport async function interactiveSkillSelect(\n tool: AITool,\n level: InstallLevel\n): Promise<string[] | \"back\" | \"cancel\"> {\n const BACK = \"__back__\";\n const CANCEL = \"__cancel__\";\n const categories = getAllCategories();\n\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n printBoxTitle(t(\"wizard_step_3_skill_title\"));\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n ...categories.map((cat) => ({\n name: `> ${cat.name} (${cat.skills.length} skills)`,\n value: cat.id,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n\n showOperationHints();\n selectedCategoryId = await select({\n message: t(\"skill_select_category\"),\n choices: categoryChoices,\n loop: false,\n theme: selectTheme,\n pageSize: 15,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n step = 1;\n break;\n }\n case 1: {\n const category = categories.find((c) => c.id === selectedCategoryId);\n if (!category) return [];\n\n printBoxTitle(t(\"wizard_step_4_skill_title\").replace(\"{category}\", category.name));\n\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n const installedSet = new Set(installedSkills);\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean } | Separator> = category.skills.map((skill) => {\n const isInstalled = installedSet.has(skill.id);\n const suffix = isInstalled ? ` [${t(\"skill_already_installed\")}]` : \"\";\n return {\n name: `${skill.id}${suffix} — ${skill.description}`,\n value: skill.id,\n checked: false,\n };\n });\n showOperationHints(true);\n const selectedSkills = await checkbox({\n message: t(\"skill_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n const skillIds = selectedSkills;\n\n // 如果什么都没勾选,显示操作菜单\n if (skillIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") { step = 0; break; }\n return \"cancel\";\n }\n\n return skillIds;\n }\n }\n }\n}\n\nexport function listAllSkills(): void {\n const categories = getAllCategories();\n\n console.log();\n console.log(chalk.bold(` ${t(\"skill_list_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(60)));\n\n for (const category of categories) {\n console.log();\n console.log(chalk.bold(` ${category.name}`) + chalk.dim(` (${category.skills.length} skills)`));\n\n const table = new Table({\n style: { head: [], border: [] },\n colWidths: [35, 45],\n wordWrap: true,\n });\n\n for (const skill of category.skills) {\n table.push([\n chalk.cyan(skill.id),\n skill.description,\n ]);\n }\n\n console.log(table.toString());\n }\n\n console.log();\n console.log(chalk.dim(` ${t(\"skill_total_count\").replace(\"{count}\", String(getAllSkills().length))}`));\n console.log();\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { PluginEntry, InstalledPlugin, AITool } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getToolDisplayName } from \"../core/detector.js\";\nimport { findPlugin } from \"../core/registry.js\";\n\nexport function printPluginList(\n plugins: PluginEntry[],\n installed: Map<string, InstalledPlugin>\n): void {\n const table = new Table({\n head: [\n chalk.cyan(t(\"list_id\")),\n chalk.cyan(t(\"list_name\")),\n chalk.cyan(t(\"list_status\")),\n chalk.cyan(t(\"list_skills\")),\n chalk.cyan(t(\"list_agents\")),\n ],\n style: { head: [], border: [] },\n });\n\n plugins.forEach((plugin, index) => {\n const isInstalled = installed.has(plugin.id);\n const status = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`—`);\n\n table.push([\n String(index + 1),\n plugin.displayName,\n status,\n String(plugin.skills),\n String(plugin.agents),\n ]);\n });\n\n console.log();\n const countSuffix = t(\"count_suffix\");\n console.log(chalk.bold(` ${t(\"list_title\")} (${plugins.length}${countSuffix ? \" \" + countSuffix : \"\"})`));\n console.log(table.toString());\n console.log();\n}\n\nexport function printInstallSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>\n): void {\n const successCount = results.filter((r) => r.success).length;\n const totalCount = results.length;\n\n console.log();\n console.log(\n chalk.bold(\n ` ${t(\"install_done\")}! ${successCount}/${totalCount} ${t(\"install_success\")}`\n )\n );\n console.log();\n\n for (const result of results) {\n if (result.success) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${result.displayName} (${result.skillsCount} skills, ${result.agentsCount} agents)`\n );\n } else {\n console.log(chalk.red(\" ✗\") + ` ${result.displayName}`);\n }\n }\n console.log();\n}\n\nexport function printEnhancedSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>,\n tool: AITool,\n configRoot: string\n): void {\n const successResults = results.filter((r) => r.success);\n const totalSkills = successResults.reduce((sum, r) => sum + r.skillsCount, 0);\n const totalAgents = successResults.reduce((sum, r) => sum + r.agentsCount, 0);\n\n if (successResults.length === 0) {\n return;\n }\n\n const toolName = getToolDisplayName(tool);\n const countSuffix = t(\"count_suffix\");\n const lines = [\n chalk.bold(` ${t(\"install_done\")}!`),\n \"\",\n ` ${chalk.dim(t(\"install_installed_to\") + \":\")} ${configRoot}`,\n ` ${chalk.dim(t(\"install_skills_count\") + \":\")} ${totalSkills}${countSuffix ? \" \" + countSuffix : \"\"} ${chalk.dim(\"|\")} ${chalk.dim(t(\"install_agents_count\") + \":\")} ${totalAgents}${countSuffix ? \" \" + countSuffix : \"\"}`,\n \"\",\n chalk.bold(` ${t(\"install_enhanced_next_steps\")}:`),\n ` ${chalk.cyan(\"1.\")} ${t(\"install_enhanced_launch\")}: ${chalk.green(toolName.toLowerCase())}`,\n ` ${chalk.cyan(\"2.\")} ${t(\"install_enhanced_try\")}: ${chalk.green(t(\"try_prompt\"))}`,\n ` ${chalk.cyan(\"3.\")} ${t(\"install_enhanced_more\")}: ${chalk.green(\"install-helper list\")}`,\n ` ${chalk.cyan(\"4.\")} ${t(\"install_enhanced_check\")}: ${chalk.green(\"install-helper doctor\")}`,\n \"\",\n ];\n\n if (successResults.length === 1) {\n const plugin = findPlugin(successResults[0].pluginId);\n const docsPath = plugin ? `${plugin.dir}/quickstart.md` : `${successResults[0].pluginId}/quickstart.md`;\n lines.push(\n ` ${chalk.dim(t(\"install_enhanced_docs\"))}: ${chalk.dim(docsPath)}`\n );\n }\n\n console.log();\n for (const line of lines) {\n console.log(line);\n }\n console.log();\n}\n\nexport function printQuickStart(tool: string): void {\n console.log(chalk.bold(` ${t(\"quick_start\")}: ${tool}`));\n console.log(chalk.dim(` ${t(\"quick_start_hint\")}`));\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { printPluginList } from \"../ui/display.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\n\nexport async function listCommand(): Promise<void> {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n printPluginList(plugins, installedMap);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync, lstatSync, unlinkSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { detectTools, getToolDisplayName, getAllTools } from \"../core/detector.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { getConfigRoot, getSkillsDir, getAgentsDir, getConfigFileName } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool } from \"../types/index.js\";\n\nexport async function doctorCommand(options: { fix?: boolean } = {}): Promise<void> {\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n\n let errors = 0;\n let warnings = 0;\n let fixes = 0;\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_tools\")}`));\n const detectedTools = await detectTools();\n const allTools = getAllTools();\n\n for (const tool of allTools) {\n const detected = detectedTools.find((d) => d.name === tool);\n if (detected) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${getToolDisplayName(tool)}${detected.version ? ` v${detected.version}` : \"\"}`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${getToolDisplayName(tool)} — ${t(\"doctor_not_installed\")}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_plugins\")}`));\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n for (const plugin of plugins) {\n const inst = installedMap.get(plugin.id);\n if (inst) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${plugin.id.padEnd(30)} ${inst.skillsCount} skills, ${inst.agentsCount} agents`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${plugin.id.padEnd(30)} — ${t(\"doctor_not_installed\")}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_links\")}`));\n\n const primaryTool = detectedTools[0]?.name || \"opencode\";\n const configRoot = getConfigRoot(primaryTool, \"project\");\n\n const skillsDir = getSkillsDir(configRoot);\n const agentsDir = getAgentsDir(configRoot);\n\n if (existsSync(skillsDir)) {\n const brokenLinks = checkBrokenLinks(skillsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(skillsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${skillsDir} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${skillsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(skillsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${skillsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(skillsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", skillsDir)}`);\n }\n }\n\n if (existsSync(agentsDir)) {\n const brokenLinks = checkBrokenLinks(agentsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(agentsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${agentsDir} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${agentsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(agentsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${agentsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(agentsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", agentsDir)}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_config\")}`));\n const configFile = getConfigFileName(primaryTool);\n const configPath = join(process.cwd(), configFile);\n if (existsSync(configPath)) {\n console.log(chalk.green(\" ✓\") + ` ${configFile} ${t(\"doctor_config_exists\")}`);\n } else {\n console.log(chalk.dim(\" —\") + ` ${configFile} ${t(\"doctor_config_not_exist\")}`);\n }\n\n console.log();\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n if (options.fix && fixes > 0) {\n console.log(\n ` ${t(\"doctor_result\")}: ${t(\"doctor_result_with_fix\").replace(\"{warnings}\", String(warnings)).replace(\"{errors}\", String(errors)).replace(\"{fixes}\", String(fixes))}`\n );\n } else {\n console.log(\n ` ${t(\"doctor_result\")}: ${t(\"doctor_result_without_fix\").replace(\"{warnings}\", String(warnings)).replace(\"{errors}\", String(errors))}`\n );\n }\n console.log();\n}\n\nfunction checkBrokenLinks(dir: string): number {\n let broken = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n broken++;\n }\n }\n } catch {\n broken++;\n }\n }\n } catch {\n // ignore\n }\n return broken;\n}\n\nfunction fixBrokenLinks(dir: string): number {\n let fixed = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n unlinkSync(fullPath);\n fixed++;\n }\n }\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n return fixed;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function statusCommand(): Promise<void> {\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n console.log();\n console.log(chalk.bold(` ${t(\"status_title\")}`));\n console.log();\n\n if (installed.length === 0) {\n console.log(chalk.dim(` ${t(\"status_none\")}`));\n console.log(chalk.dim(` ${t(\"status_hint\")}`));\n console.log();\n return;\n }\n\n for (const inst of installed) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${inst.displayName}` +\n chalk.dim(` (${inst.tool}, ${inst.level})`)\n );\n console.log(\n chalk.dim(` ${inst.skillsCount} skills, ${inst.agentsCount} agents`)\n );\n console.log(chalk.dim(` ${inst.configRoot}`));\n console.log(chalk.dim(` ${t(\"status_install_time\")}: ${inst.installTime}`));\n console.log();\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { installSkills, interactiveSkillSelect, listAllSkills } from \"../core/skill-installer.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot, validateTool, validateLevel } from \"../utils/paths.js\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function installCommand(\n names: string[],\n options: { tool?: string; level?: string; yes?: boolean; list?: boolean }\n): Promise<void> {\n // Handle --list flag\n if (options.list) {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n listAllSkills();\n return;\n }\n\n // If no names provided, enter interactive skill selection\n if (names.length === 0) {\n // Scan repo for dynamic skill discovery\n const scanSpinner = createSpinner(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") return;\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n let step = 1;\n while (true) {\n switch (step) {\n case 1: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") {\n const redetected = await selectToolWithDetection();\n if (redetected === \"back\" || redetected === \"cancel\") return;\n tool = redetected;\n break;\n }\n if (selectedSkills === \"cancel\") return;\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return;\n }\n names = selectedSkills;\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(names.length)))}...`);\n const results = await installSkills(names, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) { logger.success(`${progress} ${result.skillId}`); successCount++; }\n else { logger.error(`${progress} ${result.skillId}: ${result.error}`); failCount++; }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n return;\n }\n }\n }\n }\n\n // Scan repo for dynamic skill/plugin discovery\n const scanSpinner = createSpinner(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n // Not found\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n const allPlugins = getAllPlugins();\n logger.info(t(\"available_plugins\") + \":\");\n for (const p of allPlugins) {\n logger.step(` ${p.id} (${p.aliases.join(\", \")})`);\n }\n logger.info(`${t(\"available_skills\")}: ${chalk.cyan(\"install-helper install --list\")}`);\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") return;\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n // Install plugins\n if (plugins.length > 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n const pluginsToInstall: string[] = [];\n const skippedPlugins: string[] = [];\n\n for (const pluginId of plugins) {\n if (installedSet.has(pluginId) && !options.yes) {\n const plugin = findPlugin(pluginId);\n const displayName = plugin?.displayName || pluginId;\n logger.warn(`${displayName} [${t(\"install_already_installed\")}]`);\n const shouldReinstall = await confirm({\n message: `${t(\"install_reinstall_confirm\")}?`,\n default: false,\n });\n if (shouldReinstall) {\n pluginsToInstall.push(pluginId);\n } else {\n skippedPlugins.push(pluginId);\n logger.info(`${displayName} ${t(\"install_skip\")}`);\n }\n } else {\n pluginsToInstall.push(pluginId);\n }\n }\n\n if (pluginsToInstall.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n const allPlugins = getAllPlugins();\n const results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath,\n undefined,\n options.yes\n );\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n printEnhancedSummary(summary, tool, configRoot);\n }\n }\n\n // Install skills\n if (skills.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(skills.length)))}...`);\n\n const results = await installSkills(skills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) {\n logger.success(`${progress} ${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${progress} ${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(getConfigRoot(tool, level) + \"/skills/\")}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n }\n}\n\nasync function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n) {\n const results = [];\n const total = pluginIds.length;\n\n for (let i = 0; i < pluginIds.length; i++) {\n const pluginId = pluginIds[i];\n const progress = `[${i + 1}/${total}]`;\n const spinner = createSpinner(`${progress} ${t(\"install_progress\")} ${pluginId}...`);\n spinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n spinner.succeed(\n `${progress} ${pluginId} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n spinner.fail(`${progress} ${pluginId} — ${result.errors.join(\", \")}`);\n }\n\n results.push(result);\n }\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, unlinkSync, rmdirSync, readdirSync, lstatSync } from \"fs\";\nimport chalk from \"chalk\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { uninstallSkills } from \"../core/skill-installer.js\";\nimport { readRecord, deleteRecord } from \"../core/record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { findBackups, restoreBackup, deleteBackup, getAgentsFileName } from \"../core/backup.js\";\nimport { showRestorePrompt } from \"../ui/backup-prompts.js\";\nimport { getConfigRoot, validateTool, validateLevel } from \"../utils/paths.js\";\n\nexport async function uninstallCommand(\n names: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n const tool: AITool = options.tool ? validateTool(options.tool) : \"opencode\";\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n logger.error(`${t(\"uninstall_not_found\")}: ${name}`);\n }\n\n // Uninstall plugins\n for (const pluginId of plugins) {\n const plugin = findPlugin(pluginId);\n if (!plugin) continue;\n\n const record = readRecord(plugin.id);\n if (!record) {\n logger.warn(`${plugin.displayName} ${t(\"uninstall_no_record\")}`);\n logger.info(`${t(\"uninstall_no_record_hint\")}`);\n continue;\n }\n\n logger.info(`${t(\"uninstall_in_progress\")} ${plugin.displayName}...`);\n\n let removedFiles = 0;\n let removedDirs = 0;\n\n for (const filePath of record.files) {\n try {\n if (existsSync(filePath) || isSymlink(filePath)) {\n unlinkSync(filePath);\n const name = filePath.split(\"/\").pop() || filePath;\n logger.step(` ${t(\"uninstall_remove_label\")}: ${name}`);\n removedFiles++;\n }\n } catch {\n // ignore\n }\n }\n\n const configRoot = getConfigRoot(record.tool, record.level);\n const sortedDirs = [...record.directories].sort((a, b) => b.length - a.length);\n for (const dirPath of sortedDirs) {\n try {\n // Skip configRoot - it's the AI tool's config directory, not created by us\n if (dirPath === configRoot) {\n continue;\n }\n if (existsSync(dirPath)) {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n const name = dirPath.split(\"/\").pop() || dirPath;\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${name}/`);\n removedDirs++;\n }\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id);\n removeInstalledPlugin(plugin.id);\n\n const backups = findBackups(configRoot);\n const otherBackups = backups.filter((b) => b.pluginId !== pluginId);\n\n if (otherBackups.length > 0) {\n const choice = await showRestorePrompt(otherBackups);\n if (choice !== \"none\") {\n const restored = restoreBackup(choice, configRoot, record.tool);\n if (restored) {\n const backupInfo = otherBackups.find((b) => b.filePath === choice);\n logger.success(`${t(\"backup_restore_success\")}: ${backupInfo?.pluginName || \"\"}`);\n deleteBackup(choice);\n }\n }\n }\n\n const currentBackups = backups.filter((b) => b.pluginId === pluginId);\n for (const backup of currentBackups) {\n deleteBackup(backup.filePath);\n }\n\n const totalRemoved = removedFiles + removedDirs;\n if (totalRemoved > 0) {\n logger.success(`${t(\"uninstall_removed\")} ${plugin.displayName}(${t(\"uninstall_remove_file_format\").replace(\"{count}\", String(removedFiles))},${t(\"uninstall_remove_dir_format\").replace(\"{count}\", String(removedDirs))})`);\n } else {\n logger.warn(`${plugin.displayName}${t(\"uninstall_files_gone\")}`);\n }\n }\n\n // Uninstall skills\n if (skills.length > 0) {\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(skills.length))}...`);\n\n const results = await uninstallSkills(skills, tool, level);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n successCount++;\n } else {\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_uninstall_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n }\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getConfigRoot, validateTool, validateLevel } from \"../utils/paths.js\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function updateCommand(\n pluginNames: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") return;\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n let pluginsToUpdate: string[] = [];\n\n if (pluginNames.length === 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n pluginsToUpdate = manifests.map((m) => m.team);\n if (pluginsToUpdate.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n logger.info(t(\"update_install_hint\").replace(\"{cmd}\", chalk.cyan(\"install-helper install <plugin>\")));\n return;\n }\n } else {\n for (const name of pluginNames) {\n const plugin = findPlugin(name);\n if (!plugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n return;\n }\n pluginsToUpdate.push(plugin.id);\n }\n }\n\n const repoManager = createRepositoryManager();\n const updateSpinner = createSpinner(t(\"update_updating\") + \"...\");\n updateSpinner.start();\n\n await repoManager.updateRepo();\n const repoPath = repoManager.getRepoPath();\n await repoManager.ensureRepoAndScan();\n updateSpinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const results = [];\n const total = pluginsToUpdate.length;\n\n for (let i = 0; i < pluginsToUpdate.length; i++) {\n const pluginId = pluginsToUpdate[i];\n const plugin = allPlugins.find((p) => p.id === pluginId);\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"update_updating\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n logger.success(t(\"update_done\"));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function infoCommand(pluginName: string): Promise<void> {\n const plugin = findPlugin(pluginName);\n if (!plugin) {\n console.log(chalk.red(` ${t(\"info_not_found\")}: ${pluginName}`));\n return;\n }\n\n const installed = scanInstalled();\n const isInstalled = installed.some((p) => p.id === plugin.id);\n const statusText = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`— ${t(\"status_not_installed\")}`);\n\n console.log();\n console.log(chalk.bold(` ${plugin.displayName}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"info_description\") + \":\")} ${plugin.description}`);\n console.log(` ${chalk.dim(\"ID:\")} ${plugin.id}`);\n console.log(` ${chalk.dim(t(\"info_status\") + \":\")} ${statusText}`);\n console.log(` ${chalk.dim(t(\"info_skills\") + \":\")} ${plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${plugin.agents}`);\n console.log(` ${chalk.dim(t(\"info_aliases\") + \":\")} ${plugin.aliases.join(\", \")}`);\n console.log();\n\n try {\n const repoManager = createRepositoryManager();\n const repoPath = await repoManager.ensureRepo();\n const quickstartPath = join(repoPath, plugin.dir, \"quickstart.md\");\n\n if (existsSync(quickstartPath)) {\n console.log(` ${chalk.dim(t(\"info_quickstart\") + \":\")} ${quickstartPath}`);\n }\n\n const agentsDir = join(repoPath, plugin.dir, \"agents\");\n if (existsSync(agentsDir)) {\n const agentFiles = readdirSync(agentsDir).filter((f: string) => f.endsWith(\".md\"));\n if (agentFiles.length > 0) {\n console.log();\n console.log(` ${chalk.bold(\"Agents:\")}`);\n for (const agent of agentFiles) {\n console.log(` • ${agent.replace(\".md\", \"\")}`);\n }\n }\n }\n } catch {\n // ignore if repo not available\n }\n\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { setLanguage, t } from \"../utils/i18n.js\";\n\nexport async function langCommand(\n action?: string,\n value?: string\n): Promise<void> {\n const config = readConfig();\n\n if (!action || action === \"show\") {\n console.log();\n console.log(chalk.bold(` ${t(\"lang_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"lang_current\") + \":\")} ${config.language}`);\n console.log();\n console.log(chalk.dim(` ${t(\"lang_supported\")}`));\n console.log(chalk.dim(` ${t(\"lang_usage\")}`));\n console.log();\n return;\n }\n\n if (action === \"set\") {\n if (!value) {\n console.log(chalk.red(` ${t(\"lang_specify\")}`));\n return;\n }\n\n if (value !== \"zh_CN\" && value !== \"en_US\") {\n console.log(chalk.red(` ${t(\"lang_invalid\")}`));\n return;\n }\n\n updateConfig({ language: value });\n setLanguage(value);\n console.log();\n console.log(chalk.green(` ✓ ${t(\"lang_set\")} ${value}`));\n console.log();\n return;\n }\n\n console.log(chalk.red(` ${t(\"lang_unknown_action\")}: ${action}`));\n console.log(chalk.dim(` ${t(\"lang_supported_actions\")}`));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createCLI } from \"./cli.js\";\nimport { t } from \"./utils/i18n.js\";\n\nprocess.on(\"uncaughtException\", (error: any) => {\n if (error.name === \"ExitPromptError\") {\n console.log(\"\\n\" + t(\"init_cancelled\"));\n process.exit(0);\n }\n throw error;\n});\n\nconst program = createCLI();\nprogram.parse();\n"],"mappings":";;;AAUA,SAAS,eAAe;;;ACAxB,SAAS,UAAAA,SAAQ,aAAAC,kBAAiB;AAClC,OAAOC,YAAW;;;ACDlB,SAAS,QAAQ,UAAU,iBAAiB;AAC5C,OAAOC,YAAW;;;ACDlB,SAAS,aAAa,oBAAoB;AAC1C,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,SAAS,iBAAiB;AAGnC,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAEpC,SAAS,sBAAqC;AAC5C,QAAM,aAAa,KAAK,WAAW,WAAW;AAC9C,QAAM,eAAe,KAAK,YAAY,eAAe;AAErD,MAAI,WAAoC,CAAC;AACzC,MAAI;AACF,eAAW,UAAU,aAAa,cAAc,OAAO,CAAC,KAAK,CAAC;AAAA,EAChE,QAAQ;AAAA,EACR;AAEA,QAAM,UAAyB,CAAC;AAChC,MAAI;AACF,eAAW,QAAQ,YAAY,UAAU,GAAG;AAC1C,UAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,SAAS,MAAM,EAAG;AACpD,UAAI;AACF,cAAM,UAAU,UAAU,aAAa,KAAK,YAAY,IAAI,GAAG,OAAO,CAAC;AACvE,YAAI,CAAC,WAAW,CAAC,QAAQ,GAAI;AAC7B,gBAAQ,KAAK;AAAA,UACX,IAAI,QAAQ;AAAA,UACZ,KAAK,QAAQ;AAAA,UACb,aAAa,QAAQ,eAAe,QAAQ;AAAA,UAC5C,QAAQ,QAAQ,UAAU,SAAS,UAAU;AAAA,UAC7C,SAAS,QAAQ,WAAW,CAAC;AAAA,UAC7B,QAAQ,QAAQ,UAAU,SAAS,UAAU;AAAA,UAC7C,QAAQ,QAAQ,UAAU,SAAS,UAAU;AAAA,UAC7C,aAAa,QAAQ,eAAe;AAAA,QACtC,CAAC;AAAA,MACH,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EACR;AACA,SAAO;AACT;AAEO,IAAM,kBAAiC,oBAAoB;AAE3D,SAAS,WAAW,OAAwC;AACjE,QAAM,aAAa,MAAM,YAAY,EAAE,KAAK;AAE5C,QAAM,aAAa,gBAAgB;AAAA,IACjC,CAAC,MAAM,EAAE,OAAO,cAAc,EAAE,OAAO,MAAM,KAAK;AAAA,EACpD;AACA,MAAI,WAAY,QAAO;AAEvB,QAAM,aAAa,gBAAgB;AAAA,IAAK,CAAC,MACvC,EAAE,QAAQ,KAAK,CAAC,MAAM,MAAM,UAAU;AAAA,EACxC;AACA,MAAI,WAAY,QAAO;AAEvB,QAAM,cAAc,gBAAgB,KAAK,CAAC,MAAM,EAAE,GAAG,WAAW,UAAU,CAAC;AAC3E,MAAI,YAAa,QAAO;AAExB,SAAO;AACT;AAEO,SAAS,gBAA+B;AAC7C,SAAO;AACT;AAEO,SAAS,cAAc,IAAqC;AACjE,SAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAChD;;;ACvEA,SAAS,aAAa;AACtB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACHrB,SAAS,eAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,kBAAkB;;;ACF3B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYH,SAAQE,WAAU;AAIpC,SAAS,WAAW,QAA0B;AAC5C,QAAM,aAAaH,MAAKI,YAAW,WAAW,GAAG,MAAM,OAAO;AAC9D,MAAI;AACF,UAAM,UAAUL,cAAa,YAAY,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AAEN,UAAM,eAAeC,MAAKI,YAAW,WAAW,YAAY;AAC5D,QAAI;AACF,YAAM,UAAUL,cAAa,cAAc,OAAO;AAClD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;AAEA,IAAI,cAAiC;AACrC,IAAI,WAAqB,WAAW,OAAO;AAEpC,SAAS,YAAY,MAA+B;AACzD,gBAAc;AACd,aAAW,WAAW,IAAI;AAC5B;AAMO,SAAS,EAAE,KAAqB;AACrC,SAAO,SAAS,GAAG,MAAM,SAAY,SAAS,GAAG,IAAI;AACvD;;;ADlCA,IAAM,cAAwB,CAAC,YAAY,UAAU,QAAQ,UAAU,SAAS;AAChF,IAAM,eAA+B,CAAC,WAAW,QAAQ;AAElD,SAAS,aAAa,MAAsB;AACjD,MAAI,CAAC,YAAY,SAAS,IAAc,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,EAAE,oBAAoB,EACnB,QAAQ,UAAU,IAAI,EACtB,QAAQ,WAAW,YAAY,KAAK,IAAI,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAA6B;AACzD,MAAI,CAAC,aAAa,SAAS,KAAqB,GAAG;AACjD,UAAM,IAAI;AAAA,MACR,EAAE,qBAAqB,EACpB,QAAQ,WAAW,KAAK,EACxB,QAAQ,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBAAiC;AAC/C,QAAM,OAAO,QAAQ;AACrB,MAAI,WAAWM,MAAK,MAAM,UAAU,CAAC,EAAG,QAAO;AAC/C,MAAI,WAAWA,MAAK,MAAM,WAAW,CAAC,EAAG,QAAO;AAChD,MAAI,WAAWA,MAAK,MAAM,UAAU,CAAC,EAAG,QAAO;AAC/C,SAAO;AACT;AAEO,SAAS,cACd,MACA,OACA,MACQ;AACR,QAAM,OAAO,QAAQ;AAErB,MAAI,UAAU,UAAU;AACtB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAOA,MAAK,MAAM,WAAW,UAAU;AAAA,MACzC,KAAK;AACH,eAAOA,MAAK,MAAM,SAAS;AAAA,MAC7B,KAAK,QAAQ;AACX,cAAM,UAAU,kBAAkB;AAClC,gBAAQ,SAAS;AAAA,UACf,KAAK;AACH,mBAAOA,MAAK,MAAM,WAAW;AAAA,UAC/B,KAAK;AACH,mBAAOA,MAAK,MAAM,UAAU;AAAA,UAC9B;AACE,mBAAOA,MAAK,MAAM,UAAU;AAAA,QAChC;AAAA,MACF;AAAA,MACA,KAAK;AACH,eAAOA,MAAK,MAAM,SAAS;AAAA,MAC7B,KAAK;AACH,eAAOA,MAAK,MAAM,UAAU;AAAA,MAC9B;AACE,cAAM,IAAI;AAAA,UACR,EAAE,oBAAoB,EACnB,QAAQ,UAAU,IAAI,EACtB,QAAQ,WAAW,YAAY,KAAK,IAAI,CAAC;AAAA,QAC9C;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,QAAQ,IAAI;AACpC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAOA,MAAK,SAAS,WAAW;AAAA,IAClC,KAAK;AACH,aAAOA,MAAK,SAAS,SAAS;AAAA,IAChC,KAAK,QAAQ;AACX,YAAM,UAAU,kBAAkB;AAClC,cAAQ,SAAS;AAAA,QACf,KAAK;AACH,iBAAOA,MAAK,SAAS,WAAW;AAAA,QAClC,KAAK;AACH,iBAAOA,MAAK,SAAS,UAAU;AAAA,QACjC;AACE,iBAAOA,MAAK,SAAS,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAOA,MAAK,SAAS,SAAS;AAAA,IAChC,KAAK;AACH,aAAOA,MAAK,SAAS,SAAS;AAAA,IAChC;AACE,YAAM,IAAI;AAAA,QACR,EAAE,oBAAoB,EACnB,QAAQ,UAAU,IAAI,EACtB,QAAQ,WAAW,YAAY,KAAK,IAAI,CAAC;AAAA,MAC9C;AAAA,EACJ;AACF;AAEO,SAAS,kBAAkB,MAAsB;AACtD,SAAO,SAAS,WAAW,cAAc;AAC3C;AAEO,SAAS,aAAa,YAA4B;AACvD,SAAOA,MAAK,YAAY,QAAQ;AAClC;AAEO,SAAS,aAAa,YAA4B;AACvD,SAAOA,MAAK,YAAY,QAAQ;AAClC;AAEO,SAAS,gBAAgB,YAA4B;AAC1D,SAAOA,MAAK,YAAY,uBAAuB;AACjD;AAEO,SAAS,sBAA8B;AAC5C,SAAOA,MAAK,QAAQ,GAAG,UAAU;AACnC;AAEO,SAAS,qBAA6B;AAC3C,SAAOA,MAAK,oBAAoB,GAAG,MAAM;AAC3C;;;ADzHA,eAAe,kBACb,KACA,OAAiB,CAAC,WAAW,GACA;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,MAAM,KAAK,MAAM,EAAE,SAAS,IAAK,CAAC;AACvD,UAAM,SAAS,OAAO,OAAO,KAAK;AAClC,UAAM,QAAQ,OAAO,MAAM,iBAAiB;AAC5C,WAAO,QAAQ,MAAM,CAAC,IAAI,OAAO,MAAM,IAAI,EAAE,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAe,KAA0C;AACtE,MAAI;AACF,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC,GAAG,GAAG,EAAE,SAAS,IAAK,CAAC;AAC5D,WAAO,OAAO,OAAO,KAAK;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAoD;AACjE,QAAM,OAAO,MAAM,eAAe,UAAU;AAC5C,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,MAAM,kBAAkB,UAAU;AAClD,SAAO,EAAE,MAAM,YAAY,SAAS,KAAK;AAC3C;AAEA,eAAe,eAAkD;AAC/D,QAAM,OAAO,MAAM,eAAe,QAAQ;AAC1C,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,UAAU,MAAM,kBAAkB,QAAQ;AAChD,SAAO,EAAE,MAAM,UAAU,SAAS,KAAK;AACzC;AAEA,eAAe,aAAgD;AAC7D,QAAM,OAAOC,SAAQ;AACrB,QAAM,UAAU,kBAAkB;AAElC,MAAI;AACJ,MAAI,YAAY,SAASC,YAAWC,MAAK,MAAM,UAAU,CAAC,GAAG;AAC3D,WAAOA,MAAK,MAAM,UAAU;AAAA,EAC9B,WAAW,YAAY,YAAYD,YAAWC,MAAK,MAAM,WAAW,CAAC,GAAG;AACtE,WAAOA,MAAK,MAAM,WAAW;AAAA,EAC/B,WAAW,YAAY,SAASD,YAAWC,MAAK,MAAM,UAAU,CAAC,GAAG;AAClE,WAAOA,MAAK,MAAM,UAAU;AAAA,EAC9B,WAAW,YAAY,WAAW;AAChC,UAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,QAAI,QAAS,QAAO;AAAA,EACtB;AAEA,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,EAAE,MAAM,QAAQ,SAAS,SAAS,KAAK;AAChD;AAEA,eAAe,eAAkD;AAC/D,QAAM,OAAO,MAAM,eAAe,QAAQ;AAC1C,MAAI,MAAM;AACR,UAAM,UAAU,MAAM,kBAAkB,QAAQ;AAChD,WAAO,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,EACzC;AAEA,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM,UAAU;AAChB,QAAID,YAAW,OAAO,GAAG;AACvB,aAAO,EAAE,MAAM,UAAU,MAAM,QAAQ;AAAA,IACzC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,gBAAmD;AAChE,QAAM,OAAO,MAAM,eAAe,IAAI;AACtC,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI;AACF,UAAM,MAAM,MAAM,CAAC,aAAa,MAAM,GAAG,EAAE,SAAS,IAAK,CAAC;AAC1D,WAAO,EAAE,MAAM,WAAW,KAAK;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,cAAuC;AAC3D,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,QAAQ,WAAW,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAClE,QAAM,QAAwB,CAAC;AAE/B,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,WAAW,eAAe,OAAO,OAAO;AACjD,YAAM,KAAK,OAAO,KAAK;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,mBAAmB,MAAsB;AACvD,QAAM,QAAgC;AAAA,IACpC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACA,SAAO,MAAM,IAAI;AACnB;AAEO,SAAS,cAAwB;AACtC,SAAO,CAAC,YAAY,UAAU,QAAQ,UAAU,SAAS;AAC3D;;;AGpIA,SAAS,cAAAE,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AAUd,SAAS,aAAa,YAA4C;AACvE,QAAM,eAAe,gBAAgB,UAAU;AAC/C,MAAIC,YAAW,YAAY,GAAG;AAC5B,QAAI;AACF,YAAM,UAAUC,cAAa,cAAc,OAAO;AAClD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,YAAuC;AACtE,QAAM,YAA+B,CAAC;AACtC,QAAM,UAAU,cAAc;AAE9B,QAAM,eAAe,gBAAgB,UAAU;AAC/C,MAAID,YAAW,YAAY,GAAG;AAC5B,QAAI;AACF,YAAM,UAAUC,cAAa,cAAc,OAAO;AAClD,gBAAU,KAAK,KAAK,MAAM,OAAO,CAAoB;AAAA,IACvD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,qBAAqBC,MAAK,YAAY,GAAG,OAAO,EAAE,gBAAgB;AACxE,QAAIF,YAAW,kBAAkB,GAAG;AAClC,UAAI;AACF,cAAM,UAAUC,cAAa,oBAAoB,OAAO;AACxD,kBAAU,KAAK,KAAK,MAAM,OAAO,CAAoB;AAAA,MACvD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAmC;AACjD,QAAM,UAAU,cAAc;AAC9B,QAAM,YAA+B,CAAC;AACtC,QAAM,QAAkB,CAAC,YAAY,UAAU,QAAQ,UAAU,SAAS;AAC1E,QAAM,SAAyB,CAAC,WAAW,QAAQ;AAEnD,aAAW,QAAQ,OAAO;AACxB,eAAW,SAAS,QAAQ;AAC1B,YAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,YAAM,YAAY,iBAAiB,UAAU;AAE7C,iBAAW,YAAY,WAAW;AAChC,cAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,IAAI;AACzD,YAAI,CAAC,OAAQ;AAGb,YAAI,CAAC,uBAAuB,YAAY,UAAU,MAAM,KAAK,GAAG;AAC9D;AAAA,QACF;AAEA,cAAM,eAAe,UAAU;AAAA,UAC7B,CAAC,MAAM,EAAE,OAAO,OAAO,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU;AAAA,QAC9D;AACA,YAAI,aAAc;AAElB,kBAAU,KAAK;AAAA,UACb,IAAI,OAAO;AAAA,UACX,aAAa,OAAO;AAAA,UACpB;AAAA,UACA;AAAA,UACA,aAAa,SAAS,kBAAkB,UAAU;AAAA,UAClD,aAAa,SAAS,kBAAkB,UAAU;AAAA,UAClD,aAAa,SAAS;AAAA,UACtB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,YAAoB,UAA2B,MAAc,OAA8B;AACzH,QAAM,YAAYC,MAAK,YAAY,QAAQ;AAC3C,QAAM,YAAYA,MAAK,YAAY,QAAQ;AAG3C,MAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,UAAM,cAAc,SAAS,iBAAiB,KAAK,CAAC,YAAY;AAC9D,YAAM,YAAYA,MAAK,WAAW,OAAO;AACzC,aAAOF,YAAW,SAAS;AAAA,IAC7B,CAAC;AACD,QAAI,CAAC,YAAa,QAAO;AAAA,EAC3B;AAGA,MAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,UAAM,cAAc,SAAS,iBAAiB,KAAK,CAAC,YAAY;AAC9D,YAAM,YAAYE,MAAK,WAAW,OAAO;AACzC,aAAOF,YAAW,SAAS;AAAA,IAC7B,CAAC;AACD,QAAI,CAAC,YAAa,QAAO;AAAA,EAC3B;AAIA,MAAI;AACJ,MAAI,SAAS,cAAc,UAAU,WAAW;AAE9C,mBAAeE,MAAK,YAAY,MAAM,WAAW;AAAA,EACnD,OAAO;AACL,mBAAeA,MAAK,YAAY,WAAW;AAAA,EAC7C;AACA,MAAI,CAACF,YAAW,YAAY,EAAG,QAAO;AAEtC,SAAO;AACT;;;ACjIA,OAAO,WAAW;AAClB,OAAO,SAAuB;AAGvB,IAAM,SAAS;AAAA,EACpB,SAAS,CAAC,QAAgB,QAAQ,IAAI,MAAM,MAAM,QAAG,IAAI,MAAM,GAAG;AAAA,EAClE,OAAO,CAAC,QAAgB,QAAQ,IAAI,MAAM,IAAI,QAAG,IAAI,MAAM,GAAG;AAAA,EAC9D,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,OAAO,QAAG,IAAI,MAAM,GAAG;AAAA,EAChE,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,KAAK,QAAG,IAAI,MAAM,GAAG;AAAA,EAC9D,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,IAAI,GAAG,CAAC;AAAA,EACjD,OAAO,MAAM,QAAQ,IAAI;AAC3B;AAEO,SAAS,cAAc,MAAmB;AAC/C,SAAO,IAAI,EAAE,MAAM,OAAO,OAAO,CAAC;AACpC;AAEO,SAAS,YAAY,UAAyB;AACnD,UAAQ,IAAI,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAMxB,CAAC;AACA,MAAI,UAAU;AACZ,YAAQ,IAAI,MAAM,KAAK,KAAK,QAAQ,EAAE,CAAC;AACvC,YAAQ,IAAI;AAAA,EACd;AACF;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI,QAAQ;AACZ,aAAW,MAAM,KAAK;AACpB,UAAM,OAAO,GAAG,YAAY,CAAC;AAC7B,QACG,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,SAAU,QAAQ,SAC1B,QAAQ,UAAW,QAAQ,UAC3B,QAAQ,UAAW,QAAQ,UAC3B,QAAQ,UAAW,QAAQ,UAC3B,QAAQ,UAAW,QAAQ,QAC5B;AACA,eAAS;AAAA,IACX,OAAO;AACL,eAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAe,QAAgB,IAAU;AACrE,QAAM,SAAS,SAAI,OAAO,KAAK;AAC/B,QAAM,eAAe,gBAAgB,KAAK;AAC1C,QAAM,eAAe,QAAQ;AAC7B,QAAM,cAAc,KAAK,MAAM,eAAe,CAAC;AAC/C,QAAM,eAAe,eAAe;AACpC,QAAM,cAAc,IAAI,OAAO,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,QAAQ,IAAI,OAAO,KAAK,IAAI,GAAG,YAAY,CAAC;AACvG,UAAQ,IAAI;AACZ,UAAQ,IAAI,MAAM,KAAK,KAAK,WAAM,MAAM,QAAG,CAAC;AAC5C,UAAQ,IAAI,MAAM,KAAK,KAAK,UAAK,IAAI,MAAM,KAAK,KAAK,WAAW,IAAI,MAAM,KAAK,KAAK,QAAG,CAAC;AACxF,UAAQ,IAAI,MAAM,KAAK,KAAK,WAAM,MAAM,QAAG,CAAC;AAC5C,UAAQ,IAAI;AACd;AAEO,SAAS,mBAAmB,aAAsB,OAAa;AACpE,MAAI,YAAY;AACd,YAAQ,IAAI,2CAA0B,EAAE,kBAAkB,CAAC,cAAc,EAAE,mBAAmB,CAAC,WAAW,EAAE,mBAAmB,CAAC,4BAAuB,EAAE,qBAAqB,CAAC,SAAI,EAAE,sBAAsB,CAAC;AAAA,CAAK;AAAA,EACnN,OAAO;AACL,YAAQ,IAAI,2CAA0B,EAAE,kBAAkB,CAAC,4BAAuB,EAAE,qBAAqB,CAAC;AAAA,CAAI;AAAA,EAChH;AACF;;;AC1EA,SAAS,cAAAG,aAAY,WAAW,gBAAAC,eAAc,qBAAqB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,OAAO,iBAAiB;AAG1B,SAAS,eAAuB;AACrC,SAAOD,MAAKC,SAAQ,GAAG,UAAU;AACnC;AAEO,SAAS,gBAAwB;AACtC,SAAOD,MAAK,aAAa,GAAG,aAAa;AAC3C;AAEO,SAAS,aAAwB;AACtC,QAAM,aAAa,cAAc;AACjC,MAAI,CAACF,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,kBAAkB,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,UAAM,SAAS,MAAM,OAAO;AAC5B,WAAO;AAAA,MACL,UAAU,OAAO,YAAY;AAAA,MAC7B,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,kBAAkB,OAAO,oBAAoB,CAAC;AAAA,IAChD;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,UAAU;AAAA,MACV,kBAAkB,CAAC;AAAA,IACrB;AAAA,EACF;AACF;AAEO,SAAS,YAAY,QAAyB;AACnD,QAAM,YAAY,aAAa;AAC/B,MAAI,CAACD,YAAW,SAAS,GAAG;AAC1B,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,aAAa,cAAc;AACjC,QAAM,UAAU,UAAU,MAAM;AAChC,gBAAc,YAAY,SAAS,OAAO;AAC5C;AAEO,SAAS,aAAa,SAAwC;AACnE,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,EAAE,GAAG,QAAQ,GAAG,QAAQ;AACxC,cAAY,OAAO;AACnB,SAAO;AACT;AAEO,SAAS,mBAAmB,UAAwB;AACzD,QAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,OAAO,iBAAiB,SAAS,QAAQ,GAAG;AAC/C,WAAO,iBAAiB,KAAK,QAAQ;AACrC,gBAAY,MAAM;AAAA,EACpB;AACF;AAEO,SAAS,sBAAsB,UAAwB;AAC5D,QAAM,SAAS,WAAW;AAC1B,SAAO,mBAAmB,OAAO,iBAAiB;AAAA,IAChD,CAAC,OAAO,OAAO;AAAA,EACjB;AACA,cAAY,MAAM;AACpB;;;ACzEO,IAAM,cAAc;AAAA,EACzB,UAAU;AACZ;AAEO,IAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AACZ;;;ARCA,IAAM,OAAO;AACb,IAAM,SAAS;AAEf,eAAsB,0BAA+D;AACnF,QAAM,SAAS,WAAW;AAC1B,SAAO,MAAM;AAEb,QAAM,UAAU,cAAc,EAAE,eAAe,CAAC;AAChD,UAAQ,MAAM;AACd,QAAM,gBAAgB,MAAM,YAAY;AACxC,UAAQ,KAAK;AAEb,QAAM,SAAS,MAAM,SAAS,eAAe,OAAO,QAAQ;AAC5D,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO;AACT;AAEA,eAAsB,YAAoC;AACxD,QAAM,SAAS,WAAW;AAC1B,SAAO,MAAM;AAEb,QAAM,UAAU,cAAc,EAAE,eAAe,CAAC;AAChD,UAAQ,MAAM;AACd,QAAM,gBAAgB,MAAM,YAAY;AACxC,UAAQ,KAAK;AAEb,MAAI;AACJ,MAAI,QAAsB;AAC1B,MAAI,UAAoB,CAAC;AAEzB,MAAI,OAAO;AAEX,SAAO,MAAM;AACX,YAAQ,MAAM;AAAA,MACZ,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,SAAS,eAAe,OAAO,QAAQ;AAC5D,YAAI,WAAW,MAAM;AACnB,iBAAO,EAAE,UAAU,OAAO,YAAY,SAAS,MAAM,YAAY,OAAO,WAAW,SAAS,CAAC,GAAG,WAAW,OAAO,MAAM,KAAK;AAAA,QAC/H;AACA,YAAI,WAAW,QAAQ;AACrB,iBAAO,EAAE,UAAU,OAAO,YAAY,SAAS,MAAM,YAAY,OAAO,WAAW,SAAS,CAAC,GAAG,WAAW,MAAM;AAAA,QACnH;AACA,uBAAe;AACf,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,UAAU,OAAO,SAAS;AAC/C,YAAI,WAAW,MAAM;AAAE,iBAAO;AAAG;AAAA,QAAO;AACxC,YAAI,WAAW,QAAQ;AACrB,iBAAO,EAAE,UAAU,OAAO,YAAY,SAAS,MAAM,cAAe,OAAO,WAAW,SAAS,CAAC,GAAG,WAAW,MAAM;AAAA,QACtH;AACA,gBAAQ;AACR,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,YAAY,cAAe,KAAK;AACrD,YAAI,WAAW,MAAM;AAAE,iBAAO;AAAG;AAAA,QAAO;AACxC,YAAI,WAAW,QAAQ;AACrB,iBAAO,EAAE,UAAU,OAAO,YAAY,SAAS,MAAM,cAAe,OAAO,SAAS,CAAC,GAAG,WAAW,MAAM;AAAA,QAC3G;AACA,kBAAU;AACV,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,YAAY,cAAe,OAAO,OAAO;AAC9D,YAAI,WAAW,MAAM;AAAE,iBAAO;AAAG;AAAA,QAAO;AACxC,YAAI,WAAW,UAAU,WAAW,OAAO;AACzC,iBAAO,EAAE,UAAU,OAAO,YAAY,SAAS,MAAM,cAAe,OAAO,SAAS,CAAC,GAAG,WAAW,MAAM;AAAA,QAC3G;AACA,qBAAa,EAAE,UAAU,cAAc,WAAW,MAAM,CAAC;AACzD,eAAO,EAAE,UAAU,OAAO,YAAY,SAAS,MAAM,cAAe,OAAO,SAAS,WAAW,KAAK;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,SAAS,eAAwD,UAAkE;AAChJ,gBAAc,EAAE,qBAAqB,CAAC;AAEtC,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,MAAM,EAAE,sBAAsB,CAAC;AACtC,UAAMI,WAA8D;AAAA,MAClE,GAAG,CAAC,YAAY,UAAU,QAAQ,UAAU,SAAS,EAAE,IAAI,CAAC,UAAU;AAAA,QACpE,MAAM,KAAK,mBAAmB,IAAc,CAAC;AAAA,QAC7C,OAAO;AAAA,MACT,EAAE;AAAA,MACF,IAAI,UAAU,sFAAgB;AAAA,MAC9B,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAO,KAAK;AAAA,MAC9C,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,OAAO;AAAA,IACpD;AACA,uBAAmB;AACnB,UAAMC,UAAS,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,GAAG,SAAAD,UAAS,SAAS,UAAU,MAAM,OAAO,OAAO,YAAY,CAAC;AAC7H,QAAIC,YAAW,KAAM,QAAO;AAC5B,QAAIA,YAAW,OAAQ,QAAO;AAC9B,WAAOA;AAAA,EACT;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,UAAM,OAAO,cAAc,CAAC;AAC5B,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,SAAU,aAAa,KAAK,EAAE,kBAAkB,CAAC,MAAM;AAC7D,WAAO;AAAA,MACL,GAAG,EAAE,sBAAsB,CAAC,KAAK,mBAAmB,KAAK,IAAI,CAAC,GAAG,KAAK,UAAU,MAAM,KAAK,OAAO,MAAM,EAAE,GAAG,MAAM;AAAA,IACrH;AACA,UAAMD,WAA8D;AAAA,MAClE,EAAE,MAAM,KAAK,EAAE,qBAAqB,CAAC,IAAI,mBAAmB,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK;AAAA,MAC3F,EAAE,MAAM,KAAK,EAAE,oBAAoB,CAAC,IAAI,OAAO,SAAS;AAAA,MACxD,IAAI,UAAU,sFAAgB;AAAA,MAC9B,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAO,KAAK;AAAA,MAC9C,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,OAAO;AAAA,IACpD;AACA,uBAAmB;AACnB,UAAMC,UAAS,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,GAAG,SAAAD,UAAS,MAAM,OAAO,OAAO,YAAY,CAAC;AAC1G,QAAIC,YAAW,KAAM,QAAO;AAC5B,QAAIA,YAAW,OAAQ,QAAO;AAC9B,QAAIA,YAAW,UAAU;AACvB,aAAO,eAAe,QAAQ;AAAA,IAChC;AACA,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,UAA8D,cAAc,IAAI,CAAC,SAAS;AAC9F,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,SAAU,aAAa,KAAK,EAAE,kBAAkB,CAAC,MAAM;AAC7D,WAAO;AAAA,MACL,MAAM,KAAK,mBAAmB,KAAK,IAAI,CAAC,GAAG,KAAK,UAAU,MAAM,KAAK,OAAO,MAAM,EAAE,GAAG,MAAM;AAAA,MAC7F,OAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACD,UAAQ,KAAK,IAAI,UAAU,sFAAgB,CAAC;AAC5C,UAAQ,KAAK,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAO,KAAK,CAAC;AAC5D,UAAQ,KAAK,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,OAAO,CAAC;AAEhE,qBAAmB;AACnB,QAAM,SAAS,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,GAAG,SAAS,SAAS,UAAU,MAAM,OAAO,OAAO,YAAY,CAAC;AAC7H,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO;AACT;AAEA,eAAe,eAAe,UAAkE;AAC9F,QAAM,UAA8D;AAAA,IAClE,GAAG,CAAC,YAAY,UAAU,QAAQ,UAAU,SAAS,EAAE,IAAI,CAAC,UAAU;AAAA,MACpE,MAAM,KAAK,mBAAmB,IAAc,CAAC;AAAA,MAC7C,OAAO;AAAA,IACT,EAAE;AAAA,IACF,IAAI,UAAU,sFAAgB;AAAA,IAC9B,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAO,KAAK;AAAA,IAC9C,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,OAAO;AAAA,EACpD;AACA,qBAAmB;AACnB,QAAM,SAAS,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,GAAG,SAAS,SAAS,UAAU,MAAM,OAAO,OAAO,YAAY,CAAC;AAC7H,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO;AACT;AAEA,eAAsB,UAAU,WAA+E;AAC7G,gBAAc,EAAE,qBAAqB,CAAC;AAEtC,QAAM,UAA8D;AAAA,IAClE,EAAE,MAAM,oBAAe,EAAE,uBAAuB,CAAC,IAAI,OAAO,UAAU;AAAA,IACtE,EAAE,MAAM,mBAAc,EAAE,sBAAsB,CAAC,IAAI,OAAO,SAAS;AAAA,IACnE,IAAI,UAAU,sFAAgB;AAAA,IAC9B,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAO,KAAK;AAAA,IAC9C,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,OAAO;AAAA,EACpD;AACA,qBAAmB;AACnB,QAAM,SAAS,MAAM,OAAO;AAAA,IAC1B,SAAS,EAAE,qBAAqB;AAAA,IAChC;AAAA,IACA,SAAS,aAAa;AAAA,IACtB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AACD,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO;AACT;AAEA,eAAe,YAAY,MAAc,OAAsE;AAC7G,gBAAc,EAAE,qBAAqB,CAAC;AAEtC,QAAM,UAAU,cAAc;AAC9B,QAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,QAAM,YAAY,iBAAiB,UAAU;AAC7C,QAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEzD,QAAM,UAAgF,QAAQ,IAAI,CAAC,MAAM;AACvG,UAAM,cAAc,aAAa,IAAI,EAAE,EAAE;AACzC,UAAM,SAAU,cAAc,KAAK,EAAE,0BAA0B,CAAC,MAAM;AACtE,WAAO;AAAA,MACL,MAAM,GAAG,EAAE,WAAW,GAAG,MAAM,WAAM,EAAE,WAAW;AAAA,MAClD,OAAO,EAAE;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACD,qBAAmB,IAAI;AACvB,QAAM,WAAW,MAAM,SAAS;AAAA,IAC9B,SAAS,EAAE,uBAAuB;AAAA,IAClC;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,YAAY;AAGlB,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B,SAAS,EAAE,qBAAqB;AAAA,MAChC,SAAS;AAAA,QACP,IAAI,UAAU,sFAAgB;AAAA,QAC9B,EAAE,MAAM,QAAQ,EAAE,yBAAyB,GAAG,OAAO,OAAO;AAAA,QAC5D,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,SAAS;AAAA,MACtD;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AACD,QAAI,WAAW,OAAQ,QAAO;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,YACb,MACA,OACA,SAC6C;AAC7C,gBAAc,EAAE,qBAAqB,CAAC;AAEtC,QAAM,aAAa,cAAc;AACjC,QAAM,kBAAkB,QAAQ,IAAI,CAAC,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAE/E,QAAM,cAAc,cAAc,MAAM,KAAK;AAC7C,QAAM,WAAW,mBAAmB,IAAI;AACxC,QAAM,YAAY,UAAU,YAAY,YAAY;AACpD,SAAO,KAAK,EAAE,+BAA+B,EAAE,QAAQ,WAAWC,OAAM,KAAK,OAAO,QAAQ,MAAM,CAAC,CAAC,EAAE,QAAQ,UAAUA,OAAM,MAAM,QAAQ,CAAC,EAAE,QAAQ,WAAWA,OAAM,KAAK,SAAS,CAAC,CAAC;AACxL,SAAO,KAAK,GAAG,EAAE,qBAAqB,CAAC,KAAKA,OAAM,KAAK,WAAW,CAAC,EAAE;AACrE,aAAW,UAAU,iBAAiB;AACpC,QAAI,QAAQ;AACV,aAAO,KAAK,YAAOA,OAAM,KAAK,OAAO,WAAW,CAAC,EAAE;AAAA,IACrD;AAAA,EACF;AACA,SAAO,MAAM;AAEb,QAAM,UAA8D;AAAA,IAClE,EAAE,MAAM,OAAO,EAAE,gBAAgB,GAAG,OAAO,UAAU;AAAA,IACrD,IAAI,UAAU,sFAAgB;AAAA,IAC9B,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAO,KAAK;AAAA,IAC9C,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,OAAO;AAAA,EACpD;AACA,qBAAmB;AACnB,QAAM,SAAS,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,GAAG,SAAS,MAAM,OAAO,OAAO,YAAY,CAAC;AACtG,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO;AACT;;;ASrRA,SAAS,cAAAC,aAAY,aAAAC,YAA0B,gBAAAC,qBAAoB;AACnE,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,SAAAC,cAAa;AACtB,SAAS,SAASC,kBAAiB;;;ACJnC,SAAS,cAAAC,aAAY,eAAAC,cAAa,gBAAAC,eAAc,UAAU,iBAAAC,gBAAe,aAAAC,kBAAiB;AAC1F,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,SAASC,kBAAiB;AAGnC,IAAMC,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,SAAQH,WAAU;AAepC,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,iBAAgE;AACvE,QAAM,aAAaI,MAAKF,YAAW,UAAU,iBAAiB;AAC9D,MAAI;AACF,UAAM,SAASG,WAAUC,cAAa,YAAY,OAAO,CAAC;AAC1D,WAAO;AAAA,MACL,WAAW,OAAO,YAAY,CAAC,OAAO,SAAS,SAAS,SAAS,SAAS;AAAA,MAC1E,YAAY,OAAO,cAAc,CAAC,oBAAoB,mBAAmB;AAAA,IAC3E;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,WAAW,CAAC,OAAO,SAAS,SAAS,SAAS,SAAS;AAAA,MACvD,YAAY,CAAC,oBAAoB,mBAAmB;AAAA,IACtD;AAAA,EACF;AACF;AAEA,IAAM,aAAa,eAAe;AAClC,IAAM,kBAAkB,WAAW;AACnC,IAAM,mBAAmB,WAAW;AAE7B,SAAS,WAAW,UAAkC;AAC3D,QAAM,SAAyB,CAAC;AAChC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,OAAO,iBAAiB;AACjC,UAAM,WAAWF,MAAK,UAAU,GAAG;AACnC,QAAI,CAACG,YAAW,QAAQ,EAAG;AAC3B,kBAAc,UAAU,UAAU,KAAK,QAAQ,IAAI;AAAA,EACrD;AAEA,aAAW,aAAa,kBAAkB;AACxC,UAAM,eAAeH,MAAK,UAAU,SAAS;AAC7C,QAAI,CAACG,YAAW,YAAY,EAAG;AAE/B,eAAW,UAAU,YAAY,YAAY,GAAG;AAC9C,YAAM,aAAaH,MAAK,cAAc,MAAM;AAC5C,UAAI,CAAC,YAAY,UAAU,EAAG;AAE9B,YAAM,YAAYA,MAAK,YAAY,QAAQ;AAC3C,UAAIG,YAAW,SAAS,GAAG;AACzB,sBAAc,WAAW,UAAU,GAAG,SAAS,IAAI,MAAM,WAAW,QAAQ,IAAI;AAAA,MAClF;AAEA,YAAM,WAAWH,MAAK,YAAY,OAAO;AACzC,UAAIG,YAAW,QAAQ,GAAG;AACxB,sBAAc,UAAU,UAAU,GAAG,SAAS,IAAI,MAAM,UAAU,QAAQ,IAAI;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAgE;AAC/F,MAAI;AACF,UAAM,UAAUD,cAAa,UAAU,OAAO;AAC9C,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAI,MAAM,CAAC,EAAE,KAAK,MAAM,MAAO,QAAO;AAEtC,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,MAAM,CAAC,EAAE,KAAK,MAAM,OAAO;AAC7B,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,GAAI,QAAO;AAE5B,UAAM,YAAY,MAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,OAAK,EAAE,QAAQ,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI;AACnF,UAAM,SAASD,WAAU,SAAS;AAElC,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,SAAU,QAAO;AAE5D,WAAO;AAAA,MACL,MAAM,OAAO,KAAK,KAAK;AAAA,MACvB,cAAc,OAAO,eAAe,IAAI,KAAK;AAAA,IAC/C;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,UAA0B;AACzD,MAAI;AACF,UAAM,WAAWD,MAAK,UAAU,QAAQ,MAAM;AAC9C,QAAI,CAACG,YAAW,QAAQ,EAAG,QAAO;AAElC,UAAM,cAAcD,cAAa,UAAU,OAAO,EAAE,KAAK;AACzD,QAAI,YAAY,WAAW,OAAO,GAAG;AACnC,YAAM,UAAUF,MAAK,UAAU,QAAQ,YAAY,MAAM,CAAC,CAAC;AAC3D,UAAIG,YAAW,OAAO,GAAG;AACvB,eAAOD,cAAa,SAAS,OAAO,EAAE,KAAK;AAAA,MAC7C;AAEA,YAAM,iBAAiBF,MAAK,UAAU,QAAQ,aAAa;AAC3D,UAAIG,YAAW,cAAc,GAAG;AAC9B,cAAM,aAAaD,cAAa,gBAAgB,OAAO;AACvD,cAAM,UAAU,YAAY,MAAM,CAAC;AACnC,cAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,mBAAO,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAkC;AAChD,MAAI;AACF,UAAM,YAAY,aAAa;AAC/B,QAAI,CAACC,YAAW,SAAS,EAAG,QAAO;AAEnC,UAAM,UAAUD,cAAa,WAAW,OAAO;AAC/C,UAAM,QAAQ,KAAK,MAAM,OAAO;AAEhC,QAAI,CAAC,MAAM,UAAU,CAAC,MAAM,UAAW,QAAO;AAE9C,UAAM,MAAM,KAAK,IAAI,IAAI,MAAM;AAC/B,QAAI,MAAM,KAAK,KAAK,KAAK,IAAM,QAAO;AAEtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,OAAwB;AACrD,MAAI;AACF,UAAM,YAAY,aAAa;AAC/B,UAAM,WAAWH,SAAQ,SAAS;AAClC,QAAI,CAACI,YAAW,QAAQ,GAAG;AACzB,MAAAC,WAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC;AACA,IAAAC,eAAc,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,EACzD,QAAQ;AAAA,EACR;AACF;AAEA,SAAS,eAAuB;AAC9B,SAAOL,MAAK,oBAAoB,GAAG,iBAAiB;AACtD;AAEA,SAAS,cACP,SACA,UACA,cACA,QACA,MACM;AAEN,QAAM,cAAcA,MAAK,SAAS,UAAU;AAC5C,MAAIG,YAAW,WAAW,GAAG;AAC3B,UAAM,cAAc,iBAAiB,WAAW;AAChD,QAAI,eAAe,CAAC,KAAK,IAAI,YAAY,IAAI,GAAG;AAC9C,WAAK,IAAI,YAAY,IAAI;AACzB,aAAO,KAAK;AAAA,QACV,IAAI,YAAY;AAAA,QAChB,aAAa,YAAY;AAAA,QACzB,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAEA,aAAW,SAAS,YAAY,OAAO,GAAG;AACxC,UAAM,WAAWH,MAAK,SAAS,KAAK;AAEpC,QAAI,aAAa,IAAI,KAAK,EAAG;AAE7B,QAAI,CAAC,YAAY,QAAQ,EAAG;AAE5B,UAAM,UAAUA,MAAK,UAAU,UAAU;AACzC,QAAIG,YAAW,OAAO,GAAG;AACvB,YAAM,cAAc,iBAAiB,OAAO;AAC5C,UAAI,eAAe,CAAC,KAAK,IAAI,YAAY,IAAI,GAAG;AAC9C,aAAK,IAAI,YAAY,IAAI;AACzB,eAAO,KAAK;AAAA,UACV,IAAI,YAAY;AAAA,UAChB,aAAa,YAAY;AAAA,UACzB,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,kBAAc,UAAU,UAAU,cAAc,QAAQ,IAAI;AAAA,EAC9D;AACF;AAEA,SAAS,YAAY,KAAuB;AAC1C,MAAI;AACF,WAAOG,aAAY,GAAG;AAAA,EACxB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,YAAY,MAAuB;AAC1C,MAAI;AACF,WAAO,SAAS,IAAI,EAAE,YAAY;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACnPA,IAAM,gBAAgD;AAAA,EACpD,EAAE,IAAI,aAAa,MAAM,iCAAQ;AAAA,EACjC,EAAE,IAAI,aAAa,MAAM,iCAAQ;AAAA,EACjC,EAAE,IAAI,SAAS,MAAM,iCAAQ;AAAA,EAC7B,EAAE,IAAI,WAAW,MAAM,iCAAQ;AAAA,EAC/B,EAAE,IAAI,WAAW,MAAM,uBAAa;AAAA,EACpC,EAAE,IAAI,SAAS,MAAM,qBAAW;AAAA,EAChC,EAAE,IAAI,YAAY,MAAM,wBAAc;AAAA,EACtC,EAAE,IAAI,UAAU,MAAM,sBAAY;AAAA,EAClC,EAAE,IAAI,SAAS,MAAM,uCAAS;AAAA,EAC9B,EAAE,IAAI,SAAS,MAAM,qBAAM;AAAA,EAC3B,EAAE,IAAI,YAAY,MAAM,2BAAO;AAAA,EAC/B,EAAE,IAAI,SAAS,MAAM,sBAAY;AACnC;AAEA,IAAI,gBAA8B,CAAC;AACnC,IAAI,cAAc;AAEX,SAAS,aAAa,SAA+B;AAC1D,kBAAgB,QAAQ,IAAI,CAAC,OAAO;AAAA,IAClC,IAAI,EAAE;AAAA,IACN,aAAa,EAAE;AAAA,IACf,QAAQ,EAAE;AAAA,EACZ,EAAE;AACF,gBAAc;AAChB;AAMA,IAAM,0BAA2C;AAAA,EAC/C;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,YAAY,aAAa,0EAAmB,QAAQ,MAAM;AAAA,MAChE,EAAE,IAAI,8BAA8B,aAAa,4CAAc,QAAQ,MAAM;AAAA,MAC7E,EAAE,IAAI,yBAAyB,aAAa,uDAAyB,QAAQ,MAAM;AAAA,MACnF,EAAE,IAAI,uBAAuB,aAAa,2DAAmB,QAAQ,MAAM;AAAA,MAC3E,EAAE,IAAI,oBAAoB,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACjE,EAAE,IAAI,sCAAsC,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACnF,EAAE,IAAI,iCAAiC,aAAa,yCAAqB,QAAQ,MAAM;AAAA,MACvF,EAAE,IAAI,0BAA0B,aAAa,6DAAqB,QAAQ,MAAM;AAAA,MAChF,EAAE,IAAI,gBAAgB,aAAa,yDAAsB,QAAQ,MAAM;AAAA,IACzE;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,qBAAqB,aAAa,mEAAsB,QAAQ,MAAM;AAAA,MAC5E,EAAE,IAAI,kBAAkB,aAAa,+DAAkB,QAAQ,MAAM;AAAA,MACrE,EAAE,IAAI,iBAAiB,aAAa,kDAAe,QAAQ,MAAM;AAAA,MACjE,EAAE,IAAI,iBAAiB,aAAa,wDAA0B,QAAQ,MAAM;AAAA,MAC5E,EAAE,IAAI,sBAAsB,aAAa,+CAA2B,QAAQ,MAAM;AAAA,MAClF,EAAE,IAAI,sBAAsB,aAAa,kEAAoC,QAAQ,MAAM;AAAA,IAC7F;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,2BAA2B,aAAa,uEAAgB,QAAQ,MAAM;AAAA,MAC5E,EAAE,IAAI,yBAAyB,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,uBAAuB,aAAa,oEAAuB,QAAQ,MAAM;AAAA,MAC/E,EAAE,IAAI,yBAAyB,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,+BAA+B,aAAa,4CAAc,QAAQ,QAAQ;AAAA,MAChF,EAAE,IAAI,6BAA6B,aAAa,8DAAiB,QAAQ,QAAQ;AAAA,MACjF,EAAE,IAAI,gCAAgC,aAAa,4CAAwB,QAAQ,QAAQ;AAAA,MAC3F,EAAE,IAAI,6CAA6C,aAAa,0DAAuB,QAAQ,QAAQ;AAAA,IACzG;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,uBAAuB,aAAa,8CAAW,QAAQ,MAAM;AAAA,MACnE,EAAE,IAAI,sBAAsB,aAAa,uDAAe,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,qBAAqB,aAAa,2CAAa,QAAQ,MAAM;AAAA,MACnE,EAAE,IAAI,2BAA2B,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACxE,EAAE,IAAI,sBAAsB,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACnE,EAAE,IAAI,2BAA2B,aAAa,qCAAiB,QAAQ,MAAM;AAAA,MAC7E,EAAE,IAAI,mBAAmB,aAAa,iDAAmB,QAAQ,MAAM;AAAA,MACvE,EAAE,IAAI,sBAAsB,aAAa,mCAAe,QAAQ,MAAM;AAAA,IACxE;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,kCAAkC,aAAa,+CAAiB,QAAQ,MAAM;AAAA,MACpF,EAAE,IAAI,oCAAoC,aAAa,0DAAa,QAAQ,MAAM;AAAA,MAClF,EAAE,IAAI,4CAA4C,aAAa,8CAAW,QAAQ,MAAM;AAAA,MACxF,EAAE,IAAI,4CAA4C,aAAa,8CAAW,QAAQ,MAAM;AAAA,MACxF,EAAE,IAAI,+BAA+B,aAAa,8CAA0B,QAAQ,MAAM;AAAA,MAC1F,EAAE,IAAI,+BAA+B,aAAa,wDAAqB,QAAQ,MAAM;AAAA,MACrF,EAAE,IAAI,8BAA8B,aAAa,6CAAe,QAAQ,MAAM;AAAA,MAC9E,EAAE,IAAI,8BAA8B,aAAa,iCAAuB,QAAQ,MAAM;AAAA,MACtF,EAAE,IAAI,qBAAqB,aAAa,oCAAgB,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,sBAAsB,aAAa,oCAAgB,QAAQ,MAAM;AAAA,MACvE,EAAE,IAAI,wBAAwB,aAAa,oCAAgB,QAAQ,MAAM;AAAA,MACzE,EAAE,IAAI,oBAAoB,aAAa,yCAA0B,QAAQ,UAAU;AAAA,MACnF,EAAE,IAAI,2BAA2B,aAAa,wDAAqB,QAAQ,kDAAkD;AAAA,MAC7H,EAAE,IAAI,gCAAgC,aAAa,8CAAW,QAAQ,uCAAuC;AAAA,MAC7G,EAAE,IAAI,mBAAmB,aAAa,wCAAoB,QAAQ,0CAA0C;AAAA,IAC9G;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,2BAA2B,aAAa,sEAAe,QAAQ,MAAM;AAAA,MAC3E,EAAE,IAAI,qBAAqB,aAAa,wDAAgB,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,mBAAmB,aAAa,oDAAY,QAAQ,MAAM;AAAA,MAChE,EAAE,IAAI,yBAAyB,aAAa,+CAAiB,QAAQ,MAAM;AAAA,MAC3E,EAAE,IAAI,oBAAoB,aAAa,0DAAa,QAAQ,MAAM;AAAA,MAClE,EAAE,IAAI,yBAAyB,aAAa,wCAAU,QAAQ,MAAM;AAAA,MACpE,EAAE,IAAI,2BAA2B,aAAa,wCAAU,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,sBAAsB,aAAa,8CAAW,QAAQ,MAAM;AAAA,IACpE;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,sBAAsB,aAAa,0DAAa,QAAQ,MAAM;AAAA,MACpE,EAAE,IAAI,2BAA2B,aAAa,0DAAa,QAAQ,MAAM;AAAA,MACzE,EAAE,IAAI,+BAA+B,aAAa,yCAAqB,QAAQ,MAAM;AAAA,MACrF,EAAE,IAAI,oCAAoC,aAAa,6CAAyB,QAAQ,MAAM;AAAA,MAC9F,EAAE,IAAI,sBAAsB,aAAa,oDAAY,QAAQ,MAAM;AAAA,MACnE,EAAE,IAAI,uBAAuB,aAAa,0DAAa,QAAQ,MAAM;AAAA,MACrE,EAAE,IAAI,2BAA2B,aAAa,gEAAc,QAAQ,MAAM;AAAA,MAC1E,EAAE,IAAI,8BAA8B,aAAa,0DAAa,QAAQ,MAAM;AAAA,MAC5E,EAAE,IAAI,mBAAmB,aAAa,0DAAa,QAAQ,MAAM;AAAA,IACnE;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,yBAAyB,aAAa,0DAAa,QAAQ,MAAM;AAAA,MACvE,EAAE,IAAI,sBAAsB,aAAa,wCAAU,QAAQ,MAAM;AAAA,MACjE,EAAE,IAAI,oBAAoB,aAAa,+CAAiB,QAAQ,MAAM;AAAA,MACtE,EAAE,IAAI,sBAAsB,aAAa,0DAAa,QAAQ,MAAM;AAAA,MACpE,EAAE,IAAI,4BAA4B,aAAa,+CAAiB,QAAQ,MAAM;AAAA,IAChF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,wBAAwB,aAAa,0DAAa,QAAQ,QAAQ;AAAA,MACxE,EAAE,IAAI,iCAAiC,aAAa,4DAAoB,QAAQ,QAAQ;AAAA,MACxF,EAAE,IAAI,6BAA6B,aAAa,wCAAU,QAAQ,QAAQ;AAAA,MAC1E,EAAE,IAAI,uBAAuB,aAAa,0CAAsB,QAAQ,QAAQ;AAAA,MAChF,EAAE,IAAI,sBAAsB,aAAa,kDAAoB,QAAQ,QAAQ;AAAA,MAC7E,EAAE,IAAI,0BAA0B,aAAa,gDAAuB,QAAQ,QAAQ;AAAA,MACpF,EAAE,IAAI,4BAA4B,aAAa,wCAAU,QAAQ,QAAQ;AAAA,MACzE,EAAE,IAAI,wBAAwB,aAAa,wCAAU,QAAQ,QAAQ;AAAA,MACrE,EAAE,IAAI,2BAA2B,aAAa,4BAAkB,QAAQ,QAAQ;AAAA,MAChF,EAAE,IAAI,+BAA+B,aAAa,4CAAc,QAAQ,QAAQ;AAAA,MAChF,EAAE,IAAI,6BAA6B,aAAa,8DAAiB,QAAQ,QAAQ;AAAA,IACnF;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,+BAA+B,aAAa,wCAAoB,QAAQ,QAAQ;AAAA,MACtF,EAAE,IAAI,8BAA8B,aAAa,4CAAwB,QAAQ,QAAQ;AAAA,MACzF,EAAE,IAAI,gCAAgC,aAAa,gCAAY,QAAQ,QAAQ;AAAA,MAC/E,EAAE,IAAI,6CAA6C,aAAa,8CAAW,QAAQ,QAAQ;AAAA,MAC3F,EAAE,IAAI,6CAA6C,aAAa,8CAAW,QAAQ,QAAQ;AAAA,MAC3F,EAAE,IAAI,2CAA2C,aAAa,4BAAQ,QAAQ,QAAQ;AAAA,MACtF,EAAE,IAAI,0BAA0B,aAAa,0DAAa,QAAQ,QAAQ;AAAA,IAC5E;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,EAAE,IAAI,sBAAsB,aAAa,oDAAsB,QAAQ,QAAQ;AAAA,MAC/E,EAAE,IAAI,qBAAqB,aAAa,gDAAuB,QAAQ,QAAQ;AAAA,MAC/E,EAAE,IAAI,yBAAyB,aAAa,gDAAuB,QAAQ,QAAQ;AAAA,MACnF,EAAE,IAAI,mBAAmB,aAAa,gDAAkB,QAAQ,QAAQ;AAAA,MACxE,EAAE,IAAI,0BAA0B,aAAa,8CAAgB,QAAQ,QAAQ;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,IAAM,eAAuC,CAAC;AAC9C,WAAW,OAAO,yBAAyB;AACzC,aAAW,SAAS,IAAI,QAAQ;AAC9B,iBAAa,MAAM,EAAE,IAAI,IAAI;AAAA,EAC/B;AACF;AAEA,SAAS,kBAAgC;AACvC,MAAI,YAAa,QAAO,YAAY,aAAa;AACjD,SAAO,YAAY,wBAAwB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;AACrE;AAEA,SAAS,YAAY,QAAoC;AACvD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAuB,CAAC;AAC9B,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,KAAK,IAAI,MAAM,EAAE,GAAG;AACvB,aAAO,KAAK,KAAK;AACjB,WAAK,IAAI,MAAM,EAAE;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAU,OAAuC;AAC/D,QAAM,aAAa,MAAM,YAAY,EAAE,KAAK;AAC5C,QAAM,OAAO,gBAAgB;AAC7B,SAAO,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAC7C;AAEO,SAAS,eAA6B;AAC3C,SAAO,gBAAgB;AACzB;AAMO,SAAS,mBAAoC;AAClD,QAAM,SAAS,gBAAgB;AAC/B,SAAO,cAAc,IAAI,CAAC,SAAS;AAAA,IACjC,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,QAAQ,OAAO,OAAO,CAAC,MAAM;AAC3B,YAAM,QAAQ,aAAa,EAAE,EAAE;AAC/B,UAAI,MAAO,QAAO,UAAU,IAAI;AAChC,aAAO,IAAI,OAAO;AAAA,IACpB,CAAC;AAAA,EACH,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,SAAS,CAAC;AAC3C;;;AFhPA,IAAMC,cAAaC,eAAc,YAAY,GAAG;AAChD,IAAMC,aAAYC,SAAQH,WAAU;AAEpC,SAAS,cAAsB;AAC7B,MAAI,QAAQ,IAAI,kBAAkB;AAChC,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,QAAM,aAAaI,MAAKF,YAAW,UAAU,iBAAiB;AAC9D,MAAI;AACF,UAAM,SAASG,WAAUC,cAAa,YAAY,OAAO,CAAC;AAC1D,WAAO,OAAO,YAAY,OAAO;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,WAAW,YAAY;AAEtB,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EAER,YAAY,YAAqB;AAC/B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,aAA8B;AAClC,QAAI,KAAK,YAAY,KAAK,YAAY,KAAK,QAAQ,GAAG;AACpD,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,KAAK,YAAY,GAAG,GAAG;AACzB,WAAK,WAAW;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,QAAQ,IAAI;AAC5B,QAAI,WAAW,KAAK,YAAY,OAAO,GAAG;AACxC,WAAK,WAAW;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,mBAAmB;AACtC,QAAI,KAAK,YAAY,UAAU,GAAG;AAChC,WAAK,WAAW;AAChB,aAAO;AAAA,IACT;AAEA,WAAO,MAAM,KAAK,UAAU;AAAA,EAC9B;AAAA,EAEA,MAAM,oBAAqC;AACzC,UAAM,WAAW,MAAM,KAAK,WAAW;AAEvC,UAAM,QAAQ,cAAc;AAC5B,QAAI,SAAS,MAAM,eAAe,iBAAiB,QAAQ,GAAG;AAC5D,mBAAa,MAAM,MAAM;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,WAAW,QAAQ;AAClC,iBAAa,MAAM;AAEnB,mBAAe;AAAA,MACb;AAAA,MACA,YAAY,iBAAiB,QAAQ;AAAA,MACrC,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,WAAW,MAAM,KAAK,WAAW;AACvC,QAAI;AACF,YAAMC,OAAM,OAAO,CAAC,QAAQ,SAAS,GAAG,EAAE,KAAK,UAAU,SAAS,IAAM,CAAC;AAAA,IAC3E,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,cAAsB;AACpB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,YAAY,MAAuB;AACzC,QAAI,CAACC,YAAW,IAAI,EAAG,QAAO;AAC9B,UAAM,SAASJ,MAAK,MAAM,MAAM;AAChC,UAAM,aAAaA,MAAK,MAAM,kBAAkB;AAChD,WAAOI,YAAW,MAAM,KAAKA,YAAW,UAAU;AAAA,EACpD;AAAA,EAEA,MAAc,YAA6B;AACzC,UAAM,YAAY,oBAAoB;AACtC,QAAI,CAACA,YAAW,SAAS,GAAG;AAC1B,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAEA,UAAM,aAAa,mBAAmB;AACtC,QAAID,YAAW,UAAU,GAAG;AAC1B,UAAI,KAAK,YAAY,UAAU,GAAG;AAChC,aAAK,WAAW;AAChB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,YAAMD;AAAA,QACJ;AAAA,QACA,CAAC,SAAS,WAAW,KAAK,UAAU,UAAU;AAAA,QAC9C,EAAE,SAAS,KAAO;AAAA,MACpB;AACA,WAAK,WAAW;AAChB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,YAAwC;AAC9E,SAAO,IAAI,kBAAkB,UAAU;AACzC;;;AG7IA,SAAS,cAAAG,mBAAkB;AAC3B,SAAS,QAAAC,cAAY;AACrB,SAAS,SAAAC,cAAa;;;ACFtB,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,gBAAe,WAAW,kBAAkB;AAC1F,SAAS,QAAAC,aAAY;AAsBrB,SAAS,iBAAyB;AAChC,SAAOC,MAAK,oBAAoB,GAAG,UAAU;AAC/C;AAEO,SAAS,cAAc,UAA0B;AACtD,SAAOA,MAAK,eAAe,GAAG,GAAG,QAAQ,OAAO;AAClD;AAEO,SAAS,WAAW,UAAwC;AACjE,QAAM,aAAa,cAAc,QAAQ;AACzC,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,QAA6B;AACvD,QAAM,cAAc,eAAe;AACnC,MAAI,CAACD,YAAW,WAAW,GAAG;AAC5B,IAAAE,WAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAEA,QAAM,aAAa,cAAc,OAAO,QAAQ;AAChD,EAAAC,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACpE;AAEO,SAAS,aAAa,UAAwB;AACnD,QAAM,aAAa,cAAc,QAAQ;AACzC,MAAIH,YAAW,UAAU,GAAG;AAC1B,eAAW,UAAU;AAAA,EACvB;AACF;AAEO,SAAS,mBACd,UACA,aACA,MACA,OACA,aACA,YACA,UACe;AACf,QAAM,QAAkB,CAAC;AACzB,QAAM,cAAwB,CAAC;AAE/B,MAAI,UAAU;AACZ,UAAM,YAAYD,MAAK,YAAY,QAAQ;AAC3C,QAAIC,YAAW,SAAS,GAAG;AACzB,kBAAY,KAAK,SAAS;AAC1B,iBAAW,aAAa,SAAS,oBAAoB,CAAC,GAAG;AACvD,cAAM,YAAYD,MAAK,WAAW,SAAS;AAC3C,YAAIC,YAAW,SAAS,KAAK,UAAU,SAAS,GAAG;AACjD,gBAAM,KAAK,SAAS;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAYD,MAAK,YAAY,QAAQ;AAC3C,QAAIC,YAAW,SAAS,GAAG;AACzB,kBAAY,KAAK,SAAS;AAC1B,iBAAW,aAAa,SAAS,oBAAoB,CAAC,GAAG;AACvD,cAAM,YAAYD,MAAK,WAAW,SAAS;AAC3C,cAAM,cAAcA,MAAK,WAAW,YAAY,KAAK;AACrD,YAAIC,YAAW,SAAS,KAAK,UAAU,SAAS,GAAG;AACjD,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAWA,YAAW,WAAW,KAAK,UAAU,WAAW,GAAG;AAC5D,gBAAM,KAAK,WAAW;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgBD,MAAK,YAAY,WAAW;AAClD,MAAI,UAAU,aAAa,GAAG;AAC5B,UAAM,KAAK,aAAa;AAAA,EAC1B;AAEA,QAAM,eAAeA,MAAK,YAAY,uBAAuB;AAC7D,MAAIC,YAAW,YAAY,GAAG;AAC5B,UAAM,KAAK,YAAY;AAAA,EACzB;AAEA,QAAM,qBAAqBD,MAAK,YAAY,GAAG,QAAQ,gBAAgB;AACvE,MAAIC,YAAW,kBAAkB,GAAG;AAClC,UAAM,KAAK,kBAAkB;AAAA,EAC/B;AAEA,QAAM,iBAAiB,SAAS,WAAW,cAAc;AACzD,QAAM,iBAAiB,UAAU,YAC7BD,MAAK,aAAa,cAAc,IAChCA,MAAK,YAAY,cAAc;AACnC,MAAIC,YAAW,cAAc,GAAG;AAC9B,UAAM,KAAK,cAAc;AAAA,EAC3B;AAEA,QAAM,YAAY,CAAC,cAAc,SAAS,mBAAmB,sBAAsB,cAAc;AACjG,aAAW,YAAY,WAAW;AAChC,UAAM,eAAeD,MAAK,aAAa,QAAQ;AAC/C,QAAI,UAAU,YAAY,GAAG;AAC3B,YAAM,KAAK,YAAY;AAAA,IACzB;AACA,UAAM,mBAAmBA,MAAK,YAAY,QAAQ;AAClD,QAAI,UAAU,gBAAgB,GAAG;AAC/B,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAAuB;AACxC,MAAI;AACF,WAAO,UAAU,IAAI,EAAE,eAAe;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAiBA,SAAS,qBAA6B;AACpC,SAAOA,MAAK,eAAe,GAAG,aAAa;AAC7C;AAEO,SAAS,kBAAsC;AACpD,QAAM,aAAa,mBAAmB;AACtC,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,UAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,iBAAiB,QAAkC;AACjE,QAAM,cAAc,eAAe;AACnC,MAAI,CAACD,YAAW,WAAW,GAAG;AAC5B,IAAAE,WAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AACA,QAAM,aAAa,mBAAmB;AACtC,EAAAC,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACpE;AAEO,SAAS,kBACd,UACA,MACA,OACA,aACM;AACN,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,OAAO,IAAI,EAAG,QAAO,IAAI,IAAI,CAAC;AACnC,MAAI,CAAC,OAAO,IAAI,EAAE,KAAK,EAAG,QAAO,IAAI,EAAE,KAAK,IAAI,CAAC;AACjD,MAAI,CAAC,OAAO,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG;AACrC,WAAO,IAAI,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE,QAAQ,CAAC,GAAG,aAAa,GAAG;AAAA,EACnE;AACA,QAAM,QAAQ,OAAO,IAAI,EAAE,KAAK,EAAE,WAAW;AAC7C,aAAW,MAAM,UAAU;AACzB,QAAI,CAAC,MAAM,OAAO,SAAS,EAAE,GAAG;AAC9B,YAAM,OAAO,KAAK,EAAE;AAAA,IACtB;AAAA,EACF;AACA,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,mBAAiB,MAAM;AACzB;AAEO,SAAS,uBACd,UACA,MACA,OACA,aACM;AACN,QAAM,SAAS,gBAAgB;AAC/B,MAAI,CAAC,OAAO,IAAI,IAAI,KAAK,IAAI,WAAW,EAAG;AAC3C,QAAM,QAAQ,OAAO,IAAI,EAAE,KAAK,EAAE,WAAW;AAC7C,QAAM,SAAS,MAAM,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;AACjE,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,WAAO,OAAO,IAAI,EAAE,KAAK,EAAE,WAAW;AACtC,QAAI,OAAO,KAAK,OAAO,IAAI,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG;AACjD,aAAO,OAAO,IAAI,EAAE,KAAK;AACzB,UAAI,OAAO,KAAK,OAAO,IAAI,CAAC,EAAE,WAAW,GAAG;AAC1C,eAAO,OAAO,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,mBAAiB,MAAM;AACzB;AAEO,SAAS,mBACd,MACA,OACA,aACU;AACV,QAAM,SAAS,gBAAgB;AAC/B,QAAM,iBAAiB,OAAO,IAAI,IAAI,KAAK,IAAI,WAAW,GAAG,UAAU,CAAC;AAGxE,QAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,QAAM,YAAYJ,MAAK,YAAY,QAAQ;AAE3C,SAAO,eAAe,OAAO,CAAC,YAAY;AACxC,UAAM,YAAYA,MAAK,WAAW,OAAO;AACzC,WAAOC,YAAW,SAAS,KAAK,UAAU,SAAS;AAAA,EACrD,CAAC;AACH;;;AClQA,SAAS,cAAAI,aAAY,cAAc,eAAAC,cAAa,cAAAC,mBAAkB;AAClE,SAAS,QAAAC,cAAY;AAMd,SAAS,kBAAkB,MAAsB;AACtD,SAAO,SAAS,WAAW,cAAc;AAC3C;AAEO,SAAS,oBACd,YACA,MACiD;AACjD,QAAM,WAAW,aAAa,UAAU;AACxC,MAAI,UAAU,MAAM;AAClB,UAAM,SAAS,WAAW,SAAS,IAAI;AACvC,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAaC,OAAK,YAAY,kBAAkB,IAAI,CAAC;AAC3D,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,eAAe;AAClC,aAAW,UAAU,YAAY;AAC/B,QAAI,OAAO,eAAe,cAAc,OAAO,SAAS,MAAM;AAC5D,YAAM,SAAS,WAAW,OAAO,QAAQ;AACzC,UAAI,QAAQ;AACV,eAAO;AAAA,UACL,UAAU,OAAO;AAAA,UACjB,YAAY,OAAO;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aACd,YACA,MACA,cACA,gBACmB;AACnB,QAAM,aAAaD,OAAK,YAAY,kBAAkB,IAAI,CAAC;AAC3D,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,gBAAgB,oBAAI,KAAK,CAAC;AAC5C,QAAM,iBAAiB,GAAG,kBAAkB,IAAI,CAAC,mBAAmB,YAAY,IAAI,SAAS;AAC7F,QAAM,aAAaD,OAAK,YAAY,cAAc;AAElD,MAAI;AACF,iBAAa,YAAY,UAAU;AACnC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,YAAkC;AAC5D,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQC,aAAY,UAAU;AACpC,QAAM,UAAwB,CAAC;AAE/B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,kBAAkB,GAAG;AACrC,YAAM,QAAQ,KAAK,MAAM,kBAAkB;AAC3C,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,kBAAkB,MAAM,CAAC;AAC/B,cAAM,eAAe,gBAAgB,YAAY,GAAG;AACpD,YAAI,eAAe,GAAG;AACpB,gBAAM,WAAW,gBAAgB,UAAU,GAAG,YAAY;AAC1D,gBAAM,YAAY,gBAAgB,UAAU,eAAe,CAAC;AAC5D,gBAAM,SAAS,WAAW,QAAQ;AAElC,kBAAQ,KAAK;AAAA,YACX,UAAUF,OAAK,YAAY,IAAI;AAAA,YAC/B;AAAA,YACA,YAAY,QAAQ,eAAe;AAAA,YACnC,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC;AACxE;AAEO,SAAS,cACd,YACA,YACA,MACS;AACT,MAAI;AACF,UAAM,aAAaA,OAAK,YAAY,kBAAkB,IAAI,CAAC;AAC3D,iBAAa,YAAY,UAAU;AACnC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,YAA6B;AACxD,MAAI;AACF,QAAIC,YAAW,UAAU,GAAG;AAC1B,MAAAE,YAAW,UAAU;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,MAAoB;AAC3C,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,QAAM,QAAQ,OAAO,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,SAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,OAAO,GAAG,OAAO;AAC3D;AAEA,SAAS,iBAAwB;AAC/B,QAAM,UAAiB,CAAC;AACxB,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,YAAY,SAAS;AAC9B,UAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,QAAQ;AACV,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;ACvKA,SAAS,UAAAC,eAAc;AACvB,OAAOC,YAAW;AAIlB,eAAsB,qBACpB,mBACA,eACiC;AACjC,UAAQ,IAAI;AACZ,UAAQ,IAAIC,OAAM,OAAO,mBAAS,EAAE,iBAAiB,CAAC,EAAE,CAAC;AACzD,UAAQ,IAAI;AACZ,UAAQ,IAAI,OAAO,EAAE,gBAAgB,CAAC,KAAKA,OAAM,KAAK,iBAAiB,CAAC,EAAE;AAC1E,UAAQ,IAAI,OAAO,EAAE,mBAAmB,CAAC,KAAKA,OAAM,KAAK,aAAa,CAAC,EAAE;AACzE,UAAQ,IAAI;AACZ,UAAQ,IAAI,OAAO,EAAE,0BAA0B,CAAC,EAAE;AAClD,UAAQ,IAAI,OAAO,EAAE,oBAAoB,CAAC,EAAE;AAC5C,UAAQ,IAAI;AAEZ,QAAM,SAAS,MAAMC,QAAO;AAAA,IAC1B,SAAS,EAAE,sBAAsB;AAAA,IACjC,SAAS;AAAA,MACP,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,YAAY;AAAA,MAClD,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,SAAS;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,eAAsB,kBACpB,SAC0B;AAC1B,UAAQ,IAAI;AACZ,UAAQ,IAAID,OAAM,KAAK,KAAK,EAAE,uBAAuB,CAAC,EAAE,CAAC;AACzD,UAAQ,IAAI;AAEZ,QAAM,UAAU,QAAQ,IAAI,CAAC,OAAO;AAAA,IAClC,MAAM,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,UAAU,KAAK,EAAE,UAAU;AAAA,IAC7D,OAAO,EAAE;AAAA,EACX,EAAE;AAEF,UAAQ,KAAK,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,OAAO,CAAC;AAEhE,QAAM,SAAS,MAAMC,QAAO;AAAA,IAC1B,SAAS,EAAE,sBAAsB;AAAA,IACjC;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AHrCA,eAAsB,cACpB,MACwB;AACxB,QAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ,CAAC,qBAAqB,KAAK,QAAQ,EAAE;AAAA,MAC7C,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,QAAM,aAAaC,OAAK,KAAK,UAAU,OAAO,KAAK,OAAO,MAAM;AAChE,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ,CAAC,qBAAqB,UAAU,EAAE;AAAA,MAC1C,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,KAAK,OAAO,KAAK,IAAI;AACnC,MAAI,KAAK,aAAa;AACpB,SAAK,KAAK,KAAK,WAAW;AAAA,EAC5B;AAEA,QAAM,MAAM,KAAK,eAAe,QAAQ,IAAI;AAE5C,QAAM,aAAa,cAAc,KAAK,MAAM,KAAK,OAAO,KAAK,WAAW;AACxE,QAAM,aAAaD,OAAK,YAAY,kBAAkB,KAAK,IAAI,CAAC;AAChE,MAAI,aAAgC;AAEpC,MAAIC,YAAW,UAAU,GAAG;AAC1B,UAAM,gBAAgB,oBAAoB,YAAY,KAAK,IAAI;AAE/D,QAAI,iBAAiB,cAAc,aAAa,KAAK,UAAU;AAC7D,UAAI,SAAiC;AAErC,UAAI,CAAC,KAAK,KAAK;AACb,iBAAS,MAAM;AAAA,UACb,cAAc;AAAA,UACd,OAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,WAAW,UAAU;AACvB,eAAO,KAAK,EAAE,eAAe,CAAC;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU,KAAK;AAAA,UACf,aAAa;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,CAAC,EAAE,eAAe,CAAC;AAAA,UAC3B,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAEA,mBAAa;AAAA,QACX;AAAA,QACA,KAAK;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,MAChB;AAEA,UAAI,YAAY;AACd,eAAO,QAAQ,GAAG,EAAE,gBAAgB,CAAC,KAAK,WAAW,QAAQ,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,cAAmB;AAAA,MACvB;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B;AAEA,UAAMC,OAAM,QAAQ,CAAC,YAAY,GAAG,IAAI,GAAG,WAAW;AAEtD,UAAM,WAAW,aAAa,UAAU;AAExC,QAAI,cAAc;AAClB,QAAI,cAAc;AAElB,QAAI,UAAU;AACZ,oBAAc,SAAS,kBAAkB,UAAU;AACnD,oBAAc,SAAS,kBAAkB,UAAU;AAAA,IACrD,OAAO;AACL,oBAAc,OAAO;AACrB,oBAAc,OAAO;AAAA,IACvB;AAEA,QAAI;AACF,YAAM,SAAS;AAAA,QACb,KAAK;AAAA,QACL,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,YAAY;AACd,eAAO,SAAS;AAAA,UACd,UAAU,WAAW;AAAA,UACrB,cAAc,WAAW;AAAA,UACzB,gBAAgB,WAAW;AAAA,UAC3B,YAAY,WAAW;AAAA,QACzB;AAAA,MACF;AAEA,kBAAY,MAAM;AAAA,IACpB,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,IACb;AAAA,EACF,SAAS,OAAO;AACd,UAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,QAAQ,CAAC,YAAY;AAAA,MACrB,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF;;;AI7JA,SAAS,cAAAC,cAAY,aAAAC,YAAW,aAAa,cAAAC,aAAY,eAAAC,cAAa,WAAW,cAAc,aAAAC,kBAAiB;AAChH,SAAS,QAAAC,cAAY;AACrB,SAAS,UAAAC,SAAQ,YAAAC,WAAU,aAAAC,kBAAiB;AAC5C,OAAOC,YAAW;AAClB,OAAO,WAAW;AAqBlB,eAAsB,cACpB,UACA,MACA,OACA,UAC+B;AAC/B,QAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,QAAM,YAAYC,OAAK,YAAY,QAAQ;AAC3C,QAAM,cAAc,UAAU,YAAY,QAAQ,IAAI,IAAI;AAE1D,MAAI,CAACC,aAAW,SAAS,GAAG;AAC1B,IAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,UAAgC,CAAC;AACvC,QAAM,eAAyB,CAAC;AAEhC,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,UAAU,OAAO;AAC/B,QAAI,CAAC,OAAO;AACV,cAAQ,KAAK,EAAE,SAAS,SAAS,OAAO,OAAO,8BAA8B,CAAC;AAC9E;AAAA,IACF;AAEA,UAAM,aAAaF,OAAK,UAAU,MAAM,QAAQ,MAAM,EAAE;AACxD,UAAM,aAAaA,OAAK,WAAW,OAAO;AAE1C,QAAI,CAACC,aAAW,UAAU,GAAG;AAC3B,cAAQ,KAAK,EAAE,SAAS,SAAS,OAAO,OAAO,qBAAqB,UAAU,GAAG,CAAC;AAClF;AAAA,IACF;AAEA,QAAI;AACF,UAAIA,aAAW,UAAU,KAAKE,WAAU,UAAU,GAAG;AACnD,QAAAC,YAAW,UAAU;AAAA,MACvB;AACA,kBAAY,aAAa,UAAU,GAAG,UAAU;AAChD,cAAQ,KAAK,EAAE,SAAS,SAAS,KAAK,CAAC;AACvC,mBAAa,KAAK,OAAO;AAAA,IAC3B,SAAS,OAAO;AACd,cAAQ,KAAK,EAAE,SAAS,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,CAAC;AAAA,IAC3G;AAAA,EACF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,sBAAkB,cAAc,MAAM,OAAO,WAAW;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,eAAsB,gBACpB,UACA,MACA,OACiC;AACjC,QAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,QAAM,YAAYJ,OAAK,YAAY,QAAQ;AAC3C,QAAM,cAAc,UAAU,YAAY,QAAQ,IAAI,IAAI;AAE1D,QAAM,UAAkC,CAAC;AACzC,QAAM,aAAuB,CAAC;AAE9B,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAaA,OAAK,WAAW,OAAO;AAE1C,QAAI;AACF,UAAIC,aAAW,UAAU,KAAKE,WAAU,UAAU,GAAG;AACnD,QAAAC,YAAW,UAAU;AACrB,gBAAQ,KAAK,EAAE,SAAS,SAAS,KAAK,CAAC;AACvC,mBAAW,KAAK,OAAO;AACvB,eAAO,KAAK,KAAK,EAAE,wBAAwB,CAAC,KAAK,OAAO,EAAE;AAAA,MAC5D,OAAO;AACL,gBAAQ,KAAK,EAAE,SAAS,SAAS,OAAO,OAAO,gBAAgB,CAAC;AAChE,eAAO,KAAK,GAAG,OAAO,IAAI,EAAE,+BAA+B,CAAC,EAAE;AAAA,MAChE;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,EAAE,SAAS,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,CAAC;AAAA,IAC3G;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,2BAAuB,YAAY,MAAM,OAAO,WAAW;AAAA,EAC7D;AAGA,MAAIH,aAAW,SAAS,GAAG;AACzB,QAAI;AACF,YAAM,UAAUI,aAAY,SAAS;AACrC,UAAI,QAAQ,WAAW,GAAG;AACxB,kBAAU,SAAS;AACnB,eAAO,KAAK,KAAK,EAAE,2BAA2B,CAAC,WAAW;AAAA,MAC5D;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,uBACpB,MACA,OACuC;AACvC,QAAMC,QAAO;AACb,QAAMC,UAAS;AACf,QAAM,aAAa,iBAAiB;AAEpC,MAAI,OAAO;AACX,MAAI,qBAAqB;AAEzB,SAAO,MAAM;AACX,YAAQ,MAAM;AAAA,MACZ,KAAK,GAAG;AACN,sBAAc,EAAE,2BAA2B,CAAC;AAE5C,cAAM,kBAAsE;AAAA,UAC1E,GAAG,WAAW,IAAI,CAAC,SAAS;AAAA,YAC1B,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,MAAM;AAAA,YACzC,OAAO,IAAI;AAAA,UACb,EAAE;AAAA,UACF,IAAIC,WAAU,sFAAgB;AAAA,UAC9B,EAAE,MAAM,QAAQ,EAAE,aAAa,GAAG,OAAOF,MAAK;AAAA,UAC9C,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAOC,QAAO;AAAA,QACpD;AAEA,2BAAmB;AACnB,6BAAqB,MAAME,QAAO;AAAA,UAChC,SAAS,EAAE,uBAAuB;AAAA,UAClC,SAAS;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,QACZ,CAAC;AAED,YAAI,uBAAuBH,MAAM,QAAO;AACxC,YAAI,uBAAuBC,QAAQ,QAAO;AAC1C,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,cAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,kBAAkB;AACnE,YAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,sBAAc,EAAE,2BAA2B,EAAE,QAAQ,cAAc,SAAS,IAAI,CAAC;AAEjF,cAAM,cAAc,UAAU,YAAY,QAAQ,IAAI,IAAI,cAAc,MAAM,KAAK;AACnF,cAAM,kBAAkB,mBAAmB,MAAM,OAAO,WAAW;AACnE,cAAM,eAAe,IAAI,IAAI,eAAe;AAE5C,cAAM,eAAqF,SAAS,OAAO,IAAI,CAAC,UAAU;AACxH,gBAAM,cAAc,aAAa,IAAI,MAAM,EAAE;AAC7C,gBAAM,SAAU,cAAc,KAAK,EAAE,yBAAyB,CAAC,MAAM;AACrE,iBAAO;AAAA,YACL,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,WAAM,MAAM,WAAW;AAAA,YACjD,OAAO,MAAM;AAAA,YACb,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AACD,2BAAmB,IAAI;AACvB,cAAM,iBAAiB,MAAMG,UAAS;AAAA,UACpC,SAAS,EAAE,oBAAoB;AAAA,UAC/B,SAAS;AAAA,UACT,MAAM;AAAA,UACN,cAAc;AAAA,UACd,OAAO;AAAA,UACP,UAAU;AAAA,QACZ,CAAC;AAED,cAAM,WAAW;AAGjB,YAAI,SAAS,WAAW,GAAG;AACzB,gBAAM,SAAS,MAAMD,QAAO;AAAA,YAC1B,SAAS,EAAE,qBAAqB;AAAA,YAChC,SAAS;AAAA,cACP,IAAID,WAAU,sFAAgB;AAAA,cAC9B,EAAE,MAAM,QAAQ,EAAE,yBAAyB,GAAG,OAAO,OAAO;AAAA,cAC5D,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAO,SAAS;AAAA,YACtD;AAAA,YACA,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AACD,cAAI,WAAW,QAAQ;AAAE,mBAAO;AAAG;AAAA,UAAO;AAC1C,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,gBAAsB;AACpC,QAAM,aAAa,iBAAiB;AAEpC,UAAQ,IAAI;AACZ,UAAQ,IAAIG,OAAM,KAAK,KAAK,EAAE,kBAAkB,CAAC,EAAE,CAAC;AACpD,UAAQ,IAAIA,OAAM,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC,CAAC;AAE5C,aAAW,YAAY,YAAY;AACjC,YAAQ,IAAI;AACZ,YAAQ,IAAIA,OAAM,KAAK,KAAK,SAAS,IAAI,EAAE,IAAIA,OAAM,IAAI,KAAK,SAAS,OAAO,MAAM,UAAU,CAAC;AAE/F,UAAM,QAAQ,IAAI,MAAM;AAAA,MACtB,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,MAC9B,WAAW,CAAC,IAAI,EAAE;AAAA,MAClB,UAAU;AAAA,IACZ,CAAC;AAED,eAAW,SAAS,SAAS,QAAQ;AACnC,YAAM,KAAK;AAAA,QACTA,OAAM,KAAK,MAAM,EAAE;AAAA,QACnB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,YAAQ,IAAI,MAAM,SAAS,CAAC;AAAA,EAC9B;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,KAAK,EAAE,mBAAmB,EAAE,QAAQ,WAAW,OAAO,aAAa,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;AACtG,UAAQ,IAAI;AACd;AAEA,SAASR,WAAU,MAAuB;AACxC,MAAI;AACF,WAAOS,WAAU,IAAI,EAAE,eAAe;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACjQA,OAAOC,YAAW;AAClB,OAAOC,YAAW;AAMX,SAAS,gBACd,SACA,WACM;AACN,QAAM,QAAQ,IAAIC,OAAM;AAAA,IACtB,MAAM;AAAA,MACJC,OAAM,KAAK,EAAE,SAAS,CAAC;AAAA,MACvBA,OAAM,KAAK,EAAE,WAAW,CAAC;AAAA,MACzBA,OAAM,KAAK,EAAE,aAAa,CAAC;AAAA,MAC3BA,OAAM,KAAK,EAAE,aAAa,CAAC;AAAA,MAC3BA,OAAM,KAAK,EAAE,aAAa,CAAC;AAAA,IAC7B;AAAA,IACA,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAChC,CAAC;AAED,UAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAM,cAAc,UAAU,IAAI,OAAO,EAAE;AAC3C,UAAM,SAAS,cACXA,OAAM,MAAM,UAAK,EAAE,kBAAkB,CAAC,EAAE,IACxCA,OAAM,IAAI,QAAG;AAEjB,UAAM,KAAK;AAAA,MACT,OAAO,QAAQ,CAAC;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,MACA,OAAO,OAAO,MAAM;AAAA,MACpB,OAAO,OAAO,MAAM;AAAA,IACtB,CAAC;AAAA,EACH,CAAC;AAED,UAAQ,IAAI;AACZ,QAAM,cAAc,EAAE,cAAc;AACpC,UAAQ,IAAIA,OAAM,KAAK,KAAK,EAAE,YAAY,CAAC,KAAK,QAAQ,MAAM,GAAG,cAAc,MAAM,cAAc,EAAE,GAAG,CAAC;AACzG,UAAQ,IAAI,MAAM,SAAS,CAAC;AAC5B,UAAQ,IAAI;AACd;AAEO,SAAS,oBACd,SAOM;AACN,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,QAAM,aAAa,QAAQ;AAE3B,UAAQ,IAAI;AACZ,UAAQ;AAAA,IACNA,OAAM;AAAA,MACJ,KAAK,EAAE,cAAc,CAAC,KAAK,YAAY,IAAI,UAAU,IAAI,EAAE,iBAAiB,CAAC;AAAA,IAC/E;AAAA,EACF;AACA,UAAQ,IAAI;AAEZ,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,SAAS;AAClB,cAAQ;AAAA,QACNA,OAAM,MAAM,UAAK,IACf,IAAI,OAAO,WAAW,KAAK,OAAO,WAAW,YAAY,OAAO,WAAW;AAAA,MAC/E;AAAA,IACF,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,IAAI,OAAO,WAAW,EAAE;AAAA,IACzD;AAAA,EACF;AACA,UAAQ,IAAI;AACd;AAEO,SAAS,qBACd,SAOA,MACA,YACM;AACN,QAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO;AACtD,QAAM,cAAc,eAAe,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC;AAC5E,QAAM,cAAc,eAAe,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC;AAE5E,MAAI,eAAe,WAAW,GAAG;AAC/B;AAAA,EACF;AAEA,QAAM,WAAW,mBAAmB,IAAI;AACxC,QAAM,cAAc,EAAE,cAAc;AACpC,QAAM,QAAQ;AAAA,IACZA,OAAM,KAAK,KAAK,EAAE,cAAc,CAAC,GAAG;AAAA,IACpC;AAAA,IACA,KAAKA,OAAM,IAAI,EAAE,sBAAsB,IAAI,GAAG,CAAC,IAAI,UAAU;AAAA,IAC7D,KAAKA,OAAM,IAAI,EAAE,sBAAsB,IAAI,GAAG,CAAC,IAAI,WAAW,GAAG,cAAc,MAAM,cAAc,EAAE,KAAKA,OAAM,IAAI,GAAG,CAAC,KAAKA,OAAM,IAAI,EAAE,sBAAsB,IAAI,GAAG,CAAC,IAAI,WAAW,GAAG,cAAc,MAAM,cAAc,EAAE;AAAA,IAC7N;AAAA,IACAA,OAAM,KAAK,KAAK,EAAE,6BAA6B,CAAC,GAAG;AAAA,IACnD,OAAOA,OAAM,KAAK,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,KAAKA,OAAM,MAAM,SAAS,YAAY,CAAC,CAAC;AAAA,IAC/F,OAAOA,OAAM,KAAK,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,KAAKA,OAAM,MAAM,EAAE,YAAY,CAAC,CAAC;AAAA,IACrF,OAAOA,OAAM,KAAK,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,KAAKA,OAAM,MAAM,qBAAqB,CAAC;AAAA,IAC5F,OAAOA,OAAM,KAAK,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,KAAKA,OAAM,MAAM,uBAAuB,CAAC;AAAA,IAC/F;AAAA,EACF;AAEA,MAAI,eAAe,WAAW,GAAG;AAC/B,UAAM,SAAS,WAAW,eAAe,CAAC,EAAE,QAAQ;AACpD,UAAM,WAAW,SAAS,GAAG,OAAO,GAAG,mBAAmB,GAAG,eAAe,CAAC,EAAE,QAAQ;AACvF,UAAM;AAAA,MACJ,KAAKA,OAAM,IAAI,EAAE,uBAAuB,CAAC,CAAC,KAAKA,OAAM,IAAI,QAAQ,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,IAAI;AAAA,EAClB;AACA,UAAQ,IAAI;AACd;;;AlBnHA,SAAS,cAAAC,cAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,cAAY;AAMrB,IAAMC,QAAO;AACb,IAAMC,UAAS;AAEf,eAAsB,cAA6B;AACjD,QAAM,MAAM,QAAQ,IAAI;AACxB,MACEC,aAAWC,OAAK,KAAK,cAAc,CAAC,MACnC,MAAM;AACL,QAAI;AACF,YAAM,MAAM,KAAK,MAAMC,cAAaD,OAAK,KAAK,cAAc,GAAG,OAAO,CAAC;AACvE,aAAO,IAAI,SAAS;AAAA,IACtB,QAAQ;AAAE,aAAO;AAAA,IAAO;AAAA,EAC1B,GAAG,GACH;AACA,WAAO,KAAK,EAAE,mBAAmB,CAAC;AAClC,WAAO,KAAK,EAAE,mBAAmB,CAAC;AAClC,WAAO,KAAK,EAAE,sBAAsB,CAAC;AACrC;AAAA,EACF;AAEA,cAAY,EAAE,cAAc,CAAC;AAE7B,QAAM,UAAU,cAAc,EAAE,qBAAqB,CAAC;AACtD,UAAQ,MAAM;AACd,MAAI;AACF,UAAM,cAAc,wBAAwB;AAC5C,UAAM,YAAY,kBAAkB;AACpC,YAAQ,QAAQ,EAAE,8BAA8B,CAAC;AAAA,EACnD,QAAQ;AACN,YAAQ,KAAK,EAAE,4BAA4B,CAAC;AAAA,EAC9C;AAEA,MAAI,OAAO;AACX,MAAI,OAA2B;AAE/B,SAAO,MAAM;AACX,YAAQ,MAAM;AAAA,MACZ,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,WAAW;AAChC,YAAI,WAAW,KAAM;AACrB,eAAO;AACP,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,YAAI,SAAS,UAAU;AACrB,gBAAM,SAAS,MAAM,kBAAkB;AACvC,cAAI,WAAW,QAAQ;AAAE,mBAAO;AAAG;AAAA,UAAO;AAC1C;AAAA,QACF,OAAO;AACL,gBAAM,SAAS,MAAM,iBAAiB;AACtC,cAAI,WAAW,QAAQ;AAAE,mBAAO;AAAG;AAAA,UAAO;AAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,aAAiD;AAC9D,gBAAc,EAAE,0BAA0B,CAAC;AAE3C,QAAMF,UAAS;AACf,QAAM,UAA8D;AAAA,IAClE;AAAA,MACE,MAAM,KAAK,EAAE,oBAAoB,CAAC,WAAM,EAAE,yBAAyB,CAAC;AAAA,MACpE,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM,KAAK,EAAE,mBAAmB,CAAC,WAAM,EAAE,wBAAwB,CAAC;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IACA,IAAII,WAAU,sFAAgB;AAAA,IAC9B,EAAE,MAAM,QAAQ,EAAE,eAAe,GAAG,OAAOJ,QAAO;AAAA,EACpD;AACA,qBAAmB;AACnB,QAAM,SAAS,MAAMK,QAAO;AAAA,IAC1B,SAAS,EAAE,oBAAoB;AAAA,IAC/B;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AACD,MAAI,WAAWL,QAAQ,QAAO;AAC9B,SAAO;AACT;AAEA,eAAe,oBAA8C;AAC3D,QAAM,UAAU,MAAM,UAAU;AAEhC,MAAI,CAAC,QAAQ,WAAW;AACtB,QAAI,QAAQ,KAAM,QAAO;AACzB,WAAO,KAAK,EAAE,gBAAgB,CAAC;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,wBAAwB;AAC5C,QAAM,UAAU,cAAc,EAAE,qBAAqB,CAAC;AACtD,UAAQ,MAAM;AAEd,QAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,UAAQ,QAAQ,EAAE,8BAA8B,CAAC;AAEjD,QAAM,aAAa,cAAc;AACjC,QAAM,kBAAkB,QAAQ,QAAQ;AAAA,IAAI,CAAC,OAC3C,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EACpC;AAEA,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,QAAM,UAAU,CAAC;AAEjB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,QAAQ,KAAK;AAC/C,UAAM,WAAW,QAAQ,QAAQ,CAAC;AAClC,UAAM,SAAS,gBAAgB,CAAC;AAChC,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK;AAEnC,UAAM,gBAAgB,cAAc,GAAG,QAAQ,IAAI,EAAE,kBAAkB,CAAC,IAAI,WAAW,KAAK;AAC5F,kBAAc,MAAM;AAEpB,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,MACf;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS;AAClB,oBAAc;AAAA,QACZ,GAAG,QAAQ,IAAI,WAAW,WAAM,OAAO,WAAW,YAAY,OAAO,WAAW;AAAA,MAClF;AACA,yBAAmB,QAAQ;AAAA,IAC7B,OAAO;AACL,oBAAc;AAAA,QACZ,GAAG,QAAQ,IAAI,WAAW,WAAM,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,QAAM,UAAU,QAAQ,IAAI,CAAC,QAAQ,WAAW;AAAA,IAC9C,UAAU,OAAO;AAAA,IACjB,aAAa,gBAAgB,KAAK,GAAG,eAAe,OAAO;AAAA,IAC3D,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,EACtB,EAAE;AAEF,sBAAoB,OAAO;AAE3B,QAAM,aAAa,cAAc,QAAQ,MAAM,QAAQ,KAAK;AAC5D,uBAAqB,SAAS,QAAQ,MAAM,UAAU;AACtD,SAAO;AACT;AAEA,eAAe,mBAA6C;AAC1D,MAAI,OAAO;AACX,MAAI,OAAe;AACnB,MAAI,QAAsB;AAE1B,SAAO,MAAM;AACX,YAAQ,MAAM;AAAA,MACZ,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,wBAAwB;AAC7C,YAAI,WAAW,OAAQ,QAAO;AAC9B,YAAI,WAAW,UAAU;AACvB,iBAAO,KAAK,EAAE,gBAAgB,CAAC;AAC/B,iBAAO;AAAA,QACT;AACA,eAAO;AACP,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,cAAM,SAAS,MAAM,UAAU;AAC/B,YAAI,WAAWD,OAAM;AAAE,iBAAO;AAAG;AAAA,QAAO;AACxC,YAAI,WAAWC,SAAQ;AACrB,iBAAO,KAAK,EAAE,gBAAgB,CAAC;AAC/B,iBAAO;AAAA,QACT;AACA,gBAAQ;AACR,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK,GAAG;AACN,cAAM,iBAAiB,MAAM,uBAAuB,MAAM,KAAK;AAC/D,YAAI,mBAAmB,QAAQ;AAAE,iBAAO;AAAG;AAAA,QAAO;AAClD,YAAI,mBAAmB,UAAU;AAC/B,iBAAO,KAAK,EAAE,gBAAgB,CAAC;AAC/B,iBAAO;AAAA,QACT;AACA,YAAI,eAAe,WAAW,GAAG;AAC/B,iBAAO,KAAK,EAAE,2BAA2B,CAAC;AAC1C,iBAAO;AAAA,QACT;AAEA,cAAM,cAAc,wBAAwB;AAC5C,cAAM,UAAU,cAAc,EAAE,qBAAqB,CAAC;AACtD,gBAAQ,MAAM;AAEd,cAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,gBAAQ,QAAQ,EAAE,8BAA8B,CAAC;AAEjD,eAAO,KAAK,GAAG,EAAE,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,WAAWM,OAAM,KAAK,OAAO,eAAe,MAAM,CAAC,CAAC,CAAC,KAAK;AAExI,cAAM,UAAU,MAAM,cAAc,gBAAgB,MAAM,OAAO,QAAQ;AAEzE,YAAI,eAAe;AACnB,YAAI,YAAY;AAChB,cAAM,QAAQ,QAAQ;AAEtB,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAM,SAAS,QAAQ,CAAC;AACxB,gBAAM,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK;AACnC,cAAI,OAAO,SAAS;AAClB,mBAAO,QAAQ,GAAG,QAAQ,IAAI,OAAO,OAAO,EAAE;AAC9C;AAAA,UACF,OAAO;AACL,mBAAO,MAAM,GAAG,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,EAAE;AAC7D;AAAA,UACF;AAAA,QACF;AAEA,cAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,eAAO,MAAM;AACb,eAAO,QAAQ,GAAG,EAAE,oBAAoB,CAAC,KAAKA,OAAM,MAAM,EAAE,uBAAuB,EAAE,QAAQ,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,IAAIA,OAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,IAAIA,OAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE;AAC5S,eAAO,MAAM;AACb,eAAO,KAAK,GAAG,EAAE,YAAY,CAAC,KAAKA,OAAM,KAAK,aAAa,UAAU,CAAC,EAAE;AACxE,eAAO,KAAK,GAAG,EAAE,cAAc,EAAE,QAAQ,UAAUA,OAAM,MAAM,IAAI,CAAC,CAAC,EAAE;AACvE,eAAO,MAAM;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;;;AmBtPA,eAAsB,cAA6B;AACjD,MAAI;AACF,UAAM,cAAc,wBAAwB;AAC5C,UAAM,YAAY,kBAAkB;AAAA,EACtC,QAAQ;AAAA,EACR;AAEA,QAAM,UAAU,cAAc;AAC9B,QAAM,YAAY,cAAc;AAChC,QAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5D,kBAAgB,SAAS,YAAY;AACvC;;;ACjBA,OAAOC,YAAW;AAClB,SAAS,cAAAC,cAAY,eAAAC,cAAa,aAAAC,YAAW,cAAAC,aAAY,aAAAC,kBAAiB;AAC1E,SAAS,QAAAC,cAAY;AASrB,eAAsB,cAAc,UAA6B,CAAC,GAAkB;AAClF,UAAQ,IAAI;AACZ,UAAQ,IAAIC,OAAM,KAAK,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAChD,UAAQ,IAAIA,OAAM,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC,CAAC;AAE5C,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,QAAQ;AAEZ,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAChD,QAAM,gBAAgB,MAAM,YAAY;AACxC,QAAM,WAAW,YAAY;AAE7B,aAAW,QAAQ,UAAU;AAC3B,UAAM,WAAW,cAAc,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC1D,QAAI,UAAU;AACZ,cAAQ;AAAA,QACNA,OAAM,MAAM,UAAK,IACf,IAAI,mBAAmB,IAAI,CAAC,GAAG,SAAS,UAAU,KAAK,SAAS,OAAO,KAAK,EAAE;AAAA,MAClF;AAAA,IACF,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,IAAI,mBAAmB,IAAI,CAAC,WAAM,EAAE,sBAAsB,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,KAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAClD,QAAM,UAAU,cAAc;AAC9B,QAAM,YAAY,cAAc;AAChC,QAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5D,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,aAAa,IAAI,OAAO,EAAE;AACvC,QAAI,MAAM;AACR,cAAQ;AAAA,QACNA,OAAM,MAAM,UAAK,IACf,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,IAAI,KAAK,WAAW,YAAY,KAAK,WAAW;AAAA,MAC5E;AAAA,IACF,OAAO;AACL,cAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,WAAM,EAAE,sBAAsB,CAAC,EAAE;AAAA,IAC1F;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAEhD,QAAM,cAAc,cAAc,CAAC,GAAG,QAAQ;AAC9C,QAAM,aAAa,cAAc,aAAa,SAAS;AAEvD,QAAM,YAAY,aAAa,UAAU;AACzC,QAAM,YAAY,aAAa,UAAU;AAEzC,MAAIC,aAAW,SAAS,GAAG;AACzB,UAAM,cAAc,iBAAiB,SAAS;AAC9C,QAAI,gBAAgB,GAAG;AACrB,YAAM,QAAQC,aAAY,SAAS,EAAE;AACrC,cAAQ,IAAIF,OAAM,MAAM,UAAK,IAAI,IAAI,SAAS,WAAM,EAAE,oBAAoB,EAAE,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,IACjH,OAAO;AACL,cAAQ,IAAIA,OAAM,OAAO,UAAK,IAAI,IAAI,SAAS,WAAM,EAAE,qBAAqB,EAAE,QAAQ,WAAW,OAAO,WAAW,CAAC,CAAC,EAAE;AACvH;AACA,UAAI,QAAQ,KAAK;AACf,cAAM,QAAQ,eAAe,SAAS;AACtC,iBAAS;AACT,gBAAQ,IAAIA,OAAM,MAAM,UAAK,IAAI,IAAI,EAAE,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,MACzH;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,IAAI,SAAS,WAAM,EAAE,kBAAkB,CAAC,EAAE;AACzE,QAAI,QAAQ,KAAK;AACf,MAAAG,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC;AACA,cAAQ,IAAIH,OAAM,MAAM,UAAK,IAAI,IAAI,EAAE,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,UAAU,SAAS,CAAC,EAAE;AAAA,IACxH;AAAA,EACF;AAEA,MAAIC,aAAW,SAAS,GAAG;AACzB,UAAM,cAAc,iBAAiB,SAAS;AAC9C,QAAI,gBAAgB,GAAG;AACrB,YAAM,QAAQC,aAAY,SAAS,EAAE;AACrC,cAAQ,IAAIF,OAAM,MAAM,UAAK,IAAI,IAAI,SAAS,WAAM,EAAE,oBAAoB,EAAE,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,IACjH,OAAO;AACL,cAAQ,IAAIA,OAAM,OAAO,UAAK,IAAI,IAAI,SAAS,WAAM,EAAE,qBAAqB,EAAE,QAAQ,WAAW,OAAO,WAAW,CAAC,CAAC,EAAE;AACvH;AACA,UAAI,QAAQ,KAAK;AACf,cAAM,QAAQ,eAAe,SAAS;AACtC,iBAAS;AACT,gBAAQ,IAAIA,OAAM,MAAM,UAAK,IAAI,IAAI,EAAE,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC,EAAE;AAAA,MACzH;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,IAAI,SAAS,WAAM,EAAE,kBAAkB,CAAC,EAAE;AACzE,QAAI,QAAQ,KAAK;AACf,MAAAG,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC;AACA,cAAQ,IAAIH,OAAM,MAAM,UAAK,IAAI,IAAI,EAAE,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,UAAU,SAAS,CAAC,EAAE;AAAA,IACxH;AAAA,EACF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,KAAK,KAAK,EAAE,eAAe,CAAC,EAAE,CAAC;AACjD,QAAM,aAAa,kBAAkB,WAAW;AAChD,QAAM,aAAaI,OAAK,QAAQ,IAAI,GAAG,UAAU;AACjD,MAAIH,aAAW,UAAU,GAAG;AAC1B,YAAQ,IAAID,OAAM,MAAM,UAAK,IAAI,IAAI,UAAU,IAAI,EAAE,sBAAsB,CAAC,EAAE;AAAA,EAChF,OAAO;AACL,YAAQ,IAAIA,OAAM,IAAI,UAAK,IAAI,IAAI,UAAU,IAAI,EAAE,yBAAyB,CAAC,EAAE;AAAA,EACjF;AAEA,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC,CAAC;AAC5C,MAAI,QAAQ,OAAO,QAAQ,GAAG;AAC5B,YAAQ;AAAA,MACN,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,cAAc,OAAO,QAAQ,CAAC,EAAE,QAAQ,YAAY,OAAO,MAAM,CAAC,EAAE,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC;AAAA,IACvK;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,2BAA2B,EAAE,QAAQ,cAAc,OAAO,QAAQ,CAAC,EAAE,QAAQ,YAAY,OAAO,MAAM,CAAC,CAAC;AAAA,IACxI;AAAA,EACF;AACA,UAAQ,IAAI;AACd;AAEA,SAAS,iBAAiB,KAAqB;AAC7C,MAAI,SAAS;AACb,MAAI;AACF,UAAM,UAAUE,aAAY,GAAG;AAC/B,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWE,OAAK,KAAK,KAAK;AAChC,UAAI;AACF,cAAM,QAAQC,WAAU,QAAQ;AAChC,YAAI,MAAM,eAAe,GAAG;AAC1B,cAAI,CAACJ,aAAW,QAAQ,GAAG;AACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAqB;AAC3C,MAAI,QAAQ;AACZ,MAAI;AACF,UAAM,UAAUC,aAAY,GAAG;AAC/B,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWE,OAAK,KAAK,KAAK;AAChC,UAAI;AACF,cAAM,QAAQC,WAAU,QAAQ;AAChC,YAAI,MAAM,eAAe,GAAG;AAC1B,cAAI,CAACJ,aAAW,QAAQ,GAAG;AACzB,YAAAK,YAAW,QAAQ;AACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;ACnLA,OAAOC,YAAW;AAKlB,eAAsB,gBAA+B;AACnD,QAAM,UAAU,cAAc;AAC9B,QAAM,YAAY,cAAc;AAChC,QAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5D,UAAQ,IAAI;AACZ,UAAQ,IAAIC,OAAM,KAAK,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAChD,UAAQ,IAAI;AAEZ,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAIA,OAAM,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;AAC9C,YAAQ,IAAIA,OAAM,IAAI,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;AAC9C,YAAQ,IAAI;AACZ;AAAA,EACF;AAEA,aAAW,QAAQ,WAAW;AAC5B,YAAQ;AAAA,MACNA,OAAM,MAAM,UAAK,IACf,IAAI,KAAK,WAAW,KACpBA,OAAM,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;AAAA,IAC9C;AACA,YAAQ;AAAA,MACNA,OAAM,IAAI,OAAO,KAAK,WAAW,YAAY,KAAK,WAAW,SAAS;AAAA,IACxE;AACA,YAAQ,IAAIA,OAAM,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;AAC/C,YAAQ,IAAIA,OAAM,IAAI,OAAO,EAAE,qBAAqB,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;AAC7E,YAAQ,IAAI;AAAA,EACd;AACF;;;ACtBA,SAAS,eAAe;AACxB,OAAOC,YAAW;AAGlB,eAAsB,eACpB,OACA,SACe;AAEf,MAAI,QAAQ,MAAM;AAChB,QAAI;AACF,YAAM,cAAc,wBAAwB;AAC5C,YAAM,YAAY,kBAAkB;AAAA,IACtC,QAAQ;AAAA,IACR;AACA,kBAAc;AACd;AAAA,EACF;AAGA,MAAI,MAAM,WAAW,GAAG;AAEtB,UAAMC,eAAc,cAAc,EAAE,qBAAqB,CAAC;AAC1D,IAAAA,aAAY,MAAM;AAClB,QAAI;AACF,YAAM,kBAAkB,wBAAwB;AAChD,YAAM,gBAAgB,kBAAkB;AACxC,MAAAA,aAAY,QAAQ,EAAE,8BAA8B,CAAC;AAAA,IACvD,QAAQ;AACN,MAAAA,aAAY,KAAK,EAAE,4BAA4B,CAAC;AAAA,IAClD;AAEA,QAAIC;AACJ,QAAI,QAAQ,MAAM;AAChB,MAAAA,QAAO,aAAa,QAAQ,IAAI;AAAA,IAClC,OAAO;AACL,YAAM,WAAW,MAAM,wBAAwB;AAC/C,UAAI,aAAa,UAAU,aAAa,SAAU;AAClD,MAAAA,QAAO;AAAA,IACT;AAEA,UAAMC,SAAsB,QAAQ,QAAQ,cAAc,QAAQ,KAAK,IAAI;AAE3E,QAAI,OAAO;AACX,WAAO,MAAM;AACX,cAAQ,MAAM;AAAA,QACZ,KAAK,GAAG;AACN,gBAAM,iBAAiB,MAAM,uBAAuBD,OAAMC,MAAK;AAC/D,cAAI,mBAAmB,QAAQ;AAC7B,kBAAM,aAAa,MAAM,wBAAwB;AACjD,gBAAI,eAAe,UAAU,eAAe,SAAU;AACtD,YAAAD,QAAO;AACP;AAAA,UACF;AACA,cAAI,mBAAmB,SAAU;AACjC,cAAI,eAAe,WAAW,GAAG;AAC/B,mBAAO,KAAK,EAAE,2BAA2B,CAAC;AAC1C;AAAA,UACF;AACA,kBAAQ;AAER,gBAAM,cAAc,wBAAwB;AAC5C,gBAAM,UAAU,cAAc,EAAE,qBAAqB,CAAC;AACtD,kBAAQ,MAAM;AACd,gBAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,kBAAQ,QAAQ,EAAE,8BAA8B,CAAC;AAEjD,iBAAO,KAAK,GAAG,EAAE,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,WAAWF,OAAM,KAAK,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK;AAC/H,gBAAM,UAAU,MAAM,cAAc,OAAOE,OAAMC,QAAO,QAAQ;AAEhE,cAAI,eAAe;AACnB,cAAI,YAAY;AAChB,gBAAM,QAAQ,QAAQ;AACtB,mBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,kBAAM,SAAS,QAAQ,CAAC;AACxB,kBAAM,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK;AACnC,gBAAI,OAAO,SAAS;AAAE,qBAAO,QAAQ,GAAG,QAAQ,IAAI,OAAO,OAAO,EAAE;AAAG;AAAA,YAAgB,OAClF;AAAE,qBAAO,MAAM,GAAG,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,EAAE;AAAG;AAAA,YAAa;AAAA,UACtF;AAEA,gBAAM,aAAa,cAAcD,OAAMC,MAAK;AAC5C,iBAAO,MAAM;AACb,iBAAO,QAAQ,GAAG,EAAE,oBAAoB,CAAC,KAAKH,OAAM,MAAM,EAAE,uBAAuB,EAAE,QAAQ,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,IAAIA,OAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,IAAIA,OAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE;AAC5S,iBAAO,MAAM;AACb,iBAAO,KAAK,GAAG,EAAE,YAAY,CAAC,KAAKA,OAAM,KAAK,aAAa,UAAU,CAAC,EAAE;AACxE,iBAAO,KAAK,GAAG,EAAE,cAAc,EAAE,QAAQ,UAAUA,OAAM,MAAME,KAAI,CAAC,CAAC,EAAE;AACvE,iBAAO,MAAM;AACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc,cAAc,EAAE,qBAAqB,CAAC;AAC1D,cAAY,MAAM;AAClB,MAAI;AACF,UAAM,kBAAkB,wBAAwB;AAChD,UAAM,gBAAgB,kBAAkB;AACxC,gBAAY,QAAQ,EAAE,8BAA8B,CAAC;AAAA,EACvD,QAAQ;AACN,gBAAY,KAAK,EAAE,4BAA4B,CAAC;AAAA,EAClD;AAGA,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,WAAW,IAAI;AAC9B,QAAI,QAAQ;AACV,cAAQ,KAAK,OAAO,EAAE;AACtB;AAAA,IACF;AACA,UAAM,QAAQ,UAAU,IAAI;AAC5B,QAAI,OAAO;AACT,aAAO,KAAK,MAAM,EAAE;AACpB;AAAA,IACF;AAEA,WAAO,MAAM,GAAG,EAAE,wBAAwB,CAAC,KAAK,IAAI,EAAE;AACtD,UAAM,aAAa,cAAc;AACjC,WAAO,KAAK,EAAE,mBAAmB,IAAI,GAAG;AACxC,eAAW,KAAK,YAAY;AAC1B,aAAO,KAAK,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,IACnD;AACA,WAAO,KAAK,GAAG,EAAE,kBAAkB,CAAC,KAAKF,OAAM,KAAK,+BAA+B,CAAC,EAAE;AACtF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,QAAQ,MAAM;AAChB,WAAO,aAAa,QAAQ,IAAI;AAAA,EAClC,OAAO;AACL,UAAM,WAAW,MAAM,wBAAwB;AAC/C,QAAI,aAAa,UAAU,aAAa,SAAU;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,QAAsB,QAAQ,QAAQ,cAAc,QAAQ,KAAK,IAAI;AAG3E,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,UAAM,YAAY,iBAAiB,UAAU;AAC7C,UAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACzD,UAAM,mBAA6B,CAAC;AACpC,UAAM,iBAA2B,CAAC;AAElC,eAAW,YAAY,SAAS;AAC9B,UAAI,aAAa,IAAI,QAAQ,KAAK,CAAC,QAAQ,KAAK;AAC9C,cAAM,SAAS,WAAW,QAAQ;AAClC,cAAM,cAAc,QAAQ,eAAe;AAC3C,eAAO,KAAK,GAAG,WAAW,KAAK,EAAE,2BAA2B,CAAC,GAAG;AAChE,cAAM,kBAAkB,MAAM,QAAQ;AAAA,UACpC,SAAS,GAAG,EAAE,2BAA2B,CAAC;AAAA,UAC1C,SAAS;AAAA,QACX,CAAC;AACD,YAAI,iBAAiB;AACnB,2BAAiB,KAAK,QAAQ;AAAA,QAChC,OAAO;AACL,yBAAe,KAAK,QAAQ;AAC5B,iBAAO,KAAK,GAAG,WAAW,IAAI,EAAE,cAAc,CAAC,EAAE;AAAA,QACnD;AAAA,MACF,OAAO;AACL,yBAAiB,KAAK,QAAQ;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,YAAM,cAAc,wBAAwB;AAC5C,YAAM,UAAU,cAAc,EAAE,qBAAqB,CAAC;AACtD,cAAQ,MAAM;AAEd,YAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,cAAQ,QAAQ,EAAE,8BAA8B,CAAC;AAEjD,YAAM,aAAa,cAAc;AACjC,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAEA,YAAM,UAAU,QAAQ,IAAI,CAAC,WAAW;AACtC,cAAM,SAAS,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,QAAQ;AAC9D,eAAO;AAAA,UACL,UAAU,OAAO;AAAA,UACjB,aAAa,QAAQ,eAAe,OAAO;AAAA,UAC3C,SAAS,OAAO;AAAA,UAChB,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,QACtB;AAAA,MACF,CAAC;AAED,0BAAoB,OAAO;AAC3B,2BAAqB,SAAS,MAAM,UAAU;AAAA,IAChD;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,cAAc,wBAAwB;AAC5C,UAAM,UAAU,cAAc,EAAE,qBAAqB,CAAC;AACtD,YAAQ,MAAM;AAEd,UAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,YAAQ,QAAQ,EAAE,8BAA8B,CAAC;AAEjD,WAAO,KAAK,GAAG,EAAE,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,WAAWA,OAAM,KAAK,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK;AAEhI,UAAM,UAAU,MAAM,cAAc,QAAQ,MAAM,OAAO,QAAQ;AAEjE,QAAI,eAAe;AACnB,QAAI,YAAY;AAChB,UAAM,QAAQ,QAAQ;AAEtB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK;AACnC,UAAI,OAAO,SAAS;AAClB,eAAO,QAAQ,GAAG,QAAQ,IAAI,OAAO,OAAO,EAAE;AAC9C;AAAA,MACF,OAAO;AACL,eAAO,MAAM,GAAG,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,EAAE;AAC7D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM;AACb,WAAO,QAAQ,GAAG,EAAE,oBAAoB,CAAC,KAAKA,OAAM,MAAM,EAAE,uBAAuB,EAAE,QAAQ,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,IAAIA,OAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,IAAIA,OAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE;AAC5S,WAAO,MAAM;AACb,WAAO,KAAK,GAAG,EAAE,YAAY,CAAC,KAAKA,OAAM,KAAK,cAAc,MAAM,KAAK,IAAI,UAAU,CAAC,EAAE;AACxF,WAAO,KAAK,GAAG,EAAE,cAAc,EAAE,QAAQ,UAAUA,OAAM,MAAM,IAAI,CAAC,CAAC,EAAE;AACvE,WAAO,MAAM;AAAA,EACf;AACF;AAEA,eAAe,eACb,WACA,MACA,OACA,UACA;AACA,QAAM,UAAU,CAAC;AACjB,QAAM,QAAQ,UAAU;AAExB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK;AACnC,UAAM,UAAU,cAAc,GAAG,QAAQ,IAAI,EAAE,kBAAkB,CAAC,IAAI,QAAQ,KAAK;AACnF,YAAQ,MAAM;AAEd,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS;AAClB,cAAQ;AAAA,QACN,GAAG,QAAQ,IAAI,QAAQ,WAAM,OAAO,WAAW,YAAY,OAAO,WAAW;AAAA,MAC/E;AACA,yBAAmB,QAAQ;AAAA,IAC7B,OAAO;AACL,cAAQ,KAAK,GAAG,QAAQ,IAAI,QAAQ,WAAM,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IACtE;AAEA,YAAQ,KAAK,MAAM;AAAA,EACrB;AACA,SAAO;AACT;;;AC/RA,SAAS,cAAAI,cAAY,cAAAC,aAAY,aAAAC,YAAW,eAAAC,cAAa,aAAAC,kBAAiB;AAC1E,OAAOC,aAAW;AAalB,eAAsB,iBACpB,OACA,SACe;AACf,QAAM,OAAe,QAAQ,OAAO,aAAa,QAAQ,IAAI,IAAI;AACjE,QAAM,QAAsB,QAAQ,QAAQ,cAAc,QAAQ,KAAK,IAAI;AAG3E,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,WAAW,IAAI;AAC9B,QAAI,QAAQ;AACV,cAAQ,KAAK,OAAO,EAAE;AACtB;AAAA,IACF;AACA,UAAM,QAAQ,UAAU,IAAI;AAC5B,QAAI,OAAO;AACT,aAAO,KAAK,MAAM,EAAE;AACpB;AAAA,IACF;AACA,WAAO,MAAM,GAAG,EAAE,qBAAqB,CAAC,KAAK,IAAI,EAAE;AAAA,EACrD;AAGA,aAAW,YAAY,SAAS;AAC9B,UAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,CAAC,OAAQ;AAEb,UAAM,SAAS,WAAW,OAAO,EAAE;AACnC,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,GAAG,OAAO,WAAW,IAAI,EAAE,qBAAqB,CAAC,EAAE;AAC/D,aAAO,KAAK,GAAG,EAAE,0BAA0B,CAAC,EAAE;AAC9C;AAAA,IACF;AAEA,WAAO,KAAK,GAAG,EAAE,uBAAuB,CAAC,IAAI,OAAO,WAAW,KAAK;AAEpE,QAAI,eAAe;AACnB,QAAI,cAAc;AAElB,eAAW,YAAY,OAAO,OAAO;AACnC,UAAI;AACF,YAAIC,aAAW,QAAQ,KAAKC,WAAU,QAAQ,GAAG;AAC/C,UAAAC,YAAW,QAAQ;AACnB,gBAAM,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,iBAAO,KAAK,KAAK,EAAE,wBAAwB,CAAC,KAAK,IAAI,EAAE;AACvD;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,aAAa,cAAc,OAAO,MAAM,OAAO,KAAK;AAC1D,UAAM,aAAa,CAAC,GAAG,OAAO,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAC7E,eAAW,WAAW,YAAY;AAChC,UAAI;AAEF,YAAI,YAAY,YAAY;AAC1B;AAAA,QACF;AACA,YAAIF,aAAW,OAAO,GAAG;AACvB,gBAAM,UAAUG,aAAY,OAAO;AACnC,cAAI,QAAQ,WAAW,GAAG;AACxB,YAAAC,WAAU,OAAO;AACjB,kBAAM,OAAO,QAAQ,MAAM,GAAG,EAAE,IAAI,KAAK;AACzC,mBAAO,KAAK,KAAK,EAAE,2BAA2B,CAAC,KAAK,IAAI,GAAG;AAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,iBAAa,OAAO,EAAE;AACtB,0BAAsB,OAAO,EAAE;AAE/B,UAAM,UAAU,YAAY,UAAU;AACtC,UAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAElE,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,SAAS,MAAM,kBAAkB,YAAY;AACnD,UAAI,WAAW,QAAQ;AACrB,cAAM,WAAW,cAAc,QAAQ,YAAY,OAAO,IAAI;AAC9D,YAAI,UAAU;AACZ,gBAAM,aAAa,aAAa,KAAK,CAAC,MAAM,EAAE,aAAa,MAAM;AACjE,iBAAO,QAAQ,GAAG,EAAE,wBAAwB,CAAC,KAAK,YAAY,cAAc,EAAE,EAAE;AAChF,uBAAa,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AACpE,eAAW,UAAU,gBAAgB;AACnC,mBAAa,OAAO,QAAQ;AAAA,IAC9B;AAEA,UAAM,eAAe,eAAe;AACpC,QAAI,eAAe,GAAG;AACpB,aAAO,QAAQ,GAAG,EAAE,mBAAmB,CAAC,IAAI,OAAO,WAAW,SAAI,EAAE,8BAA8B,EAAE,QAAQ,WAAW,OAAO,YAAY,CAAC,CAAC,SAAI,EAAE,6BAA6B,EAAE,QAAQ,WAAW,OAAO,WAAW,CAAC,CAAC,QAAG;AAAA,IAC7N,OAAO;AACL,aAAO,KAAK,GAAG,OAAO,WAAW,GAAG,EAAE,sBAAsB,CAAC,EAAE;AAAA,IACjE;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,KAAK,GAAG,EAAE,8BAA8B,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,WAAW,OAAO,OAAO,MAAM,CAAC,CAAC,KAAK;AAE1H,UAAM,UAAU,MAAM,gBAAgB,QAAQ,MAAM,KAAK;AAEzD,QAAI,eAAe;AACnB,QAAI,YAAY;AAEhB,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,SAAS;AAClB;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM;AACb,WAAO,QAAQ,GAAG,EAAE,sBAAsB,CAAC,KAAKC,QAAM,MAAM,EAAE,uBAAuB,EAAE,QAAQ,WAAW,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,IAAIA,QAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,IAAIA,QAAM,IAAI,EAAE,sBAAsB,EAAE,QAAQ,WAAW,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE;AAC9S,WAAO,MAAM;AAAA,EACf;AACF;AAEA,SAASJ,WAAU,MAAuB;AACxC,MAAI;AACF,WAAOK,WAAU,IAAI,EAAE,eAAe;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC9IA,OAAOC,aAAW;AAGlB,eAAsB,cACpB,aACA,SACe;AACf,MAAI;AACJ,MAAI,QAAQ,MAAM;AAChB,WAAO,aAAa,QAAQ,IAAI;AAAA,EAClC,OAAO;AACL,UAAM,WAAW,MAAM,wBAAwB;AAC/C,QAAI,aAAa,UAAU,aAAa,SAAU;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,QAAsB,QAAQ,QAAQ,cAAc,QAAQ,KAAK,IAAI;AAE3E,MAAI,kBAA4B,CAAC;AAEjC,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,UAAM,YAAY,iBAAiB,UAAU;AAC7C,sBAAkB,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI;AAC7C,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO,KAAK,EAAE,mBAAmB,CAAC;AAClC,aAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,SAASA,QAAM,KAAK,iCAAiC,CAAC,CAAC;AACpG;AAAA,IACF;AAAA,EACF,OAAO;AACL,eAAW,QAAQ,aAAa;AAC9B,YAAM,SAAS,WAAW,IAAI;AAC9B,UAAI,CAAC,QAAQ;AACX,eAAO,MAAM,GAAG,EAAE,wBAAwB,CAAC,KAAK,IAAI,EAAE;AACtD;AAAA,MACF;AACA,sBAAgB,KAAK,OAAO,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,cAAc,wBAAwB;AAC5C,QAAM,gBAAgB,cAAc,EAAE,iBAAiB,IAAI,KAAK;AAChE,gBAAc,MAAM;AAEpB,QAAM,YAAY,WAAW;AAC7B,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,YAAY,kBAAkB;AACpC,gBAAc,QAAQ,EAAE,oBAAoB,CAAC;AAE7C,QAAM,aAAa,cAAc;AACjC,QAAM,UAAU,CAAC;AACjB,QAAM,QAAQ,gBAAgB;AAE9B,WAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,UAAM,WAAW,gBAAgB,CAAC;AAClC,UAAM,SAAS,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACvD,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK;AAEnC,UAAM,gBAAgB,cAAc,GAAG,QAAQ,IAAI,EAAE,iBAAiB,CAAC,IAAI,WAAW,KAAK;AAC3F,kBAAc,MAAM;AAEpB,UAAM,SAAS,MAAM,cAAc;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,OAAO,SAAS;AAClB,oBAAc;AAAA,QACZ,GAAG,QAAQ,IAAI,WAAW,WAAM,OAAO,WAAW,YAAY,OAAO,WAAW;AAAA,MAClF;AAAA,IACF,OAAO;AACL,oBAAc;AAAA,QACZ,GAAG,QAAQ,IAAI,WAAW,WAAM,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,QAAM,UAAU,QAAQ,IAAI,CAAC,WAAW;AACtC,UAAM,SAAS,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,QAAQ;AAC9D,WAAO;AAAA,MACL,UAAU,OAAO;AAAA,MACjB,aAAa,QAAQ,eAAe,OAAO;AAAA,MAC3C,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB;AAAA,EACF,CAAC;AAED,sBAAoB,OAAO;AAC3B,SAAO,QAAQ,EAAE,aAAa,CAAC;AACjC;;;ACxGA,OAAOC,aAAW;AAClB,SAAS,cAAAC,cAAY,eAAAC,oBAAmB;AACxC,SAAS,QAAAC,cAAY;AAMrB,eAAsB,YAAY,YAAmC;AACnE,QAAM,SAAS,WAAW,UAAU;AACpC,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAIC,QAAM,IAAI,KAAK,EAAE,gBAAgB,CAAC,KAAK,UAAU,EAAE,CAAC;AAChE;AAAA,EACF;AAEA,QAAM,YAAY,cAAc;AAChC,QAAM,cAAc,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE;AAC5D,QAAM,aAAa,cACfA,QAAM,MAAM,UAAK,EAAE,kBAAkB,CAAC,EAAE,IACxCA,QAAM,IAAI,UAAK,EAAE,sBAAsB,CAAC,EAAE;AAE9C,UAAQ,IAAI;AACZ,UAAQ,IAAIA,QAAM,KAAK,KAAK,OAAO,WAAW,EAAE,CAAC;AACjD,UAAQ,IAAIA,QAAM,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC,CAAC;AAC5C,UAAQ,IAAI;AACZ,UAAQ,IAAI,KAAKA,QAAM,IAAI,EAAE,kBAAkB,IAAI,GAAG,CAAC,IAAI,OAAO,WAAW,EAAE;AAC/E,UAAQ,IAAI,KAAKA,QAAM,IAAI,KAAK,CAAC,IAAI,OAAO,EAAE,EAAE;AAChD,UAAQ,IAAI,KAAKA,QAAM,IAAI,EAAE,aAAa,IAAI,GAAG,CAAC,IAAI,UAAU,EAAE;AAClE,UAAQ,IAAI,KAAKA,QAAM,IAAI,EAAE,aAAa,IAAI,GAAG,CAAC,IAAI,OAAO,MAAM,EAAE;AACrE,UAAQ,IAAI,KAAKA,QAAM,IAAI,EAAE,aAAa,IAAI,GAAG,CAAC,IAAI,OAAO,MAAM,EAAE;AACrE,UAAQ,IAAI,KAAKA,QAAM,IAAI,EAAE,cAAc,IAAI,GAAG,CAAC,IAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAClF,UAAQ,IAAI;AAEZ,MAAI;AACF,UAAM,cAAc,wBAAwB;AAC5C,UAAM,WAAW,MAAM,YAAY,WAAW;AAC9C,UAAM,iBAAiBC,OAAK,UAAU,OAAO,KAAK,eAAe;AAEjE,QAAIC,aAAW,cAAc,GAAG;AAC9B,cAAQ,IAAI,KAAKF,QAAM,IAAI,EAAE,iBAAiB,IAAI,GAAG,CAAC,IAAI,cAAc,EAAE;AAAA,IAC5E;AAEA,UAAM,YAAYC,OAAK,UAAU,OAAO,KAAK,QAAQ;AACrD,QAAIC,aAAW,SAAS,GAAG;AACzB,YAAM,aAAaC,aAAY,SAAS,EAAE,OAAO,CAAC,MAAc,EAAE,SAAS,KAAK,CAAC;AACjF,UAAI,WAAW,SAAS,GAAG;AACzB,gBAAQ,IAAI;AACZ,gBAAQ,IAAI,KAAKH,QAAM,KAAK,SAAS,CAAC,EAAE;AACxC,mBAAW,SAAS,YAAY;AAC9B,kBAAQ,IAAI,cAAS,MAAM,QAAQ,OAAO,EAAE,CAAC,EAAE;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,UAAQ,IAAI;AACd;;;AC1DA,OAAOI,aAAW;AAIlB,eAAsB,YACpB,QACA,OACe;AACf,QAAM,SAAS,WAAW;AAE1B,MAAI,CAAC,UAAU,WAAW,QAAQ;AAChC,YAAQ,IAAI;AACZ,YAAQ,IAAIC,QAAM,KAAK,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;AAC9C,YAAQ,IAAIA,QAAM,IAAI,OAAO,SAAI,OAAO,EAAE,CAAC,CAAC;AAC5C,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAKA,QAAM,IAAI,EAAE,cAAc,IAAI,GAAG,CAAC,IAAI,OAAO,QAAQ,EAAE;AACxE,YAAQ,IAAI;AACZ,YAAQ,IAAIA,QAAM,IAAI,KAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC;AACjD,YAAQ,IAAIA,QAAM,IAAI,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;AAC7C,YAAQ,IAAI;AACZ;AAAA,EACF;AAEA,MAAI,WAAW,OAAO;AACpB,QAAI,CAAC,OAAO;AACV,cAAQ,IAAIA,QAAM,IAAI,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAC/C;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,UAAU,SAAS;AAC1C,cAAQ,IAAIA,QAAM,IAAI,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAC/C;AAAA,IACF;AAEA,iBAAa,EAAE,UAAU,MAAM,CAAC;AAChC,gBAAY,KAAK;AACjB,YAAQ,IAAI;AACZ,YAAQ,IAAIA,QAAM,MAAM,YAAO,EAAE,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;AACxD,YAAQ,IAAI;AACZ;AAAA,EACF;AAEA,UAAQ,IAAIA,QAAM,IAAI,KAAK,EAAE,qBAAqB,CAAC,KAAK,MAAM,EAAE,CAAC;AACjE,UAAQ,IAAIA,QAAM,IAAI,KAAK,EAAE,wBAAwB,CAAC,EAAE,CAAC;AAC3D;;;A3B/BO,SAAS,YAAqB;AACnC,QAAM,SAAS,WAAW;AAC1B,MAAI,OAAO,UAAU;AACnB,gBAAY,OAAO,QAAQ;AAAA,EAC7B;AAEA,QAAMC,WAAU,IAAI,QAAQ;AAE5B,EAAAA,SACG,KAAK,gBAAgB,EACrB,YAAY,qFAAqF,EACjG,QAAQ,OAAO;AAElB,EAAAA,SACG,QAAQ,QAAQ,EAAE,WAAW,MAAM,CAAC,EACpC,YAAY,qCAAqC,EACjD,OAAO,YAAY;AAClB,UAAM,YAAY;AAAA,EACpB,CAAC;AAEH,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,wBAAwB,EACpC,OAAO,YAAY;AAClB,UAAM,YAAY;AAAA,EACpB,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,kBAAkB,EAC9B,OAAO,SAAS,0BAA0B,EAC1C,OAAO,OAAO,YAA+B;AAC5C,UAAM,cAAc,OAAO;AAAA,EAC7B,CAAC;AAEH,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,wBAAwB,EACpC,OAAO,YAAY;AAClB,UAAM,cAAc;AAAA,EACtB,CAAC;AAEH,EAAAA,SACG,QAAQ,oBAAoB,EAC5B,YAAY,+CAA+C,EAC3D,OAAO,qBAAqB,mDAAmD,EAC/E,OAAO,uBAAuB,mCAAmC,SAAS,EAC1E,OAAO,aAAa,2BAA2B,EAC/C,OAAO,UAAU,uCAAuC,EACxD,OAAO,OAAO,OAAiB,YAA8E;AAC5G,UAAM,eAAe,OAAO,OAAO;AAAA,EACrC,CAAC;AAEH,EAAAA,SACG,QAAQ,sBAAsB,EAC9B,YAAY,iDAAiD,EAC7D,OAAO,qBAAqB,mDAAmD,EAC/E,OAAO,uBAAuB,mCAAmC,SAAS,EAC1E,OAAO,OAAO,OAAiB,YAA+C;AAC7E,UAAM,iBAAiB,OAAO,OAAO;AAAA,EACvC,CAAC;AAEH,EAAAA,SACG,QAAQ,qBAAqB,EAC7B,YAAY,iDAAiD,EAC7D,OAAO,qBAAqB,mDAAmD,EAC/E,OAAO,uBAAuB,mCAAmC,SAAS,EAC1E,OAAO,OAAO,SAAmB,YAA+C;AAC/E,UAAM,cAAc,SAAS,OAAO;AAAA,EACtC,CAAC;AAEH,EAAAA,SACG,QAAQ,eAAe,EACvB,YAAY,qBAAqB,EACjC,OAAO,OAAO,WAAmB;AAChC,UAAM,YAAY,MAAM;AAAA,EAC1B,CAAC;AAEH,EAAAA,SACG,QAAQ,uBAAuB,EAC/B,YAAY,qCAAqC,EACjD,OAAO,OAAO,QAAiB,UAAmB;AACjD,UAAM,YAAY,QAAQ,KAAK;AAAA,EACjC,CAAC;AAEH,EAAAA,SAAQ,OAAO,YAAY;AACzB,UAAM,YAAY;AAAA,EACpB,CAAC;AAED,SAAOA;AACT;;;A4BpGA,QAAQ,GAAG,qBAAqB,CAAC,UAAe;AAC9C,MAAI,MAAM,SAAS,mBAAmB;AACpC,YAAQ,IAAI,OAAO,EAAE,gBAAgB,CAAC;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM;AACR,CAAC;AAED,IAAM,UAAU,UAAU;AAC1B,QAAQ,MAAM;","names":["select","Separator","chalk","chalk","existsSync","homedir","join","join","readFileSync","join","dirname","fileURLToPath","__filename","__dirname","join","homedir","existsSync","join","existsSync","readFileSync","join","existsSync","readFileSync","join","existsSync","readFileSync","join","homedir","choices","result","chalk","existsSync","mkdirSync","readFileSync","join","dirname","fileURLToPath","execa","parseYaml","existsSync","readdirSync","readFileSync","writeFileSync","mkdirSync","join","dirname","fileURLToPath","parseYaml","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","existsSync","mkdirSync","writeFileSync","readdirSync","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","execa","existsSync","mkdirSync","existsSync","join","execa","existsSync","mkdirSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readdirSync","unlinkSync","join","join","existsSync","readdirSync","unlinkSync","select","chalk","chalk","select","join","existsSync","execa","existsSync","mkdirSync","unlinkSync","readdirSync","lstatSync","join","select","checkbox","Separator","chalk","join","existsSync","mkdirSync","isSymlink","unlinkSync","readdirSync","BACK","CANCEL","Separator","select","checkbox","chalk","lstatSync","chalk","Table","Table","chalk","existsSync","readFileSync","join","BACK","CANCEL","existsSync","join","readFileSync","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","join","chalk","existsSync","readdirSync","mkdirSync","join","lstatSync","unlinkSync","chalk","chalk","chalk","scanSpinner","tool","level","existsSync","unlinkSync","rmdirSync","readdirSync","lstatSync","chalk","existsSync","isSymlink","unlinkSync","readdirSync","rmdirSync","chalk","lstatSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","chalk","program"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/ui/wizard.ts","../src/core/registry.ts","../src/core/detector.ts","../src/utils/paths.ts","../src/utils/i18n.ts","../src/core/manifest.ts","../src/utils/logger.ts","../src/utils/config.ts","../src/ui/theme.ts","../src/core/repository.ts","../src/core/scanner.ts","../src/core/skill-registry.ts","../src/core/installer.ts","../src/core/record.ts","../src/core/backup.ts","../src/ui/backup-prompts.ts","../src/core/skill-installer.ts","../src/ui/display.ts","../src/commands/list.ts","../src/commands/doctor.ts","../src/commands/status.ts","../src/commands/install.ts","../src/commands/uninstall.ts","../src/commands/update.ts","../src/commands/info.ts","../src/commands/lang.ts","../src/index.ts"],"sourcesContent":["// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { installCommand } from \"./commands/install.js\";\nimport { uninstallCommand } from \"./commands/uninstall.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { langCommand } from \"./commands/lang.js\";\nimport { readConfig } from \"./utils/config.js\";\nimport { setLanguage } from \"./utils/i18n.js\";\n\nexport function createCLI(): Command {\n const config = readConfig();\n if (config.language) {\n setLanguage(config.language);\n }\n\n const program = new Command();\n\n program\n .name(\"install-helper\")\n .description(\"CANNBot Install Helper - Interactive installer for CANN operator development skills\")\n .version(\"1.0.4\");\n\n program\n .command(\"init\", { isDefault: false })\n .description(\"Run interactive installation wizard\")\n .action(async () => {\n await initCommand();\n });\n\n program\n .command(\"list\")\n .description(\"List available plugins\")\n .action(async () => {\n await listCommand();\n });\n\n program\n .command(\"doctor\")\n .description(\"Run health check\")\n .option(\"--fix\", \"Auto-fix detected issues\")\n .action(async (options: { fix?: boolean }) => {\n await doctorCommand(options);\n });\n\n program\n .command(\"status\")\n .description(\"Show installed plugins\")\n .action(async () => {\n await statusCommand();\n });\n\n program\n .command(\"install [names...]\")\n .description(\"Install plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--list\", \"List all available skills by category\")\n .action(async (names: string[], options: { tool?: string; level?: string; yes?: boolean; list?: boolean }) => {\n await installCommand(names, options);\n });\n\n program\n .command(\"uninstall <names...>\")\n .description(\"Uninstall plugins or skills (auto-detects type)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (names: string[], options: { tool?: string; level?: string }) => {\n await uninstallCommand(names, options);\n });\n\n program\n .command(\"update [plugins...]\")\n .description(\"Update installed plugins (git pull + reinstall)\")\n .option(\"-t, --tool <tool>\", \"AI tool (opencode, claude, trae, cursor, copilot)\")\n .option(\"-l, --level <level>\", \"Install level (project, global)\", \"project\")\n .action(async (plugins: string[], options: { tool?: string; level?: string }) => {\n await updateCommand(plugins, options);\n });\n\n program\n .command(\"info <plugin>\")\n .description(\"Show plugin details\")\n .action(async (plugin: string) => {\n await infoCommand(plugin);\n });\n\n program\n .command(\"lang [action] [value]\")\n .description(\"Manage language settings (show/set)\")\n .action(async (action?: string, value?: string) => {\n await langCommand(action, value);\n });\n\n program.action(async () => {\n await initCommand();\n });\n\n return program;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { runWizard, selectToolWithDetection, stepLevel } from \"../ui/wizard.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { installSkills, interactiveSkillSelect } from \"../core/skill-installer.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner, printBanner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { selectTheme } from \"../ui/theme.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function initCommand(): Promise<void> {\n const cwd = process.cwd();\n if (\n existsSync(join(cwd, \"package.json\")) &&\n (() => {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\"));\n return pkg.name === \"@cannbot-ai/install-helper\";\n } catch { return false; }\n })()\n ) {\n logger.warn(t(\"init_pkg_dir_warn\"));\n logger.info(t(\"init_pkg_dir_hint\"));\n logger.info(t(\"init_pkg_dir_example\"));\n return;\n }\n\n printBanner(t(\"wizard_title\"));\n\n const spinner = createSpinner(t(\"loading_skills_list\"));\n spinner.start();\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n spinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n spinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n let step = 0;\n let mode: \"plugin\" | \"skill\" = \"plugin\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectMode();\n if (result === null) return;\n mode = result;\n step = 1;\n break;\n }\n case 1: {\n if (mode === \"plugin\") {\n const result = await pluginInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n } else {\n const result = await skillInstallFlow();\n if (result === \"back\") { step = 0; break; }\n return;\n }\n }\n }\n }\n}\n\nasync function selectMode(): Promise<\"plugin\" | \"skill\" | null> {\n printBoxTitle(t(\"wizard_select_mode_title\"));\n\n const CANCEL = \"__cancel__\";\n const choices: Array<{ name: string; value: string } | Separator> = [\n {\n name: `> ${t(\"wizard_mode_plugin\")} — ${t(\"wizard_mode_plugin_desc\")}`,\n value: \"plugin\",\n },\n {\n name: `> ${t(\"wizard_mode_skill\")} — ${t(\"wizard_mode_skill_desc\")}`,\n value: \"skill\",\n },\n new Separator(\"──────────────\"),\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_mode\"),\n choices,\n loop: false,\n theme: selectTheme,\n });\n if (result === CANCEL) return null;\n return result as \"plugin\" | \"skill\";\n}\n\nasync function pluginInstallFlow(): Promise<\"done\" | \"back\"> {\n const answers = await runWizard();\n\n if (!answers.confirmed) {\n if (answers.back) return \"back\";\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = answers.plugins.map((id) =>\n allPlugins.find((p) => p.id === id)\n );\n\n const total = answers.plugins.length;\n const results = [];\n\n for (let i = 0; i < answers.plugins.length; i++) {\n const pluginId = answers.plugins[i];\n const plugin = selectedPlugins[i];\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"install_progress\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool: answers.tool,\n level: answers.level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result, index) => ({\n pluginId: result.pluginId,\n displayName: selectedPlugins[index]?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n }));\n\n printInstallSummary(summary);\n\n const configRoot = getConfigRoot(answers.tool, answers.level);\n printEnhancedSummary(summary, answers.tool, configRoot);\n return \"done\";\n}\n\nasync function skillInstallFlow(): Promise<\"done\" | \"back\"> {\n let step = 0;\n let tool: AITool = \"opencode\";\n let level: InstallLevel = \"project\";\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await selectToolWithDetection();\n if (result === \"back\") return \"back\";\n if (result === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n tool = result;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel();\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n level = result;\n step = 2;\n break;\n }\n case 2: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") { step = 1; break; }\n if (selectedSkills === \"cancel\") {\n logger.info(t(\"init_cancelled\"));\n return \"done\";\n }\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return \"done\";\n }\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(selectedSkills.length)))}...`);\n\n const results = await installSkills(selectedSkills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) {\n logger.success(`${progress} ${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${progress} ${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n return \"done\";\n }\n }\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel, WizardAnswers } from \"../types/index.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { detectTools, getToolDisplayName } from \"../core/detector.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { selectTheme, checkboxTheme } from \"./theme.js\";\n\nconst BACK = \"__back__\";\nconst CANCEL = \"__cancel__\";\n\nexport async function selectToolWithDetection(): Promise<AITool | \"back\" | \"cancel\"> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) return \"back\";\n if (result === CANCEL) return \"cancel\";\n return result as AITool;\n}\n\nexport async function runWizard(): Promise<WizardAnswers> {\n const config = readConfig();\n logger.blank();\n\n const spinner = createSpinner(t(\"wizard_detect\"));\n spinner.start();\n const detectedTools = await detectTools();\n spinner.stop();\n\n let selectedTool: AITool | undefined;\n let level: InstallLevel = \"project\";\n let plugins: string[] = [];\n\n let step = 0;\n\n while (true) {\n switch (step) {\n case 0: {\n const result = await stepTool(detectedTools, config.lastTool);\n if (result === BACK) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false, back: true };\n }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: \"opencode\", level: \"project\", plugins: [], confirmed: false };\n }\n selectedTool = result as AITool;\n step = 1;\n break;\n }\n case 1: {\n const result = await stepLevel(config.lastLevel);\n if (result === BACK) { step = 0; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level: \"project\", plugins: [], confirmed: false };\n }\n level = result as InstallLevel;\n step = 2;\n break;\n }\n case 2: {\n const result = await stepPlugins(selectedTool!, level);\n if (result === BACK) { step = 1; break; }\n if (result === CANCEL) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n plugins = result as string[];\n step = 3;\n break;\n }\n case 3: {\n const result = await stepConfirm(selectedTool!, level, plugins);\n if (result === BACK) { step = 2; break; }\n if (result === CANCEL || result === false) {\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins: [], confirmed: false };\n }\n updateConfig({ lastTool: selectedTool, lastLevel: level });\n return { language: config.language || \"zh_CN\", tool: selectedTool!, level, plugins, confirmed: true };\n }\n }\n }\n}\n\nasync function stepTool(detectedTools: Awaited<ReturnType<typeof detectTools>>, lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_1_title\"));\n\n if (detectedTools.length === 0) {\n logger.error(t(\"error_tool_not_found\"));\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n }\n\n if (detectedTools.length === 1) {\n const tool = detectedTools[0];\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n logger.success(\n `${t(\"wizard_detected_tool\")}: ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`\n );\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> ${t(\"wizard_confirm_tool\")} ${getToolDisplayName(tool.name)}`, value: tool.name },\n { name: `> ${t(\"wizard_select_tool\")}`, value: \"manual\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n if (result === \"manual\") {\n return stepToolManual(lastTool);\n }\n return tool.name as AITool;\n }\n\n const choices: Array<{ name: string; value: string } | Separator> = detectedTools.map((tool) => {\n const isLastUsed = lastTool === tool.name;\n const suffix = isLastUsed ? ` [${t(\"wizard_last_used\")}]` : \"\";\n return {\n name: `> ${getToolDisplayName(tool.name)}${tool.version ? ` (v${tool.version})` : \"\"}${suffix}`,\n value: tool.name,\n };\n });\n choices.push(new Separator(\"──────────────\"));\n choices.push({ name: \"<- \" + t(\"wizard_back\"), value: BACK });\n choices.push({ name: \"x \" + t(\"wizard_cancel\"), value: CANCEL });\n\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nasync function stepToolManual(lastTool?: AITool): Promise<AITool | typeof BACK | typeof CANCEL> {\n const choices: Array<{ name: string; value: string } | Separator> = [\n ...[\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"].map((tool) => ({\n name: `> ${getToolDisplayName(tool as AITool)}`,\n value: tool,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_select_tool\"), choices, default: lastTool, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as AITool;\n}\n\nexport async function stepLevel(lastLevel?: InstallLevel): Promise<InstallLevel | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_2_title\"));\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: `> project — ${t(\"install_level_project\")}`, value: \"project\" },\n { name: `> global — ${t(\"install_level_global\")}`, value: \"global\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({\n message: t(\"wizard_select_level\"),\n choices,\n default: lastLevel || \"project\",\n loop: false,\n theme: selectTheme,\n });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return result as InstallLevel;\n}\n\nasync function stepPlugins(tool: AITool, level: InstallLevel): Promise<string[] | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_3_title\"));\n\n const plugins = getAllPlugins();\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n\n const choices: Array<{ name: string; value: string; checked: boolean } | Separator> = plugins.map((p) => {\n const isInstalled = installedSet.has(p.id);\n const suffix = isInstalled ? ` [${t(\"wizard_already_installed\")}]` : \"\";\n return {\n name: `${p.displayName}${suffix} — ${p.description}`,\n value: p.id,\n checked: false,\n };\n });\n showOperationHints(true);\n const selected = await checkbox({\n message: t(\"wizard_select_plugins\"),\n choices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n const pluginIds = selected;\n\n // 如果什么都没勾选,显示操作菜单\n if (pluginIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") return BACK;\n return CANCEL;\n }\n\n return pluginIds;\n}\n\nasync function stepConfirm(\n tool: AITool,\n level: InstallLevel,\n plugins: string[]\n): Promise<true | typeof BACK | typeof CANCEL> {\n printBoxTitle(t(\"wizard_step_4_title\"));\n\n const allPlugins = getAllPlugins();\n const selectedPlugins = plugins.map((id) => allPlugins.find((p) => p.id === id));\n\n const displayPath = getConfigRoot(tool, level);\n const toolName = getToolDisplayName(tool);\n const levelText = level === \"project\" ? \"project\" : \"global\";\n logger.info(t(\"wizard_confirm_install_format\").replace(\"{count}\", chalk.bold(String(plugins.length))).replace(\"{tool}\", chalk.green(toolName)).replace(\"{level}\", chalk.cyan(levelText)));\n logger.info(`${t(\"wizard_install_path\")}: ${chalk.cyan(displayPath)}`);\n for (const plugin of selectedPlugins) {\n if (plugin) {\n logger.step(` • ${chalk.bold(plugin.displayName)}`);\n }\n }\n logger.blank();\n\n const choices: Array<{ name: string; value: string } | Separator> = [\n { name: \"> \" + t(\"wizard_confirm\"), value: \"confirm\" },\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n showOperationHints();\n const result = await select({ message: t(\"wizard_confirm\"), choices, loop: false, theme: selectTheme });\n if (result === BACK) return BACK;\n if (result === CANCEL) return CANCEL;\n return true;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { readdirSync, readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { PluginEntry } from \"../types/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction loadPluginsFromYaml(): PluginEntry[] {\n const pluginsDir = join(__dirname, \"plugins.d\");\n const defaultsPath = join(pluginsDir, \"_defaults.yml\");\n\n let defaults: Record<string, unknown> = {};\n try {\n defaults = parseYaml(readFileSync(defaultsPath, \"utf-8\")) || {};\n } catch {\n }\n\n const plugins: PluginEntry[] = [];\n try {\n for (const file of readdirSync(pluginsDir)) {\n if (file.startsWith(\"_\") || !file.endsWith(\".yml\")) continue;\n try {\n const content = parseYaml(readFileSync(join(pluginsDir, file), \"utf-8\"));\n if (!content || !content.id) continue;\n plugins.push({\n id: content.id,\n dir: content.dir,\n displayName: content.displayName || content.id,\n script: content.script || defaults.script || \"init.sh\",\n aliases: content.aliases || [],\n skills: content.skills ?? defaults.skills ?? 0,\n agents: content.agents ?? defaults.agents ?? 0,\n description: content.description || \"\",\n });\n } catch {\n }\n }\n } catch {\n }\n plugins.sort((a, b) => a.displayName < b.displayName ? -1 : a.displayName > b.displayName ? 1 : 0);\n return plugins;\n}\n\nexport const PLUGIN_REGISTRY: PluginEntry[] = loadPluginsFromYaml();\n\nexport function findPlugin(query: string): PluginEntry | undefined {\n const normalized = query.toLowerCase().trim();\n\n const exactMatch = PLUGIN_REGISTRY.find(\n (p) => p.id === normalized || p.id === query.trim()\n );\n if (exactMatch) return exactMatch;\n\n const aliasMatch = PLUGIN_REGISTRY.find((p) =>\n p.aliases.some((a) => a === normalized)\n );\n if (aliasMatch) return aliasMatch;\n\n const prefixMatch = PLUGIN_REGISTRY.find((p) => p.id.startsWith(normalized));\n if (prefixMatch) return prefixMatch;\n\n return undefined;\n}\n\nexport function getAllPlugins(): PluginEntry[] {\n return PLUGIN_REGISTRY;\n}\n\nexport function getPluginById(id: string): PluginEntry | undefined {\n return PLUGIN_REGISTRY.find((p) => p.id === id);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport type { AITool, DetectedTool } from \"../types/index.js\";\nimport { detectTraeVariant } from \"../utils/paths.js\";\n\nasync function getCommandVersion(\n cmd: string,\n args: string[] = [\"--version\"]\n): Promise<string | undefined> {\n try {\n const result = await execa(cmd, args, { timeout: 5000 });\n const output = result.stdout.trim();\n const match = output.match(/(\\d+\\.\\d+\\.\\d+)/);\n return match ? match[1] : output.split(\"\\n\")[0];\n } catch {\n return undefined;\n }\n}\n\nasync function getCommandPath(cmd: string): Promise<string | undefined> {\n try {\n const result = await execa(\"which\", [cmd], { timeout: 5000 });\n return result.stdout.trim();\n } catch {\n return undefined;\n }\n}\n\nasync function detectOpenCode(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"opencode\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"opencode\");\n return { name: \"opencode\", version, path };\n}\n\nasync function detectClaude(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"claude\");\n if (!path) return undefined;\n const version = await getCommandVersion(\"claude\");\n return { name: \"claude\", version, path };\n}\n\nasync function detectTrae(): Promise<DetectedTool | undefined> {\n const home = homedir();\n const variant = detectTraeVariant();\n\n let path: string | undefined;\n if (variant === \"ide\" && existsSync(join(home, \".trae-cn\"))) {\n path = join(home, \".trae-cn\");\n } else if (variant === \"plugin\" && existsSync(join(home, \".marscode\"))) {\n path = join(home, \".marscode\");\n } else if (variant === \"cli\" && existsSync(join(home, \".traecli\"))) {\n path = join(home, \".traecli\");\n } else if (variant === \"unknown\") {\n const cmdPath = await getCommandPath(\"trae\");\n if (cmdPath) path = cmdPath;\n }\n\n if (!path) return undefined;\n return { name: \"trae\", version: variant, path };\n}\n\nasync function detectCursor(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"cursor\");\n if (path) {\n const version = await getCommandVersion(\"cursor\");\n return { name: \"cursor\", version, path };\n }\n\n if (process.platform === \"darwin\") {\n const appPath = \"/Applications/Cursor.app\";\n if (existsSync(appPath)) {\n return { name: \"cursor\", path: appPath };\n }\n }\n\n return undefined;\n}\n\nasync function detectCopilot(): Promise<DetectedTool | undefined> {\n const path = await getCommandPath(\"gh\");\n if (!path) return undefined;\n\n try {\n await execa(\"gh\", [\"extension\", \"list\"], { timeout: 5000 });\n return { name: \"copilot\", path };\n } catch {\n return undefined;\n }\n}\n\nexport async function detectTools(): Promise<DetectedTool[]> {\n const detectors = [\n detectOpenCode,\n detectClaude,\n detectTrae,\n detectCursor,\n detectCopilot,\n ];\n\n const results = await Promise.allSettled(detectors.map((d) => d()));\n const tools: DetectedTool[] = [];\n\n for (const result of results) {\n if (result.status === \"fulfilled\" && result.value) {\n tools.push(result.value);\n }\n }\n\n return tools;\n}\n\nexport async function detectSingleTool(): Promise<DetectedTool | undefined> {\n const tools = await detectTools();\n return tools[0];\n}\n\nexport function getToolDisplayName(tool: AITool): string {\n const names: Record<AITool, string> = {\n opencode: \"OpenCode\",\n claude: \"Claude Code\",\n trae: \"Trae\",\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n };\n return names[tool];\n}\n\nexport function getAllTools(): AITool[] {\n return [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { existsSync } from \"fs\";\nimport type { AITool, InstallLevel, TraeVariant } from \"../types/index.js\";\nimport { t } from \"./i18n.js\";\n\nconst VALID_TOOLS: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\nconst VALID_LEVELS: InstallLevel[] = [\"project\", \"global\"];\n\nexport function validateTool(tool: string): AITool {\n if (!VALID_TOOLS.includes(tool as AITool)) {\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n return tool as AITool;\n}\n\nexport function validateLevel(level: string): InstallLevel {\n if (!VALID_LEVELS.includes(level as InstallLevel)) {\n throw new Error(\n t(\"error_invalid_level\")\n .replace(\"{level}\", level)\n .replace(\"{levels}\", VALID_LEVELS.join(\", \"))\n );\n }\n return level as InstallLevel;\n}\n\nexport function detectTraeVariant(): TraeVariant {\n const home = homedir();\n if (existsSync(join(home, \".trae-cn\"))) return \"ide\";\n if (existsSync(join(home, \".marscode\"))) return \"plugin\";\n if (existsSync(join(home, \".traecli\"))) return \"cli\";\n return \"unknown\";\n}\n\nexport function getConfigRoot(\n tool: AITool,\n level: InstallLevel,\n base?: string\n): string {\n const home = homedir();\n\n if (level === \"global\") {\n switch (tool) {\n case \"opencode\":\n return join(home, \".config\", \"opencode\");\n case \"claude\":\n return join(home, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(home, \".marscode\");\n case \"cli\":\n return join(home, \".traecli\");\n default:\n return join(home, \".trae-cn\");\n }\n }\n case \"cursor\":\n return join(home, \".cursor\");\n case \"copilot\":\n return join(home, \".copilot\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n }\n\n const baseDir = base || process.cwd();\n switch (tool) {\n case \"opencode\":\n return join(baseDir, \".opencode\");\n case \"claude\":\n return join(baseDir, \".claude\");\n case \"trae\": {\n const variant = detectTraeVariant();\n switch (variant) {\n case \"plugin\":\n return join(baseDir, \".marscode\");\n case \"cli\":\n return join(baseDir, \".traecli\");\n default:\n return join(baseDir, \".trae\");\n }\n }\n case \"cursor\":\n return join(baseDir, \".cursor\");\n case \"copilot\":\n return join(baseDir, \".github\");\n default:\n throw new Error(\n t(\"error_invalid_tool\")\n .replace(\"{tool}\", tool)\n .replace(\"{tools}\", VALID_TOOLS.join(\", \"))\n );\n }\n}\n\nexport function getConfigFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function getSkillsDir(configRoot: string): string {\n return join(configRoot, \"skills\");\n}\n\nexport function getAgentsDir(configRoot: string): string {\n return join(configRoot, \"agents\");\n}\n\nexport function getManifestPath(configRoot: string): string {\n return join(configRoot, \"cannbot-manifest.json\");\n}\n\nexport function getCannbotConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getCannbotRepoPath(): string {\n return join(getCannbotConfigDir(), \"repo\");\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ntype Messages = Record<string, string>;\n\nfunction loadLocale(locale: string): Messages {\n const localePath = join(__dirname, \"locales\", `${locale}.json`);\n try {\n const content = readFileSync(localePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n // Fallback to zh_CN if locale file not found\n const fallbackPath = join(__dirname, \"locales\", \"zh_CN.json\");\n try {\n const content = readFileSync(fallbackPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return {};\n }\n }\n}\n\nlet currentLang: \"zh_CN\" | \"en_US\" = \"zh_CN\";\nlet messages: Messages = loadLocale(\"zh_CN\");\n\nexport function setLanguage(lang: \"zh_CN\" | \"en_US\"): void {\n currentLang = lang;\n messages = loadLocale(lang);\n}\n\nexport function getLanguage(): \"zh_CN\" | \"en_US\" {\n return currentLang;\n}\n\nexport function t(key: string): string {\n return messages[key] !== undefined ? messages[key] : key;\n}\n\nexport const i18n = {\n setLanguage,\n getLanguage,\n t,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type {\n CannbotManifest,\n InstalledPlugin,\n AITool,\n InstallLevel,\n} from \"../types/index.js\";\nimport { getConfigRoot, getManifestPath } from \"../utils/paths.js\";\nimport { getAllPlugins } from \"./registry.js\";\n\nexport function readManifest(configRoot: string): CannbotManifest | null {\n const manifestPath = getManifestPath(configRoot);\n if (existsSync(manifestPath)) {\n try {\n const content = readFileSync(manifestPath, \"utf-8\");\n return JSON.parse(content) as CannbotManifest;\n } catch {\n // fall through\n }\n }\n return null;\n}\n\nexport function readAllManifests(configRoot: string): CannbotManifest[] {\n const manifests: CannbotManifest[] = [];\n const plugins = getAllPlugins();\n\n const standardPath = getManifestPath(configRoot);\n if (existsSync(standardPath)) {\n try {\n const content = readFileSync(standardPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n\n for (const plugin of plugins) {\n const pluginManifestPath = join(configRoot, `${plugin.id}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n try {\n const content = readFileSync(pluginManifestPath, \"utf-8\");\n manifests.push(JSON.parse(content) as CannbotManifest);\n } catch {\n // ignore\n }\n }\n }\n\n return manifests;\n}\n\nexport function scanInstalled(): InstalledPlugin[] {\n const plugins = getAllPlugins();\n const installed: InstalledPlugin[] = [];\n const tools: AITool[] = [\"opencode\", \"claude\", \"trae\", \"cursor\", \"copilot\"];\n const levels: InstallLevel[] = [\"project\", \"global\"];\n\n for (const tool of tools) {\n for (const level of levels) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n\n for (const manifest of manifests) {\n const plugin = plugins.find((p) => p.id === manifest.team);\n if (!plugin) continue;\n\n // 验证实际文件是否存在\n if (!verifyPluginFilesExist(configRoot, manifest, tool, level)) {\n continue;\n }\n\n const alreadyAdded = installed.some(\n (p) => p.id === plugin.id && p.tool === tool && p.level === level\n );\n if (alreadyAdded) continue;\n\n installed.push({\n id: plugin.id,\n displayName: plugin.displayName,\n tool,\n level,\n skillsCount: manifest.installed_skills?.length || 0,\n agentsCount: manifest.installed_agents?.length || 0,\n installTime: manifest.install_time,\n configRoot,\n });\n }\n }\n }\n\n return installed;\n}\n\nfunction verifyPluginFilesExist(configRoot: string, manifest: CannbotManifest, tool: AITool, level: InstallLevel): boolean {\n const skillsDir = join(configRoot, \"skills\");\n const agentsDir = join(configRoot, \"agents\");\n \n // 验证 skills\n if (manifest.installed_skills && manifest.installed_skills.length > 0) {\n const hasAnySkill = manifest.installed_skills.some((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath);\n });\n if (!hasAnySkill) return false;\n }\n \n // 验证 agents\n if (manifest.installed_agents && manifest.installed_agents.length > 0) {\n const hasAnyAgent = manifest.installed_agents.some((agentId) => {\n const agentPath = join(agentsDir, agentId);\n return existsSync(agentPath);\n });\n if (!hasAnyAgent) return false;\n }\n \n // 验证 AGENTS.md\n // For opencode project level, AGENTS.md is in project root, not in configRoot\n let agentsMdPath: string;\n if (tool === \"opencode\" && level === \"project\") {\n // For opencode project level, AGENTS.md is in project root\n agentsMdPath = join(configRoot, \"..\", \"AGENTS.md\");\n } else {\n agentsMdPath = join(configRoot, \"AGENTS.md\");\n }\n if (!existsSync(agentsMdPath)) return false;\n \n return true;\n}\n\nexport function isPluginInstalled(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): boolean {\n const installed = scanInstalled();\n return installed.some(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n\nexport function getInstalledPlugin(\n pluginId: string,\n tool?: AITool,\n level?: InstallLevel\n): InstalledPlugin | undefined {\n const installed = scanInstalled();\n return installed.find(\n (p) =>\n p.id === pluginId &&\n (!tool || p.tool === tool) &&\n (!level || p.level === level)\n );\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport { t } from \"./i18n.js\";\n\nexport const logger = {\n success: (msg: string) => console.log(chalk.green(\"✓\") + \" \" + msg),\n error: (msg: string) => console.log(chalk.red(\"✗\") + \" \" + msg),\n warn: (msg: string) => console.log(chalk.yellow(\"⚠\") + \" \" + msg),\n info: (msg: string) => console.log(chalk.cyan(\"→\") + \" \" + msg),\n step: (msg: string) => console.log(chalk.dim(msg)),\n blank: () => console.log(),\n};\n\nexport function createSpinner(text: string): Ora {\n return ora({ text, color: \"cyan\" });\n}\n\nexport function printBanner(subtitle?: string): void {\n console.log(chalk.cyan(`\n ____ _ _ _ _ _ ____ _\n / ___| / \\\\ | \\\\ | | \\\\ | | __ ) ___ | |_\n | | / _ \\\\ | \\\\| | \\\\| | _ \\\\ / _ \\\\| __|\n | |___ / ___ \\\\| |\\\\ | |\\\\ | |_) | (_) | |_\n \\\\____/_/ \\\\_\\\\_| \\\\_|_| \\\\_|____/ \\\\___/ \\\\__|\n`));\n if (subtitle) {\n console.log(chalk.bold(` ${subtitle}`));\n console.log();\n }\n}\n\nfunction getDisplayWidth(str: string): number {\n let width = 0;\n for (const ch of str) {\n const code = ch.codePointAt(0)!;\n if (\n (code >= 0x2E80 && code <= 0x9FFF) ||\n (code >= 0xF900 && code <= 0xFAFF) ||\n (code >= 0xFE30 && code <= 0xFE4F) ||\n (code >= 0xFF00 && code <= 0xFFEF) ||\n (code >= 0x3400 && code <= 0x4DBF) ||\n (code >= 0x20000 && code <= 0x2A6DF) ||\n (code >= 0x2A700 && code <= 0x2B73F) ||\n (code >= 0x2B740 && code <= 0x2B81F) ||\n (code >= 0x2B820 && code <= 0x2CEAF)\n ) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\nexport function printBoxTitle(title: string, width: number = 65): void {\n const border = \"═\".repeat(width);\n const displayWidth = getDisplayWidth(title);\n const totalPadding = width - displayWidth;\n const leftPadding = Math.floor(totalPadding / 2);\n const rightPadding = totalPadding - leftPadding;\n const paddedTitle = \" \".repeat(Math.max(0, leftPadding)) + title + \" \".repeat(Math.max(0, rightPadding));\n console.log();\n console.log(chalk.cyan.bold(` ╔${border}╗`));\n console.log(chalk.cyan.bold(` ║`) + chalk.cyan.bold(paddedTitle) + chalk.cyan.bold(`║`));\n console.log(chalk.cyan.bold(` ╚${border}╝`));\n console.log();\n}\n\nexport function showOperationHints(isCheckbox: boolean = false): void {\n if (isCheckbox) {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m ${t(\"hint_select_move\")} | \\x1b[36m${t(\"hint_select_space\")}\\x1b[0m ${t(\"hint_select_check\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}(${t(\"hint_checkbox_suffix\")})\\n`);\n } else {\n console.log(` 💡 \\x1b[36m↑↓\\x1b[0m ${t(\"hint_select_move\")} | \\x1b[36m⏎\\x1b[0m ${t(\"hint_select_confirm\")}\\n`);\n }\n}\n\nexport function printBox(content: string[]): void {\n const maxLen = Math.max(...content.map((line) => line.length));\n const border = \"─\".repeat(maxLen + 2);\n console.log(chalk.cyan(` ┌${border}┐`));\n for (const line of content) {\n console.log(chalk.cyan(\" │ \") + line.padEnd(maxLen) + chalk.cyan(\" │\"));\n }\n console.log(chalk.cyan(` └${border}┘`));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { parse, stringify } from \"yaml\";\nimport type { AppConfig } from \"../types/index.js\";\n\nexport function getConfigDir(): string {\n return join(homedir(), \".cannbot\");\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.yaml\");\n}\n\nexport function readConfig(): AppConfig {\n const configPath = getConfigPath();\n if (!existsSync(configPath)) {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n const parsed = parse(content) as Partial<AppConfig>;\n return {\n language: parsed.language || \"zh_CN\",\n lastTool: parsed.lastTool,\n lastLevel: parsed.lastLevel,\n repoPath: parsed.repoPath,\n installedPlugins: parsed.installedPlugins || [],\n };\n } catch {\n return {\n language: \"zh_CN\",\n installedPlugins: [],\n };\n }\n}\n\nexport function writeConfig(config: AppConfig): void {\n const configDir = getConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const configPath = getConfigPath();\n const content = stringify(config);\n writeFileSync(configPath, content, \"utf-8\");\n}\n\nexport function updateConfig(updates: Partial<AppConfig>): AppConfig {\n const config = readConfig();\n const updated = { ...config, ...updates };\n writeConfig(updated);\n return updated;\n}\n\nexport function addInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n if (!config.installedPlugins.includes(pluginId)) {\n config.installedPlugins.push(pluginId);\n writeConfig(config);\n }\n}\n\nexport function removeInstalledPlugin(pluginId: string): void {\n const config = readConfig();\n config.installedPlugins = config.installedPlugins.filter(\n (id) => id !== pluginId\n );\n writeConfig(config);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nexport const selectTheme = {\n helpMode: \"never\" as const,\n};\n\nexport const checkboxTheme = {\n icon: {\n checked: \"\\x1b[32m☑\\x1b[22m\",\n unchecked: \"☐\",\n cursor: \"❯\",\n },\n helpMode: \"never\" as const,\n};\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execa } from \"execa\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir, getCannbotRepoPath } from \"../utils/paths.js\";\nimport {\n scanSkills,\n getCurrentCommit,\n readScanCache,\n writeScanCache,\n} from \"./scanner.js\";\nimport { initFromScan } from \"./skill-registry.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction loadRepoUrl(): string {\n if (process.env.CANNBOT_REPO_URL) {\n return process.env.CANNBOT_REPO_URL;\n }\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n return config.repository?.url || \"https://gitcode.com/cann/cannbot-skills.git\";\n } catch {\n return \"https://gitcode.com/cann/cannbot-skills.git\";\n }\n}\n\nconst REPO_URL = loadRepoUrl();\n\nexport class RepositoryManager {\n private repoPath: string | undefined;\n\n constructor(customPath?: string) {\n this.repoPath = customPath;\n }\n\n async ensureRepo(): Promise<string> {\n if (this.repoPath && this.isValidRepo(this.repoPath)) {\n return this.repoPath;\n }\n\n const cwd = process.cwd();\n if (this.isValidRepo(cwd)) {\n this.repoPath = cwd;\n return cwd;\n }\n\n const envPath = process.env.CANNBOT_REPO_PATH;\n if (envPath && this.isValidRepo(envPath)) {\n this.repoPath = envPath;\n return envPath;\n }\n\n const cachedPath = getCannbotRepoPath();\n if (this.isValidRepo(cachedPath)) {\n this.repoPath = cachedPath;\n return cachedPath;\n }\n\n return await this.cloneRepo();\n }\n\n async ensureRepoAndScan(): Promise<string> {\n const repoPath = await this.ensureRepo();\n\n const cache = readScanCache();\n if (cache && cache.repoCommit === getCurrentCommit(repoPath)) {\n initFromScan(cache.skills);\n return repoPath;\n }\n\n const skills = scanSkills(repoPath);\n initFromScan(skills);\n\n writeScanCache({\n skills,\n repoCommit: getCurrentCommit(repoPath),\n timestamp: Date.now(),\n });\n\n return repoPath;\n }\n\n async updateRepo(): Promise<void> {\n const repoPath = await this.ensureRepo();\n try {\n await execa(\"git\", [\"pull\", \"--quiet\"], { cwd: repoPath, timeout: 30000 });\n } catch {\n // Ignore update failures\n }\n }\n\n getRepoPath(): string {\n if (!this.repoPath) {\n throw new Error(\"Repository not initialized. Call ensureRepo() first.\");\n }\n return this.repoPath;\n }\n\n private isValidRepo(path: string): boolean {\n if (!existsSync(path)) return false;\n const gitDir = join(path, \".git\");\n const pluginsDir = join(path, \"plugins-official\");\n return existsSync(gitDir) && existsSync(pluginsDir);\n }\n\n private async cloneRepo(): Promise<string> {\n const configDir = getCannbotConfigDir();\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n const targetPath = getCannbotRepoPath();\n if (existsSync(targetPath)) {\n if (this.isValidRepo(targetPath)) {\n this.repoPath = targetPath;\n return targetPath;\n }\n }\n\n try {\n await execa(\n \"git\",\n [\"clone\", \"--depth\", \"1\", REPO_URL, targetPath],\n { timeout: 120000 }\n );\n this.repoPath = targetPath;\n return targetPath;\n } catch (error) {\n throw new Error(\n `Failed to clone repository: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n}\n\nexport function createRepositoryManager(customPath?: string): RepositoryManager {\n return new RepositoryManager(customPath);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync, mkdirSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { parse as parseYaml } from \"yaml\";\nimport { getCannbotConfigDir } from \"../utils/paths.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport interface ScannedSkill {\n id: string;\n description: string;\n source: string;\n filePath: string;\n}\n\nexport interface ScanCache {\n skills: ScannedSkill[];\n repoCommit: string;\n timestamp: number;\n}\n\nconst EXCLUDE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \"asc-devkit\",\n \"cann-samples\",\n \"tilelang-ascend\",\n \".agents\",\n \".opencode\",\n \".claude\",\n \".claude-plugin\",\n \"dist\",\n \"build\",\n \"references\",\n \"hooks\",\n \"operators\",\n \"workflows\",\n \"tests\",\n \"docs\",\n \"scripts\",\n]);\n\nfunction loadScanConfig(): { skillDirs: string[]; pluginDirs: string[] } {\n const configPath = join(__dirname, \"config\", \"repository.yaml\");\n try {\n const config = parseYaml(readFileSync(configPath, \"utf-8\"));\n return {\n skillDirs: config.scanDirs || [\"ops\", \"model\", \"graph\", \"infra\", \"ops-lab\"],\n pluginDirs: config.pluginDirs || [\"plugins-official\", \"plugins-community\"],\n };\n } catch {\n return {\n skillDirs: [\"ops\", \"model\", \"graph\", \"infra\", \"ops-lab\"],\n pluginDirs: [\"plugins-official\", \"plugins-community\"],\n };\n }\n}\n\nconst scanConfig = loadScanConfig();\nconst SKILL_SCAN_DIRS = scanConfig.skillDirs;\nconst PLUGIN_SCAN_DIRS = scanConfig.pluginDirs;\n\nexport function scanSkills(repoPath: string): ScannedSkill[] {\n const skills: ScannedSkill[] = [];\n const seen = new Set<string>();\n\n for (const dir of SKILL_SCAN_DIRS) {\n const fullPath = join(repoPath, dir);\n if (!existsSync(fullPath)) continue;\n scanDirectory(fullPath, repoPath, dir, skills, seen);\n }\n\n for (const pluginDir of PLUGIN_SCAN_DIRS) {\n const pluginParent = join(repoPath, pluginDir);\n if (!existsSync(pluginParent)) continue;\n \n for (const plugin of safeReaddir(pluginParent)) {\n const pluginPath = join(pluginParent, plugin);\n if (!isDirectory(pluginPath)) continue;\n\n const skillsDir = join(pluginPath, \"skills\");\n if (existsSync(skillsDir)) {\n scanDirectory(skillsDir, repoPath, `${pluginDir}/${plugin}/skills`, skills, seen);\n }\n\n const skillDir = join(pluginPath, \"skill\");\n if (existsSync(skillDir)) {\n scanDirectory(skillDir, repoPath, `${pluginDir}/${plugin}/skill`, skills, seen);\n }\n }\n }\n\n return skills;\n}\n\nexport function parseFrontmatter(filePath: string): { name: string; description: string } | null {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n \n if (lines.length < 3) return null;\n if (lines[0].trim() !== \"---\") return null;\n\n let endIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === \"---\") {\n endIndex = i;\n break;\n }\n }\n\n if (endIndex === -1) return null;\n\n const yamlBlock = lines.slice(1, endIndex).map(l => l.replace(/\\r$/, \"\")).join(\"\\n\");\n const parsed = parseYaml(yamlBlock);\n\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!parsed.name || typeof parsed.name !== \"string\") return null;\n\n return {\n name: parsed.name.trim(),\n description: (parsed.description || \"\").trim(),\n };\n } catch {\n return null;\n }\n}\n\nexport function getCurrentCommit(repoPath: string): string {\n try {\n const headFile = join(repoPath, \".git\", \"HEAD\");\n if (!existsSync(headFile)) return \"unknown\";\n \n const headContent = readFileSync(headFile, \"utf-8\").trim();\n if (headContent.startsWith(\"ref: \")) {\n const refPath = join(repoPath, \".git\", headContent.slice(5));\n if (existsSync(refPath)) {\n return readFileSync(refPath, \"utf-8\").trim();\n }\n // Fallback to packed-refs for shallow clones\n const packedRefsPath = join(repoPath, \".git\", \"packed-refs\");\n if (existsSync(packedRefsPath)) {\n const packedRefs = readFileSync(packedRefsPath, \"utf-8\");\n const refName = headContent.slice(5);\n const lines = packedRefs.split(\"\\n\");\n for (const line of lines) {\n if (line.endsWith(refName)) {\n return line.split(\" \")[0];\n }\n }\n }\n }\n return headContent;\n } catch {\n return \"unknown\";\n }\n}\n\nexport function readScanCache(): ScanCache | null {\n try {\n const cachePath = getCachePath();\n if (!existsSync(cachePath)) return null;\n \n const content = readFileSync(cachePath, \"utf-8\");\n const cache = JSON.parse(content) as ScanCache;\n \n if (!cache.skills || !cache.timestamp) return null;\n \n const age = Date.now() - cache.timestamp;\n if (age > 24 * 60 * 60 * 1000) return null;\n \n return cache;\n } catch {\n return null;\n }\n}\n\nexport function writeScanCache(cache: ScanCache): void {\n try {\n const cachePath = getCachePath();\n const cacheDir = dirname(cachePath);\n if (!existsSync(cacheDir)) {\n mkdirSync(cacheDir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n } catch {\n }\n}\n\nfunction getCachePath(): string {\n return join(getCannbotConfigDir(), \"scan-cache.json\");\n}\n\nfunction scanDirectory(\n dirPath: string,\n repoPath: string,\n sourcePrefix: string,\n skills: ScannedSkill[],\n seen: Set<string>\n): void {\n // Check if dirPath itself contains SKILL.md (for skill/ directories)\n const selfSkillMd = join(dirPath, \"SKILL.md\");\n if (existsSync(selfSkillMd)) {\n const frontmatter = parseFrontmatter(selfSkillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: selfSkillMd,\n });\n }\n return; // Don't recurse into subdirectories\n }\n\n for (const entry of safeReaddir(dirPath)) {\n const fullPath = join(dirPath, entry);\n \n if (EXCLUDE_DIRS.has(entry)) continue;\n \n if (!isDirectory(fullPath)) continue;\n\n const skillMd = join(fullPath, \"SKILL.md\");\n if (existsSync(skillMd)) {\n const frontmatter = parseFrontmatter(skillMd);\n if (frontmatter && !seen.has(frontmatter.name)) {\n seen.add(frontmatter.name);\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n source: sourcePrefix,\n filePath: skillMd,\n });\n }\n continue;\n }\n\n scanDirectory(fullPath, repoPath, sourcePrefix, skills, seen);\n }\n}\n\nfunction safeReaddir(dir: string): string[] {\n try {\n return readdirSync(dir);\n } catch {\n return [];\n }\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport type { ScannedSkill } from \"./scanner.js\";\n\nexport interface SkillEntry {\n id: string;\n description: string;\n source: string;\n}\n\nexport interface SkillCategory {\n id: string;\n name: string;\n skills: SkillEntry[];\n}\n\nconst CATEGORY_DEFS: { id: string; name: string }[] = [\n { id: \"knowledge\", name: \"知识与参考\" },\n { id: \"env-tools\", name: \"环境与工具\" },\n { id: \"debug\", name: \"调试与诊断\" },\n { id: \"testing\", name: \"测试与质量\" },\n { id: \"ascendc\", name: \"AscendC 开发\" },\n { id: \"pypto\", name: \"PyPTO 开发\" },\n { id: \"tilelang\", name: \"TileLang 开发\" },\n { id: \"triton\", name: \"Triton 开发\" },\n { id: \"model\", name: \"模型推理优化\" },\n { id: \"graph\", name: \"图模式\" },\n { id: \"platform\", name: \"平台工具\" },\n { id: \"other\", name: \"其他 Skills\" },\n];\n\nlet dynamicSkills: SkillEntry[] = [];\nlet initialized = false;\n\nexport function initFromScan(scanned: ScannedSkill[]): void {\n dynamicSkills = scanned.map((s) => ({\n id: s.id,\n description: s.description,\n source: s.source,\n }));\n initialized = true;\n}\n\nexport function isScanInitialized(): boolean {\n return initialized;\n}\n\nconst STATIC_SKILL_CATEGORIES: SkillCategory[] = [\n {\n id: \"knowledge\",\n name: \"知识与参考\",\n skills: [\n { id: \"npu-arch\", description: \"NPU 架构知识、芯片型号映射\", source: \"ops\" },\n { id: \"ascendc-api-best-practices\", description: \"API 使用最佳实践\", source: \"ops\" },\n { id: \"ascendc-tiling-design\", description: \"Tiling 和 Kernel 设计方法论\", source: \"ops\" },\n { id: \"ascendc-docs-search\", description: \"API 文档索引 + 在线搜索\", source: \"ops\" },\n { id: \"ascendc-docs-gen\", description: \"算子文档写作参考\", source: \"ops\" },\n { id: \"ascendc-performance-best-practices\", description: \"性能优化经验总结\", source: \"ops\" },\n { id: \"ascendc-regbase-best-practice\", description: \"RegBase 算子 API 约束\", source: \"ops\" },\n { id: \"ops-precision-standard\", description: \"算子精度标准(atol/rtol)\", source: \"ops\" },\n { id: \"ops-spec-gen\", description: \"算子 spec.yaml 生成与校验\", source: \"ops\" },\n ],\n },\n {\n id: \"env-tools\",\n name: \"环境与工具\",\n skills: [\n { id: \"ascendc-env-check\", description: \"NPU 设备查询、CANN 环境验证\", source: \"ops\" },\n { id: \"cann-env-setup\", description: \"CANN 安装与环境配置指导\", source: \"ops\" },\n { id: \"ops-profiling\", description: \"NPU 性能采集与分析\", source: \"ops\" },\n { id: \"ops-simulator\", description: \"CANN Simulator 精度/性能仿真\", source: \"ops\" },\n { id: \"torch-ops-profiler\", description: \"torch_npu.profiler 性能报告\", source: \"ops\" },\n { id: \"aiss-tiling-solver\", description: \"AISS-TilingSolver 自动求解 Tiling 参数\", source: \"ops\" },\n ],\n },\n {\n id: \"debug\",\n name: \"调试与诊断\",\n skills: [\n { id: \"ascendc-precision-debug\", description: \"精度调试、症状-原因速查\", source: \"ops\" },\n { id: \"ascendc-runtime-debug\", description: \"运行时错误码解析\", source: \"ops\" },\n { id: \"ascendc-crash-debug\", description: \"卡死/崩溃调试、Coredump 分析\", source: \"ops\" },\n { id: \"ascendc-perf-optimize\", description: \"性能优化策略制定\", source: \"ops\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"npugraph_ex DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"npugraph_ex 编译期报错诊断\", source: \"graph\" },\n ],\n },\n {\n id: \"testing\",\n name: \"测试与质量\",\n skills: [\n { id: \"ascendc-code-review\", description: \"代码检视方法论\", source: \"ops\" },\n { id: \"ascendc-ut-develop\", description: \"UT 开发与覆盖率增强\", source: \"ops\" },\n { id: \"ascendc-st-design\", description: \"ST 测试用例设计\", source: \"ops\" },\n { id: \"ascendc-whitebox-design\", description: \"白盒测试用例生成\", source: \"ops\" },\n { id: \"ascendc-task-focus\", description: \"长任务聚焦防迷失\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"TileLang 测试设计\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"TileLang 代码格式检查\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"Triton 算子验证\", source: \"ops\" },\n ],\n },\n {\n id: \"ascendc\",\n name: \"AscendC 开发\",\n skills: [\n { id: \"ascendc-direct-invoke-template\", description: \"Kernel 直调工程模板\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-template\", description: \"自定义算子工程模板\", source: \"ops\" },\n { id: \"ascendc-direct-invoke-to-registry-invoke\", description: \"直调转注册调用\", source: \"ops\" },\n { id: \"ascendc-registry-invoke-to-direct-invoke\", description: \"注册调用转直调\", source: \"ops\" },\n { id: \"ascendc-blaze-best-practice\", description: \"Matmul/GEMM Blaze 直调生成\", source: \"ops\" },\n { id: \"ascendc-simt-best-practices\", description: \"SIMT 最佳实践与 API 导航\", source: \"ops\" },\n { id: \"ascendc-simt-tiling-design\", description: \"SIMT 算子切分设计\", source: \"ops\" },\n { id: \"torch-ascendc-op-extension\", description: \"Ascend C 对接 PyTorch\", source: \"ops\" },\n { id: \"catlass-op-design\", description: \"Catlass 算子设计\", source: \"ops\" },\n { id: \"catlass-op-develop\", description: \"Catlass 算子开发\", source: \"ops\" },\n { id: \"catlass-op-perf-tune\", description: \"Catlass 性能调优\", source: \"ops\" },\n { id: \"cuda2ascend-simt\", description: \"CUDA 迁移到 Ascend C SIMT\", source: \"ops-lab\" },\n { id: \"ops-direct-invoke-flash\", description: \"从零构建 Ascend C 核函数\", source: \"plugins-official/ops-direct-invoke-flash/skills\" },\n { id: \"ops-registry-invoke-workflow\", description: \"注册调用工作流\", source: \"plugins-official/ops-registry-invoke\" },\n { id: \"ops-easyasc-dsl\", description: \"EasyASC DSL 算子开发\", source: \"plugins-community/ops-easyasc-dsl/skill\" },\n ],\n },\n {\n id: \"pypto\",\n name: \"PyPTO 开发\",\n skills: [\n { id: \"pypto-intent-understand\", description: \"需求意图理解与规格生成\", source: \"ops\" },\n { id: \"pypto-api-explore\", description: \"API 可行性探索与分析\", source: \"ops\" },\n { id: \"pypto-op-design\", description: \"算子方案设计生成\", source: \"ops\" },\n { id: \"pypto-golden-generate\", description: \"Golden 参考实现生成\", source: \"ops\" },\n { id: \"pypto-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"pypto-precision-debug\", description: \"精度问题排查\", source: \"ops\" },\n { id: \"pypto-precision-compare\", description: \"精度对比分析\", source: \"ops\" },\n { id: \"pypto-op-perf-tune\", description: \"性能分析与调优\", source: \"ops\" },\n ],\n },\n {\n id: \"tilelang\",\n name: \"TileLang 开发\",\n skills: [\n { id: \"tilelang-env-check\", description: \"环境检查与配置验证\", source: \"ops\" },\n { id: \"tilelang-submodule-pull\", description: \"三方库与子模块拉取\", source: \"ops\" },\n { id: \"tilelang-api-best-practices\", description: \"TileLang API 最佳实践\", source: \"ops\" },\n { id: \"tilelang-programming-model-guide\", description: \"Developer/Expert 模式选择\", source: \"ops\" },\n { id: \"tilelang-op-design\", description: \"算子设计文档生成\", source: \"ops\" },\n { id: \"tilelang-op-develop\", description: \"算子代码实现与测试\", source: \"ops\" },\n { id: \"tilelang-op-test-design\", description: \"测试设计与覆盖率分析\", source: \"ops\" },\n { id: \"tilelang-perf-optimization\", description: \"性能调优与劣化检查\", source: \"ops\" },\n { id: \"tilelang-review\", description: \"代码格式检查与修复\", source: \"ops\" },\n ],\n },\n {\n id: \"triton\",\n name: \"Triton 开发\",\n skills: [\n { id: \"triton-task-extractor\", description: \"算子任务提取与构建\", source: \"ops\" },\n { id: \"triton-op-designer\", description: \"算法草图设计\", source: \"ops\" },\n { id: \"triton-op-coding\", description: \"Triton 内核代码生成\", source: \"ops\" },\n { id: \"triton-op-verifier\", description: \"算子精度和性能验证\", source: \"ops\" },\n { id: \"triton-latency-optimizer\", description: \"Triton 代码性能优化\", source: \"ops\" },\n ],\n },\n {\n id: \"model\",\n name: \"模型推理优化\",\n skills: [\n { id: \"model-infer-migrator\", description: \"框架适配与部署基线\", source: \"model\" },\n { id: \"model-infer-parallel-analysis\", description: \"并行策略分析(TP/EP/DP)\", source: \"model\" },\n { id: \"model-infer-parallel-impl\", description: \"并行切分实施\", source: \"model\" },\n { id: \"model-infer-kvcache\", description: \"KVCache 优化 + FA 替换\", source: \"model\" },\n { id: \"model-infer-fusion\", description: \"torch_npu 融合算子替换\", source: \"model\" },\n { id: \"model-infer-graph-mode\", description: \"torch.compile 图模式适配\", source: \"model\" },\n { id: \"model-infer-multi-stream\", description: \"多流并行优化\", source: \"model\" },\n { id: \"model-infer-prefetch\", description: \"权重预取适配\", source: \"model\" },\n { id: \"model-infer-superkernel\", description: \"SuperKernel 适配\", source: \"model\" },\n { id: \"model-infer-precision-debug\", description: \"NPU 推理精度诊断\", source: \"model\" },\n { id: \"model-infer-runtime-debug\", description: \"NPU 推理运行时错误诊断\", source: \"model\" },\n ],\n },\n {\n id: \"graph\",\n name: \"图模式\",\n skills: [\n { id: \"torch-npugraph-ex-knowledge\", description: \"npugraph_ex 使用指南\", source: \"graph\" },\n { id: \"torch-npugraph-ex-template\", description: \"npugraph_ex MRE 代码模板\", source: \"graph\" },\n { id: \"torch-npugraph-ex-dfx-triage\", description: \"DFX 问题分诊\", source: \"graph\" },\n { id: \"torch-npugraph-ex-compile-error-diagnosis\", description: \"编译期报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-runtime-error-diagnosis\", description: \"运行时报错诊断\", source: \"graph\" },\n { id: \"torch-npugraph-ex-performance-diagnosis\", description: \"性能诊断\", source: \"graph\" },\n { id: \"torch-custom-ops-guide\", description: \"自定义算子入图指南\", source: \"graph\" },\n ],\n },\n {\n id: \"platform\",\n name: \"平台工具\",\n skills: [\n { id: \"gitcode-pr-handler\", description: \"GitCode PR 标题/描述生成\", source: \"infra\" },\n { id: \"gitcode-issue-gen\", description: \"GitCode Issue 生成与关联\", source: \"infra\" },\n { id: \"gitcode-issue-handler\", description: \"GitCode Issue 端到端处置\", source: \"infra\" },\n { id: \"gitcode-toolkit\", description: \"GitCode 协作通用参考\", source: \"infra\" },\n { id: \"cannbot-skill-reviewer\", description: \"Skill 入库质量审查\", source: \"infra\" },\n ],\n },\n];\n\nconst CATEGORY_MAP: Record<string, string> = {};\nfor (const cat of STATIC_SKILL_CATEGORIES) {\n for (const skill of cat.skills) {\n CATEGORY_MAP[skill.id] = cat.id;\n }\n}\n\nfunction getActiveSkills(): SkillEntry[] {\n if (initialized) return deduplicate(dynamicSkills);\n return deduplicate(STATIC_SKILL_CATEGORIES.flatMap((c) => c.skills));\n}\n\nfunction deduplicate(skills: SkillEntry[]): SkillEntry[] {\n const seen = new Set<string>();\n const result: SkillEntry[] = [];\n for (const skill of skills) {\n if (!seen.has(skill.id)) {\n result.push(skill);\n seen.add(skill.id);\n }\n }\n return result;\n}\n\nexport function findSkill(query: string): SkillEntry | undefined {\n const normalized = query.toLowerCase().trim();\n const pool = getActiveSkills();\n return pool.find((s) => s.id === normalized);\n}\n\nexport function getAllSkills(): SkillEntry[] {\n return getActiveSkills();\n}\n\nexport function getSkillsByCategory(categoryId: string): SkillEntry[] {\n return getAllCategories().find((c) => c.id === categoryId)?.skills ?? [];\n}\n\nexport function getAllCategories(): SkillCategory[] {\n const skills = getActiveSkills();\n return CATEGORY_DEFS.map((def) => ({\n id: def.id,\n name: def.name,\n skills: skills.filter((s) => {\n const catId = CATEGORY_MAP[s.id];\n if (catId) return catId === def.id;\n return def.id === \"other\";\n }),\n })).filter((cat) => cat.skills.length > 0);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport type { AITool, InstallLevel, InstallOptions, InstallResult, BackupInfo } from \"../types/index.js\";\nimport { getPluginById } from \"./registry.js\";\nimport { readManifest } from \"./manifest.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { scanInstalledFiles, writeRecord } from \"./record.js\";\nimport { detectCurrentPlugin, createBackup, getAgentsFileName } from \"./backup.js\";\nimport { showOverwriteWarning } from \"../ui/backup-prompts.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport async function installPlugin(\n opts: InstallOptions\n): Promise<InstallResult> {\n const plugin = getPluginById(opts.pluginId);\n if (!plugin) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Plugin not found: ${opts.pluginId}`],\n warnings: [],\n };\n }\n\n const scriptPath = join(opts.repoPath, plugin.dir, plugin.script);\n if (!existsSync(scriptPath)) {\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [`Script not found: ${scriptPath}`],\n warnings: [],\n };\n }\n\n const args = [opts.level, opts.tool];\n if (opts.installPath) {\n args.push(opts.installPath);\n }\n\n const cwd = opts.installPath || process.cwd();\n\n const configRoot = getConfigRoot(opts.tool, opts.level, opts.installPath);\n const agentsFile = join(configRoot, getAgentsFileName(opts.tool));\n let backupInfo: BackupInfo | null = null;\n\n if (existsSync(agentsFile)) {\n const currentPlugin = detectCurrentPlugin(configRoot, opts.tool);\n\n if (currentPlugin && currentPlugin.pluginId !== opts.pluginId) {\n let choice: \"overwrite\" | \"cancel\" = \"overwrite\";\n \n if (!opts.yes) {\n choice = await showOverwriteWarning(\n currentPlugin.pluginName,\n plugin.displayName\n );\n }\n\n if (choice === \"cancel\") {\n logger.info(t(\"backup_cancel\"));\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [t(\"backup_cancel\")],\n warnings: [],\n };\n }\n\n backupInfo = createBackup(\n configRoot,\n opts.tool,\n currentPlugin.pluginId,\n currentPlugin.pluginName\n );\n\n if (backupInfo) {\n logger.success(`${t(\"backup_created\")}: ${backupInfo.filePath}`);\n }\n }\n }\n\n try {\n const execOptions: any = {\n cwd,\n timeout: 300000,\n stdio: \"pipe\",\n input: opts.yes ? \"y\\n\" : undefined,\n };\n \n await execa(\"bash\", [scriptPath, ...args], execOptions);\n\n const manifest = readManifest(configRoot);\n\n let skillsCount = 0;\n let agentsCount = 0;\n\n if (manifest) {\n skillsCount = manifest.installed_skills?.length || 0;\n agentsCount = manifest.installed_agents?.length || 0;\n } else {\n skillsCount = plugin.skills;\n agentsCount = plugin.agents;\n }\n\n try {\n const record = scanInstalledFiles(\n opts.pluginId,\n plugin.displayName,\n opts.tool,\n opts.level,\n cwd,\n configRoot,\n manifest\n );\n \n if (backupInfo) {\n record.backup = {\n filePath: backupInfo.filePath,\n fromPluginId: backupInfo.pluginId,\n fromPluginName: backupInfo.pluginName,\n backupTime: backupInfo.backupTime,\n };\n }\n \n writeRecord(record);\n } catch {\n // Record writing is best-effort, don't fail install\n }\n\n return {\n success: true,\n pluginId: opts.pluginId,\n skillsCount,\n agentsCount,\n errors: [],\n warnings: [],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n pluginId: opts.pluginId,\n skillsCount: 0,\n agentsCount: 0,\n errors: [errorMessage],\n warnings: [],\n };\n }\n}\n\nexport async function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string,\n installPath?: string,\n yes?: boolean\n): Promise<InstallResult[]> {\n const results: InstallResult[] = [];\n\n for (const pluginId of pluginIds) {\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n installPath,\n yes,\n });\n results.push(result);\n }\n\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, lstatSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { getCannbotConfigDir, getConfigRoot } from \"../utils/paths.js\";\nimport type { AITool, InstallLevel, CannbotManifest } from \"../types/index.js\";\n\nexport interface InstallRecord {\n pluginId: string;\n displayName: string;\n tool: AITool;\n level: InstallLevel;\n installPath: string;\n configRoot: string;\n installTime: string;\n files: string[];\n directories: string[];\n backup?: {\n filePath: string;\n fromPluginId: string;\n fromPluginName: string;\n backupTime: string;\n };\n}\n\nfunction getInstallsDir(): string {\n return join(getCannbotConfigDir(), \"installs\");\n}\n\nexport function getRecordPath(pluginId: string): string {\n return join(getInstallsDir(), `${pluginId}.json`);\n}\n\nexport function readRecord(pluginId: string): InstallRecord | null {\n const recordPath = getRecordPath(pluginId);\n if (!existsSync(recordPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as InstallRecord;\n } catch {\n return null;\n }\n}\n\nexport function writeRecord(record: InstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n\n const recordPath = getRecordPath(record.pluginId);\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function deleteRecord(pluginId: string): void {\n const recordPath = getRecordPath(pluginId);\n if (existsSync(recordPath)) {\n unlinkSync(recordPath);\n }\n}\n\nexport function scanInstalledFiles(\n pluginId: string,\n displayName: string,\n tool: AITool,\n level: InstallLevel,\n installPath: string,\n configRoot: string,\n manifest: CannbotManifest | null\n): InstallRecord {\n const files: string[] = [];\n const directories: string[] = [];\n\n if (manifest) {\n const skillsDir = join(configRoot, \"skills\");\n if (existsSync(skillsDir)) {\n directories.push(skillsDir);\n for (const skillName of manifest.installed_skills || []) {\n const skillPath = join(skillsDir, skillName);\n if (existsSync(skillPath) || isSymlink(skillPath)) {\n files.push(skillPath);\n }\n }\n }\n\n const agentsDir = join(configRoot, \"agents\");\n if (existsSync(agentsDir)) {\n directories.push(agentsDir);\n for (const agentName of manifest.installed_agents || []) {\n const agentPath = join(agentsDir, agentName);\n const agentPathMd = join(agentsDir, agentName + \".md\");\n if (existsSync(agentPath) || isSymlink(agentPath)) {\n files.push(agentPath);\n } else if (existsSync(agentPathMd) || isSymlink(agentPathMd)) {\n files.push(agentPathMd);\n }\n }\n }\n }\n\n const workflowsLink = join(configRoot, \"workflows\");\n if (isSymlink(workflowsLink)) {\n files.push(workflowsLink);\n }\n\n const manifestPath = join(configRoot, \"cannbot-manifest.json\");\n if (existsSync(manifestPath)) {\n files.push(manifestPath);\n }\n\n const pluginManifestPath = join(configRoot, `${pluginId}-manifest.json`);\n if (existsSync(pluginManifestPath)) {\n files.push(pluginManifestPath);\n }\n\n const configFileName = tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n const configFilePath = level === \"project\"\n ? join(installPath, configFileName)\n : join(configRoot, configFileName);\n if (existsSync(configFilePath)) {\n files.push(configFilePath);\n }\n\n const repoLinks = [\"asc-devkit\", \"pypto\", \"tilelang-ascend\", \"cann-recipes-infer\", \"cann-samples\"];\n for (const repoName of repoLinks) {\n const repoLinkPath = join(installPath, repoName);\n if (isSymlink(repoLinkPath)) {\n files.push(repoLinkPath);\n }\n const repoLinkInConfig = join(configRoot, repoName);\n if (isSymlink(repoLinkInConfig)) {\n files.push(repoLinkInConfig);\n }\n }\n\n return {\n pluginId,\n displayName,\n tool,\n level,\n installPath,\n configRoot,\n installTime: new Date().toISOString(),\n files,\n directories,\n };\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n// === Skill-level install records ===\n\nexport interface SkillInstallEntry {\n skills: string[];\n installTime: string;\n}\n\nexport interface SkillInstallRecord {\n [tool: string]: {\n [level: string]: {\n [installPath: string]: SkillInstallEntry;\n };\n };\n}\n\nfunction getSkillRecordPath(): string {\n return join(getInstallsDir(), \"skills.json\");\n}\n\nexport function readSkillRecord(): SkillInstallRecord {\n const recordPath = getSkillRecordPath();\n if (!existsSync(recordPath)) {\n return {};\n }\n try {\n const content = readFileSync(recordPath, \"utf-8\");\n return JSON.parse(content) as SkillInstallRecord;\n } catch {\n return {};\n }\n}\n\nexport function writeSkillRecord(record: SkillInstallRecord): void {\n const installsDir = getInstallsDir();\n if (!existsSync(installsDir)) {\n mkdirSync(installsDir, { recursive: true });\n }\n const recordPath = getSkillRecordPath();\n writeFileSync(recordPath, JSON.stringify(record, null, 2), \"utf-8\");\n}\n\nexport function addSkillsToRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]) record[tool] = {};\n if (!record[tool][level]) record[tool][level] = {};\n if (!record[tool][level][installPath]) {\n record[tool][level][installPath] = { skills: [], installTime: \"\" };\n }\n const entry = record[tool][level][installPath];\n for (const id of skillIds) {\n if (!entry.skills.includes(id)) {\n entry.skills.push(id);\n }\n }\n entry.installTime = new Date().toISOString();\n writeSkillRecord(record);\n}\n\nexport function removeSkillsFromRecord(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): void {\n const record = readSkillRecord();\n if (!record[tool]?.[level]?.[installPath]) return;\n const entry = record[tool][level][installPath];\n entry.skills = entry.skills.filter((id) => !skillIds.includes(id));\n if (entry.skills.length === 0) {\n delete record[tool][level][installPath];\n if (Object.keys(record[tool][level]).length === 0) {\n delete record[tool][level];\n if (Object.keys(record[tool]).length === 0) {\n delete record[tool];\n }\n }\n }\n writeSkillRecord(record);\n}\n\nexport function getInstalledSkills(\n tool: AITool,\n level: InstallLevel,\n installPath: string\n): string[] {\n const record = readSkillRecord();\n const recordedSkills = record[tool]?.[level]?.[installPath]?.skills || [];\n \n // 验证实际文件是否存在\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n \n return recordedSkills.filter((skillId) => {\n const skillPath = join(skillsDir, skillId);\n return existsSync(skillPath) || isSymlink(skillPath);\n });\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, copyFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport type { AITool, BackupInfo } from \"../types/index.js\";\nimport { readManifest } from \"./manifest.js\";\nimport { readRecord } from \"./record.js\";\nimport { findPlugin } from \"./registry.js\";\n\nexport function getAgentsFileName(tool: AITool): string {\n return tool === \"claude\" ? \"CLAUDE.md\" : \"AGENTS.md\";\n}\n\nexport function detectCurrentPlugin(\n configRoot: string,\n tool: AITool\n): { pluginId: string; pluginName: string } | null {\n const manifest = readManifest(configRoot);\n if (manifest?.team) {\n const plugin = findPlugin(manifest.team);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n if (!existsSync(agentsFile)) {\n return null;\n }\n\n const allRecords = readAllRecords();\n for (const record of allRecords) {\n if (record.configRoot === configRoot && record.tool === tool) {\n const plugin = findPlugin(record.pluginId);\n if (plugin) {\n return {\n pluginId: plugin.id,\n pluginName: plugin.displayName,\n };\n }\n }\n }\n\n return null;\n}\n\nexport function createBackup(\n configRoot: string,\n tool: AITool,\n fromPluginId: string,\n fromPluginName: string\n): BackupInfo | null {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n if (!existsSync(agentsFile)) {\n return null;\n }\n\n const timestamp = formatTimestamp(new Date());\n const backupFileName = `${getAgentsFileName(tool)}.cannbot-backup.${fromPluginId}.${timestamp}`;\n const backupPath = join(configRoot, backupFileName);\n\n try {\n copyFileSync(agentsFile, backupPath);\n return {\n filePath: backupPath,\n pluginId: fromPluginId,\n pluginName: fromPluginName,\n backupTime: timestamp,\n };\n } catch {\n return null;\n }\n}\n\nexport function findBackups(configRoot: string): BackupInfo[] {\n if (!existsSync(configRoot)) {\n return [];\n }\n\n const files = readdirSync(configRoot);\n const backups: BackupInfo[] = [];\n\n for (const file of files) {\n if (file.includes(\".cannbot-backup.\")) {\n const parts = file.split(\".cannbot-backup.\");\n if (parts.length === 2) {\n const pluginIdAndTime = parts[1];\n const lastDotIndex = pluginIdAndTime.lastIndexOf(\".\");\n if (lastDotIndex > 0) {\n const pluginId = pluginIdAndTime.substring(0, lastDotIndex);\n const timestamp = pluginIdAndTime.substring(lastDotIndex + 1);\n const plugin = findPlugin(pluginId);\n\n backups.push({\n filePath: join(configRoot, file),\n pluginId,\n pluginName: plugin?.displayName || pluginId,\n backupTime: timestamp,\n });\n }\n }\n }\n }\n\n return backups.sort((a, b) => b.backupTime.localeCompare(a.backupTime));\n}\n\nexport function restoreBackup(\n backupPath: string,\n configRoot: string,\n tool: AITool\n): boolean {\n try {\n const agentsFile = join(configRoot, getAgentsFileName(tool));\n copyFileSync(backupPath, agentsFile);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function deleteBackup(backupPath: string): boolean {\n try {\n if (existsSync(backupPath)) {\n unlinkSync(backupPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nfunction formatTimestamp(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}${month}${day}-${hours}${minutes}${seconds}`;\n}\n\nfunction readAllRecords(): any[] {\n const records: any[] = [];\n const plugins = [\n \"ops-direct-invoke\",\n \"ops-direct-invoke-flash\",\n \"ops-registry-invoke\",\n \"pypto-op-orchestrator\",\n \"triton-op-generator\",\n \"tilelang-op-orchestrator\",\n \"model-infer-optimize\",\n \"catlass-op-generator\",\n \"ops-code-reviewer\",\n \"torch-compile\",\n ];\n\n for (const pluginId of plugins) {\n const record = readRecord(pluginId);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { select } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { BackupInfo } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function showOverwriteWarning(\n currentPluginName: string,\n newPluginName: string\n): Promise<\"overwrite\" | \"cancel\"> {\n console.log();\n console.log(chalk.yellow(` ⚠️ ${t(\"backup_detected\")}`));\n console.log();\n console.log(` ${t(\"backup_current\")}: ${chalk.cyan(currentPluginName)}`);\n console.log(` ${t(\"backup_installing\")}: ${chalk.cyan(newPluginName)}`);\n console.log();\n console.log(` ${t(\"backup_overwrite_warning\")}`);\n console.log(` ${t(\"backup_auto_create\")}`);\n console.log();\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices: [\n { name: t(\"backup_overwrite\"), value: \"overwrite\" },\n { name: t(\"backup_cancel\"), value: \"cancel\" },\n ],\n });\n\n return choice;\n}\n\nexport async function showRestorePrompt(\n backups: BackupInfo[]\n): Promise<string | \"none\"> {\n console.log();\n console.log(chalk.cyan(` ${t(\"backup_restore_prompt\")}`));\n console.log();\n\n const choices = backups.map((b) => ({\n name: `${t(\"backup_restore\")} ${b.pluginName} (${b.backupTime})`,\n value: b.filePath,\n }));\n\n choices.push({ name: t(\"backup_only_uninstall\"), value: \"none\" });\n\n const choice = await select({\n message: t(\"backup_select_action\"),\n choices,\n });\n\n return choice;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, mkdirSync, symlinkSync, unlinkSync, readdirSync, rmdirSync, realpathSync, lstatSync } from \"fs\";\nimport { join } from \"path\";\nimport { select, checkbox, Separator } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { getConfigRoot } from \"../utils/paths.js\";\nimport { logger, createSpinner, printBoxTitle, showOperationHints } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getAllCategories, findSkill, getAllSkills } from \"./skill-registry.js\";\nimport { addSkillsToRecord, removeSkillsFromRecord, getInstalledSkills } from \"./record.js\";\nimport { selectTheme, checkboxTheme } from \"../ui/theme.js\";\n\nexport interface SkillInstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport interface SkillUninstallResult {\n skillId: string;\n success: boolean;\n error?: string;\n}\n\nexport async function installSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n): Promise<SkillInstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const results: SkillInstallResult[] = [];\n const installedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const skill = findSkill(skillId);\n if (!skill) {\n results.push({ skillId, success: false, error: \"Skill not found in registry\" });\n continue;\n }\n\n const sourcePath = join(repoPath, skill.source, skill.id);\n const targetPath = join(skillsDir, skillId);\n\n if (!existsSync(sourcePath)) {\n results.push({ skillId, success: false, error: `Source not found: ${sourcePath}` });\n continue;\n }\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n }\n symlinkSync(realpathSync(sourcePath), targetPath);\n results.push({ skillId, success: true });\n installedIds.push(skillId);\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (installedIds.length > 0) {\n addSkillsToRecord(installedIds, tool, level, installPath);\n }\n\n return results;\n}\n\nexport async function uninstallSkills(\n skillIds: string[],\n tool: AITool,\n level: InstallLevel\n): Promise<SkillUninstallResult[]> {\n const configRoot = getConfigRoot(tool, level);\n const skillsDir = join(configRoot, \"skills\");\n const installPath = level === \"project\" ? process.cwd() : configRoot;\n\n const results: SkillUninstallResult[] = [];\n const removedIds: string[] = [];\n\n for (const skillId of skillIds) {\n const targetPath = join(skillsDir, skillId);\n\n try {\n if (existsSync(targetPath) || isSymlink(targetPath)) {\n unlinkSync(targetPath);\n results.push({ skillId, success: true });\n removedIds.push(skillId);\n logger.step(` ${t(\"uninstall_remove_label\")}: ${skillId}`);\n } else {\n results.push({ skillId, success: false, error: \"Not installed\" });\n logger.warn(`${skillId} ${t(\"uninstall_skill_not_installed\")}`);\n }\n } catch (error) {\n results.push({ skillId, success: false, error: error instanceof Error ? error.message : \"Unknown error\" });\n }\n }\n\n if (removedIds.length > 0) {\n removeSkillsFromRecord(removedIds, tool, level, installPath);\n }\n\n // Clean up empty skills directory\n if (existsSync(skillsDir)) {\n try {\n const entries = readdirSync(skillsDir);\n if (entries.length === 0) {\n rmdirSync(skillsDir);\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: skills/`);\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\nexport async function interactiveSkillSelect(\n tool: AITool,\n level: InstallLevel\n): Promise<string[] | \"back\" | \"cancel\"> {\n const BACK = \"__back__\";\n const CANCEL = \"__cancel__\";\n const categories = getAllCategories();\n\n let step = 0;\n let selectedCategoryId = \"\";\n\n while (true) {\n switch (step) {\n case 0: {\n printBoxTitle(t(\"wizard_step_3_skill_title\"));\n\n const categoryChoices: Array<{ name: string; value: string } | Separator> = [\n ...categories.map((cat) => ({\n name: `> ${cat.name} (${cat.skills.length} skills)`,\n value: cat.id,\n })),\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back\"), value: BACK },\n { name: \"x \" + t(\"wizard_cancel\"), value: CANCEL },\n ];\n\n showOperationHints();\n selectedCategoryId = await select({\n message: t(\"skill_select_category\"),\n choices: categoryChoices,\n loop: false,\n theme: selectTheme,\n pageSize: 15,\n });\n\n if (selectedCategoryId === BACK) return \"back\";\n if (selectedCategoryId === CANCEL) return \"cancel\";\n step = 1;\n break;\n }\n case 1: {\n const category = categories.find((c) => c.id === selectedCategoryId);\n if (!category) return [];\n\n printBoxTitle(t(\"wizard_step_4_skill_title\").replace(\"{category}\", category.name));\n\n const installPath = level === \"project\" ? process.cwd() : getConfigRoot(tool, level);\n const installedSkills = getInstalledSkills(tool, level, installPath);\n const installedSet = new Set(installedSkills);\n\n const skillChoices: Array<{ name: string; value: string; checked: boolean } | Separator> = category.skills.map((skill) => {\n const isInstalled = installedSet.has(skill.id);\n const suffix = isInstalled ? ` [${t(\"skill_already_installed\")}]` : \"\";\n return {\n name: `${skill.id}${suffix} — ${skill.description}`,\n value: skill.id,\n checked: false,\n };\n });\n showOperationHints(true);\n const selectedSkills = await checkbox({\n message: t(\"skill_select_items\"),\n choices: skillChoices,\n loop: false,\n instructions: false,\n theme: checkboxTheme,\n pageSize: 15,\n });\n\n const skillIds = selectedSkills;\n\n // 如果什么都没勾选,显示操作菜单\n if (skillIds.length === 0) {\n const action = await select({\n message: t(\"wizard_no_selection\"),\n choices: [\n new Separator(\"──────────────\"),\n { name: \"<- \" + t(\"wizard_back_to_reselect\"), value: \"back\" },\n { name: \"x \" + t(\"wizard_cancel\"), value: \"cancel\" },\n ],\n loop: false,\n theme: selectTheme,\n });\n if (action === \"back\") { step = 0; break; }\n return \"cancel\";\n }\n\n return skillIds;\n }\n }\n }\n}\n\nexport function listAllSkills(): void {\n const categories = getAllCategories();\n\n console.log();\n console.log(chalk.bold(` ${t(\"skill_list_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(60)));\n\n for (const category of categories) {\n console.log();\n console.log(chalk.bold(` ${category.name}`) + chalk.dim(` (${category.skills.length} skills)`));\n\n const table = new Table({\n style: { head: [], border: [] },\n colWidths: [35, 45],\n wordWrap: true,\n });\n\n for (const skill of category.skills) {\n table.push([\n chalk.cyan(skill.id),\n skill.description,\n ]);\n }\n\n console.log(table.toString());\n }\n\n console.log();\n console.log(chalk.dim(` ${t(\"skill_total_count\").replace(\"{count}\", String(getAllSkills().length))}`));\n console.log();\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport type { PluginEntry, InstalledPlugin, AITool } from \"../types/index.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getToolDisplayName } from \"../core/detector.js\";\nimport { findPlugin } from \"../core/registry.js\";\n\nexport function printPluginList(\n plugins: PluginEntry[],\n installed: Map<string, InstalledPlugin>\n): void {\n const table = new Table({\n head: [\n chalk.cyan(t(\"list_id\")),\n chalk.cyan(t(\"list_name\")),\n chalk.cyan(t(\"list_status\")),\n chalk.cyan(t(\"list_skills\")),\n chalk.cyan(t(\"list_agents\")),\n ],\n style: { head: [], border: [] },\n });\n\n plugins.forEach((plugin, index) => {\n const isInstalled = installed.has(plugin.id);\n const status = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`—`);\n\n table.push([\n String(index + 1),\n plugin.displayName,\n status,\n String(plugin.skills),\n String(plugin.agents),\n ]);\n });\n\n console.log();\n const countSuffix = t(\"count_suffix\");\n console.log(chalk.bold(` ${t(\"list_title\")} (${plugins.length}${countSuffix ? \" \" + countSuffix : \"\"})`));\n console.log(table.toString());\n console.log();\n}\n\nexport function printInstallSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>\n): void {\n const successCount = results.filter((r) => r.success).length;\n const totalCount = results.length;\n\n console.log();\n console.log(\n chalk.bold(\n ` ${t(\"install_done\")}! ${successCount}/${totalCount} ${t(\"install_success\")}`\n )\n );\n console.log();\n\n for (const result of results) {\n if (result.success) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${result.displayName} (${result.skillsCount} skills, ${result.agentsCount} agents)`\n );\n } else {\n console.log(chalk.red(\" ✗\") + ` ${result.displayName}`);\n }\n }\n console.log();\n}\n\nexport function printEnhancedSummary(\n results: Array<{\n pluginId: string;\n displayName: string;\n success: boolean;\n skillsCount: number;\n agentsCount: number;\n }>,\n tool: AITool,\n configRoot: string\n): void {\n const successResults = results.filter((r) => r.success);\n const totalSkills = successResults.reduce((sum, r) => sum + r.skillsCount, 0);\n const totalAgents = successResults.reduce((sum, r) => sum + r.agentsCount, 0);\n\n if (successResults.length === 0) {\n return;\n }\n\n const toolName = getToolDisplayName(tool);\n const countSuffix = t(\"count_suffix\");\n const lines = [\n chalk.bold(` ${t(\"install_done\")}!`),\n \"\",\n ` ${chalk.dim(t(\"install_installed_to\") + \":\")} ${configRoot}`,\n ` ${chalk.dim(t(\"install_skills_count\") + \":\")} ${totalSkills}${countSuffix ? \" \" + countSuffix : \"\"} ${chalk.dim(\"|\")} ${chalk.dim(t(\"install_agents_count\") + \":\")} ${totalAgents}${countSuffix ? \" \" + countSuffix : \"\"}`,\n \"\",\n chalk.bold(` ${t(\"install_enhanced_next_steps\")}:`),\n ` ${chalk.cyan(\"1.\")} ${t(\"install_enhanced_launch\")}: ${chalk.green(toolName.toLowerCase())}`,\n ` ${chalk.cyan(\"2.\")} ${t(\"install_enhanced_try\")}: ${chalk.green(t(\"try_prompt\"))}`,\n ` ${chalk.cyan(\"3.\")} ${t(\"install_enhanced_more\")}: ${chalk.green(\"install-helper list\")}`,\n ` ${chalk.cyan(\"4.\")} ${t(\"install_enhanced_check\")}: ${chalk.green(\"install-helper doctor\")}`,\n \"\",\n ];\n\n if (successResults.length === 1) {\n const plugin = findPlugin(successResults[0].pluginId);\n const docsPath = plugin ? `${plugin.dir}/quickstart.md` : `${successResults[0].pluginId}/quickstart.md`;\n lines.push(\n ` ${chalk.dim(t(\"install_enhanced_docs\"))}: ${chalk.dim(docsPath)}`\n );\n }\n\n console.log();\n for (const line of lines) {\n console.log(line);\n }\n console.log();\n}\n\nexport function printQuickStart(tool: string): void {\n console.log(chalk.bold(` ${t(\"quick_start\")}: ${tool}`));\n console.log(chalk.dim(` ${t(\"quick_start_hint\")}`));\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { printPluginList } from \"../ui/display.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\n\nexport async function listCommand(): Promise<void> {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n printPluginList(plugins, installedMap);\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync, lstatSync, unlinkSync, mkdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { detectTools, getToolDisplayName, getAllTools } from \"../core/detector.js\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { getConfigRoot, getSkillsDir, getAgentsDir, getConfigFileName } from \"../utils/paths.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool } from \"../types/index.js\";\n\nexport async function doctorCommand(options: { fix?: boolean } = {}): Promise<void> {\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n\n let errors = 0;\n let warnings = 0;\n let fixes = 0;\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_tools\")}`));\n const detectedTools = await detectTools();\n const allTools = getAllTools();\n\n for (const tool of allTools) {\n const detected = detectedTools.find((d) => d.name === tool);\n if (detected) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${getToolDisplayName(tool)}${detected.version ? ` v${detected.version}` : \"\"}`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${getToolDisplayName(tool)} — ${t(\"doctor_not_installed\")}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_plugins\")}`));\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n for (const plugin of plugins) {\n const inst = installedMap.get(plugin.id);\n if (inst) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${plugin.id.padEnd(30)} ${inst.skillsCount} skills, ${inst.agentsCount} agents`\n );\n } else {\n console.log(chalk.dim(\" —\") + ` ${plugin.id.padEnd(30)} — ${t(\"doctor_not_installed\")}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_links\")}`));\n\n const primaryTool = detectedTools[0]?.name || \"opencode\";\n const configRoot = getConfigRoot(primaryTool, \"project\");\n\n const skillsDir = getSkillsDir(configRoot);\n const agentsDir = getAgentsDir(configRoot);\n\n if (existsSync(skillsDir)) {\n const brokenLinks = checkBrokenLinks(skillsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(skillsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${skillsDir} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${skillsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(skillsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${skillsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(skillsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", skillsDir)}`);\n }\n }\n\n if (existsSync(agentsDir)) {\n const brokenLinks = checkBrokenLinks(agentsDir);\n if (brokenLinks === 0) {\n const count = readdirSync(agentsDir).length;\n console.log(chalk.green(\" ✓\") + ` ${agentsDir} — ${t(\"doctor_links_valid\").replace(\"{count}\", String(count))}`);\n } else {\n console.log(chalk.yellow(\" ⚠\") + ` ${agentsDir} — ${t(\"doctor_broken_links\").replace(\"{count}\", String(brokenLinks))}`);\n warnings++;\n if (options.fix) {\n const fixed = fixBrokenLinks(agentsDir);\n fixes += fixed;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_cleaning\")}: ${t(\"doctor_fixed\").replace(\"{count}\", String(fixed))}`);\n }\n }\n } else {\n console.log(chalk.dim(\" —\") + ` ${agentsDir} — ${t(\"doctor_not_exist\")}`);\n if (options.fix) {\n mkdirSync(agentsDir, { recursive: true });\n fixes++;\n console.log(chalk.green(\" ✓\") + ` ${t(\"doctor_fix_rebuilding\")}: ${t(\"doctor_created\").replace(\"{path}\", agentsDir)}`);\n }\n }\n\n console.log();\n console.log(chalk.bold(` ${t(\"doctor_config\")}`));\n const configFile = getConfigFileName(primaryTool);\n const configPath = join(process.cwd(), configFile);\n if (existsSync(configPath)) {\n console.log(chalk.green(\" ✓\") + ` ${configFile} ${t(\"doctor_config_exists\")}`);\n } else {\n console.log(chalk.dim(\" —\") + ` ${configFile} ${t(\"doctor_config_not_exist\")}`);\n }\n\n console.log();\n console.log(chalk.dim(\" \" + \"─\".repeat(46)));\n if (options.fix && fixes > 0) {\n console.log(\n ` ${t(\"doctor_result\")}: ${t(\"doctor_result_with_fix\").replace(\"{warnings}\", String(warnings)).replace(\"{errors}\", String(errors)).replace(\"{fixes}\", String(fixes))}`\n );\n } else {\n console.log(\n ` ${t(\"doctor_result\")}: ${t(\"doctor_result_without_fix\").replace(\"{warnings}\", String(warnings)).replace(\"{errors}\", String(errors))}`\n );\n }\n console.log();\n}\n\nfunction checkBrokenLinks(dir: string): number {\n let broken = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n broken++;\n }\n }\n } catch {\n broken++;\n }\n }\n } catch {\n // ignore\n }\n return broken;\n}\n\nfunction fixBrokenLinks(dir: string): number {\n let fixed = 0;\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const stats = lstatSync(fullPath);\n if (stats.isSymbolicLink()) {\n if (!existsSync(fullPath)) {\n unlinkSync(fullPath);\n fixed++;\n }\n }\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n return fixed;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { getAllPlugins } from \"../core/registry.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function statusCommand(): Promise<void> {\n const plugins = getAllPlugins();\n const installed = scanInstalled();\n const installedMap = new Map(installed.map((p) => [p.id, p]));\n\n console.log();\n console.log(chalk.bold(` ${t(\"status_title\")}`));\n console.log();\n\n if (installed.length === 0) {\n console.log(chalk.dim(` ${t(\"status_none\")}`));\n console.log(chalk.dim(` ${t(\"status_hint\")}`));\n console.log();\n return;\n }\n\n for (const inst of installed) {\n console.log(\n chalk.green(\" ✓\") +\n ` ${inst.displayName}` +\n chalk.dim(` (${inst.tool}, ${inst.level})`)\n );\n console.log(\n chalk.dim(` ${inst.skillsCount} skills, ${inst.agentsCount} agents`)\n );\n console.log(chalk.dim(` ${inst.configRoot}`));\n console.log(chalk.dim(` ${t(\"status_install_time\")}: ${inst.installTime}`));\n console.log();\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { installSkills, interactiveSkillSelect, listAllSkills } from \"../core/skill-installer.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary, printEnhancedSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { addInstalledPlugin } from \"../utils/config.js\";\nimport { getConfigRoot, validateTool, validateLevel } from \"../utils/paths.js\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function installCommand(\n names: string[],\n options: { tool?: string; level?: string; yes?: boolean; list?: boolean }\n): Promise<void> {\n // Handle --list flag\n if (options.list) {\n try {\n const repoManager = createRepositoryManager();\n await repoManager.ensureRepoAndScan();\n } catch {\n }\n listAllSkills();\n return;\n }\n\n // If no names provided, enter interactive skill selection\n if (names.length === 0) {\n // Scan repo for dynamic skill discovery\n const scanSpinner = createSpinner(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") return;\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n let step = 1;\n while (true) {\n switch (step) {\n case 1: {\n const selectedSkills = await interactiveSkillSelect(tool, level);\n if (selectedSkills === \"back\") {\n const redetected = await selectToolWithDetection();\n if (redetected === \"back\" || redetected === \"cancel\") return;\n tool = redetected;\n break;\n }\n if (selectedSkills === \"cancel\") return;\n if (selectedSkills.length === 0) {\n logger.info(t(\"install_no_skill_selected\"));\n return;\n }\n names = selectedSkills;\n\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(names.length)))}...`);\n const results = await installSkills(names, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) { logger.success(`${progress} ${result.skillId}`); successCount++; }\n else { logger.error(`${progress} ${result.skillId}: ${result.error}`); failCount++; }\n }\n\n const configRoot = getConfigRoot(tool, level);\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(configRoot + \"/skills/\")}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n return;\n }\n }\n }\n }\n\n // Scan repo for dynamic skill/plugin discovery\n const scanSpinner = createSpinner(t(\"loading_skills_list\"));\n scanSpinner.start();\n try {\n const scanRepoManager = createRepositoryManager();\n await scanRepoManager.ensureRepoAndScan();\n scanSpinner.succeed(t(\"loading_skills_list_complete\"));\n } catch {\n scanSpinner.warn(t(\"loading_skills_list_failed\"));\n }\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n // Not found\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n const allPlugins = getAllPlugins();\n logger.info(t(\"available_plugins\") + \":\");\n for (const p of allPlugins) {\n logger.step(` ${p.id} (${p.aliases.join(\", \")})`);\n }\n logger.info(`${t(\"available_skills\")}: ${chalk.cyan(\"install-helper install --list\")}`);\n return;\n }\n\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") return;\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n // Install plugins\n if (plugins.length > 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n const installedSet = new Set(manifests.map((m) => m.team));\n const pluginsToInstall: string[] = [];\n const skippedPlugins: string[] = [];\n\n for (const pluginId of plugins) {\n if (installedSet.has(pluginId) && !options.yes) {\n const plugin = findPlugin(pluginId);\n const displayName = plugin?.displayName || pluginId;\n logger.warn(`${displayName} [${t(\"install_already_installed\")}]`);\n const shouldReinstall = await confirm({\n message: `${t(\"install_reinstall_confirm\")}?`,\n default: false,\n });\n if (shouldReinstall) {\n pluginsToInstall.push(pluginId);\n } else {\n skippedPlugins.push(pluginId);\n logger.info(`${displayName} ${t(\"install_skip\")}`);\n }\n } else {\n pluginsToInstall.push(pluginId);\n }\n }\n\n if (pluginsToInstall.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n const allPlugins = getAllPlugins();\n const results = await installPlugins(\n pluginsToInstall,\n tool,\n level,\n repoPath,\n undefined,\n options.yes\n );\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n printEnhancedSummary(summary, tool, configRoot);\n }\n }\n\n // Install skills\n if (skills.length > 0) {\n const repoManager = createRepositoryManager();\n const spinner = createSpinner(t(\"loading_plugin_data\"));\n spinner.start();\n\n const repoPath = await repoManager.ensureRepo();\n spinner.succeed(t(\"loading_plugin_data_complete\"));\n\n logger.info(`${t(\"skill_install_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", chalk.bold(String(skills.length)))}...`);\n\n const results = await installSkills(skills, tool, level, repoPath);\n\n let successCount = 0;\n let failCount = 0;\n const total = results.length;\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const progress = `[${i + 1}/${total}]`;\n if (result.success) {\n logger.success(`${progress} ${result.skillId}`);\n successCount++;\n } else {\n logger.error(`${progress} ${result.skillId}: ${result.error}`);\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_install_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n logger.info(`${t(\"install_to\")}: ${chalk.cyan(getConfigRoot(tool, level) + \"/skills/\")}`);\n logger.info(`${t(\"start_to_use\").replace(\"{tool}\", chalk.green(tool))}`);\n logger.blank();\n }\n}\n\nasync function installPlugins(\n pluginIds: string[],\n tool: AITool,\n level: InstallLevel,\n repoPath: string\n) {\n const results = [];\n const total = pluginIds.length;\n\n for (let i = 0; i < pluginIds.length; i++) {\n const pluginId = pluginIds[i];\n const progress = `[${i + 1}/${total}]`;\n const spinner = createSpinner(`${progress} ${t(\"install_progress\")} ${pluginId}...`);\n spinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n spinner.succeed(\n `${progress} ${pluginId} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n addInstalledPlugin(pluginId);\n } else {\n spinner.fail(`${progress} ${pluginId} — ${result.errors.join(\", \")}`);\n }\n\n results.push(result);\n }\n return results;\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { existsSync, unlinkSync, rmdirSync, readdirSync, lstatSync } from \"fs\";\nimport chalk from \"chalk\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { findSkill } from \"../core/skill-registry.js\";\nimport { uninstallSkills } from \"../core/skill-installer.js\";\nimport { readRecord, deleteRecord } from \"../core/record.js\";\nimport { removeInstalledPlugin } from \"../utils/config.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\nimport { findBackups, restoreBackup, deleteBackup, getAgentsFileName } from \"../core/backup.js\";\nimport { showRestorePrompt } from \"../ui/backup-prompts.js\";\nimport { getConfigRoot, validateTool, validateLevel } from \"../utils/paths.js\";\n\nexport async function uninstallCommand(\n names: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n const tool: AITool = options.tool ? validateTool(options.tool) : \"opencode\";\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n // Classify names into plugins and skills\n const plugins: string[] = [];\n const skills: string[] = [];\n\n for (const name of names) {\n const plugin = findPlugin(name);\n if (plugin) {\n plugins.push(plugin.id);\n continue;\n }\n const skill = findSkill(name);\n if (skill) {\n skills.push(skill.id);\n continue;\n }\n logger.error(`${t(\"uninstall_not_found\")}: ${name}`);\n }\n\n // Uninstall plugins\n for (const pluginId of plugins) {\n const plugin = findPlugin(pluginId);\n if (!plugin) continue;\n\n const record = readRecord(plugin.id);\n if (!record) {\n logger.warn(`${plugin.displayName} ${t(\"uninstall_no_record\")}`);\n logger.info(`${t(\"uninstall_no_record_hint\")}`);\n continue;\n }\n\n logger.info(`${t(\"uninstall_in_progress\")} ${plugin.displayName}...`);\n\n let removedFiles = 0;\n let removedDirs = 0;\n\n for (const filePath of record.files) {\n try {\n if (existsSync(filePath) || isSymlink(filePath)) {\n unlinkSync(filePath);\n const name = filePath.split(\"/\").pop() || filePath;\n logger.step(` ${t(\"uninstall_remove_label\")}: ${name}`);\n removedFiles++;\n }\n } catch {\n // ignore\n }\n }\n\n const configRoot = getConfigRoot(record.tool, record.level);\n const sortedDirs = [...record.directories].sort((a, b) => b.length - a.length);\n for (const dirPath of sortedDirs) {\n try {\n // Skip configRoot - it's the AI tool's config directory, not created by us\n if (dirPath === configRoot) {\n continue;\n }\n if (existsSync(dirPath)) {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n const name = dirPath.split(\"/\").pop() || dirPath;\n logger.step(` ${t(\"uninstall_clean_empty_dir\")}: ${name}/`);\n removedDirs++;\n }\n }\n } catch {\n // ignore\n }\n }\n\n deleteRecord(plugin.id);\n removeInstalledPlugin(plugin.id);\n\n const backups = findBackups(configRoot);\n const otherBackups = backups.filter((b) => b.pluginId !== pluginId);\n\n if (otherBackups.length > 0) {\n const choice = await showRestorePrompt(otherBackups);\n if (choice !== \"none\") {\n const restored = restoreBackup(choice, configRoot, record.tool);\n if (restored) {\n const backupInfo = otherBackups.find((b) => b.filePath === choice);\n logger.success(`${t(\"backup_restore_success\")}: ${backupInfo?.pluginName || \"\"}`);\n deleteBackup(choice);\n }\n }\n }\n\n const currentBackups = backups.filter((b) => b.pluginId === pluginId);\n for (const backup of currentBackups) {\n deleteBackup(backup.filePath);\n }\n\n const totalRemoved = removedFiles + removedDirs;\n if (totalRemoved > 0) {\n logger.success(`${t(\"uninstall_removed\")} ${plugin.displayName}(${t(\"uninstall_remove_file_format\").replace(\"{count}\", String(removedFiles))},${t(\"uninstall_remove_dir_format\").replace(\"{count}\", String(removedDirs))})`);\n } else {\n logger.warn(`${plugin.displayName}${t(\"uninstall_files_gone\")}`);\n }\n }\n\n // Uninstall skills\n if (skills.length > 0) {\n logger.info(`${t(\"uninstall_skills_in_progress\")} ${t(\"skill_count_format\").replace(\"{count}\", String(skills.length))}...`);\n\n const results = await uninstallSkills(skills, tool, level);\n\n let successCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n if (result.success) {\n successCount++;\n } else {\n failCount++;\n }\n }\n\n logger.blank();\n logger.success(`${t(\"skill_uninstall_done\")}: ${chalk.green(t(\"result_success_format\").replace(\"{count}\", String(successCount)))}, ${failCount > 0 ? chalk.red(t(\"result_failed_format\").replace(\"{count}\", String(failCount))) : chalk.dim(t(\"result_failed_format\").replace(\"{count}\", String(failCount)))}`);\n logger.blank();\n }\n}\n\nfunction isSymlink(path: string): boolean {\n try {\n return lstatSync(path).isSymbolicLink();\n } catch {\n return false;\n }\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { installPlugin } from \"../core/installer.js\";\nimport { findPlugin, getAllPlugins } from \"../core/registry.js\";\nimport { selectToolWithDetection } from \"../ui/wizard.js\";\nimport { readAllManifests } from \"../core/manifest.js\";\nimport { printInstallSummary } from \"../ui/display.js\";\nimport { logger, createSpinner } from \"../utils/logger.js\";\nimport { t } from \"../utils/i18n.js\";\nimport { getConfigRoot, validateTool, validateLevel } from \"../utils/paths.js\";\nimport chalk from \"chalk\";\nimport type { AITool, InstallLevel } from \"../types/index.js\";\n\nexport async function updateCommand(\n pluginNames: string[],\n options: { tool?: string; level?: string }\n): Promise<void> {\n let tool: AITool;\n if (options.tool) {\n tool = validateTool(options.tool);\n } else {\n const detected = await selectToolWithDetection();\n if (detected === \"back\" || detected === \"cancel\") return;\n tool = detected;\n }\n\n const level: InstallLevel = options.level ? validateLevel(options.level) : \"project\";\n\n let pluginsToUpdate: string[] = [];\n\n if (pluginNames.length === 0) {\n const configRoot = getConfigRoot(tool, level);\n const manifests = readAllManifests(configRoot);\n pluginsToUpdate = manifests.map((m) => m.team);\n if (pluginsToUpdate.length === 0) {\n logger.info(t(\"update_no_plugins\"));\n logger.info(t(\"update_install_hint\").replace(\"{cmd}\", chalk.cyan(\"install-helper install <plugin>\")));\n return;\n }\n } else {\n for (const name of pluginNames) {\n const plugin = findPlugin(name);\n if (!plugin) {\n logger.error(`${t(\"error_plugin_not_found\")}: ${name}`);\n return;\n }\n pluginsToUpdate.push(plugin.id);\n }\n }\n\n const repoManager = createRepositoryManager();\n const updateSpinner = createSpinner(t(\"update_updating\") + \"...\");\n updateSpinner.start();\n\n await repoManager.updateRepo();\n const repoPath = repoManager.getRepoPath();\n await repoManager.ensureRepoAndScan();\n updateSpinner.succeed(t(\"install_repo_ready\"));\n\n const allPlugins = getAllPlugins();\n const results = [];\n const total = pluginsToUpdate.length;\n\n for (let i = 0; i < pluginsToUpdate.length; i++) {\n const pluginId = pluginsToUpdate[i];\n const plugin = allPlugins.find((p) => p.id === pluginId);\n const displayName = plugin?.displayName || pluginId;\n const progress = `[${i + 1}/${total}]`;\n\n const pluginSpinner = createSpinner(`${progress} ${t(\"update_updating\")} ${displayName}...`);\n pluginSpinner.start();\n\n const result = await installPlugin({\n pluginId,\n tool,\n level,\n repoPath,\n });\n\n if (result.success) {\n pluginSpinner.succeed(\n `${progress} ${displayName} — ${result.skillsCount} skills, ${result.agentsCount} agents`\n );\n } else {\n pluginSpinner.fail(\n `${progress} ${displayName} — ${result.errors.join(\", \")}`\n );\n }\n\n results.push(result);\n }\n\n const summary = results.map((result) => {\n const plugin = allPlugins.find((p) => p.id === result.pluginId);\n return {\n pluginId: result.pluginId,\n displayName: plugin?.displayName || result.pluginId,\n success: result.success,\n skillsCount: result.skillsCount,\n agentsCount: result.agentsCount,\n };\n });\n\n printInstallSummary(summary);\n logger.success(t(\"update_done\"));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { existsSync, readdirSync } from \"fs\";\nimport { join } from \"path\";\nimport { findPlugin } from \"../core/registry.js\";\nimport { createRepositoryManager } from \"../core/repository.js\";\nimport { scanInstalled } from \"../core/manifest.js\";\nimport { t } from \"../utils/i18n.js\";\n\nexport async function infoCommand(pluginName: string): Promise<void> {\n const plugin = findPlugin(pluginName);\n if (!plugin) {\n console.log(chalk.red(` ${t(\"info_not_found\")}: ${pluginName}`));\n return;\n }\n\n const installed = scanInstalled();\n const isInstalled = installed.some((p) => p.id === plugin.id);\n const statusText = isInstalled\n ? chalk.green(`✓ ${t(\"status_installed\")}`)\n : chalk.dim(`— ${t(\"status_not_installed\")}`);\n\n console.log();\n console.log(chalk.bold(` ${plugin.displayName}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"info_description\") + \":\")} ${plugin.description}`);\n console.log(` ${chalk.dim(\"ID:\")} ${plugin.id}`);\n console.log(` ${chalk.dim(t(\"info_status\") + \":\")} ${statusText}`);\n console.log(` ${chalk.dim(t(\"info_skills\") + \":\")} ${plugin.skills}`);\n console.log(` ${chalk.dim(t(\"info_agents\") + \":\")} ${plugin.agents}`);\n console.log(` ${chalk.dim(t(\"info_aliases\") + \":\")} ${plugin.aliases.join(\", \")}`);\n console.log();\n\n try {\n const repoManager = createRepositoryManager();\n const repoPath = await repoManager.ensureRepo();\n const quickstartPath = join(repoPath, plugin.dir, \"quickstart.md\");\n\n if (existsSync(quickstartPath)) {\n console.log(` ${chalk.dim(t(\"info_quickstart\") + \":\")} ${quickstartPath}`);\n }\n\n const agentsDir = join(repoPath, plugin.dir, \"agents\");\n if (existsSync(agentsDir)) {\n const agentFiles = readdirSync(agentsDir).filter((f: string) => f.endsWith(\".md\"));\n if (agentFiles.length > 0) {\n console.log();\n console.log(` ${chalk.bold(\"Agents:\")}`);\n for (const agent of agentFiles) {\n console.log(` • ${agent.replace(\".md\", \"\")}`);\n }\n }\n }\n } catch {\n // ignore if repo not available\n }\n\n console.log();\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport chalk from \"chalk\";\nimport { readConfig, updateConfig } from \"../utils/config.js\";\nimport { setLanguage, t } from \"../utils/i18n.js\";\n\nexport async function langCommand(\n action?: string,\n value?: string\n): Promise<void> {\n const config = readConfig();\n\n if (!action || action === \"show\") {\n console.log();\n console.log(chalk.bold(` ${t(\"lang_title\")}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(40)));\n console.log();\n console.log(` ${chalk.dim(t(\"lang_current\") + \":\")} ${config.language}`);\n console.log();\n console.log(chalk.dim(` ${t(\"lang_supported\")}`));\n console.log(chalk.dim(` ${t(\"lang_usage\")}`));\n console.log();\n return;\n }\n\n if (action === \"set\") {\n if (!value) {\n console.log(chalk.red(` ${t(\"lang_specify\")}`));\n return;\n }\n\n if (value !== \"zh_CN\" && value !== \"en_US\") {\n console.log(chalk.red(` ${t(\"lang_invalid\")}`));\n return;\n }\n\n updateConfig({ language: value });\n setLanguage(value);\n console.log();\n console.log(chalk.green(` ✓ ${t(\"lang_set\")} ${value}`));\n console.log();\n return;\n }\n\n console.log(chalk.red(` ${t(\"lang_unknown_action\")}: ${action}`));\n console.log(chalk.dim(` ${t(\"lang_supported_actions\")}`));\n}\n","// ----------------------------------------------------------------------------------------------------------\n// Copyright (c) 2026 Huawei Technologies Co., Ltd.\n// This program is free software, you can redistribute it and/or modify it under the terms and conditions of\n// CANN Open Software License Agreement Version 2.0 (the \"License\").\n// Please refer to the License for details. You may not use this file except in compliance with the License.\n// THIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.\n// See LICENSE in the root of the software repository for the full text of the License.\n// ----------------------------------------------------------------------------------------------------------\n\nimport { createCLI } from \"./cli.js\";\nimport { t } from \"./utils/i18n.js\";\n\nprocess.on(\"uncaughtException\", (error: any) => {\n if (error.name === \"ExitPromptError\") {\n console.log(\"\\n\" + t(\"init_cancelled\"));\n process.exit(0);\n }\n throw error;\n});\n\nconst program = createCLI();\nprogram.parse();\n"],"mappings":"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","names":["select","Separator","chalk","chalk","existsSync","homedir","join","join","readFileSync","join","dirname","fileURLToPath","__filename","__dirname","join","homedir","existsSync","join","existsSync","readFileSync","join","existsSync","readFileSync","join","existsSync","readFileSync","join","homedir","choices","result","chalk","existsSync","mkdirSync","readFileSync","join","dirname","fileURLToPath","execa","parseYaml","existsSync","readdirSync","readFileSync","writeFileSync","mkdirSync","join","dirname","fileURLToPath","parseYaml","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","existsSync","mkdirSync","writeFileSync","readdirSync","__filename","fileURLToPath","__dirname","dirname","join","parseYaml","readFileSync","execa","existsSync","mkdirSync","existsSync","join","execa","existsSync","mkdirSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readdirSync","unlinkSync","join","join","existsSync","readdirSync","unlinkSync","select","chalk","chalk","select","join","existsSync","execa","existsSync","mkdirSync","unlinkSync","readdirSync","lstatSync","join","select","checkbox","Separator","chalk","join","existsSync","mkdirSync","isSymlink","unlinkSync","readdirSync","BACK","CANCEL","Separator","select","checkbox","chalk","lstatSync","chalk","Table","Table","chalk","existsSync","readFileSync","join","BACK","CANCEL","existsSync","join","readFileSync","Separator","select","chalk","chalk","existsSync","readdirSync","lstatSync","unlinkSync","mkdirSync","join","chalk","existsSync","readdirSync","mkdirSync","join","lstatSync","unlinkSync","chalk","chalk","chalk","scanSpinner","tool","level","existsSync","unlinkSync","rmdirSync","readdirSync","lstatSync","chalk","existsSync","isSymlink","unlinkSync","readdirSync","rmdirSync","chalk","lstatSync","chalk","chalk","existsSync","readdirSync","join","chalk","join","existsSync","readdirSync","chalk","chalk","program"]}