lark-coding-assistant 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.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/agents/types.ts","../src/workspace/path.ts","../src/core/errors.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/registry.ts","../src/daemon/lifecycle.ts","../src/lark/registration.ts","../src/cli-errors.ts","../src/session/start-request.ts","../src/cli-status.ts","../src/workspace/config.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { 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, normalizeAgentId } from './agents/registry.js';\nimport type { AgentId, ResumeOptions } from './agents/types.js';\nimport { daemonHealth, 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';\nimport type { RuntimeStatus } from './daemon/protocol.js';\nimport { validateStartSessionRequest } from './session/start-request.js';\nimport { fallbackRuntimeSessions, formatCliStatus } from './cli-status.js';\nimport { addWorkspaceRoot, listWorkspaceRoots, removeWorkspaceRoot } from './workspace/config.js';\nimport { normalizeWorkspaceRoots } from './workspace/path.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, traex, or claude)', 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('Start or manage the Lark bridge daemon').action(runDaemonStart);\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);\nconst workspaceCommand = program.command('workspace').description('Manage project workspace roots');\nworkspaceCommand.command('add').argument('<path>', 'Workspace root path').description('Add a workspace root').action(runWorkspaceAdd);\nworkspaceCommand.command('list').description('List workspace roots').action(runWorkspaceList);\nworkspaceCommand.command('remove').argument('<path>', 'Workspace root path').description('Remove a workspace root').action(runWorkspaceRemove);\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 previousConfig = await store.loadConfig();\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 const workspaceAnswer = await p.text({\n message: '常用 workspace 目录(可选,多个目录用逗号分隔)',\n placeholder: '~/workspace, ~/code',\n initialValue: previousConfig?.workspaceRoots.join(', ') ?? '',\n });\n if (p.isCancel(workspaceAnswer)) return p.cancel('已取消');\n const workspaceRoots = normalizeWorkspaceRoots(\n String(workspaceAnswer).split(',').map((value) => value.trim()).filter(Boolean),\n );\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', traex: 'trae-cli', claude: 'claude' },\n pollIntervalMs: 650,\n workspaceRoots,\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 requestedCwd = options.cwd ?? process.cwd();\n const cwd = requestedCwd.startsWith('~') ? requestedCwd : resolve(requestedCwd);\n const resume = resolveResumeOption(options);\n const request = await validateStartSessionRequest({\n sessionId: options.name, agent: options.agent, cwd, resume,\n });\n await ensureInitialized();\n await preflight(options.agent);\n await ensureDaemon();\n console.log(`正在启动 ${options.agent} session「${options.name}」…`);\n const value = await daemonValue<StartSessionValue>({\n method: 'start', ...request,\n }, 35_000);\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\nasync function runWorkspaceAdd(path: string): Promise<void> {\n await ensureInitialized();\n const config = (await store.loadConfig())!;\n const result = await addWorkspaceRoot(config, path);\n if (result.added) await store.saveConfig(result.config);\n console.log(result.added ? `Workspace 已添加:${result.path}` : `Workspace 已存在:${result.path}`);\n}\n\nasync function runWorkspaceList(): Promise<void> {\n await ensureInitialized();\n const roots = listWorkspaceRoots((await store.loadConfig())!);\n console.log(roots.length > 0 ? roots.join('\\n') : '尚未配置 workspace。可运行:lca workspace add ~/workspace');\n}\n\nasync function runWorkspaceRemove(path: string): Promise<void> {\n await ensureInitialized();\n const config = (await store.loadConfig())!;\n const result = removeWorkspaceRoot(config, path);\n if (result.removed) await store.saveConfig(result.config);\n console.log(result.removed ? `Workspace 已移除:${result.path}` : `Workspace 未配置:${result.path}`);\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, health] = await Promise.all([\n requestDaemon(paths.socket, { method: 'status', sessionId: name }),\n daemonHealth(paths),\n ]);\n if (!response.ok) throw new Error(response.error);\n const runtime = response.value as RuntimeStatus;\n console.log(formatCliStatus({\n daemon: health.status === 'running'\n ? { status: 'running', pid: health.info.pid, version: health.info.version }\n : health,\n cliVersion: packageInfo.version,\n state: runtime.state,\n sessions: runtime.sessions ?? fallbackRuntimeSessions(runtime.state, name),\n requestedSessionId: name,\n columns: process.stdout.columns,\n }));\n } catch {\n const [state, health] = await Promise.all([store.loadState(), daemonHealth(paths)]);\n console.log(formatCliStatus({\n daemon: health.status === 'running'\n ? { status: 'running', pid: health.info.pid, version: health.info.version }\n : health,\n cliVersion: packageInfo.version,\n state,\n sessions: fallbackRuntimeSessions(state, name),\n requestedSessionId: name,\n columns: process.stdout.columns,\n }));\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 health = await daemonHealth(paths);\n if (health.status === 'stopped') {\n console.log(`Bridge daemon: stopped\\nCLI version: ${packageInfo.version}`);\n return;\n }\n if (health.status === 'unresponsive') {\n console.log([\n 'Bridge daemon: unresponsive',\n `PID: ${health.pid}`,\n `CLI version: ${packageInfo.version}`,\n '建议运行:lark-coding-assistant daemon restart',\n ].join('\\n'));\n return;\n }\n const info = health.info;\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 const agent = normalizeAgentId(value);\n if (!agent) {\n throw new AppError('INVALID_OPTIONS', `unsupported coding agent: ${value}`, {\n reason: `不支持 coding agent「${value}」`,\n });\n }\n return agent;\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, timeoutMs?: number): Promise<T> {\n const response = await requestDaemon(paths.socket, request, timeoutMs);\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';\nimport { normalizeAgentId } from '../agents/types.js';\nimport { normalizeWorkspacePath, normalizeWorkspaceRoots, validateWorkspaceDirectory } from '../workspace/path.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 async loadConfig(): Promise<AppConfig | undefined> {\n const config = await readJson<LegacyConfig>(this.paths.config);\n if (!config) return undefined;\n const binaries = config.agentBinaries ?? {};\n return {\n tenant: config.tenant,\n appId: config.appId,\n tmuxBinary: config.tmuxBinary,\n agentBinaries: {\n codex: binaries.codex ?? 'codex',\n traex: binaries.traex ?? binaries['trae-cli'] ?? 'trae-cli',\n claude: binaries.claude ?? binaries['claude-code'] ?? 'claude',\n },\n pollIntervalMs: config.pollIntervalMs,\n workspaceRoots: normalizeWorkspaceRoots(config.workspaceRoots ?? []),\n };\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, {\n ...config,\n workspaceRoots: normalizeWorkspaceRoots(config.workspaceRoots),\n });\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 const state = await readJson<LegacyState>(this.paths.state);\n if (!state) return emptyState();\n const sessions = Object.fromEntries(Object.entries(state.sessions ?? {}).flatMap(([id, session]) => {\n const agent = normalizeAgentId(session.agent);\n return agent ? [[id, { ...session, agent }]] : [];\n }));\n const recentWorkspaces = await normalizeRecentWorkspaces(state.recentWorkspaces ?? []);\n return { ...state, sessions, recentWorkspaces };\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\ninterface LegacyConfig extends Omit<AppConfig, 'agentBinaries' | 'workspaceRoots'> {\n agentBinaries: Partial<Record<'codex' | 'traex' | 'claude' | 'trae-cli' | 'claude-code', string>>;\n workspaceRoots?: string[];\n}\n\nasync function normalizeRecentWorkspaces(\n values: NonNullable<SessionState['recentWorkspaces']>,\n): Promise<NonNullable<SessionState['recentWorkspaces']>> {\n const unique = new Set<string>();\n const result: NonNullable<SessionState['recentWorkspaces']> = [];\n const ordered = [...values].sort((left, right) => right.lastUsedAt - left.lastUsedAt);\n for (const value of ordered) {\n if (result.length >= 30) break;\n if (!Number.isFinite(value.lastUsedAt)) continue;\n let cwd: string;\n try {\n cwd = normalizeWorkspacePath(value.cwd);\n await validateWorkspaceDirectory(cwd);\n } catch {\n continue;\n }\n if (unique.has(cwd)) continue;\n unique.add(cwd);\n result.push({ cwd, lastUsedAt: value.lastUsedAt });\n }\n return result;\n}\n\ninterface LegacyState extends Omit<SessionState, 'sessions'> {\n sessions?: Record<string, Omit<NonNullable<SessionState['sessions']>[string], 'agent'> & { agent: string }>;\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 workspaceRoots: string[];\n}\n\nexport interface RecentWorkspace {\n cwd: string;\n lastUsedAt: 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 agentSessionId?: 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 recentWorkspaces?: RecentWorkspace[];\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 type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'traex', 'claude'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\nexport type LegacyAgentId = 'trae-cli' | 'claude-code';\n\nexport function normalizeAgentId(value: string): AgentId | undefined {\n if (value === 'trae-cli') return 'traex';\n if (value === 'claude-code') return 'claude';\n return (AGENT_IDS as readonly string[]).includes(value) ? value as AgentId : undefined;\n}\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 AgentSessionStartedCandidate {\n sessionId: string;\n agent: AgentId;\n agentSessionId: string;\n cwd: string;\n source?: 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 { constants } from 'node:fs';\nimport { access, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, normalize, resolve } from 'node:path';\nimport { AppError, systemErrorCode } from '../core/errors.js';\n\nexport function normalizeWorkspacePath(input: string, home = homedir()): string {\n const value = input.trim();\n if (!value) throw invalidCwd(input, '工作目录不能为空');\n let expanded = value;\n if (value === '~') expanded = home;\n else if (value.startsWith('~/')) expanded = resolve(home, value.slice(2));\n else if (value.startsWith('~')) throw invalidCwd(input, '不支持 ~other-user,请使用 ~ 或 ~/目录');\n if (!isAbsolute(expanded)) throw invalidCwd(input, '工作目录必须是绝对路径,或使用 ~/目录');\n return normalize(expanded);\n}\n\nexport async function validateWorkspaceDirectory(input: string, home = homedir()): Promise<string> {\n const cwd = normalizeWorkspacePath(input, home);\n let info;\n try {\n info = await stat(cwd);\n } catch (error) {\n const reason = systemErrorCode(error) === 'EACCES'\n ? `无权访问工作目录:${cwd}`\n : `工作目录不存在或不可用:${cwd}`;\n throw invalidCwd(cwd, reason, error);\n }\n if (!info.isDirectory()) throw invalidCwd(cwd, `工作目录不是文件夹:${cwd}`);\n try {\n await access(cwd, constants.R_OK | constants.X_OK);\n } catch (error) {\n throw invalidCwd(cwd, `无权进入工作目录:${cwd}`, error);\n }\n return cwd;\n}\n\nexport function normalizeWorkspaceRoots(values: readonly string[], home = homedir()): string[] {\n const unique = new Set<string>();\n for (const value of values) unique.add(normalizeWorkspacePath(value, home));\n return [...unique];\n}\n\nfunction invalidCwd(cwd: string, reason: string, cause?: unknown): AppError {\n return new AppError('INVALID_CWD', reason, { cwd, reason }, cause === undefined ? {} : { cause });\n}\n","export const APP_ERROR_CODES = [\n 'SESSION_EXISTS',\n 'SESSION_STARTING',\n 'SESSION_START_TIMEOUT',\n 'AGENT_SESSION_IN_USE',\n 'AGENT_EXITED_DURING_STARTUP',\n 'AGENT_IDENTITY_TIMEOUT',\n 'SESSION_NOT_FOUND',\n 'INVALID_SESSION_NAME',\n 'NOT_INITIALIZED',\n 'INVALID_CWD',\n 'BINARY_NOT_FOUND',\n 'INVALID_OPTIONS',\n 'INVALID_RESUME',\n 'START_FAILED',\n 'DAEMON_UNAVAILABLE',\n 'DAEMON_UNRESPONSIVE',\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 { 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; signal?: AbortSignal } = {},\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 signal: options.signal,\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","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_RESUME',\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: 'traex',\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',\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 [\n '--dangerously-bypass-hook-trust',\n '-c', `hooks.SessionStart=[${hook}]`,\n '-c', `hooks.Stop=[${hook}]`,\n ];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n SessionStart: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\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: 'traex',\n displayName: 'traex',\n groupOrder: 20,\n binary: (config) => config.agentBinaries.traex,\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',\n displayName: 'claude',\n groupOrder: 30,\n binary: (config) => config.agentBinaries.claude,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { normalizeAgentId, type AgentAdapter, type AgentId } from './types.js';\n\nexport { normalizeAgentId } 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 normalizeAgentId(value) === 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';\nimport { AppError } from '../core/errors.js';\n\nexport type DaemonHealth =\n | { status: 'running'; info: DaemonInfo }\n | { status: 'unresponsive'; pid: number }\n | { status: 'stopped' };\n\nexport interface DaemonHealthProbe {\n ping(paths: AppPaths, timeoutMs: number): Promise<DaemonInfo | undefined>;\n readPid(paths: AppPaths): Promise<number>;\n processIsAlive(pid: number): boolean;\n isCurrentDaemonProcess(pid: number): Promise<boolean>;\n wait(ms: number): Promise<void>;\n}\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 const health = await daemonHealth(paths);\n if (health.status === 'running') return health.info;\n if (health.status === 'unresponsive') {\n throw new AppError('DAEMON_UNRESPONSIVE', 'daemon process is alive but its control socket is unresponsive', {\n pid: health.pid,\n });\n }\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 daemonHealth(paths: AppPaths, probe: DaemonHealthProbe = defaultHealthProbe): Promise<DaemonHealth> {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const info = await probe.ping(paths, 400);\n if (info) return { status: 'running', info };\n if (attempt < 2) await probe.wait(80);\n }\n const pid = await probe.readPid(paths);\n if (validPid(pid) && probe.processIsAlive(pid) && await probe.isCurrentDaemonProcess(pid)) {\n return { status: 'unresponsive', pid };\n }\n return { status: 'stopped' };\n}\n\nconst defaultHealthProbe: DaemonHealthProbe = {\n ping: daemonInfo,\n readPid: async (paths) => Number.parseInt(await readFile(paths.pid, 'utf8').catch(() => ''), 10),\n processIsAlive,\n isCurrentDaemonProcess,\n wait: delay,\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_STARTING':\n return [\n `session「${sessionId}」正在启动,请等待当前操作完成。`,\n '',\n '稍后可查看状态:',\n ` lark-coding-assistant status ${sessionId}`,\n ];\n case 'SESSION_START_TIMEOUT': {\n const excerpt = safeValue(context.terminalExcerpt, 'Agent 未输出可用错误信息。');\n return [\n `session「${sessionId}」启动超过 30 秒,已取消并清理。`,\n '',\n `Agent:${safeValue(context.agent, '未知')}`,\n `工作目录:${safeValue(context.cwd, '未知')}`,\n `超时阶段:${safeValue(context.stage, 'unknown')}`,\n '',\n '最近终端输出:',\n excerpt,\n '',\n '可以直接使用同名 session 重试。',\n ];\n }\n case 'AGENT_SESSION_IN_USE': {\n const ownerSessionId = safeValue(context.ownerSessionId, '现有 session');\n return [\n `无法启动 session「${sessionId}」:对应的 Agent 原生 session 已由「${ownerSessionId}」连接。`,\n '',\n '请直接连接现有 session:',\n ` lark-coding-assistant attach ${ownerSessionId}`,\n ];\n }\n case 'AGENT_EXITED_DURING_STARTUP': {\n const exitStatus = typeof context.exitStatus === 'number' ? `(退出码 ${context.exitStatus})` : '';\n return [\n `Agent 启动后立即退出${exitStatus},session「${sessionId}」未创建。`,\n '',\n '原始错误:',\n safeValue(context.terminalExcerpt, 'Agent 未输出可用错误信息。'),\n '',\n '可查看日志或改为启动新会话:',\n ' lark-coding-assistant logs',\n ` lark-coding-assistant start --name ${sessionId} --agent ${safeValue(context.agent, 'codex')}`,\n ];\n }\n case 'AGENT_IDENTITY_TIMEOUT':\n return [\n `无法确认恢复目标,session「${sessionId}」未创建。`,\n 'Agent 仍在运行,但 LCA 未能识别原生 session ID。',\n '',\n '临时 tmux 已清理,请查看日志后重试或启动新会话:',\n ' lark-coding-assistant logs',\n ` lark-coding-assistant start --name ${sessionId} --agent ${safeValue(context.agent, 'codex')}`,\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 'INVALID_RESUME':\n return [\n `恢复参数无效:${safeValue(context.reason, error.message)}`,\n '',\n '请只选择一种恢复方式,并检查历史 session ID。',\n ];\n case 'START_FAILED':\n return [\n `无法启动 session「${sessionId}」。`,\n '',\n '请检查工作目录、Agent 安装和 daemon 日志:',\n ' lark-coding-assistant logs',\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 'DAEMON_UNRESPONSIVE':\n return [\n 'bridge daemon 进程仍在运行,但控制通道无响应。',\n '',\n '请重启 daemon;现有 coding-agent/tmux sessions 会保留:',\n ' lark-coding-assistant daemon restart',\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 workspace: '管理 workspace',\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","import type { AgentId, AgentResume } from '../agents/types.js';\nimport { AppError } from '../core/errors.js';\nimport { validateWorkspaceDirectory } from '../workspace/path.js';\n\nexport interface StartSessionRequest {\n sessionId: string;\n agent: AgentId;\n cwd: string;\n resume?: AgentResume;\n}\n\nexport async function validateStartSessionRequest(request: StartSessionRequest): Promise<StartSessionRequest> {\n if (!validSessionId(request.sessionId)) {\n throw new AppError(\n 'INVALID_SESSION_NAME',\n 'session name must use letters, digits, underscore, or dash',\n { sessionId: request.sessionId },\n );\n }\n const cwd = await validateWorkspaceDirectory(request.cwd);\n if (request.resume?.mode === 'session' && !request.resume.sessionId.trim()) {\n throw new AppError('INVALID_RESUME', 'resume session id must not be empty', {\n reason: '恢复历史会话时必须提供 session ID',\n });\n }\n return { ...request, cwd };\n}\n\nexport function validSessionId(value: string): boolean {\n return /^[a-zA-Z0-9_-]{1,40}$/.test(value);\n}\n","import { AGENT_IDS } from './agents/types.js';\nimport type { SessionState } from './core/model.js';\nimport type { RuntimeSessionStatus } from './daemon/protocol.js';\n\nexport interface CliDaemonSummary {\n status: 'running' | 'unresponsive' | 'stopped';\n pid?: number;\n version?: string;\n}\n\nexport interface CliStatusReport {\n daemon: CliDaemonSummary;\n cliVersion: string;\n state: SessionState;\n sessions: RuntimeSessionStatus[];\n requestedSessionId?: string;\n columns?: number;\n}\n\ninterface StatusRow {\n current: string;\n agent: string;\n session: string;\n status: string;\n tmux: string;\n cwd: string;\n}\n\nconst HEADERS: Array<keyof StatusRow> = ['current', 'agent', 'session', 'status', 'tmux', 'cwd'];\nconst LABELS: StatusRow = {\n current: '当前',\n agent: 'Agent',\n session: 'Session',\n status: '状态',\n tmux: 'tmux',\n cwd: '工作目录',\n};\n\nexport function formatCliStatus(report: CliStatusReport): string {\n const daemon = [\n `Daemon: ${report.daemon.status}`,\n ...(report.daemon.pid ? [`PID ${report.daemon.pid}`] : []),\n ...(report.daemon.version ? [`daemon ${report.daemon.version}`] : []),\n `CLI ${report.cliVersion}`,\n ].join(' · ');\n const sessions = [...report.sessions].sort(compareRuntimeSessions);\n if (report.requestedSessionId && sessions.length === 0) {\n return `${daemon}\\nSessions: 0\\n\\n未找到 session「${sanitize(report.requestedSessionId)}」,请运行 lca status 查看全部 session。`;\n }\n if (sessions.length === 0) return `${daemon}\\nSessions: 0\\n\\n暂无受管 session。`;\n const rows = sessions.map(toStatusRow);\n return `${daemon}\\nSessions: ${rows.length}\\n\\n${renderTable(rows, report.columns ?? 120)}`;\n}\n\nexport function fallbackRuntimeSessions(state: SessionState, requestedSessionId?: string): RuntimeSessionStatus[] {\n return Object.values(state.sessions ?? {})\n .filter(({ id }) => !requestedSessionId || id === requestedSessionId)\n .map((session) => ({\n session,\n active: session.id === state.activeSessionId,\n }));\n}\n\nfunction compareRuntimeSessions(left: RuntimeSessionStatus, right: RuntimeSessionStatus): number {\n const agent = AGENT_IDS.indexOf(left.session.agent) - AGENT_IDS.indexOf(right.session.agent);\n return agent || left.session.id.localeCompare(right.session.id);\n}\n\nfunction toStatusRow(runtime: RuntimeSessionStatus): StatusRow {\n return {\n current: runtime.active ? '●' : '',\n agent: runtime.session.agent,\n session: runtime.session.id,\n status: runtimeStatusLabel(runtime),\n tmux: runtime.paneAlive === undefined ? '无法确认' : runtime.paneAlive ? '运行中' : '已停止',\n cwd: runtime.session.cwd,\n };\n}\n\nfunction runtimeStatusLabel(runtime: RuntimeSessionStatus): string {\n if (runtime.paneAlive === undefined) return '无法确认';\n if (!runtime.paneAlive || runtime.screen?.state === 'exited') return '已停止';\n if (runtime.screen?.state === 'failed') return '执行失败';\n if (runtime.screen?.interaction?.kind === 'approval') return '等待审批';\n if (runtime.screen?.interaction?.kind === 'question') return '等待回答';\n if (runtime.screen?.interaction?.kind === 'choice') return '等待选择';\n if (runtime.screen?.state === 'input') return '等待输入';\n if (runtime.screen?.state === 'running') return '执行中';\n if (runtime.screen?.state === 'starting') return '启动中';\n if (runtime.screen?.state === 'idle') return '等待用户输入';\n return '状态未知';\n}\n\nfunction renderTable(rows: StatusRow[], terminalColumns: number): string {\n const desired = HEADERS.map((key) => Math.max(\n displayWidth(LABELS[key]),\n ...rows.map((row) => displayWidth(sanitize(row[key]))),\n ));\n const widths = [\n desired[0] ?? 4,\n desired[1] ?? 6,\n Math.min(desired[2] ?? 7, 24),\n desired[3] ?? 4,\n desired[4] ?? 4,\n desired[5] ?? 8,\n ];\n const fixedWidth = widths.slice(0, -1).reduce((sum, width) => sum + width, 0);\n const tableOverhead = HEADERS.length * 3 + 1;\n const cwdAvailable = terminalColumns - fixedWidth - tableOverhead;\n widths[5] = Math.max(18, Math.min(widths[5] ?? 18, cwdAvailable));\n\n const border = (left: string, middle: string, right: string): string =>\n `${left}${widths.map((width) => '─'.repeat(width + 2)).join(middle)}${right}`;\n const line = (row: StatusRow): string => `│${HEADERS.map((key, index) => {\n const value = sanitize(row[key]);\n const width = widths[index] ?? 0;\n return ` ${fit(value, width, key === 'cwd')} `;\n }).join('│')}│`;\n\n return [\n border('┌', '┬', '┐'),\n line(LABELS),\n border('├', '┼', '┤'),\n ...rows.map(line),\n border('└', '┴', '┘'),\n ].join('\\n');\n}\n\nfunction fit(value: string, width: number, middle = false): string {\n const fitted = displayWidth(value) <= width\n ? value\n : middle\n ? truncateMiddle(value, width)\n : `${takeStart(value, Math.max(0, width - 1))}…`;\n return `${fitted}${' '.repeat(Math.max(0, width - displayWidth(fitted)))}`;\n}\n\nfunction truncateMiddle(value: string, width: number): string {\n if (width <= 1) return '…'.slice(0, width);\n const remaining = width - 1;\n const leftWidth = Math.ceil(remaining / 2);\n return `${takeStart(value, leftWidth)}…${takeEnd(value, remaining - leftWidth)}`;\n}\n\nfunction takeStart(value: string, width: number): string {\n let result = '';\n let used = 0;\n for (const character of value) {\n const characterWidth = displayWidth(character);\n if (used + characterWidth > width) break;\n result += character;\n used += characterWidth;\n }\n return result;\n}\n\nfunction takeEnd(value: string, width: number): string {\n let result = '';\n let used = 0;\n for (const character of [...value].reverse()) {\n const characterWidth = displayWidth(character);\n if (used + characterWidth > width) break;\n result = character + result;\n used += characterWidth;\n }\n return result;\n}\n\nfunction displayWidth(value: string): number {\n let width = 0;\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n if (/\\p{Mark}/u.test(character)) continue;\n width += isWide(code) ? 2 : 1;\n }\n return width;\n}\n\nfunction isWide(code: number): boolean {\n return code >= 0x1100 && (\n code <= 0x115f\n || code === 0x2329 || code === 0x232a\n || (code >= 0x2e80 && code <= 0xa4cf && code !== 0x303f)\n || (code >= 0xac00 && code <= 0xd7a3)\n || (code >= 0xf900 && code <= 0xfaff)\n || (code >= 0xfe10 && code <= 0xfe19)\n || (code >= 0xfe30 && code <= 0xfe6f)\n || (code >= 0xff00 && code <= 0xff60)\n || (code >= 0xffe0 && code <= 0xffe6)\n || (code >= 0x1f300 && code <= 0x1faff)\n || (code >= 0x20000 && code <= 0x3fffd)\n );\n}\n\nfunction sanitize(value: string): string {\n return value\n .replace(/\\u001b\\[[0-?]*[ -/]*[@-~]/g, '')\n .replace(/[\\u0000-\\u001f\\u007f]+/g, ' ')\n .trim();\n}\n","import { isAbsolute, resolve } from 'node:path';\nimport type { AppConfig } from '../core/model.js';\nimport { normalizeWorkspacePath, validateWorkspaceDirectory } from './path.js';\n\nexport async function addWorkspaceRoot(\n config: AppConfig,\n input: string,\n cwd = process.cwd(),\n): Promise<{ config: AppConfig; path: string; added: boolean }> {\n const path = await validateWorkspaceDirectory(resolveWorkspaceRootInput(input, cwd));\n const existing = new Set(config.workspaceRoots);\n if (existing.has(path)) return { config, path, added: false };\n return { config: { ...config, workspaceRoots: [...config.workspaceRoots, path] }, path, added: true };\n}\n\nexport function removeWorkspaceRoot(\n config: AppConfig,\n input: string,\n cwd = process.cwd(),\n): { config: AppConfig; path: string; removed: boolean } {\n const path = normalizeWorkspacePath(resolveWorkspaceRootInput(input, cwd));\n const workspaceRoots = config.workspaceRoots.filter((candidate) => candidate !== path);\n return {\n config: workspaceRoots.length === config.workspaceRoots.length ? config : { ...config, workspaceRoots },\n path,\n removed: workspaceRoots.length !== config.workspaceRoots.length,\n };\n}\n\nexport function listWorkspaceRoots(config: AppConfig): string[] {\n return [...config.workspaceRoots];\n}\n\nfunction resolveWorkspaceRootInput(input: string, cwd: string): string {\n const value = input.trim();\n return value && !value.startsWith('~') && !isAbsolute(value)\n ? resolve(cwd, value)\n : value;\n}\n"],"mappings":"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","names":["randomBytes","readFile","spawn","resolve","chmod","mkdir","homedir","homedir","paths","mkdir","chmod","result","resolve","resolve","text","mkdir","open","readFile","spawn","paths","mkdir","log","open","spawn","readFile","resolve","result","isAbsolute","resolve","isAbsolute","resolve","readFile","randomBytes","resolve","result","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/agents/types.ts","../src/workspace/path.ts","../src/core/errors.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/registry.ts","../src/daemon/lifecycle.ts","../src/lark/registration.ts","../src/cli-errors.ts","../src/session/start-request.ts","../src/cli-status.ts","../src/workspace/config.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport { 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, SessionExitEvent, 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, normalizeAgentId } from './agents/registry.js';\nimport type { AgentId, ResumeOptions } from './agents/types.js';\nimport { daemonHealth, 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';\nimport type { RuntimeStatus } from './daemon/protocol.js';\nimport { validateStartSessionRequest } from './session/start-request.js';\nimport { fallbackRuntimeSessions, formatCliStatus } from './cli-status.js';\nimport { addWorkspaceRoot, listWorkspaceRoots, removeWorkspaceRoot } from './workspace/config.js';\nimport { normalizeWorkspaceRoots } from './workspace/path.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, traex, or claude)', 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('Start or manage the Lark bridge daemon').action(runDaemonStart);\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);\nconst workspaceCommand = program.command('workspace').description('Manage project workspace roots');\nworkspaceCommand.command('add').argument('<path>', 'Workspace root path').description('Add a workspace root').action(runWorkspaceAdd);\nworkspaceCommand.command('list').description('List workspace roots').action(runWorkspaceList);\nworkspaceCommand.command('remove').argument('<path>', 'Workspace root path').description('Remove a workspace root').action(runWorkspaceRemove);\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 previousConfig = await store.loadConfig();\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 const workspaceAnswer = await p.text({\n message: '常用 workspace 目录(可选,多个目录用逗号分隔)',\n placeholder: '~/workspace, ~/code',\n initialValue: previousConfig?.workspaceRoots.join(', ') ?? '',\n });\n if (p.isCancel(workspaceAnswer)) return p.cancel('已取消');\n const workspaceRoots = normalizeWorkspaceRoots(\n String(workspaceAnswer).split(',').map((value) => value.trim()).filter(Boolean),\n );\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', traex: 'trae-cli', claude: 'claude' },\n pollIntervalMs: 650,\n workspaceRoots,\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 requestedCwd = options.cwd ?? process.cwd();\n const cwd = requestedCwd.startsWith('~') ? requestedCwd : resolve(requestedCwd);\n const resume = resolveResumeOption(options);\n const request = await validateStartSessionRequest({\n sessionId: options.name, agent: options.agent, cwd, resume,\n });\n await ensureInitialized();\n await preflight(options.agent);\n await ensureDaemon();\n console.log(`正在启动 ${options.agent} session「${options.name}」…`);\n const value = await daemonValue<StartSessionValue>({\n method: 'start', ...request,\n }, 35_000);\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\nasync function runWorkspaceAdd(path: string): Promise<void> {\n await ensureInitialized();\n const config = (await store.loadConfig())!;\n const result = await addWorkspaceRoot(config, path);\n if (result.added) await store.saveConfig(result.config);\n console.log(result.added ? `Workspace 已添加:${result.path}` : `Workspace 已存在:${result.path}`);\n}\n\nasync function runWorkspaceList(): Promise<void> {\n await ensureInitialized();\n const roots = listWorkspaceRoots((await store.loadConfig())!);\n console.log(roots.length > 0 ? roots.join('\\n') : '尚未配置 workspace。可运行:lca workspace add ~/workspace');\n}\n\nasync function runWorkspaceRemove(path: string): Promise<void> {\n await ensureInitialized();\n const config = (await store.loadConfig())!;\n const result = removeWorkspaceRoot(config, path);\n if (result.removed) await store.saveConfig(result.config);\n console.log(result.removed ? `Workspace 已移除:${result.path}` : `Workspace 未配置:${result.path}`);\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) {\n const exitEvent = state.recentSessionExits?.[name];\n if (exitEvent?.reason === 'agent-session-conflict') throw sessionConflictError(exitEvent);\n throw new AppError('SESSION_NOT_FOUND', `no managed session: ${name}`, { sessionId: name });\n }\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 const exitEvent = (await store.loadState()).recentSessionExits?.[name];\n if (exitEvent?.reason === 'agent-session-conflict') throw sessionConflictError(exitEvent);\n throw new AppError('SESSION_NOT_FOUND', `managed session is no longer running: ${name}`, {\n sessionId: name,\n }, { cause: error });\n }\n const attachedAt = Date.now();\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 const exitEvent = (await store.loadState()).recentSessionExits?.[name];\n if (exitEvent?.reason === 'agent-session-conflict' && exitEvent.occurredAt >= attachedAt) {\n throw sessionConflictError(exitEvent);\n }\n if (code && code !== 0) process.exitCode = code;\n}\n\nfunction sessionConflictError(event: SessionExitEvent): AppError {\n return new AppError(\n 'AGENT_SESSION_IN_USE',\n `agent session is already managed by ${event.ownerSessionId}`,\n {\n sessionId: event.sessionId,\n agent: event.agent,\n agentSessionId: event.agentSessionId,\n ownerSessionId: event.ownerSessionId,\n },\n );\n}\n\nasync function runStatus(name?: string): Promise<void> {\n try {\n const [response, health] = await Promise.all([\n requestDaemon(paths.socket, { method: 'status', sessionId: name }),\n daemonHealth(paths),\n ]);\n if (!response.ok) throw new Error(response.error);\n const runtime = response.value as RuntimeStatus;\n console.log(formatCliStatus({\n daemon: health.status === 'running'\n ? { status: 'running', pid: health.info.pid, version: health.info.version }\n : health,\n cliVersion: packageInfo.version,\n state: runtime.state,\n sessions: runtime.sessions ?? fallbackRuntimeSessions(runtime.state, name),\n requestedSessionId: name,\n columns: process.stdout.columns,\n }));\n } catch {\n const [state, health] = await Promise.all([store.loadState(), daemonHealth(paths)]);\n console.log(formatCliStatus({\n daemon: health.status === 'running'\n ? { status: 'running', pid: health.info.pid, version: health.info.version }\n : health,\n cliVersion: packageInfo.version,\n state,\n sessions: fallbackRuntimeSessions(state, name),\n requestedSessionId: name,\n columns: process.stdout.columns,\n }));\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 health = await daemonHealth(paths);\n if (health.status === 'stopped') {\n console.log(`Bridge daemon: stopped\\nCLI version: ${packageInfo.version}`);\n return;\n }\n if (health.status === 'unresponsive') {\n console.log([\n 'Bridge daemon: unresponsive',\n `PID: ${health.pid}`,\n `CLI version: ${packageInfo.version}`,\n '建议运行:lark-coding-assistant daemon restart',\n ].join('\\n'));\n return;\n }\n const info = health.info;\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 const agent = normalizeAgentId(value);\n if (!agent) {\n throw new AppError('INVALID_OPTIONS', `unsupported coding agent: ${value}`, {\n reason: `不支持 coding agent「${value}」`,\n });\n }\n return agent;\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, timeoutMs?: number): Promise<T> {\n const response = await requestDaemon(paths.socket, request, timeoutMs);\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';\nimport { normalizeAgentId } from '../agents/types.js';\nimport { normalizeWorkspacePath, normalizeWorkspaceRoots, validateWorkspaceDirectory } from '../workspace/path.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 async loadConfig(): Promise<AppConfig | undefined> {\n const config = await readJson<LegacyConfig>(this.paths.config);\n if (!config) return undefined;\n const binaries = config.agentBinaries ?? {};\n return {\n tenant: config.tenant,\n appId: config.appId,\n tmuxBinary: config.tmuxBinary,\n agentBinaries: {\n codex: binaries.codex ?? 'codex',\n traex: binaries.traex ?? binaries['trae-cli'] ?? 'trae-cli',\n claude: binaries.claude ?? binaries['claude-code'] ?? 'claude',\n },\n pollIntervalMs: config.pollIntervalMs,\n workspaceRoots: normalizeWorkspaceRoots(config.workspaceRoots ?? []),\n };\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, {\n ...config,\n workspaceRoots: normalizeWorkspaceRoots(config.workspaceRoots),\n });\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 const state = await readJson<LegacyState>(this.paths.state);\n if (!state) return emptyState();\n const sessions = Object.fromEntries(Object.entries(state.sessions ?? {}).flatMap(([id, session]) => {\n const agent = normalizeAgentId(session.agent);\n return agent ? [[id, { ...session, agent }]] : [];\n }));\n const recentWorkspaces = await normalizeRecentWorkspaces(state.recentWorkspaces ?? []);\n return { ...state, sessions, recentWorkspaces };\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\ninterface LegacyConfig extends Omit<AppConfig, 'agentBinaries' | 'workspaceRoots'> {\n agentBinaries: Partial<Record<'codex' | 'traex' | 'claude' | 'trae-cli' | 'claude-code', string>>;\n workspaceRoots?: string[];\n}\n\nasync function normalizeRecentWorkspaces(\n values: NonNullable<SessionState['recentWorkspaces']>,\n): Promise<NonNullable<SessionState['recentWorkspaces']>> {\n const unique = new Set<string>();\n const result: NonNullable<SessionState['recentWorkspaces']> = [];\n const ordered = [...values].sort((left, right) => right.lastUsedAt - left.lastUsedAt);\n for (const value of ordered) {\n if (result.length >= 30) break;\n if (!Number.isFinite(value.lastUsedAt)) continue;\n let cwd: string;\n try {\n cwd = normalizeWorkspacePath(value.cwd);\n await validateWorkspaceDirectory(cwd);\n } catch {\n continue;\n }\n if (unique.has(cwd)) continue;\n unique.add(cwd);\n result.push({ cwd, lastUsedAt: value.lastUsedAt });\n }\n return result;\n}\n\ninterface LegacyState extends Omit<SessionState, 'sessions'> {\n sessions?: Record<string, Omit<NonNullable<SessionState['sessions']>[string], 'agent'> & { agent: string }>;\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 workspaceRoots: string[];\n}\n\nexport interface RecentWorkspace {\n cwd: string;\n lastUsedAt: 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 agentSessionId?: string;\n updatedAt: number;\n}\n\nexport interface SessionExitEvent {\n sessionId: string;\n agent: AgentId;\n reason: 'agent-session-conflict';\n agentSessionId: string;\n ownerSessionId: string;\n occurredAt: 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 recentSessionExits?: Record<string, SessionExitEvent>;\n recentWorkspaces?: RecentWorkspace[];\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 type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'traex', 'claude'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\nexport type LegacyAgentId = 'trae-cli' | 'claude-code';\n\nexport function normalizeAgentId(value: string): AgentId | undefined {\n if (value === 'trae-cli') return 'traex';\n if (value === 'claude-code') return 'claude';\n return (AGENT_IDS as readonly string[]).includes(value) ? value as AgentId : undefined;\n}\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 AgentSessionStartedCandidate {\n sessionId: string;\n agent: AgentId;\n agentSessionId: string;\n cwd: string;\n source?: 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 { constants } from 'node:fs';\nimport { access, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, normalize, resolve } from 'node:path';\nimport { AppError, systemErrorCode } from '../core/errors.js';\n\nexport function normalizeWorkspacePath(input: string, home = homedir()): string {\n const value = input.trim();\n if (!value) throw invalidCwd(input, '工作目录不能为空');\n let expanded = value;\n if (value === '~') expanded = home;\n else if (value.startsWith('~/')) expanded = resolve(home, value.slice(2));\n else if (value.startsWith('~')) throw invalidCwd(input, '不支持 ~other-user,请使用 ~ 或 ~/目录');\n if (!isAbsolute(expanded)) throw invalidCwd(input, '工作目录必须是绝对路径,或使用 ~/目录');\n return normalize(expanded);\n}\n\nexport async function validateWorkspaceDirectory(input: string, home = homedir()): Promise<string> {\n const cwd = normalizeWorkspacePath(input, home);\n let info;\n try {\n info = await stat(cwd);\n } catch (error) {\n const reason = systemErrorCode(error) === 'EACCES'\n ? `无权访问工作目录:${cwd}`\n : `工作目录不存在或不可用:${cwd}`;\n throw invalidCwd(cwd, reason, error);\n }\n if (!info.isDirectory()) throw invalidCwd(cwd, `工作目录不是文件夹:${cwd}`);\n try {\n await access(cwd, constants.R_OK | constants.X_OK);\n } catch (error) {\n throw invalidCwd(cwd, `无权进入工作目录:${cwd}`, error);\n }\n return cwd;\n}\n\nexport function normalizeWorkspaceRoots(values: readonly string[], home = homedir()): string[] {\n const unique = new Set<string>();\n for (const value of values) unique.add(normalizeWorkspacePath(value, home));\n return [...unique];\n}\n\nfunction invalidCwd(cwd: string, reason: string, cause?: unknown): AppError {\n return new AppError('INVALID_CWD', reason, { cwd, reason }, cause === undefined ? {} : { cause });\n}\n","export const APP_ERROR_CODES = [\n 'SESSION_EXISTS',\n 'SESSION_STARTING',\n 'SESSION_START_TIMEOUT',\n 'AGENT_SESSION_IN_USE',\n 'AGENT_EXITED_DURING_STARTUP',\n 'AGENT_IDENTITY_TIMEOUT',\n 'SESSION_NOT_FOUND',\n 'INVALID_SESSION_NAME',\n 'NOT_INITIALIZED',\n 'INVALID_CWD',\n 'BINARY_NOT_FOUND',\n 'INVALID_OPTIONS',\n 'INVALID_RESUME',\n 'START_FAILED',\n 'DAEMON_UNAVAILABLE',\n 'DAEMON_UNRESPONSIVE',\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 { 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; signal?: AbortSignal } = {},\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 signal: options.signal,\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","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_RESUME',\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: 'traex',\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',\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 [\n '--dangerously-bypass-hook-trust',\n '-c', `hooks.SessionStart=[${hook}]`,\n '-c', `hooks.Stop=[${hook}]`,\n ];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n SessionStart: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\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: 'traex',\n displayName: 'traex',\n groupOrder: 20,\n binary: (config) => config.agentBinaries.traex,\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',\n displayName: 'claude',\n groupOrder: 30,\n binary: (config) => config.agentBinaries.claude,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { normalizeAgentId, type AgentAdapter, type AgentId } from './types.js';\n\nexport { normalizeAgentId } 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 normalizeAgentId(value) === 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';\nimport { AppError } from '../core/errors.js';\n\nexport type DaemonHealth =\n | { status: 'running'; info: DaemonInfo }\n | { status: 'unresponsive'; pid: number }\n | { status: 'stopped' };\n\nexport interface DaemonHealthProbe {\n ping(paths: AppPaths, timeoutMs: number): Promise<DaemonInfo | undefined>;\n readPid(paths: AppPaths): Promise<number>;\n processIsAlive(pid: number): boolean;\n isCurrentDaemonProcess(pid: number): Promise<boolean>;\n wait(ms: number): Promise<void>;\n}\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 const health = await daemonHealth(paths);\n if (health.status === 'running') return health.info;\n if (health.status === 'unresponsive') {\n throw new AppError('DAEMON_UNRESPONSIVE', 'daemon process is alive but its control socket is unresponsive', {\n pid: health.pid,\n });\n }\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 daemonHealth(paths: AppPaths, probe: DaemonHealthProbe = defaultHealthProbe): Promise<DaemonHealth> {\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const info = await probe.ping(paths, 400);\n if (info) return { status: 'running', info };\n if (attempt < 2) await probe.wait(80);\n }\n const pid = await probe.readPid(paths);\n if (validPid(pid) && probe.processIsAlive(pid) && await probe.isCurrentDaemonProcess(pid)) {\n return { status: 'unresponsive', pid };\n }\n return { status: 'stopped' };\n}\n\nconst defaultHealthProbe: DaemonHealthProbe = {\n ping: daemonInfo,\n readPid: async (paths) => Number.parseInt(await readFile(paths.pid, 'utf8').catch(() => ''), 10),\n processIsAlive,\n isCurrentDaemonProcess,\n wait: delay,\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_STARTING':\n return [\n `session「${sessionId}」正在启动,请等待当前操作完成。`,\n '',\n '稍后可查看状态:',\n ` lark-coding-assistant status ${sessionId}`,\n ];\n case 'SESSION_START_TIMEOUT': {\n const excerpt = safeValue(context.terminalExcerpt, 'Agent 未输出可用错误信息。');\n return [\n `session「${sessionId}」启动超过 30 秒,已取消并清理。`,\n '',\n `Agent:${safeValue(context.agent, '未知')}`,\n `工作目录:${safeValue(context.cwd, '未知')}`,\n `超时阶段:${safeValue(context.stage, 'unknown')}`,\n '',\n '最近终端输出:',\n excerpt,\n '',\n '可以直接使用同名 session 重试。',\n ];\n }\n case 'AGENT_SESSION_IN_USE': {\n const ownerSessionId = safeValue(context.ownerSessionId, '现有 session');\n const agentSessionId = typeof context.agentSessionId === 'string'\n ? safeValue(context.agentSessionId, '')\n : undefined;\n return [\n `无法启动 session「${sessionId}」:对应的 Agent 原生 session 已由「${ownerSessionId}」连接。`,\n ...(agentSessionId ? ['', `原生 session ID:${agentSessionId}`] : []),\n '',\n '请直接连接现有 session:',\n ` lark-coding-assistant attach ${ownerSessionId}`,\n ];\n }\n case 'AGENT_EXITED_DURING_STARTUP': {\n const exitStatus = typeof context.exitStatus === 'number' ? `(退出码 ${context.exitStatus})` : '';\n return [\n `Agent 启动后立即退出${exitStatus},session「${sessionId}」未创建。`,\n '',\n '原始错误:',\n safeValue(context.terminalExcerpt, 'Agent 未输出可用错误信息。'),\n '',\n '可查看日志或改为启动新会话:',\n ' lark-coding-assistant logs',\n ` lark-coding-assistant start --name ${sessionId} --agent ${safeValue(context.agent, 'codex')}`,\n ];\n }\n case 'AGENT_IDENTITY_TIMEOUT':\n return [\n `无法确认恢复目标,session「${sessionId}」未创建。`,\n 'Agent 仍在运行,但 LCA 未能识别原生 session ID。',\n '',\n '临时 tmux 已清理,请查看日志后重试或启动新会话:',\n ' lark-coding-assistant logs',\n ` lark-coding-assistant start --name ${sessionId} --agent ${safeValue(context.agent, 'codex')}`,\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 'INVALID_RESUME':\n return [\n `恢复参数无效:${safeValue(context.reason, error.message)}`,\n '',\n '请只选择一种恢复方式,并检查历史 session ID。',\n ];\n case 'START_FAILED':\n return [\n `无法启动 session「${sessionId}」。`,\n '',\n '请检查工作目录、Agent 安装和 daemon 日志:',\n ' lark-coding-assistant logs',\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 'DAEMON_UNRESPONSIVE':\n return [\n 'bridge daemon 进程仍在运行,但控制通道无响应。',\n '',\n '请重启 daemon;现有 coding-agent/tmux sessions 会保留:',\n ' lark-coding-assistant daemon restart',\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 workspace: '管理 workspace',\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","import type { AgentId, AgentResume } from '../agents/types.js';\nimport { AppError } from '../core/errors.js';\nimport { validateWorkspaceDirectory } from '../workspace/path.js';\n\nexport interface StartSessionRequest {\n sessionId: string;\n agent: AgentId;\n cwd: string;\n resume?: AgentResume;\n}\n\nexport async function validateStartSessionRequest(request: StartSessionRequest): Promise<StartSessionRequest> {\n if (!validSessionId(request.sessionId)) {\n throw new AppError(\n 'INVALID_SESSION_NAME',\n 'session name must use letters, digits, underscore, or dash',\n { sessionId: request.sessionId },\n );\n }\n const cwd = await validateWorkspaceDirectory(request.cwd);\n if (request.resume?.mode === 'session' && !request.resume.sessionId.trim()) {\n throw new AppError('INVALID_RESUME', 'resume session id must not be empty', {\n reason: '恢复历史会话时必须提供 session ID',\n });\n }\n return { ...request, cwd };\n}\n\nexport function validSessionId(value: string): boolean {\n return /^[a-zA-Z0-9_-]{1,40}$/.test(value);\n}\n","import { AGENT_IDS } from './agents/types.js';\nimport type { SessionState } from './core/model.js';\nimport type { RuntimeSessionStatus } from './daemon/protocol.js';\n\nexport interface CliDaemonSummary {\n status: 'running' | 'unresponsive' | 'stopped';\n pid?: number;\n version?: string;\n}\n\nexport interface CliStatusReport {\n daemon: CliDaemonSummary;\n cliVersion: string;\n state: SessionState;\n sessions: RuntimeSessionStatus[];\n requestedSessionId?: string;\n columns?: number;\n}\n\ninterface StatusRow {\n current: string;\n agent: string;\n session: string;\n status: string;\n tmux: string;\n cwd: string;\n}\n\nconst HEADERS: Array<keyof StatusRow> = ['current', 'agent', 'session', 'status', 'tmux', 'cwd'];\nconst LABELS: StatusRow = {\n current: '当前',\n agent: 'Agent',\n session: 'Session',\n status: '状态',\n tmux: 'tmux',\n cwd: '工作目录',\n};\n\nexport function formatCliStatus(report: CliStatusReport): string {\n const daemon = [\n `Daemon: ${report.daemon.status}`,\n ...(report.daemon.pid ? [`PID ${report.daemon.pid}`] : []),\n ...(report.daemon.version ? [`daemon ${report.daemon.version}`] : []),\n `CLI ${report.cliVersion}`,\n ].join(' · ');\n const sessions = [...report.sessions].sort(compareRuntimeSessions);\n if (report.requestedSessionId && sessions.length === 0) {\n return `${daemon}\\nSessions: 0\\n\\n未找到 session「${sanitize(report.requestedSessionId)}」,请运行 lca status 查看全部 session。`;\n }\n if (sessions.length === 0) return `${daemon}\\nSessions: 0\\n\\n暂无受管 session。`;\n const rows = sessions.map(toStatusRow);\n return `${daemon}\\nSessions: ${rows.length}\\n\\n${renderTable(rows, report.columns ?? 120)}`;\n}\n\nexport function fallbackRuntimeSessions(state: SessionState, requestedSessionId?: string): RuntimeSessionStatus[] {\n return Object.values(state.sessions ?? {})\n .filter(({ id }) => !requestedSessionId || id === requestedSessionId)\n .map((session) => ({\n session,\n active: session.id === state.activeSessionId,\n }));\n}\n\nfunction compareRuntimeSessions(left: RuntimeSessionStatus, right: RuntimeSessionStatus): number {\n const agent = AGENT_IDS.indexOf(left.session.agent) - AGENT_IDS.indexOf(right.session.agent);\n return agent || left.session.id.localeCompare(right.session.id);\n}\n\nfunction toStatusRow(runtime: RuntimeSessionStatus): StatusRow {\n return {\n current: runtime.active ? '●' : '',\n agent: runtime.session.agent,\n session: runtime.session.id,\n status: runtimeStatusLabel(runtime),\n tmux: runtime.paneAlive === undefined ? '无法确认' : runtime.paneAlive ? '运行中' : '已停止',\n cwd: runtime.session.cwd,\n };\n}\n\nfunction runtimeStatusLabel(runtime: RuntimeSessionStatus): string {\n if (runtime.paneAlive === undefined) return '无法确认';\n if (!runtime.paneAlive || runtime.screen?.state === 'exited') return '已停止';\n if (runtime.screen?.state === 'failed') return '执行失败';\n if (runtime.screen?.interaction?.kind === 'approval') return '等待审批';\n if (runtime.screen?.interaction?.kind === 'question') return '等待回答';\n if (runtime.screen?.interaction?.kind === 'choice') return '等待选择';\n if (runtime.screen?.state === 'input') return '等待输入';\n if (runtime.screen?.state === 'running') return '执行中';\n if (runtime.screen?.state === 'starting') return '启动中';\n if (runtime.screen?.state === 'idle') return '等待用户输入';\n return '状态未知';\n}\n\nfunction renderTable(rows: StatusRow[], terminalColumns: number): string {\n const desired = HEADERS.map((key) => Math.max(\n displayWidth(LABELS[key]),\n ...rows.map((row) => displayWidth(sanitize(row[key]))),\n ));\n const widths = [\n desired[0] ?? 4,\n desired[1] ?? 6,\n Math.min(desired[2] ?? 7, 24),\n desired[3] ?? 4,\n desired[4] ?? 4,\n desired[5] ?? 8,\n ];\n const fixedWidth = widths.slice(0, -1).reduce((sum, width) => sum + width, 0);\n const tableOverhead = HEADERS.length * 3 + 1;\n const cwdAvailable = terminalColumns - fixedWidth - tableOverhead;\n widths[5] = Math.max(18, Math.min(widths[5] ?? 18, cwdAvailable));\n\n const border = (left: string, middle: string, right: string): string =>\n `${left}${widths.map((width) => '─'.repeat(width + 2)).join(middle)}${right}`;\n const line = (row: StatusRow): string => `│${HEADERS.map((key, index) => {\n const value = sanitize(row[key]);\n const width = widths[index] ?? 0;\n return ` ${fit(value, width, key === 'cwd')} `;\n }).join('│')}│`;\n\n return [\n border('┌', '┬', '┐'),\n line(LABELS),\n border('├', '┼', '┤'),\n ...rows.map(line),\n border('└', '┴', '┘'),\n ].join('\\n');\n}\n\nfunction fit(value: string, width: number, middle = false): string {\n const fitted = displayWidth(value) <= width\n ? value\n : middle\n ? truncateMiddle(value, width)\n : `${takeStart(value, Math.max(0, width - 1))}…`;\n return `${fitted}${' '.repeat(Math.max(0, width - displayWidth(fitted)))}`;\n}\n\nfunction truncateMiddle(value: string, width: number): string {\n if (width <= 1) return '…'.slice(0, width);\n const remaining = width - 1;\n const leftWidth = Math.ceil(remaining / 2);\n return `${takeStart(value, leftWidth)}…${takeEnd(value, remaining - leftWidth)}`;\n}\n\nfunction takeStart(value: string, width: number): string {\n let result = '';\n let used = 0;\n for (const character of value) {\n const characterWidth = displayWidth(character);\n if (used + characterWidth > width) break;\n result += character;\n used += characterWidth;\n }\n return result;\n}\n\nfunction takeEnd(value: string, width: number): string {\n let result = '';\n let used = 0;\n for (const character of [...value].reverse()) {\n const characterWidth = displayWidth(character);\n if (used + characterWidth > width) break;\n result = character + result;\n used += characterWidth;\n }\n return result;\n}\n\nfunction displayWidth(value: string): number {\n let width = 0;\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n if (/\\p{Mark}/u.test(character)) continue;\n width += isWide(code) ? 2 : 1;\n }\n return width;\n}\n\nfunction isWide(code: number): boolean {\n return code >= 0x1100 && (\n code <= 0x115f\n || code === 0x2329 || code === 0x232a\n || (code >= 0x2e80 && code <= 0xa4cf && code !== 0x303f)\n || (code >= 0xac00 && code <= 0xd7a3)\n || (code >= 0xf900 && code <= 0xfaff)\n || (code >= 0xfe10 && code <= 0xfe19)\n || (code >= 0xfe30 && code <= 0xfe6f)\n || (code >= 0xff00 && code <= 0xff60)\n || (code >= 0xffe0 && code <= 0xffe6)\n || (code >= 0x1f300 && code <= 0x1faff)\n || (code >= 0x20000 && code <= 0x3fffd)\n );\n}\n\nfunction sanitize(value: string): string {\n return value\n .replace(/\\u001b\\[[0-?]*[ -/]*[@-~]/g, '')\n .replace(/[\\u0000-\\u001f\\u007f]+/g, ' ')\n .trim();\n}\n","import { isAbsolute, resolve } from 'node:path';\nimport type { AppConfig } from '../core/model.js';\nimport { normalizeWorkspacePath, validateWorkspaceDirectory } from './path.js';\n\nexport async function addWorkspaceRoot(\n config: AppConfig,\n input: string,\n cwd = process.cwd(),\n): Promise<{ config: AppConfig; path: string; added: boolean }> {\n const path = await validateWorkspaceDirectory(resolveWorkspaceRootInput(input, cwd));\n const existing = new Set(config.workspaceRoots);\n if (existing.has(path)) return { config, path, added: false };\n return { config: { ...config, workspaceRoots: [...config.workspaceRoots, path] }, path, added: true };\n}\n\nexport function removeWorkspaceRoot(\n config: AppConfig,\n input: string,\n cwd = process.cwd(),\n): { config: AppConfig; path: string; removed: boolean } {\n const path = normalizeWorkspacePath(resolveWorkspaceRootInput(input, cwd));\n const workspaceRoots = config.workspaceRoots.filter((candidate) => candidate !== path);\n return {\n config: workspaceRoots.length === config.workspaceRoots.length ? config : { ...config, workspaceRoots },\n path,\n removed: workspaceRoots.length !== config.workspaceRoots.length,\n };\n}\n\nexport function listWorkspaceRoots(config: AppConfig): string[] {\n return [...config.workspaceRoots];\n}\n\nfunction resolveWorkspaceRootInput(input: string, cwd: string): string {\n const value = input.trim();\n return value && !value.startsWith('~') && !isAbsolute(value)\n ? resolve(cwd, value)\n : value;\n}\n"],"mappings":"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","names":["randomBytes","readFile","spawn","resolve","chmod","mkdir","homedir","homedir","paths","mkdir","chmod","result","resolve","resolve","text","mkdir","open","readFile","spawn","paths","mkdir","log","open","spawn","readFile","resolve","result","isAbsolute","resolve","isAbsolute","resolve","readFile","randomBytes","resolve","result","exitEvent","spawn"]}