feishu-bridge 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +35 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +35 -7
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.js +35 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/logger.ts","../../src/core/config.ts","../../src/core/daemon.ts","../../src/cli/index.ts","../../src/cli/config.ts","../../src/feishu/webhook.ts","../../src/feishu/websocket.ts","../../src/core/message-router.ts","../../src/feishu/client.ts","../../src/commands/executor.ts","../../src/session/manager.ts","../../src/adapters/base.ts","../../src/adapters/vscode.ts","../../src/adapters/cursor.ts","../../src/adapters/trae.ts","../../src/adapters/antigravity.ts","../../src/adapters/kiro.ts","../../src/adapters/opencode.ts","../../src/adapters/claude-code.ts","../../src/adapters/gemini-cli.ts","../../src/core/bridge.ts","../../src/core/health.ts","../../src/core/reverse-channel.ts","../../src/skills/builtin/feishu.ts","../../src/skills/builtin/code.ts","../../src/skills/registry.ts","../../src/skills/index.ts"],"sourcesContent":["/**\n * 日志系统\n */\nimport pino, { Logger as PinoLogger } from 'pino';\n\nexport class Logger {\n private logger: PinoLogger;\n\n constructor() {\n const isTest = process.env.NODE_ENV === 'test' || process.env.VITEST;\n const isDev = process.env.NODE_ENV === 'development';\n \n this.logger = pino({\n level: process.env.LOG_LEVEL || 'info',\n transport: (isTest || !isDev) ? undefined : {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n }\n }\n });\n }\n\n public setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\n this.logger.level = level;\n }\n\n public debug(msg: string, ...args: any[]): void {\n this.logger.debug(msg, ...args);\n }\n\n public info(msg: string, ...args: any[]): void {\n this.logger.info(msg, ...args);\n }\n\n public warn(msg: string, ...args: any[]): void {\n this.logger.warn(msg, ...args);\n }\n\n public error(msg: string | Error, ...args: any[]): void {\n this.logger.error(msg, ...args);\n }\n\n public child(bindings: Record<string, any>): Logger {\n const childLogger = new Logger();\n childLogger.logger = this.logger.child(bindings);\n return childLogger;\n }\n}\n\n// 全局日志实例\nexport const logger = new Logger();","/**\n * 配置管理模块\n */\n\nexport interface BridgeConfig {\n // 飞书应用配置\n feishu: {\n appId: string;\n appSecret: string;\n domain: 'feishu' | 'lark'; // 国内/国际版\n connectionMode: 'websocket' | 'webhook';\n encryptKey?: string; // 消息加密密钥\n verificationToken?: string; // 验证Token\n };\n \n // 服务器配置\n server: {\n port: number;\n host: string;\n webhookPath: string;\n };\n \n // IDE适配器配置\n adapters: {\n vscode?: {\n enabled: boolean;\n executablePath?: string;\n };\n cursor?: {\n enabled: boolean;\n };\n trae?: {\n enabled: boolean;\n };\n antigravity?: {\n enabled: boolean;\n };\n kiro?: {\n enabled: boolean;\n };\n opencode?: {\n enabled: boolean;\n socketPath?: string;\n };\n 'claude-code'?: {\n enabled: boolean;\n };\n gemini?: {\n enabled: boolean;\n };\n };\n \n // 行为配置\n behavior: {\n autoStart: boolean;\n maxOutputLength: number; // 最大输出长度\n sessionTimeout: number; // 会话超时时间(分钟)\n reverseChannelEnabled: boolean; // 反向通信通道启用\n reverseChannelMode: 'websocket' | 'filesystem' | 'http'; // 反向通信模式\n };\n \n // 日志配置\n logging: {\n level: 'debug' | 'info' | 'warn' | 'error';\n file?: string;\n };\n}\n\n// 默认配置\nexport const DEFAULT_CONFIG: BridgeConfig = {\n feishu: {\n appId: '',\n appSecret: '',\n domain: 'feishu',\n connectionMode: 'webhook',\n encryptKey: undefined,\n verificationToken: undefined,\n },\n server: {\n port: 3000,\n host: '0.0.0.0',\n webhookPath: '/webhook/feishu',\n },\n adapters: {\n vscode: { enabled: true },\n cursor: { enabled: true },\n trae: { enabled: true },\n antigravity: { enabled: true },\n kiro: { enabled: true },\n opencode: { enabled: true },\n 'claude-code': { enabled: true },\n gemini: { enabled: false }, // 默认禁用,需要gcloud配置\n },\n behavior: {\n autoStart: true,\n maxOutputLength: 2000,\n sessionTimeout: 30,\n reverseChannelEnabled: true,\n reverseChannelMode: 'filesystem',\n },\n logging: {\n level: 'info',\n file: undefined,\n },\n};\n\n// 配置管理器\nexport class ConfigManager {\n private static instance: ConfigManager;\n private config: BridgeConfig = DEFAULT_CONFIG;\n\n private constructor() {}\n\n public static getInstance(): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n }\n\n public load(config: Partial<BridgeConfig>): void {\n this.config = this.deepMerge(this.config, config);\n }\n\n private deepMerge(target: any, source: any): any {\n const output = { ...target };\n \n if (this.isObject(target) && this.isObject(source)) {\n Object.keys(source).forEach(key => {\n if (this.isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n output[key] = this.deepMerge(target[key], source[key]);\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n \n return output;\n }\n\n private isObject(item: any): boolean {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n\n public get(): BridgeConfig {\n return this.config;\n }\n\n public getFeishuConfig(): BridgeConfig['feishu'] {\n return this.config.feishu;\n }\n\n public getServerConfig(): BridgeConfig['server'] {\n return this.config.server;\n }\n\n public getAdapterConfig(adapter: keyof BridgeConfig['adapters']) {\n return this.config.adapters[adapter];\n }\n\n public getBehaviorConfig(): BridgeConfig['behavior'] {\n return this.config.behavior;\n }\n\n public getLoggingConfig(): BridgeConfig['logging'] {\n return this.config.logging;\n }\n}","/**\n * 进程守护模块\n * 确保Feishu Bridge进程持续运行,自动重启\n */\nimport { spawn, ChildProcess } from 'child_process';\nimport { Logger } from './logger';\nimport { ConfigManager } from './config';\n\ninterface DaemonConfig {\n maxRestarts: number;\n restartDelay: number;\n healthCheckInterval: number;\n}\n\nexport class ProcessDaemon {\n private process: ChildProcess | null = null;\n private restartCount = 0;\n private isRunning = false;\n private healthCheckTimer: NodeJS.Timeout | null = null;\n private logger: Logger;\n private config: DaemonConfig;\n\n constructor(\n private command: string,\n private args: string[] = [],\n private options: { cwd?: string; env?: NodeJS.ProcessEnv } = {}\n ) {\n this.logger = new Logger();\n \n // 从配置加载守护参数\n const daemonConfig = ConfigManager.getInstance().get().daemon;\n this.config = {\n maxRestarts: daemonConfig?.maxRestarts || 5,\n restartDelay: daemonConfig?.restartDelay || 5000,\n healthCheckInterval: daemonConfig?.healthCheckInterval || 30000\n };\n }\n\n /**\n * 启动守护进程\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n this.logger.warn('Daemon already running');\n return;\n }\n\n this.isRunning = true;\n this.restartCount = 0;\n \n this.logger.info('Starting process daemon...');\n await this.spawnProcess();\n this.startHealthCheck();\n }\n\n /**\n * 停止守护进程\n */\n async stop(): Promise<void> {\n this.isRunning = false;\n \n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = null;\n }\n\n if (this.process) {\n this.logger.info('Stopping daemon process...');\n \n // 尝试优雅关闭\n this.process.kill('SIGTERM');\n \n // 等待5秒后强制关闭\n await new Promise(resolve => setTimeout(resolve, 5000));\n \n if (this.process && !this.process.killed) {\n this.process.kill('SIGKILL');\n }\n \n this.process = null;\n }\n \n this.logger.info('Daemon stopped');\n }\n\n /**\n * 创建子进程\n */\n private async spawnProcess(): Promise<void> {\n return new Promise((resolve) => {\n this.logger.info(`Spawning: ${this.command} ${this.args.join(' ')}`);\n\n this.process = spawn(this.command, this.args, {\n stdio: 'pipe',\n detached: false,\n ...this.options\n });\n\n // 监听输出\n this.process.stdout?.on('data', (data) => {\n process.stdout.write(data);\n });\n\n this.process.stderr?.on('data', (data) => {\n process.stderr.write(data);\n });\n\n // 监听进程退出\n this.process.on('exit', (code, signal) => {\n this.logger.warn(`Process exited with code ${code}, signal ${signal}`);\n this.process = null;\n \n if (this.isRunning) {\n this.handleCrash();\n }\n });\n\n // 监听错误\n this.process.on('error', (error) => {\n this.logger.error('Process error:', error);\n this.process = null;\n \n if (this.isRunning) {\n this.handleCrash();\n }\n });\n\n // 给进程一些启动时间\n setTimeout(() => {\n if (this.process && !this.process.killed) {\n this.logger.info('Process started successfully');\n this.restartCount = 0; // 重置重启计数\n }\n resolve();\n }, 2000);\n });\n }\n\n /**\n * 处理进程崩溃\n */\n private handleCrash(): void {\n if (!this.isRunning) return;\n\n this.restartCount++;\n\n if (this.restartCount > this.config.maxRestarts) {\n this.logger.error(`Max restarts (${this.config.maxRestarts}) reached. Giving up.`);\n this.isRunning = false;\n process.exit(1);\n }\n\n this.logger.info(`Restarting process (attempt ${this.restartCount}/${this.config.maxRestarts})...`);\n \n setTimeout(() => {\n if (this.isRunning) {\n this.spawnProcess();\n }\n }, this.config.restartDelay);\n }\n\n /**\n * 启动健康检查\n */\n private startHealthCheck(): void {\n this.healthCheckTimer = setInterval(() => {\n if (!this.isRunning) return;\n\n // 检查进程是否还在运行\n if (!this.process || this.process.killed) {\n this.logger.warn('Health check: Process not running, restarting...');\n this.handleCrash();\n }\n }, this.config.healthCheckInterval);\n }\n\n /**\n * 获取守护状态\n */\n getStatus(): {\n isRunning: boolean;\n pid: number | null;\n restartCount: number;\n uptime: number;\n } {\n return {\n isRunning: this.isRunning,\n pid: this.process?.pid || null,\n restartCount: this.restartCount,\n uptime: process.uptime()\n };\n }\n}\n\n/**\n * 单例守护进程管理器\n */\nclass DaemonManager {\n private static instance: DaemonManager;\n private daemon: ProcessDaemon | null = null;\n\n private constructor() {}\n\n static getInstance(): DaemonManager {\n if (!DaemonManager.instance) {\n DaemonManager.instance = new DaemonManager();\n }\n return DaemonManager.instance;\n }\n\n /**\n * 启动守护进程\n */\n async start(args: string[] = []): Promise<void> {\n if (this.daemon) {\n console.log('Daemon already running');\n return;\n }\n\n // 使用node运行主程序\n const nodePath = process.execPath;\n const scriptPath = require.resolve('../index.js');\n\n this.daemon = new ProcessDaemon(nodePath, [scriptPath, ...args], {\n cwd: process.cwd(),\n env: process.env\n });\n\n await this.daemon.start();\n\n // 处理退出信号\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n /**\n * 停止守护进程\n */\n async stop(): Promise<void> {\n if (this.daemon) {\n await this.daemon.stop();\n this.daemon = null;\n }\n }\n\n /**\n * 获取状态\n */\n getStatus(): {\n isRunning: boolean;\n pid: number | null;\n restartCount: number;\n uptime: number;\n } | null {\n return this.daemon?.getStatus() || null;\n }\n}\n\nexport { DaemonManager };\nexport default DaemonManager;\n","/**\n * CLI主入口\n */\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { getConfigValue, setConfigValue, deleteConfigValue, listConfig, getConfigFilePath } from './config';\nimport { FeishuBridge } from '../core/bridge';\nimport { ConfigManager, DEFAULT_CONFIG } from '../core/config';\nimport { logger } from '../core/logger';\n\nconst program = new Command();\nconst pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));\n\nprogram\n .name('feishu-bridge')\n .description('Feishu Bridge - AI IDE/CLI integration for Feishu')\n .version(pkg.version);\n\n// Start命令\nprogram\n .command('start')\n .description('Start the Feishu Bridge server')\n .option('-p, --port <port>', 'Server port', '3000')\n .option('-h, --host <host>', 'Server host', '0.0.0.0')\n .option('-d, --daemon', 'Run in daemon mode')\n .action(async (options) => {\n try {\n // 加载配置文件\n const fileConfig = getConfigValue('feishu') || {};\n \n // 初始化配置\n const configManager = ConfigManager.getInstance();\n const config = { ...DEFAULT_CONFIG };\n \n // 应用配置文件中的设置\n if (fileConfig.appId) config.feishu.appId = fileConfig.appId;\n if (fileConfig.appSecret) config.feishu.appSecret = fileConfig.appSecret;\n if (fileConfig.encryptKey) config.feishu.encryptKey = fileConfig.encryptKey;\n if (fileConfig.verificationToken) config.feishu.verificationToken = fileConfig.verificationToken;\n if (fileConfig.domain) config.feishu.domain = fileConfig.domain;\n \n // 命令行选项覆盖配置文件\n config.server.port = parseInt(options.port);\n config.server.host = options.host;\n \n // 环境变量优先级最高\n if (process.env.FEISHU_APP_ID) config.feishu.appId = process.env.FEISHU_APP_ID;\n if (process.env.FEISHU_APP_SECRET) config.feishu.appSecret = process.env.FEISHU_APP_SECRET;\n if (process.env.FEISHU_ENCRYPT_KEY) config.feishu.encryptKey = process.env.FEISHU_ENCRYPT_KEY;\n if (process.env.FEISHU_VERIFICATION_TOKEN) config.feishu.verificationToken = process.env.FEISHU_VERIFICATION_TOKEN;\n if (process.env.SERVER_PORT) config.server.port = parseInt(process.env.SERVER_PORT);\n if (process.env.SERVER_HOST) config.server.host = process.env.SERVER_HOST;\n \n // 验证必需配置\n if (!config.feishu.appId || !config.feishu.appSecret) {\n console.error('Error: FEISHU_APP_ID and FEISHU_APP_SECRET are required');\n console.error('Set them via:');\n console.error(' 1. Environment variables: export FEISHU_APP_ID=xxx');\n console.error(' 2. Config file: feishu-bridge config set feishu.appId xxx');\n process.exit(1);\n }\n \n configManager.load(config);\n \n // 创建并启动桥接器\n const bridge = new FeishuBridge();\n await bridge.start();\n \n if (options.daemon) {\n logger.info('Feishu Bridge started in daemon mode');\n } else {\n logger.info('Press Ctrl+C to stop the server');\n }\n \n // 处理退出信号\n process.on('SIGINT', async () => {\n logger.info('Received SIGINT, shutting down gracefully...');\n await bridge.stop();\n process.exit(0);\n });\n \n process.on('SIGTERM', async () => {\n logger.info('Received SIGTERM, shutting down gracefully...');\n await bridge.stop();\n process.exit(0);\n });\n \n } catch (error) {\n console.error('Failed to start Feishu Bridge:', error);\n process.exit(1);\n }\n });\n\n// Config命令组\nconst configCmd = program\n .command('config')\n .description('Manage configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n try {\n setConfigValue(key, value);\n console.log(`✅ Set ${key} = ${value}`);\n console.log(`📁 Config file: ${getConfigFilePath()}`);\n } catch (error) {\n console.error('❌ Error setting config:', error);\n process.exit(1);\n }\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const value = getConfigValue(key);\n if (value === undefined) {\n console.log(`⚠️ ${key} is not set`);\n } else {\n console.log(`${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('delete <key>')\n .description('Delete a configuration value')\n .action((key: string) => {\n try {\n deleteConfigValue(key);\n console.log(`✅ Deleted ${key}`);\n } catch (error) {\n console.error('❌ Error deleting config:', error);\n process.exit(1);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all configuration values')\n .action(() => {\n const config = listConfig();\n if (Object.keys(config).length === 0) {\n console.log('No configuration set');\n console.log(`📁 Config file: ${getConfigFilePath()}`);\n } else {\n console.log('Current configuration:');\n console.log(JSON.stringify(config, null, 2));\n console.log(`\\n📁 Config file: ${getConfigFilePath()}`);\n }\n });\n\n// Daemon命令组\nconst daemonCmd = program\n .command('daemon')\n .description('Manage daemon process');\n\ndaemonCmd\n .command('start')\n .description('Start the daemon')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n await daemon.start();\n console.log('✅ Daemon started');\n console.log('📊 Use \"feishu-bridge status\" to check status');\n } catch (error) {\n console.error('❌ Failed to start daemon:', error);\n process.exit(1);\n }\n });\n\ndaemonCmd\n .command('stop')\n .description('Stop the daemon')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n await daemon.stop();\n console.log('✅ Daemon stopped');\n } catch (error) {\n console.error('❌ Failed to stop daemon:', error);\n process.exit(1);\n }\n });\n\ndaemonCmd\n .command('restart')\n .description('Restart the daemon')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n await daemon.stop();\n await daemon.start();\n console.log('✅ Daemon restarted');\n } catch (error) {\n console.error('❌ Failed to restart daemon:', error);\n process.exit(1);\n }\n });\n\n// Status命令\nprogram\n .command('status')\n .description('Show service status')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n const status = daemon.getStatus();\n \n if (status) {\n console.log('📊 Daemon Status:');\n console.log(` Running: ${status.isRunning ? '✅ Yes' : '❌ No'}`);\n console.log(` PID: ${status.pid || 'N/A'}`);\n console.log(` Restarts: ${status.restartCount}`);\n console.log(` Uptime: ${Math.floor(status.uptime)}s`);\n } else {\n console.log('📊 Service Status:');\n console.log(' Daemon: Not running');\n }\n \n // 检查配置文件\n const config = listConfig();\n console.log('\\n📁 Configuration:');\n console.log(` Config file: ${getConfigFilePath()}`);\n console.log(` Feishu App ID: ${config.feishu?.appId ? '✅ Set' : '❌ Not set'}`);\n console.log(` Feishu App Secret: ${config.feishu?.appSecret ? '✅ Set' : '❌ Not set'}`);\n } catch (error) {\n console.error('❌ Error checking status:', error);\n }\n });\n\n// Shell init命令\nprogram\n .command('shell-init')\n .description('Output shell initialization script')\n .action(() => {\n console.log(`\n# Feishu Bridge Shell Integration\n# Add this to your ~/.bashrc, ~/.zshrc, or equivalent\n\nfeishu-bridge-auto() {\n # 检测当前是否在IDE/CLI环境中\n if [ -n \"$VSCODE_PID\" ] || [ -n \"$CURSOR_SHELL\" ] || [ -n \"$OPENCODE_SESSION\" ]; then\n # 检查bridge是否已运行\n if ! pgrep -f \"feishu-bridge\" > /dev/null; then\n echo \"Auto-starting Feishu Bridge...\"\n feishu-bridge start --daemon 2>/dev/null &\n fi\n fi\n}\n\n# Bash\nif [ -n \"$BASH_VERSION\" ]; then\n PROMPT_COMMAND=\"feishu-bridge-auto; $PROMPT_COMMAND\"\nfi\n\n# Zsh\nif [ -n \"$ZSH_VERSION\" ]; then\n precmd_functions+=(feishu-bridge-auto)\nfi\n`);\n });\n\n// 解析命令行参数\nprogram.parse();\n\n// 如果没有提供命令,显示帮助\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n","/**\n * CLI配置管理模块\n * 使用cosmiconfig管理配置文件\n */\nimport { cosmiconfigSync } from 'cosmiconfig';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nconst moduleName = 'feishu-bridge';\n\n// 配置文件搜索路径\nconst explorer = cosmiconfigSync(moduleName, {\n searchPlaces: [\n 'package.json',\n `.${moduleName}rc`,\n `.${moduleName}rc.json`,\n `.${moduleName}rc.yaml`,\n `.${moduleName}rc.yml`,\n `.${moduleName}rc.js`,\n `.${moduleName}rc.cjs`,\n `${moduleName}.config.js`,\n `${moduleName}.config.cjs`,\n ],\n});\n\n// 默认配置文件路径\nfunction getDefaultConfigPath(): string {\n const configDir = path.join(os.homedir(), '.config', moduleName);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n return path.join(configDir, 'config.json');\n}\n\n/**\n * 获取当前配置\n */\nexport function getConfig(): Record<string, any> {\n // 首先尝试从当前目录向上搜索\n const result = explorer.search();\n if (result?.config) {\n return result.config;\n }\n \n // 如果没有找到,尝试从用户主目录加载\n const homeConfigPath = getDefaultConfigPath();\n if (fs.existsSync(homeConfigPath)) {\n try {\n const content = fs.readFileSync(homeConfigPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error reading home config file:', error);\n }\n }\n \n return {};\n}\n\n/**\n * 获取特定配置项\n */\nexport function getConfigValue(key: string): any {\n const config = getConfig();\n const keys = key.split('.');\n let value = config;\n \n for (const k of keys) {\n if (value === undefined || value === null) {\n return undefined;\n }\n value = value[k];\n }\n \n return value;\n}\n\n/**\n * 设置配置项\n */\nexport function setConfigValue(key: string, value: any): void {\n const configPath = getDefaultConfigPath();\n let config: Record<string, any> = {};\n \n // 读取现有配置\n if (fs.existsSync(configPath)) {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n config = JSON.parse(content);\n } catch (error) {\n console.error('Error reading config file:', error);\n }\n }\n \n // 设置嵌套值\n const keys = key.split('.');\n let current = config;\n \n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (!(k in current) || typeof current[k] !== 'object') {\n current[k] = {};\n }\n current = current[k];\n }\n \n // 转换值类型\n const finalKey = keys[keys.length - 1];\n current[finalKey] = convertValueType(value);\n \n // 写入配置文件\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\n/**\n * 删除配置项\n */\nexport function deleteConfigValue(key: string): void {\n const configPath = getDefaultConfigPath();\n \n if (!fs.existsSync(configPath)) {\n return;\n }\n \n let config: Record<string, any> = {};\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n config = JSON.parse(content);\n } catch (error) {\n console.error('Error reading config file:', error);\n return;\n }\n \n const keys = key.split('.');\n let current = config;\n \n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (!(k in current)) {\n return; // 键不存在,无需删除\n }\n current = current[k];\n }\n \n delete current[keys[keys.length - 1]];\n \n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\n/**\n * 列出所有配置\n */\nexport function listConfig(): Record<string, any> {\n return getConfig();\n}\n\n/**\n * 转换值类型(自动识别数字、布尔值)\n */\nfunction convertValueType(value: string): any {\n // 尝试转换为数字\n if (!isNaN(Number(value)) && value.trim() !== '') {\n return Number(value);\n }\n \n // 尝试转换为布尔值\n if (value.toLowerCase() === 'true') {\n return true;\n }\n if (value.toLowerCase() === 'false') {\n return false;\n }\n \n // 尝试解析JSON\n try {\n return JSON.parse(value);\n } catch {\n // 不是有效的JSON,返回字符串\n return value;\n }\n}\n\n/**\n * 获取配置文件路径\n */\nexport function getConfigFilePath(): string {\n const result = explorer.search();\n if (result?.filepath) {\n return result.filepath;\n }\n return getDefaultConfigPath();\n}\n","/**\n * Webhook处理器\n */\nimport { FastifyRequest, FastifyReply } from 'fastify';\nimport * as crypto from 'crypto';\nimport { FeishuClient } from './client';\nimport { CommandExecutor } from '../commands/executor';\nimport { LarkEvent, LarkMessage } from './types';\nimport { Logger } from '../core/logger';\nimport { ConfigManager } from '../core/config';\n\nexport class FeishuWebhookHandler {\n private logger: Logger;\n\n constructor(\n private client: FeishuClient,\n private commandExecutor: CommandExecutor\n ) {\n this.logger = new Logger();\n }\n\n async handleWebhook(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n try {\n // 1. 验证请求签名\n const signature = request.headers['x-lark-signature'] as string;\n const timestamp = request.headers['x-lark-timestamp'] as string;\n const body = request.body as string;\n \n if (!this.verifySignature(signature, timestamp, body)) {\n this.logger.warn('Invalid signature received');\n reply.status(401).send({ error: 'Invalid signature' });\n return;\n }\n \n // 2. 解析事件\n const event = JSON.parse(body) as LarkEvent;\n \n // 3. 处理URL验证\n if (event.type === 'url_verification') {\n this.logger.info('Received URL verification challenge');\n reply.send({ challenge: event.challenge });\n return;\n }\n \n // 4. 处理消息事件\n if (event.type === 'event_callback' && event.event) {\n await this.handleEvent(event.event);\n }\n \n reply.send({ success: true });\n } catch (error) {\n this.logger.error('Error handling webhook:', error);\n reply.status(500).send({ error: 'Internal server error' });\n }\n }\n\n private verifySignature(signature: string, timestamp: string, body: string): boolean {\n // 如果没有配置加密密钥,跳过验证(仅用于开发环境)\n const config = ConfigManager.getInstance().getFeishuConfig();\n const encryptKey = config.encryptKey;\n \n if (!encryptKey) {\n this.logger.warn('No encrypt key configured, skipping signature verification (development mode)');\n return true;\n }\n \n // 验证时间戳,防止重放攻击(允许±5分钟的时间差)\n const now = Math.floor(Date.now() / 1000);\n const requestTime = parseInt(timestamp, 10);\n const timeDiff = Math.abs(now - requestTime);\n \n if (timeDiff > 300) { // 5 minutes = 300 seconds\n this.logger.warn(`Request timestamp too old: ${timeDiff}s difference`);\n return false;\n }\n \n try {\n // 飞书签名算法:HMAC-SHA256(timestamp + \"\\n\" + body, encryptKey)\n const signatureContent = `${timestamp}\\n${body}`;\n const computedSignature = crypto\n .createHmac('sha256', encryptKey)\n .update(signatureContent)\n .digest('base64');\n \n // 使用恒定时间比较防止时序攻击\n const expectedSig = Buffer.from(computedSignature);\n const receivedSig = Buffer.from(signature);\n \n if (expectedSig.length !== receivedSig.length) {\n return false;\n }\n \n return crypto.timingSafeEqual(expectedSig, receivedSig);\n } catch (error) {\n this.logger.error('Error verifying signature:', error);\n return false;\n }\n }\n \n private async handleEvent(event: any): Promise<void> {\n const { message } = event;\n \n // 忽略非文本消息\n if (message.message_type !== 'text') {\n this.logger.info('Ignoring non-text message');\n return;\n }\n \n const content = JSON.parse(message.content);\n const text = content.text.trim();\n const sender = event.sender.sender_id.open_id;\n \n this.logger.info(`Received message from ${sender}: ${text}`);\n \n // 提取目标IDE/CLI\n const target = this.extractTargetIDE(text);\n const command = this.extractCommand(text);\n \n // 执行命令\n const result = await this.commandExecutor.execute({\n target,\n command,\n sender,\n chatId: message.chat_id\n });\n \n // 回复结果\n const formattedResponse = this.formatResponse(result);\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: formattedResponse\n }\n });\n }\n \n private extractTargetIDE(text: string): string {\n // 解析 @vscode /generate xxx 或 @cursor /generate xxx 格式\n const match = text.match(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)/i);\n return match ? match[1].toLowerCase() : 'auto';\n }\n \n private extractCommand(text: string): string {\n // 移除目标IDE标识符,提取实际命令\n const cleanedText = text.replace(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)\\s*/i, '').trim();\n return cleanedText;\n }\n \n private formatResponse(result: any): string {\n if (result.success) {\n // 限制输出长度以符合飞书消息限制\n const output = typeof result.output === 'string' \n ? result.output.substring(0, 2000) \n : JSON.stringify(result.output).substring(0, 2000);\n \n return `✅ 执行成功\\n\\n${output}`;\n } else {\n const error = result.error || result.stderr || 'Unknown error';\n return `❌ 执行失败\\n\\n${error.substring(0, 2000)}`;\n }\n }\n}","/**\n * WebSocket处理器\n * 用于与飞书建立实时连接接收事件\n */\nimport { WebSocket } from 'ws';\nimport { FeishuClient } from './client';\nimport { CommandExecutor } from '../commands/executor';\nimport { MessageRouter } from '../core/message-router';\nimport { LarkEvent } from './types';\nimport { Logger } from '../core/logger';\nimport { ConfigManager } from '../core/config';\nimport { BaseIDEAdapter } from '../adapters/base';\n\nexport class FeishuWebSocketHandler {\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectInterval = 5000; // 5秒\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private logger: Logger;\n private isRunning = false;\n private messageRouter: MessageRouter;\n\n constructor(\n private client: FeishuClient,\n private commandExecutor: CommandExecutor,\n private adapters: Map<string, BaseIDEAdapter>\n ) {\n this.logger = new Logger();\n this.messageRouter = new MessageRouter(adapters);\n }\n\n /**\n * 启动WebSocket连接\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n this.logger.warn('WebSocket handler already running');\n return;\n }\n\n this.isRunning = true;\n this.reconnectAttempts = 0;\n await this.connect();\n }\n\n /**\n * 停止WebSocket连接\n */\n async stop(): Promise<void> {\n this.isRunning = false;\n \n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.logger.info('WebSocket handler stopped');\n }\n\n /**\n * 建立WebSocket连接\n */\n private async connect(): Promise<void> {\n try {\n const config = ConfigManager.getInstance().getFeishuConfig();\n \n // 飞书WebSocket URL\n const wsUrl = config.domain === 'feishu'\n ? 'wss://ws.feishu.cn/passport/'\n : 'wss://ws.larksuite.com/passport/';\n\n this.logger.info(`Connecting to WebSocket: ${wsUrl}`);\n\n this.ws = new WebSocket(wsUrl, {\n headers: {\n 'Authorization': `Bearer ${await this.getAccessToken()}`\n }\n });\n\n this.setupWebSocketHandlers();\n\n } catch (error) {\n this.logger.error('Failed to connect WebSocket:', error);\n this.handleReconnect();\n }\n }\n\n /**\n * 设置WebSocket事件处理器\n */\n private setupWebSocketHandlers(): void {\n if (!this.ws) return;\n\n this.ws.on('open', () => {\n this.logger.info('WebSocket connected');\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n });\n\n this.ws.on('message', (data: WebSocket.Data) => {\n this.handleMessage(data.toString());\n });\n\n this.ws.on('close', (code: number, reason: Buffer) => {\n this.logger.info(`WebSocket closed: ${code} - ${reason.toString()}`);\n this.stopHeartbeat();\n \n if (this.isRunning) {\n this.handleReconnect();\n }\n });\n\n this.ws.on('error', (error: Error) => {\n this.logger.error('WebSocket error:', error);\n });\n\n this.ws.on('ping', () => {\n this.ws?.pong();\n });\n }\n\n /**\n * 处理收到的消息\n */\n private async handleMessage(data: string): Promise<void> {\n try {\n const event = JSON.parse(data) as LarkEvent;\n this.logger.debug('Received WebSocket message:', event);\n\n // 处理URL验证\n if (event.type === 'url_verification') {\n this.logger.info('Received URL verification challenge via WebSocket');\n return;\n }\n\n // 处理消息事件\n if (event.type === 'event_callback' && event.event) {\n await this.handleEvent(event.event);\n }\n\n } catch (error) {\n this.logger.error('Error handling WebSocket message:', error);\n }\n }\n\n /**\n * 处理事件\n */\n private async handleEvent(event: any): Promise<void> {\n const { message } = event;\n\n // 忽略非文本消息\n if (!message || message.message_type !== 'text') {\n this.logger.debug('Ignoring non-text message');\n return;\n }\n\n try {\n const content = JSON.parse(message.content);\n const text = content.text.trim();\n const sender = event.sender?.sender_id?.open_id;\n\n if (!sender) {\n this.logger.warn('Missing sender ID');\n return;\n }\n\n this.logger.info(`Received message from ${sender}: ${text}`);\n\n // 使用消息路由器\n const route = await this.messageRouter.route(text);\n\n if (route.type === 'error') {\n // 错误提示\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: route.content!\n }\n });\n return;\n }\n\n if (route.type === 'prompt_choice') {\n // 多工具选择提示\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: route.content!\n }\n });\n return;\n }\n\n // 直接路由到目标\n if (route.type === 'direct' && route.target) {\n const command = this.messageRouter.extractCommand(text);\n \n this.logger.info(`Routing to ${route.target}: ${command}`);\n\n // 执行命令\n const result = await this.commandExecutor.execute({\n target: route.target,\n command,\n sender,\n chatId: message.chat_id\n });\n\n // 回复结果\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: this.formatResponse(result)\n }\n });\n }\n\n } catch (error) {\n this.logger.error('Error processing event:', error);\n // 发送错误提示\n try {\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: `❌ 处理消息时出错: ${error instanceof Error ? error.message : '未知错误'}`\n }\n });\n } catch (sendError) {\n this.logger.error('Failed to send error message:', sendError);\n }\n }\n }\n\n /**\n * 启动心跳保活\n */\n private startHeartbeat(): void {\n // 每30秒发送一次ping\n this.heartbeatInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.ping();\n }\n }, 30000);\n }\n\n /**\n * 停止心跳\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * 处理重连\n */\n private handleReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this.logger.error(`Max reconnection attempts (${this.maxReconnectAttempts}) reached`);\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectInterval * this.reconnectAttempts;\n \n this.logger.info(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n setTimeout(() => {\n if (this.isRunning) {\n this.connect();\n }\n }, delay);\n }\n\n /**\n * 获取访问令牌\n */\n private async getAccessToken(): Promise<string> {\n // 这里需要实现获取tenant_access_token的逻辑\n // 简化版本:通过FeishuClient获取\n const config = ConfigManager.getInstance().getFeishuConfig();\n \n const response = await fetch(\n `https://open.${config.domain === 'lark' ? 'larksuite' : 'feishu'}.cn/open-apis/auth/v3/tenant_access_token/internal`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n app_id: config.appId,\n app_secret: config.appSecret\n })\n }\n );\n\n const data = await response.json() as any;\n \n if (data.code !== 0) {\n throw new Error(`Failed to get access token: ${data.msg}`);\n }\n\n return data.tenant_access_token;\n }\n\n /**\n * 提取目标IDE\n */\n private extractTargetIDE(text: string): string {\n const match = text.match(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)/i);\n return match ? match[1].toLowerCase() : 'auto';\n }\n\n /**\n * 提取命令\n */\n private extractCommand(text: string): string {\n return text.replace(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)\\s*/i, '').trim();\n }\n\n /**\n * 格式化响应\n */\n private formatResponse(result: any): string {\n if (result.success) {\n const output = typeof result.output === 'string'\n ? result.output.substring(0, 2000)\n : JSON.stringify(result.output).substring(0, 2000);\n return `✅ 执行成功\\n\\n${output}`;\n } else {\n const error = result.error || result.stderr || 'Unknown error';\n return `❌ 执行失败\\n\\n${error.substring(0, 2000)}`;\n }\n }\n}\n","/**\n * 消息路由器\n * 处理飞书消息,解析@提及,路由到对应适配器\n */\nimport { Logger } from '../core/logger';\nimport { ConfigManager } from '../core/config';\nimport { BaseIDEAdapter } from '../adapters/base';\n\nexport interface MessageRoute {\n type: 'direct' | 'prompt_choice' | 'error';\n target?: string;\n content?: string;\n availableTools?: ToolInfo[];\n}\n\nexport interface ToolInfo {\n id: string;\n name: string;\n type: 'cli' | 'ide';\n model?: string;\n available: boolean;\n}\n\nexport class MessageRouter {\n private logger: Logger;\n private cliTools: string[] = ['opencode', 'claude', 'gemini'];\n private ideTools: string[] = ['vscode', 'cursor', 'trae', 'antigravity', 'kiro'];\n\n constructor(\n private adapters: Map<string, BaseIDEAdapter>\n ) {\n this.logger = new Logger();\n }\n\n /**\n * 路由消息\n * @param text 消息文本\n * @returns 路由结果\n */\n async route(text: string): Promise<MessageRoute> {\n // 提取@提及\n const mention = this.extractMention(text);\n \n if (mention) {\n // 用户明确指定了工具\n const adapter = this.adapters.get(mention);\n if (!adapter) {\n return {\n type: 'error',\n content: `❌ 未找到工具 \"${mention}\",请确保已安装并启动`\n };\n }\n\n // 检查工具是否可用\n const isAvailable = await adapter.checkAvailability();\n if (!isAvailable) {\n return {\n type: 'error',\n content: `❌ \"${mention}\" 当前不可用,请检查是否已启动`\n };\n }\n\n return {\n type: 'direct',\n target: mention\n };\n }\n\n // 没有@,获取所有可用工具\n const availableTools = await this.getAvailableTools();\n\n if (availableTools.length === 0) {\n return {\n type: 'error',\n content: '❌ 没有检测到可用的工具\\n\\n请安装并启动以下任一工具:\\n• OpenCode: npm install -g opencode\\n• Claude Code: npm install -g @anthropic-ai/claude-code\\n• VS Code/Cursor/Trae等IDE'\n };\n }\n\n if (availableTools.length === 1) {\n // 只有一个工具,直接使用\n return {\n type: 'direct',\n target: availableTools[0].id\n };\n }\n\n // 多个工具,提示用户选择\n return {\n type: 'prompt_choice',\n content: this.buildChoicePrompt(availableTools),\n availableTools\n };\n }\n\n /**\n * 提取@提及\n */\n private extractMention(text: string): string | null {\n const allTools = [...this.cliTools, ...this.ideTools];\n const pattern = new RegExp(`^@(${allTools.join('|')})\\\\s+`, 'i');\n const match = text.match(pattern);\n return match ? match[1].toLowerCase() : null;\n }\n\n /**\n * 获取所有可用工具\n */\n private async getAvailableTools(): Promise<ToolInfo[]> {\n const tools: ToolInfo[] = [];\n\n for (const [id, adapter] of this.adapters) {\n try {\n const isAvailable = await adapter.checkAvailability();\n if (isAvailable) {\n tools.push({\n id,\n name: this.getToolDisplayName(id),\n type: this.cliTools.includes(id) ? 'cli' : 'ide',\n available: true\n });\n }\n } catch (error) {\n this.logger.warn(`检查工具 ${id} 状态时出错:`, error);\n }\n }\n\n return tools;\n }\n\n /**\n * 获取工具显示名称\n */\n private getToolDisplayName(id: string): string {\n const names: Record<string, string> = {\n 'opencode': 'OpenCode',\n 'claude': 'Claude Code',\n 'gemini': 'Gemini CLI',\n 'vscode': 'VS Code',\n 'cursor': 'Cursor',\n 'trae': 'Trae',\n 'antigravity': 'Antigravity',\n 'kiro': 'Kiro'\n };\n return names[id] || id;\n }\n\n /**\n * 构建选择提示\n */\n private buildChoicePrompt(tools: ToolInfo[]): string {\n const cliTools = tools.filter(t => t.type === 'cli');\n const ideTools = tools.filter(t => t.type === 'ide');\n\n let prompt = '🔧 检测到多个可用工具,请@要使用的工具:\\n\\n';\n\n if (cliTools.length > 0) {\n prompt += '**CLI工具:**\\n';\n cliTools.forEach(tool => {\n prompt += `@${tool.id} - ${tool.name}\\n`;\n });\n prompt += '\\n';\n }\n\n if (ideTools.length > 0) {\n prompt += '**IDE工具:**\\n';\n ideTools.forEach(tool => {\n prompt += `@${tool.id} - ${tool.name}\\n`;\n });\n prompt += '\\n';\n }\n\n prompt += '**示例:**\\n';\n prompt += `@${tools[0].id} 你好,请帮我优化这段代码`;\n\n return prompt;\n }\n\n /**\n * 提取纯命令文本(去除@提及)\n */\n extractCommand(text: string): string {\n const allTools = [...this.cliTools, ...this.ideTools];\n const pattern = new RegExp(`^@(${allTools.join('|')})\\\\s+`, 'i');\n return text.replace(pattern, '').trim();\n }\n}\n","/**\n * 飞书API客户端\n */\nimport { Logger } from '../core/logger';\nimport { LarkApiResponse, SendMessageRequest, SendMessageResponse } from './types';\n\nexport interface FeishuConfig {\n appId: string;\n appSecret: string;\n domain: 'feishu' | 'lark';\n}\n\nexport class FeishuClient {\n private appId: string;\n private appSecret: string;\n private domain: 'feishu' | 'lark';\n private baseUrl: string;\n private accessToken: string | null = null;\n private tokenExpireTime: number = 0;\n private logger: Logger;\n\n constructor(config: FeishuConfig) {\n this.appId = config.appId;\n this.appSecret = config.appSecret;\n this.domain = config.domain;\n this.baseUrl = this.domain === 'feishu' \n ? 'https://open.feishu.cn/open-apis'\n : 'https://open.larksuite.com/open-apis';\n this.logger = new Logger();\n }\n\n /**\n * 获取访问令牌\n */\n private async getAccessToken(): Promise<string> {\n const now = Date.now();\n \n // 如果令牌未过期,直接返回\n if (this.accessToken && now < this.tokenExpireTime) {\n return this.accessToken;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/auth/v3/tenant_access_token/internal`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n body: JSON.stringify({\n app_id: this.appId,\n app_secret: this.appSecret,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get access token: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as LarkApiResponse<{\n tenant_access_token: string;\n expire: number;\n }>;\n\n if (data.code !== 0) {\n throw new Error(`Failed to get access token: ${data.msg}`);\n }\n\n this.accessToken = data.data.tenant_access_token;\n this.tokenExpireTime = now + (data.data.expire - 300) * 1000; // 提前5分钟刷新\n\n this.logger.info('Access token refreshed successfully');\n return this.accessToken;\n } catch (error) {\n this.logger.error('Error getting access token:', error);\n throw error;\n }\n }\n\n /**\n * 发送消息到指定聊天\n */\n async sendMessage(chatId: string, message: SendMessageRequest): Promise<SendMessageResponse> {\n try {\n const token = await this.getAccessToken();\n \n const response = await fetch(`${this.baseUrl}/im/v1/messages?receive_id_type=chat_id`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json; charset=utf-8',\n },\n body: JSON.stringify({\n receive_id: chatId,\n ...message,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as LarkApiResponse<SendMessageResponse>;\n\n if (data.code !== 0) {\n throw new Error(`Failed to send message: ${data.msg}`);\n }\n\n this.logger.info(`Message sent successfully to chat ${chatId}`);\n return data.data;\n } catch (error) {\n this.logger.error('Error sending message:', error);\n throw error;\n }\n }\n\n /**\n * 获取用户信息\n */\n async getUserInfo(userId: string): Promise<any> {\n try {\n const token = await this.getAccessToken();\n \n const response = await fetch(`${this.baseUrl}/contact/v3/users/${userId}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json; charset=utf-8',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get user info: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as LarkApiResponse<any>;\n\n if (data.code !== 0) {\n throw new Error(`Failed to get user info: ${data.msg}`);\n }\n\n return data.data;\n } catch (error) {\n this.logger.error('Error getting user info:', error);\n throw error;\n }\n }\n}","/**\n * 命令执行器\n */\nimport { SessionManager } from '../session/manager';\nimport { BaseIDEAdapter } from '../adapters/base';\nimport { Logger } from '../core/logger';\n\nexport interface CommandExecutionRequest {\n target: string;\n command: string;\n sender: string;\n chatId: string;\n}\n\nexport interface CommandExecutionResult {\n success: boolean;\n output: string;\n error?: string;\n}\n\nexport class CommandExecutor {\n private logger: Logger;\n\n constructor(\n private adapters: Map<string, BaseIDEAdapter>,\n private sessionManager: SessionManager\n ) {\n this.logger = new Logger();\n }\n\n async execute(request: CommandExecutionRequest): Promise<CommandExecutionResult> {\n try {\n this.logger.info(`Executing command for target: ${request.target}, command: ${request.command}`);\n\n // 获取会话上下文\n const session = this.sessionManager.getSession(request.sender);\n \n // 确定要使用的适配器\n let adapterName = request.target.toLowerCase();\n if (adapterName === 'auto') {\n adapterName = this.detectBestAdapter();\n }\n \n // 获取对应的适配器\n const adapter = this.adapters.get(adapterName);\n if (!adapter) {\n throw new Error(`Adapter not found for target: ${adapterName}`);\n }\n \n // 检查适配器是否可用\n if (!await adapter.checkAvailability()) {\n throw new Error(`Adapter ${adapterName} is not available`);\n }\n \n // 准备执行上下文\n const executionContext = {\n workspaceRoot: session?.workspaceRoot,\n chatId: request.chatId,\n senderId: request.sender\n };\n \n // 根据命令类型执行相应操作\n let result: string;\n \n if (this.isGenerateCommand(request.command)) {\n // 代码生成命令\n const description = this.extractDescription(request.command);\n result = await adapter.generateCode(description);\n } else if (this.isRunCommand(request.command)) {\n // 运行命令\n const command = this.extractRunCommand(request.command);\n const executionResult = await adapter.runProgram(command, executionContext.workspaceRoot);\n result = executionResult.stdout || executionResult.stderr;\n } else {\n // 通用命令\n result = await adapter.sendCommand(request.command, executionContext);\n }\n \n // 更新会话\n this.sessionManager.updateSession(request.sender, {\n lastCommand: request.command,\n lastResult: result,\n lastUsedAdapter: adapterName\n });\n \n return {\n success: true,\n output: result\n };\n } catch (error) {\n this.logger.error('Error executing command:', error);\n \n return {\n success: false,\n output: '',\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n private detectBestAdapter(): string {\n // 简单的适配器检测逻辑\n // 在实际实现中,可以更智能地检测当前环境\n for (const [name, adapter] of this.adapters) {\n if (adapter.isAvailable) {\n return name;\n }\n }\n \n // 如果没有可用的适配器,则默认返回vscode\n return 'vscode';\n }\n\n private isGenerateCommand(command: string): boolean {\n return /\\b(generate|create|make|build|implement|write|develop|add|new)\\b/i.test(command);\n }\n\n private isRunCommand(command: string): boolean {\n return /\\b(run|execute|start|launch|test|debug|build)\\b/i.test(command);\n }\n\n private extractDescription(command: string): string {\n // 提取生成命令的描述部分\n const match = command.match(/\\b(generate|create|make|build|implement|write|develop|add|new)\\b\\s+(.*)/i);\n return match ? match[2] : command;\n }\n\n private extractRunCommand(command: string): string {\n // 提取运行命令的部分\n const match = command.match(/\\b(run|execute|start|launch|test|debug|build)\\b\\s+(.*)/i);\n return match ? match[2] : command;\n }\n}","/**\n * 会话管理器\n */\nimport { Logger } from '../core/logger';\n\nexport interface SessionData {\n userId: string;\n createdAt: number;\n lastActive: number;\n workspaceRoot?: string;\n context?: any;\n lastCommand?: string;\n lastResult?: string;\n lastUsedAdapter?: string;\n}\n\nexport interface SessionUpdate {\n workspaceRoot?: string;\n context?: any;\n lastCommand?: string;\n lastResult?: string;\n lastUsedAdapter?: string;\n}\n\nexport class SessionManager {\n private sessions: Map<string, SessionData> = new Map();\n private logger: Logger;\n private sessionTimeout: number; // 会话超时时间(毫秒)\n\n constructor(sessionTimeoutMinutes: number = 30) {\n this.logger = new Logger();\n this.sessionTimeout = sessionTimeoutMinutes * 60 * 1000; // 转换为毫秒\n \n // 定期清理过期会话\n setInterval(() => {\n this.cleanupExpiredSessions();\n }, this.sessionTimeout);\n }\n\n /**\n * 获取会话,如果不存在则创建新会话\n */\n getSession(userId: string): SessionData | null {\n const session = this.sessions.get(userId);\n \n if (session) {\n // 检查会话是否过期\n if (Date.now() - session.lastActive > this.sessionTimeout) {\n this.logger.info(`Session for user ${userId} expired, removing`);\n this.sessions.delete(userId);\n return null;\n }\n \n // 更新最后活跃时间\n session.lastActive = Date.now();\n return session;\n }\n \n return null;\n }\n\n /**\n * 创建新会话\n */\n createSession(userId: string, initialData?: Partial<SessionData>): SessionData {\n const now = Date.now();\n const session: SessionData = {\n userId,\n createdAt: now,\n lastActive: now,\n workspaceRoot: initialData?.workspaceRoot,\n context: initialData?.context,\n lastCommand: initialData?.lastCommand,\n lastResult: initialData?.lastResult,\n lastUsedAdapter: initialData?.lastUsedAdapter\n };\n\n this.sessions.set(userId, session);\n this.logger.info(`Created new session for user ${userId}`);\n \n return session;\n }\n\n /**\n * 更新会话数据\n */\n updateSession(userId: string, update: SessionUpdate): SessionData | null {\n let session = this.sessions.get(userId);\n \n if (!session) {\n // 如果会话不存在,创建一个新会话\n session = this.createSession(userId);\n }\n \n // 更新会话数据\n session.lastActive = Date.now();\n if (update.workspaceRoot !== undefined) session.workspaceRoot = update.workspaceRoot;\n if (update.context !== undefined) session.context = { ...session.context, ...update.context };\n if (update.lastCommand !== undefined) session.lastCommand = update.lastCommand;\n if (update.lastResult !== undefined) session.lastResult = update.lastResult;\n if (update.lastUsedAdapter !== undefined) session.lastUsedAdapter = update.lastUsedAdapter;\n\n this.sessions.set(userId, session);\n this.logger.debug(`Updated session for user ${userId}`);\n \n return session;\n }\n\n /**\n * 删除会话\n */\n removeSession(userId: string): boolean {\n const removed = this.sessions.delete(userId);\n if (removed) {\n this.logger.info(`Removed session for user ${userId}`);\n }\n return removed;\n }\n\n /**\n * 清理会话数据\n */\n clearAllSessions(): void {\n const count = this.sessions.size;\n this.sessions.clear();\n this.logger.info(`Cleared all ${count} sessions`);\n }\n\n /**\n * 获取所有活跃会话数量\n */\n getActiveSessionCount(): number {\n return this.sessions.size;\n }\n\n /**\n * 清理过期会话\n */\n private cleanupExpiredSessions(): void {\n const now = Date.now();\n let expiredCount = 0;\n\n for (const [userId, session] of this.sessions) {\n if (now - session.lastActive > this.sessionTimeout) {\n this.sessions.delete(userId);\n expiredCount++;\n this.logger.info(`Cleaned up expired session for user ${userId}`);\n }\n }\n\n if (expiredCount > 0) {\n this.logger.info(`Cleaned up ${expiredCount} expired sessions`);\n }\n }\n}","/**\n * 适配器基类\n */\nimport { Logger } from '../core/logger';\nimport { ReverseChannel, ReverseMessage } from '../core/reverse-channel';\n\nexport interface ExecutionContext {\n workspaceRoot?: string;\n chatId?: string;\n senderId?: string;\n}\n\nexport interface CodeGenOptions {\n language?: string;\n framework?: string;\n style?: string;\n}\n\nexport interface ExecutionResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n success: boolean;\n output?: string;\n error?: string;\n}\n\nexport interface IIDEAdapter {\n readonly type: string;\n readonly isAvailable: boolean;\n \n // 检查IDE是否可用\n checkAvailability(): Promise<boolean>;\n \n // 发送命令到IDE\n sendCommand(command: string, context?: ExecutionContext): Promise<string>;\n \n // 获取AI助手响应\n getAIResponse(prompt: string, context?: ExecutionContext): Promise<string>;\n \n // 执行代码生成\n generateCode(description: string, options?: CodeGenOptions): Promise<string>;\n \n // 运行程序\n runProgram(command: string, cwd?: string): Promise<ExecutionResult>;\n}\n\nexport abstract class BaseIDEAdapter implements IIDEAdapter {\n protected logger: Logger;\n protected reverseChannel: ReverseChannel | null = null;\n\n constructor() {\n this.logger = new Logger().child({ adapter: this.type });\n }\n\n abstract readonly type: string;\n\n get isAvailable(): boolean {\n return this.checkAvailabilitySync();\n }\n\n /**\n * 设置反向通信通道\n * 允许适配器主动向飞书发送消息\n */\n setReverseChannel(channel: ReverseChannel): void {\n this.reverseChannel = channel;\n this.logger.info(`Reverse channel set for ${this.type} adapter`);\n }\n\n /**\n * 发送消息到飞书\n * 供子类调用以主动推送消息\n */\n protected async sendToFeishu(\n content: string,\n context?: ExecutionContext,\n type: ReverseMessage['type'] = 'message'\n ): Promise<boolean> {\n if (!this.reverseChannel) {\n this.logger.warn('Reverse channel not available, cannot send message to Feishu');\n return false;\n }\n\n if (!context?.chatId) {\n this.logger.warn('No chatId in context, cannot send message to Feishu');\n return false;\n }\n\n try {\n await this.reverseChannel.sendToFeishu({\n type,\n content,\n chatId: context.chatId,\n senderId: context.senderId,\n timestamp: Date.now()\n });\n return true;\n } catch (error) {\n this.logger.error('Error sending message to Feishu:', error);\n return false;\n }\n }\n\n /**\n * 发送文件系统消息(无需反向通道实例)\n * 通过写入文件的方式让Bridge代为发送\n */\n protected async sendFileSystemMessage(\n content: string,\n context?: ExecutionContext,\n type: ReverseMessage['type'] = 'message'\n ): Promise<void> {\n if (!this.reverseChannel) {\n this.logger.warn('Reverse channel not available for file system message');\n return;\n }\n\n await this.reverseChannel.sendFileSystemMessage(\n this.type,\n content,\n context?.chatId\n );\n }\n\n abstract checkAvailability(): Promise<boolean>;\n protected abstract checkAvailabilitySync(): boolean;\n abstract sendCommand(command: string, context?: ExecutionContext): Promise<string>;\n abstract getAIResponse(prompt: string, context?: ExecutionContext): Promise<string>;\n abstract generateCode(description: string, options?: CodeGenOptions): Promise<string>;\n abstract runProgram(command: string, cwd?: string): Promise<ExecutionResult>;\n\n protected buildCodePrompt(description: string, options?: CodeGenOptions): string {\n let prompt = description;\n \n if (options) {\n if (options.language) {\n prompt += `\\nLanguage: ${options.language}`;\n }\n if (options.framework) {\n prompt += `\\nFramework: ${options.framework}`;\n }\n if (options.style) {\n prompt += `\\nStyle: ${options.style}`;\n }\n }\n \n return prompt;\n }\n}","/**\n * VS Code 适配器\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nexport class VSCodeAdapter extends BaseIDEAdapter {\n readonly type = 'vscode';\n private vscodePath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查VS Code环境变量\n if (process.env.VSCODE_PID || process.env.VSCODE_CWD) {\n return true;\n }\n \n // 尝试查找VS Code可执行文件\n this.vscodePath = this.findVSCodeExecutable();\n return !!this.vscodePath;\n }\n \n private findVSCodeExecutable(): string | null {\n const platform = os.platform();\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n // macOS\n possiblePaths.push(\n '/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code',\n '/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code',\n '/usr/local/bin/code',\n path.join(os.homedir(), 'Applications/Visual Studio Code.app/Contents/Resources/app/bin/code')\n );\n } else if (platform === 'win32') {\n // Windows\n possiblePaths.push(\n path.join(process.env.LOCALAPPDATA || '', 'Programs/Microsoft VS Code/bin/code.cmd'),\n path.join(process.env.ProgramFiles || '', 'Microsoft VS Code/bin/code.cmd'),\n path.join(process.env.ProgramFiles || '', 'Microsoft VS Code/bin/code.exe'),\n 'C:\\\\Program Files\\\\Microsoft VS Code\\\\bin\\\\code.cmd'\n );\n } else {\n // Linux\n possiblePaths.push(\n '/usr/bin/code',\n '/usr/local/bin/code',\n '/usr/share/code/bin/code',\n path.join(os.homedir(), '.local/bin/code'),\n '/snap/bin/code'\n );\n }\n \n for (const vscodePath of possiblePaths) {\n if (fs.existsSync(vscodePath)) {\n return vscodePath;\n }\n }\n \n // 尝试使用which/where命令查找\n try {\n if (platform === 'win32') {\n const result = execa.sync('where', ['code'], { reject: false });\n if (result.stdout) {\n const lines = result.stdout.split('\\n').map(l => l.trim()).filter(l => l);\n if (lines.length > 0) return lines[0];\n }\n } else {\n const result = execa.sync('which', ['code'], { reject: false });\n if (result.stdout) {\n return result.stdout.trim();\n }\n }\n } catch {\n // 查找失败\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to VS Code: ${command}`);\n \n // 方法1: 尝试使用VS Code CLI (如果可用)\n if (this.vscodePath) {\n try {\n const result = await execa(this.vscodePath, [\n '--command', \n 'feishuBridge.execute',\n '--args', JSON.stringify({ command })\n ], {\n timeout: 30000,\n reject: false\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed successfully';\n }\n } catch (cliError) {\n this.logger.debug('VS Code CLI failed, trying file system method');\n }\n }\n \n // 方法2: 通过文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing VS Code command:`, error);\n throw new Error(`VS Code command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'vscode');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `Command queued for VS Code. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from VS Code for prompt: ${prompt}`);\n \n // 尝试使用VS Code CLI (如果可用)\n if (this.vscodePath) {\n try {\n const result = await execa(this.vscodePath, [\n '--command',\n 'github.copilot.generateCode',\n '--args', JSON.stringify({ prompt })\n ], {\n timeout: 60000,\n reject: false\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('VS Code AI CLI failed, using file system');\n }\n }\n \n // 文件系统方式\n return await this.sendAIRequestViaFileSystem(prompt, context);\n \n } catch (error) {\n this.logger.error(`Error getting VS Code AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'vscode');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000; // AI响应可能需要更长时间\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `AI request queued for VS Code. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000, // 60秒超时\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in VS Code:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Cursor 适配器\n * Cursor是基于VS Code的AI编辑器,支持多种交互方式\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class CursorAdapter extends BaseIDEAdapter {\n readonly type = 'cursor';\n private cursorPath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查Cursor是否通过环境变量标识\n if (process.env.CURSOR_SHELL || process.env.CURSOR_PID) {\n return true;\n }\n \n // 尝试查找Cursor可执行文件\n this.cursorPath = this.findCursorExecutable();\n return !!this.cursorPath;\n }\n \n private findCursorExecutable(): string | null {\n const platform = os.platform();\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n // macOS\n possiblePaths.push(\n '/Applications/Cursor.app/Contents/MacOS/Cursor',\n '/usr/local/bin/cursor',\n path.join(os.homedir(), 'Applications/Cursor.app/Contents/MacOS/Cursor')\n );\n } else if (platform === 'win32') {\n // Windows\n possiblePaths.push(\n path.join(process.env.LOCALAPPDATA || '', 'Programs/Cursor/Cursor.exe'),\n path.join(process.env.PROGRAMFILES || '', 'Cursor/Cursor.exe'),\n 'C:\\\\Program Files\\\\Cursor\\\\Cursor.exe'\n );\n } else {\n // Linux\n possiblePaths.push(\n '/usr/bin/cursor',\n '/usr/local/bin/cursor',\n '/opt/cursor/cursor',\n path.join(os.homedir(), '.local/bin/cursor')\n );\n }\n \n for (const cursorPath of possiblePaths) {\n if (fs.existsSync(cursorPath)) {\n return cursorPath;\n }\n }\n \n // 尝试使用which/where命令查找\n try {\n if (platform === 'win32') {\n const result = execa.sync('where', ['cursor'], { reject: false });\n if (result.stdout) {\n const lines = result.stdout.split('\\n').map(l => l.trim()).filter(l => l);\n if (lines.length > 0) return lines[0];\n }\n } else {\n const result = execa.sync('which', ['cursor'], { reject: false });\n if (result.stdout) {\n return result.stdout.trim();\n }\n }\n } catch {\n // 查找失败\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Cursor: ${command}`);\n \n // 方法1: 尝试使用Cursor CLI (如果可用)\n if (this.cursorPath) {\n try {\n const result = await execa(this.cursorPath, [\n '--command',\n 'workbench.action.executeCommand',\n '--args', JSON.stringify({ command })\n ], {\n timeout: 30000,\n reject: false\n });\n \n if (!result.failed) {\n return `Cursor executed: ${command}\\n${result.stdout}`;\n }\n } catch (cliError) {\n this.logger.debug('Cursor CLI failed, trying alternative methods');\n }\n }\n \n // 方法2: 通过文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing Cursor command:`, error);\n throw new Error(`Cursor command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n // 创建临时指令文件\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'cursor');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `instruction_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `response_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应(最多30秒)\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n // 清理临时文件\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {\n // 忽略清理错误\n }\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n // 超时,清理并返回错误\n try {\n fs.unlinkSync(instructionFile);\n } catch {\n // 忽略\n }\n \n return `Command sent to Cursor workspace (file: ${instructionFile}). No response received within ${maxWait}ms. Make sure Cursor is running with Feishu Bridge extension.`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Cursor for prompt: ${prompt}`);\n \n // Cursor使用Composer AI,尝试通过文件系统通信\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'cursor');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_request_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_response_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 60000; // AI响应可能需要更长时间\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {\n // 忽略\n }\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {\n // 忽略\n }\n \n return `AI request sent to Cursor (file: ${instructionFile}). No response received within ${maxWait}ms.`;\n \n } catch (error) {\n this.logger.error(`Error getting Cursor AI response:`, error);\n throw error;\n }\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Cursor:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Trae 适配器\n * Trae是字节跳动的AI IDE\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class TraeAdapter extends BaseIDEAdapter {\n readonly type = 'trae';\n private traePath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查Trae环境变量\n if (process.env.TRAE_SESSION || process.env.TRAE_PID) {\n return true;\n }\n \n // 尝试查找Trae\n this.traePath = this.findTraeExecutable();\n return !!this.traePath;\n }\n \n private findTraeExecutable(): string | null {\n const platform = os.platform();\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n possiblePaths.push(\n '/Applications/Trae.app/Contents/MacOS/Trae',\n '/usr/local/bin/trae',\n path.join(os.homedir(), 'Applications/Trae.app/Contents/MacOS/Trae')\n );\n } else if (platform === 'win32') {\n possiblePaths.push(\n path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Trae', 'Trae.exe'),\n 'C:\\\\Program Files\\\\Trae\\\\Trae.exe'\n );\n } else {\n possiblePaths.push(\n '/usr/bin/trae',\n '/usr/local/bin/trae',\n '/opt/trae/trae',\n path.join(os.homedir(), '.local/bin/trae')\n );\n }\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n \n // 尝试which/where\n try {\n if (platform === 'win32') {\n const result = execa.sync('where', ['trae'], { reject: false });\n if (result.stdout) {\n const lines = result.stdout.split('\\n').map(l => l.trim()).filter(l => l);\n if (lines.length > 0) return lines[0];\n }\n } else {\n const result = execa.sync('which', ['trae'], { reject: false });\n if (result.stdout) {\n return result.stdout.trim();\n }\n }\n } catch {}\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Trae: ${command}`);\n \n // 尝试使用Trae CLI\n if (this.traePath) {\n try {\n const result = await execa(this.traePath, [\n '--executeCommand',\n command\n ], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed';\n }\n } catch (cliError) {\n this.logger.debug('Trae CLI failed, using file system');\n }\n }\n \n // 文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing Trae command:`, error);\n throw new Error(`Trae command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'trae');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `Command queued for Trae. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Trae for prompt: ${prompt}`);\n \n if (this.traePath) {\n try {\n const result = await execa(this.traePath, [\n '--ai',\n prompt\n ], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Trae AI CLI failed, using file system');\n }\n }\n \n return await this.sendAIRequestViaFileSystem(prompt, context);\n \n } catch (error) {\n this.logger.error(`Error getting Trae AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'trae');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000;\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `AI request queued for Trae. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Trae:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Antigravity 适配器\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class AntigravityAdapter extends BaseIDEAdapter {\n readonly type = 'antigravity';\n private antigravityPath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n if (process.env.ANTIGRAVITY_SESSION) {\n return true;\n }\n \n this.antigravityPath = this.findAntigravityExecutable();\n return !!this.antigravityPath;\n }\n \n private findAntigravityExecutable(): string | null {\n try {\n const result = execa.sync('which', ['antigravity'], { reject: false });\n if (result.stdout) return result.stdout.trim();\n } catch {}\n \n const possiblePaths = [\n '/usr/local/bin/antigravity',\n '/usr/bin/antigravity',\n path.join(os.homedir(), '.local/bin/antigravity')\n ];\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Antigravity: ${command}`);\n \n if (this.antigravityPath) {\n try {\n const result = await execa(this.antigravityPath, ['execute', command], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed';\n }\n } catch (cliError) {\n this.logger.debug('Antigravity CLI failed, using file system');\n }\n }\n \n return await this.sendViaFileSystem(command, context);\n } catch (error) {\n this.logger.error(`Error executing Antigravity command:`, error);\n throw new Error(`Antigravity command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'antigravity');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `Command queued for Antigravity. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Antigravity for prompt: ${prompt}`);\n \n if (this.antigravityPath) {\n try {\n const result = await execa(this.antigravityPath, ['ask', prompt], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Antigravity AI CLI failed, using file system');\n }\n }\n \n return await this.sendAIRequestViaFileSystem(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting Antigravity AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'antigravity');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000;\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `AI request queued for Antigravity. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Antigravity:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Kiro 适配器\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class KiroAdapter extends BaseIDEAdapter {\n readonly type = 'kiro';\n private kiroPath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n if (process.env.KIRO_SESSION) {\n return true;\n }\n \n this.kiroPath = this.findKiroExecutable();\n return !!this.kiroPath;\n }\n \n private findKiroExecutable(): string | null {\n try {\n const result = execa.sync('which', ['kiro'], { reject: false });\n if (result.stdout) return result.stdout.trim();\n } catch {}\n \n const possiblePaths = [\n '/usr/local/bin/kiro',\n '/usr/bin/kiro',\n path.join(os.homedir(), '.local/bin/kiro')\n ];\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Kiro: ${command}`);\n \n if (this.kiroPath) {\n try {\n const result = await execa(this.kiroPath, ['execute', command], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed';\n }\n } catch (cliError) {\n this.logger.debug('Kiro CLI failed, using file system');\n }\n }\n \n return await this.sendViaFileSystem(command, context);\n } catch (error) {\n this.logger.error(`Error executing Kiro command:`, error);\n throw new Error(`Kiro command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'kiro');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `Command queued for Kiro. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Kiro for prompt: ${prompt}`);\n \n if (this.kiroPath) {\n try {\n const result = await execa(this.kiroPath, ['ask', prompt], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Kiro AI CLI failed, using file system');\n }\n }\n \n return await this.sendAIRequestViaFileSystem(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting Kiro AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'kiro');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000;\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `AI request queued for Kiro. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Kiro:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * OpenCode 适配器\n * 支持Socket优先 + CLI降级模式\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport { spawn } from 'child_process';\nimport * as net from 'net';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nexport class OpenCodeAdapter extends BaseIDEAdapter {\n readonly type = 'opencode';\n private sessionId?: string;\n private useSocket: boolean = false;\n private socketClient?: net.Socket;\n private messageId = 0;\n private pendingMessages: Map<string, { resolve: Function; reject: Function }> = new Map();\n \n protected checkAvailabilitySync(): boolean {\n // 检查Socket或CLI是否可用\n const socketAvailable = this.getSocketPath() !== null;\n const cliAvailable = this.checkCLIExists();\n \n return socketAvailable || cliAvailable;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n private checkCLIExists(): boolean {\n try {\n // 同步检查opencode命令是否存在\n const { execSync } = require('child_process');\n execSync('which opencode', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n \n private getSocketPath(): string | null {\n const possiblePaths = [\n path.join(os.tmpdir(), 'opencode.sock'),\n path.join(os.tmpdir(), 'opencode-bridge.sock'),\n path.join(os.homedir(), '.opencode', 'socket'),\n process.env.OPENCODE_SOCKET\n ].filter(Boolean) as string[];\n \n for (const socketPath of possiblePaths) {\n if (fs.existsSync(socketPath)) {\n return socketPath;\n }\n }\n \n return null;\n }\n \n async activate(): Promise<void> {\n // 优先尝试Socket连接\n const socketPath = this.getSocketPath();\n if (socketPath) {\n try {\n await this.connectSocket(socketPath);\n this.useSocket = true;\n this.logger.info(`OpenCode Socket模式已连接: ${socketPath}`);\n return;\n } catch (error) {\n this.logger.warn(`Socket连接失败,将使用CLI模式: ${error}`);\n }\n }\n \n // 检查CLI可用\n if (!this.checkCLIExists()) {\n throw new Error('OpenCode未安装,请先运行: npm install -g opencode');\n }\n \n this.logger.info('OpenCode CLI模式就绪');\n }\n \n async deactivate(): Promise<void> {\n if (this.socketClient) {\n this.socketClient.end();\n this.socketClient = undefined;\n }\n }\n \n private async connectSocket(socketPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.socketClient = net.createConnection(socketPath);\n \n this.socketClient.on('connect', () => {\n resolve();\n });\n \n this.socketClient.on('error', (err) => {\n reject(err);\n });\n \n // 设置消息监听\n this.setupSocketListener();\n });\n }\n \n private setupSocketListener(): void {\n if (!this.socketClient) return;\n \n let buffer = '';\n \n this.socketClient.on('data', (data) => {\n buffer += data.toString();\n \n // 处理JSON行协议\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (line.trim()) {\n try {\n const message = JSON.parse(line);\n this.handleSocketMessage(message);\n } catch (e) {\n this.logger.error('解析Socket消息失败:', line);\n }\n }\n }\n });\n \n this.socketClient.on('close', () => {\n this.logger.info('OpenCode Socket连接关闭');\n this.useSocket = false;\n this.socketClient = undefined;\n });\n }\n \n private handleSocketMessage(message: any): void {\n const { id, content, error, model, usage } = message;\n \n if (id && this.pendingMessages.has(id)) {\n const { resolve, reject } = this.pendingMessages.get(id)!;\n this.pendingMessages.delete(id);\n \n if (error) {\n reject(new Error(error));\n } else {\n resolve({ content, model, usage });\n }\n }\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to OpenCode: ${command}`);\n \n if (this.useSocket && this.socketClient) {\n const result = await this.sendViaSocket({\n type: 'command',\n command,\n context\n });\n return result.content;\n } else {\n return await this.sendViaCLI(command, context);\n }\n } catch (error) {\n this.logger.error(`Error executing OpenCode command:`, error);\n throw error;\n }\n }\n \n private async sendViaSocket(data: any): Promise<{ content: string; model?: string; usage?: any }> {\n return new Promise((resolve, reject) => {\n const id = `msg_${++this.messageId}`;\n this.pendingMessages.set(id, { resolve, reject });\n \n const message = { ...data, id };\n this.socketClient!.write(JSON.stringify(message) + '\\n');\n \n // 30秒超时\n setTimeout(() => {\n if (this.pendingMessages.has(id)) {\n this.pendingMessages.delete(id);\n reject(new Error('OpenCode Socket请求超时'));\n }\n }, 30000);\n });\n }\n \n private async sendViaCLI(command: string, context?: ExecutionContext): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['chat', '--non-interactive'];\n \n const child = spawn('opencode', args, {\n cwd: context?.workspaceRoot,\n env: { ...process.env, OPENCODE_NON_INTERACTIVE: '1' },\n stdio: ['pipe', 'pipe', 'pipe']\n });\n \n let stdout = '';\n let stderr = '';\n \n child.stdout!.on('data', (data) => {\n stdout += data.toString();\n });\n \n child.stderr!.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`OpenCode退出码 ${code}: ${stderr}`));\n } else {\n resolve(stdout.trim());\n }\n });\n \n child.on('error', (err) => {\n reject(new Error(`启动OpenCode失败: ${err.message}`));\n });\n \n // 发送命令\n child.stdin!.write(command);\n child.stdin!.end();\n });\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from OpenCode for prompt: ${prompt.substring(0, 100)}...`);\n return await this.sendCommand(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting OpenCode AI response:`, error);\n throw error;\n }\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await this.sendCommand(command, { workspaceRoot: cwd });\n \n return {\n stdout: result,\n stderr: '',\n exitCode: 0,\n success: true,\n output: result\n };\n } catch (error) {\n this.logger.error(`Error running program in OpenCode:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Claude Code 适配器\n * Claude Code是Anthropic的CLI工具\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class ClaudeCodeAdapter extends BaseIDEAdapter {\n readonly type = 'claude';\n private claudePath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查Claude Code环境变量\n if (process.env.CLAUDE_CODE_SESSION) {\n return true;\n }\n \n // 尝试查找claude CLI\n this.claudePath = this.findClaudeExecutable();\n return !!this.claudePath;\n }\n \n private findClaudeExecutable(): string | null {\n const platform = os.platform();\n \n // 尝试直接调用claude命令\n try {\n const result = execa.sync('claude', ['--version'], { reject: false });\n if (result.exitCode === 0) {\n return 'claude';\n }\n } catch {\n // 未找到\n }\n \n // 查找常见安装路径\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n possiblePaths.push(\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n path.join(os.homedir(), '.local/bin/claude')\n );\n } else if (platform === 'win32') {\n possiblePaths.push(\n path.join(os.homedir(), 'AppData', 'Local', 'Programs', 'claude', 'claude.exe'),\n 'C:\\\\Program Files\\\\Claude\\\\claude.exe'\n );\n } else {\n possiblePaths.push(\n '/usr/bin/claude',\n '/usr/local/bin/claude',\n path.join(os.homedir(), '.local/bin/claude'),\n path.join(os.homedir(), '.npm-global/bin/claude')\n );\n }\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Claude Code: ${command}`);\n \n // 尝试使用Claude CLI\n if (this.claudePath) {\n try {\n // Claude Code支持命令行参数\n const result = await execa(this.claudePath, [\n 'execute',\n '--command', command\n ], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed successfully';\n }\n } catch (cliError) {\n this.logger.debug('Claude CLI failed, trying file system method');\n }\n }\n \n // 备用:文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing Claude Code command:`, error);\n throw new Error(`Claude Code command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'claude');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `Command queued for Claude Code. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Claude Code for prompt: ${prompt}`);\n \n // 尝试使用Claude CLI直接询问\n if (this.claudePath) {\n try {\n const result = await execa(this.claudePath, [\n 'ask',\n '--prompt', prompt\n ], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Claude ask CLI failed, using file system');\n }\n }\n \n // 文件系统方式\n return await this.sendAIRequestViaFileSystem(prompt, context);\n \n } catch (error) {\n this.logger.error(`Error getting Claude Code AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'claude');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000; // AI可能需要更长时间\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `AI request queued. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Claude Code:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Gemini CLI 适配器\n * Google Gemini命令行工具\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { spawn } from 'child_process';\nimport { execa } from 'execa';\n\nexport class GeminiCLIAdapter extends BaseIDEAdapter {\n readonly type = 'gemini';\n private cliPath: string = 'gcloud';\n \n protected checkAvailabilitySync(): boolean {\n try {\n const { execSync } = require('child_process');\n execSync('gcloud version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async activate(): Promise<void> {\n const available = await this.checkAvailability();\n if (!available) {\n throw new Error(\n 'Gemini CLI未安装。请安装Google Cloud SDK: https://cloud.google.com/sdk/docs/install'\n );\n }\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Gemini CLI: ${command}`);\n \n // 使用gcloud ai models调用Gemini\n const result = await this.executeViaCLI(command, context);\n return result;\n \n } catch (error) {\n this.logger.error(`Error executing Gemini CLI command:`, error);\n throw new Error(`Gemini CLI command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async executeViaCLI(prompt: string, context?: ExecutionContext): Promise<string> {\n return new Promise((resolve, reject) => {\n // 使用gcloud ai models generate-text\n const args = [\n 'ai', 'models', 'generate-text',\n '--model=gemini-1.5-pro',\n '--region=us-central1',\n '--format=json'\n ];\n \n const child = spawn(this.cliPath, args, {\n cwd: context?.workspaceRoot,\n env: process.env,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n \n let stdout = '';\n let stderr = '';\n \n child.stdout!.on('data', (data) => {\n stdout += data.toString();\n });\n \n child.stderr!.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`Gemini CLI退出码 ${code}: ${stderr}`));\n return;\n }\n \n try {\n // 解析JSON响应\n const response = JSON.parse(stdout);\n const text = response.candidates?.[0]?.content?.parts?.[0]?.text || \n response.text || \n stdout;\n resolve(text.trim());\n } catch {\n // 非JSON,直接返回\n resolve(stdout.trim());\n }\n });\n \n child.on('error', (err) => {\n reject(new Error(`启动Gemini CLI失败: ${err.message}`));\n });\n \n // 设置超时\n const timeout = setTimeout(() => {\n child.kill();\n reject(new Error('Gemini CLI执行超时(60秒)'));\n }, 60000);\n \n child.on('close', () => {\n clearTimeout(timeout);\n });\n \n // 发送prompt\n const input = JSON.stringify({ prompt: { text: prompt } });\n child.stdin!.write(input);\n child.stdin!.end();\n });\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Gemini: ${prompt.substring(0, 100)}...`);\n return await this.sendCommand(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting Gemini AI response:`, error);\n throw error;\n }\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n // Gemini CLI不支持直接执行shell命令,返回错误\n return {\n stdout: '',\n stderr: 'Gemini CLI不支持执行shell命令,请使用其他工具(如OpenCode或Claude Code)',\n exitCode: 1,\n success: false,\n error: 'Not supported'\n };\n } catch (error) {\n this.logger.error(`Error in Gemini CLI:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n \n /**\n * 获取Gemini CLI版本\n */\n async getVersion(): Promise<string> {\n try {\n const result = await execa(this.cliPath, ['version']);\n return result.stdout;\n } catch {\n return 'unknown';\n }\n }\n}\n","/**\n * 主桥接器,协调各模块\n */\nimport { FeishuWebhookHandler } from '../feishu/webhook';\nimport { FeishuWebSocketHandler } from '../feishu/websocket';\nimport { FeishuClient } from '../feishu/client';\nimport { CommandExecutor } from '../commands/executor';\nimport { SessionManager } from '../session/manager';\nimport { VSCodeAdapter } from '../adapters/vscode';\nimport { CursorAdapter } from '../adapters/cursor';\nimport { TraeAdapter } from '../adapters/trae';\nimport { AntigravityAdapter } from '../adapters/antigravity';\nimport { KiroAdapter } from '../adapters/kiro';\nimport { OpenCodeAdapter } from '../adapters/opencode';\nimport { ClaudeCodeAdapter } from '../adapters/claude-code';\nimport { GeminiCLIAdapter } from '../adapters/gemini-cli';\nimport { ConfigManager } from './config';\nimport { HealthMonitor } from './health';\nimport { logger } from './logger';\nimport { ReverseChannel } from './reverse-channel';\nimport { SkillRegistry, initializeSkills } from '../skills';\nimport Fastify, { FastifyInstance } from 'fastify';\n\nexport class FeishuBridge {\n private server: FastifyInstance;\n private feishuClient: FeishuClient;\n private webhookHandler: FeishuWebhookHandler;\n private wsHandler: FeishuWebSocketHandler | null = null;\n private commandExecutor: CommandExecutor;\n private sessionManager: SessionManager;\n private healthMonitor: HealthMonitor | null = null;\n private reverseChannel: ReverseChannel | null = null;\n private adapters: Map<string, any> = new Map();\n private skillRegistry: SkillRegistry;\n\n constructor() {\n this.server = Fastify({\n logger: false // 使用我们自己的日志系统\n });\n\n const config = ConfigManager.getInstance().get();\n this.feishuClient = new FeishuClient(config.feishu);\n this.sessionManager = new SessionManager(config.behavior.sessionTimeout);\n\n // 初始化反向通信通道\n this.reverseChannel = new ReverseChannel(this.feishuClient);\n\n // 初始化适配器\n this.initAdapters();\n\n // 初始化技能系统\n this.skillRegistry = new SkillRegistry();\n initializeSkills(\n this.skillRegistry,\n this.feishuClient,\n (name: string) => this.adapters.get(name)\n );\n\n this.commandExecutor = new CommandExecutor(\n this.adapters,\n this.sessionManager\n );\n\n this.webhookHandler = new FeishuWebhookHandler(\n this.feishuClient,\n this.commandExecutor\n );\n }\n\n private initAdapters(): void {\n const config = ConfigManager.getInstance().get();\n\n // 注册VSCode适配器\n if (config.adapters.vscode?.enabled) {\n const adapter = new VSCodeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('vscode', adapter);\n }\n\n // 注册Cursor适配器\n if (config.adapters.cursor?.enabled) {\n const adapter = new CursorAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('cursor', adapter);\n }\n\n // 注册Trae适配器\n if (config.adapters.trae?.enabled) {\n const adapter = new TraeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('trae', adapter);\n }\n\n // 注册Antigravity适配器\n if (config.adapters.antigravity?.enabled) {\n const adapter = new AntigravityAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('antigravity', adapter);\n }\n\n // 注册Kiro适配器\n if (config.adapters.kiro?.enabled) {\n const adapter = new KiroAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('kiro', adapter);\n }\n\n // 注册OpenCode适配器\n if (config.adapters.opencode?.enabled) {\n const adapter = new OpenCodeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('opencode', adapter);\n }\n\n // 注册Claude Code适配器\n if (config.adapters['claude-code']?.enabled) {\n const adapter = new ClaudeCodeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('claude', adapter);\n }\n\n // 注册Gemini CLI适配器\n if (config.adapters['gemini']?.enabled) {\n const adapter = new GeminiCLIAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('gemini', adapter);\n }\n }\n\n public async start(): Promise<void> {\n const config = ConfigManager.getInstance().get();\n const serverConfig = config.server;\n\n // 启动反向通信通道\n if (this.reverseChannel) {\n this.reverseChannel.start();\n logger.info('Reverse communication channel started');\n }\n\n // 初始化健康监控(仅在webhook模式下)\n if (config.feishu.connectionMode !== 'websocket') {\n this.healthMonitor = new HealthMonitor(\n this.server,\n this.sessionManager,\n this.adapters\n );\n }\n \n // 根据连接模式启动不同的服务\n if (config.feishu.connectionMode === 'websocket') {\n // WebSocket模式\n logger.info('Starting in WebSocket mode...');\n this.wsHandler = new FeishuWebSocketHandler(\n this.feishuClient,\n this.commandExecutor,\n this.adapters\n );\n await this.wsHandler.start();\n logger.info('WebSocket connection established');\n } else {\n // Webhook模式(默认)\n logger.info('Starting in Webhook mode...');\n \n // 注册webhook路由\n this.server.post(serverConfig.webhookPath, async (request, reply) => {\n await this.webhookHandler.handleWebhook(request, reply);\n });\n \n // 启动服务器\n try {\n const address = await this.server.listen({\n port: serverConfig.port,\n host: serverConfig.host\n });\n \n logger.info(`Feishu Bridge server running on ${address}`);\n logger.info(`Webhook endpoint: ${serverConfig.webhookPath}`);\n logger.info(`Health check endpoint: /health`);\n logger.info(`Metrics endpoint: /metrics`);\n } catch (err) {\n logger.error(err instanceof Error ? err : String(err));\n process.exit(1);\n }\n }\n }\n\n public async stop(): Promise<void> {\n // 停止反向通信通道\n if (this.reverseChannel) {\n this.reverseChannel.stop();\n logger.info('Reverse communication channel stopped');\n }\n\n // 停止WebSocket连接\n if (this.wsHandler) {\n await this.wsHandler.stop();\n this.wsHandler = null;\n }\n\n // 停止HTTP服务器\n await this.server.close();\n logger.info('Feishu Bridge server stopped');\n }\n\n public getAdapter(adapterName: string) {\n return this.adapters.get(adapterName);\n }\n\n public getAdapters(): Map<string, any> {\n return this.adapters;\n }\n}","/**\n * 健康检查和监控模块\n */\nimport { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { SessionManager } from '../session/manager';\nimport { ConfigManager } from './config';\n\ninterface HealthStatus {\n status: 'healthy' | 'unhealthy' | 'degraded';\n timestamp: string;\n version: string;\n checks: {\n feishu: {\n status: 'ok' | 'error';\n message?: string;\n };\n adapters: {\n status: 'ok' | 'error';\n available: number;\n total: number;\n details: Record<string, boolean>;\n };\n session: {\n status: 'ok';\n activeSessions: number;\n };\n };\n}\n\ninterface MetricsData {\n timestamp: string;\n uptime: number;\n memory: {\n used: number;\n total: number;\n external: number;\n };\n sessions: {\n active: number;\n total: number;\n };\n requests: {\n total: number;\n successful: number;\n failed: number;\n };\n adapters: Record<string, {\n available: boolean;\n lastCheck: string;\n }>;\n}\n\nexport class HealthMonitor {\n private startTime: number;\n private requestCount = { total: 0, successful: 0, failed: 0 };\n\n constructor(\n private server: FastifyInstance,\n private sessionManager: SessionManager,\n private adapters: Map<string, any>\n ) {\n this.startTime = Date.now();\n this.setupRoutes();\n }\n\n /**\n * 设置健康检查路由\n */\n private setupRoutes(): void {\n // 健康检查端点\n this.server.get('/health', this.handleHealth.bind(this));\n \n // 就绪检查端点\n this.server.get('/health/ready', this.handleReadiness.bind(this));\n \n // 存活检查端点\n this.server.get('/health/live', this.handleLiveness.bind(this));\n \n // Prometheus格式指标\n this.server.get('/metrics', this.handleMetrics.bind(this));\n }\n\n /**\n * 处理健康检查请求\n */\n private async handleHealth(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const status = await this.getHealthStatus();\n const statusCode = status.status === 'healthy' ? 200 : \n status.status === 'degraded' ? 200 : 503;\n \n reply.status(statusCode).send(status);\n }\n\n /**\n * 处理就绪检查\n */\n private async handleReadiness(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const config = ConfigManager.getInstance().get();\n \n // 检查基本配置是否就绪\n const isReady = config.feishu.appId && config.feishu.appSecret;\n \n if (isReady) {\n reply.status(200).send({\n ready: true,\n timestamp: new Date().toISOString()\n });\n } else {\n reply.status(503).send({\n ready: false,\n message: 'Configuration incomplete',\n timestamp: new Date().toISOString()\n });\n }\n }\n\n /**\n * 处理存活检查\n */\n private async handleLiveness(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n reply.status(200).send({\n alive: true,\n uptime: process.uptime(),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * 处理指标请求\n */\n private async handleMetrics(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const metrics = await this.getMetrics();\n const prometheusFormat = this.toPrometheusFormat(metrics);\n \n reply\n .header('Content-Type', 'text/plain; version=0.0.4')\n .send(prometheusFormat);\n }\n\n /**\n * 获取健康状态\n */\n private async getHealthStatus(): Promise<HealthStatus> {\n const config = ConfigManager.getInstance().get();\n const adapterStatuses: Record<string, boolean> = {};\n let availableAdapters = 0;\n\n // 检查各适配器状态\n for (const [name, adapter] of this.adapters) {\n try {\n const isAvailable = await adapter.checkAvailability();\n adapterStatuses[name] = isAvailable;\n if (isAvailable) availableAdapters++;\n } catch (error) {\n adapterStatuses[name] = false;\n }\n }\n\n const totalAdapters = this.adapters.size;\n const feishuConfigured = !!(config.feishu.appId && config.feishu.appSecret);\n \n // 确定整体状态\n let status: HealthStatus['status'] = 'healthy';\n if (!feishuConfigured) {\n status = 'unhealthy';\n } else if (availableAdapters === 0 && totalAdapters > 0) {\n status = 'degraded';\n }\n\n return {\n status,\n timestamp: new Date().toISOString(),\n version: process.env.npm_package_version || '1.0.0',\n checks: {\n feishu: {\n status: feishuConfigured ? 'ok' : 'error',\n message: feishuConfigured ? undefined : 'App ID or Secret not configured'\n },\n adapters: {\n status: availableAdapters > 0 ? 'ok' : 'error',\n available: availableAdapters,\n total: totalAdapters,\n details: adapterStatuses\n },\n session: {\n status: 'ok',\n activeSessions: this.sessionManager.getActiveSessionCount()\n }\n }\n };\n }\n\n /**\n * 获取指标数据\n */\n private async getMetrics(): Promise<MetricsData> {\n const memUsage = process.memoryUsage();\n const adapterMetrics: Record<string, { available: boolean; lastCheck: string }> = {};\n\n for (const [name, adapter] of this.adapters) {\n try {\n const isAvailable = await adapter.checkAvailability();\n adapterMetrics[name] = {\n available: isAvailable,\n lastCheck: new Date().toISOString()\n };\n } catch (error) {\n adapterMetrics[name] = {\n available: false,\n lastCheck: new Date().toISOString()\n };\n }\n }\n\n return {\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n memory: {\n used: Math.round(memUsage.heapUsed / 1024 / 1024), // MB\n total: Math.round(memUsage.heapTotal / 1024 / 1024),\n external: Math.round(memUsage.external / 1024 / 1024)\n },\n sessions: {\n active: this.sessionManager.getActiveSessionCount(),\n total: 0 // 可以通过SessionManager扩展获取\n },\n requests: { ...this.requestCount },\n adapters: adapterMetrics\n };\n }\n\n /**\n * 转换为Prometheus格式\n */\n private toPrometheusFormat(metrics: MetricsData): string {\n const lines: string[] = [];\n \n // Uptime\n lines.push('# HELP feishu_bridge_uptime_seconds Process uptime in seconds');\n lines.push('# TYPE feishu_bridge_uptime_seconds gauge');\n lines.push(`feishu_bridge_uptime_seconds ${metrics.uptime}`);\n \n // Memory\n lines.push('# HELP feishu_bridge_memory_usage_mb Memory usage in MB');\n lines.push('# TYPE feishu_bridge_memory_usage_mb gauge');\n lines.push(`feishu_bridge_memory_usage_mb{type=\"used\"} ${metrics.memory.used}`);\n lines.push(`feishu_bridge_memory_usage_mb{type=\"total\"} ${metrics.memory.total}`);\n lines.push(`feishu_bridge_memory_usage_mb{type=\"external\"} ${metrics.memory.external}`);\n \n // Sessions\n lines.push('# HELP feishu_bridge_active_sessions Number of active sessions');\n lines.push('# TYPE feishu_bridge_active_sessions gauge');\n lines.push(`feishu_bridge_active_sessions ${metrics.sessions.active}`);\n \n // Requests\n lines.push('# HELP feishu_bridge_requests_total Total number of requests');\n lines.push('# TYPE feishu_bridge_requests_total counter');\n lines.push(`feishu_bridge_requests_total ${metrics.requests.total}`);\n \n lines.push('# HELP feishu_bridge_requests_successful Total successful requests');\n lines.push('# TYPE feishu_bridge_requests_successful counter');\n lines.push(`feishu_bridge_requests_successful ${metrics.requests.successful}`);\n \n lines.push('# HELP feishu_bridge_requests_failed Total failed requests');\n lines.push('# TYPE feishu_bridge_requests_failed counter');\n lines.push(`feishu_bridge_requests_failed ${metrics.requests.failed}`);\n \n // Adapter availability\n lines.push('# HELP feishu_bridge_adapter_available Adapter availability (1=available, 0=unavailable)');\n lines.push('# TYPE feishu_bridge_adapter_available gauge');\n \n for (const [name, data] of Object.entries(metrics.adapters)) {\n const value = data.available ? 1 : 0;\n lines.push(`feishu_bridge_adapter_available{name=\"${name}\"} ${value}`);\n }\n \n return lines.join('\\n');\n }\n\n /**\n * 记录请求\n */\n public recordRequest(success: boolean): void {\n this.requestCount.total++;\n if (success) {\n this.requestCount.successful++;\n } else {\n this.requestCount.failed++;\n }\n }\n}\n","/**\n * 双向通信管理器\n * 支持从IDE/CLI主动向飞书推送消息\n */\n\nimport { FeishuClient } from '../feishu/client';\nimport { ConfigManager } from './config';\nimport { logger } from './logger';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { EventEmitter } from 'events';\n\nexport interface ReverseMessage {\n type: 'message' | 'notification' | 'status' | 'result';\n content: string;\n chatId?: string;\n senderId?: string;\n metadata?: Record<string, any>;\n timestamp: number;\n}\n\nexport interface ReverseChannelConfig {\n enabled: boolean;\n mode: 'websocket' | 'filesystem' | 'http';\n checkInterval: number;\n maxMessageAge: number;\n}\n\n/**\n * 反向通信通道\n * 允许IDE/CLI适配器主动向飞书发送消息\n */\nexport class ReverseChannel extends EventEmitter {\n private config: ReverseChannelConfig;\n private feishuClient: FeishuClient;\n private isRunning = false;\n private checkInterval: NodeJS.Timeout | null = null;\n private messageQueue: ReverseMessage[] = [];\n private tempDir: string;\n\n constructor(feishuClient: FeishuClient) {\n super();\n this.feishuClient = feishuClient;\n \n const bridgeConfig = ConfigManager.getInstance().get();\n this.config = {\n enabled: bridgeConfig.behavior?.reverseChannelEnabled ?? true,\n mode: bridgeConfig.behavior?.reverseChannelMode ?? 'filesystem',\n checkInterval: 1000, // 1秒检查一次\n maxMessageAge: 5 * 60 * 1000 // 5分钟过期\n };\n \n this.tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'reverse-channel');\n this.ensureTempDir();\n }\n\n /**\n * 启动反向通信通道\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) {\n return;\n }\n\n this.isRunning = true;\n logger.info('Starting reverse communication channel...');\n\n // 根据模式启动不同的监听机制\n switch (this.config.mode) {\n case 'filesystem':\n this.startFileSystemListener();\n break;\n case 'websocket':\n this.startWebSocketListener();\n break;\n case 'http':\n this.startHttpListener();\n break;\n }\n\n // 启动消息队列处理器\n this.startMessageQueueProcessor();\n }\n\n /**\n * 停止反向通信通道\n */\n stop(): void {\n if (!this.isRunning) {\n return;\n }\n\n this.isRunning = false;\n logger.info('Stopping reverse communication channel...');\n\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n }\n\n /**\n * 发送消息到飞书(供适配器调用)\n */\n async sendToFeishu(message: ReverseMessage): Promise<boolean> {\n try {\n // 添加到消息队列\n this.messageQueue.push(message);\n this.emit('messageQueued', message);\n return true;\n } catch (error) {\n logger.error('Error queuing message to Feishu:', error);\n return false;\n }\n }\n\n /**\n * 发送文件系统消息(供IDE写入文件后调用)\n */\n async sendFileSystemMessage(\n adapterType: string,\n content: string,\n chatId?: string\n ): Promise<void> {\n const message: ReverseMessage = {\n type: 'message',\n content,\n chatId,\n timestamp: Date.now()\n };\n\n const messageFile = path.join(\n this.tempDir,\n `${adapterType}_msg_${Date.now()}.json`\n );\n\n fs.writeFileSync(messageFile, JSON.stringify(message, null, 2));\n logger.debug(`File system message written: ${messageFile}`);\n }\n\n private ensureTempDir(): void {\n if (!fs.existsSync(this.tempDir)) {\n fs.mkdirSync(this.tempDir, { recursive: true });\n }\n }\n\n private startFileSystemListener(): void {\n logger.info('Starting file system listener for reverse channel...');\n\n this.checkInterval = setInterval(() => {\n this.processFileSystemMessages();\n }, this.config.checkInterval);\n }\n\n private processFileSystemMessages(): void {\n if (!fs.existsSync(this.tempDir)) {\n return;\n }\n\n try {\n const files = fs.readdirSync(this.tempDir);\n const now = Date.now();\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = path.join(this.tempDir, file);\n \n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const message: ReverseMessage = JSON.parse(content);\n\n // 检查消息是否过期\n if (now - message.timestamp > this.config.maxMessageAge) {\n fs.unlinkSync(filePath);\n continue;\n }\n\n // 添加到队列\n this.messageQueue.push(message);\n \n // 删除已处理的消息文件\n fs.unlinkSync(filePath);\n \n logger.debug(`Processed file system message: ${file}`);\n } catch (error) {\n logger.error(`Error processing message file ${file}:`, error);\n // 删除损坏的文件\n try {\n fs.unlinkSync(filePath);\n } catch {}\n }\n }\n } catch (error) {\n logger.error('Error reading message directory:', error);\n }\n }\n\n private startWebSocketListener(): void {\n // WebSocket模式:通过WebSocket连接接收消息\n logger.info('WebSocket reverse channel not yet implemented, falling back to file system');\n this.startFileSystemListener();\n }\n\n private startHttpListener(): void {\n // HTTP模式:通过HTTP端点接收消息\n logger.info('HTTP reverse channel not yet implemented, falling back to file system');\n this.startFileSystemListener();\n }\n\n private startMessageQueueProcessor(): void {\n // 定期处理消息队列\n setInterval(async () => {\n await this.processMessageQueue();\n }, 500); // 每500ms处理一次队列\n }\n\n private async processMessageQueue(): Promise<void> {\n if (this.messageQueue.length === 0) {\n return;\n }\n\n const messagesToProcess = [...this.messageQueue];\n this.messageQueue = [];\n\n for (const message of messagesToProcess) {\n try {\n await this.deliverMessageToFeishu(message);\n this.emit('messageDelivered', message);\n } catch (error) {\n logger.error('Error delivering message to Feishu:', error);\n // 重新入队稍后重试(最多3次)\n if (!(message as any).retryCount || (message as any).retryCount < 3) {\n (message as any).retryCount = ((message as any).retryCount || 0) + 1;\n this.messageQueue.push(message);\n }\n }\n }\n }\n\n private async deliverMessageToFeishu(message: ReverseMessage): Promise<void> {\n const { type, content, chatId, metadata } = message;\n\n if (!chatId) {\n logger.warn('No chatId specified for message, cannot deliver');\n return;\n }\n\n // 格式化消息\n let formattedContent = content;\n \n switch (type) {\n case 'notification':\n formattedContent = `🔔 ${content}`;\n break;\n case 'status':\n formattedContent = `📊 ${content}`;\n break;\n case 'result':\n formattedContent = `✅ ${content}`;\n break;\n default:\n formattedContent = content;\n }\n\n // 截断过长消息\n const maxLength = 2000;\n if (formattedContent.length > maxLength) {\n formattedContent = formattedContent.substring(0, maxLength) + '\\n...(truncated)';\n }\n\n // 发送到飞书\n await this.feishuClient.sendMessage(chatId, {\n msg_type: 'text',\n content: {\n text: formattedContent\n }\n });\n\n logger.info(`Message delivered to Feishu chat ${chatId}`);\n }\n\n isActive(): boolean {\n return this.isRunning;\n }\n\n getQueueSize(): number {\n return this.messageQueue.length;\n }\n}\n","/**\n * 飞书操作技能集\n * 让AI能够操作用户的飞书应用\n */\nimport { Skill, SkillContext, SkillResult } from '../registry';\nimport { FeishuClient } from '../../feishu/client';\n\nexport class FeishuSkills {\n private client: FeishuClient;\n\n constructor(client: FeishuClient) {\n this.client = client;\n }\n\n /**\n * 发送消息技能\n */\n sendMessageSkill(): Skill {\n return {\n name: 'feishu.sendMessage',\n description: '发送消息到指定会话',\n trigger: /发送消息|发信息/,\n riskLevel: 'low',\n examples: [\n '发送消息给张三:下午开会',\n '发信息到测试群:项目已部署'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const { target, content } = this.parseMessageArgs(context.message);\n \n // TODO: 需要实现通过用户ID获取chatId\n // 这里简化处理,直接回复到当前会话\n await this.client.sendMessage(context.chatId, {\n msg_type: 'text',\n content: { text: content }\n });\n\n return {\n success: true,\n content: '✅ 消息已发送'\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 发送失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 创建日程技能\n */\n createEventSkill(): Skill {\n return {\n name: 'feishu.createEvent',\n description: '在飞书日历创建日程',\n trigger: /创建日程|创建会议|添加日程/,\n riskLevel: 'medium',\n examples: [\n '创建日程:明天下午3点团队周会',\n '添加日程:周五18:00项目评审'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const { title, startTime, attendees } = this.parseEventArgs(context.message);\n \n // TODO: 调用飞书日历API\n // 这里先返回模拟结果\n \n return {\n success: true,\n content: `✅ 日程已创建\\n\\n标题: ${title}\\n时间: ${startTime}\\n参与者: ${attendees.join(', ') || '无'}`,\n actions: [\n { label: '查看日程', action: 'view_calendar' },\n { label: '编辑', action: 'edit_event' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 创建失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 创建文档技能\n */\n createDocSkill(): Skill {\n return {\n name: 'feishu.createDoc',\n description: '创建飞书云文档',\n trigger: /创建文档|新建文档/,\n riskLevel: 'low',\n examples: [\n '创建文档:项目需求文档',\n '新建文档:会议纪要'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const { title, content, folder } = this.parseDocArgs(context.message);\n \n // TODO: 调用飞书文档API\n \n return {\n success: true,\n content: `✅ 文档已创建\\n\\n标题: ${title}\\n位置: ${folder || '我的空间'}`,\n actions: [\n { label: '打开文档', action: 'open_doc' },\n { label: '分享', action: 'share_doc' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 创建失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 上传文件技能\n */\n uploadFileSkill(): Skill {\n return {\n name: 'feishu.uploadFile',\n description: '上传文件到飞书',\n trigger: /上传文件|发送文件/,\n riskLevel: 'low',\n execute: async (context: SkillContext): Promise<SkillResult> => {\n return {\n success: true,\n content: '📎 文件上传功能开发中'\n };\n }\n };\n }\n\n /**\n * 创建群公告技能\n */\n createAnnouncementSkill(): Skill {\n return {\n name: 'feishu.createAnnouncement',\n description: '发送群公告',\n trigger: /发送公告|群公告/,\n riskLevel: 'medium',\n requireConfirm: true,\n execute: async (context: SkillContext): Promise<SkillResult> => {\n return {\n success: true,\n content: '📢 公告功能开发中'\n };\n }\n };\n }\n\n // 辅助方法\n private parseMessageArgs(message: string): { target: string; content: string } {\n // 简单解析:提取\"给xxx:内容\"格式\n const match = message.match(/给(.+?):(.+)/);\n if (match) {\n return { target: match[1], content: match[2] };\n }\n return { target: 'current', content: message };\n }\n\n private parseEventArgs(message: string): { title: string; startTime: string; attendees: string[] } {\n // 提取日程信息(简化版)\n const titleMatch = message.match(/日程[::]\\s*(.+?)(?=\\s|$)/);\n const timeMatch = message.match(/(明天|今天|后天|\\d{1,2}点|\\d{1,2}:\\d{2})/);\n \n return {\n title: titleMatch ? titleMatch[1] : '新日程',\n startTime: timeMatch ? timeMatch[1] : '未指定时间',\n attendees: []\n };\n }\n\n private parseDocArgs(message: string): { title: string; content: string; folder?: string } {\n const match = message.match(/文档[::]\\s*(.+?)(?=\\s|$)/);\n return {\n title: match ? match[1] : '未命名文档',\n content: ''\n };\n }\n\n /**\n * 获取所有飞书技能\n */\n getAllSkills(): Skill[] {\n return [\n this.sendMessageSkill(),\n this.createEventSkill(),\n this.createDocSkill(),\n this.uploadFileSkill(),\n this.createAnnouncementSkill()\n ];\n }\n}\n","/**\n * 代码操作技能集\n */\nimport { Skill, SkillContext, SkillResult } from '../registry';\nimport { BaseIDEAdapter } from '../../adapters/base';\n\nexport class CodeSkills {\n private getAdapter: (name: string) => BaseIDEAdapter | undefined;\n\n constructor(getAdapter: (name: string) => BaseIDEAdapter | undefined) {\n this.getAdapter = getAdapter;\n }\n\n /**\n * 代码生成技能\n */\n generateCodeSkill(): Skill {\n return {\n name: 'code.generate',\n description: '根据描述生成代码',\n trigger: /生成代码|写代码|create code|generate code/,\n riskLevel: 'low',\n examples: [\n '生成代码:一个快速排序函数',\n '写一个React按钮组件'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const description = this.extractDescription(context.message);\n const code = await adapter.generateCode(description, {\n language: context.args.language,\n framework: context.args.framework\n });\n\n return {\n success: true,\n content: `✅ 代码生成完成\\n\\n\\`\\`\\`\\n${code}\\n\\`\\`\\``,\n actions: [\n { label: '复制代码', action: 'copy_code', data: code },\n { label: '插入文件', action: 'insert_file', data: code }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 生成失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 代码审查技能\n */\n reviewCodeSkill(): Skill {\n return {\n name: 'code.review',\n description: '审查代码并提供建议',\n trigger: /审查代码|code review|检查代码/,\n riskLevel: 'low',\n examples: [\n '审查src/utils.ts文件',\n '检查这段代码:function add(a,b){return a+b}'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const filePath = this.extractFilePath(context.message);\n let code: string;\n\n if (filePath) {\n // 读取文件\n code = await adapter.sendCommand(`read ${filePath}`);\n } else {\n // 从消息中提取代码\n code = this.extractCodeFromMessage(context.message);\n }\n\n const review = await adapter.getAIResponse(\n `请审查以下代码,指出问题并提供改进建议:\\n\\n${code}`\n );\n\n return {\n success: true,\n content: `📋 代码审查报告\\n\\n${review}`,\n actions: [\n { label: '应用建议', action: 'apply_suggestions' },\n { label: '忽略', action: 'dismiss' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 审查失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 重构代码技能\n */\n refactorCodeSkill(): Skill {\n return {\n name: 'code.refactor',\n description: '重构代码以提高质量',\n trigger: /重构|refactor|优化代码/,\n riskLevel: 'medium',\n examples: [\n '重构src/utils.ts文件',\n '优化这段代码的性能'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const filePath = this.extractFilePath(context.message);\n \n if (!filePath) {\n return {\n success: false,\n content: '❌ 请指定要重构的文件路径'\n };\n }\n\n // 读取文件\n const code = await adapter.sendCommand(`read ${filePath}`);\n \n // 重构\n const refactored = await adapter.getAIResponse(\n `请重构以下代码,提高可读性和性能:\\n\\n${code}`\n );\n\n return {\n success: true,\n content: `✅ 重构完成\\n\\n文件: ${filePath}\\n\\n修改建议:\\n${refactored}`,\n actions: [\n { label: '应用重构', action: 'apply_refactor', data: { filePath, code: refactored } },\n { label: '查看Diff', action: 'view_diff' },\n { label: '取消', action: 'cancel' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 重构失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 运行测试技能\n */\n runTestsSkill(): Skill {\n return {\n name: 'code.runTests',\n description: '运行项目测试',\n trigger: /运行测试|run test|测试代码/,\n riskLevel: 'low',\n examples: [\n '运行测试',\n '执行npm test'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const result = await adapter.runProgram('npm test', context.workspace);\n\n if (result.success) {\n return {\n success: true,\n content: `✅ 测试通过\\n\\n\\`\\`\\`\\n${result.output}\\n\\`\\`\\``\n };\n } else {\n return {\n success: false,\n content: `❌ 测试失败\\n\\n错误:\\n${result.error || result.stderr}`,\n actions: [\n { label: '查看详情', action: 'view_test_details' },\n { label: '修复错误', action: 'fix_errors' }\n ]\n };\n }\n } catch (error) {\n return {\n success: false,\n content: `❌ 运行测试失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 解释代码技能\n */\n explainCodeSkill(): Skill {\n return {\n name: 'code.explain',\n description: '解释代码的功能和原理',\n trigger: /解释代码|explain code|这是什么意思/,\n riskLevel: 'low',\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const code = this.extractCodeFromMessage(context.message);\n \n const explanation = await adapter.getAIResponse(\n `请详细解释以下代码的功能和工作原理:\\n\\n${code}`\n );\n\n return {\n success: true,\n content: `💡 代码解释\\n\\n${explanation}`\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 解释失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n // 辅助方法\n private extractDescription(message: string): string {\n const match = message.match(/(?:生成|写|create|generate).{0,5}(?:代码|code)?[::]\\s*(.+)/i);\n return match ? match[1] : message;\n }\n\n private extractFilePath(message: string): string | null {\n const match = message.match(/(\\/|\\w+\\/)[\\w\\/.-]+/);\n return match ? match[0] : null;\n }\n\n private extractCodeFromMessage(message: string): string {\n // 提取代码块或整段代码\n const codeBlockMatch = message.match(/```[\\w]*\\n([\\s\\S]+?)```/);\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n \n // 尝试提取引号内的内容\n const quoteMatch = message.match(/[\"'](.+?)[\"']/);\n if (quoteMatch) {\n return quoteMatch[1];\n }\n \n return message;\n }\n\n /**\n * 获取所有代码技能\n */\n getAllSkills(): Skill[] {\n return [\n this.generateCodeSkill(),\n this.reviewCodeSkill(),\n this.refactorCodeSkill(),\n this.runTestsSkill(),\n this.explainCodeSkill()\n ];\n }\n}\n","/**\n * 技能系统核心\n * 技能 = 可复用的原子能力单元\n */\nimport { Logger } from '../core/logger';\n\nexport interface SkillContext {\n userId: string;\n chatId: string;\n message: string;\n args: Record<string, any>;\n workspace?: string;\n}\n\nexport interface SkillResult {\n success: boolean;\n content: string;\n attachments?: any[];\n actions?: ActionButton[];\n}\n\nexport interface ActionButton {\n label: string;\n action: string;\n data?: any;\n}\n\nexport interface Skill {\n name: string;\n description: string;\n trigger: string | RegExp;\n examples?: string[];\n riskLevel: 'low' | 'medium' | 'high';\n requireConfirm?: boolean;\n execute: (context: SkillContext) => Promise<SkillResult>;\n}\n\nexport class SkillRegistry {\n private logger: Logger;\n private skills: Map<string, Skill> = new Map();\n\n constructor() {\n this.logger = new Logger();\n }\n\n /**\n * 注册技能\n */\n register(skill: Skill): void {\n this.skills.set(skill.name, skill);\n this.logger.info(`技能已注册: ${skill.name}`);\n }\n\n /**\n * 批量注册技能\n */\n registerMany(skills: Skill[]): void {\n for (const skill of skills) {\n this.register(skill);\n }\n }\n\n /**\n * 根据消息匹配技能\n */\n match(message: string): Skill | null {\n for (const [name, skill] of this.skills) {\n if (typeof skill.trigger === 'string') {\n if (message.includes(skill.trigger)) {\n return skill;\n }\n } else if (skill.trigger instanceof RegExp) {\n if (skill.trigger.test(message)) {\n return skill;\n }\n }\n }\n return null;\n }\n\n /**\n * 执行技能\n */\n async execute(skillName: string, context: SkillContext): Promise<SkillResult> {\n const skill = this.skills.get(skillName);\n if (!skill) {\n return {\n success: false,\n content: `未找到技能: ${skillName}`\n };\n }\n\n try {\n // 高危操作需要确认(可扩展)\n if (skill.requireConfirm && skill.riskLevel === 'high') {\n // TODO: 实现确认流程\n this.logger.info(`高危技能需要确认: ${skillName}`);\n }\n\n const result = await skill.execute(context);\n return result;\n } catch (error) {\n this.logger.error(`执行技能 ${skillName} 失败:`, error);\n return {\n success: false,\n content: `执行失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n\n /**\n * 获取所有技能列表\n */\n list(): Skill[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * 获取技能详情\n */\n get(name: string): Skill | undefined {\n return this.skills.get(name);\n }\n\n /**\n * 注销技能\n */\n unregister(name: string): void {\n this.skills.delete(name);\n this.logger.info(`技能已注销: ${name}`);\n }\n}\n","/**\n * 技能系统入口\n * 导出所有内置技能\n */\nimport { SkillRegistry } from './registry';\nimport { FeishuClient } from '../feishu/client';\nimport { FeishuSkills } from './builtin/feishu';\nimport { CodeSkills } from './builtin/code';\nimport { BaseIDEAdapter } from '../adapters/base';\n\n/**\n * 初始化所有内置技能\n */\nexport function initializeSkills(\n registry: SkillRegistry,\n feishuClient: FeishuClient,\n getAdapter: (name: string) => BaseIDEAdapter | undefined\n): void {\n // 注册飞书技能\n const feishuSkills = new FeishuSkills(feishuClient);\n registry.registerMany(feishuSkills.getAllSkills());\n\n // 注册代码技能\n const codeSkills = new CodeSkills(getAdapter);\n registry.registerMany(codeSkills.getAllSkills());\n\n console.log('✅ 技能系统初始化完成');\n}\n\n// 导出类型和类\nexport { SkillRegistry } from './registry';\nexport { Skill, SkillContext, SkillResult } from './registry';\nexport { FeishuSkills } from './builtin/feishu';\nexport { CodeSkills } from './builtin/code';\n"],"mappings":"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","names":["pino","import_child_process","fs","path","fs","os","path","platform","import_execa","fs","path","os","platform","import_execa","fs","path","os","platform","import_execa","fs","path","os","import_execa","fs","path","os","fs","os","path","import_execa","fs","path","os","platform","import_child_process","import_execa","fs","path","os","Fastify","DaemonManager"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/logger.ts","../../src/core/config.ts","../../src/core/daemon.ts","../../src/cli/index.ts","../../src/cli/config.ts","../../src/feishu/webhook.ts","../../src/feishu/websocket.ts","../../src/core/message-router.ts","../../src/feishu/client.ts","../../src/commands/executor.ts","../../src/session/manager.ts","../../src/adapters/base.ts","../../src/adapters/vscode.ts","../../src/adapters/cursor.ts","../../src/adapters/trae.ts","../../src/adapters/antigravity.ts","../../src/adapters/kiro.ts","../../src/adapters/opencode.ts","../../src/adapters/claude-code.ts","../../src/adapters/gemini-cli.ts","../../src/core/bridge.ts","../../src/core/health.ts","../../src/core/reverse-channel.ts","../../src/skills/builtin/feishu.ts","../../src/skills/builtin/code.ts","../../src/skills/registry.ts","../../src/skills/index.ts"],"sourcesContent":["/**\n * 日志系统\n */\nimport pino, { Logger as PinoLogger } from 'pino';\n\nexport class Logger {\n private logger: PinoLogger;\n\n constructor() {\n const isTest = process.env.NODE_ENV === 'test' || process.env.VITEST;\n const isDev = process.env.NODE_ENV === 'development';\n \n this.logger = pino({\n level: process.env.LOG_LEVEL || 'info',\n transport: (isTest || !isDev) ? undefined : {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n }\n }\n });\n }\n\n public setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void {\n this.logger.level = level;\n }\n\n public debug(msg: string, ...args: any[]): void {\n this.logger.debug(msg, ...args);\n }\n\n public info(msg: string, ...args: any[]): void {\n this.logger.info(msg, ...args);\n }\n\n public warn(msg: string, ...args: any[]): void {\n this.logger.warn(msg, ...args);\n }\n\n public error(msg: string | Error, ...args: any[]): void {\n this.logger.error(msg, ...args);\n }\n\n public child(bindings: Record<string, any>): Logger {\n const childLogger = new Logger();\n childLogger.logger = this.logger.child(bindings);\n return childLogger;\n }\n}\n\n// 全局日志实例\nexport const logger = new Logger();","/**\n * 配置管理模块\n */\n\nexport interface BridgeConfig {\n // 飞书应用配置\n feishu: {\n appId: string;\n appSecret: string;\n domain: 'feishu' | 'lark'; // 国内/国际版\n connectionMode: 'websocket' | 'webhook';\n encryptKey?: string; // 消息加密密钥\n verificationToken?: string; // 验证Token\n };\n \n // 服务器配置\n server: {\n port: number;\n host: string;\n webhookPath: string;\n };\n \n // IDE适配器配置\n adapters: {\n vscode?: {\n enabled: boolean;\n executablePath?: string;\n };\n cursor?: {\n enabled: boolean;\n };\n trae?: {\n enabled: boolean;\n };\n antigravity?: {\n enabled: boolean;\n };\n kiro?: {\n enabled: boolean;\n };\n opencode?: {\n enabled: boolean;\n socketPath?: string;\n };\n 'claude-code'?: {\n enabled: boolean;\n };\n gemini?: {\n enabled: boolean;\n };\n };\n \n // 行为配置\n behavior: {\n autoStart: boolean;\n maxOutputLength: number; // 最大输出长度\n sessionTimeout: number; // 会话超时时间(分钟)\n reverseChannelEnabled: boolean; // 反向通信通道启用\n reverseChannelMode: 'websocket' | 'filesystem' | 'http'; // 反向通信模式\n };\n \n // 日志配置\n logging: {\n level: 'debug' | 'info' | 'warn' | 'error';\n file?: string;\n };\n}\n\n// 默认配置\nexport const DEFAULT_CONFIG: BridgeConfig = {\n feishu: {\n appId: '',\n appSecret: '',\n domain: 'feishu',\n connectionMode: 'webhook',\n encryptKey: undefined,\n verificationToken: undefined,\n },\n server: {\n port: 3000,\n host: '0.0.0.0',\n webhookPath: '/webhook/feishu',\n },\n adapters: {\n vscode: { enabled: true },\n cursor: { enabled: true },\n trae: { enabled: true },\n antigravity: { enabled: true },\n kiro: { enabled: true },\n opencode: { enabled: true },\n 'claude-code': { enabled: true },\n gemini: { enabled: false }, // 默认禁用,需要gcloud配置\n },\n behavior: {\n autoStart: true,\n maxOutputLength: 2000,\n sessionTimeout: 30,\n reverseChannelEnabled: true,\n reverseChannelMode: 'filesystem',\n },\n logging: {\n level: 'info',\n file: undefined,\n },\n};\n\n// 配置管理器\nexport class ConfigManager {\n private static instance: ConfigManager;\n private config: BridgeConfig = DEFAULT_CONFIG;\n\n private constructor() {}\n\n public static getInstance(): ConfigManager {\n if (!ConfigManager.instance) {\n ConfigManager.instance = new ConfigManager();\n }\n return ConfigManager.instance;\n }\n\n public load(config: Partial<BridgeConfig>): void {\n this.config = this.deepMerge(this.config, config);\n }\n\n private deepMerge(target: any, source: any): any {\n const output = { ...target };\n \n if (this.isObject(target) && this.isObject(source)) {\n Object.keys(source).forEach(key => {\n if (this.isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n output[key] = this.deepMerge(target[key], source[key]);\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n \n return output;\n }\n\n private isObject(item: any): boolean {\n return item && typeof item === 'object' && !Array.isArray(item);\n }\n\n public get(): BridgeConfig {\n return this.config;\n }\n\n public getFeishuConfig(): BridgeConfig['feishu'] {\n return this.config.feishu;\n }\n\n public getServerConfig(): BridgeConfig['server'] {\n return this.config.server;\n }\n\n public getAdapterConfig(adapter: keyof BridgeConfig['adapters']) {\n return this.config.adapters[adapter];\n }\n\n public getBehaviorConfig(): BridgeConfig['behavior'] {\n return this.config.behavior;\n }\n\n public getLoggingConfig(): BridgeConfig['logging'] {\n return this.config.logging;\n }\n}","/**\n * 进程守护模块\n * 确保Feishu Bridge进程持续运行,自动重启\n */\nimport { spawn, ChildProcess } from 'child_process';\nimport { Logger } from './logger';\nimport { ConfigManager } from './config';\n\ninterface DaemonConfig {\n maxRestarts: number;\n restartDelay: number;\n healthCheckInterval: number;\n}\n\nexport class ProcessDaemon {\n private process: ChildProcess | null = null;\n private restartCount = 0;\n private isRunning = false;\n private healthCheckTimer: NodeJS.Timeout | null = null;\n private logger: Logger;\n private config: DaemonConfig;\n\n constructor(\n private command: string,\n private args: string[] = [],\n private options: { cwd?: string; env?: NodeJS.ProcessEnv } = {}\n ) {\n this.logger = new Logger();\n \n // 从配置加载守护参数\n const daemonConfig = ConfigManager.getInstance().get().daemon;\n this.config = {\n maxRestarts: daemonConfig?.maxRestarts || 5,\n restartDelay: daemonConfig?.restartDelay || 5000,\n healthCheckInterval: daemonConfig?.healthCheckInterval || 30000\n };\n }\n\n /**\n * 启动守护进程\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n this.logger.warn('Daemon already running');\n return;\n }\n\n this.isRunning = true;\n this.restartCount = 0;\n \n this.logger.info('Starting process daemon...');\n await this.spawnProcess();\n this.startHealthCheck();\n }\n\n /**\n * 停止守护进程\n */\n async stop(): Promise<void> {\n this.isRunning = false;\n \n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = null;\n }\n\n if (this.process) {\n this.logger.info('Stopping daemon process...');\n \n // 尝试优雅关闭\n this.process.kill('SIGTERM');\n \n // 等待5秒后强制关闭\n await new Promise(resolve => setTimeout(resolve, 5000));\n \n if (this.process && !this.process.killed) {\n this.process.kill('SIGKILL');\n }\n \n this.process = null;\n }\n \n this.logger.info('Daemon stopped');\n }\n\n /**\n * 创建子进程\n */\n private async spawnProcess(): Promise<void> {\n return new Promise((resolve) => {\n this.logger.info(`Spawning: ${this.command} ${this.args.join(' ')}`);\n\n this.process = spawn(this.command, this.args, {\n stdio: 'pipe',\n detached: false,\n ...this.options\n });\n\n // 监听输出\n this.process.stdout?.on('data', (data) => {\n process.stdout.write(data);\n });\n\n this.process.stderr?.on('data', (data) => {\n process.stderr.write(data);\n });\n\n // 监听进程退出\n this.process.on('exit', (code, signal) => {\n this.logger.warn(`Process exited with code ${code}, signal ${signal}`);\n this.process = null;\n \n if (this.isRunning) {\n this.handleCrash();\n }\n });\n\n // 监听错误\n this.process.on('error', (error) => {\n this.logger.error('Process error:', error);\n this.process = null;\n \n if (this.isRunning) {\n this.handleCrash();\n }\n });\n\n // 给进程一些启动时间\n setTimeout(() => {\n if (this.process && !this.process.killed) {\n this.logger.info('Process started successfully');\n this.restartCount = 0; // 重置重启计数\n }\n resolve();\n }, 2000);\n });\n }\n\n /**\n * 处理进程崩溃\n */\n private handleCrash(): void {\n if (!this.isRunning) return;\n\n this.restartCount++;\n\n if (this.restartCount > this.config.maxRestarts) {\n this.logger.error(`Max restarts (${this.config.maxRestarts}) reached. Giving up.`);\n this.isRunning = false;\n process.exit(1);\n }\n\n this.logger.info(`Restarting process (attempt ${this.restartCount}/${this.config.maxRestarts})...`);\n \n setTimeout(() => {\n if (this.isRunning) {\n this.spawnProcess();\n }\n }, this.config.restartDelay);\n }\n\n /**\n * 启动健康检查\n */\n private startHealthCheck(): void {\n this.healthCheckTimer = setInterval(() => {\n if (!this.isRunning) return;\n\n // 检查进程是否还在运行\n if (!this.process || this.process.killed) {\n this.logger.warn('Health check: Process not running, restarting...');\n this.handleCrash();\n }\n }, this.config.healthCheckInterval);\n }\n\n /**\n * 获取守护状态\n */\n getStatus(): {\n isRunning: boolean;\n pid: number | null;\n restartCount: number;\n uptime: number;\n } {\n return {\n isRunning: this.isRunning,\n pid: this.process?.pid || null,\n restartCount: this.restartCount,\n uptime: process.uptime()\n };\n }\n}\n\n/**\n * 单例守护进程管理器\n */\nclass DaemonManager {\n private static instance: DaemonManager;\n private daemon: ProcessDaemon | null = null;\n\n private constructor() {}\n\n static getInstance(): DaemonManager {\n if (!DaemonManager.instance) {\n DaemonManager.instance = new DaemonManager();\n }\n return DaemonManager.instance;\n }\n\n /**\n * 启动守护进程\n */\n async start(args: string[] = []): Promise<void> {\n if (this.daemon) {\n console.log('Daemon already running');\n return;\n }\n\n // 使用node运行主程序\n const nodePath = process.execPath;\n const scriptPath = require.resolve('../index.js');\n\n this.daemon = new ProcessDaemon(nodePath, [scriptPath, ...args], {\n cwd: process.cwd(),\n env: process.env\n });\n\n await this.daemon.start();\n\n // 处理退出信号\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n /**\n * 停止守护进程\n */\n async stop(): Promise<void> {\n if (this.daemon) {\n await this.daemon.stop();\n this.daemon = null;\n }\n }\n\n /**\n * 获取状态\n */\n getStatus(): {\n isRunning: boolean;\n pid: number | null;\n restartCount: number;\n uptime: number;\n } | null {\n return this.daemon?.getStatus() || null;\n }\n}\n\nexport { DaemonManager };\nexport default DaemonManager;\n","/**\n * CLI主入口\n */\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { getConfigValue, setConfigValue, deleteConfigValue, listConfig, getConfigFilePath } from './config';\nimport { FeishuBridge } from '../core/bridge';\nimport { ConfigManager, DEFAULT_CONFIG } from '../core/config';\nimport { logger } from '../core/logger';\n\nconst program = new Command();\nconst pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));\n\nprogram\n .name('feishu-bridge')\n .description('Feishu Bridge - AI IDE/CLI integration for Feishu')\n .version(pkg.version);\n\n// Start命令\nprogram\n .command('start')\n .description('Start the Feishu Bridge server')\n .option('-p, --port <port>', 'Server port', '3000')\n .option('-h, --host <host>', 'Server host', '0.0.0.0')\n .option('-d, --daemon', 'Run in daemon mode')\n .action(async (options) => {\n try {\n // 加载配置文件\n const fileConfig = getConfigValue('feishu') || {};\n \n // 初始化配置\n const configManager = ConfigManager.getInstance();\n const config = { ...DEFAULT_CONFIG };\n \n // 应用配置文件中的设置\n if (fileConfig.appId) config.feishu.appId = fileConfig.appId;\n if (fileConfig.appSecret) config.feishu.appSecret = fileConfig.appSecret;\n if (fileConfig.encryptKey) config.feishu.encryptKey = fileConfig.encryptKey;\n if (fileConfig.verificationToken) config.feishu.verificationToken = fileConfig.verificationToken;\n if (fileConfig.domain) config.feishu.domain = fileConfig.domain;\n \n // 命令行选项覆盖配置文件\n config.server.port = parseInt(options.port);\n config.server.host = options.host;\n \n // 环境变量优先级最高\n if (process.env.FEISHU_APP_ID) config.feishu.appId = process.env.FEISHU_APP_ID;\n if (process.env.FEISHU_APP_SECRET) config.feishu.appSecret = process.env.FEISHU_APP_SECRET;\n if (process.env.FEISHU_ENCRYPT_KEY) config.feishu.encryptKey = process.env.FEISHU_ENCRYPT_KEY;\n if (process.env.FEISHU_VERIFICATION_TOKEN) config.feishu.verificationToken = process.env.FEISHU_VERIFICATION_TOKEN;\n if (process.env.SERVER_PORT) config.server.port = parseInt(process.env.SERVER_PORT);\n if (process.env.SERVER_HOST) config.server.host = process.env.SERVER_HOST;\n \n // 验证必需配置\n if (!config.feishu.appId || !config.feishu.appSecret) {\n console.error('Error: FEISHU_APP_ID and FEISHU_APP_SECRET are required');\n console.error('Set them via:');\n console.error(' 1. Environment variables: export FEISHU_APP_ID=xxx');\n console.error(' 2. Config file: feishu-bridge config set feishu.appId xxx');\n process.exit(1);\n }\n \n configManager.load(config);\n \n // 创建并启动桥接器\n const bridge = new FeishuBridge();\n await bridge.start();\n \n if (options.daemon) {\n logger.info('Feishu Bridge started in daemon mode');\n } else {\n logger.info('Press Ctrl+C to stop the server');\n }\n \n // 处理退出信号\n process.on('SIGINT', async () => {\n logger.info('Received SIGINT, shutting down gracefully...');\n await bridge.stop();\n process.exit(0);\n });\n \n process.on('SIGTERM', async () => {\n logger.info('Received SIGTERM, shutting down gracefully...');\n await bridge.stop();\n process.exit(0);\n });\n \n } catch (error) {\n console.error('Failed to start Feishu Bridge:', error);\n process.exit(1);\n }\n });\n\n// Config命令组\nconst configCmd = program\n .command('config')\n .description('Manage configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n try {\n setConfigValue(key, value);\n console.log(`✅ Set ${key} = ${value}`);\n console.log(`📁 Config file: ${getConfigFilePath()}`);\n } catch (error) {\n console.error('❌ Error setting config:', error);\n process.exit(1);\n }\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const value = getConfigValue(key);\n if (value === undefined) {\n console.log(`⚠️ ${key} is not set`);\n } else {\n console.log(`${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('delete <key>')\n .description('Delete a configuration value')\n .action((key: string) => {\n try {\n deleteConfigValue(key);\n console.log(`✅ Deleted ${key}`);\n } catch (error) {\n console.error('❌ Error deleting config:', error);\n process.exit(1);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all configuration values')\n .action(() => {\n const config = listConfig();\n if (Object.keys(config).length === 0) {\n console.log('No configuration set');\n console.log(`📁 Config file: ${getConfigFilePath()}`);\n } else {\n console.log('Current configuration:');\n console.log(JSON.stringify(config, null, 2));\n console.log(`\\n📁 Config file: ${getConfigFilePath()}`);\n }\n });\n\n// Daemon命令组\nconst daemonCmd = program\n .command('daemon')\n .description('Manage daemon process');\n\ndaemonCmd\n .command('start')\n .description('Start the daemon')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n await daemon.start();\n console.log('✅ Daemon started');\n console.log('📊 Use \"feishu-bridge status\" to check status');\n } catch (error) {\n console.error('❌ Failed to start daemon:', error);\n process.exit(1);\n }\n });\n\ndaemonCmd\n .command('stop')\n .description('Stop the daemon')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n await daemon.stop();\n console.log('✅ Daemon stopped');\n } catch (error) {\n console.error('❌ Failed to stop daemon:', error);\n process.exit(1);\n }\n });\n\ndaemonCmd\n .command('restart')\n .description('Restart the daemon')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n await daemon.stop();\n await daemon.start();\n console.log('✅ Daemon restarted');\n } catch (error) {\n console.error('❌ Failed to restart daemon:', error);\n process.exit(1);\n }\n });\n\n// Status命令\nprogram\n .command('status')\n .description('Show service status')\n .action(async () => {\n try {\n const { DaemonManager } = await import('../core/daemon');\n const daemon = DaemonManager.getInstance();\n const status = daemon.getStatus();\n \n if (status) {\n console.log('📊 Daemon Status:');\n console.log(` Running: ${status.isRunning ? '✅ Yes' : '❌ No'}`);\n console.log(` PID: ${status.pid || 'N/A'}`);\n console.log(` Restarts: ${status.restartCount}`);\n console.log(` Uptime: ${Math.floor(status.uptime)}s`);\n } else {\n console.log('📊 Service Status:');\n console.log(' Daemon: Not running');\n }\n \n // 检查配置文件\n const config = listConfig();\n console.log('\\n📁 Configuration:');\n console.log(` Config file: ${getConfigFilePath()}`);\n console.log(` Feishu App ID: ${config.feishu?.appId ? '✅ Set' : '❌ Not set'}`);\n console.log(` Feishu App Secret: ${config.feishu?.appSecret ? '✅ Set' : '❌ Not set'}`);\n } catch (error) {\n console.error('❌ Error checking status:', error);\n }\n });\n\n// Shell init命令\nprogram\n .command('shell-init')\n .description('Output shell initialization script')\n .action(() => {\n console.log(`\n# Feishu Bridge Shell Integration\n# Add this to your ~/.bashrc, ~/.zshrc, or equivalent\n\nfeishu-bridge-auto() {\n # 检测当前是否在IDE/CLI环境中\n if [ -n \"$VSCODE_PID\" ] || [ -n \"$CURSOR_SHELL\" ] || [ -n \"$OPENCODE_SESSION\" ]; then\n # 检查bridge是否已运行\n if ! pgrep -f \"feishu-bridge\" > /dev/null; then\n echo \"Auto-starting Feishu Bridge...\"\n feishu-bridge start --daemon 2>/dev/null &\n fi\n fi\n}\n\n# Bash\nif [ -n \"$BASH_VERSION\" ]; then\n PROMPT_COMMAND=\"feishu-bridge-auto; $PROMPT_COMMAND\"\nfi\n\n# Zsh\nif [ -n \"$ZSH_VERSION\" ]; then\n precmd_functions+=(feishu-bridge-auto)\nfi\n`);\n });\n\n// 解析命令行参数\nprogram.parse();\n\n// 如果没有提供命令,显示帮助\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n","/**\n * CLI配置管理模块\n * 使用cosmiconfig管理配置文件\n */\nimport { cosmiconfigSync } from 'cosmiconfig';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nconst moduleName = 'feishu-bridge';\n\n// 配置文件搜索路径\nconst explorer = cosmiconfigSync(moduleName, {\n searchPlaces: [\n 'package.json',\n `.${moduleName}rc`,\n `.${moduleName}rc.json`,\n `.${moduleName}rc.yaml`,\n `.${moduleName}rc.yml`,\n `.${moduleName}rc.js`,\n `.${moduleName}rc.cjs`,\n `${moduleName}.config.js`,\n `${moduleName}.config.cjs`,\n ],\n});\n\n// 默认配置文件路径\nfunction getDefaultConfigPath(): string {\n const configDir = path.join(os.homedir(), '.config', moduleName);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n return path.join(configDir, 'config.json');\n}\n\n/**\n * 获取当前配置\n */\nexport function getConfig(): Record<string, any> {\n // 首先尝试从当前目录向上搜索\n const result = explorer.search();\n if (result?.config) {\n return result.config;\n }\n \n // 如果没有找到,尝试从用户主目录加载\n const homeConfigPath = getDefaultConfigPath();\n if (fs.existsSync(homeConfigPath)) {\n try {\n const content = fs.readFileSync(homeConfigPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n console.error('Error reading home config file:', error);\n }\n }\n \n return {};\n}\n\n/**\n * 获取特定配置项\n */\nexport function getConfigValue(key: string): any {\n const config = getConfig();\n const keys = key.split('.');\n let value = config;\n \n for (const k of keys) {\n if (value === undefined || value === null) {\n return undefined;\n }\n value = value[k];\n }\n \n return value;\n}\n\n/**\n * 设置配置项\n */\nexport function setConfigValue(key: string, value: any): void {\n const configPath = getDefaultConfigPath();\n let config: Record<string, any> = {};\n \n // 读取现有配置\n if (fs.existsSync(configPath)) {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n config = JSON.parse(content);\n } catch (error) {\n console.error('Error reading config file:', error);\n }\n }\n \n // 设置嵌套值\n const keys = key.split('.');\n let current = config;\n \n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (!(k in current) || typeof current[k] !== 'object') {\n current[k] = {};\n }\n current = current[k];\n }\n \n // 转换值类型\n const finalKey = keys[keys.length - 1];\n current[finalKey] = convertValueType(value);\n \n // 写入配置文件\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\n/**\n * 删除配置项\n */\nexport function deleteConfigValue(key: string): void {\n const configPath = getDefaultConfigPath();\n \n if (!fs.existsSync(configPath)) {\n return;\n }\n \n let config: Record<string, any> = {};\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n config = JSON.parse(content);\n } catch (error) {\n console.error('Error reading config file:', error);\n return;\n }\n \n const keys = key.split('.');\n let current = config;\n \n for (let i = 0; i < keys.length - 1; i++) {\n const k = keys[i];\n if (!(k in current)) {\n return; // 键不存在,无需删除\n }\n current = current[k];\n }\n \n delete current[keys[keys.length - 1]];\n \n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n}\n\n/**\n * 列出所有配置\n */\nexport function listConfig(): Record<string, any> {\n return getConfig();\n}\n\n/**\n * 转换值类型(自动识别数字、布尔值)\n */\nfunction convertValueType(value: string): any {\n // 尝试转换为数字\n if (!isNaN(Number(value)) && value.trim() !== '') {\n return Number(value);\n }\n \n // 尝试转换为布尔值\n if (value.toLowerCase() === 'true') {\n return true;\n }\n if (value.toLowerCase() === 'false') {\n return false;\n }\n \n // 尝试解析JSON\n try {\n return JSON.parse(value);\n } catch {\n // 不是有效的JSON,返回字符串\n return value;\n }\n}\n\n/**\n * 获取配置文件路径\n */\nexport function getConfigFilePath(): string {\n const result = explorer.search();\n if (result?.filepath) {\n return result.filepath;\n }\n return getDefaultConfigPath();\n}\n","/**\n * Webhook处理器\n */\nimport { FastifyRequest, FastifyReply } from 'fastify';\nimport * as crypto from 'crypto';\nimport { FeishuClient } from './client';\nimport { CommandExecutor } from '../commands/executor';\nimport { LarkEvent, LarkMessage } from './types';\nimport { Logger } from '../core/logger';\nimport { ConfigManager } from '../core/config';\n\nexport class FeishuWebhookHandler {\n private logger: Logger;\n\n constructor(\n private client: FeishuClient,\n private commandExecutor: CommandExecutor\n ) {\n this.logger = new Logger();\n }\n\n async handleWebhook(request: FastifyRequest, reply: FastifyReply): Promise<void> {\n try {\n // 1. 验证请求签名\n const signature = request.headers['x-lark-signature'] as string;\n const timestamp = request.headers['x-lark-timestamp'] as string;\n const body = request.body as string;\n \n if (!this.verifySignature(signature, timestamp, body)) {\n this.logger.warn('Invalid signature received');\n reply.status(401).send({ error: 'Invalid signature' });\n return;\n }\n \n // 2. 解析事件\n const event = JSON.parse(body) as LarkEvent;\n \n // 3. 处理URL验证\n if (event.type === 'url_verification') {\n this.logger.info('Received URL verification challenge');\n reply.send({ challenge: event.challenge });\n return;\n }\n \n // 4. 处理消息事件\n if (event.type === 'event_callback' && event.event) {\n await this.handleEvent(event.event);\n }\n \n reply.send({ success: true });\n } catch (error) {\n this.logger.error('Error handling webhook:', error);\n reply.status(500).send({ error: 'Internal server error' });\n }\n }\n\n private verifySignature(signature: string, timestamp: string, body: string): boolean {\n // 如果没有配置加密密钥,跳过验证(仅用于开发环境)\n const config = ConfigManager.getInstance().getFeishuConfig();\n const encryptKey = config.encryptKey;\n \n if (!encryptKey) {\n this.logger.warn('No encrypt key configured, skipping signature verification (development mode)');\n return true;\n }\n \n // 验证时间戳,防止重放攻击(允许±5分钟的时间差)\n const now = Math.floor(Date.now() / 1000);\n const requestTime = parseInt(timestamp, 10);\n const timeDiff = Math.abs(now - requestTime);\n \n if (timeDiff > 300) { // 5 minutes = 300 seconds\n this.logger.warn(`Request timestamp too old: ${timeDiff}s difference`);\n return false;\n }\n \n try {\n // 飞书签名算法:HMAC-SHA256(timestamp + \"\\n\" + body, encryptKey)\n const signatureContent = `${timestamp}\\n${body}`;\n const computedSignature = crypto\n .createHmac('sha256', encryptKey)\n .update(signatureContent)\n .digest('base64');\n \n // 使用恒定时间比较防止时序攻击\n const expectedSig = Buffer.from(computedSignature);\n const receivedSig = Buffer.from(signature);\n \n if (expectedSig.length !== receivedSig.length) {\n return false;\n }\n \n return crypto.timingSafeEqual(expectedSig, receivedSig);\n } catch (error) {\n this.logger.error('Error verifying signature:', error);\n return false;\n }\n }\n \n private async handleEvent(event: any): Promise<void> {\n const { message } = event;\n \n // 忽略非文本消息\n if (message.message_type !== 'text') {\n this.logger.info('Ignoring non-text message');\n return;\n }\n \n const content = JSON.parse(message.content);\n const text = content.text.trim();\n const sender = event.sender.sender_id.open_id;\n \n this.logger.info(`Received message from ${sender}: ${text}`);\n \n // 提取目标IDE/CLI\n const target = this.extractTargetIDE(text);\n const command = this.extractCommand(text);\n \n // 执行命令\n const result = await this.commandExecutor.execute({\n target,\n command,\n sender,\n chatId: message.chat_id\n });\n \n // 回复结果\n const formattedResponse = this.formatResponse(result);\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: formattedResponse\n }\n });\n }\n \n private extractTargetIDE(text: string): string {\n // 解析 @vscode /generate xxx 或 @cursor /generate xxx 格式\n const match = text.match(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)/i);\n return match ? match[1].toLowerCase() : 'auto';\n }\n \n private extractCommand(text: string): string {\n // 移除目标IDE标识符,提取实际命令\n const cleanedText = text.replace(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)\\s*/i, '').trim();\n return cleanedText;\n }\n \n private formatResponse(result: any): string {\n if (result.success) {\n // 限制输出长度以符合飞书消息限制\n const output = typeof result.output === 'string' \n ? result.output.substring(0, 2000) \n : JSON.stringify(result.output).substring(0, 2000);\n \n return `✅ 执行成功\\n\\n${output}`;\n } else {\n const error = result.error || result.stderr || 'Unknown error';\n return `❌ 执行失败\\n\\n${error.substring(0, 2000)}`;\n }\n }\n}","/**\n * WebSocket处理器\n * 用于与飞书建立实时连接接收事件\n */\nimport { WebSocket } from 'ws';\nimport { FeishuClient } from './client';\nimport { CommandExecutor } from '../commands/executor';\nimport { MessageRouter } from '../core/message-router';\nimport { LarkEvent } from './types';\nimport { Logger } from '../core/logger';\nimport { ConfigManager } from '../core/config';\nimport { BaseIDEAdapter } from '../adapters/base';\n\nexport class FeishuWebSocketHandler {\n private ws: WebSocket | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectInterval = 5000; // 5秒\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private logger: Logger;\n private isRunning = false;\n private messageRouter: MessageRouter;\n\n constructor(\n private client: FeishuClient,\n private commandExecutor: CommandExecutor,\n private adapters: Map<string, BaseIDEAdapter>\n ) {\n this.logger = new Logger();\n this.messageRouter = new MessageRouter(adapters);\n }\n\n /**\n * 启动WebSocket连接\n */\n async start(): Promise<void> {\n if (this.isRunning) {\n this.logger.warn('WebSocket handler already running');\n return;\n }\n\n this.isRunning = true;\n this.reconnectAttempts = 0;\n await this.connect();\n }\n\n /**\n * 停止WebSocket连接\n */\n async stop(): Promise<void> {\n this.isRunning = false;\n \n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.logger.info('WebSocket handler stopped');\n }\n\n /**\n * 建立WebSocket连接\n */\n private async connect(): Promise<void> {\n try {\n const config = ConfigManager.getInstance().getFeishuConfig();\n \n // 飞书WebSocket URL\n const wsUrl = config.domain === 'feishu'\n ? 'wss://ws.feishu.cn/passport/'\n : 'wss://ws.larksuite.com/passport/';\n\n this.logger.info(`Connecting to WebSocket: ${wsUrl}`);\n\n this.ws = new WebSocket(wsUrl, {\n headers: {\n 'Authorization': `Bearer ${await this.getAccessToken()}`\n }\n });\n\n this.setupWebSocketHandlers();\n\n } catch (error) {\n this.logger.error('Failed to connect WebSocket:', error);\n this.handleReconnect();\n }\n }\n\n /**\n * 设置WebSocket事件处理器\n */\n private setupWebSocketHandlers(): void {\n if (!this.ws) return;\n\n this.ws.on('open', () => {\n this.logger.info('WebSocket connected');\n this.reconnectAttempts = 0;\n this.startHeartbeat();\n });\n\n this.ws.on('message', (data: WebSocket.Data) => {\n this.handleMessage(data.toString());\n });\n\n this.ws.on('close', (code: number, reason: Buffer) => {\n this.logger.info(`WebSocket closed: ${code} - ${reason.toString()}`);\n this.stopHeartbeat();\n \n if (this.isRunning) {\n this.handleReconnect();\n }\n });\n\n this.ws.on('error', (error: Error) => {\n this.logger.error('WebSocket error:', error);\n });\n\n this.ws.on('ping', () => {\n this.ws?.pong();\n });\n }\n\n /**\n * 处理收到的消息\n */\n private async handleMessage(data: string): Promise<void> {\n try {\n const event = JSON.parse(data) as LarkEvent;\n this.logger.debug('Received WebSocket message:', event);\n\n // 处理URL验证\n if (event.type === 'url_verification') {\n this.logger.info('Received URL verification challenge via WebSocket');\n return;\n }\n\n // 处理消息事件\n if (event.type === 'event_callback' && event.event) {\n await this.handleEvent(event.event);\n }\n\n } catch (error) {\n this.logger.error('Error handling WebSocket message:', error);\n }\n }\n\n /**\n * 处理事件\n */\n private async handleEvent(event: any): Promise<void> {\n const { message } = event;\n\n // 忽略非文本消息\n if (!message || message.message_type !== 'text') {\n this.logger.debug('Ignoring non-text message');\n return;\n }\n\n try {\n const content = JSON.parse(message.content);\n const text = content.text.trim();\n const sender = event.sender?.sender_id?.open_id;\n\n if (!sender) {\n this.logger.warn('Missing sender ID');\n return;\n }\n\n this.logger.info(`Received message from ${sender}: ${text}`);\n\n // 使用消息路由器\n const route = await this.messageRouter.route(text);\n\n if (route.type === 'error') {\n // 错误提示\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: route.content!\n }\n });\n return;\n }\n\n if (route.type === 'prompt_choice') {\n // 多工具选择提示\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: route.content!\n }\n });\n return;\n }\n\n // 直接路由到目标\n if (route.type === 'direct' && route.target) {\n const command = this.messageRouter.extractCommand(text);\n \n this.logger.info(`Routing to ${route.target}: ${command}`);\n\n // 执行命令\n const result = await this.commandExecutor.execute({\n target: route.target,\n command,\n sender,\n chatId: message.chat_id\n });\n\n // 回复结果\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: this.formatResponse(result)\n }\n });\n }\n\n } catch (error) {\n this.logger.error('Error processing event:', error);\n // 发送错误提示\n try {\n await this.client.sendMessage(message.chat_id, {\n msg_type: 'text',\n content: {\n text: `❌ 处理消息时出错: ${error instanceof Error ? error.message : '未知错误'}`\n }\n });\n } catch (sendError) {\n this.logger.error('Failed to send error message:', sendError);\n }\n }\n }\n\n /**\n * 启动心跳保活\n */\n private startHeartbeat(): void {\n // 每30秒发送一次ping\n this.heartbeatInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.ping();\n }\n }, 30000);\n }\n\n /**\n * 停止心跳\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * 处理重连\n */\n private handleReconnect(): void {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n this.logger.error(`Max reconnection attempts (${this.maxReconnectAttempts}) reached`);\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectInterval * this.reconnectAttempts;\n \n this.logger.info(`Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n setTimeout(() => {\n if (this.isRunning) {\n this.connect();\n }\n }, delay);\n }\n\n /**\n * 获取访问令牌\n */\n private async getAccessToken(): Promise<string> {\n // 这里需要实现获取tenant_access_token的逻辑\n // 简化版本:通过FeishuClient获取\n const config = ConfigManager.getInstance().getFeishuConfig();\n \n const response = await fetch(\n `https://open.${config.domain === 'lark' ? 'larksuite' : 'feishu'}.cn/open-apis/auth/v3/tenant_access_token/internal`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n app_id: config.appId,\n app_secret: config.appSecret\n })\n }\n );\n\n const data = await response.json() as any;\n \n if (data.code !== 0) {\n throw new Error(`Failed to get access token: ${data.msg}`);\n }\n\n return data.tenant_access_token;\n }\n\n /**\n * 提取目标IDE\n */\n private extractTargetIDE(text: string): string {\n const match = text.match(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)/i);\n return match ? match[1].toLowerCase() : 'auto';\n }\n\n /**\n * 提取命令\n */\n private extractCommand(text: string): string {\n return text.replace(/@(vscode|cursor|trae|antigravity|kiro|opencode|claude)\\s*/i, '').trim();\n }\n\n /**\n * 格式化响应\n */\n private formatResponse(result: any): string {\n if (result.success) {\n const output = typeof result.output === 'string'\n ? result.output.substring(0, 2000)\n : JSON.stringify(result.output).substring(0, 2000);\n return `✅ 执行成功\\n\\n${output}`;\n } else {\n const error = result.error || result.stderr || 'Unknown error';\n return `❌ 执行失败\\n\\n${error.substring(0, 2000)}`;\n }\n }\n}\n","/**\n * 消息路由器\n * 处理飞书消息,解析@提及,路由到对应适配器\n */\nimport { Logger } from '../core/logger';\nimport { ConfigManager } from '../core/config';\nimport { BaseIDEAdapter } from '../adapters/base';\n\nexport interface MessageRoute {\n type: 'direct' | 'prompt_choice' | 'error';\n target?: string;\n content?: string;\n availableTools?: ToolInfo[];\n}\n\nexport interface ToolInfo {\n id: string;\n name: string;\n type: 'cli' | 'ide';\n model?: string;\n available: boolean;\n}\n\nexport class MessageRouter {\n private logger: Logger;\n private cliTools: string[] = ['opencode', 'claude', 'gemini'];\n private ideTools: string[] = ['vscode', 'cursor', 'trae', 'antigravity', 'kiro'];\n\n constructor(\n private adapters: Map<string, BaseIDEAdapter>\n ) {\n this.logger = new Logger();\n }\n\n /**\n * 路由消息\n * @param text 消息文本\n * @returns 路由结果\n */\n async route(text: string): Promise<MessageRoute> {\n // 提取@提及\n const mention = this.extractMention(text);\n \n if (mention) {\n // 用户明确指定了工具\n const adapter = this.adapters.get(mention);\n if (!adapter) {\n return {\n type: 'error',\n content: `❌ 未找到工具 \"${mention}\",请确保已安装并启动`\n };\n }\n\n // 检查工具是否可用\n const isAvailable = await adapter.checkAvailability();\n if (!isAvailable) {\n return {\n type: 'error',\n content: `❌ \"${mention}\" 当前不可用,请检查是否已启动`\n };\n }\n\n return {\n type: 'direct',\n target: mention\n };\n }\n\n // 没有@,获取所有可用工具\n const availableTools = await this.getAvailableTools();\n\n if (availableTools.length === 0) {\n return {\n type: 'error',\n content: '❌ 没有检测到可用的工具\\n\\n请安装并启动以下任一工具:\\n• OpenCode: npm install -g opencode\\n• Claude Code: npm install -g @anthropic-ai/claude-code\\n• VS Code/Cursor/Trae等IDE'\n };\n }\n\n if (availableTools.length === 1) {\n // 只有一个工具,直接使用\n return {\n type: 'direct',\n target: availableTools[0].id\n };\n }\n\n // 多个工具,提示用户选择\n return {\n type: 'prompt_choice',\n content: this.buildChoicePrompt(availableTools),\n availableTools\n };\n }\n\n /**\n * 提取@提及\n */\n private extractMention(text: string): string | null {\n const allTools = [...this.cliTools, ...this.ideTools];\n const pattern = new RegExp(`^@(${allTools.join('|')})\\\\s+`, 'i');\n const match = text.match(pattern);\n return match ? match[1].toLowerCase() : null;\n }\n\n /**\n * 获取所有可用工具\n */\n private async getAvailableTools(): Promise<ToolInfo[]> {\n const tools: ToolInfo[] = [];\n\n for (const [id, adapter] of this.adapters) {\n try {\n const isAvailable = await adapter.checkAvailability();\n if (isAvailable) {\n tools.push({\n id,\n name: this.getToolDisplayName(id),\n type: this.cliTools.includes(id) ? 'cli' : 'ide',\n available: true\n });\n }\n } catch (error) {\n this.logger.warn(`检查工具 ${id} 状态时出错:`, error);\n }\n }\n\n return tools;\n }\n\n /**\n * 获取工具显示名称\n */\n private getToolDisplayName(id: string): string {\n const names: Record<string, string> = {\n 'opencode': 'OpenCode',\n 'claude': 'Claude Code',\n 'gemini': 'Gemini CLI',\n 'vscode': 'VS Code',\n 'cursor': 'Cursor',\n 'trae': 'Trae',\n 'antigravity': 'Antigravity',\n 'kiro': 'Kiro'\n };\n return names[id] || id;\n }\n\n /**\n * 构建选择提示\n */\n private buildChoicePrompt(tools: ToolInfo[]): string {\n const cliTools = tools.filter(t => t.type === 'cli');\n const ideTools = tools.filter(t => t.type === 'ide');\n\n let prompt = '🔧 检测到多个可用工具,请@要使用的工具:\\n\\n';\n\n if (cliTools.length > 0) {\n prompt += '**CLI工具:**\\n';\n cliTools.forEach(tool => {\n prompt += `@${tool.id} - ${tool.name}\\n`;\n });\n prompt += '\\n';\n }\n\n if (ideTools.length > 0) {\n prompt += '**IDE工具:**\\n';\n ideTools.forEach(tool => {\n prompt += `@${tool.id} - ${tool.name}\\n`;\n });\n prompt += '\\n';\n }\n\n prompt += '**示例:**\\n';\n prompt += `@${tools[0].id} 你好,请帮我优化这段代码`;\n\n return prompt;\n }\n\n /**\n * 提取纯命令文本(去除@提及)\n */\n extractCommand(text: string): string {\n const allTools = [...this.cliTools, ...this.ideTools];\n const pattern = new RegExp(`^@(${allTools.join('|')})\\\\s+`, 'i');\n return text.replace(pattern, '').trim();\n }\n}\n","/**\n * 飞书API客户端\n */\nimport { Logger } from '../core/logger';\nimport { LarkApiResponse, SendMessageRequest, SendMessageResponse } from './types';\n\nexport interface FeishuConfig {\n appId: string;\n appSecret: string;\n domain: 'feishu' | 'lark';\n}\n\nexport class FeishuClient {\n private appId: string;\n private appSecret: string;\n private domain: 'feishu' | 'lark';\n private baseUrl: string;\n private accessToken: string | null = null;\n private tokenExpireTime: number = 0;\n private logger: Logger;\n\n constructor(config: FeishuConfig) {\n this.appId = config.appId;\n this.appSecret = config.appSecret;\n this.domain = config.domain;\n this.baseUrl = this.domain === 'feishu' \n ? 'https://open.feishu.cn/open-apis'\n : 'https://open.larksuite.com/open-apis';\n this.logger = new Logger();\n }\n\n /**\n * 获取访问令牌\n */\n private async getAccessToken(): Promise<string> {\n const now = Date.now();\n \n // 如果令牌未过期,直接返回\n if (this.accessToken && now < this.tokenExpireTime) {\n return this.accessToken;\n }\n\n try {\n const response = await fetch(`${this.baseUrl}/auth/v3/tenant_access_token/internal`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n body: JSON.stringify({\n app_id: this.appId,\n app_secret: this.appSecret,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get access token: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as LarkApiResponse<{\n tenant_access_token: string;\n expire: number;\n }>;\n\n if (data.code !== 0) {\n throw new Error(`Failed to get access token: ${data.msg}`);\n }\n\n this.accessToken = data.data.tenant_access_token;\n this.tokenExpireTime = now + (data.data.expire - 300) * 1000; // 提前5分钟刷新\n\n this.logger.info('Access token refreshed successfully');\n return this.accessToken;\n } catch (error) {\n this.logger.error('Error getting access token:', error);\n throw error;\n }\n }\n\n /**\n * 发送消息到指定聊天\n */\n async sendMessage(chatId: string, message: SendMessageRequest): Promise<SendMessageResponse> {\n try {\n const token = await this.getAccessToken();\n \n const response = await fetch(`${this.baseUrl}/im/v1/messages?receive_id_type=chat_id`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json; charset=utf-8',\n },\n body: JSON.stringify({\n receive_id: chatId,\n ...message,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as LarkApiResponse<SendMessageResponse>;\n\n if (data.code !== 0) {\n throw new Error(`Failed to send message: ${data.msg}`);\n }\n\n this.logger.info(`Message sent successfully to chat ${chatId}`);\n return data.data;\n } catch (error) {\n this.logger.error('Error sending message:', error);\n throw error;\n }\n }\n\n /**\n * 获取用户信息\n */\n async getUserInfo(userId: string): Promise<any> {\n try {\n const token = await this.getAccessToken();\n \n const response = await fetch(`${this.baseUrl}/contact/v3/users/${userId}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json; charset=utf-8',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get user info: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json() as LarkApiResponse<any>;\n\n if (data.code !== 0) {\n throw new Error(`Failed to get user info: ${data.msg}`);\n }\n\n return data.data;\n } catch (error) {\n this.logger.error('Error getting user info:', error);\n throw error;\n }\n }\n}","/**\n * 命令执行器\n */\nimport { SessionManager } from '../session/manager';\nimport { BaseIDEAdapter } from '../adapters/base';\nimport { Logger } from '../core/logger';\n\nexport interface CommandExecutionRequest {\n target: string;\n command: string;\n sender: string;\n chatId: string;\n}\n\nexport interface CommandExecutionResult {\n success: boolean;\n output: string;\n error?: string;\n}\n\nexport class CommandExecutor {\n private logger: Logger;\n\n constructor(\n private adapters: Map<string, BaseIDEAdapter>,\n private sessionManager: SessionManager\n ) {\n this.logger = new Logger();\n }\n\n async execute(request: CommandExecutionRequest): Promise<CommandExecutionResult> {\n try {\n this.logger.info(`Executing command for target: ${request.target}, command: ${request.command}`);\n\n // 获取会话上下文\n const session = this.sessionManager.getSession(request.sender);\n \n // 确定要使用的适配器\n let adapterName = request.target.toLowerCase();\n if (adapterName === 'auto') {\n adapterName = this.detectBestAdapter();\n }\n \n // 获取对应的适配器\n const adapter = this.adapters.get(adapterName);\n if (!adapter) {\n throw new Error(`Adapter not found for target: ${adapterName}`);\n }\n \n // 检查适配器是否可用\n if (!await adapter.checkAvailability()) {\n throw new Error(`Adapter ${adapterName} is not available`);\n }\n \n // 准备执行上下文\n const executionContext = {\n workspaceRoot: session?.workspaceRoot,\n chatId: request.chatId,\n senderId: request.sender\n };\n \n // 根据命令类型执行相应操作\n let result: string;\n \n if (this.isGenerateCommand(request.command)) {\n // 代码生成命令\n const description = this.extractDescription(request.command);\n result = await adapter.generateCode(description);\n } else if (this.isRunCommand(request.command)) {\n // 运行命令\n const command = this.extractRunCommand(request.command);\n const executionResult = await adapter.runProgram(command, executionContext.workspaceRoot);\n result = executionResult.stdout || executionResult.stderr;\n } else {\n // 通用命令\n result = await adapter.sendCommand(request.command, executionContext);\n }\n \n // 更新会话\n this.sessionManager.updateSession(request.sender, {\n lastCommand: request.command,\n lastResult: result,\n lastUsedAdapter: adapterName\n });\n \n return {\n success: true,\n output: result\n };\n } catch (error) {\n this.logger.error('Error executing command:', error);\n \n return {\n success: false,\n output: '',\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n private detectBestAdapter(): string {\n // 简单的适配器检测逻辑\n // 在实际实现中,可以更智能地检测当前环境\n for (const [name, adapter] of this.adapters) {\n if (adapter.isAvailable) {\n return name;\n }\n }\n \n // 如果没有可用的适配器,则默认返回vscode\n return 'vscode';\n }\n\n private isGenerateCommand(command: string): boolean {\n return /\\b(generate|create|make|build|implement|write|develop|add|new)\\b/i.test(command);\n }\n\n private isRunCommand(command: string): boolean {\n return /\\b(run|execute|start|launch|test|debug|build)\\b/i.test(command);\n }\n\n private extractDescription(command: string): string {\n // 提取生成命令的描述部分\n const match = command.match(/\\b(generate|create|make|build|implement|write|develop|add|new)\\b\\s+(.*)/i);\n return match ? match[2] : command;\n }\n\n private extractRunCommand(command: string): string {\n // 提取运行命令的部分\n const match = command.match(/\\b(run|execute|start|launch|test|debug|build)\\b\\s+(.*)/i);\n return match ? match[2] : command;\n }\n}","/**\n * 会话管理器\n */\nimport { Logger } from '../core/logger';\n\nexport interface SessionData {\n userId: string;\n createdAt: number;\n lastActive: number;\n workspaceRoot?: string;\n context?: any;\n lastCommand?: string;\n lastResult?: string;\n lastUsedAdapter?: string;\n}\n\nexport interface SessionUpdate {\n workspaceRoot?: string;\n context?: any;\n lastCommand?: string;\n lastResult?: string;\n lastUsedAdapter?: string;\n}\n\nexport class SessionManager {\n private sessions: Map<string, SessionData> = new Map();\n private logger: Logger;\n private sessionTimeout: number; // 会话超时时间(毫秒)\n\n constructor(sessionTimeoutMinutes: number = 30) {\n this.logger = new Logger();\n this.sessionTimeout = sessionTimeoutMinutes * 60 * 1000; // 转换为毫秒\n \n // 定期清理过期会话\n setInterval(() => {\n this.cleanupExpiredSessions();\n }, this.sessionTimeout);\n }\n\n /**\n * 获取会话,如果不存在则创建新会话\n */\n getSession(userId: string): SessionData | null {\n const session = this.sessions.get(userId);\n \n if (session) {\n // 检查会话是否过期\n if (Date.now() - session.lastActive > this.sessionTimeout) {\n this.logger.info(`Session for user ${userId} expired, removing`);\n this.sessions.delete(userId);\n return null;\n }\n \n // 更新最后活跃时间\n session.lastActive = Date.now();\n return session;\n }\n \n return null;\n }\n\n /**\n * 创建新会话\n */\n createSession(userId: string, initialData?: Partial<SessionData>): SessionData {\n const now = Date.now();\n const session: SessionData = {\n userId,\n createdAt: now,\n lastActive: now,\n workspaceRoot: initialData?.workspaceRoot,\n context: initialData?.context,\n lastCommand: initialData?.lastCommand,\n lastResult: initialData?.lastResult,\n lastUsedAdapter: initialData?.lastUsedAdapter\n };\n\n this.sessions.set(userId, session);\n this.logger.info(`Created new session for user ${userId}`);\n \n return session;\n }\n\n /**\n * 更新会话数据\n */\n updateSession(userId: string, update: SessionUpdate): SessionData | null {\n let session = this.sessions.get(userId);\n \n if (!session) {\n // 如果会话不存在,创建一个新会话\n session = this.createSession(userId);\n }\n \n // 更新会话数据\n session.lastActive = Date.now();\n if (update.workspaceRoot !== undefined) session.workspaceRoot = update.workspaceRoot;\n if (update.context !== undefined) session.context = { ...session.context, ...update.context };\n if (update.lastCommand !== undefined) session.lastCommand = update.lastCommand;\n if (update.lastResult !== undefined) session.lastResult = update.lastResult;\n if (update.lastUsedAdapter !== undefined) session.lastUsedAdapter = update.lastUsedAdapter;\n\n this.sessions.set(userId, session);\n this.logger.debug(`Updated session for user ${userId}`);\n \n return session;\n }\n\n /**\n * 删除会话\n */\n removeSession(userId: string): boolean {\n const removed = this.sessions.delete(userId);\n if (removed) {\n this.logger.info(`Removed session for user ${userId}`);\n }\n return removed;\n }\n\n /**\n * 清理会话数据\n */\n clearAllSessions(): void {\n const count = this.sessions.size;\n this.sessions.clear();\n this.logger.info(`Cleared all ${count} sessions`);\n }\n\n /**\n * 获取所有活跃会话数量\n */\n getActiveSessionCount(): number {\n return this.sessions.size;\n }\n\n /**\n * 清理过期会话\n */\n private cleanupExpiredSessions(): void {\n const now = Date.now();\n let expiredCount = 0;\n\n for (const [userId, session] of this.sessions) {\n if (now - session.lastActive > this.sessionTimeout) {\n this.sessions.delete(userId);\n expiredCount++;\n this.logger.info(`Cleaned up expired session for user ${userId}`);\n }\n }\n\n if (expiredCount > 0) {\n this.logger.info(`Cleaned up ${expiredCount} expired sessions`);\n }\n }\n}","/**\n * 适配器基类\n */\nimport { Logger } from '../core/logger';\nimport { ReverseChannel, ReverseMessage } from '../core/reverse-channel';\n\nexport interface ExecutionContext {\n workspaceRoot?: string;\n chatId?: string;\n senderId?: string;\n}\n\nexport interface CodeGenOptions {\n language?: string;\n framework?: string;\n style?: string;\n}\n\nexport interface ExecutionResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n success: boolean;\n output?: string;\n error?: string;\n}\n\nexport interface IIDEAdapter {\n readonly type: string;\n readonly isAvailable: boolean;\n \n // 检查IDE是否可用\n checkAvailability(): Promise<boolean>;\n \n // 发送命令到IDE\n sendCommand(command: string, context?: ExecutionContext): Promise<string>;\n \n // 获取AI助手响应\n getAIResponse(prompt: string, context?: ExecutionContext): Promise<string>;\n \n // 执行代码生成\n generateCode(description: string, options?: CodeGenOptions): Promise<string>;\n \n // 运行程序\n runProgram(command: string, cwd?: string): Promise<ExecutionResult>;\n}\n\nexport abstract class BaseIDEAdapter implements IIDEAdapter {\n protected logger: Logger;\n protected reverseChannel: ReverseChannel | null = null;\n\n constructor() {\n this.logger = new Logger().child({ adapter: this.type });\n }\n\n abstract readonly type: string;\n\n get isAvailable(): boolean {\n return this.checkAvailabilitySync();\n }\n\n /**\n * 设置反向通信通道\n * 允许适配器主动向飞书发送消息\n */\n setReverseChannel(channel: ReverseChannel): void {\n this.reverseChannel = channel;\n this.logger.info(`Reverse channel set for ${this.type} adapter`);\n }\n\n /**\n * 发送消息到飞书\n * 供子类调用以主动推送消息\n */\n protected async sendToFeishu(\n content: string,\n context?: ExecutionContext,\n type: ReverseMessage['type'] = 'message'\n ): Promise<boolean> {\n if (!this.reverseChannel) {\n this.logger.warn('Reverse channel not available, cannot send message to Feishu');\n return false;\n }\n\n if (!context?.chatId) {\n this.logger.warn('No chatId in context, cannot send message to Feishu');\n return false;\n }\n\n try {\n await this.reverseChannel.sendToFeishu({\n type,\n content,\n chatId: context.chatId,\n senderId: context.senderId,\n timestamp: Date.now()\n });\n return true;\n } catch (error) {\n this.logger.error('Error sending message to Feishu:', error);\n return false;\n }\n }\n\n /**\n * 发送文件系统消息(无需反向通道实例)\n * 通过写入文件的方式让Bridge代为发送\n */\n protected async sendFileSystemMessage(\n content: string,\n context?: ExecutionContext,\n type: ReverseMessage['type'] = 'message'\n ): Promise<void> {\n if (!this.reverseChannel) {\n this.logger.warn('Reverse channel not available for file system message');\n return;\n }\n\n await this.reverseChannel.sendFileSystemMessage(\n this.type,\n content,\n context?.chatId\n );\n }\n\n abstract checkAvailability(): Promise<boolean>;\n protected abstract checkAvailabilitySync(): boolean;\n abstract sendCommand(command: string, context?: ExecutionContext): Promise<string>;\n abstract getAIResponse(prompt: string, context?: ExecutionContext): Promise<string>;\n abstract generateCode(description: string, options?: CodeGenOptions): Promise<string>;\n abstract runProgram(command: string, cwd?: string): Promise<ExecutionResult>;\n\n protected buildCodePrompt(description: string, options?: CodeGenOptions): string {\n let prompt = description;\n \n if (options) {\n if (options.language) {\n prompt += `\\nLanguage: ${options.language}`;\n }\n if (options.framework) {\n prompt += `\\nFramework: ${options.framework}`;\n }\n if (options.style) {\n prompt += `\\nStyle: ${options.style}`;\n }\n }\n \n return prompt;\n }\n}","/**\n * VS Code 适配器\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nexport class VSCodeAdapter extends BaseIDEAdapter {\n readonly type = 'vscode';\n private vscodePath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查VS Code环境变量\n if (process.env.VSCODE_PID || process.env.VSCODE_CWD) {\n return true;\n }\n \n // 尝试查找VS Code可执行文件\n this.vscodePath = this.findVSCodeExecutable();\n return !!this.vscodePath;\n }\n \n private findVSCodeExecutable(): string | null {\n const platform = os.platform();\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n // macOS\n possiblePaths.push(\n '/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code',\n '/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code',\n '/usr/local/bin/code',\n path.join(os.homedir(), 'Applications/Visual Studio Code.app/Contents/Resources/app/bin/code')\n );\n } else if (platform === 'win32') {\n // Windows\n possiblePaths.push(\n path.join(process.env.LOCALAPPDATA || '', 'Programs/Microsoft VS Code/bin/code.cmd'),\n path.join(process.env.ProgramFiles || '', 'Microsoft VS Code/bin/code.cmd'),\n path.join(process.env.ProgramFiles || '', 'Microsoft VS Code/bin/code.exe'),\n 'C:\\\\Program Files\\\\Microsoft VS Code\\\\bin\\\\code.cmd'\n );\n } else {\n // Linux\n possiblePaths.push(\n '/usr/bin/code',\n '/usr/local/bin/code',\n '/usr/share/code/bin/code',\n path.join(os.homedir(), '.local/bin/code'),\n '/snap/bin/code'\n );\n }\n \n for (const vscodePath of possiblePaths) {\n if (fs.existsSync(vscodePath)) {\n return vscodePath;\n }\n }\n \n // 尝试使用which/where命令查找\n try {\n if (platform === 'win32') {\n const result = execa.sync('where', ['code'], { reject: false });\n if (result.stdout) {\n const lines = result.stdout.split('\\n').map(l => l.trim()).filter(l => l);\n if (lines.length > 0) return lines[0];\n }\n } else {\n const result = execa.sync('which', ['code'], { reject: false });\n if (result.stdout) {\n return result.stdout.trim();\n }\n }\n } catch {\n // 查找失败\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to VS Code: ${command}`);\n \n // 方法1: 尝试使用VS Code CLI (如果可用)\n if (this.vscodePath) {\n try {\n const result = await execa(this.vscodePath, [\n '--command', \n 'feishuBridge.execute',\n '--args', JSON.stringify({ command })\n ], {\n timeout: 30000,\n reject: false\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed successfully';\n }\n } catch (cliError) {\n this.logger.debug('VS Code CLI failed, trying file system method');\n }\n }\n \n // 方法2: 通过文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing VS Code command:`, error);\n throw new Error(`VS Code command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'vscode');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `Command queued for VS Code. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from VS Code for prompt: ${prompt}`);\n \n // 尝试使用VS Code CLI (如果可用)\n if (this.vscodePath) {\n try {\n const result = await execa(this.vscodePath, [\n '--command',\n 'github.copilot.generateCode',\n '--args', JSON.stringify({ prompt })\n ], {\n timeout: 60000,\n reject: false\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('VS Code AI CLI failed, using file system');\n }\n }\n \n // 文件系统方式\n return await this.sendAIRequestViaFileSystem(prompt, context);\n \n } catch (error) {\n this.logger.error(`Error getting VS Code AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'vscode');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000; // AI响应可能需要更长时间\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `AI request queued for VS Code. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000, // 60秒超时\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in VS Code:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Cursor 适配器\n * Cursor是基于VS Code的AI编辑器,支持多种交互方式\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class CursorAdapter extends BaseIDEAdapter {\n readonly type = 'cursor';\n private cursorPath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查Cursor是否通过环境变量标识\n if (process.env.CURSOR_SHELL || process.env.CURSOR_PID) {\n return true;\n }\n \n // 尝试查找Cursor可执行文件\n this.cursorPath = this.findCursorExecutable();\n return !!this.cursorPath;\n }\n \n private findCursorExecutable(): string | null {\n const platform = os.platform();\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n // macOS\n possiblePaths.push(\n '/Applications/Cursor.app/Contents/MacOS/Cursor',\n '/usr/local/bin/cursor',\n path.join(os.homedir(), 'Applications/Cursor.app/Contents/MacOS/Cursor')\n );\n } else if (platform === 'win32') {\n // Windows\n possiblePaths.push(\n path.join(process.env.LOCALAPPDATA || '', 'Programs/Cursor/Cursor.exe'),\n path.join(process.env.PROGRAMFILES || '', 'Cursor/Cursor.exe'),\n 'C:\\\\Program Files\\\\Cursor\\\\Cursor.exe'\n );\n } else {\n // Linux\n possiblePaths.push(\n '/usr/bin/cursor',\n '/usr/local/bin/cursor',\n '/opt/cursor/cursor',\n path.join(os.homedir(), '.local/bin/cursor')\n );\n }\n \n for (const cursorPath of possiblePaths) {\n if (fs.existsSync(cursorPath)) {\n return cursorPath;\n }\n }\n \n // 尝试使用which/where命令查找\n try {\n if (platform === 'win32') {\n const result = execa.sync('where', ['cursor'], { reject: false });\n if (result.stdout) {\n const lines = result.stdout.split('\\n').map(l => l.trim()).filter(l => l);\n if (lines.length > 0) return lines[0];\n }\n } else {\n const result = execa.sync('which', ['cursor'], { reject: false });\n if (result.stdout) {\n return result.stdout.trim();\n }\n }\n } catch {\n // 查找失败\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Cursor: ${command}`);\n \n // 方法1: 尝试使用Cursor CLI (如果可用)\n if (this.cursorPath) {\n try {\n const result = await execa(this.cursorPath, [\n '--command',\n 'workbench.action.executeCommand',\n '--args', JSON.stringify({ command })\n ], {\n timeout: 30000,\n reject: false\n });\n \n if (!result.failed) {\n return `Cursor executed: ${command}\\n${result.stdout}`;\n }\n } catch (cliError) {\n this.logger.debug('Cursor CLI failed, trying alternative methods');\n }\n }\n \n // 方法2: 通过文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing Cursor command:`, error);\n throw new Error(`Cursor command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n // 创建临时指令文件\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'cursor');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `instruction_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `response_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应(最多30秒)\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n // 清理临时文件\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {\n // 忽略清理错误\n }\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n // 超时,清理并返回错误\n try {\n fs.unlinkSync(instructionFile);\n } catch {\n // 忽略\n }\n \n return `Command sent to Cursor workspace (file: ${instructionFile}). No response received within ${maxWait}ms. Make sure Cursor is running with Feishu Bridge extension.`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Cursor for prompt: ${prompt}`);\n \n // Cursor使用Composer AI,尝试通过文件系统通信\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'cursor');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_request_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_response_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 60000; // AI响应可能需要更长时间\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {\n // 忽略\n }\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {\n // 忽略\n }\n \n return `AI request sent to Cursor (file: ${instructionFile}). No response received within ${maxWait}ms.`;\n \n } catch (error) {\n this.logger.error(`Error getting Cursor AI response:`, error);\n throw error;\n }\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Cursor:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Trae 适配器\n * Trae是字节跳动的AI IDE\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class TraeAdapter extends BaseIDEAdapter {\n readonly type = 'trae';\n private traePath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查Trae环境变量\n if (process.env.TRAE_SESSION || process.env.TRAE_PID) {\n return true;\n }\n \n // 尝试查找Trae\n this.traePath = this.findTraeExecutable();\n return !!this.traePath;\n }\n \n private findTraeExecutable(): string | null {\n const platform = os.platform();\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n possiblePaths.push(\n '/Applications/Trae.app/Contents/MacOS/Trae',\n '/usr/local/bin/trae',\n path.join(os.homedir(), 'Applications/Trae.app/Contents/MacOS/Trae')\n );\n } else if (platform === 'win32') {\n possiblePaths.push(\n path.join(process.env.LOCALAPPDATA || '', 'Programs', 'Trae', 'Trae.exe'),\n 'C:\\\\Program Files\\\\Trae\\\\Trae.exe'\n );\n } else {\n possiblePaths.push(\n '/usr/bin/trae',\n '/usr/local/bin/trae',\n '/opt/trae/trae',\n path.join(os.homedir(), '.local/bin/trae')\n );\n }\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n \n // 尝试which/where\n try {\n if (platform === 'win32') {\n const result = execa.sync('where', ['trae'], { reject: false });\n if (result.stdout) {\n const lines = result.stdout.split('\\n').map(l => l.trim()).filter(l => l);\n if (lines.length > 0) return lines[0];\n }\n } else {\n const result = execa.sync('which', ['trae'], { reject: false });\n if (result.stdout) {\n return result.stdout.trim();\n }\n }\n } catch {}\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Trae: ${command}`);\n \n // 尝试使用Trae CLI\n if (this.traePath) {\n try {\n const result = await execa(this.traePath, [\n '--executeCommand',\n command\n ], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed';\n }\n } catch (cliError) {\n this.logger.debug('Trae CLI failed, using file system');\n }\n }\n \n // 文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing Trae command:`, error);\n throw new Error(`Trae command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'trae');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `Command queued for Trae. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Trae for prompt: ${prompt}`);\n \n if (this.traePath) {\n try {\n const result = await execa(this.traePath, [\n '--ai',\n prompt\n ], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Trae AI CLI failed, using file system');\n }\n }\n \n return await this.sendAIRequestViaFileSystem(prompt, context);\n \n } catch (error) {\n this.logger.error(`Error getting Trae AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'trae');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000;\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `AI request queued for Trae. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Trae:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Antigravity 适配器\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class AntigravityAdapter extends BaseIDEAdapter {\n readonly type = 'antigravity';\n private antigravityPath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n if (process.env.ANTIGRAVITY_SESSION) {\n return true;\n }\n \n this.antigravityPath = this.findAntigravityExecutable();\n return !!this.antigravityPath;\n }\n \n private findAntigravityExecutable(): string | null {\n try {\n const result = execa.sync('which', ['antigravity'], { reject: false });\n if (result.stdout) return result.stdout.trim();\n } catch {}\n \n const possiblePaths = [\n '/usr/local/bin/antigravity',\n '/usr/bin/antigravity',\n path.join(os.homedir(), '.local/bin/antigravity')\n ];\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Antigravity: ${command}`);\n \n if (this.antigravityPath) {\n try {\n const result = await execa(this.antigravityPath, ['execute', command], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed';\n }\n } catch (cliError) {\n this.logger.debug('Antigravity CLI failed, using file system');\n }\n }\n \n return await this.sendViaFileSystem(command, context);\n } catch (error) {\n this.logger.error(`Error executing Antigravity command:`, error);\n throw new Error(`Antigravity command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'antigravity');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `Command queued for Antigravity. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Antigravity for prompt: ${prompt}`);\n \n if (this.antigravityPath) {\n try {\n const result = await execa(this.antigravityPath, ['ask', prompt], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Antigravity AI CLI failed, using file system');\n }\n }\n \n return await this.sendAIRequestViaFileSystem(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting Antigravity AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'antigravity');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000;\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `AI request queued for Antigravity. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Antigravity:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Kiro 适配器\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class KiroAdapter extends BaseIDEAdapter {\n readonly type = 'kiro';\n private kiroPath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n if (process.env.KIRO_SESSION) {\n return true;\n }\n \n this.kiroPath = this.findKiroExecutable();\n return !!this.kiroPath;\n }\n \n private findKiroExecutable(): string | null {\n try {\n const result = execa.sync('which', ['kiro'], { reject: false });\n if (result.stdout) return result.stdout.trim();\n } catch {}\n \n const possiblePaths = [\n '/usr/local/bin/kiro',\n '/usr/bin/kiro',\n path.join(os.homedir(), '.local/bin/kiro')\n ];\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Kiro: ${command}`);\n \n if (this.kiroPath) {\n try {\n const result = await execa(this.kiroPath, ['execute', command], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed';\n }\n } catch (cliError) {\n this.logger.debug('Kiro CLI failed, using file system');\n }\n }\n \n return await this.sendViaFileSystem(command, context);\n } catch (error) {\n this.logger.error(`Error executing Kiro command:`, error);\n throw new Error(`Kiro command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'kiro');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `Command queued for Kiro. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Kiro for prompt: ${prompt}`);\n \n if (this.kiroPath) {\n try {\n const result = await execa(this.kiroPath, ['ask', prompt], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Kiro AI CLI failed, using file system');\n }\n }\n \n return await this.sendAIRequestViaFileSystem(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting Kiro AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'kiro');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000;\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try { fs.unlinkSync(instructionFile); } catch {}\n return `AI request queued for Kiro. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Kiro:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * OpenCode 适配器\n * 支持Socket优先 + CLI降级模式\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport { spawn } from 'child_process';\nimport * as net from 'net';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nexport class OpenCodeAdapter extends BaseIDEAdapter {\n readonly type = 'opencode';\n readonly ideType = 'opencode';\n readonly ideName = 'OpenCode';\n private sessionId?: string;\n private useSocket: boolean = false;\n private socketClient?: net.Socket;\n private messageId = 0;\n private pendingMessages: Map<string, { resolve: Function; reject: Function }> = new Map();\n \n protected checkAvailabilitySync(): boolean {\n // 检查Socket或CLI是否可用\n const socketAvailable = this.getSocketPath() !== null;\n const cliAvailable = this.checkCLIExists();\n \n return socketAvailable || cliAvailable;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n\n async isInstalled(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n\n async getVersion(): Promise<string> {\n try {\n const { stdout } = await execa('opencode', ['--version']);\n return stdout.trim();\n } catch {\n return 'unknown';\n }\n }\n \n private checkCLIExists(): boolean {\n try {\n // 同步检查opencode命令是否存在\n const { execSync } = require('child_process');\n execSync('which opencode', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n \n private getSocketPath(): string | null {\n const possiblePaths = [\n path.join(os.tmpdir(), 'opencode.sock'),\n path.join(os.tmpdir(), 'opencode-bridge.sock'),\n path.join(os.homedir(), '.opencode', 'socket'),\n process.env.OPENCODE_SOCKET\n ].filter(Boolean) as string[];\n \n for (const socketPath of possiblePaths) {\n if (fs.existsSync(socketPath)) {\n return socketPath;\n }\n }\n \n return null;\n }\n \n async activate(): Promise<void> {\n // 优先尝试Socket连接\n const socketPath = this.getSocketPath();\n if (socketPath) {\n try {\n await this.connectSocket(socketPath);\n this.useSocket = true;\n this.logger.info(`OpenCode Socket模式已连接: ${socketPath}`);\n return;\n } catch (error) {\n this.logger.warn(`Socket连接失败,将使用CLI模式: ${error}`);\n }\n }\n \n // 检查CLI可用\n if (!this.checkCLIExists()) {\n throw new Error('OpenCode未安装,请先运行: npm install -g opencode');\n }\n \n this.logger.info('OpenCode CLI模式就绪');\n }\n \n async deactivate(): Promise<void> {\n if (this.socketClient) {\n this.socketClient.end();\n this.socketClient = undefined;\n }\n }\n \n private async connectSocket(socketPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.socketClient = net.createConnection(socketPath);\n \n this.socketClient.on('connect', () => {\n resolve();\n });\n \n this.socketClient.on('error', (err) => {\n reject(err);\n });\n \n // 设置消息监听\n this.setupSocketListener();\n });\n }\n \n private setupSocketListener(): void {\n if (!this.socketClient) return;\n \n let buffer = '';\n \n this.socketClient.on('data', (data) => {\n buffer += data.toString();\n \n // 处理JSON行协议\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n \n for (const line of lines) {\n if (line.trim()) {\n try {\n const message = JSON.parse(line);\n this.handleSocketMessage(message);\n } catch (e) {\n this.logger.error('解析Socket消息失败:', line);\n }\n }\n }\n });\n \n this.socketClient.on('close', () => {\n this.logger.info('OpenCode Socket连接关闭');\n this.useSocket = false;\n this.socketClient = undefined;\n });\n }\n \n private handleSocketMessage(message: any): void {\n const { id, content, error, model, usage } = message;\n \n if (id && this.pendingMessages.has(id)) {\n const { resolve, reject } = this.pendingMessages.get(id)!;\n this.pendingMessages.delete(id);\n \n if (error) {\n reject(new Error(error));\n } else {\n resolve({ content, model, usage });\n }\n }\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to OpenCode: ${command}`);\n \n if (this.useSocket && this.socketClient) {\n const result = await this.sendViaSocket({\n type: 'command',\n command,\n context\n });\n return result.content;\n } else {\n return await this.sendViaCLI(command, context);\n }\n } catch (error) {\n this.logger.error(`Error executing OpenCode command:`, error);\n throw error;\n }\n }\n \n private async sendViaSocket(data: any): Promise<{ content: string; model?: string; usage?: any }> {\n return new Promise((resolve, reject) => {\n const id = `msg_${++this.messageId}`;\n this.pendingMessages.set(id, { resolve, reject });\n \n const message = { ...data, id };\n this.socketClient!.write(JSON.stringify(message) + '\\n');\n \n // 30秒超时\n setTimeout(() => {\n if (this.pendingMessages.has(id)) {\n this.pendingMessages.delete(id);\n reject(new Error('OpenCode Socket请求超时'));\n }\n }, 30000);\n });\n }\n \n private async sendViaCLI(command: string, context?: ExecutionContext): Promise<string> {\n return new Promise((resolve, reject) => {\n const args = ['chat', '--non-interactive'];\n \n const child = spawn('opencode', args, {\n cwd: context?.workspaceRoot,\n env: { ...process.env, OPENCODE_NON_INTERACTIVE: '1' },\n stdio: ['pipe', 'pipe', 'pipe']\n });\n \n let stdout = '';\n let stderr = '';\n \n child.stdout!.on('data', (data) => {\n stdout += data.toString();\n });\n \n child.stderr!.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`OpenCode退出码 ${code}: ${stderr}`));\n } else {\n resolve(stdout.trim());\n }\n });\n \n child.on('error', (err) => {\n reject(new Error(`启动OpenCode失败: ${err.message}`));\n });\n \n // 发送命令\n child.stdin!.write(command);\n child.stdin!.end();\n });\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from OpenCode for prompt: ${prompt.substring(0, 100)}...`);\n return await this.sendCommand(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting OpenCode AI response:`, error);\n throw error;\n }\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await this.sendCommand(command, { workspaceRoot: cwd });\n \n return {\n stdout: result,\n stderr: '',\n exitCode: 0,\n success: true,\n output: result\n };\n } catch (error) {\n this.logger.error(`Error running program in OpenCode:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n async getAvailableModels(): Promise<string[]> {\n // OpenCode 目前支持通过 CLI 使用的模型\n return [\n 'claude-3-5-sonnet-20241022',\n 'claude-3-opus-20240229',\n 'claude-3-haiku-20240307'\n ];\n }\n\n async executeAI(prompt: string): Promise<{ content: string; model?: string }> {\n const content = await this.getAIResponse(prompt);\n return { content, model: 'claude-3-5-sonnet' };\n }\n}","/**\n * Claude Code 适配器\n * Claude Code是Anthropic的CLI工具\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { execa } from 'execa';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport class ClaudeCodeAdapter extends BaseIDEAdapter {\n readonly type = 'claude';\n private claudePath: string | null = null;\n \n protected checkAvailabilitySync(): boolean {\n // 检查Claude Code环境变量\n if (process.env.CLAUDE_CODE_SESSION) {\n return true;\n }\n \n // 尝试查找claude CLI\n this.claudePath = this.findClaudeExecutable();\n return !!this.claudePath;\n }\n \n private findClaudeExecutable(): string | null {\n const platform = os.platform();\n \n // 尝试直接调用claude命令\n try {\n const result = execa.sync('claude', ['--version'], { reject: false });\n if (result.exitCode === 0) {\n return 'claude';\n }\n } catch {\n // 未找到\n }\n \n // 查找常见安装路径\n const possiblePaths: string[] = [];\n \n if (platform === 'darwin') {\n possiblePaths.push(\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n path.join(os.homedir(), '.local/bin/claude')\n );\n } else if (platform === 'win32') {\n possiblePaths.push(\n path.join(os.homedir(), 'AppData', 'Local', 'Programs', 'claude', 'claude.exe'),\n 'C:\\\\Program Files\\\\Claude\\\\claude.exe'\n );\n } else {\n possiblePaths.push(\n '/usr/bin/claude',\n '/usr/local/bin/claude',\n path.join(os.homedir(), '.local/bin/claude'),\n path.join(os.homedir(), '.npm-global/bin/claude')\n );\n }\n \n for (const p of possiblePaths) {\n if (fs.existsSync(p)) {\n return p;\n }\n }\n \n return null;\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Claude Code: ${command}`);\n \n // 尝试使用Claude CLI\n if (this.claudePath) {\n try {\n // Claude Code支持命令行参数\n const result = await execa(this.claudePath, [\n 'execute',\n '--command', command\n ], {\n timeout: 30000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed) {\n return result.stdout || 'Command executed successfully';\n }\n } catch (cliError) {\n this.logger.debug('Claude CLI failed, trying file system method');\n }\n }\n \n // 备用:文件系统通信\n return await this.sendViaFileSystem(command, context);\n \n } catch (error) {\n this.logger.error(`Error executing Claude Code command:`, error);\n throw new Error(`Claude Code command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async sendViaFileSystem(command: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'claude');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `cmd_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'command',\n command,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n // 等待响应\n const maxWait = 30000;\n const checkInterval = 500;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `Command queued for Claude Code. File: ${instructionFile}`;\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Claude Code for prompt: ${prompt}`);\n \n // 尝试使用Claude CLI直接询问\n if (this.claudePath) {\n try {\n const result = await execa(this.claudePath, [\n 'ask',\n '--prompt', prompt\n ], {\n timeout: 60000,\n reject: false,\n cwd: context?.workspaceRoot\n });\n \n if (!result.failed && result.stdout) {\n return result.stdout;\n }\n } catch (cliError) {\n this.logger.debug('Claude ask CLI failed, using file system');\n }\n }\n \n // 文件系统方式\n return await this.sendAIRequestViaFileSystem(prompt, context);\n \n } catch (error) {\n this.logger.error(`Error getting Claude Code AI response:`, error);\n throw error;\n }\n }\n \n private async sendAIRequestViaFileSystem(prompt: string, context?: ExecutionContext): Promise<string> {\n const tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'claude');\n if (!fs.existsSync(tempDir)) {\n fs.mkdirSync(tempDir, { recursive: true });\n }\n \n const instructionFile = path.join(tempDir, `ai_${Date.now()}.json`);\n const responseFile = path.join(tempDir, `ai_resp_${Date.now()}.txt`);\n \n const instruction = {\n type: 'ai_request',\n prompt,\n context,\n timestamp: Date.now(),\n responseFile\n };\n \n fs.writeFileSync(instructionFile, JSON.stringify(instruction, null, 2));\n \n const maxWait = 120000; // AI可能需要更长时间\n const checkInterval = 1000;\n let waited = 0;\n \n while (waited < maxWait) {\n if (fs.existsSync(responseFile)) {\n const response = fs.readFileSync(responseFile, 'utf-8');\n try {\n fs.unlinkSync(instructionFile);\n fs.unlinkSync(responseFile);\n } catch {}\n return response;\n }\n await new Promise(resolve => setTimeout(resolve, checkInterval));\n waited += checkInterval;\n }\n \n try {\n fs.unlinkSync(instructionFile);\n } catch {}\n \n return `AI request queued. File: ${instructionFile}`;\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n const result = await execa.command(command, {\n cwd: cwd || process.cwd(),\n shell: true,\n timeout: 60000,\n reject: false\n });\n \n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode || 0,\n success: result.exitCode === 0,\n output: result.stdout,\n error: result.failed ? result.stderr : undefined\n };\n } catch (error) {\n this.logger.error(`Error running program in Claude Code:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","/**\n * Gemini CLI 适配器\n * Google Gemini命令行工具\n */\nimport { BaseIDEAdapter, ExecutionContext, CodeGenOptions, ExecutionResult } from './base';\nimport { spawn } from 'child_process';\nimport { execa } from 'execa';\n\nexport class GeminiCLIAdapter extends BaseIDEAdapter {\n readonly type = 'gemini';\n private cliPath: string = 'gcloud';\n \n protected checkAvailabilitySync(): boolean {\n try {\n const { execSync } = require('child_process');\n execSync('gcloud version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n \n async checkAvailability(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n\n async isInstalled(): Promise<boolean> {\n return this.checkAvailabilitySync();\n }\n \n async activate(): Promise<void> {\n const available = await this.checkAvailability();\n if (!available) {\n throw new Error(\n 'Gemini CLI未安装。请安装Google Cloud SDK: https://cloud.google.com/sdk/docs/install'\n );\n }\n }\n \n async sendCommand(command: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Sending command to Gemini CLI: ${command}`);\n \n // 使用gcloud ai models调用Gemini\n const result = await this.executeViaCLI(command, context);\n return result;\n \n } catch (error) {\n this.logger.error(`Error executing Gemini CLI command:`, error);\n throw new Error(`Gemini CLI command failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n \n private async executeViaCLI(prompt: string, context?: ExecutionContext): Promise<string> {\n return new Promise((resolve, reject) => {\n // 使用gcloud ai models generate-text\n const args = [\n 'ai', 'models', 'generate-text',\n '--model=gemini-1.5-pro',\n '--region=us-central1',\n '--format=json'\n ];\n \n const child = spawn(this.cliPath, args, {\n cwd: context?.workspaceRoot,\n env: process.env,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n \n let stdout = '';\n let stderr = '';\n \n child.stdout!.on('data', (data) => {\n stdout += data.toString();\n });\n \n child.stderr!.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`Gemini CLI退出码 ${code}: ${stderr}`));\n return;\n }\n \n try {\n // 解析JSON响应\n const response = JSON.parse(stdout);\n const text = response.candidates?.[0]?.content?.parts?.[0]?.text || \n response.text || \n stdout;\n resolve(text.trim());\n } catch {\n // 非JSON,直接返回\n resolve(stdout.trim());\n }\n });\n \n child.on('error', (err) => {\n reject(new Error(`启动Gemini CLI失败: ${err.message}`));\n });\n \n // 设置超时\n const timeout = setTimeout(() => {\n child.kill();\n reject(new Error('Gemini CLI执行超时(60秒)'));\n }, 60000);\n \n child.on('close', () => {\n clearTimeout(timeout);\n });\n \n // 发送prompt\n const input = JSON.stringify({ prompt: { text: prompt } });\n child.stdin!.write(input);\n child.stdin!.end();\n });\n }\n \n async getAIResponse(prompt: string, context?: ExecutionContext): Promise<string> {\n try {\n this.logger.info(`Getting AI response from Gemini: ${prompt.substring(0, 100)}...`);\n return await this.sendCommand(prompt, context);\n } catch (error) {\n this.logger.error(`Error getting Gemini AI response:`, error);\n throw error;\n }\n }\n \n async generateCode(description: string, options?: CodeGenOptions): Promise<string> {\n const fullPrompt = this.buildCodePrompt(description, options);\n return this.getAIResponse(fullPrompt);\n }\n \n async runProgram(command: string, cwd?: string): Promise<ExecutionResult> {\n try {\n // Gemini CLI不支持直接执行shell命令,返回错误\n return {\n stdout: '',\n stderr: 'Gemini CLI不支持执行shell命令,请使用其他工具(如OpenCode或Claude Code)',\n exitCode: 1,\n success: false,\n error: 'Not supported'\n };\n } catch (error) {\n this.logger.error(`Error in Gemini CLI:`, error);\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n \n /**\n * 获取Gemini CLI版本\n */\n async getVersion(): Promise<string> {\n try {\n const result = await execa(this.cliPath, ['version']);\n return result.stdout;\n } catch {\n return 'unknown';\n }\n }\n}\n","/**\n * 主桥接器,协调各模块\n */\nimport { FeishuWebhookHandler } from '../feishu/webhook';\nimport { FeishuWebSocketHandler } from '../feishu/websocket';\nimport { FeishuClient } from '../feishu/client';\nimport { CommandExecutor } from '../commands/executor';\nimport { SessionManager } from '../session/manager';\nimport { VSCodeAdapter } from '../adapters/vscode';\nimport { CursorAdapter } from '../adapters/cursor';\nimport { TraeAdapter } from '../adapters/trae';\nimport { AntigravityAdapter } from '../adapters/antigravity';\nimport { KiroAdapter } from '../adapters/kiro';\nimport { OpenCodeAdapter } from '../adapters/opencode';\nimport { ClaudeCodeAdapter } from '../adapters/claude-code';\nimport { GeminiCLIAdapter } from '../adapters/gemini-cli';\nimport { ConfigManager } from './config';\nimport { HealthMonitor } from './health';\nimport { logger } from './logger';\nimport { ReverseChannel } from './reverse-channel';\nimport { SkillRegistry, initializeSkills } from '../skills';\nimport Fastify, { FastifyInstance } from 'fastify';\n\nexport class FeishuBridge {\n private server: FastifyInstance;\n private feishuClient: FeishuClient;\n private webhookHandler: FeishuWebhookHandler;\n private wsHandler: FeishuWebSocketHandler | null = null;\n private commandExecutor: CommandExecutor;\n private sessionManager: SessionManager;\n private healthMonitor: HealthMonitor | null = null;\n private reverseChannel: ReverseChannel | null = null;\n private adapters: Map<string, any> = new Map();\n private skillRegistry: SkillRegistry;\n\n constructor() {\n this.server = Fastify({\n logger: false // 使用我们自己的日志系统\n });\n\n const config = ConfigManager.getInstance().get();\n this.feishuClient = new FeishuClient(config.feishu);\n this.sessionManager = new SessionManager(config.behavior.sessionTimeout);\n\n // 初始化反向通信通道\n this.reverseChannel = new ReverseChannel(this.feishuClient);\n\n // 初始化适配器\n this.initAdapters();\n\n // 初始化技能系统\n this.skillRegistry = new SkillRegistry();\n initializeSkills(\n this.skillRegistry,\n this.feishuClient,\n (name: string) => this.adapters.get(name)\n );\n\n this.commandExecutor = new CommandExecutor(\n this.adapters,\n this.sessionManager\n );\n\n this.webhookHandler = new FeishuWebhookHandler(\n this.feishuClient,\n this.commandExecutor\n );\n }\n\n private initAdapters(): void {\n const config = ConfigManager.getInstance().get();\n\n // 注册VSCode适配器\n if (config.adapters.vscode?.enabled) {\n const adapter = new VSCodeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('vscode', adapter);\n }\n\n // 注册Cursor适配器\n if (config.adapters.cursor?.enabled) {\n const adapter = new CursorAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('cursor', adapter);\n }\n\n // 注册Trae适配器\n if (config.adapters.trae?.enabled) {\n const adapter = new TraeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('trae', adapter);\n }\n\n // 注册Antigravity适配器\n if (config.adapters.antigravity?.enabled) {\n const adapter = new AntigravityAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('antigravity', adapter);\n }\n\n // 注册Kiro适配器\n if (config.adapters.kiro?.enabled) {\n const adapter = new KiroAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('kiro', adapter);\n }\n\n // 注册OpenCode适配器\n if (config.adapters.opencode?.enabled) {\n const adapter = new OpenCodeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('opencode', adapter);\n }\n\n // 注册Claude Code适配器\n if (config.adapters['claude-code']?.enabled) {\n const adapter = new ClaudeCodeAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('claude', adapter);\n }\n\n // 注册Gemini CLI适配器\n if (config.adapters['gemini']?.enabled) {\n const adapter = new GeminiCLIAdapter();\n if (this.reverseChannel) adapter.setReverseChannel(this.reverseChannel);\n this.adapters.set('gemini', adapter);\n }\n }\n\n public async start(): Promise<void> {\n const config = ConfigManager.getInstance().get();\n const serverConfig = config.server;\n\n // 启动反向通信通道\n if (this.reverseChannel) {\n this.reverseChannel.start();\n logger.info('Reverse communication channel started');\n }\n\n // 初始化健康监控(仅在webhook模式下)\n if (config.feishu.connectionMode !== 'websocket') {\n this.healthMonitor = new HealthMonitor(\n this.server,\n this.sessionManager,\n this.adapters\n );\n }\n \n // 根据连接模式启动不同的服务\n if (config.feishu.connectionMode === 'websocket') {\n // WebSocket模式\n logger.info('Starting in WebSocket mode...');\n this.wsHandler = new FeishuWebSocketHandler(\n this.feishuClient,\n this.commandExecutor,\n this.adapters\n );\n await this.wsHandler.start();\n logger.info('WebSocket connection established');\n } else {\n // Webhook模式(默认)\n logger.info('Starting in Webhook mode...');\n \n // 注册webhook路由\n this.server.post(serverConfig.webhookPath, async (request, reply) => {\n await this.webhookHandler.handleWebhook(request, reply);\n });\n \n // 启动服务器\n try {\n const address = await this.server.listen({\n port: serverConfig.port,\n host: serverConfig.host\n });\n \n logger.info(`Feishu Bridge server running on ${address}`);\n logger.info(`Webhook endpoint: ${serverConfig.webhookPath}`);\n logger.info(`Health check endpoint: /health`);\n logger.info(`Metrics endpoint: /metrics`);\n } catch (err) {\n logger.error(err instanceof Error ? err : String(err));\n process.exit(1);\n }\n }\n }\n\n public async stop(): Promise<void> {\n // 停止反向通信通道\n if (this.reverseChannel) {\n this.reverseChannel.stop();\n logger.info('Reverse communication channel stopped');\n }\n\n // 停止WebSocket连接\n if (this.wsHandler) {\n await this.wsHandler.stop();\n this.wsHandler = null;\n }\n\n // 停止HTTP服务器\n await this.server.close();\n logger.info('Feishu Bridge server stopped');\n }\n\n public getAdapter(adapterName: string) {\n return this.adapters.get(adapterName);\n }\n\n public getAdapters(): Map<string, any> {\n return this.adapters;\n }\n}","/**\n * 健康检查和监控模块\n */\nimport { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { SessionManager } from '../session/manager';\nimport { ConfigManager } from './config';\n\ninterface HealthStatus {\n status: 'healthy' | 'unhealthy' | 'degraded';\n timestamp: string;\n version: string;\n checks: {\n feishu: {\n status: 'ok' | 'error';\n message?: string;\n };\n adapters: {\n status: 'ok' | 'error';\n available: number;\n total: number;\n details: Record<string, boolean>;\n };\n session: {\n status: 'ok';\n activeSessions: number;\n };\n };\n}\n\ninterface MetricsData {\n timestamp: string;\n uptime: number;\n memory: {\n used: number;\n total: number;\n external: number;\n };\n sessions: {\n active: number;\n total: number;\n };\n requests: {\n total: number;\n successful: number;\n failed: number;\n };\n adapters: Record<string, {\n available: boolean;\n lastCheck: string;\n }>;\n}\n\nexport class HealthMonitor {\n private startTime: number;\n private requestCount = { total: 0, successful: 0, failed: 0 };\n\n constructor(\n private server: FastifyInstance,\n private sessionManager: SessionManager,\n private adapters: Map<string, any>\n ) {\n this.startTime = Date.now();\n this.setupRoutes();\n }\n\n /**\n * 设置健康检查路由\n */\n private setupRoutes(): void {\n // 健康检查端点\n this.server.get('/health', this.handleHealth.bind(this));\n \n // 就绪检查端点\n this.server.get('/health/ready', this.handleReadiness.bind(this));\n \n // 存活检查端点\n this.server.get('/health/live', this.handleLiveness.bind(this));\n \n // Prometheus格式指标\n this.server.get('/metrics', this.handleMetrics.bind(this));\n }\n\n /**\n * 处理健康检查请求\n */\n private async handleHealth(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const status = await this.getHealthStatus();\n const statusCode = status.status === 'healthy' ? 200 : \n status.status === 'degraded' ? 200 : 503;\n \n reply.status(statusCode).send(status);\n }\n\n /**\n * 处理就绪检查\n */\n private async handleReadiness(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const config = ConfigManager.getInstance().get();\n \n // 检查基本配置是否就绪\n const isReady = config.feishu.appId && config.feishu.appSecret;\n \n if (isReady) {\n reply.status(200).send({\n ready: true,\n timestamp: new Date().toISOString()\n });\n } else {\n reply.status(503).send({\n ready: false,\n message: 'Configuration incomplete',\n timestamp: new Date().toISOString()\n });\n }\n }\n\n /**\n * 处理存活检查\n */\n private async handleLiveness(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n reply.status(200).send({\n alive: true,\n uptime: process.uptime(),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * 处理指标请求\n */\n private async handleMetrics(\n _request: FastifyRequest,\n reply: FastifyReply\n ): Promise<void> {\n const metrics = await this.getMetrics();\n const prometheusFormat = this.toPrometheusFormat(metrics);\n \n reply\n .header('Content-Type', 'text/plain; version=0.0.4')\n .send(prometheusFormat);\n }\n\n /**\n * 获取健康状态\n */\n private async getHealthStatus(): Promise<HealthStatus> {\n const config = ConfigManager.getInstance().get();\n const adapterStatuses: Record<string, boolean> = {};\n let availableAdapters = 0;\n\n // 检查各适配器状态\n for (const [name, adapter] of this.adapters) {\n try {\n const isAvailable = await adapter.checkAvailability();\n adapterStatuses[name] = isAvailable;\n if (isAvailable) availableAdapters++;\n } catch (error) {\n adapterStatuses[name] = false;\n }\n }\n\n const totalAdapters = this.adapters.size;\n const feishuConfigured = !!(config.feishu.appId && config.feishu.appSecret);\n \n // 确定整体状态\n let status: HealthStatus['status'] = 'healthy';\n if (!feishuConfigured) {\n status = 'unhealthy';\n } else if (availableAdapters === 0 && totalAdapters > 0) {\n status = 'degraded';\n }\n\n return {\n status,\n timestamp: new Date().toISOString(),\n version: process.env.npm_package_version || '1.0.0',\n checks: {\n feishu: {\n status: feishuConfigured ? 'ok' : 'error',\n message: feishuConfigured ? undefined : 'App ID or Secret not configured'\n },\n adapters: {\n status: availableAdapters > 0 ? 'ok' : 'error',\n available: availableAdapters,\n total: totalAdapters,\n details: adapterStatuses\n },\n session: {\n status: 'ok',\n activeSessions: this.sessionManager.getActiveSessionCount()\n }\n }\n };\n }\n\n /**\n * 获取指标数据\n */\n private async getMetrics(): Promise<MetricsData> {\n const memUsage = process.memoryUsage();\n const adapterMetrics: Record<string, { available: boolean; lastCheck: string }> = {};\n\n for (const [name, adapter] of this.adapters) {\n try {\n const isAvailable = await adapter.checkAvailability();\n adapterMetrics[name] = {\n available: isAvailable,\n lastCheck: new Date().toISOString()\n };\n } catch (error) {\n adapterMetrics[name] = {\n available: false,\n lastCheck: new Date().toISOString()\n };\n }\n }\n\n return {\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n memory: {\n used: Math.round(memUsage.heapUsed / 1024 / 1024), // MB\n total: Math.round(memUsage.heapTotal / 1024 / 1024),\n external: Math.round(memUsage.external / 1024 / 1024)\n },\n sessions: {\n active: this.sessionManager.getActiveSessionCount(),\n total: 0 // 可以通过SessionManager扩展获取\n },\n requests: { ...this.requestCount },\n adapters: adapterMetrics\n };\n }\n\n /**\n * 转换为Prometheus格式\n */\n private toPrometheusFormat(metrics: MetricsData): string {\n const lines: string[] = [];\n \n // Uptime\n lines.push('# HELP feishu_bridge_uptime_seconds Process uptime in seconds');\n lines.push('# TYPE feishu_bridge_uptime_seconds gauge');\n lines.push(`feishu_bridge_uptime_seconds ${metrics.uptime}`);\n \n // Memory\n lines.push('# HELP feishu_bridge_memory_usage_mb Memory usage in MB');\n lines.push('# TYPE feishu_bridge_memory_usage_mb gauge');\n lines.push(`feishu_bridge_memory_usage_mb{type=\"used\"} ${metrics.memory.used}`);\n lines.push(`feishu_bridge_memory_usage_mb{type=\"total\"} ${metrics.memory.total}`);\n lines.push(`feishu_bridge_memory_usage_mb{type=\"external\"} ${metrics.memory.external}`);\n \n // Sessions\n lines.push('# HELP feishu_bridge_active_sessions Number of active sessions');\n lines.push('# TYPE feishu_bridge_active_sessions gauge');\n lines.push(`feishu_bridge_active_sessions ${metrics.sessions.active}`);\n \n // Requests\n lines.push('# HELP feishu_bridge_requests_total Total number of requests');\n lines.push('# TYPE feishu_bridge_requests_total counter');\n lines.push(`feishu_bridge_requests_total ${metrics.requests.total}`);\n \n lines.push('# HELP feishu_bridge_requests_successful Total successful requests');\n lines.push('# TYPE feishu_bridge_requests_successful counter');\n lines.push(`feishu_bridge_requests_successful ${metrics.requests.successful}`);\n \n lines.push('# HELP feishu_bridge_requests_failed Total failed requests');\n lines.push('# TYPE feishu_bridge_requests_failed counter');\n lines.push(`feishu_bridge_requests_failed ${metrics.requests.failed}`);\n \n // Adapter availability\n lines.push('# HELP feishu_bridge_adapter_available Adapter availability (1=available, 0=unavailable)');\n lines.push('# TYPE feishu_bridge_adapter_available gauge');\n \n for (const [name, data] of Object.entries(metrics.adapters)) {\n const value = data.available ? 1 : 0;\n lines.push(`feishu_bridge_adapter_available{name=\"${name}\"} ${value}`);\n }\n \n return lines.join('\\n');\n }\n\n /**\n * 记录请求\n */\n public recordRequest(success: boolean): void {\n this.requestCount.total++;\n if (success) {\n this.requestCount.successful++;\n } else {\n this.requestCount.failed++;\n }\n }\n}\n","/**\n * 双向通信管理器\n * 支持从IDE/CLI主动向飞书推送消息\n */\n\nimport { FeishuClient } from '../feishu/client';\nimport { ConfigManager } from './config';\nimport { logger } from './logger';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { EventEmitter } from 'events';\n\nexport interface ReverseMessage {\n type: 'message' | 'notification' | 'status' | 'result';\n content: string;\n chatId?: string;\n senderId?: string;\n metadata?: Record<string, any>;\n timestamp: number;\n}\n\nexport interface ReverseChannelConfig {\n enabled: boolean;\n mode: 'websocket' | 'filesystem' | 'http';\n checkInterval: number;\n maxMessageAge: number;\n}\n\n/**\n * 反向通信通道\n * 允许IDE/CLI适配器主动向飞书发送消息\n */\nexport class ReverseChannel extends EventEmitter {\n private config: ReverseChannelConfig;\n private feishuClient: FeishuClient;\n private isRunning = false;\n private checkInterval: NodeJS.Timeout | null = null;\n private messageQueue: ReverseMessage[] = [];\n private tempDir: string;\n\n constructor(feishuClient: FeishuClient) {\n super();\n this.feishuClient = feishuClient;\n \n const bridgeConfig = ConfigManager.getInstance().get();\n this.config = {\n enabled: bridgeConfig.behavior?.reverseChannelEnabled ?? true,\n mode: bridgeConfig.behavior?.reverseChannelMode ?? 'filesystem',\n checkInterval: 1000, // 1秒检查一次\n maxMessageAge: 5 * 60 * 1000 // 5分钟过期\n };\n \n this.tempDir = path.join(os.tmpdir(), 'feishu-bridge', 'reverse-channel');\n this.ensureTempDir();\n }\n\n /**\n * 启动反向通信通道\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) {\n return;\n }\n\n this.isRunning = true;\n logger.info('Starting reverse communication channel...');\n\n // 根据模式启动不同的监听机制\n switch (this.config.mode) {\n case 'filesystem':\n this.startFileSystemListener();\n break;\n case 'websocket':\n this.startWebSocketListener();\n break;\n case 'http':\n this.startHttpListener();\n break;\n }\n\n // 启动消息队列处理器\n this.startMessageQueueProcessor();\n }\n\n /**\n * 停止反向通信通道\n */\n stop(): void {\n if (!this.isRunning) {\n return;\n }\n\n this.isRunning = false;\n logger.info('Stopping reverse communication channel...');\n\n if (this.checkInterval) {\n clearInterval(this.checkInterval);\n this.checkInterval = null;\n }\n }\n\n /**\n * 发送消息到飞书(供适配器调用)\n */\n async sendToFeishu(message: ReverseMessage): Promise<boolean> {\n try {\n // 添加到消息队列\n this.messageQueue.push(message);\n this.emit('messageQueued', message);\n return true;\n } catch (error) {\n logger.error('Error queuing message to Feishu:', error);\n return false;\n }\n }\n\n /**\n * 发送文件系统消息(供IDE写入文件后调用)\n */\n async sendFileSystemMessage(\n adapterType: string,\n content: string,\n chatId?: string\n ): Promise<void> {\n const message: ReverseMessage = {\n type: 'message',\n content,\n chatId,\n timestamp: Date.now()\n };\n\n const messageFile = path.join(\n this.tempDir,\n `${adapterType}_msg_${Date.now()}.json`\n );\n\n fs.writeFileSync(messageFile, JSON.stringify(message, null, 2));\n logger.debug(`File system message written: ${messageFile}`);\n }\n\n private ensureTempDir(): void {\n if (!fs.existsSync(this.tempDir)) {\n fs.mkdirSync(this.tempDir, { recursive: true });\n }\n }\n\n private startFileSystemListener(): void {\n logger.info('Starting file system listener for reverse channel...');\n\n this.checkInterval = setInterval(() => {\n this.processFileSystemMessages();\n }, this.config.checkInterval);\n }\n\n private processFileSystemMessages(): void {\n if (!fs.existsSync(this.tempDir)) {\n return;\n }\n\n try {\n const files = fs.readdirSync(this.tempDir);\n const now = Date.now();\n\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n\n const filePath = path.join(this.tempDir, file);\n \n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const message: ReverseMessage = JSON.parse(content);\n\n // 检查消息是否过期\n if (now - message.timestamp > this.config.maxMessageAge) {\n fs.unlinkSync(filePath);\n continue;\n }\n\n // 添加到队列\n this.messageQueue.push(message);\n \n // 删除已处理的消息文件\n fs.unlinkSync(filePath);\n \n logger.debug(`Processed file system message: ${file}`);\n } catch (error) {\n logger.error(`Error processing message file ${file}:`, error);\n // 删除损坏的文件\n try {\n fs.unlinkSync(filePath);\n } catch {}\n }\n }\n } catch (error) {\n logger.error('Error reading message directory:', error);\n }\n }\n\n private startWebSocketListener(): void {\n // WebSocket模式:通过WebSocket连接接收消息\n logger.info('WebSocket reverse channel not yet implemented, falling back to file system');\n this.startFileSystemListener();\n }\n\n private startHttpListener(): void {\n // HTTP模式:通过HTTP端点接收消息\n logger.info('HTTP reverse channel not yet implemented, falling back to file system');\n this.startFileSystemListener();\n }\n\n private startMessageQueueProcessor(): void {\n // 定期处理消息队列\n setInterval(async () => {\n await this.processMessageQueue();\n }, 500); // 每500ms处理一次队列\n }\n\n private async processMessageQueue(): Promise<void> {\n if (this.messageQueue.length === 0) {\n return;\n }\n\n const messagesToProcess = [...this.messageQueue];\n this.messageQueue = [];\n\n for (const message of messagesToProcess) {\n try {\n await this.deliverMessageToFeishu(message);\n this.emit('messageDelivered', message);\n } catch (error) {\n logger.error('Error delivering message to Feishu:', error);\n // 重新入队稍后重试(最多3次)\n if (!(message as any).retryCount || (message as any).retryCount < 3) {\n (message as any).retryCount = ((message as any).retryCount || 0) + 1;\n this.messageQueue.push(message);\n }\n }\n }\n }\n\n private async deliverMessageToFeishu(message: ReverseMessage): Promise<void> {\n const { type, content, chatId, metadata } = message;\n\n if (!chatId) {\n logger.warn('No chatId specified for message, cannot deliver');\n return;\n }\n\n // 格式化消息\n let formattedContent = content;\n \n switch (type) {\n case 'notification':\n formattedContent = `🔔 ${content}`;\n break;\n case 'status':\n formattedContent = `📊 ${content}`;\n break;\n case 'result':\n formattedContent = `✅ ${content}`;\n break;\n default:\n formattedContent = content;\n }\n\n // 截断过长消息\n const maxLength = 2000;\n if (formattedContent.length > maxLength) {\n formattedContent = formattedContent.substring(0, maxLength) + '\\n...(truncated)';\n }\n\n // 发送到飞书\n await this.feishuClient.sendMessage(chatId, {\n msg_type: 'text',\n content: {\n text: formattedContent\n }\n });\n\n logger.info(`Message delivered to Feishu chat ${chatId}`);\n }\n\n isActive(): boolean {\n return this.isRunning;\n }\n\n getQueueSize(): number {\n return this.messageQueue.length;\n }\n}\n","/**\n * 飞书操作技能集\n * 让AI能够操作用户的飞书应用\n */\nimport { Skill, SkillContext, SkillResult } from '../registry';\nimport { FeishuClient } from '../../feishu/client';\n\nexport class FeishuSkills {\n private client: FeishuClient;\n\n constructor(client: FeishuClient) {\n this.client = client;\n }\n\n /**\n * 发送消息技能\n */\n sendMessageSkill(): Skill {\n return {\n name: 'feishu.sendMessage',\n description: '发送消息到指定会话',\n trigger: /发送消息|发信息/,\n riskLevel: 'low',\n examples: [\n '发送消息给张三:下午开会',\n '发信息到测试群:项目已部署'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const { target, content } = this.parseMessageArgs(context.message);\n \n // TODO: 需要实现通过用户ID获取chatId\n // 这里简化处理,直接回复到当前会话\n await this.client.sendMessage(context.chatId, {\n msg_type: 'text',\n content: { text: content }\n });\n\n return {\n success: true,\n content: '✅ 消息已发送'\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 发送失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 创建日程技能\n */\n createEventSkill(): Skill {\n return {\n name: 'feishu.createEvent',\n description: '在飞书日历创建日程',\n trigger: /创建日程|创建会议|添加日程/,\n riskLevel: 'medium',\n examples: [\n '创建日程:明天下午3点团队周会',\n '添加日程:周五18:00项目评审'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const { title, startTime, attendees } = this.parseEventArgs(context.message);\n \n // TODO: 调用飞书日历API\n // 这里先返回模拟结果\n \n return {\n success: true,\n content: `✅ 日程已创建\\n\\n标题: ${title}\\n时间: ${startTime}\\n参与者: ${attendees.join(', ') || '无'}`,\n actions: [\n { label: '查看日程', action: 'view_calendar' },\n { label: '编辑', action: 'edit_event' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 创建失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 创建文档技能\n */\n createDocSkill(): Skill {\n return {\n name: 'feishu.createDoc',\n description: '创建飞书云文档',\n trigger: /创建文档|新建文档/,\n riskLevel: 'low',\n examples: [\n '创建文档:项目需求文档',\n '新建文档:会议纪要'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const { title, content, folder } = this.parseDocArgs(context.message);\n \n // TODO: 调用飞书文档API\n \n return {\n success: true,\n content: `✅ 文档已创建\\n\\n标题: ${title}\\n位置: ${folder || '我的空间'}`,\n actions: [\n { label: '打开文档', action: 'open_doc' },\n { label: '分享', action: 'share_doc' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 创建失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 上传文件技能\n */\n uploadFileSkill(): Skill {\n return {\n name: 'feishu.uploadFile',\n description: '上传文件到飞书',\n trigger: /上传文件|发送文件/,\n riskLevel: 'low',\n execute: async (context: SkillContext): Promise<SkillResult> => {\n return {\n success: true,\n content: '📎 文件上传功能开发中'\n };\n }\n };\n }\n\n /**\n * 创建群公告技能\n */\n createAnnouncementSkill(): Skill {\n return {\n name: 'feishu.createAnnouncement',\n description: '发送群公告',\n trigger: /发送公告|群公告/,\n riskLevel: 'medium',\n requireConfirm: true,\n execute: async (context: SkillContext): Promise<SkillResult> => {\n return {\n success: true,\n content: '📢 公告功能开发中'\n };\n }\n };\n }\n\n // 辅助方法\n private parseMessageArgs(message: string): { target: string; content: string } {\n // 简单解析:提取\"给xxx:内容\"格式\n const match = message.match(/给(.+?):(.+)/);\n if (match) {\n return { target: match[1], content: match[2] };\n }\n return { target: 'current', content: message };\n }\n\n private parseEventArgs(message: string): { title: string; startTime: string; attendees: string[] } {\n // 提取日程信息(简化版)\n const titleMatch = message.match(/日程[::]\\s*(.+?)(?=\\s|$)/);\n const timeMatch = message.match(/(明天|今天|后天|\\d{1,2}点|\\d{1,2}:\\d{2})/);\n \n return {\n title: titleMatch ? titleMatch[1] : '新日程',\n startTime: timeMatch ? timeMatch[1] : '未指定时间',\n attendees: []\n };\n }\n\n private parseDocArgs(message: string): { title: string; content: string; folder?: string } {\n const match = message.match(/文档[::]\\s*(.+?)(?=\\s|$)/);\n return {\n title: match ? match[1] : '未命名文档',\n content: ''\n };\n }\n\n /**\n * 获取所有飞书技能\n */\n getAllSkills(): Skill[] {\n return [\n this.sendMessageSkill(),\n this.createEventSkill(),\n this.createDocSkill(),\n this.uploadFileSkill(),\n this.createAnnouncementSkill()\n ];\n }\n}\n","/**\n * 代码操作技能集\n */\nimport { Skill, SkillContext, SkillResult } from '../registry';\nimport { BaseIDEAdapter } from '../../adapters/base';\n\nexport class CodeSkills {\n private getAdapter: (name: string) => BaseIDEAdapter | undefined;\n\n constructor(getAdapter: (name: string) => BaseIDEAdapter | undefined) {\n this.getAdapter = getAdapter;\n }\n\n /**\n * 代码生成技能\n */\n generateCodeSkill(): Skill {\n return {\n name: 'code.generate',\n description: '根据描述生成代码',\n trigger: /生成代码|写代码|create code|generate code/,\n riskLevel: 'low',\n examples: [\n '生成代码:一个快速排序函数',\n '写一个React按钮组件'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const description = this.extractDescription(context.message);\n const code = await adapter.generateCode(description, {\n language: context.args.language,\n framework: context.args.framework\n });\n\n return {\n success: true,\n content: `✅ 代码生成完成\\n\\n\\`\\`\\`\\n${code}\\n\\`\\`\\``,\n actions: [\n { label: '复制代码', action: 'copy_code', data: code },\n { label: '插入文件', action: 'insert_file', data: code }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 生成失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 代码审查技能\n */\n reviewCodeSkill(): Skill {\n return {\n name: 'code.review',\n description: '审查代码并提供建议',\n trigger: /审查代码|code review|检查代码/,\n riskLevel: 'low',\n examples: [\n '审查src/utils.ts文件',\n '检查这段代码:function add(a,b){return a+b}'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const filePath = this.extractFilePath(context.message);\n let code: string;\n\n if (filePath) {\n // 读取文件\n code = await adapter.sendCommand(`read ${filePath}`);\n } else {\n // 从消息中提取代码\n code = this.extractCodeFromMessage(context.message);\n }\n\n const review = await adapter.getAIResponse(\n `请审查以下代码,指出问题并提供改进建议:\\n\\n${code}`\n );\n\n return {\n success: true,\n content: `📋 代码审查报告\\n\\n${review}`,\n actions: [\n { label: '应用建议', action: 'apply_suggestions' },\n { label: '忽略', action: 'dismiss' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 审查失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 重构代码技能\n */\n refactorCodeSkill(): Skill {\n return {\n name: 'code.refactor',\n description: '重构代码以提高质量',\n trigger: /重构|refactor|优化代码/,\n riskLevel: 'medium',\n examples: [\n '重构src/utils.ts文件',\n '优化这段代码的性能'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const filePath = this.extractFilePath(context.message);\n \n if (!filePath) {\n return {\n success: false,\n content: '❌ 请指定要重构的文件路径'\n };\n }\n\n // 读取文件\n const code = await adapter.sendCommand(`read ${filePath}`);\n \n // 重构\n const refactored = await adapter.getAIResponse(\n `请重构以下代码,提高可读性和性能:\\n\\n${code}`\n );\n\n return {\n success: true,\n content: `✅ 重构完成\\n\\n文件: ${filePath}\\n\\n修改建议:\\n${refactored}`,\n actions: [\n { label: '应用重构', action: 'apply_refactor', data: { filePath, code: refactored } },\n { label: '查看Diff', action: 'view_diff' },\n { label: '取消', action: 'cancel' }\n ]\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 重构失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 运行测试技能\n */\n runTestsSkill(): Skill {\n return {\n name: 'code.runTests',\n description: '运行项目测试',\n trigger: /运行测试|run test|测试代码/,\n riskLevel: 'low',\n examples: [\n '运行测试',\n '执行npm test'\n ],\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const result = await adapter.runProgram('npm test', context.workspace);\n\n if (result.success) {\n return {\n success: true,\n content: `✅ 测试通过\\n\\n\\`\\`\\`\\n${result.output}\\n\\`\\`\\``\n };\n } else {\n return {\n success: false,\n content: `❌ 测试失败\\n\\n错误:\\n${result.error || result.stderr}`,\n actions: [\n { label: '查看详情', action: 'view_test_details' },\n { label: '修复错误', action: 'fix_errors' }\n ]\n };\n }\n } catch (error) {\n return {\n success: false,\n content: `❌ 运行测试失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n /**\n * 解释代码技能\n */\n explainCodeSkill(): Skill {\n return {\n name: 'code.explain',\n description: '解释代码的功能和原理',\n trigger: /解释代码|explain code|这是什么意思/,\n riskLevel: 'low',\n execute: async (context: SkillContext): Promise<SkillResult> => {\n try {\n const adapter = this.getAdapter(context.args.tool || 'opencode');\n if (!adapter) {\n return {\n success: false,\n content: '❌ 未找到可用的代码工具'\n };\n }\n\n const code = this.extractCodeFromMessage(context.message);\n \n const explanation = await adapter.getAIResponse(\n `请详细解释以下代码的功能和工作原理:\\n\\n${code}`\n );\n\n return {\n success: true,\n content: `💡 代码解释\\n\\n${explanation}`\n };\n } catch (error) {\n return {\n success: false,\n content: `❌ 解释失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n };\n }\n\n // 辅助方法\n private extractDescription(message: string): string {\n const match = message.match(/(?:生成|写|create|generate).{0,5}(?:代码|code)?[::]\\s*(.+)/i);\n return match ? match[1] : message;\n }\n\n private extractFilePath(message: string): string | null {\n const match = message.match(/(\\/|\\w+\\/)[\\w\\/.-]+/);\n return match ? match[0] : null;\n }\n\n private extractCodeFromMessage(message: string): string {\n // 提取代码块或整段代码\n const codeBlockMatch = message.match(/```[\\w]*\\n([\\s\\S]+?)```/);\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n \n // 尝试提取引号内的内容\n const quoteMatch = message.match(/[\"'](.+?)[\"']/);\n if (quoteMatch) {\n return quoteMatch[1];\n }\n \n return message;\n }\n\n /**\n * 获取所有代码技能\n */\n getAllSkills(): Skill[] {\n return [\n this.generateCodeSkill(),\n this.reviewCodeSkill(),\n this.refactorCodeSkill(),\n this.runTestsSkill(),\n this.explainCodeSkill()\n ];\n }\n}\n","/**\n * 技能系统核心\n * 技能 = 可复用的原子能力单元\n */\nimport { Logger } from '../core/logger';\n\nexport interface SkillContext {\n userId: string;\n chatId: string;\n message: string;\n args: Record<string, any>;\n workspace?: string;\n}\n\nexport interface SkillResult {\n success: boolean;\n content: string;\n attachments?: any[];\n actions?: ActionButton[];\n}\n\nexport interface ActionButton {\n label: string;\n action: string;\n data?: any;\n}\n\nexport interface Skill {\n name: string;\n description: string;\n trigger: string | RegExp;\n examples?: string[];\n riskLevel: 'low' | 'medium' | 'high';\n requireConfirm?: boolean;\n execute: (context: SkillContext) => Promise<SkillResult>;\n}\n\nexport class SkillRegistry {\n private logger: Logger;\n private skills: Map<string, Skill> = new Map();\n\n constructor() {\n this.logger = new Logger();\n }\n\n /**\n * 注册技能\n */\n register(skill: Skill): void {\n this.skills.set(skill.name, skill);\n this.logger.info(`技能已注册: ${skill.name}`);\n }\n\n /**\n * 批量注册技能\n */\n registerMany(skills: Skill[]): void {\n for (const skill of skills) {\n this.register(skill);\n }\n }\n\n /**\n * 根据消息匹配技能\n */\n match(message: string): Skill | null {\n for (const [name, skill] of this.skills) {\n if (typeof skill.trigger === 'string') {\n if (message.includes(skill.trigger)) {\n return skill;\n }\n } else if (skill.trigger instanceof RegExp) {\n if (skill.trigger.test(message)) {\n return skill;\n }\n }\n }\n return null;\n }\n\n /**\n * 执行技能\n */\n async execute(skillName: string, context: SkillContext): Promise<SkillResult> {\n const skill = this.skills.get(skillName);\n if (!skill) {\n return {\n success: false,\n content: `未找到技能: ${skillName}`\n };\n }\n\n try {\n // 高危操作需要确认(可扩展)\n if (skill.requireConfirm && skill.riskLevel === 'high') {\n // TODO: 实现确认流程\n this.logger.info(`高危技能需要确认: ${skillName}`);\n }\n\n const result = await skill.execute(context);\n return result;\n } catch (error) {\n this.logger.error(`执行技能 ${skillName} 失败:`, error);\n return {\n success: false,\n content: `执行失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n\n /**\n * 获取所有技能列表\n */\n list(): Skill[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * 获取技能详情\n */\n get(name: string): Skill | undefined {\n return this.skills.get(name);\n }\n\n /**\n * 注销技能\n */\n unregister(name: string): void {\n this.skills.delete(name);\n this.logger.info(`技能已注销: ${name}`);\n }\n}\n","/**\n * 技能系统入口\n * 导出所有内置技能\n */\nimport { SkillRegistry } from './registry';\nimport { FeishuClient } from '../feishu/client';\nimport { FeishuSkills } from './builtin/feishu';\nimport { CodeSkills } from './builtin/code';\nimport { BaseIDEAdapter } from '../adapters/base';\n\n/**\n * 初始化所有内置技能\n */\nexport function initializeSkills(\n registry: SkillRegistry,\n feishuClient: FeishuClient,\n getAdapter: (name: string) => BaseIDEAdapter | undefined\n): void {\n // 注册飞书技能\n const feishuSkills = new FeishuSkills(feishuClient);\n registry.registerMany(feishuSkills.getAllSkills());\n\n // 注册代码技能\n const codeSkills = new CodeSkills(getAdapter);\n registry.registerMany(codeSkills.getAllSkills());\n\n console.log('✅ 技能系统初始化完成');\n}\n\n// 导出类型和类\nexport { SkillRegistry } from './registry';\nexport { Skill, SkillContext, SkillResult } from './registry';\nexport { FeishuSkills } from './builtin/feishu';\nexport { CodeSkills } from './builtin/code';\n"],"mappings":"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","names":["pino","import_child_process","fs","path","fs","os","path","platform","import_execa","fs","path","os","platform","import_execa","fs","path","os","platform","import_execa","fs","path","os","import_execa","fs","path","os","import_execa","fs","os","path","import_execa","fs","path","os","platform","import_child_process","import_execa","fs","path","os","Fastify","DaemonManager"]}
|