lark-coding-assistant 0.1.1 → 0.1.2
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/README.md +19 -0
- package/dist/cli.js +233 -21
- package/dist/cli.js.map +1 -1
- package/dist/daemon-entry.js +72 -18
- package/dist/daemon-entry.js.map +1 -1
- package/dist/hook-entry.js +23 -1
- package/dist/hook-entry.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/core/paths.ts","../src/core/store.ts","../src/core/model.ts","../src/core/atomic-json.ts","../src/platform/process.ts","../src/daemon/client.ts","../src/agents/resume.ts","../src/screen/detector.ts","../src/screen/normalize.ts","../src/screen/dialects.ts","../src/agents/stop-hook.ts","../src/agents/codex.ts","../src/agents/trae-cli.ts","../src/agents/claude-code.ts","../src/agents/types.ts","../src/agents/registry.ts","../src/daemon/lifecycle.ts","../src/lark/registration.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { access, readFile } from 'node:fs/promises';\nimport { spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport { registerApp } from '@larksuite/channel';\nimport qrcode from 'qrcode-terminal';\nimport { resolveAppPaths } from './core/paths.js';\nimport { AppStore } from './core/store.js';\nimport type { AppConfig, Tenant } from './core/model.js';\nimport { runFile } from './platform/process.js';\nimport { requestDaemon } from './daemon/client.js';\nimport { resolveResumeOption } from './agents/resume.js';\nimport { getAgentAdapter, isAgentId } from './agents/registry.js';\nimport type { AgentId, ResumeOptions } from './agents/types.js';\nimport { daemonInfo, startDaemonProcess, stopDaemonProcess } from './daemon/lifecycle.js';\nimport { registrationDomains } from './lark/registration.js';\n\nconst program = new Command();\nconst paths = resolveAppPaths();\nconst store = new AppStore(paths);\nconst packageInfo = JSON.parse(\n await readFile(new URL('../package.json', import.meta.url), 'utf8'),\n) as { version: string };\n\nprogram.name('lark-coding-assistant').version(packageInfo.version);\n\nprogram.command('init').description('Configure Feishu/Lark PersonalAgent').action(runInit);\nprogram.command('start')\n .option('-n, --name <name>', 'Session name', 'default')\n .option('--agent <agent>', 'Coding agent (codex, trae-cli, or claude-code)', parseAgentId, 'codex')\n .option('--cwd <path>', 'Coding agent working directory')\n .option('--resume [session-id]', 'Resume agent session; omit the ID to open the picker')\n .option('--resume-last', 'Resume the most recent agent session in this working directory')\n .option('--resume-all', 'Show all agent sessions in the resume picker')\n .action(runStart);\nprogram.command('attach').argument('[name]', 'Session name', 'default').description('Attach local terminal to coding-agent tmux session').action(runAttach);\nprogram.command('bind-code').description('Generate a new one-time Lark binding code').action(runBindCode);\nprogram.command('status').argument('[name]', 'Session name').description('Show daemon and session status').action(runStatus);\nprogram.command('stop').argument('[name]', 'Session name').description('Stop managed coding-agent/tmux session').action(runStop);\nprogram.command('logs').option('-n, --lines <count>', 'Number of lines', '100').action(runLogs);\nprogram.command('reset-owner').description('Clear persistent Lark owner').action(runResetOwner);\nconst daemonCommand = program.command('daemon').description('Manage the Lark bridge daemon');\ndaemonCommand.command('start').description('Start the bridge daemon').action(runDaemonStart);\ndaemonCommand.command('stop').description('Stop the bridge daemon without stopping coding-agent sessions').action(runDaemonStop);\ndaemonCommand.command('restart').description('Restart the bridge daemon without stopping coding-agent sessions').action(runDaemonRestart);\ndaemonCommand.command('status').description('Show bridge daemon status and version').action(runDaemonStatus);\n\nawait program.parseAsync();\n\nasync function runInit(): Promise<void> {\n await store.ensure();\n const tenantAnswer = await p.select({\n message: '选择平台',\n options: [\n { value: 'feishu', label: '飞书' },\n { value: 'lark', label: 'Lark' },\n ],\n });\n if (p.isCancel(tenantAnswer)) return p.cancel('已取消');\n const tenant = tenantAnswer as Tenant;\n\n p.log.info('请使用飞书/Lark 扫描下面的二维码,创建或选择 PersonalAgent。');\n const registration = await registerApp({\n ...registrationDomains,\n source: 'lark-coding-assistant',\n appPreset: {\n name: 'Coding Assistant',\n desc: 'Bridge local coding-agent tmux sessions to private chat',\n },\n addons: {\n scopes: { tenant: ['im:message', 'im:message:send_as_bot'] },\n events: { items: { tenant: ['im.message.receive_v1'] } },\n callbacks: { items: ['card.action.trigger'] },\n },\n onQRCodeReady: ({ url, expireIn }) => {\n qrcode.generate(url, { small: true }, (output) => console.log(output));\n console.log(`二维码 ${Math.ceil(expireIn / 60)} 分钟内有效。若终端无法扫码,请打开:\\n${url}\\n`);\n },\n onStatusChange: ({ status }) => {\n if (status === 'domain_switched') p.log.info('已识别账号域,等待完成应用确认…');\n },\n });\n const registeredTenant = registration.user_info?.tenant_brand ?? tenant;\n const config: AppConfig = {\n tenant: registeredTenant,\n appId: registration.client_id,\n tmuxBinary: 'tmux',\n agentBinaries: { codex: 'codex', 'trae-cli': 'trae-cli', 'claude-code': 'claude' },\n pollIntervalMs: 650,\n };\n const previousState = await store.loadState();\n const registeredOwnerOpenId = registration.user_info?.open_id;\n const ownerChanged = Boolean(\n registeredOwnerOpenId\n && previousState.ownerOpenId\n && registeredOwnerOpenId !== previousState.ownerOpenId,\n );\n await Promise.all([\n store.saveConfig(config),\n store.saveSecrets({\n appSecret: registration.client_secret,\n callbackSecret: randomBytes(32).toString('base64url'),\n }),\n store.saveState({\n ...previousState,\n ownerOpenId: registeredOwnerOpenId ?? previousState.ownerOpenId,\n boundChatId: ownerChanged ? undefined : previousState.boundChatId,\n autoBindDisabled: false,\n updatedAt: Date.now(),\n }),\n ]);\n p.outro('PersonalAgent 配置已保存。');\n}\n\ninterface StartOptions extends ResumeOptions {\n agent: AgentId;\n cwd?: string;\n name: string;\n}\n\nasync function runStart(options: StartOptions): Promise<void> {\n const cwd = resolve(options.cwd ?? process.cwd());\n const resume = resolveResumeOption(options);\n await access(cwd);\n await ensureInitialized();\n await preflight(options.agent);\n await ensureDaemon();\n const response = await requestDaemon(paths.socket, {\n method: 'start', cwd, sessionId: options.name, agent: options.agent, resume,\n });\n if (!response.ok) throw new Error(response.error);\n const value = response.value as StartSessionValue;\n if (value.binding.mode === 'reused') {\n console.log('\\n已自动沿用原有飞书/Lark 私聊绑定。\\n');\n } else if (value.binding.mode === 'awaiting-owner-message') {\n console.log('\\n打开飞书/Lark 私聊并直接发送消息即可自动连接,无需绑定码。\\n');\n } else {\n console.log(`\\n飞书/Lark 私聊绑定命令(${value.binding.expiresInSeconds / 60} 分钟有效):`);\n console.log(` /attach ${value.binding.bindCode}\\n`);\n }\n if (!value.active) {\n console.log(`飞书当前仍连接其它 session;发送 /use ${options.name} 后切换到本 session。\\n`);\n }\n await attachLocal(options.name);\n}\n\ninterface StartSessionValue {\n active: boolean;\n binding:\n | { mode: 'reused' }\n | { mode: 'awaiting-owner-message' }\n | { mode: 'code'; bindCode: string; expiresInSeconds: number };\n}\n\nasync function runAttach(name: string): Promise<void> {\n await attachLocal(name);\n}\n\nasync function runBindCode(): Promise<void> {\n await ensureInitialized();\n await ensureDaemon();\n const response = await requestDaemon(paths.socket, { method: 'bindCode' });\n if (!response.ok) throw new Error(response.error);\n const value = response.value as { bindCode: string; expiresInSeconds: number };\n console.log(`飞书/Lark 私聊绑定命令(${value.expiresInSeconds / 60} 分钟有效):`);\n console.log(`/attach ${value.bindCode}`);\n}\n\nasync function attachLocal(name: string): Promise<void> {\n const state = await store.loadState();\n const config = await store.loadConfig();\n const session = state.sessions?.[name];\n if (!session) throw new Error(`no managed session: ${name}`);\n if (!config) throw new Error('not initialized');\n const child = spawn(config.tmuxBinary, ['attach-session', '-t', `=${session.sessionName}`], { stdio: 'inherit' });\n const code = await new Promise<number | null>((resolveExit, reject) => {\n child.once('error', reject);\n child.once('exit', resolveExit);\n });\n if (code && code !== 0) process.exitCode = code;\n}\n\nasync function runStatus(name?: string): Promise<void> {\n try {\n const response = await requestDaemon(paths.socket, { method: 'status', sessionId: name });\n if (!response.ok) throw new Error(response.error);\n console.log(JSON.stringify(response.value, null, 2));\n } catch {\n const state = await store.loadState();\n console.log(JSON.stringify({ daemon: 'stopped', state }, null, 2));\n }\n}\n\nasync function runStop(name?: string): Promise<void> {\n const response = await requestDaemon(paths.socket, { method: 'stop', sessionId: name });\n if (!response.ok) throw new Error(response.error);\n console.log(`Coding-agent tmux session stopped${name ? `: ${name}` : '.'}`);\n}\n\nasync function runResetOwner(): Promise<void> {\n const response = await requestDaemon(paths.socket, { method: 'resetOwner' });\n if (!response.ok) throw new Error(response.error);\n console.log('Owner cleared.');\n}\n\nasync function runLogs(options: { lines: string }): Promise<void> {\n const count = Math.max(1, Math.min(1000, Number.parseInt(options.lines, 10) || 100));\n const content = await readFile(paths.logFile, 'utf8').catch(() => '');\n console.log(content.split('\\n').slice(-count).join('\\n'));\n}\n\nasync function runDaemonStart(): Promise<void> {\n await ensureInitialized();\n const before = await daemonInfo(paths);\n if (before?.version === packageInfo.version) {\n console.log(`Bridge daemon is already running (PID ${before.pid}, version ${before.version}).`);\n return;\n }\n if (before) await stopDaemonProcess(paths);\n const info = await startDaemonProcess(paths, daemonEntryPath());\n console.log(`Bridge daemon started (PID ${info.pid}, version ${info.version}).`);\n}\n\nasync function runDaemonStop(): Promise<void> {\n const stopped = await stopDaemonProcess(paths);\n console.log(stopped ? 'Bridge daemon stopped. Coding-agent/tmux sessions were preserved.' : 'Bridge daemon is not running.');\n}\n\nasync function runDaemonRestart(): Promise<void> {\n await ensureInitialized();\n await stopDaemonProcess(paths);\n const info = await startDaemonProcess(paths, daemonEntryPath());\n console.log(`Bridge daemon restarted (PID ${info.pid}, version ${info.version}). Coding-agent/tmux sessions were preserved.`);\n}\n\nasync function runDaemonStatus(): Promise<void> {\n const info = await daemonInfo(paths);\n if (!info) {\n console.log(`Bridge daemon: stopped\\nCLI version: ${packageInfo.version}`);\n return;\n }\n console.log([\n 'Bridge daemon: running',\n `PID: ${info.pid}`,\n `Daemon version: ${info.version}`,\n `CLI version: ${packageInfo.version}`,\n `Up to date: ${info.version === packageInfo.version ? 'yes' : 'no'}`,\n ].join('\\n'));\n}\n\nasync function ensureInitialized(): Promise<void> {\n if (!await store.loadConfig() || !await store.loadSecrets()) {\n throw new Error('not initialized; run lark-coding-assistant init first');\n }\n}\n\nasync function preflight(agentId: AgentId): Promise<void> {\n const config = (await store.loadConfig())!;\n const adapter = getAgentAdapter(agentId);\n await Promise.all([\n runFile(config.tmuxBinary, ['-V']),\n runFile(adapter.binary(config), [...adapter.versionArgs]),\n ]);\n}\n\nfunction parseAgentId(value: string): AgentId {\n if (!isAgentId(value)) throw new Error(`unsupported coding agent: ${value}`);\n return value;\n}\n\nasync function ensureDaemon(): Promise<void> {\n const info = await daemonInfo(paths);\n if (info?.version === packageInfo.version) return;\n if (info) {\n console.log(`检测到 bridge daemon 版本 ${info.version},正在更新到 ${packageInfo.version}…`);\n await stopDaemonProcess(paths);\n }\n await startDaemonProcess(paths, daemonEntryPath());\n}\n\nfunction daemonEntryPath(): string {\n return fileURLToPath(new URL('./daemon-entry.js', import.meta.url));\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface AppPaths {\n root: string;\n config: string;\n secrets: string;\n state: string;\n logsDir: string;\n logFile: string;\n runtimeDir: string;\n socket: string;\n pid: string;\n}\n\nexport function resolveAppPaths(root = process.env.LARK_CODING_ASSISTANT_HOME): AppPaths {\n const base = root || join(homedir(), '.lark-coding-assistant');\n return {\n root: base,\n config: join(base, 'config.json'),\n secrets: join(base, 'secrets.json'),\n state: join(base, 'state.json'),\n logsDir: join(base, 'logs'),\n logFile: join(base, 'logs', 'assistant.log'),\n runtimeDir: join(base, 'runtime'),\n socket: join(base, 'runtime', 'daemon.sock'),\n pid: join(base, 'runtime', 'daemon.pid'),\n };\n}\n","import { randomBytes, scryptSync, timingSafeEqual } from 'node:crypto';\nimport { chmod, mkdir } from 'node:fs/promises';\nimport type { AppConfig, AppSecrets, SessionState } from './model.js';\nimport { emptyState } from './model.js';\nimport type { AppPaths } from './paths.js';\nimport { readJson, writeJsonAtomic } from './atomic-json.js';\n\nexport class AppStore {\n constructor(readonly paths: AppPaths) {}\n\n async ensure(): Promise<void> {\n await mkdir(this.paths.root, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.logsDir, { recursive: true, mode: 0o700 });\n await Promise.all([\n chmod(this.paths.root, 0o700),\n chmod(this.paths.runtimeDir, 0o700),\n chmod(this.paths.logsDir, 0o700),\n ]);\n }\n\n loadConfig(): Promise<AppConfig | undefined> {\n return readJson<AppConfig>(this.paths.config);\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, config);\n }\n\n loadSecrets(): Promise<AppSecrets | undefined> {\n return readJson(this.paths.secrets);\n }\n\n saveSecrets(secrets: AppSecrets): Promise<void> {\n return writeJsonAtomic(this.paths.secrets, secrets);\n }\n\n async loadState(): Promise<SessionState> {\n return (await readJson<SessionState>(this.paths.state)) ?? emptyState();\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\nexport function createBindCode(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function hashBindCode(code: string): string {\n const salt = randomBytes(16);\n const digest = scryptSync(code, salt, 32);\n return `${salt.toString('base64url')}.${digest.toString('base64url')}`;\n}\n\nexport function verifyBindCode(code: string, encoded: string): boolean {\n const [saltText, digestText] = encoded.split('.');\n if (!saltText || !digestText) return false;\n const expected = Buffer.from(digestText, 'base64url');\n const actual = scryptSync(code, Buffer.from(saltText, 'base64url'), expected.length);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n","import type { AgentId } from '../agents/types.js';\n\nexport type Tenant = 'feishu' | 'lark';\n\nexport interface AppConfig {\n tenant: Tenant;\n appId: string;\n tmuxBinary: string;\n agentBinaries: Record<AgentId, string>;\n pollIntervalMs: number;\n}\n\nexport interface AppSecrets {\n appSecret: string;\n callbackSecret: string;\n}\n\nexport interface ManagedSession {\n id: string;\n agent: AgentId;\n sessionName: string;\n paneId: string;\n cwd: string;\n agentVersion: string;\n updatedAt: number;\n}\n\nexport interface SessionState {\n schemaVersion: 2;\n ownerOpenId?: string;\n boundChatId?: string;\n autoBindDisabled?: boolean;\n activeSessionId?: string;\n sessions?: Record<string, ManagedSession>;\n bindCodeHash?: string;\n bindCodeExpiresAt?: number;\n updatedAt: number;\n}\n\nexport function emptyState(now = Date.now()): SessionState {\n return { schemaVersion: 2, sessions: {}, updatedAt: now };\n}\n","import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nexport async function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown, mode = 0o600): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await chmod(parent, 0o700).catch(() => undefined);\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;\n const file = await open(temporary, 'w', mode);\n try {\n await file.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await file.sync();\n } finally {\n await file.close();\n }\n await rename(temporary, path);\n await chmod(path, mode);\n}\n","import { execFile, spawn } from 'node:child_process';\n\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nexport function runFile(\n file: string,\n args: readonly string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n execFile(\n file,\n [...args],\n {\n cwd: options.cwd,\n timeout: options.timeoutMs ?? 10_000,\n encoding: 'utf8',\n maxBuffer: 4 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n}\n\nexport function runFileWithInput(\n file: string,\n args: readonly string[],\n input: string,\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => (stdout += chunk));\n child.stderr.on('data', (chunk: string) => (stderr += chunk));\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr });\n else reject(new Error(`${file} exited with ${code ?? signal}: ${stderr.trim()}`));\n });\n child.stdin.end(input, 'utf8');\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport { createConnection } from 'node:net';\nimport type { DaemonRequestInput, DaemonResult } from './protocol.js';\n\nexport function requestDaemon(\n socketPath: string,\n request: DaemonRequestInput,\n timeoutMs = 5000,\n): Promise<DaemonResult> {\n return new Promise((resolve, reject) => {\n const id = randomUUID();\n const socket = createConnection(socketPath);\n let buffer = '';\n const timer = setTimeout(() => {\n socket.destroy();\n reject(new Error('daemon request timed out'));\n }, timeoutMs);\n socket.setEncoding('utf8');\n socket.once('connect', () => socket.write(`${JSON.stringify({ ...request, id })}\\n`));\n socket.on('data', (chunk) => {\n buffer += chunk;\n const newline = buffer.indexOf('\\n');\n if (newline === -1) return;\n clearTimeout(timer);\n socket.destroy();\n try {\n resolve(JSON.parse(buffer.slice(0, newline)) as DaemonResult);\n } catch (error) {\n reject(error);\n }\n });\n socket.once('error', (error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}\n","import type { AgentResume, ResumeOptions } from './types.js';\n\nexport function resolveResumeOption(options: ResumeOptions): AgentResume | undefined {\n const modes = [options.resume !== undefined, options.resumeLast, options.resumeAll].filter(Boolean).length;\n if (modes > 1) throw new Error('--resume, --resume-last, and --resume-all cannot be used together');\n if (options.resumeLast) return { mode: 'last' };\n if (options.resumeAll) return { mode: 'picker', all: true };\n if (typeof options.resume === 'string') return { mode: 'session', sessionId: options.resume };\n if (options.resume) return { mode: 'picker' };\n return undefined;\n}\n\nexport function resumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['resume', '--last'];\n if (resume.mode === 'session') return ['resume', resume.sessionId];\n return resume.all ? ['resume', '--all'] : ['resume'];\n}\n\nexport function claudeResumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['--continue'];\n if (resume.mode === 'session') return ['--resume', resume.sessionId];\n return ['--resume'];\n}\n","import { createHash } from 'node:crypto';\nimport { normalizeScreen, stripAnsi } from './normalize.js';\nimport { CLAUDE_DIALECT, CODEX_DIALECT, TRAE_DIALECT } from './dialects.js';\nimport type { ChoiceInteractionKind, ChoiceRisk, ScreenAction, TerminalDialect } from './interaction-types.js';\n\nexport type { ChoiceInteraction, ChoiceInteractionKind, ChoiceRisk, ScreenAction, SelectionSemantics } from './interaction-types.js';\n\nexport type ScreenState = 'starting' | 'running' | 'idle' | 'approval' | 'input' | 'failed' | 'exited' | 'unknown';\nexport interface ScreenDetection {\n state: ScreenState;\n confidence: number;\n normalized: string;\n fingerprint: string;\n evidence: string[];\n actions: ScreenAction[];\n interaction?: import('./interaction-types.js').ChoiceInteraction;\n hasDraftInput: boolean;\n}\n\nexport function detectCodexScreen(raw: string, paneAlive = true, cursor?: { x: number; y: number }): ScreenDetection {\n return detectAgentScreen(raw, paneAlive, {\n brandPattern: /OpenAI Codex|codex/i,\n brandEvidence: 'codex',\n failurePattern: /fatal error|panicked at|segmentation fault|codex exited/i,\n dialect: CODEX_DIALECT,\n }, cursor);\n}\n\nexport function detectTraeScreen(raw: string, paneAlive = true, cursor?: { x: number; y: number }): ScreenDetection {\n return detectAgentScreen(raw, paneAlive, {\n brandPattern: /TraeCode CLI|traecli/i,\n brandEvidence: 'trae-cli',\n failurePattern: /fatal error|panicked at|segmentation fault|traecli exited/i,\n dialect: TRAE_DIALECT,\n }, cursor);\n}\n\nexport function detectClaudeScreen(raw: string, paneAlive = true, cursor?: { x: number; y: number }): ScreenDetection {\n return detectAgentScreen(raw, paneAlive, {\n brandPattern: /Claude Code/i,\n brandEvidence: 'claude-code',\n failurePattern: /fatal error|segmentation fault|Claude Code exited/i,\n dialect: CLAUDE_DIALECT,\n }, cursor);\n}\n\ninterface AgentScreenOptions {\n brandPattern: RegExp;\n brandEvidence: string;\n failurePattern: RegExp;\n dialect: TerminalDialect;\n}\n\nfunction detectAgentScreen(\n raw: string,\n paneAlive: boolean,\n options: AgentScreenOptions,\n cursor?: { x: number; y: number },\n): ScreenDetection {\n const normalized = normalizeScreen(raw);\n const lines = normalized.split('\\n').slice(-80);\n const tail = lines.join('\\n');\n const bottom = lines.slice(-16);\n const bottomTail = bottom.join('\\n');\n const fingerprint = createHash('sha256').update(tail).digest('hex');\n if (!paneAlive) return result('exited', 1, normalized, fingerprint, ['pane exited']);\n if (options.failurePattern.test(bottomTail)) {\n return result('failed', 0.95, normalized, fingerprint, matching(bottom, /fatal|panic|exited/i));\n }\n\n const choice = parseChoiceInteraction(lines.slice(-60), options.dialect);\n if (choice) {\n const choiceFingerprint = choice.interaction?.interactionId\n ?? createHash('sha256').update(choice.evidence.join('\\n')).digest('hex');\n return { ...choice, normalized, fingerprint: choiceFingerprint, hasDraftInput: false };\n }\n\n const inputEvidence = matching(bottom, /(?:select an option|choose one|enter your answer|provide .*input|request_user_input|do you trust|trust the contents)/i);\n if (inputEvidence.length > 0) return result('input', 0.72, normalized, fingerprint, inputEvidence);\n\n const activeRunningPattern = /(?:model:\\s+loading|esc to interrupt|running\\s+.+?hooks?|^\\s*[•◦◆◇◈✦✻▍]?\\s*(?:working|thinking|executing)(?:…|\\s*\\(|$))/i;\n const activeRunningEvidence = matching(bottom, activeRunningPattern);\n if (activeRunningEvidence.length > 0) return result('running', 0.85, normalized, fingerprint, activeRunningEvidence);\n\n const runningPattern = /(?:waiting for)/i;\n const runningEvidence = matching(bottom, runningPattern);\n const lastRunningIndex = lastMatchingIndex(bottom, runningPattern);\n const lastPromptIndex = lastMatchingIndex(bottom, /^\\s*[›>❯]\\s?/);\n if (lastRunningIndex > lastPromptIndex) return result('running', 0.75, normalized, fingerprint, runningEvidence);\n const promptLines = bottom.slice(-4).filter((line) => /^\\s*[›>❯]\\s?/.test(line));\n if (promptLines.length > 0) {\n const last = promptLines.at(-1) ?? '';\n const content = last.replace(/^\\s*[›>❯]\\s?/, '').trim();\n const rawPrompt = raw.split('\\n').filter((line) => /^\\s*[›>❯]\\s?/.test(stripAnsi(line))).at(-1) ?? '';\n const draft = content.length > 0\n && !promptContentIsDim(rawPrompt)\n && !cursorIsAtPromptStart(rawPrompt, cursor?.x);\n return { ...result('idle', 0.8, normalized, fingerprint, [last]), hasDraftInput: draft };\n }\n\n if (runningEvidence.length > 0) return result('running', 0.75, normalized, fingerprint, runningEvidence);\n\n if (options.brandPattern.test(tail)) {\n return result('starting', 0.55, normalized, fingerprint, [options.brandEvidence]);\n }\n return result('unknown', 0.2, normalized, fingerprint, []);\n}\n\nfunction cursorIsAtPromptStart(rawLine: string, cursorX?: number): boolean {\n if (cursorX === undefined) return false;\n const visible = stripAnsi(rawLine);\n const marker = visible.search(/[›>❯]/);\n if (marker === -1) return false;\n let contentStart = marker + 1;\n while (/\\s/.test(visible[contentStart] ?? '')) contentStart += 1;\n return cursorX === contentStart;\n}\n\nfunction promptContentIsDim(rawLine: string): boolean {\n let dim = false;\n let visible = '';\n const dimAt: boolean[] = [];\n const sgr = /\\u001b\\[([0-9;]*)m/g;\n let cursor = 0;\n for (const match of rawLine.matchAll(sgr)) {\n const index = match.index ?? cursor;\n const text = rawLine.slice(cursor, index);\n visible += text;\n dimAt.push(...Array.from(text, () => dim));\n const params = (match[1] || '0').split(';').map(Number);\n if (params.includes(0)) dim = false;\n if (params.includes(2)) dim = true;\n if (params.includes(22)) dim = false;\n cursor = index + match[0].length;\n }\n const rest = rawLine.slice(cursor);\n visible += rest;\n dimAt.push(...Array.from(rest, () => dim));\n const marker = visible.search(/[›>❯]/);\n if (marker === -1) return false;\n let contentStart = marker + 1;\n while (/\\s/.test(visible[contentStart] ?? '')) contentStart += 1;\n const contentEnd = visible.trimEnd().length;\n return contentEnd > contentStart && dimAt.slice(contentStart, contentEnd).every(Boolean);\n}\n\nfunction parseChoiceInteraction(lines: string[], dialect: TerminalDialect): Omit<ScreenDetection, 'normalized' | 'fingerprint' | 'hasDraftInput'> | undefined {\n const explicitFooterIndex = lastMatchingIndex(lines, new RegExp(dialect.footerPatterns.map(({ source }) => `(?:${source})`).join('|'), 'i'));\n const footerlessHeaderIndex = dialect.footerlessChoiceHeaders\n ? lastMatchingIndex(lines, new RegExp(dialect.footerlessChoiceHeaders.map(({ source }) => `(?:${source})`).join('|'), 'i'))\n : -1;\n if (explicitFooterIndex === -1 && footerlessHeaderIndex === -1) return undefined;\n const footerIndex = explicitFooterIndex >= 0 ? explicitFooterIndex : lines.length;\n if (explicitFooterIndex >= 0 && lines.slice(footerIndex + 1).some((line) => /^\\s*[›>❯]\\s?/.test(line))) return undefined;\n const allStarts = lines.slice(0, footerIndex)\n .map((line, index) => choiceOptionStart(line) ? index : -1)\n .filter((index) => index >= 0);\n if (allStarts.length < 2) return undefined;\n const optionStarts = latestOptionGroup(allStarts);\n if (optionStarts.length < 2) return undefined;\n if (explicitFooterIndex === -1 && (optionStarts[0] ?? -1) <= footerlessHeaderIndex) return undefined;\n const firstOption = optionStarts[0] ?? 0;\n const beforeOptions = lines.slice(0, firstOption);\n const knownHeader = lastMatchingIndex(beforeOptions, new RegExp(dialect.headerPatterns.map(({ source }) => `(?:${source})`).join('|'), 'i'));\n const hardBoundary = lastMatchingIndex(beforeOptions, /^(?:\\s*[-─━═]{8,}\\s*|\\s*[›>❯]\\s+.+|\\s*[✻◆◦•]\\s+.+)$/);\n const contextStart = knownHeader > hardBoundary\n ? knownHeader\n : hardBoundary >= 0\n ? hardBoundary + 1\n : Math.max(0, firstOption - 12);\n const context = lines.slice(contextStart, firstOption)\n .filter((line) => Boolean(line) && !/^\\s*[-─━═]{8,}\\s*$/.test(line));\n const footer = lines[footerIndex] ?? '';\n\n const indexedActions = optionStarts.flatMap((start, optionIndex) => {\n const firstLine = lines[start] ?? '';\n const parsed = parseChoiceOptionLine(firstLine);\n if (!parsed) return [];\n const end = optionStarts[optionIndex + 1] ?? footerIndex;\n const rawLabel = parsed.label;\n const marker = selectionMarker(parsed.marker);\n const segments = [\n rawLabel,\n ...lines.slice(start + 1, end)\n .map((line) => line.trim())\n .filter((line) => Boolean(line)\n && !/^[-─━═]{3,}$/.test(line)\n && !matchesAny(withoutFocusMarker(line), dialect.submitControls)\n && !isSidePanelLine(line)\n && !matchesAny(withoutFocusMarker(line), dialect.customInputControls)\n && !matchesAny(withoutFocusMarker(line), dialect.chatControls)\n && !/^notes$/i.test(line)\n && !/^\\[[^\\]]+\\]$/.test(line)),\n ];\n const shortcutMatch = segments.join(' ').match(/\\(([^()\\s]{1,16})\\)\\s*$/);\n if (shortcutMatch) {\n const last = segments.length - 1;\n segments[last] = (segments[last] ?? '').replace(/\\s*\\([^()\\s]{1,16}\\)\\s*$/, '').trim();\n }\n const parts = (segments.shift() ?? '').split(/\\s{2,}/).map((part) => part.trim()).filter(Boolean);\n const label = parts.shift();\n if (!label) return [];\n const continuation = segments.join(' ')\n .replace(/\\bnotes:\\s*press\\s+n\\s+to\\s+add\\s+notes\\b/gi, '')\n .trim();\n let description = parts.filter((part) => !isSidePanelLine(part)).join(' ').trim();\n let fullLabel = label;\n if (continuation && marker) {\n description = [description, continuation].filter(Boolean).join(' ');\n } else if (continuation) {\n if (description) description = `${description} ${continuation}`;\n else fullLabel = `${fullLabel} ${continuation}`;\n }\n const role = controlRole(fullLabel, dialect);\n const customValue = role === 'custom-input'\n ? dialect.customInputValuePattern?.exec(fullLabel)?.[1]?.trim()\n : undefined;\n const inputValue = customValue && !/^something\\.?$/i.test(customValue) ? customValue : undefined;\n if (role === 'custom-input' && /^type\\b/i.test(fullLabel)) fullLabel = 'Type something';\n const risk = choiceRisk(`${fullLabel} ${description}`);\n const editor = role === 'custom-input'\n ? /(?:notes?\\s*\\(tab\\)|tab\\s+to\\s+(?:add|edit)\\s+notes?)/i.test(`${description} ${footer}`)\n ? { openKey: 'Tab', submitKey: 'Enter', commitsInteraction: true }\n : dialect.directInputControls && matchesAny(fullLabel, dialect.directInputControls)\n ? { submitKey: 'Enter', commitsInteraction: true }\n : undefined\n : undefined;\n return [{ index: start, action: {\n id: `option-${parsed.key}`,\n label: fullLabel,\n key: parsed.key,\n description: description || undefined,\n inputValue,\n shortcut: shortcutMatch?.[1]?.toLowerCase(),\n editor,\n focused: parsed.focused,\n marker,\n role,\n risk,\n danger: risk === 'persistent' || risk === 'privileged',\n } satisfies ScreenAction }];\n });\n const standaloneControls = lines.slice(firstOption, footerIndex).flatMap((line, relativeIndex) => {\n const visible = line.replace(/^\\s*[›>❯]\\s*/, '').trim();\n const role = matchesAny(visible, dialect.submitControls)\n ? 'submit' as const\n : matchesAny(visible, dialect.customInputControls)\n ? 'custom-input' as const\n : matchesAny(visible, dialect.chatControls)\n ? 'chat' as const\n : undefined;\n if (!role) return [];\n const id = role === 'submit' ? 'submit' : role === 'chat' ? 'chat' : 'custom-input';\n const label = /^notes:/i.test(visible) ? 'Add notes' : visible;\n return [{ index: firstOption + relativeIndex, action: {\n id, key: id, label, role, shortcut: /^notes:/i.test(visible) ? 'n' : undefined,\n focused: /^\\s*[›>❯]/.test(line), risk: 'normal' as const, danger: false,\n } satisfies ScreenAction }];\n });\n const actions: ScreenAction[] = [...indexedActions, ...standaloneControls]\n .sort((left, right) => left.index - right.index)\n .map(({ action }) => action);\n const submitIndex = actions.findIndex(({ role }) => role === 'submit');\n const inlineCustomIndex = submitIndex - 1;\n const inlineCustom = actions[inlineCustomIndex];\n if (inlineCustom?.role === 'answer'\n && (inlineCustom.marker === 'checked' || inlineCustom.marker === 'unchecked')\n && !inlineCustom.description\n && actions.slice(0, inlineCustomIndex).some(({ description, marker }) => Boolean(description && marker))) {\n const value = inlineCustom.label.trim();\n inlineCustom.role = 'custom-input';\n inlineCustom.inputValue = /^(?:type something|其他|其它|other)$/i.test(value) ? undefined : value;\n inlineCustom.label = 'Type something';\n }\n if (actions.length < 2 || actions.filter(({ focused }) => focused).length !== 1) return undefined;\n const kind = classifyChoice(context, actions, footer);\n const semantics = selectionSemantics(actions, footer);\n const canonical = actions.map(({ key, label, description, role, editor }) => ({ key, label, description, role, editor }));\n const identityContext = context.map((line) => line.replace(/([←\\s]*)[☐☑☒]/, '$1☐'));\n const interactionId = createHash('sha256').update(JSON.stringify([kind, identityContext, canonical])).digest('hex');\n const revision = createHash('sha256').update(JSON.stringify([\n interactionId,\n actions.map(({ key, marker, inputValue }) => ({ key, marker, inputValue })),\n ])).digest('hex');\n const questionContext = context.filter((line) => !matchesAny(line, dialect.headerPatterns));\n const questionTitle = [...questionContext].reverse().find((line) => /[??]/.test(line))\n ?? questionContext.at(-1);\n return {\n state: kind === 'approval' ? 'approval' : 'input',\n confidence: kind === 'question' ? 0.92 : kind === 'approval' ? 0.9 : 0.85,\n evidence: lines.slice(contextStart, footerIndex + 1).filter(Boolean),\n actions,\n interaction: {\n kind,\n title: questionTitle?.trim() || context[0]?.trim() || '请选择一个选项',\n context,\n interactionId,\n revision,\n semantics,\n contentConfidence: knownHeader >= 0 || hardBoundary >= 0 ? 0.95 : 0.65,\n actionConfidence: semantics ? semantics.confidence : 0.55,\n },\n };\n}\n\nfunction selectionMarker(value?: string): ScreenAction['marker'] {\n if (!value) return undefined;\n if (value === '[ ]' || value === '☐') return 'unchecked';\n if (/^\\[[xX✓✔]\\]$/.test(value) || value === '☑') return 'checked';\n if (value === '○') return 'unselected';\n if (value === '●') return 'selected';\n return undefined;\n}\n\nfunction matchesAny(value: string, patterns: readonly RegExp[]): boolean {\n return patterns.some((pattern) => pattern.test(value));\n}\n\nfunction withoutFocusMarker(value: string): string {\n return value.replace(/^\\s*[›>❯]\\s*/, '').trim();\n}\n\nfunction isSidePanelLine(value: string): boolean {\n return /[│┌┐└┘├┤┬┴┼╔╗╚╝╠╣╦╩╬║═]/.test(value);\n}\n\nfunction controlRole(label: string, dialect: TerminalDialect): ScreenAction['role'] {\n if (matchesAny(label, dialect.customInputControls)) return 'custom-input';\n if (matchesAny(label, dialect.chatControls)) return 'chat';\n return 'answer';\n}\n\nfunction selectionSemantics(actions: ScreenAction[], footer: string): import('./interaction-types.js').SelectionSemantics | undefined {\n const answers = actions.filter(({ role }) => role === 'answer');\n const submit = actions.find(({ role }) => role === 'submit');\n const hasCheckbox = answers.length > 0 && answers.every(({ marker }) => marker === 'checked' || marker === 'unchecked');\n const hasRadio = answers.length > 0 && answers.every(({ marker }) => marker === 'selected' || marker === 'unselected');\n if (hasCheckbox || hasRadio) {\n const commit = submit\n ? { mode: 'explicit' as const, controlId: submit.id }\n : /ctrl\\+enter\\s+to\\s+(?:submit|confirm)/i.test(footer)\n ? { mode: 'key' as const, key: 'C-Enter' }\n : /enter\\s+to\\s+(?:submit|confirm)(?:\\s+answer)?/i.test(footer)\n ? { mode: 'key' as const, key: 'Enter' }\n : undefined;\n if (!commit) return undefined;\n const toggleKey = /space\\s+to\\s+toggle/i.test(footer) ? 'Space' : 'Enter';\n return {\n cardinality: hasCheckbox ? 'many' : 'one', activation: 'toggle', toggleKey, commit,\n confidence: 0.97,\n evidence: [hasCheckbox ? 'answer controls use checkbox markers' : 'answer controls use radio markers', 'an explicit commit mechanism exists'],\n };\n }\n if (answers.some(({ marker }) => marker)) return undefined;\n return {\n cardinality: 'one', activation: 'submit', commit: { mode: 'immediate' }, confidence: 0.9,\n evidence: ['numbered controls use a single focus marker and no persistent selection markers'],\n };\n}\n\nfunction latestOptionGroup(starts: number[]): number[] {\n const group = [starts.at(-1) as number];\n for (let index = starts.length - 2; index >= 0; index -= 1) {\n const start = starts[index] as number;\n if ((group[0] as number) - start > 8) break;\n group.unshift(start);\n }\n return group;\n}\n\nfunction classifyChoice(context: string[], actions: ScreenAction[], footer: string): ChoiceInteractionKind {\n const contextText = context.join(' ');\n if (/(?:^|\\s)[☐☑☒]\\s+\\S|Question\\s+\\d+\\/\\d+/i.test(contextText) || /submit answer|add notes/i.test(footer)) return 'question';\n const optionText = actions.map(({ label, description }) => `${label} ${description ?? ''}`).join(' ');\n if (/(?:Would you like to|Do you want to).*(?:run|edit|grant|access)|approval required|allow command|requires approval/i.test(contextText)\n || /full access|don't ask again|do not ask again|always allow|auto mode|permissions?\\b/i.test(optionText)) return 'approval';\n return 'choice';\n}\n\nfunction choiceOptionStart(line: string): boolean {\n return Boolean(parseChoiceOptionLine(line));\n}\n\nfunction parseChoiceOptionLine(line: string): { focused: boolean; key: string; marker?: string; label: string } | undefined {\n const match = line.match(/^\\s*([›>❯])?\\s*(?:(\\[[ xX✓✔]\\]|[☐☑○●])\\s*)?(\\d+)[.)]\\s+(?:(\\[[ xX✓✔]\\]|[☐☑○●])\\s*)?(.+?)\\s*$/);\n if (!match?.[3] || !match[5]) return undefined;\n return { focused: Boolean(match[1]), marker: match[2] ?? match[4], key: match[3], label: match[5] };\n}\n\nfunction choiceRisk(text: string): ChoiceRisk {\n if (/full access|bypass|without sandbox|dangerously/i.test(text)) return 'privileged';\n if (/always|don't ask again|do not ask again|auto mode|persist/i.test(text)) return 'persistent';\n if (/^\\s*no\\b|reject|deny|cancel|do differently/i.test(text)) return 'reject';\n return 'normal';\n}\n\nfunction result(\n state: ScreenState,\n confidence: number,\n normalized: string,\n fingerprint: string,\n evidence: string[],\n): ScreenDetection {\n return { state, confidence, normalized, fingerprint, evidence, actions: [], hasDraftInput: false };\n}\n\nfunction matching(lines: string[], pattern: RegExp): string[] {\n return lines.filter((line) => pattern.test(line)).slice(-4);\n}\n\nfunction lastMatchingIndex(lines: string[], pattern: RegExp): number {\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n if (pattern.test(lines[index] ?? '')) return index;\n }\n return -1;\n}\n","// CSI, OSC and two-byte escape sequences commonly emitted by terminal UIs.\nconst ANSI = /\\u001b(?:\\][^\\u0007]*(?:\\u0007|\\u001b\\\\)|\\[[0-?]*[ -/]*[@-~]|[@-_])/g;\n\nexport function stripAnsi(raw: string): string {\n return raw.replace(ANSI, '');\n}\n\nexport function normalizeScreen(raw: string): string {\n return stripAnsi(raw)\n .replace(/\\r/g, '')\n .split('\\n')\n .map((line) => line.replace(/\\u00a0|\\u3000/g, ' ').replace(/\\t/g, ' ').replace(/ +$/g, ''))\n .filter((line, index, all) => line !== '' || all[index - 1] !== '')\n .join('\\n')\n .trim();\n}\n\nexport function tailScreen(raw: string, lines = 60): string {\n return normalizeScreen(raw).split('\\n').slice(-lines).join('\\n');\n}\n","import type { TerminalDialect } from './interaction-types.js';\n\nconst commonHeaders = [\n /^\\s*(?:Would you like to|Do you want to|Approval required|Allow command|.*requires approval)/i,\n];\nconst commonFooters = [\n /(?:press\\s+)?enter\\s+to\\s+(?:confirm|submit(?:\\s+answer)?|select|choose|continue)/i,\n /esc\\s+to\\s+cancel.*(?:tab\\s+to\\s+amend|ctrl\\+e\\s+to\\s+explain)/i,\n];\n\nexport const CODEX_DIALECT: TerminalDialect = {\n id: 'codex',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n footerPatterns: commonFooters,\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type something|none of the above|add notes)$/i],\n chatControls: [/^chat about this$/i],\n};\n\nexport const TRAE_DIALECT: TerminalDialect = {\n ...CODEX_DIALECT,\n id: 'trae-cli',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n customInputControls: [/^(?:other|none of the above|add notes)$/i],\n};\n\nexport const CLAUDE_DIALECT: TerminalDialect = {\n id: 'claude-code',\n headerPatterns: [\n ...commonHeaders,\n /^\\s*(?:←\\s*)?[☐☑☒]\\s+.+?(?:\\s+✔\\s+Submit\\s*→)?\\s*$/i,\n /^\\s*[☐☑☒]\\s+\\S/,\n ],\n footerPatterns: commonFooters,\n footerlessChoiceHeaders: [/^ready to submit your answers\\?$/i],\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type(?:\\s+.+)?|add notes)\\.?$/i, /^notes:\\s*press\\s+n\\s+to\\s+add\\b/i],\n directInputControls: [/^type(?:\\s+.+)?\\.?$/i],\n customInputValuePattern: /^type\\s+(.+?)\\.?$/i,\n chatControls: [/^chat about this$/i],\n};\n","export function codexStyleStopHookArgs(command: string): string[] {\n const hook = `{hooks=[{type=\"command\",command=${JSON.stringify(command)},timeout=5}]}`;\n return ['--dangerously-bypass-hook-trust', '-c', `hooks.Stop=[${hook}]`];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n Stop: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n },\n })];\n}\n","import { detectCodexScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const codexAdapter: AgentAdapter = {\n id: 'codex',\n displayName: 'Codex',\n groupOrder: 10,\n binary: (config) => config.agentBinaries.codex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectCodexScreen,\n};\n","import { detectTraeScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const traeCliAdapter: AgentAdapter = {\n id: 'trae-cli',\n displayName: 'Trae CLI',\n groupOrder: 20,\n binary: (config) => config.agentBinaries['trae-cli'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectTraeScreen,\n};\n","import { detectClaudeScreen } from '../screen/detector.js';\nimport { claudeResumeArgs } from './resume.js';\nimport { claudeStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: 'claude-code',\n displayName: 'Claude Code',\n groupOrder: 30,\n binary: (config) => config.agentBinaries['claude-code'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'trae-cli', 'claude-code'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\n\nexport type AgentResume =\n | { mode: 'picker'; all?: boolean }\n | { mode: 'last' }\n | { mode: 'session'; sessionId: string };\n\nexport interface ResumeOptions {\n resume?: boolean | string;\n resumeLast?: boolean;\n resumeAll?: boolean;\n}\n\nexport interface TurnCompleteCandidate {\n sessionId: string;\n eventId: string;\n agentSessionId: string;\n cwd: string;\n lastAssistantMessage: string;\n}\n\nexport interface LaunchInput {\n resume?: AgentResume;\n stopHookCommand: string;\n}\n\nexport interface AgentAdapter {\n id: AgentId;\n displayName: string;\n groupOrder: number;\n binary(config: AppConfig): string;\n versionArgs: readonly string[];\n buildLaunchArgs(input: LaunchInput): string[];\n detectScreen(raw: string, paneAlive: boolean, cursor?: { x: number; y: number }): ScreenDetection;\n}\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { AGENT_IDS, type AgentAdapter, type AgentId } from './types.js';\n\nconst adapters = new Map<AgentId, AgentAdapter>([\n [codexAdapter.id, codexAdapter],\n [traeCliAdapter.id, traeCliAdapter],\n [claudeCodeAdapter.id, claudeCodeAdapter],\n]);\n\nexport function getAgentAdapter(id: AgentId): AgentAdapter {\n const adapter = adapters.get(id);\n if (!adapter) throw new Error(`unsupported coding agent: ${id}`);\n return adapter;\n}\n\nexport function listAgentAdapters(): AgentAdapter[] {\n return [...adapters.values()].sort((left, right) => left.groupOrder - right.groupOrder);\n}\n\nexport function isAgentId(value: string): value is AgentId {\n return (AGENT_IDS as readonly string[]).includes(value);\n}\n","import { mkdir, open, readFile } from 'node:fs/promises';\nimport { spawn } from 'node:child_process';\nimport type { AppPaths } from '../core/paths.js';\nimport { runFile } from '../platform/process.js';\nimport { requestDaemon } from './client.js';\nimport type { DaemonInfo } from './protocol.js';\n\nexport async function daemonInfo(paths: AppPaths, timeoutMs = 500): Promise<DaemonInfo | undefined> {\n try {\n const response = await requestDaemon(paths.socket, { method: 'ping' }, timeoutMs);\n if (!response.ok) return undefined;\n return isDaemonInfo(response.value) ? response.value : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function startDaemonProcess(\n paths: AppPaths,\n daemonEntry: string,\n readyTimeoutMs = 5_000,\n): Promise<DaemonInfo> {\n const existing = await daemonInfo(paths);\n if (existing) return existing;\n await Promise.all([\n mkdir(paths.runtimeDir, { recursive: true, mode: 0o700 }),\n mkdir(paths.logsDir, { recursive: true, mode: 0o700 }),\n ]);\n const log = await open(paths.logFile, 'a', 0o600);\n const child = spawn(process.execPath, [daemonEntry], {\n detached: true,\n stdio: ['ignore', log.fd, log.fd],\n env: process.env,\n });\n let spawnError: Error | undefined;\n child.once('error', (error) => { spawnError = error; });\n await log.close();\n child.unref();\n const deadline = Date.now() + readyTimeoutMs;\n while (Date.now() < deadline) {\n if (spawnError) throw spawnError;\n await delay(100);\n const info = await daemonInfo(paths, 300);\n if (info) return info;\n }\n throw new Error('daemon did not become ready');\n}\n\nexport async function stopDaemonProcess(paths: AppPaths): Promise<boolean> {\n const info = await daemonInfo(paths);\n if (!info) return stopDaemonByPid(paths);\n try {\n const response = await requestDaemon(paths.socket, { method: 'shutdown' }, 1_000);\n if (!response.ok) throw new Error(response.error);\n } catch {\n signalDaemon(info.pid);\n }\n await waitUntilStopped(paths, info.pid);\n return true;\n}\n\nasync function stopDaemonByPid(paths: AppPaths): Promise<boolean> {\n const pid = Number.parseInt(await readFile(paths.pid, 'utf8').catch(() => ''), 10);\n if (!validPid(pid) || !processIsAlive(pid)) return false;\n if (!await isCurrentDaemonProcess(pid)) {\n throw new Error(`PID ${pid} is alive but is not a lark-coding-assistant daemon; refusing to signal it`);\n }\n signalDaemon(pid);\n await waitUntilStopped(paths, pid);\n return true;\n}\n\nasync function isCurrentDaemonProcess(pid: number): Promise<boolean> {\n try {\n const command = (await runFile('ps', ['-p', String(pid), '-o', 'command='])).stdout.trim();\n return command.includes('lark-coding-assistant')\n && /(?:^|\\/)daemon-entry\\.js(?:\\s|$)/.test(command);\n } catch {\n return false;\n }\n}\n\nasync function waitUntilStopped(paths: AppPaths, pid: number): Promise<void> {\n const deadline = Date.now() + 5_000;\n while (Date.now() < deadline) {\n if (!processIsAlive(pid) && !await daemonInfo(paths, 200)) return;\n await delay(100);\n }\n throw new Error(`daemon PID ${pid} did not stop within 5 seconds`);\n}\n\nfunction signalDaemon(pid: number): void {\n if (!validPid(pid) || pid === process.pid) throw new Error('refusing to signal invalid daemon PID');\n process.kill(pid, 'SIGTERM');\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && 'code' in error && error.code === 'EPERM';\n }\n}\n\nfunction validPid(pid: number): boolean {\n return Number.isInteger(pid) && pid > 1;\n}\n\nfunction isDaemonInfo(value: unknown): value is DaemonInfo {\n if (!value || typeof value !== 'object') return false;\n const info = value as Record<string, unknown>;\n return typeof info.version === 'string' && typeof info.pid === 'number';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export const registrationDomains = {\n domain: 'accounts.feishu.cn',\n larkDomain: 'accounts.larksuite.com',\n} as const;\n"],"mappings":"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","names":["randomBytes","readFile","spawn","chmod","mkdir","paths","mkdir","chmod","resolve","resolve","mkdir","open","readFile","spawn","paths","mkdir","log","open","spawn","readFile","resolve","readFile","randomBytes","spawn"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/core/paths.ts","../src/core/store.ts","../src/core/model.ts","../src/core/atomic-json.ts","../src/platform/process.ts","../src/daemon/client.ts","../src/core/errors.ts","../src/agents/resume.ts","../src/screen/detector.ts","../src/screen/normalize.ts","../src/screen/dialects.ts","../src/agents/stop-hook.ts","../src/agents/codex.ts","../src/agents/trae-cli.ts","../src/agents/claude-code.ts","../src/agents/types.ts","../src/agents/registry.ts","../src/daemon/lifecycle.ts","../src/lark/registration.ts","../src/cli-errors.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { access, readFile } from 'node:fs/promises';\nimport { spawn } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport { registerApp } from '@larksuite/channel';\nimport qrcode from 'qrcode-terminal';\nimport { resolveAppPaths } from './core/paths.js';\nimport { AppStore } from './core/store.js';\nimport type { AppConfig, Tenant } from './core/model.js';\nimport { runFile } from './platform/process.js';\nimport { requestDaemon } from './daemon/client.js';\nimport { resolveResumeOption } from './agents/resume.js';\nimport { getAgentAdapter, isAgentId } from './agents/registry.js';\nimport type { AgentId, ResumeOptions } from './agents/types.js';\nimport { daemonInfo, startDaemonProcess, stopDaemonProcess } from './daemon/lifecycle.js';\nimport { registrationDomains } from './lark/registration.js';\nimport { AppError, systemErrorCode } from './core/errors.js';\nimport { cliDebugEnabled, formatCliError, withCliOperation } from './cli-errors.js';\nimport type { DaemonRequestInput, DaemonResult } from './daemon/protocol.js';\n\nconst program = new Command();\nconst paths = resolveAppPaths();\nconst store = new AppStore(paths);\nconst packageInfo = JSON.parse(\n await readFile(new URL('../package.json', import.meta.url), 'utf8'),\n) as { version: string };\n\nprogram.name('lark-coding-assistant').version(packageInfo.version);\n\nprogram.command('init').description('Configure Feishu/Lark PersonalAgent').action(runInit);\nprogram.command('start')\n .option('-n, --name <name>', 'Session name', 'default')\n .option('--agent <agent>', 'Coding agent (codex, trae-cli, or claude-code)', parseAgentId, 'codex')\n .option('--cwd <path>', 'Coding agent working directory')\n .option('--resume [session-id]', 'Resume agent session; omit the ID to open the picker')\n .option('--resume-last', 'Resume the most recent agent session in this working directory')\n .option('--resume-all', 'Show all agent sessions in the resume picker')\n .action(runStart);\nprogram.command('attach').argument('[name]', 'Session name', 'default').description('Attach local terminal to coding-agent tmux session').action(runAttach);\nprogram.command('bind-code').description('Generate a new one-time Lark binding code').action(runBindCode);\nprogram.command('status').argument('[name]', 'Session name').description('Show daemon and session status').action(runStatus);\nprogram.command('stop').argument('[name]', 'Session name').description('Stop managed coding-agent/tmux session').action(runStop);\nprogram.command('logs').option('-n, --lines <count>', 'Number of lines', '100').action(runLogs);\nprogram.command('reset-owner').description('Clear persistent Lark owner').action(runResetOwner);\nconst daemonCommand = program.command('daemon').description('Manage the Lark bridge daemon');\ndaemonCommand.command('start').description('Start the bridge daemon').action(runDaemonStart);\ndaemonCommand.command('stop').description('Stop the bridge daemon without stopping coding-agent sessions').action(runDaemonStop);\ndaemonCommand.command('restart').description('Restart the bridge daemon without stopping coding-agent sessions').action(runDaemonRestart);\ndaemonCommand.command('status').description('Show bridge daemon status and version').action(runDaemonStatus);\n\ntry {\n await program.parseAsync();\n} catch (error) {\n const cliError = withCliOperation(error, commandOperation(process.argv));\n process.stderr.write(`${formatCliError(cliError, cliDebugEnabled())}\\n`);\n process.exitCode = 1;\n}\n\nasync function runInit(): Promise<void> {\n await store.ensure();\n const tenantAnswer = await p.select({\n message: '选择平台',\n options: [\n { value: 'feishu', label: '飞书' },\n { value: 'lark', label: 'Lark' },\n ],\n });\n if (p.isCancel(tenantAnswer)) return p.cancel('已取消');\n const tenant = tenantAnswer as Tenant;\n\n p.log.info('请使用飞书/Lark 扫描下面的二维码,创建或选择 PersonalAgent。');\n const registration = await registerApp({\n ...registrationDomains,\n source: 'lark-coding-assistant',\n appPreset: {\n name: 'Coding Assistant',\n desc: 'Bridge local coding-agent tmux sessions to private chat',\n },\n addons: {\n scopes: { tenant: ['im:message', 'im:message:send_as_bot'] },\n events: { items: { tenant: ['im.message.receive_v1'] } },\n callbacks: { items: ['card.action.trigger'] },\n },\n onQRCodeReady: ({ url, expireIn }) => {\n qrcode.generate(url, { small: true }, (output) => console.log(output));\n console.log(`二维码 ${Math.ceil(expireIn / 60)} 分钟内有效。若终端无法扫码,请打开:\\n${url}\\n`);\n },\n onStatusChange: ({ status }) => {\n if (status === 'domain_switched') p.log.info('已识别账号域,等待完成应用确认…');\n },\n });\n const registeredTenant = registration.user_info?.tenant_brand ?? tenant;\n const config: AppConfig = {\n tenant: registeredTenant,\n appId: registration.client_id,\n tmuxBinary: 'tmux',\n agentBinaries: { codex: 'codex', 'trae-cli': 'trae-cli', 'claude-code': 'claude' },\n pollIntervalMs: 650,\n };\n const previousState = await store.loadState();\n const registeredOwnerOpenId = registration.user_info?.open_id;\n const ownerChanged = Boolean(\n registeredOwnerOpenId\n && previousState.ownerOpenId\n && registeredOwnerOpenId !== previousState.ownerOpenId,\n );\n await Promise.all([\n store.saveConfig(config),\n store.saveSecrets({\n appSecret: registration.client_secret,\n callbackSecret: randomBytes(32).toString('base64url'),\n }),\n store.saveState({\n ...previousState,\n ownerOpenId: registeredOwnerOpenId ?? previousState.ownerOpenId,\n boundChatId: ownerChanged ? undefined : previousState.boundChatId,\n autoBindDisabled: false,\n updatedAt: Date.now(),\n }),\n ]);\n p.outro('PersonalAgent 配置已保存。');\n}\n\ninterface StartOptions extends ResumeOptions {\n agent: AgentId;\n cwd?: string;\n name: string;\n}\n\nasync function runStart(options: StartOptions): Promise<void> {\n const cwd = resolve(options.cwd ?? process.cwd());\n const resume = resolveResumeOption(options);\n await access(cwd).catch((error) => {\n throw new AppError('INVALID_CWD', `working directory is unavailable: ${cwd}`, { cwd }, { cause: error });\n });\n await ensureInitialized();\n await preflight(options.agent);\n await ensureDaemon();\n const value = await daemonValue<StartSessionValue>({\n method: 'start', cwd, sessionId: options.name, agent: options.agent, resume,\n });\n if (value.binding.mode === 'reused') {\n console.log('\\n已自动沿用原有飞书/Lark 私聊绑定。\\n');\n } else if (value.binding.mode === 'awaiting-owner-message') {\n console.log('\\n打开飞书/Lark 私聊并直接发送消息即可自动连接,无需绑定码。\\n');\n } else {\n console.log(`\\n飞书/Lark 私聊绑定命令(${value.binding.expiresInSeconds / 60} 分钟有效):`);\n console.log(` /attach ${value.binding.bindCode}\\n`);\n }\n if (!value.active) {\n console.log(`飞书当前仍连接其它 session;发送 /use ${options.name} 后切换到本 session。\\n`);\n }\n await attachLocal(options.name);\n}\n\ninterface StartSessionValue {\n active: boolean;\n binding:\n | { mode: 'reused' }\n | { mode: 'awaiting-owner-message' }\n | { mode: 'code'; bindCode: string; expiresInSeconds: number };\n}\n\nasync function runAttach(name: string): Promise<void> {\n await attachLocal(name);\n}\n\nasync function runBindCode(): Promise<void> {\n await ensureInitialized();\n await ensureDaemon();\n const value = await daemonValue<{ bindCode: string; expiresInSeconds: number }>({ method: 'bindCode' });\n console.log(`飞书/Lark 私聊绑定命令(${value.expiresInSeconds / 60} 分钟有效):`);\n console.log(`/attach ${value.bindCode}`);\n}\n\nasync function attachLocal(name: string): Promise<void> {\n const state = await store.loadState();\n const config = await store.loadConfig();\n const session = state.sessions?.[name];\n if (!session) throw new AppError('SESSION_NOT_FOUND', `no managed session: ${name}`, { sessionId: name });\n if (!config) throw new AppError('NOT_INITIALIZED', 'not initialized');\n try {\n await runFile(config.tmuxBinary, ['has-session', '-t', `=${session.sessionName}`]);\n } catch (error) {\n if (systemErrorCode(error) === 'ENOENT') {\n throw new AppError('BINARY_NOT_FOUND', `command not found: ${config.tmuxBinary}`, {\n binary: config.tmuxBinary,\n }, { cause: error });\n }\n throw new AppError('SESSION_NOT_FOUND', `managed session is no longer running: ${name}`, {\n sessionId: name,\n }, { cause: error });\n }\n const child = spawn(config.tmuxBinary, ['attach-session', '-t', `=${session.sessionName}`], { stdio: 'inherit' });\n const code = await new Promise<number | null>((resolveExit, reject) => {\n child.once('error', (error) => {\n if (systemErrorCode(error) === 'ENOENT') {\n reject(new AppError('BINARY_NOT_FOUND', `command not found: ${config.tmuxBinary}`, {\n binary: config.tmuxBinary,\n }, { cause: error }));\n return;\n }\n reject(error);\n });\n child.once('exit', resolveExit);\n });\n if (code && code !== 0) process.exitCode = code;\n}\n\nasync function runStatus(name?: string): Promise<void> {\n try {\n const response = await requestDaemon(paths.socket, { method: 'status', sessionId: name });\n if (!response.ok) throw new Error(response.error);\n console.log(JSON.stringify(response.value, null, 2));\n } catch {\n const state = await store.loadState();\n console.log(JSON.stringify({ daemon: 'stopped', state }, null, 2));\n }\n}\n\nasync function runStop(name?: string): Promise<void> {\n await daemonValue({ method: 'stop', sessionId: name });\n console.log(`Coding-agent tmux session stopped${name ? `: ${name}` : '.'}`);\n}\n\nasync function runResetOwner(): Promise<void> {\n await daemonValue({ method: 'resetOwner' });\n console.log('Owner cleared.');\n}\n\nasync function runLogs(options: { lines: string }): Promise<void> {\n const count = Math.max(1, Math.min(1000, Number.parseInt(options.lines, 10) || 100));\n const content = await readFile(paths.logFile, 'utf8').catch(() => '');\n console.log(content.split('\\n').slice(-count).join('\\n'));\n}\n\nasync function runDaemonStart(): Promise<void> {\n await ensureInitialized();\n const before = await daemonInfo(paths);\n if (before?.version === packageInfo.version) {\n console.log(`Bridge daemon is already running (PID ${before.pid}, version ${before.version}).`);\n return;\n }\n if (before) await stopDaemonProcess(paths);\n const info = await startDaemonProcess(paths, daemonEntryPath());\n console.log(`Bridge daemon started (PID ${info.pid}, version ${info.version}).`);\n}\n\nasync function runDaemonStop(): Promise<void> {\n const stopped = await stopDaemonProcess(paths);\n console.log(stopped ? 'Bridge daemon stopped. Coding-agent/tmux sessions were preserved.' : 'Bridge daemon is not running.');\n}\n\nasync function runDaemonRestart(): Promise<void> {\n await ensureInitialized();\n await stopDaemonProcess(paths);\n const info = await startDaemonProcess(paths, daemonEntryPath());\n console.log(`Bridge daemon restarted (PID ${info.pid}, version ${info.version}). Coding-agent/tmux sessions were preserved.`);\n}\n\nasync function runDaemonStatus(): Promise<void> {\n const info = await daemonInfo(paths);\n if (!info) {\n console.log(`Bridge daemon: stopped\\nCLI version: ${packageInfo.version}`);\n return;\n }\n console.log([\n 'Bridge daemon: running',\n `PID: ${info.pid}`,\n `Daemon version: ${info.version}`,\n `CLI version: ${packageInfo.version}`,\n `Up to date: ${info.version === packageInfo.version ? 'yes' : 'no'}`,\n ].join('\\n'));\n}\n\nasync function ensureInitialized(): Promise<void> {\n if (!await store.loadConfig() || !await store.loadSecrets()) {\n throw new AppError('NOT_INITIALIZED', 'not initialized; run lark-coding-assistant init first');\n }\n}\n\nasync function preflight(agentId: AgentId): Promise<void> {\n const config = (await store.loadConfig())!;\n const adapter = getAgentAdapter(agentId);\n await Promise.all([\n preflightBinary(config.tmuxBinary, ['-V']),\n preflightBinary(adapter.binary(config), [...adapter.versionArgs]),\n ]);\n}\n\nfunction parseAgentId(value: string): AgentId {\n if (!isAgentId(value)) {\n throw new AppError('INVALID_OPTIONS', `unsupported coding agent: ${value}`, {\n reason: `不支持 coding agent「${value}」`,\n });\n }\n return value;\n}\n\nasync function ensureDaemon(): Promise<void> {\n const info = await daemonInfo(paths);\n if (info?.version === packageInfo.version) return;\n if (info) {\n console.log(`检测到 bridge daemon 版本 ${info.version},正在更新到 ${packageInfo.version}…`);\n await stopDaemonProcess(paths);\n }\n await startDaemonProcess(paths, daemonEntryPath());\n}\n\nfunction daemonEntryPath(): string {\n return fileURLToPath(new URL('./daemon-entry.js', import.meta.url));\n}\n\nasync function daemonValue<T = unknown>(request: DaemonRequestInput): Promise<T> {\n const response = await requestDaemon(paths.socket, request);\n if (!response.ok) throw daemonResultError(response);\n return response.value as T;\n}\n\nfunction daemonResultError(response: Extract<DaemonResult, { ok: false }>): AppError {\n return new AppError(\n response.errorCode ?? 'UNKNOWN',\n response.error,\n response.errorContext ?? {},\n );\n}\n\nasync function preflightBinary(binary: string, args: string[]): Promise<void> {\n try {\n await runFile(binary, args);\n } catch (error) {\n if (systemErrorCode(error) === 'ENOENT') {\n throw new AppError('BINARY_NOT_FOUND', `command not found: ${binary}`, { binary }, { cause: error });\n }\n throw error;\n }\n}\n\nfunction commandOperation(argv: string[]): string | undefined {\n return argv.slice(2).find((argument) => !argument.startsWith('-'));\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface AppPaths {\n root: string;\n config: string;\n secrets: string;\n state: string;\n logsDir: string;\n logFile: string;\n runtimeDir: string;\n socket: string;\n pid: string;\n}\n\nexport function resolveAppPaths(root = process.env.LARK_CODING_ASSISTANT_HOME): AppPaths {\n const base = root || join(homedir(), '.lark-coding-assistant');\n return {\n root: base,\n config: join(base, 'config.json'),\n secrets: join(base, 'secrets.json'),\n state: join(base, 'state.json'),\n logsDir: join(base, 'logs'),\n logFile: join(base, 'logs', 'assistant.log'),\n runtimeDir: join(base, 'runtime'),\n socket: join(base, 'runtime', 'daemon.sock'),\n pid: join(base, 'runtime', 'daemon.pid'),\n };\n}\n","import { randomBytes, scryptSync, timingSafeEqual } from 'node:crypto';\nimport { chmod, mkdir } from 'node:fs/promises';\nimport type { AppConfig, AppSecrets, SessionState } from './model.js';\nimport { emptyState } from './model.js';\nimport type { AppPaths } from './paths.js';\nimport { readJson, writeJsonAtomic } from './atomic-json.js';\n\nexport class AppStore {\n constructor(readonly paths: AppPaths) {}\n\n async ensure(): Promise<void> {\n await mkdir(this.paths.root, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.logsDir, { recursive: true, mode: 0o700 });\n await Promise.all([\n chmod(this.paths.root, 0o700),\n chmod(this.paths.runtimeDir, 0o700),\n chmod(this.paths.logsDir, 0o700),\n ]);\n }\n\n loadConfig(): Promise<AppConfig | undefined> {\n return readJson<AppConfig>(this.paths.config);\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, config);\n }\n\n loadSecrets(): Promise<AppSecrets | undefined> {\n return readJson(this.paths.secrets);\n }\n\n saveSecrets(secrets: AppSecrets): Promise<void> {\n return writeJsonAtomic(this.paths.secrets, secrets);\n }\n\n async loadState(): Promise<SessionState> {\n return (await readJson<SessionState>(this.paths.state)) ?? emptyState();\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\nexport function createBindCode(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function hashBindCode(code: string): string {\n const salt = randomBytes(16);\n const digest = scryptSync(code, salt, 32);\n return `${salt.toString('base64url')}.${digest.toString('base64url')}`;\n}\n\nexport function verifyBindCode(code: string, encoded: string): boolean {\n const [saltText, digestText] = encoded.split('.');\n if (!saltText || !digestText) return false;\n const expected = Buffer.from(digestText, 'base64url');\n const actual = scryptSync(code, Buffer.from(saltText, 'base64url'), expected.length);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n","import type { AgentId } from '../agents/types.js';\n\nexport type Tenant = 'feishu' | 'lark';\n\nexport interface AppConfig {\n tenant: Tenant;\n appId: string;\n tmuxBinary: string;\n agentBinaries: Record<AgentId, string>;\n pollIntervalMs: number;\n}\n\nexport interface AppSecrets {\n appSecret: string;\n callbackSecret: string;\n}\n\nexport interface ManagedSession {\n id: string;\n agent: AgentId;\n sessionName: string;\n paneId: string;\n cwd: string;\n agentVersion: string;\n updatedAt: number;\n}\n\nexport interface SessionState {\n schemaVersion: 2;\n ownerOpenId?: string;\n boundChatId?: string;\n autoBindDisabled?: boolean;\n activeSessionId?: string;\n sessions?: Record<string, ManagedSession>;\n bindCodeHash?: string;\n bindCodeExpiresAt?: number;\n updatedAt: number;\n}\n\nexport function emptyState(now = Date.now()): SessionState {\n return { schemaVersion: 2, sessions: {}, updatedAt: now };\n}\n","import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nexport async function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown, mode = 0o600): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await chmod(parent, 0o700).catch(() => undefined);\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;\n const file = await open(temporary, 'w', mode);\n try {\n await file.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await file.sync();\n } finally {\n await file.close();\n }\n await rename(temporary, path);\n await chmod(path, mode);\n}\n","import { execFile, spawn } from 'node:child_process';\n\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nexport function runFile(\n file: string,\n args: readonly string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n execFile(\n file,\n [...args],\n {\n cwd: options.cwd,\n timeout: options.timeoutMs ?? 10_000,\n encoding: 'utf8',\n maxBuffer: 4 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n}\n\nexport function runFileWithInput(\n file: string,\n args: readonly string[],\n input: string,\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => (stdout += chunk));\n child.stderr.on('data', (chunk: string) => (stderr += chunk));\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr });\n else reject(new Error(`${file} exited with ${code ?? signal}: ${stderr.trim()}`));\n });\n child.stdin.end(input, 'utf8');\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport { createConnection } from 'node:net';\nimport type { DaemonRequestInput, DaemonResult } from './protocol.js';\nimport { AppError, systemErrorCode } from '../core/errors.js';\n\nexport function requestDaemon(\n socketPath: string,\n request: DaemonRequestInput,\n timeoutMs = 5000,\n): Promise<DaemonResult> {\n return new Promise((resolve, reject) => {\n const id = randomUUID();\n const socket = createConnection(socketPath);\n let buffer = '';\n const timer = setTimeout(() => {\n socket.destroy();\n reject(new AppError('REQUEST_TIMEOUT', 'daemon request timed out'));\n }, timeoutMs);\n socket.setEncoding('utf8');\n socket.once('connect', () => socket.write(`${JSON.stringify({ ...request, id })}\\n`));\n socket.on('data', (chunk) => {\n buffer += chunk;\n const newline = buffer.indexOf('\\n');\n if (newline === -1) return;\n clearTimeout(timer);\n socket.destroy();\n try {\n resolve(JSON.parse(buffer.slice(0, newline)) as DaemonResult);\n } catch (error) {\n reject(error);\n }\n });\n socket.once('error', (error) => {\n clearTimeout(timer);\n const code = systemErrorCode(error);\n if (code === 'ENOENT' || code === 'ECONNREFUSED' || code === 'ECONNRESET' || code === 'EPIPE') {\n reject(new AppError('DAEMON_UNAVAILABLE', 'unable to connect to daemon', {}, { cause: error }));\n return;\n }\n reject(error);\n });\n });\n}\n","export const APP_ERROR_CODES = [\n 'SESSION_EXISTS',\n 'SESSION_NOT_FOUND',\n 'INVALID_SESSION_NAME',\n 'NOT_INITIALIZED',\n 'INVALID_CWD',\n 'BINARY_NOT_FOUND',\n 'INVALID_OPTIONS',\n 'DAEMON_UNAVAILABLE',\n 'REQUEST_TIMEOUT',\n 'UNKNOWN',\n] as const;\n\nexport type AppErrorCode = typeof APP_ERROR_CODES[number];\n\nexport type ErrorContext = Record<string, string | number | boolean | undefined>;\n\nexport class AppError extends Error {\n readonly code: AppErrorCode;\n readonly context: ErrorContext;\n\n constructor(\n code: AppErrorCode,\n message: string,\n context: ErrorContext = {},\n options: { cause?: unknown } = {},\n ) {\n super(message, options);\n this.name = 'AppError';\n this.code = code;\n this.context = context;\n }\n}\n\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n\nexport function isAppErrorCode(value: unknown): value is AppErrorCode {\n return typeof value === 'string' && APP_ERROR_CODES.includes(value as AppErrorCode);\n}\n\nexport function asAppError(\n error: unknown,\n code: AppErrorCode = 'UNKNOWN',\n context: ErrorContext = {},\n): AppError {\n if (isAppError(error)) {\n if (Object.keys(context).length === 0) return error;\n return new AppError(error.code, error.message, { ...context, ...error.context }, { cause: error });\n }\n return new AppError(code, errorMessage(error), context, { cause: error });\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function serializeAppError(error: unknown): {\n error: string;\n errorCode?: AppErrorCode;\n errorContext?: ErrorContext;\n} {\n if (!isAppError(error)) return { error: errorMessage(error) };\n const errorContext = Object.fromEntries(\n Object.entries(error.context).filter(([, value]) => value !== undefined),\n );\n return {\n error: error.message,\n errorCode: error.code,\n ...(Object.keys(errorContext).length > 0 ? { errorContext } : {}),\n };\n}\n\nexport function systemErrorCode(error: unknown): string | undefined {\n return error instanceof Error && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined;\n}\n","import type { AgentResume, ResumeOptions } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nexport function resolveResumeOption(options: ResumeOptions): AgentResume | undefined {\n const modes = [options.resume !== undefined, options.resumeLast, options.resumeAll].filter(Boolean).length;\n if (modes > 1) {\n throw new AppError(\n 'INVALID_OPTIONS',\n '--resume, --resume-last, and --resume-all cannot be used together',\n { reason: '--resume、--resume-last 和 --resume-all 不能同时使用' },\n );\n }\n if (options.resumeLast) return { mode: 'last' };\n if (options.resumeAll) return { mode: 'picker', all: true };\n if (typeof options.resume === 'string') return { mode: 'session', sessionId: options.resume };\n if (options.resume) return { mode: 'picker' };\n return undefined;\n}\n\nexport function resumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['resume', '--last'];\n if (resume.mode === 'session') return ['resume', resume.sessionId];\n return resume.all ? ['resume', '--all'] : ['resume'];\n}\n\nexport function claudeResumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['--continue'];\n if (resume.mode === 'session') return ['--resume', resume.sessionId];\n return ['--resume'];\n}\n","import { createHash } from 'node:crypto';\nimport { normalizeScreen, stripAnsi } from './normalize.js';\nimport { CLAUDE_DIALECT, CODEX_DIALECT, TRAE_DIALECT } from './dialects.js';\nimport type { ChoiceInteractionKind, ChoiceRisk, ScreenAction, TerminalDialect } from './interaction-types.js';\n\nexport type { ChoiceInteraction, ChoiceInteractionKind, ChoiceRisk, ScreenAction, SelectionSemantics } from './interaction-types.js';\n\nexport type ScreenState = 'starting' | 'running' | 'idle' | 'approval' | 'input' | 'failed' | 'exited' | 'unknown';\nexport interface ScreenDetection {\n state: ScreenState;\n confidence: number;\n normalized: string;\n fingerprint: string;\n evidence: string[];\n actions: ScreenAction[];\n interaction?: import('./interaction-types.js').ChoiceInteraction;\n hasDraftInput: boolean;\n}\n\nexport function detectCodexScreen(raw: string, paneAlive = true, cursor?: { x: number; y: number }): ScreenDetection {\n return detectAgentScreen(raw, paneAlive, {\n brandPattern: /OpenAI Codex|codex/i,\n brandEvidence: 'codex',\n failurePattern: /fatal error|panicked at|segmentation fault|codex exited/i,\n dialect: CODEX_DIALECT,\n }, cursor);\n}\n\nexport function detectTraeScreen(raw: string, paneAlive = true, cursor?: { x: number; y: number }): ScreenDetection {\n return detectAgentScreen(raw, paneAlive, {\n brandPattern: /TraeCode CLI|traecli/i,\n brandEvidence: 'trae-cli',\n failurePattern: /fatal error|panicked at|segmentation fault|traecli exited/i,\n dialect: TRAE_DIALECT,\n }, cursor);\n}\n\nexport function detectClaudeScreen(raw: string, paneAlive = true, cursor?: { x: number; y: number }): ScreenDetection {\n return detectAgentScreen(raw, paneAlive, {\n brandPattern: /Claude Code/i,\n brandEvidence: 'claude-code',\n failurePattern: /fatal error|segmentation fault|Claude Code exited/i,\n dialect: CLAUDE_DIALECT,\n }, cursor);\n}\n\ninterface AgentScreenOptions {\n brandPattern: RegExp;\n brandEvidence: string;\n failurePattern: RegExp;\n dialect: TerminalDialect;\n}\n\nfunction detectAgentScreen(\n raw: string,\n paneAlive: boolean,\n options: AgentScreenOptions,\n cursor?: { x: number; y: number },\n): ScreenDetection {\n const normalized = normalizeScreen(raw);\n const lines = normalized.split('\\n').slice(-80);\n const tail = lines.join('\\n');\n const bottom = lines.slice(-16);\n const bottomTail = bottom.join('\\n');\n const fingerprint = createHash('sha256').update(tail).digest('hex');\n if (!paneAlive) return result('exited', 1, normalized, fingerprint, ['pane exited']);\n if (options.failurePattern.test(bottomTail)) {\n return result('failed', 0.95, normalized, fingerprint, matching(bottom, /fatal|panic|exited/i));\n }\n\n const choice = parseChoiceInteraction(lines.slice(-60), options.dialect);\n if (choice) {\n const choiceFingerprint = choice.interaction?.interactionId\n ?? createHash('sha256').update(choice.evidence.join('\\n')).digest('hex');\n return { ...choice, normalized, fingerprint: choiceFingerprint, hasDraftInput: false };\n }\n\n const inputEvidence = matching(bottom, /(?:select an option|choose one|enter your answer|provide .*input|request_user_input|do you trust|trust the contents)/i);\n if (inputEvidence.length > 0) return result('input', 0.72, normalized, fingerprint, inputEvidence);\n\n const activeRunningPattern = /(?:model:\\s+loading|esc to interrupt|running\\s+.+?hooks?|^\\s*[•◦◆◇◈✦✻▍]?\\s*(?:working|thinking|executing)(?:…|\\s*\\(|$))/i;\n const activeRunningEvidence = matching(bottom, activeRunningPattern);\n if (activeRunningEvidence.length > 0) return result('running', 0.85, normalized, fingerprint, activeRunningEvidence);\n\n const runningPattern = /(?:waiting for)/i;\n const runningEvidence = matching(bottom, runningPattern);\n const lastRunningIndex = lastMatchingIndex(bottom, runningPattern);\n const lastPromptIndex = lastMatchingIndex(bottom, /^\\s*[›>❯]\\s?/);\n if (lastRunningIndex > lastPromptIndex) return result('running', 0.75, normalized, fingerprint, runningEvidence);\n const promptLines = bottom.slice(-4).filter((line) => /^\\s*[›>❯]\\s?/.test(line));\n if (promptLines.length > 0) {\n const last = promptLines.at(-1) ?? '';\n const content = last.replace(/^\\s*[›>❯]\\s?/, '').trim();\n const rawPrompt = raw.split('\\n').filter((line) => /^\\s*[›>❯]\\s?/.test(stripAnsi(line))).at(-1) ?? '';\n const draft = content.length > 0\n && !promptContentIsDim(rawPrompt)\n && !cursorIsAtPromptStart(rawPrompt, cursor?.x);\n return { ...result('idle', 0.8, normalized, fingerprint, [last]), hasDraftInput: draft };\n }\n\n if (runningEvidence.length > 0) return result('running', 0.75, normalized, fingerprint, runningEvidence);\n\n if (options.brandPattern.test(tail)) {\n return result('starting', 0.55, normalized, fingerprint, [options.brandEvidence]);\n }\n return result('unknown', 0.2, normalized, fingerprint, []);\n}\n\nfunction cursorIsAtPromptStart(rawLine: string, cursorX?: number): boolean {\n if (cursorX === undefined) return false;\n const visible = stripAnsi(rawLine);\n const marker = visible.search(/[›>❯]/);\n if (marker === -1) return false;\n let contentStart = marker + 1;\n while (/\\s/.test(visible[contentStart] ?? '')) contentStart += 1;\n return cursorX === contentStart;\n}\n\nfunction promptContentIsDim(rawLine: string): boolean {\n let dim = false;\n let visible = '';\n const dimAt: boolean[] = [];\n const sgr = /\\u001b\\[([0-9;]*)m/g;\n let cursor = 0;\n for (const match of rawLine.matchAll(sgr)) {\n const index = match.index ?? cursor;\n const text = rawLine.slice(cursor, index);\n visible += text;\n dimAt.push(...Array.from(text, () => dim));\n const params = (match[1] || '0').split(';').map(Number);\n if (params.includes(0)) dim = false;\n if (params.includes(2)) dim = true;\n if (params.includes(22)) dim = false;\n cursor = index + match[0].length;\n }\n const rest = rawLine.slice(cursor);\n visible += rest;\n dimAt.push(...Array.from(rest, () => dim));\n const marker = visible.search(/[›>❯]/);\n if (marker === -1) return false;\n let contentStart = marker + 1;\n while (/\\s/.test(visible[contentStart] ?? '')) contentStart += 1;\n const contentEnd = visible.trimEnd().length;\n return contentEnd > contentStart && dimAt.slice(contentStart, contentEnd).every(Boolean);\n}\n\nfunction parseChoiceInteraction(lines: string[], dialect: TerminalDialect): Omit<ScreenDetection, 'normalized' | 'fingerprint' | 'hasDraftInput'> | undefined {\n const explicitFooterIndex = lastMatchingIndex(lines, new RegExp(dialect.footerPatterns.map(({ source }) => `(?:${source})`).join('|'), 'i'));\n const footerlessHeaderIndex = dialect.footerlessChoiceHeaders\n ? lastMatchingIndex(lines, new RegExp(dialect.footerlessChoiceHeaders.map(({ source }) => `(?:${source})`).join('|'), 'i'))\n : -1;\n if (explicitFooterIndex === -1 && footerlessHeaderIndex === -1) return undefined;\n const footerIndex = explicitFooterIndex >= 0 ? explicitFooterIndex : lines.length;\n if (explicitFooterIndex >= 0 && lines.slice(footerIndex + 1).some((line) => /^\\s*[›>❯]\\s?/.test(line))) return undefined;\n const allStarts = lines.slice(0, footerIndex)\n .map((line, index) => choiceOptionStart(line) ? index : -1)\n .filter((index) => index >= 0);\n if (allStarts.length < 2) return undefined;\n const optionStarts = latestOptionGroup(allStarts);\n if (optionStarts.length < 2) return undefined;\n if (explicitFooterIndex === -1 && (optionStarts[0] ?? -1) <= footerlessHeaderIndex) return undefined;\n const firstOption = optionStarts[0] ?? 0;\n const beforeOptions = lines.slice(0, firstOption);\n const knownHeader = lastMatchingIndex(beforeOptions, new RegExp(dialect.headerPatterns.map(({ source }) => `(?:${source})`).join('|'), 'i'));\n const hardBoundary = lastMatchingIndex(beforeOptions, /^(?:\\s*[-─━═]{8,}\\s*|\\s*[›>❯]\\s+.+|\\s*[✻◆◦•]\\s+.+)$/);\n const contextStart = knownHeader > hardBoundary\n ? knownHeader\n : hardBoundary >= 0\n ? hardBoundary + 1\n : Math.max(0, firstOption - 12);\n const context = lines.slice(contextStart, firstOption)\n .filter((line) => Boolean(line) && !/^\\s*[-─━═]{8,}\\s*$/.test(line));\n const footer = lines[footerIndex] ?? '';\n\n const indexedActions = optionStarts.flatMap((start, optionIndex) => {\n const firstLine = lines[start] ?? '';\n const parsed = parseChoiceOptionLine(firstLine);\n if (!parsed) return [];\n const end = optionStarts[optionIndex + 1] ?? footerIndex;\n const rawLabel = parsed.label;\n const marker = selectionMarker(parsed.marker);\n const segments = [\n rawLabel,\n ...lines.slice(start + 1, end)\n .map((line) => line.trim())\n .filter((line) => Boolean(line)\n && !/^[-─━═]{3,}$/.test(line)\n && !matchesAny(withoutFocusMarker(line), dialect.submitControls)\n && !isSidePanelLine(line)\n && !matchesAny(withoutFocusMarker(line), dialect.customInputControls)\n && !matchesAny(withoutFocusMarker(line), dialect.chatControls)\n && !/^notes$/i.test(line)\n && !/^\\[[^\\]]+\\]$/.test(line)),\n ];\n const shortcutMatch = segments.join(' ').match(/\\(([^()\\s]{1,16})\\)\\s*$/);\n if (shortcutMatch) {\n const last = segments.length - 1;\n segments[last] = (segments[last] ?? '').replace(/\\s*\\([^()\\s]{1,16}\\)\\s*$/, '').trim();\n }\n const parts = (segments.shift() ?? '').split(/\\s{2,}/).map((part) => part.trim()).filter(Boolean);\n const label = parts.shift();\n if (!label) return [];\n const continuation = segments.join(' ')\n .replace(/\\bnotes:\\s*press\\s+n\\s+to\\s+add\\s+notes\\b/gi, '')\n .trim();\n let description = parts.filter((part) => !isSidePanelLine(part)).join(' ').trim();\n let fullLabel = label;\n if (continuation && marker) {\n description = [description, continuation].filter(Boolean).join(' ');\n } else if (continuation) {\n if (description) description = `${description} ${continuation}`;\n else fullLabel = `${fullLabel} ${continuation}`;\n }\n const role = controlRole(fullLabel, dialect);\n const customValue = role === 'custom-input'\n ? dialect.customInputValuePattern?.exec(fullLabel)?.[1]?.trim()\n : undefined;\n const inputValue = customValue && !/^something\\.?$/i.test(customValue) ? customValue : undefined;\n if (role === 'custom-input' && /^type\\b/i.test(fullLabel)) fullLabel = 'Type something';\n const risk = choiceRisk(`${fullLabel} ${description}`);\n const editor = role === 'custom-input'\n ? /(?:notes?\\s*\\(tab\\)|tab\\s+to\\s+(?:add|edit)\\s+notes?)/i.test(`${description} ${footer}`)\n ? { openKey: 'Tab', submitKey: 'Enter', commitsInteraction: true }\n : dialect.directInputControls && matchesAny(fullLabel, dialect.directInputControls)\n ? { submitKey: 'Enter', commitsInteraction: true }\n : undefined\n : undefined;\n return [{ index: start, action: {\n id: `option-${parsed.key}`,\n label: fullLabel,\n key: parsed.key,\n description: description || undefined,\n inputValue,\n shortcut: shortcutMatch?.[1]?.toLowerCase(),\n editor,\n focused: parsed.focused,\n marker,\n role,\n risk,\n danger: risk === 'persistent' || risk === 'privileged',\n } satisfies ScreenAction }];\n });\n const standaloneControls = lines.slice(firstOption, footerIndex).flatMap((line, relativeIndex) => {\n const visible = line.replace(/^\\s*[›>❯]\\s*/, '').trim();\n const role = matchesAny(visible, dialect.submitControls)\n ? 'submit' as const\n : matchesAny(visible, dialect.customInputControls)\n ? 'custom-input' as const\n : matchesAny(visible, dialect.chatControls)\n ? 'chat' as const\n : undefined;\n if (!role) return [];\n const id = role === 'submit' ? 'submit' : role === 'chat' ? 'chat' : 'custom-input';\n const label = /^notes:/i.test(visible) ? 'Add notes' : visible;\n return [{ index: firstOption + relativeIndex, action: {\n id, key: id, label, role, shortcut: /^notes:/i.test(visible) ? 'n' : undefined,\n focused: /^\\s*[›>❯]/.test(line), risk: 'normal' as const, danger: false,\n } satisfies ScreenAction }];\n });\n const actions: ScreenAction[] = [...indexedActions, ...standaloneControls]\n .sort((left, right) => left.index - right.index)\n .map(({ action }) => action);\n const submitIndex = actions.findIndex(({ role }) => role === 'submit');\n const inlineCustomIndex = submitIndex - 1;\n const inlineCustom = actions[inlineCustomIndex];\n if (inlineCustom?.role === 'answer'\n && (inlineCustom.marker === 'checked' || inlineCustom.marker === 'unchecked')\n && !inlineCustom.description\n && actions.slice(0, inlineCustomIndex).some(({ description, marker }) => Boolean(description && marker))) {\n const value = inlineCustom.label.trim();\n inlineCustom.role = 'custom-input';\n inlineCustom.inputValue = /^(?:type something|其他|其它|other)$/i.test(value) ? undefined : value;\n inlineCustom.label = 'Type something';\n }\n if (actions.length < 2 || actions.filter(({ focused }) => focused).length !== 1) return undefined;\n const kind = classifyChoice(context, actions, footer);\n const semantics = selectionSemantics(actions, footer);\n const canonical = actions.map(({ key, label, description, role, editor }) => ({ key, label, description, role, editor }));\n const identityContext = context.map((line) => line.replace(/([←\\s]*)[☐☑☒]/, '$1☐'));\n const interactionId = createHash('sha256').update(JSON.stringify([kind, identityContext, canonical])).digest('hex');\n const revision = createHash('sha256').update(JSON.stringify([\n interactionId,\n actions.map(({ key, marker, inputValue }) => ({ key, marker, inputValue })),\n ])).digest('hex');\n const questionContext = context.filter((line) => !matchesAny(line, dialect.headerPatterns));\n const questionTitle = [...questionContext].reverse().find((line) => /[??]/.test(line))\n ?? questionContext.at(-1);\n return {\n state: kind === 'approval' ? 'approval' : 'input',\n confidence: kind === 'question' ? 0.92 : kind === 'approval' ? 0.9 : 0.85,\n evidence: lines.slice(contextStart, footerIndex + 1).filter(Boolean),\n actions,\n interaction: {\n kind,\n title: questionTitle?.trim() || context[0]?.trim() || '请选择一个选项',\n context,\n interactionId,\n revision,\n semantics,\n contentConfidence: knownHeader >= 0 || hardBoundary >= 0 ? 0.95 : 0.65,\n actionConfidence: semantics ? semantics.confidence : 0.55,\n },\n };\n}\n\nfunction selectionMarker(value?: string): ScreenAction['marker'] {\n if (!value) return undefined;\n if (value === '[ ]' || value === '☐') return 'unchecked';\n if (/^\\[[xX✓✔]\\]$/.test(value) || value === '☑') return 'checked';\n if (value === '○') return 'unselected';\n if (value === '●') return 'selected';\n return undefined;\n}\n\nfunction matchesAny(value: string, patterns: readonly RegExp[]): boolean {\n return patterns.some((pattern) => pattern.test(value));\n}\n\nfunction withoutFocusMarker(value: string): string {\n return value.replace(/^\\s*[›>❯]\\s*/, '').trim();\n}\n\nfunction isSidePanelLine(value: string): boolean {\n return /[│┌┐└┘├┤┬┴┼╔╗╚╝╠╣╦╩╬║═]/.test(value);\n}\n\nfunction controlRole(label: string, dialect: TerminalDialect): ScreenAction['role'] {\n if (matchesAny(label, dialect.customInputControls)) return 'custom-input';\n if (matchesAny(label, dialect.chatControls)) return 'chat';\n return 'answer';\n}\n\nfunction selectionSemantics(actions: ScreenAction[], footer: string): import('./interaction-types.js').SelectionSemantics | undefined {\n const answers = actions.filter(({ role }) => role === 'answer');\n const submit = actions.find(({ role }) => role === 'submit');\n const hasCheckbox = answers.length > 0 && answers.every(({ marker }) => marker === 'checked' || marker === 'unchecked');\n const hasRadio = answers.length > 0 && answers.every(({ marker }) => marker === 'selected' || marker === 'unselected');\n if (hasCheckbox || hasRadio) {\n const commit = submit\n ? { mode: 'explicit' as const, controlId: submit.id }\n : /ctrl\\+enter\\s+to\\s+(?:submit|confirm)/i.test(footer)\n ? { mode: 'key' as const, key: 'C-Enter' }\n : /enter\\s+to\\s+(?:submit|confirm)(?:\\s+answer)?/i.test(footer)\n ? { mode: 'key' as const, key: 'Enter' }\n : undefined;\n if (!commit) return undefined;\n const toggleKey = /space\\s+to\\s+toggle/i.test(footer) ? 'Space' : 'Enter';\n return {\n cardinality: hasCheckbox ? 'many' : 'one', activation: 'toggle', toggleKey, commit,\n confidence: 0.97,\n evidence: [hasCheckbox ? 'answer controls use checkbox markers' : 'answer controls use radio markers', 'an explicit commit mechanism exists'],\n };\n }\n if (answers.some(({ marker }) => marker)) return undefined;\n return {\n cardinality: 'one', activation: 'submit', commit: { mode: 'immediate' }, confidence: 0.9,\n evidence: ['numbered controls use a single focus marker and no persistent selection markers'],\n };\n}\n\nfunction latestOptionGroup(starts: number[]): number[] {\n const group = [starts.at(-1) as number];\n for (let index = starts.length - 2; index >= 0; index -= 1) {\n const start = starts[index] as number;\n if ((group[0] as number) - start > 8) break;\n group.unshift(start);\n }\n return group;\n}\n\nfunction classifyChoice(context: string[], actions: ScreenAction[], footer: string): ChoiceInteractionKind {\n const contextText = context.join(' ');\n if (/(?:^|\\s)[☐☑☒]\\s+\\S|Question\\s+\\d+\\/\\d+/i.test(contextText) || /submit answer|add notes/i.test(footer)) return 'question';\n const optionText = actions.map(({ label, description }) => `${label} ${description ?? ''}`).join(' ');\n if (/(?:Would you like to|Do you want to).*(?:run|edit|grant|access)|approval required|allow command|requires approval/i.test(contextText)\n || /full access|don't ask again|do not ask again|always allow|auto mode|permissions?\\b/i.test(optionText)) return 'approval';\n return 'choice';\n}\n\nfunction choiceOptionStart(line: string): boolean {\n return Boolean(parseChoiceOptionLine(line));\n}\n\nfunction parseChoiceOptionLine(line: string): { focused: boolean; key: string; marker?: string; label: string } | undefined {\n const match = line.match(/^\\s*([›>❯])?\\s*(?:(\\[[ xX✓✔]\\]|[☐☑○●])\\s*)?(\\d+)[.)]\\s+(?:(\\[[ xX✓✔]\\]|[☐☑○●])\\s*)?(.+?)\\s*$/);\n if (!match?.[3] || !match[5]) return undefined;\n return { focused: Boolean(match[1]), marker: match[2] ?? match[4], key: match[3], label: match[5] };\n}\n\nfunction choiceRisk(text: string): ChoiceRisk {\n if (/full access|bypass|without sandbox|dangerously/i.test(text)) return 'privileged';\n if (/always|don't ask again|do not ask again|auto mode|persist/i.test(text)) return 'persistent';\n if (/^\\s*no\\b|reject|deny|cancel|do differently/i.test(text)) return 'reject';\n return 'normal';\n}\n\nfunction result(\n state: ScreenState,\n confidence: number,\n normalized: string,\n fingerprint: string,\n evidence: string[],\n): ScreenDetection {\n return { state, confidence, normalized, fingerprint, evidence, actions: [], hasDraftInput: false };\n}\n\nfunction matching(lines: string[], pattern: RegExp): string[] {\n return lines.filter((line) => pattern.test(line)).slice(-4);\n}\n\nfunction lastMatchingIndex(lines: string[], pattern: RegExp): number {\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n if (pattern.test(lines[index] ?? '')) return index;\n }\n return -1;\n}\n","// CSI, OSC and two-byte escape sequences commonly emitted by terminal UIs.\nconst ANSI = /\\u001b(?:\\][^\\u0007]*(?:\\u0007|\\u001b\\\\)|\\[[0-?]*[ -/]*[@-~]|[@-_])/g;\n\nexport function stripAnsi(raw: string): string {\n return raw.replace(ANSI, '');\n}\n\nexport function normalizeScreen(raw: string): string {\n return stripAnsi(raw)\n .replace(/\\r/g, '')\n .split('\\n')\n .map((line) => line.replace(/\\u00a0|\\u3000/g, ' ').replace(/\\t/g, ' ').replace(/ +$/g, ''))\n .filter((line, index, all) => line !== '' || all[index - 1] !== '')\n .join('\\n')\n .trim();\n}\n\nexport function tailScreen(raw: string, lines = 60): string {\n return normalizeScreen(raw).split('\\n').slice(-lines).join('\\n');\n}\n","import type { TerminalDialect } from './interaction-types.js';\n\nconst commonHeaders = [\n /^\\s*(?:Would you like to|Do you want to|Approval required|Allow command|.*requires approval)/i,\n];\nconst commonFooters = [\n /(?:press\\s+)?enter\\s+to\\s+(?:confirm|submit(?:\\s+answer)?|select|choose|continue)/i,\n /esc\\s+to\\s+cancel.*(?:tab\\s+to\\s+amend|ctrl\\+e\\s+to\\s+explain)/i,\n];\n\nexport const CODEX_DIALECT: TerminalDialect = {\n id: 'codex',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n footerPatterns: commonFooters,\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type something|none of the above|add notes)$/i],\n chatControls: [/^chat about this$/i],\n};\n\nexport const TRAE_DIALECT: TerminalDialect = {\n ...CODEX_DIALECT,\n id: 'trae-cli',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n customInputControls: [/^(?:other|none of the above|add notes)$/i],\n};\n\nexport const CLAUDE_DIALECT: TerminalDialect = {\n id: 'claude-code',\n headerPatterns: [\n ...commonHeaders,\n /^\\s*(?:←\\s*)?[☐☑☒]\\s+.+?(?:\\s+✔\\s+Submit\\s*→)?\\s*$/i,\n /^\\s*[☐☑☒]\\s+\\S/,\n ],\n footerPatterns: commonFooters,\n footerlessChoiceHeaders: [/^ready to submit your answers\\?$/i],\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type(?:\\s+.+)?|add notes)\\.?$/i, /^notes:\\s*press\\s+n\\s+to\\s+add\\b/i],\n directInputControls: [/^type(?:\\s+.+)?\\.?$/i],\n customInputValuePattern: /^type\\s+(.+?)\\.?$/i,\n chatControls: [/^chat about this$/i],\n};\n","export function codexStyleStopHookArgs(command: string): string[] {\n const hook = `{hooks=[{type=\"command\",command=${JSON.stringify(command)},timeout=5}]}`;\n return ['--dangerously-bypass-hook-trust', '-c', `hooks.Stop=[${hook}]`];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n Stop: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n },\n })];\n}\n","import { detectCodexScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const codexAdapter: AgentAdapter = {\n id: 'codex',\n displayName: 'Codex',\n groupOrder: 10,\n binary: (config) => config.agentBinaries.codex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectCodexScreen,\n};\n","import { detectTraeScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const traeCliAdapter: AgentAdapter = {\n id: 'trae-cli',\n displayName: 'Trae CLI',\n groupOrder: 20,\n binary: (config) => config.agentBinaries['trae-cli'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectTraeScreen,\n};\n","import { detectClaudeScreen } from '../screen/detector.js';\nimport { claudeResumeArgs } from './resume.js';\nimport { claudeStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: 'claude-code',\n displayName: 'Claude Code',\n groupOrder: 30,\n binary: (config) => config.agentBinaries['claude-code'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'trae-cli', 'claude-code'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\n\nexport type AgentResume =\n | { mode: 'picker'; all?: boolean }\n | { mode: 'last' }\n | { mode: 'session'; sessionId: string };\n\nexport interface ResumeOptions {\n resume?: boolean | string;\n resumeLast?: boolean;\n resumeAll?: boolean;\n}\n\nexport interface TurnCompleteCandidate {\n sessionId: string;\n eventId: string;\n agentSessionId: string;\n cwd: string;\n lastAssistantMessage: string;\n}\n\nexport interface LaunchInput {\n resume?: AgentResume;\n stopHookCommand: string;\n}\n\nexport interface AgentAdapter {\n id: AgentId;\n displayName: string;\n groupOrder: number;\n binary(config: AppConfig): string;\n versionArgs: readonly string[];\n buildLaunchArgs(input: LaunchInput): string[];\n detectScreen(raw: string, paneAlive: boolean, cursor?: { x: number; y: number }): ScreenDetection;\n}\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { AGENT_IDS, type AgentAdapter, type AgentId } from './types.js';\n\nconst adapters = new Map<AgentId, AgentAdapter>([\n [codexAdapter.id, codexAdapter],\n [traeCliAdapter.id, traeCliAdapter],\n [claudeCodeAdapter.id, claudeCodeAdapter],\n]);\n\nexport function getAgentAdapter(id: AgentId): AgentAdapter {\n const adapter = adapters.get(id);\n if (!adapter) throw new Error(`unsupported coding agent: ${id}`);\n return adapter;\n}\n\nexport function listAgentAdapters(): AgentAdapter[] {\n return [...adapters.values()].sort((left, right) => left.groupOrder - right.groupOrder);\n}\n\nexport function isAgentId(value: string): value is AgentId {\n return (AGENT_IDS as readonly string[]).includes(value);\n}\n","import { mkdir, open, readFile } from 'node:fs/promises';\nimport { spawn } from 'node:child_process';\nimport type { AppPaths } from '../core/paths.js';\nimport { runFile } from '../platform/process.js';\nimport { requestDaemon } from './client.js';\nimport type { DaemonInfo } from './protocol.js';\n\nexport async function daemonInfo(paths: AppPaths, timeoutMs = 500): Promise<DaemonInfo | undefined> {\n try {\n const response = await requestDaemon(paths.socket, { method: 'ping' }, timeoutMs);\n if (!response.ok) return undefined;\n return isDaemonInfo(response.value) ? response.value : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function startDaemonProcess(\n paths: AppPaths,\n daemonEntry: string,\n readyTimeoutMs = 5_000,\n): Promise<DaemonInfo> {\n const existing = await daemonInfo(paths);\n if (existing) return existing;\n await Promise.all([\n mkdir(paths.runtimeDir, { recursive: true, mode: 0o700 }),\n mkdir(paths.logsDir, { recursive: true, mode: 0o700 }),\n ]);\n const log = await open(paths.logFile, 'a', 0o600);\n const child = spawn(process.execPath, [daemonEntry], {\n detached: true,\n stdio: ['ignore', log.fd, log.fd],\n env: process.env,\n });\n let spawnError: Error | undefined;\n child.once('error', (error) => { spawnError = error; });\n await log.close();\n child.unref();\n const deadline = Date.now() + readyTimeoutMs;\n while (Date.now() < deadline) {\n if (spawnError) throw spawnError;\n await delay(100);\n const info = await daemonInfo(paths, 300);\n if (info) return info;\n }\n throw new Error('daemon did not become ready');\n}\n\nexport async function stopDaemonProcess(paths: AppPaths): Promise<boolean> {\n const info = await daemonInfo(paths);\n if (!info) return stopDaemonByPid(paths);\n try {\n const response = await requestDaemon(paths.socket, { method: 'shutdown' }, 1_000);\n if (!response.ok) throw new Error(response.error);\n } catch {\n signalDaemon(info.pid);\n }\n await waitUntilStopped(paths, info.pid);\n return true;\n}\n\nasync function stopDaemonByPid(paths: AppPaths): Promise<boolean> {\n const pid = Number.parseInt(await readFile(paths.pid, 'utf8').catch(() => ''), 10);\n if (!validPid(pid) || !processIsAlive(pid)) return false;\n if (!await isCurrentDaemonProcess(pid)) {\n throw new Error(`PID ${pid} is alive but is not a lark-coding-assistant daemon; refusing to signal it`);\n }\n signalDaemon(pid);\n await waitUntilStopped(paths, pid);\n return true;\n}\n\nasync function isCurrentDaemonProcess(pid: number): Promise<boolean> {\n try {\n const command = (await runFile('ps', ['-p', String(pid), '-o', 'command='])).stdout.trim();\n return command.includes('lark-coding-assistant')\n && /(?:^|\\/)daemon-entry\\.js(?:\\s|$)/.test(command);\n } catch {\n return false;\n }\n}\n\nasync function waitUntilStopped(paths: AppPaths, pid: number): Promise<void> {\n const deadline = Date.now() + 5_000;\n while (Date.now() < deadline) {\n if (!processIsAlive(pid) && !await daemonInfo(paths, 200)) return;\n await delay(100);\n }\n throw new Error(`daemon PID ${pid} did not stop within 5 seconds`);\n}\n\nfunction signalDaemon(pid: number): void {\n if (!validPid(pid) || pid === process.pid) throw new Error('refusing to signal invalid daemon PID');\n process.kill(pid, 'SIGTERM');\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && 'code' in error && error.code === 'EPERM';\n }\n}\n\nfunction validPid(pid: number): boolean {\n return Number.isInteger(pid) && pid > 1;\n}\n\nfunction isDaemonInfo(value: unknown): value is DaemonInfo {\n if (!value || typeof value !== 'object') return false;\n const info = value as Record<string, unknown>;\n return typeof info.version === 'string' && typeof info.pid === 'number';\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export const registrationDomains = {\n domain: 'accounts.feishu.cn',\n larkDomain: 'accounts.larksuite.com',\n} as const;\n","import { AppError, asAppError, type ErrorContext } from './core/errors.js';\n\nexport function withCliOperation(error: unknown, operation: string | undefined): AppError {\n return asAppError(error, 'UNKNOWN', operation ? { operation } : {});\n}\n\nexport function formatCliError(error: unknown, debug = false): string {\n const appError = asAppError(error);\n const context = appError.context;\n const lines = formatKnownError(appError, context);\n if (!debug) return lines.join('\\n');\n return [...lines, '', '调试信息:', debugStack(appError)].join('\\n');\n}\n\nexport function cliDebugEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.LARK_CODING_ASSISTANT_DEBUG === '1';\n}\n\nfunction formatKnownError(error: AppError, context: ErrorContext): string[] {\n const sessionId = safeValue(context.sessionId, 'default');\n switch (error.code) {\n case 'SESSION_EXISTS':\n return [\n `无法启动 session「${sessionId}」:该 session 已在运行。`,\n '',\n '你可以:',\n ` lark-coding-assistant attach ${sessionId}`,\n ' lark-coding-assistant start --name <新名称>',\n ];\n case 'SESSION_NOT_FOUND':\n return [\n `找不到 session「${sessionId}」。`,\n '',\n '请先查看或创建 session:',\n ' lark-coding-assistant status',\n ` lark-coding-assistant start --name ${sessionId}`,\n ];\n case 'INVALID_SESSION_NAME':\n return [\n `session 名称「${safeValue(context.sessionId, '')}」无效。`,\n '名称只能包含字母、数字、下划线和短横线,长度为 1–40 个字符。',\n ];\n case 'NOT_INITIALIZED':\n return ['尚未完成初始化。', '', '请运行:', ' lark-coding-assistant init'];\n case 'INVALID_CWD':\n return [\n `工作目录不可用:${safeValue(context.cwd, '未知目录')}`,\n '',\n '请检查目录是否存在且有访问权限,或重新指定 --cwd。',\n ];\n case 'BINARY_NOT_FOUND':\n return [\n `找不到所需命令:${safeValue(context.binary, '未知命令')}`,\n '',\n '请先安装该命令,或检查 PATH 和初始化配置。',\n ];\n case 'INVALID_OPTIONS':\n return [\n `命令参数无效:${safeValue(context.reason, error.message)}`,\n '',\n '请运行 lark-coding-assistant --help 查看可用参数。',\n ];\n case 'DAEMON_UNAVAILABLE':\n return [\n '无法连接 bridge daemon。',\n '',\n '请尝试:',\n ' lark-coding-assistant daemon restart',\n ' lark-coding-assistant logs',\n ];\n case 'REQUEST_TIMEOUT':\n return [\n 'bridge daemon 未及时响应。',\n '',\n '请尝试:',\n ' lark-coding-assistant daemon status',\n ' lark-coding-assistant daemon restart',\n ' lark-coding-assistant logs',\n ];\n case 'UNKNOWN':\n return [\n `操作失败:${operationLabel(context.operation)} 时发生异常。`,\n '',\n '请尝试:',\n ' lark-coding-assistant status',\n ' lark-coding-assistant logs',\n '',\n '需要查看完整错误:',\n ' LARK_CODING_ASSISTANT_DEBUG=1 lark-coding-assistant ...',\n ];\n }\n}\n\nfunction operationLabel(value: ErrorContext[string]): string {\n const labels: Record<string, string> = {\n init: '初始化',\n start: '启动 session',\n attach: '连接 session',\n 'bind-code': '生成绑定码',\n status: '读取状态',\n stop: '停止 session',\n logs: '读取日志',\n 'reset-owner': '重置 owner',\n daemon: '管理 bridge daemon',\n };\n return typeof value === 'string' ? labels[value] ?? '执行命令' : '执行命令';\n}\n\nfunction safeValue(value: ErrorContext[string], fallback: string): string {\n if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') return fallback;\n const normalized = String(value).replace(/[\\u0000-\\u001f\\u007f\\u009b]|\\u001b\\[[0-?]*[ -/]*[@-~]/g, ' ').trim();\n return normalized.slice(0, 160) || fallback;\n}\n\nfunction debugStack(error: Error): string {\n const values: string[] = [];\n let current: unknown = error;\n const seen = new Set<unknown>();\n while (current instanceof Error && !seen.has(current)) {\n seen.add(current);\n values.push(current.stack ?? `${current.name}: ${current.message}`);\n current = current.cause;\n }\n return values.join('\\nCaused by:\\n');\n}\n"],"mappings":"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","names":["randomBytes","readFile","spawn","chmod","mkdir","paths","mkdir","chmod","resolve","resolve","mkdir","open","readFile","spawn","paths","mkdir","log","open","spawn","readFile","resolve","readFile","randomBytes","spawn"]}
|