lark-coding-assistant 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/daemon/server.ts","../src/platform/process.ts","../src/screen/normalize.ts","../src/core/store.ts","../src/core/model.ts","../src/core/atomic-json.ts","../src/tmux/controller.ts","../src/tmux/input.ts","../src/screen/detector.ts","../src/screen/dialects.ts","../src/agents/resume.ts","../src/agents/stop-hook.ts","../src/agents/codex.ts","../src/agents/trae-cli.ts","../src/agents/claude-code.ts","../src/agents/types.ts","../src/agents/registry.ts","../src/agents/stop-event.ts","../src/lark/gateway.ts","../src/lark/action-signing.ts","../src/lark/cards.ts","../src/core/paths.ts","../src/daemon-entry.ts"],"sourcesContent":["import { appendFile, chmod, open, readFile, rm } from 'node:fs/promises';\nimport { createServer, type Socket } from 'node:net';\nimport { basename } from 'node:path';\nimport { runFile } from '../platform/process.js';\nimport type { ScreenDetection } from '../screen/detector.js';\nimport { tailScreen } from '../screen/normalize.js';\nimport { AppStore, createBindCode, hashBindCode } from '../core/store.js';\nimport type { AppConfig, ManagedSession, SessionState } from '../core/model.js';\nimport type { AppPaths } from '../core/paths.js';\nimport { TmuxController } from '../tmux/controller.js';\nimport type { DaemonRequest, DaemonResult, RuntimeStatus } from './protocol.js';\nimport { getAgentAdapter } from '../agents/registry.js';\nimport type { AgentId, AgentResume, TurnCompleteCandidate } from '../agents/types.js';\nimport { validTurnCompleteCandidate } from '../agents/stop-event.js';\nimport { LarkGateway, type GatewayFactory, type LarkActionResult, type RemoteGateway } from '../lark/gateway.js';\nimport type { CardActionEvent, NormalizedMessage } from '@larksuite/channel';\nimport type { SignedAction } from '../lark/action-signing.js';\nimport { verifyBindCode } from '../core/store.js';\nimport {\n CHOICE_FORM_SUBMIT_ACTION,\n MANUAL_TEXT_FIELD,\n choiceFormFieldName,\n inlineInputName,\n type ManualControlState,\n type ManualControlView,\n} from '../lark/cards.js';\n\nexport class AssistantDaemon {\n private config!: AppConfig;\n private state!: SessionState;\n private tmux!: TmuxController;\n private screen?: ScreenDetection;\n private previousScreen?: ScreenDetection;\n private readonly completedEvents = new Set<string>();\n private pendingCompletion?: TurnCompleteCandidate;\n private pendingCompletionAt = 0;\n private outputStableSince = Date.now();\n private timer?: NodeJS.Timeout;\n private pollInFlight?: Promise<void>;\n private ownsRuntimeFiles = false;\n private closing = false;\n private gateway?: RemoteGateway;\n private readonly pendingMessages: string[] = [];\n private interactionNotificationsSuppressed = 0;\n private unresolvedCandidate?: { key: string; since: number };\n private readonly unresolvedNotified = new Set<string>();\n private readonly closedManualCards = new Set<string>();\n private pendingInteractionInput?: {\n sessionId: string;\n interactionId: string;\n controlId: string;\n role: 'custom-input' | 'chat';\n label: string;\n cardMessageId: string;\n submitOnInput: boolean;\n action: SignedAction;\n };\n private readonly attachAttempts = new Map<string, number[]>();\n private server = createServer((socket) => this.handleSocket(socket));\n\n constructor(\n private readonly store: AppStore,\n private readonly paths: AppPaths,\n private readonly gatewayFactory: GatewayFactory = (config, secrets, handler) => new LarkGateway(config, secrets, handler),\n private readonly sessionName = 'lark-coding-assistant',\n private readonly stopHookCommand = 'lark-coding-assistant-hook',\n private readonly completionQuietMs = 2_500,\n private readonly appVersion = 'dev',\n ) {}\n\n async start(): Promise<void> {\n await this.store.ensure();\n const config = await this.store.loadConfig();\n if (!config) throw new Error('not initialized; run lark-coding-assistant init first');\n this.config = config;\n this.state = await this.store.loadState();\n this.tmux = new TmuxController(config.tmuxBinary);\n const secrets = await this.store.loadSecrets();\n if (!secrets) throw new Error('missing secrets; run lark-coding-assistant init again');\n await this.acquireRuntimeFiles();\n try {\n await this.reconcileSessions();\n await rm(this.paths.socket, { force: true });\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(this.paths.socket, () => resolve());\n });\n await chmod(this.paths.socket, 0o600);\n this.gateway = this.gatewayFactory(config, secrets, {\n onMessage: (message) => this.onLarkMessage(message),\n onAction: (event, action) => this.onLarkAction(event, action),\n });\n await this.gateway.connect();\n this.schedulePoll();\n await this.log('daemon started');\n } catch (error) {\n await this.releaseRuntimeFiles();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n this.closing = true;\n await this.log('daemon stopping').catch(() => undefined);\n if (this.timer) clearTimeout(this.timer);\n await this.pollInFlight?.catch(() => undefined);\n await this.gateway?.disconnect().catch(() => undefined);\n await new Promise<void>((resolve) => this.server.close(() => resolve()));\n await this.releaseRuntimeFiles();\n }\n\n private async acquireRuntimeFiles(): Promise<void> {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const pidFile = await open(this.paths.pid, 'wx', 0o600);\n try {\n await pidFile.writeFile(`${process.pid}\\n`);\n } finally {\n await pidFile.close();\n }\n this.ownsRuntimeFiles = true;\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) throw error;\n const existingPid = Number.parseInt(await readFile(this.paths.pid, 'utf8').catch(() => ''), 10);\n if (Number.isInteger(existingPid) && processIsAlive(existingPid)) {\n throw new Error(`daemon is already running with PID ${existingPid}`);\n }\n await rm(this.paths.pid, { force: true });\n }\n }\n throw new Error('failed to acquire daemon PID file');\n }\n\n private async releaseRuntimeFiles(): Promise<void> {\n if (!this.ownsRuntimeFiles) return;\n const ownerPid = Number.parseInt(await readFile(this.paths.pid, 'utf8').catch(() => ''), 10);\n if (ownerPid === process.pid) {\n await Promise.all([rm(this.paths.socket, { force: true }), rm(this.paths.pid, { force: true })]);\n }\n this.ownsRuntimeFiles = false;\n }\n\n private handleSocket(socket: Socket): void {\n socket.setEncoding('utf8');\n let buffer = '';\n let dispatched = false;\n socket.on('data', (chunk) => {\n if (dispatched) return;\n buffer += chunk;\n const newline = buffer.indexOf('\\n');\n if (newline === -1) return;\n dispatched = true;\n const line = buffer.slice(0, newline);\n void Promise.resolve()\n .then(() => JSON.parse(line) as DaemonRequest)\n .then((request) => this.dispatch(request))\n .then((response) => socket.end(`${JSON.stringify(response)}\\n`))\n .catch((error) => socket.end(`${JSON.stringify(fail(error))}\\n`));\n });\n socket.on('end', () => {\n if (!dispatched) socket.end();\n });\n }\n\n private async dispatch(request: DaemonRequest): Promise<DaemonResult> {\n switch (request.method) {\n case 'ping': return { ok: true, value: { version: this.appVersion, pid: process.pid } };\n case 'shutdown': {\n setTimeout(() => void this.close(), 25);\n return { ok: true };\n }\n case 'start': return this.startSession(request.sessionId, request.cwd, request.agent, request.resume);\n case 'status': return { ok: true, value: await this.runtimeStatus(request.sessionId) };\n case 'tail': return { ok: true, value: await this.tail(request.lines ?? 80) };\n case 'send': return this.send(request.text);\n case 'key': return this.key(request.key, request.fingerprint);\n case 'stop': return this.stopSession(request.sessionId);\n case 'useSession': return this.useSession(request.sessionId);\n case 'bindCode': return this.rotateBindCode();\n case 'resetOwner': return this.resetOwner();\n case 'turnComplete': return this.handleTurnComplete(request.candidate);\n }\n }\n\n private async startSession(\n sessionId: string,\n cwd: string,\n agentId: AgentId,\n resume?: AgentResume,\n ): Promise<DaemonResult> {\n if (!validSessionId(sessionId)) return { ok: false, error: 'session name must use letters, digits, underscore, or dash' };\n const existing = this.state.sessions?.[sessionId];\n if (existing && await this.tmux.inspect(existing.paneId)) {\n return { ok: false, error: `managed coding-agent session is already running: ${sessionId}` };\n }\n const becomesActive = !this.state.activeSessionId;\n if (becomesActive) {\n this.pendingMessages.length = 0;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n }\n const adapter = getAgentAdapter(agentId);\n const binary = adapter.binary(this.config);\n const agentVersion = (await runFile(binary, [...adapter.versionArgs])).stdout.trim();\n const tmuxSessionName = existing?.sessionName ?? `${this.sessionName}-${sessionId}`;\n const pane = await this.tmux.create({\n sessionName: tmuxSessionName,\n cwd,\n binary,\n args: adapter.buildLaunchArgs({\n resume,\n stopHookCommand: this.stopHookCommand,\n }),\n env: {\n LARK_CODING_ASSISTANT_SOCKET: this.paths.socket,\n LARK_CODING_ASSISTANT_SESSION_ID: sessionId,\n },\n });\n const binding = this.createSessionBinding();\n const session: ManagedSession = {\n id: sessionId,\n agent: agentId,\n sessionName: pane.sessionName,\n paneId: pane.paneId,\n cwd,\n agentVersion,\n updatedAt: Date.now(),\n };\n this.state = {\n ...this.state,\n sessions: { ...this.state.sessions, [sessionId]: session },\n activeSessionId: this.state.activeSessionId ?? sessionId,\n boundChatId: binding.mode === 'reused' ? this.state.boundChatId : undefined,\n bindCodeHash: binding.mode === 'code' ? hashBindCode(binding.bindCode) : undefined,\n bindCodeExpiresAt: binding.mode === 'code' ? Date.now() + 10 * 60_000 : undefined,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n await this.poll();\n return { ok: true, value: { pane, session, binding, active: this.state.activeSessionId === sessionId } };\n }\n\n private createSessionBinding():\n | { mode: 'reused' }\n | { mode: 'awaiting-owner-message' }\n | { mode: 'code'; bindCode: string; expiresInSeconds: number } {\n if (this.state.ownerOpenId && this.state.boundChatId && !this.state.autoBindDisabled) {\n return { mode: 'reused' };\n }\n if (this.state.ownerOpenId && !this.state.autoBindDisabled) {\n return { mode: 'awaiting-owner-message' };\n }\n return { mode: 'code', bindCode: createBindCode(), expiresInSeconds: 600 };\n }\n\n private async runtimeStatus(sessionId = this.state.activeSessionId): Promise<RuntimeStatus> {\n const session = sessionId ? this.state.sessions?.[sessionId] : undefined;\n const pane = session ? await this.tmux.inspect(session.paneId) : undefined;\n return { state: this.state, session, screen: sessionId === this.state.activeSessionId ? this.screen : undefined, paneAlive: Boolean(pane && !pane.dead) };\n }\n\n private async tail(lines: number): Promise<string> {\n const session = this.activeSession();\n if (!session) throw new Error('no active managed session');\n return tailScreen(await this.tmux.capture(session.paneId, lines), lines);\n }\n\n private async send(text: string): Promise<DaemonResult> {\n const session = this.activeSession();\n if (!session) return { ok: false, error: 'no active managed session' };\n await this.poll();\n if (this.screen?.state === 'approval') return { ok: false, error: 'approval is pending' };\n if (this.screen?.hasDraftInput) return { ok: false, error: 'local draft input detected' };\n if (!this.screen || this.screen.state === 'unknown') return { ok: false, error: 'screen state is unknown' };\n this.clearPendingCompletion();\n await this.tmux.sendText(session.paneId, text);\n return { ok: true };\n }\n\n private async onLarkMessage(message: NormalizedMessage): Promise<void> {\n if (message.chatType !== 'p2p' || message.senderIsBot || message.senderType === 'bot') return;\n const text = message.content.trim();\n const attachCode = text.match(/^\\/attach\\s+([^\\s]+)\\s*$/)?.[1];\n if (!this.state.boundChatId) {\n if (this.canAutoBind(message)) {\n await this.bindChat(message, true);\n } else {\n if (!attachCode) return;\n await this.handleAttach(message, attachCode);\n return;\n }\n }\n if (message.senderId !== this.state.ownerOpenId || message.chatId !== this.state.boundChatId) return;\n\n const tailMatch = text.match(/^\\/tail(?:\\s+(\\d+))?$/);\n if (tailMatch) {\n const lines = tailMatch[1] ? Number(tailMatch[1]) : 80;\n if (!Number.isInteger(lines) || lines < 20 || lines > 300) {\n await this.gateway?.sendText(message.chatId, '用法:/tail [20-300]');\n return;\n }\n const output = await this.tail(lines).catch((error) => `读取失败:${errorMessage(error)}`);\n const session = this.activeSession();\n const metadata = session\n ? `**${session.id} · ${getAgentAdapter(session.agent).displayName}** · 状态 \\`${this.screen?.state ?? 'unknown'}\\` · ${manualTimestamp()}`\n : '**当前没有 active session**';\n await this.gateway?.sendMarkdown(message.chatId, `${metadata}\\n\\n\\`\\`\\`text\\n${escapeFence(output).slice(-6800)}\\n\\`\\`\\``);\n return;\n }\n if (text.startsWith('/tail')) {\n await this.gateway?.sendText(message.chatId, '用法:/tail [20-300]');\n return;\n }\n if (text === '/manual') {\n await this.poll();\n const view = this.currentManualView();\n if (!view) await this.gateway?.sendText(message.chatId, '当前没有可遥控的 active tmux session。');\n else {\n try {\n await this.gateway?.sendManual(message.chatId, view);\n } catch (error) {\n await this.log(`manual card failed: ${errorMessage(error)}`);\n await this.gateway?.sendText(\n message.chatId,\n '手动遥控卡发送失败。可使用 /tail 120 查看终端,或使用 /key、/type、/submit 操作。',\n );\n }\n }\n return;\n }\n const manualKey = text.match(/^\\/key\\s+(up|down|left|right|enter|esc|tab|space|backspace|ctrl-c)$/i)?.[1];\n if (manualKey) {\n await this.executeManualCommand(message.chatId, `按键 ${manualKey}`, async (session) => {\n await this.tmux.sendKey(session.paneId, manualTmuxKey(manualKey));\n });\n return;\n }\n if (text.startsWith('/key')) {\n await this.gateway?.sendText(message.chatId, '用法:/key up|down|left|right|enter|esc|tab|space|backspace|ctrl-c');\n return;\n }\n const typeMatch = text.match(/^\\/(type|submit)\\s+([\\s\\S]+)$/);\n if (typeMatch?.[1] && typeMatch[2]?.trim()) {\n const submit = typeMatch[1] === 'submit';\n await this.executeManualCommand(message.chatId, submit ? '输入并提交' : '仅输入', async (session) => {\n await this.tmux.sendText(session.paneId, typeMatch[2] as string, submit);\n });\n return;\n }\n if (text === '/type' || text === '/submit') {\n await this.gateway?.sendText(message.chatId, `用法:${text} <文本>`);\n return;\n }\n if (text === '/status') {\n const status = await this.runtimeStatus();\n await this.gateway?.sendStatus(message.chatId, status);\n return;\n }\n if (text === '/sessions') {\n const sessions = await this.reconcileSessions();\n try {\n await this.gateway?.sendSessionPicker(\n message.chatId,\n sessions,\n this.state.activeSessionId,\n );\n } catch (error) {\n await this.log(`session picker notification failed: ${errorMessage(error)}`);\n await this.gateway?.sendText(\n message.chatId,\n 'Session 选择卡片发送失败,请稍后重试;也可以发送 /use <session 名称> 进行切换。',\n );\n }\n return;\n }\n const useSessionId = text.match(/^\\/use\\s+([a-zA-Z0-9_-]+)\\s*$/)?.[1];\n if (useSessionId) {\n const result = await this.useSession(useSessionId);\n const target = this.state.sessions?.[useSessionId];\n const reply = result.ok\n ? `已连接到 ${target ? getAgentAdapter(target.agent).displayName : 'coding agent'} session:${useSessionId}`\n : `切换失败:${result.error}`;\n await this.gateway?.sendText(\n message.chatId,\n reply,\n );\n return;\n }\n if (text === '/detach') {\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n this.state = {\n ...this.state,\n boundChatId: undefined,\n autoBindDisabled: true,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n await this.gateway?.sendText(message.chatId, '已解除本次飞书绑定;coding agent 和 tmux 仍在运行。');\n return;\n }\n if (text === '/stop') {\n await this.poll();\n const session = this.activeSession();\n if (!session || !this.screen) {\n await this.gateway?.sendText(message.chatId, '当前没有可停止的 coding agent 会话。');\n } else {\n await this.gateway?.sendStopConfirmation(message.chatId, session.paneId, this.screen.fingerprint, session.agent);\n }\n return;\n }\n\n const pendingInput = this.pendingInteractionInput;\n if (pendingInput) {\n const session = this.activeSession();\n if (!session || session.id !== pendingInput.sessionId) {\n this.pendingInteractionInput = undefined;\n await this.gateway?.sendText(message.chatId, '交互会话已经变化,请重新操作。');\n return;\n }\n await this.tmux.sendText(session.paneId, message.content, pendingInput.submitOnInput);\n this.pendingInteractionInput = undefined;\n if (pendingInput.submitOnInput) {\n await this.waitForInteractionChange(pendingInput.interactionId);\n if (this.screen?.interaction?.interactionId === pendingInput.interactionId) {\n await this.gateway?.sendText(message.chatId, '补充内容已输入,但终端仍停留在原问题,请用 /tail 检查。');\n return;\n }\n const content = `已向 ${getAgentAdapter(session.agent).displayName} 提交补充内容。`;\n await this.gateway?.completeChoiceInput(pendingInput.cardMessageId, pendingInput.action, content);\n await this.flushPending();\n return;\n }\n if (pendingInput.role === 'custom-input') {\n const refreshed = await this.withInteractionNotificationsSuppressed(async () => {\n await this.waitForCustomInputValue(pendingInput.interactionId, pendingInput.controlId, message.content);\n const current = this.screen;\n if (current?.interaction?.semantics && (current.interaction.actionConfidence ?? 0) >= 0.85) {\n await this.gateway?.updateChoice(\n pendingInput.cardMessageId,\n message.chatId,\n session.paneId,\n current,\n session.agent,\n );\n return true;\n }\n return false;\n });\n if (refreshed) return;\n }\n await this.gateway?.sendText(message.chatId, `已向 ${getAgentAdapter(session.agent).displayName} 提交补充内容。`);\n return;\n }\n\n await this.poll();\n if (this.shouldQueueMessage()) {\n if (this.pendingMessages.length >= 100) {\n await this.gateway?.sendText(message.chatId, '待发送队列已满,请先处理当前终端状态。');\n return;\n }\n this.pendingMessages.push(message.content);\n await this.gateway?.sendText(message.chatId, `当前终端暂不可安全写入,消息已排队(${this.pendingMessages.length} 条)。`);\n return;\n }\n const result = await this.send(message.content);\n if (!result.ok) await this.gateway?.sendText(message.chatId, `未发送:${result.error}`);\n }\n\n private async handleAttach(message: NormalizedMessage, code: string): Promise<void> {\n if (this.state.ownerOpenId && message.senderId !== this.state.ownerOpenId) return;\n if (!this.allowAttachAttempt(message.senderId)) return;\n const valid = Boolean(\n this.state.bindCodeHash\n && this.state.bindCodeExpiresAt\n && this.state.bindCodeExpiresAt >= Date.now()\n && verifyBindCode(code, this.state.bindCodeHash),\n );\n if (!valid) {\n await this.gateway?.sendText(message.chatId, '绑定失败:绑定码无效或已过期。');\n return;\n }\n await this.bindChat(message, false);\n }\n\n private canAutoBind(message: NormalizedMessage): boolean {\n return !this.state.autoBindDisabled\n && Boolean(this.state.ownerOpenId)\n && message.senderId === this.state.ownerOpenId;\n }\n\n private async bindChat(message: NormalizedMessage, automatic: boolean): Promise<void> {\n this.state = {\n ...this.state,\n ownerOpenId: this.state.ownerOpenId ?? message.senderId,\n boundChatId: message.chatId,\n autoBindDisabled: false,\n bindCodeHash: undefined,\n bindCodeExpiresAt: undefined,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n await this.gateway?.sendText(\n message.chatId,\n automatic\n ? '已自动连接当前 coding agent 会话。之后直接发送普通消息即可。'\n : '绑定成功。之后的普通消息会发送到当前 tmux 中的 coding agent;可用 /tail、/status、/sessions、/detach、/stop。',\n );\n this.previousScreen = undefined;\n await this.poll();\n }\n\n private allowAttachAttempt(senderId: string): boolean {\n const cutoff = Date.now() - 60_000;\n const attempts = (this.attachAttempts.get(senderId) ?? []).filter((time) => time >= cutoff);\n if (attempts.length >= 5) return false;\n attempts.push(Date.now());\n this.attachAttempts.set(senderId, attempts);\n return true;\n }\n\n private shouldQueueMessage(): boolean {\n return !this.screen\n || this.screen.state === 'approval'\n || this.screen.state === 'unknown'\n || this.screen.state === 'failed'\n || this.screen.state === 'exited'\n || this.screen.hasDraftInput;\n }\n\n private async onLarkAction(\n event: CardActionEvent,\n action: SignedAction,\n ): Promise<LarkActionResult> {\n if (event.operator.openId !== this.state.ownerOpenId || event.chatId !== this.state.boundChatId) {\n return { type: 'error', content: '无权操作当前会话。' };\n }\n if (action.kind === 'session') {\n const target = this.state.sessions?.[action.action];\n if (!target\n || target.agent !== action.agent\n || target.paneId !== action.paneId\n || String(target.updatedAt) !== action.fingerprint) {\n return { type: 'error', content: '目标 session 已变化,请重新发送 /sessions。' };\n }\n const result = await this.useSession(target.id);\n return result.ok\n ? { type: 'success', content: `已连接到 ${target.id}` }\n : { type: 'error', content: result.error };\n }\n if (action.kind === 'manual') {\n return this.withInteractionNotificationsSuppressed(() => this.handleManualAction(action, event));\n }\n await this.poll();\n const session = this.activeSession();\n if (action.kind === 'choice') {\n return this.withInteractionNotificationsSuppressed(() => this.handleChoiceAction(action, session, event));\n }\n if (action.paneId !== session?.paneId || action.agent !== session.agent || action.fingerprint !== this.screen?.fingerprint) {\n return { type: 'error', content: '会话画面已变化,请重新发送 /stop。' };\n }\n const result = await this.stopSession(session.id);\n return result.ok\n ? { type: 'success', content: `${getAgentAdapter(session.agent).displayName} 会话已停止。` }\n : { type: 'error', content: result.error };\n }\n\n private async handleManualAction(action: SignedAction, event: CardActionEvent): Promise<LarkActionResult> {\n await this.poll();\n const session = this.activeSession();\n const screen = this.screen;\n if (!session || !screen || action.sessionId !== session.id || action.agent !== session.agent || action.paneId !== session.paneId) {\n return { type: 'error', content: '手动遥控对应的 session 已变化,请重新发送 /manual。' };\n }\n if (this.closedManualCards.has(event.messageId)) {\n return {\n type: 'manual', content: '该手动遥控卡已经结束。',\n view: this.manualView(session, screen, 'exited', undefined, '结束遥控', action.manualMode),\n };\n }\n if (action.action !== 'refresh' && action.fingerprint !== screen.fingerprint) {\n return {\n type: 'manual', content: '终端画面已变化,旧操作未执行。',\n view: this.manualView(session, screen, 'stale', '请确认最新终端画面后重试。', undefined, action.manualMode),\n };\n }\n if (action.action === 'exit') {\n remember(this.closedManualCards, event.messageId, 256);\n return {\n type: 'manual', content: '已结束手动遥控。',\n view: this.manualView(session, screen, 'exited', undefined, '结束遥控', action.manualMode),\n };\n }\n let operation = '刷新终端输出';\n try {\n if (action.action === 'type' || action.action === 'submit') {\n const value = event.action.formValue?.[MANUAL_TEXT_FIELD];\n if (typeof value !== 'string' || !value.trim()) return { type: 'error', content: '请输入要发送到终端的文本。' };\n const submit = action.action === 'submit';\n operation = submit ? '输入文本并提交' : '仅输入文本';\n await this.tmux.sendText(session.paneId, value, submit);\n } else if (action.action !== 'refresh') {\n const key = manualTmuxKey(action.action);\n operation = `按键 ${action.action}`;\n await this.tmux.sendKey(session.paneId, key);\n }\n if (action.action === 'refresh') await this.poll();\n else await this.settleManualScreen();\n } catch (error) {\n await this.poll().catch(() => undefined);\n const current = this.screen ?? screen;\n return {\n type: 'manual', content: '手动操作失败。',\n view: this.manualView(session, current, 'error', errorMessage(error), operation, action.manualMode),\n };\n }\n const current = this.screen ?? screen;\n if (action.manualMode !== 'explicit' && safeStructuredInteraction(current)) {\n await this.gateway?.sendChoice(event.chatId, session.paneId, current, session.agent);\n return {\n type: 'manual', content: '已恢复结构化识别。',\n view: this.manualView(session, current, 'recovered', undefined, operation, action.manualMode),\n };\n }\n return {\n type: 'manual', content: `${operation}已执行。`,\n view: this.manualView(session, current, 'active', undefined, operation, action.manualMode),\n };\n }\n\n private currentManualView(): ManualControlView | undefined {\n const session = this.activeSession();\n if (!session || !this.screen || this.screen.state === 'exited') return undefined;\n return this.manualView(session, this.screen, 'active', undefined, undefined, 'explicit');\n }\n\n private async settleManualScreen(): Promise<void> {\n let previousFingerprint: string | undefined;\n const deadline = Date.now() + 900;\n do {\n await new Promise((resolve) => setTimeout(resolve, 120));\n await this.poll();\n const fingerprint = this.screen?.fingerprint;\n if (fingerprint && fingerprint === previousFingerprint) return;\n previousFingerprint = fingerprint;\n } while (Date.now() < deadline);\n }\n\n private manualView(\n session: ManagedSession,\n screen: ScreenDetection,\n state: ManualControlState = 'active',\n notice?: string,\n lastOperation?: string,\n mode: ManualControlView['mode'] = 'fallback',\n ): ManualControlView {\n return {\n session,\n screen,\n output: tailScreen(screen.normalized, 40),\n capturedAt: new Date(),\n state,\n notice,\n lastOperation,\n mode,\n };\n }\n\n private async executeManualCommand(\n chatId: string,\n operation: string,\n execute: (session: ManagedSession) => Promise<void>,\n ): Promise<void> {\n await this.poll();\n const session = this.activeSession();\n if (!session || !this.screen || this.screen.state === 'exited') {\n await this.gateway?.sendText(chatId, '当前没有可遥控的 active tmux session。');\n return;\n }\n try {\n await execute(session);\n await new Promise((resolve) => setTimeout(resolve, 120));\n await this.poll();\n const output = this.screen ? tailScreen(this.screen.normalized, 60) : '无法读取最新终端画面。';\n await this.gateway?.sendMarkdown(chatId, `**手动操作:${operation}**\\n\\n\\`\\`\\`text\\n${escapeFence(output).slice(-6500)}\\n\\`\\`\\``);\n } catch (error) {\n await this.gateway?.sendText(chatId, `手动操作失败:${errorMessage(error)}`);\n }\n }\n\n private async handleChoiceAction(action: SignedAction, session: ManagedSession | undefined, event: CardActionEvent): Promise<LarkActionResult> {\n if (action.paneId !== session?.paneId || action.agent !== session.agent) return { type: 'error', content: '会话已变化。' };\n if (event.action.formValue) {\n if (action.action !== CHOICE_FORM_SUBMIT_ACTION) return { type: 'error', content: '无法识别该表单操作,请使用最新卡片。' };\n return this.handleToggleFormSubmit(action, session, event.action.formValue);\n }\n const before = this.screen?.interaction;\n const target = this.screen?.actions.find(({ key }) => key === action.action);\n const fingerprint = before?.revision ?? this.screen?.fingerprint ?? action.fingerprint;\n const customAlreadySelected = target?.role === 'custom-input'\n && (target.marker === 'checked' || target.marker === 'selected')\n && fingerprint === action.fingerprint\n && before?.kind === action.interactionKind;\n const opensEditor = target?.role === 'custom-input' && target.editor;\n let result: DaemonResult;\n if (customAlreadySelected) {\n result = { ok: true, value: `继续填写:${target.label}` };\n } else if (opensEditor && before?.interactionId) {\n const navigation = await this.navigateToControl(session.paneId, target.id, before.interactionId);\n if (!navigation.ok) return { type: 'error', content: navigation.error };\n if (opensEditor.openKey) await this.tmux.sendKey(session.paneId, opensEditor.openKey);\n result = { ok: true, value: `继续填写:${target.label}` };\n } else {\n result = await this.submitChoice(action.action, fingerprint, action.interactionKind);\n }\n if (!result.ok) return { type: 'error', content: result.error };\n if (before?.semantics?.activation === 'toggle' && target?.role === 'answer') {\n await this.waitForControlMarker(before.interactionId, target.id, target.marker);\n const currentScreen = this.screen;\n const currentTarget = currentScreen?.actions.find(({ id }) => id === target.id);\n if (!currentScreen || !currentTarget || currentScreen.interaction?.interactionId !== before.interactionId || currentTarget.marker === target.marker) {\n return { type: 'error', content: '终端选择状态没有按预期更新,请用 /tail 检查。' };\n }\n return {\n type: 'refresh', content: `${currentTarget.marker === 'checked' || currentTarget.marker === 'selected' ? '已选择' : '已取消'}:${target.label}`,\n screen: currentScreen, paneId: session.paneId, agent: session.agent,\n };\n }\n if (target?.role === 'custom-input' || target?.role === 'chat') {\n await new Promise((resolve) => setTimeout(resolve, 100));\n await this.poll();\n if (!before?.interactionId) return { type: 'error', content: '无法确认当前交互,请用 /tail 检查。' };\n this.pendingInteractionInput = {\n sessionId: session.id,\n interactionId: this.screen?.interaction?.interactionId ?? before.interactionId,\n controlId: target.id,\n role: target.role,\n label: target.label,\n cardMessageId: event.messageId,\n submitOnInput: target.role === 'chat' || before.semantics?.activation === 'submit',\n action,\n };\n return { type: 'awaiting-input', content: '请发送下一条普通消息。', agent: session.agent, label: target.label };\n }\n await this.waitForInteractionChange(before?.interactionId);\n if (this.screen?.interaction\n && this.screen.interaction.interactionId !== before?.interactionId\n && this.screen.interaction.semantics\n && (this.screen.interaction.actionConfidence ?? 0) >= 0.85) {\n return {\n type: 'refresh',\n content: '已进入下一步确认。',\n screen: this.screen,\n paneId: session.paneId,\n agent: session.agent,\n };\n }\n if ((target?.role === 'submit' || before?.semantics?.commit.mode === 'immediate')\n && this.screen?.interaction?.interactionId === before?.interactionId) {\n return { type: 'error', content: '终端仍停留在原问题,未确认提交成功。' };\n }\n await this.flushPending();\n return { type: 'success', content: result.value as string };\n }\n\n private async handleToggleFormSubmit(\n action: SignedAction,\n session: ManagedSession,\n formValue: Record<string, unknown>,\n ): Promise<LarkActionResult> {\n const initialScreen = this.screen;\n const interaction = initialScreen?.interaction;\n if (!initialScreen || !interaction?.interactionId || interaction.semantics?.activation !== 'toggle'\n || (interaction.revision ?? initialScreen.fingerprint) !== action.fingerprint\n || interaction.kind !== action.interactionKind) {\n return { type: 'error', content: '卡片状态已变化,请使用最新卡片。' };\n }\n const synced = await this.syncToggleFormState(session.paneId, initialScreen, formValue);\n if (!synced.ok) return { type: 'error', content: synced.error };\n\n if (synced.committed) {\n await this.waitForInteractionChange(interaction.interactionId);\n if (this.screen?.interaction?.interactionId === interaction.interactionId) {\n return { type: 'error', content: '自定义内容已同步,但终端仍停留在原问题。' };\n }\n if (this.screen?.interaction?.semantics && (this.screen.interaction.actionConfidence ?? 0) >= 0.85) {\n return {\n type: 'refresh', content: '答案已提交,已进入下一步确认。', screen: this.screen,\n paneId: session.paneId, agent: session.agent,\n };\n }\n await this.flushPending();\n return { type: 'success', content: `已向 ${getAgentAdapter(session.agent).displayName} 提交答案。` };\n }\n\n await this.poll();\n const current = this.screen;\n if (!current?.interaction || current.interaction.interactionId !== interaction.interactionId) {\n return { type: 'error', content: '终端问题在提交前已经变化,请使用最新卡片。' };\n }\n const commit = current.interaction.semantics?.commit;\n if (!commit || commit.mode === 'immediate') return { type: 'error', content: '无法确定终端提交方式,请用 /tail 检查。' };\n if (commit.mode === 'key') {\n await this.tmux.sendKey(session.paneId, commit.key);\n } else {\n const submit = current.actions.find(({ id }) => id === commit.controlId);\n if (!submit) return { type: 'error', content: '终端提交按钮已经变化,请使用最新卡片。' };\n const navigation = await this.navigateToControl(session.paneId, submit.id, interaction.interactionId);\n if (!navigation.ok) return { type: 'error', content: navigation.error };\n await this.tmux.sendKey(session.paneId, 'Enter');\n }\n\n await this.waitForInteractionChange(interaction.interactionId);\n if (this.screen?.interaction?.interactionId === interaction.interactionId) {\n return { type: 'error', content: '终端仍停留在原问题,未确认提交成功。' };\n }\n if (this.screen?.interaction?.semantics && (this.screen.interaction.actionConfidence ?? 0) >= 0.85) {\n return {\n type: 'refresh', content: '答案已提交,已进入下一步确认。', screen: this.screen,\n paneId: session.paneId, agent: session.agent,\n };\n }\n await this.flushPending();\n return { type: 'success', content: `已向 ${getAgentAdapter(session.agent).displayName} 提交答案。` };\n }\n\n private async withInteractionNotificationsSuppressed<T>(operation: () => Promise<T>): Promise<T> {\n this.interactionNotificationsSuppressed += 1;\n try {\n return await operation();\n } finally {\n this.interactionNotificationsSuppressed -= 1;\n }\n }\n\n private async key(key: string, fingerprint: string): Promise<DaemonResult> {\n return this.submitChoice(key, fingerprint);\n }\n\n private async submitChoice(\n choice: string,\n fingerprint: string,\n expectedKind?: 'approval' | 'question' | 'choice',\n ): Promise<DaemonResult> {\n const session = this.activeSession();\n if (!session) return { ok: false, error: 'no active managed session' };\n await this.poll();\n const screen = this.screen;\n const interaction = screen?.interaction;\n const revision = interaction?.revision ?? screen?.fingerprint;\n if (!screen || !interaction?.semantics || !interaction.actionConfidence || interaction.actionConfidence < 0.85\n || revision !== fingerprint || screen.actions.length === 0\n || (expectedKind && interaction.kind !== expectedKind)) {\n return { ok: false, error: 'choice screen changed; refusing stale action' };\n }\n const target = screen.actions.find((action) => action.key === choice);\n if (!target) return { ok: false, error: 'option is not valid for current choice' };\n if (target.shortcut && (target.role === 'custom-input' || target.role === 'chat')) {\n await this.tmux.sendKey(session.paneId, target.shortcut);\n } else {\n const navigation = await this.navigateToControl(session.paneId, target.id, interaction.interactionId);\n if (!navigation.ok) return navigation;\n await this.tmux.sendKey(session.paneId, 'Enter');\n }\n const verb = interaction.kind === 'approval' ? '提交审批选择' : interaction.kind === 'question' ? '提交答案' : '提交选择';\n return { ok: true, value: `已向 ${getAgentAdapter(session.agent).displayName} ${verb}:${target.label}` };\n }\n\n private async navigateToControl(paneId: string, targetId: string, interactionId?: string): Promise<DaemonResult> {\n for (let step = 0; step < 24; step += 1) {\n const screen = this.screen;\n if (!screen?.interaction || screen.interaction.interactionId !== interactionId) {\n return { ok: false, error: 'interaction changed while navigating; refusing action' };\n }\n const focusedIndex = screen.actions.findIndex(({ focused }) => focused);\n const targetIndex = screen.actions.findIndex(({ id }) => id === targetId);\n if (focusedIndex === -1 || targetIndex === -1) return { ok: false, error: 'cannot determine current or target focus' };\n if (focusedIndex === targetIndex) return { ok: true };\n const direction = targetIndex > focusedIndex ? 'Down' : 'Up';\n await this.tmux.sendKey(paneId, direction);\n await new Promise((resolve) => setTimeout(resolve, 40));\n await this.poll();\n const nextFocused = this.screen?.actions.findIndex(({ focused }) => focused) ?? -1;\n if (nextFocused === focusedIndex) return { ok: false, error: 'terminal focus did not move as expected' };\n }\n return { ok: false, error: 'terminal focus navigation exceeded its safe step limit' };\n }\n\n private async waitForInteractionChange(interactionId?: string): Promise<void> {\n const deadline = Date.now() + 1_500;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 75));\n await this.poll();\n const current = this.screen?.interaction;\n if (!current || current.interactionId !== interactionId) return;\n }\n }\n\n private async waitForControlMarker(interactionId: string | undefined, controlId: string, marker: import('../screen/interaction-types.js').SelectionMarker | undefined): Promise<void> {\n const deadline = Date.now() + 1_500;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 75));\n await this.poll();\n const current = this.screen?.interaction;\n const control = this.screen?.actions.find(({ id }) => id === controlId);\n if (!current || current.interactionId !== interactionId || control?.marker !== marker) return;\n }\n }\n\n private async waitForCustomInputValue(interactionId: string, controlId: string, input: string): Promise<void> {\n const expected = input.trim();\n const deadline = Date.now() + 1_500;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 75));\n await this.poll();\n const control = this.screen?.actions.find(({ id }) => id === controlId);\n if (this.screen?.interaction?.interactionId === interactionId\n && control?.inputValue\n && (control.inputValue === expected || expected.startsWith(control.inputValue))) return;\n }\n }\n\n private async syncToggleFormState(\n paneId: string,\n initialScreen: ScreenDetection,\n formValue: Record<string, unknown>,\n ): Promise<{ ok: true; committed: boolean } | { ok: false; error: string }> {\n const interactionId = initialScreen.interaction?.interactionId;\n if (!interactionId) return { ok: false, error: '无法确定当前终端问题。' };\n const desiredControls = initialScreen.actions.flatMap((control, index) => {\n if (control.role !== 'answer' && control.role !== 'custom-input') return [];\n const selected = formChecked(formValue[choiceFormFieldName(index)]);\n const rawInput = formValue[inlineInputName(index)];\n const input = control.role === 'custom-input' && typeof rawInput === 'string'\n ? rawInput.trim()\n : undefined;\n return [{ id: control.id, role: control.role, selected, input, editor: control.editor }];\n }).sort((left, right) => Number(left.role === 'custom-input') - Number(right.role === 'custom-input'));\n const emptyCustom = desiredControls.find(({ role, selected, input }) => role === 'custom-input' && selected && !input);\n if (emptyCustom) return { ok: false, error: '已勾选自定义输入,但内容为空。请填写内容后再提交。' };\n\n const toggleKey = initialScreen.interaction?.semantics?.toggleKey ?? 'Enter';\n for (const desired of desiredControls) {\n await this.poll();\n let control = this.screen?.actions.find(({ id }) => id === desired.id);\n if (!control || this.screen?.interaction?.interactionId !== interactionId) {\n return { ok: false, error: '终端选项已经变化,请使用最新卡片。' };\n }\n const currentlySelected = control.marker === 'checked' || control.marker === 'selected';\n if (currentlySelected !== desired.selected) {\n const navigation = await this.navigateToControl(paneId, control.id, interactionId);\n if (!navigation.ok) return navigation;\n const previousMarker = control.marker;\n await this.tmux.sendKey(paneId, toggleKey);\n await this.waitForControlMarker(interactionId, control.id, previousMarker);\n control = this.screen?.actions.find(({ id }) => id === desired.id);\n const selectedAfterToggle = control?.marker === 'checked' || control?.marker === 'selected';\n if (!control || selectedAfterToggle !== desired.selected) {\n return { ok: false, error: `终端选项“${control?.label ?? desired.id}”没有按预期更新。` };\n }\n }\n if (desired.role !== 'custom-input' || !desired.selected || desired.input === undefined) continue;\n control = this.screen?.actions.find(({ id }) => id === desired.id);\n if (control?.inputValue?.trim() === desired.input) continue;\n const navigation = await this.navigateToControl(paneId, desired.id, interactionId);\n if (!navigation.ok) return navigation;\n if (desired.editor) {\n if (desired.editor.openKey) await this.tmux.sendKey(paneId, desired.editor.openKey);\n await new Promise((resolve) => setTimeout(resolve, 100));\n await this.tmux.sendKey(paneId, 'C-u');\n await this.tmux.sendKey(paneId, 'C-k');\n await this.tmux.sendText(paneId, desired.input, false);\n await this.tmux.sendKey(paneId, desired.editor.submitKey);\n return { ok: true, committed: desired.editor.commitsInteraction };\n }\n await this.tmux.sendKey(paneId, 'C-u');\n await this.tmux.sendKey(paneId, 'C-k');\n await this.tmux.sendText(paneId, desired.input, false);\n await this.waitForCustomInputValue(interactionId, desired.id, desired.input);\n control = this.screen?.actions.find(({ id }) => id === desired.id);\n if (!control?.inputValue || !(desired.input === control.inputValue || desired.input.startsWith(control.inputValue))) {\n return { ok: false, error: '自定义内容没有完整同步到终端,请重试。' };\n }\n }\n return { ok: true, committed: false };\n }\n\n private async stopSession(sessionId = this.state.activeSessionId): Promise<DaemonResult> {\n if (!sessionId) return { ok: false, error: 'no active managed session' };\n const session = this.state.sessions?.[sessionId];\n if (!session) return { ok: false, error: `unknown session: ${sessionId}` };\n if (await this.tmux.hasSession(session.sessionName)) {\n await this.tmux.killSession(session.sessionName);\n }\n const sessions = { ...this.state.sessions };\n delete sessions[sessionId];\n const wasActive = this.state.activeSessionId === sessionId;\n const activeSessionId = wasActive\n ? Object.keys(sessions)[0]\n : this.state.activeSessionId;\n this.state = {\n ...this.state,\n sessions,\n activeSessionId,\n updatedAt: Date.now(),\n };\n if (wasActive) {\n this.screen = undefined;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n }\n await this.store.saveState(this.state);\n return { ok: true };\n }\n\n private async resetOwner(): Promise<DaemonResult> {\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n this.state = {\n ...this.state,\n ownerOpenId: undefined,\n boundChatId: undefined,\n autoBindDisabled: true,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n return { ok: true };\n }\n\n private async rotateBindCode(): Promise<DaemonResult> {\n if (Object.keys(this.state.sessions ?? {}).length === 0) return { ok: false, error: 'no managed coding-agent session is running' };\n const bindCode = createBindCode();\n this.state = {\n ...this.state,\n boundChatId: undefined,\n autoBindDisabled: true,\n bindCodeHash: hashBindCode(bindCode),\n bindCodeExpiresAt: Date.now() + 10 * 60_000,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n return { ok: true, value: { bindCode, expiresInSeconds: 600 } };\n }\n\n private schedulePoll(): void {\n if (this.closing) return;\n this.timer = setTimeout(() => {\n void this.runScheduledPoll();\n }, this.config.pollIntervalMs);\n }\n\n private async runScheduledPoll(): Promise<void> {\n const operation = this.poll().catch(async (error) => {\n if (!this.closing) await this.log(`poll failed: ${errorMessage(error)}`);\n });\n this.pollInFlight = operation;\n try {\n await operation;\n } finally {\n if (this.pollInFlight === operation) this.pollInFlight = undefined;\n if (!this.closing) this.schedulePoll();\n }\n }\n\n private async poll(): Promise<void> {\n const session = this.activeSession();\n const paneId = session?.paneId;\n if (!paneId) {\n await this.reconcileSessions();\n return;\n }\n const pane = await this.tmux.inspect(paneId);\n const adapter = getAgentAdapter(session.agent);\n if (!pane || pane.dead) {\n this.updateScreen(adapter.detectScreen('', false));\n await this.notifyTransition();\n await this.maybeNotifyUnresolved();\n await this.maybeNotifyCompletion();\n await this.reconcileSessions();\n return;\n }\n const raw = await this.tmux.capture(paneId, 160);\n this.updateScreen(adapter.detectScreen(raw, true, { x: pane.cursorX, y: pane.cursorY }));\n await this.notifyTransition();\n await this.maybeNotifyUnresolved();\n await this.maybeNotifyCompletion();\n await this.flushPending();\n await this.reconcileSessions();\n }\n\n private async notifyTransition(): Promise<void> {\n const current = this.screen;\n const previous = this.previousScreen;\n this.previousScreen = current;\n const session = this.activeSession();\n if (!current || !session || !this.gateway) return;\n const agentName = getAgentAdapter(session.agent).displayName;\n if (previous?.state === current.state && previous.fingerprint === current.fingerprint\n && selectionSnapshot(previous) === selectionSnapshot(current)) return;\n if (this.interactionNotificationsSuppressed > 0 && current.interaction) return;\n try {\n if (!this.state.boundChatId) return;\n if (current.interaction?.semantics && current.interaction.actionConfidence && current.interaction.actionConfidence >= 0.85\n && current.actions.length > 0 && current.confidence >= 0.85) {\n await this.gateway.sendChoice(this.state.boundChatId, session.paneId, current, session.agent);\n } else if (current.state === 'failed' && previous?.state !== 'failed') {\n await this.gateway.sendText(this.state.boundChatId, `${agentName} 检测到失败状态,请用 /tail 查看。`);\n } else if (current.state === 'exited' && previous?.state !== 'exited') {\n await this.gateway.sendText(this.state.boundChatId, `${agentName}/tmux pane 已退出。`);\n }\n } catch (error) {\n await this.log(`notification failed: ${errorMessage(error)}`);\n }\n }\n\n private async maybeNotifyUnresolved(): Promise<void> {\n const screen = this.screen;\n const session = this.activeSession();\n if (this.interactionNotificationsSuppressed > 0 || !screen || !session || !this.gateway || !this.state.boundChatId\n || (screen.state !== 'input' && screen.state !== 'unknown') || safeStructuredInteraction(screen)) {\n this.unresolvedCandidate = undefined;\n return;\n }\n const key = `${session.id}:${session.paneId}:${screen.fingerprint}`;\n if (this.unresolvedCandidate?.key !== key) {\n this.unresolvedCandidate = { key, since: Date.now() };\n return;\n }\n if (Date.now() - this.unresolvedCandidate.since < 3_000 || this.unresolvedNotified.has(key)) return;\n remember(this.unresolvedNotified, key, 256);\n try {\n await this.gateway.sendManual(\n this.state.boundChatId,\n this.manualView(session, screen, 'active', '当前终端交互无法安全识别,已自动进入手动遥控兜底。'),\n );\n } catch (error) {\n await this.log(`manual fallback card failed: ${errorMessage(error)}`);\n await this.gateway.sendText(\n this.state.boundChatId,\n '当前终端交互无法安全识别,且手动遥控卡发送失败。可使用 /tail 120、/key、/type 或 /submit 处理。',\n ).catch((sendError) => this.log(`manual fallback text failed: ${errorMessage(sendError)}`));\n }\n }\n\n private async handleTurnComplete(candidate: TurnCompleteCandidate): Promise<DaemonResult> {\n if (!validTurnCompleteCandidate(candidate)) return { ok: false, error: 'invalid turn-complete candidate' };\n const eventKey = `${candidate.agentSessionId}:${candidate.eventId}`;\n if (this.completedEvents.has(eventKey)) return { ok: true };\n remember(this.completedEvents, eventKey, 256);\n if (candidate.sessionId !== this.state.activeSessionId) return { ok: true };\n if (!this.activeSession() || !this.state.boundChatId || !this.gateway) return { ok: true };\n this.pendingCompletion = candidate;\n this.pendingCompletionAt = Date.now();\n return { ok: true };\n }\n\n private updateScreen(next: ScreenDetection): void {\n if (this.screen?.fingerprint !== next.fingerprint || this.screen.state !== next.state) {\n this.outputStableSince = Date.now();\n }\n this.screen = next;\n }\n\n private async maybeNotifyCompletion(): Promise<void> {\n const candidate = this.pendingCompletion;\n const session = this.activeSession();\n if (!candidate || !session || !this.state.boundChatId || !this.gateway) return;\n if (this.screen?.state === 'approval' || this.screen?.state === 'input'\n || this.screen?.state === 'failed' || this.screen?.state === 'exited') {\n this.clearPendingCompletion();\n return;\n }\n if (this.screen?.state !== 'idle') return;\n const quietSince = Math.max(this.pendingCompletionAt, this.outputStableSince);\n if (Date.now() - quietSince < this.completionQuietMs) return;\n\n // Clear before sending so a slow Lark request cannot duplicate the notification.\n this.clearPendingCompletion();\n const adapter = getAgentAdapter(session.agent);\n const output = candidate.lastAssistantMessage.trim();\n if (!output) return;\n await this.gateway.sendMarkdown(\n this.state.boundChatId,\n `**${adapter.displayName} 等待用户输入**\\n\\n${output}`,\n );\n }\n\n private clearPendingCompletion(): void {\n this.pendingCompletion = undefined;\n this.pendingCompletionAt = 0;\n }\n\n private async flushPending(): Promise<void> {\n const session = this.activeSession();\n if (!session || this.shouldQueueMessage()) return;\n while (this.pendingMessages.length > 0 && !this.shouldQueueMessage()) {\n const message = this.pendingMessages[0];\n if (!message) {\n this.pendingMessages.shift();\n continue;\n }\n this.clearPendingCompletion();\n await this.tmux.sendText(session.paneId, message);\n this.pendingMessages.shift();\n }\n if (this.pendingMessages.length === 0 && this.state.boundChatId) {\n // Intentionally no per-message acknowledgement; transition notifications remain concise.\n }\n }\n\n private activeSession(): ManagedSession | undefined {\n return this.state.activeSessionId ? this.state.sessions?.[this.state.activeSessionId] : undefined;\n }\n\n private async reconcileSessions(): Promise<ManagedSession[]> {\n const sessions = Object.values(this.state.sessions ?? {});\n const inspections = await Promise.all(sessions.map(async (session) => ({\n session,\n pane: await this.tmux.inspect(session.paneId),\n })));\n const liveSessions = inspections\n .filter(({ pane }) => pane && !pane.dead)\n .map(({ session }) => session);\n const liveById = Object.fromEntries(liveSessions.map((session) => [session.id, session]));\n const activeSessionId = this.state.activeSessionId && liveById[this.state.activeSessionId]\n ? this.state.activeSessionId\n : liveSessions[0]?.id;\n const sessionsChanged = liveSessions.length !== sessions.length;\n const activeChanged = activeSessionId !== this.state.activeSessionId;\n if (!sessionsChanged && !activeChanged) return liveSessions;\n const removedActive = this.state.activeSessionId\n ? this.state.sessions?.[this.state.activeSessionId]\n : undefined;\n if (activeChanged && removedActive && !liveById[removedActive.id]\n && this.previousScreen?.state !== 'exited' && this.state.boundChatId) {\n await this.gateway?.sendText(\n this.state.boundChatId,\n `${getAgentAdapter(removedActive.agent).displayName}/tmux pane 已退出。`,\n ).catch((error) => this.log(`exit notification failed: ${errorMessage(error)}`));\n }\n this.state = {\n ...this.state,\n sessions: liveById,\n activeSessionId,\n updatedAt: Date.now(),\n };\n if (activeChanged) {\n this.screen = undefined;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n }\n await this.store.saveState(this.state);\n return liveSessions;\n }\n\n private async useSession(sessionId: string): Promise<DaemonResult> {\n const session = this.state.sessions?.[sessionId];\n if (!session || !await this.tmux.inspect(session.paneId)) return { ok: false, error: `unknown or stopped session: ${sessionId}` };\n this.state = { ...this.state, activeSessionId: sessionId, updatedAt: Date.now() };\n this.screen = undefined;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n await this.store.saveState(this.state);\n await this.poll();\n return { ok: true, value: session };\n }\n\n private async log(message: string): Promise<void> {\n await appendFile(this.paths.logFile, `${new Date().toISOString()} ${message}\\n`, { mode: 0o600 });\n }\n}\n\nfunction fail(error: unknown): DaemonResult {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'EEXIST';\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 validSessionId(value: string): boolean {\n return /^[a-zA-Z0-9_-]{1,40}$/.test(value);\n}\n\nfunction remember(values: Set<string>, value: string, limit: number): void {\n values.add(value);\n while (values.size > limit) {\n const oldest = values.values().next().value as string | undefined;\n if (oldest === undefined) break;\n values.delete(oldest);\n }\n}\n\nfunction escapeFence(value: string): string {\n return value.replace(/```/g, '``\\\\`');\n}\n\nfunction selectionSnapshot(screen: ScreenDetection): string {\n return screen.actions.map(({ id, marker, inputValue }) => `${id}:${marker ?? ''}:${inputValue ?? ''}`).join('|');\n}\n\nfunction formChecked(value: unknown): boolean {\n return value === true || value === 1 || value === 'true' || value === '1' || value === 'on' || value === 'checked';\n}\n\nfunction safeStructuredInteraction(screen: ScreenDetection): boolean {\n return Boolean(\n screen.interaction?.semantics\n && screen.interaction.actionConfidence\n && screen.interaction.actionConfidence >= 0.85\n && screen.actions.length > 0\n && screen.confidence >= 0.85,\n );\n}\n\nfunction manualTmuxKey(value: string): string {\n const keys: Record<string, string> = {\n up: 'Up',\n down: 'Down',\n left: 'Left',\n right: 'Right',\n enter: 'Enter',\n esc: 'Escape',\n tab: 'Tab',\n space: 'Space',\n backspace: 'BSpace',\n 'ctrl-c': 'C-c',\n };\n const key = keys[value.toLowerCase()];\n if (!key) throw new Error(`不支持的手动按键:${value}`);\n return key;\n}\n\nfunction manualTimestamp(): string {\n return new Intl.DateTimeFormat('zh-CN', {\n timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false,\n }).format(new Date());\n}\n","import { execFile, spawn } from 'node:child_process';\n\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nexport function runFile(\n file: string,\n args: readonly string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n execFile(\n file,\n [...args],\n {\n cwd: options.cwd,\n timeout: options.timeoutMs ?? 10_000,\n encoding: 'utf8',\n maxBuffer: 4 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n}\n\nexport function runFileWithInput(\n file: string,\n args: readonly string[],\n input: string,\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => (stdout += chunk));\n child.stderr.on('data', (chunk: string) => (stderr += chunk));\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr });\n else reject(new Error(`${file} exited with ${code ?? signal}: ${stderr.trim()}`));\n });\n child.stdin.end(input, 'utf8');\n });\n}\n","// 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 { randomBytes, scryptSync, timingSafeEqual } from 'node:crypto';\nimport { chmod, mkdir } from 'node:fs/promises';\nimport type { AppConfig, AppSecrets, SessionState } from './model.js';\nimport { emptyState } from './model.js';\nimport type { AppPaths } from './paths.js';\nimport { readJson, writeJsonAtomic } from './atomic-json.js';\n\nexport class AppStore {\n constructor(readonly paths: AppPaths) {}\n\n async ensure(): Promise<void> {\n await mkdir(this.paths.root, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.logsDir, { recursive: true, mode: 0o700 });\n await Promise.all([\n chmod(this.paths.root, 0o700),\n chmod(this.paths.runtimeDir, 0o700),\n chmod(this.paths.logsDir, 0o700),\n ]);\n }\n\n loadConfig(): Promise<AppConfig | undefined> {\n return readJson<AppConfig>(this.paths.config);\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, config);\n }\n\n loadSecrets(): Promise<AppSecrets | undefined> {\n return readJson(this.paths.secrets);\n }\n\n saveSecrets(secrets: AppSecrets): Promise<void> {\n return writeJsonAtomic(this.paths.secrets, secrets);\n }\n\n async loadState(): Promise<SessionState> {\n return (await readJson<SessionState>(this.paths.state)) ?? emptyState();\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\nexport function createBindCode(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function hashBindCode(code: string): string {\n const salt = randomBytes(16);\n const digest = scryptSync(code, salt, 32);\n return `${salt.toString('base64url')}.${digest.toString('base64url')}`;\n}\n\nexport function verifyBindCode(code: string, encoded: string): boolean {\n const [saltText, digestText] = encoded.split('.');\n if (!saltText || !digestText) return false;\n const expected = Buffer.from(digestText, 'base64url');\n const actual = scryptSync(code, Buffer.from(saltText, 'base64url'), expected.length);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n","import type { AgentId } from '../agents/types.js';\n\nexport type Tenant = 'feishu' | 'lark';\n\nexport interface AppConfig {\n tenant: Tenant;\n appId: string;\n tmuxBinary: string;\n agentBinaries: Record<AgentId, string>;\n pollIntervalMs: number;\n}\n\nexport interface AppSecrets {\n appSecret: string;\n callbackSecret: string;\n}\n\nexport interface ManagedSession {\n id: string;\n agent: AgentId;\n sessionName: string;\n paneId: string;\n cwd: string;\n agentVersion: string;\n updatedAt: number;\n}\n\nexport interface SessionState {\n schemaVersion: 2;\n ownerOpenId?: string;\n boundChatId?: string;\n autoBindDisabled?: boolean;\n activeSessionId?: string;\n sessions?: Record<string, ManagedSession>;\n bindCodeHash?: string;\n bindCodeExpiresAt?: number;\n updatedAt: number;\n}\n\nexport function emptyState(now = Date.now()): SessionState {\n return { schemaVersion: 2, sessions: {}, updatedAt: now };\n}\n","import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nexport async function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown, mode = 0o600): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await chmod(parent, 0o700).catch(() => undefined);\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;\n const file = await open(temporary, 'w', mode);\n try {\n await file.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await file.sync();\n } finally {\n await file.close();\n }\n await rename(temporary, path);\n await chmod(path, mode);\n}\n","import { randomBytes } from 'node:crypto';\nimport { runFile, runFileWithInput } from '../platform/process.js';\nimport { assertSafeTmuxTarget, sanitizeRemoteInput, shellQuote } from './input.js';\nimport type { TmuxCreateOptions, TmuxPane } from './types.js';\n\nconst PANE_FORMAT = '#{session_name}\\t#{pane_id}\\t#{pane_pid}\\t#{pane_current_command}\\t#{pane_current_path}\\t#{pane_dead}\\t#{cursor_x}\\t#{cursor_y}';\n\nexport class TmuxController {\n private writes: Promise<void> = Promise.resolve();\n\n constructor(readonly binary = 'tmux') {}\n\n async version(): Promise<string> {\n return (await runFile(this.binary, ['-V'])).stdout.trim();\n }\n\n async create(options: TmuxCreateOptions): Promise<TmuxPane> {\n if (!/^[a-zA-Z0-9_-]{1,64}$/.test(options.sessionName)) {\n throw new Error('tmux session name must contain only letters, digits, underscore, or dash');\n }\n if (await this.hasSession(options.sessionName)) {\n throw new Error(`tmux session already exists: ${options.sessionName}`);\n }\n const environment = Object.entries(options.env ?? {}).map(([key, value]) => {\n if (!/^[A-Z][A-Z0-9_]*$/.test(key)) throw new Error(`unsafe tmux environment key: ${key}`);\n return `${key}=${value}`;\n });\n const command = [\n ...(environment.length > 0 ? ['/usr/bin/env', ...environment] : []),\n options.binary,\n ...(options.args ?? []),\n ].map(shellQuote).join(' ');\n await runFile(this.binary, [\n 'new-session', '-d', '-s', options.sessionName, '-c', options.cwd,\n '-x', '120', '-y', '40', command,\n ]);\n const pane = await this.findBySession(options.sessionName);\n if (!pane) throw new Error('tmux created a session without a discoverable pane');\n return pane;\n }\n\n async hasSession(sessionName: string): Promise<boolean> {\n try {\n await runFile(this.binary, ['has-session', '-t', `=${sessionName}`]);\n return true;\n } catch {\n return false;\n }\n }\n\n async findBySession(sessionName: string): Promise<TmuxPane | undefined> {\n const { stdout } = await runFile(this.binary, [\n 'list-panes', '-t', `=${sessionName}`, '-F', PANE_FORMAT,\n ]);\n return stdout.split('\\n').map(parsePane).find(Boolean);\n }\n\n async inspect(paneId: string): Promise<TmuxPane | undefined> {\n assertSafeTmuxTarget(paneId);\n try {\n const { stdout } = await runFile(this.binary, [\n 'display-message', '-p', '-t', paneId, PANE_FORMAT,\n ]);\n return parsePane(stdout.trim());\n } catch {\n return undefined;\n }\n }\n\n async capture(paneId: string, lines = 200): Promise<string> {\n assertSafeTmuxTarget(paneId);\n const { stdout } = await runFile(this.binary, [\n 'capture-pane', '-p', '-J', '-e', '-t', paneId, '-S', `-${Math.max(1, lines)}`,\n ]);\n return stdout;\n }\n\n sendText(paneId: string, input: string, submit = true): Promise<void> {\n assertSafeTmuxTarget(paneId);\n const text = sanitizeRemoteInput(input);\n if (!text.trim()) return Promise.reject(new Error('message is empty after sanitization'));\n const operation = async (): Promise<void> => {\n const bufferName = `lca-${process.pid}-${randomBytes(6).toString('hex')}`;\n await runFileWithInput(this.binary, ['load-buffer', '-b', bufferName, '-'], text);\n try {\n await runFile(this.binary, ['paste-buffer', '-b', bufferName, '-d', '-t', paneId]);\n } finally {\n await runFile(this.binary, ['delete-buffer', '-b', bufferName]).catch(() => undefined);\n }\n if (submit) await runFile(this.binary, ['send-keys', '-t', paneId, 'Enter']);\n };\n this.writes = this.writes.then(operation, operation);\n return this.writes;\n }\n\n async sendKey(paneId: string, key: string): Promise<void> {\n assertSafeTmuxTarget(paneId);\n if (!/^(Enter|Escape|Space|Tab|BSpace|Up|Down|Left|Right|C-c|C-u|C-k|C-Enter|[yandpcq1-9])$/.test(key)) {\n throw new Error(`unsupported tmux key: ${key}`);\n }\n await runFile(this.binary, ['send-keys', '-t', paneId, key]);\n }\n\n async killSession(sessionName: string): Promise<void> {\n await runFile(this.binary, ['kill-session', '-t', `=${sessionName}`]);\n }\n}\n\nfunction parsePane(line: string): TmuxPane | undefined {\n const [sessionName, paneId, pidText, currentCommand, cwd, deadText, cursorXText, cursorYText] = line.trim().split('\\t');\n const pid = Number(pidText);\n const cursorX = Number(cursorXText);\n const cursorY = Number(cursorYText);\n if (!sessionName || !paneId || !Number.isInteger(pid) || !currentCommand || !cwd\n || !Number.isInteger(cursorX) || !Number.isInteger(cursorY)) return undefined;\n return { sessionName, paneId, pid, currentCommand, cwd, dead: deadText === '1', cursorX, cursorY };\n}\n","const ANSI = /\\u001b(?:\\][^\\u0007]*(?:\\u0007|\\u001b\\\\)|\\[[0-?]*[ -/]*[@-~]|[@-_])/g;\nconst FORBIDDEN_CONTROL = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/g;\n\nexport function sanitizeRemoteInput(input: string): string {\n return input.replace(ANSI, '').replace(/\\r\\n?/g, '\\n').replace(FORBIDDEN_CONTROL, '');\n}\n\nexport function assertSafeTmuxTarget(target: string): void {\n if (!/^%\\d+$/.test(target)) throw new Error(`unsafe tmux pane target: ${target}`);\n}\n\nexport function shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\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","import type { TerminalDialect } from './interaction-types.js';\n\nconst commonHeaders = [\n /^\\s*(?:Would you like to|Do you want to|Approval required|Allow command|.*requires approval)/i,\n];\nconst commonFooters = [\n /(?:press\\s+)?enter\\s+to\\s+(?:confirm|submit(?:\\s+answer)?|select|choose|continue)/i,\n /esc\\s+to\\s+cancel.*(?:tab\\s+to\\s+amend|ctrl\\+e\\s+to\\s+explain)/i,\n];\n\nexport const CODEX_DIALECT: TerminalDialect = {\n id: 'codex',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n footerPatterns: commonFooters,\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type something|none of the above|add notes)$/i],\n chatControls: [/^chat about this$/i],\n};\n\nexport const TRAE_DIALECT: TerminalDialect = {\n ...CODEX_DIALECT,\n id: 'trae-cli',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n customInputControls: [/^(?:other|none of the above|add notes)$/i],\n};\n\nexport const CLAUDE_DIALECT: TerminalDialect = {\n id: 'claude-code',\n headerPatterns: [\n ...commonHeaders,\n /^\\s*(?:←\\s*)?[☐☑☒]\\s+.+?(?:\\s+✔\\s+Submit\\s*→)?\\s*$/i,\n /^\\s*[☐☑☒]\\s+\\S/,\n ],\n footerPatterns: commonFooters,\n footerlessChoiceHeaders: [/^ready to submit your answers\\?$/i],\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type(?:\\s+.+)?|add notes)\\.?$/i, /^notes:\\s*press\\s+n\\s+to\\s+add\\b/i],\n directInputControls: [/^type(?:\\s+.+)?\\.?$/i],\n customInputValuePattern: /^type\\s+(.+?)\\.?$/i,\n chatControls: [/^chat about this$/i],\n};\n","import type { AgentResume, ResumeOptions } from './types.js';\n\nexport function resolveResumeOption(options: ResumeOptions): AgentResume | undefined {\n const modes = [options.resume !== undefined, options.resumeLast, options.resumeAll].filter(Boolean).length;\n if (modes > 1) throw new Error('--resume, --resume-last, and --resume-all cannot be used together');\n if (options.resumeLast) return { mode: 'last' };\n if (options.resumeAll) return { mode: 'picker', all: true };\n if (typeof options.resume === 'string') return { mode: 'session', sessionId: options.resume };\n if (options.resume) return { mode: 'picker' };\n return undefined;\n}\n\nexport function resumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['resume', '--last'];\n if (resume.mode === 'session') return ['resume', resume.sessionId];\n return resume.all ? ['resume', '--all'] : ['resume'];\n}\n\nexport function claudeResumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['--continue'];\n if (resume.mode === 'session') return ['--resume', resume.sessionId];\n return ['--resume'];\n}\n","export function codexStyleStopHookArgs(command: string): string[] {\n const hook = `{hooks=[{type=\"command\",command=${JSON.stringify(command)},timeout=5}]}`;\n return ['--dangerously-bypass-hook-trust', '-c', `hooks.Stop=[${hook}]`];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n Stop: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n },\n })];\n}\n","import { detectCodexScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const codexAdapter: AgentAdapter = {\n id: 'codex',\n displayName: 'Codex',\n groupOrder: 10,\n binary: (config) => config.agentBinaries.codex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectCodexScreen,\n};\n","import { detectTraeScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const traeCliAdapter: AgentAdapter = {\n id: 'trae-cli',\n displayName: 'Trae CLI',\n groupOrder: 20,\n binary: (config) => config.agentBinaries['trae-cli'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectTraeScreen,\n};\n","import { detectClaudeScreen } from '../screen/detector.js';\nimport { claudeResumeArgs } from './resume.js';\nimport { claudeStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: 'claude-code',\n displayName: 'Claude Code',\n groupOrder: 30,\n binary: (config) => config.agentBinaries['claude-code'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'trae-cli', 'claude-code'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\n\nexport type AgentResume =\n | { mode: 'picker'; all?: boolean }\n | { mode: 'last' }\n | { mode: 'session'; sessionId: string };\n\nexport interface ResumeOptions {\n resume?: boolean | string;\n resumeLast?: boolean;\n resumeAll?: boolean;\n}\n\nexport interface TurnCompleteCandidate {\n sessionId: string;\n eventId: string;\n agentSessionId: string;\n cwd: string;\n lastAssistantMessage: string;\n}\n\nexport interface LaunchInput {\n resume?: AgentResume;\n stopHookCommand: string;\n}\n\nexport interface AgentAdapter {\n id: AgentId;\n displayName: string;\n groupOrder: number;\n binary(config: AppConfig): string;\n versionArgs: readonly string[];\n buildLaunchArgs(input: LaunchInput): string[];\n detectScreen(raw: string, paneAlive: boolean, cursor?: { x: number; y: number }): ScreenDetection;\n}\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { AGENT_IDS, type AgentAdapter, type AgentId } from './types.js';\n\nconst adapters = new Map<AgentId, AgentAdapter>([\n [codexAdapter.id, codexAdapter],\n [traeCliAdapter.id, traeCliAdapter],\n [claudeCodeAdapter.id, claudeCodeAdapter],\n]);\n\nexport function getAgentAdapter(id: AgentId): AgentAdapter {\n const adapter = adapters.get(id);\n if (!adapter) throw new Error(`unsupported coding agent: ${id}`);\n return adapter;\n}\n\nexport function listAgentAdapters(): AgentAdapter[] {\n return [...adapters.values()].sort((left, right) => left.groupOrder - right.groupOrder);\n}\n\nexport function isAgentId(value: string): value is AgentId {\n return (AGENT_IDS as readonly string[]).includes(value);\n}\n","import type { TurnCompleteCandidate } from './types.js';\n\nexport function normalizeStopEvent(\n bridgeSessionId: string,\n value: unknown,\n): TurnCompleteCandidate | undefined {\n if (!bridgeSessionId || !value || typeof value !== 'object') return undefined;\n const event = value as Record<string, unknown>;\n if (event.hook_event_name !== 'Stop') return undefined;\n const eventId = stringField(event, 'turn_id') ?? stringField(event, 'prompt_id');\n const agentSessionId = stringField(event, 'session_id');\n const cwd = stringField(event, 'cwd');\n const lastAssistantMessage = stringField(event, 'last_assistant_message')?.trim();\n if (!eventId || !agentSessionId || !cwd || !lastAssistantMessage) return undefined;\n return { sessionId: bridgeSessionId, eventId, agentSessionId, cwd, lastAssistantMessage };\n}\n\nexport function validTurnCompleteCandidate(value: unknown): value is TurnCompleteCandidate {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return ['sessionId', 'eventId', 'agentSessionId', 'cwd', 'lastAssistantMessage']\n .every((key) => typeof candidate[key] === 'string' && (candidate[key] as string).length > 0);\n}\n\nfunction stringField(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key];\n return typeof field === 'string' && field.length > 0 ? field : undefined;\n}\n","import {\n createLarkChannel,\n type CardActionEvent,\n type LarkChannel,\n type NormalizedMessage,\n} from '@larksuite/channel';\nimport type { AppConfig, AppSecrets, ManagedSession } from '../core/model.js';\nimport type { RuntimeStatus } from '../daemon/protocol.js';\nimport type { ScreenDetection } from '../screen/detector.js';\nimport type { AgentId } from '../agents/types.js';\nimport { ActionSigner, type SignedAction } from './action-signing.js';\nimport {\n CHOICE_FORM_SUBMIT_ACTION,\n choiceCard,\n choiceFormSubmitName,\n handledActionCard,\n interactionInputCard,\n manualControlCard,\n MANUAL_SUBMIT_ACTION,\n MANUAL_TYPE_ACTION,\n type ManualControlView,\n sessionPickerCard,\n statusCard,\n stopCard,\n} from './cards.js';\n\nexport interface LarkGatewayHandler {\n onMessage(message: NormalizedMessage): Promise<void>;\n onAction(event: CardActionEvent, action: SignedAction): Promise<LarkActionResult>;\n}\n\nexport type LarkActionResult =\n | { type: 'error'; content: string }\n | { type: 'success'; content: string }\n | { type: 'awaiting-input'; content: string; agent: AgentId; label: string }\n | { type: 'refresh'; content: string; screen: ScreenDetection; paneId: string; agent: AgentId }\n | { type: 'manual'; content: string; view: ManualControlView };\n\nexport interface RemoteGateway {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n sendText(chatId: string, text: string): Promise<unknown>;\n sendMarkdown(chatId: string, markdown: string): Promise<unknown>;\n sendChoice(chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown>;\n updateChoice(messageId: string, chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown>;\n completeChoiceInput(messageId: string, action: SignedAction, content: string): Promise<unknown>;\n sendManual(chatId: string, view: ManualControlView): Promise<unknown>;\n sendStatus(chatId: string, status: RuntimeStatus): Promise<unknown>;\n sendSessionPicker(chatId: string, sessions: ManagedSession[], activeSessionId?: string): Promise<unknown>;\n sendStopConfirmation(chatId: string, paneId: string, fingerprint: string, agent: AgentId): Promise<unknown>;\n}\n\nexport type GatewayFactory = (config: AppConfig, secrets: AppSecrets, handler: LarkGatewayHandler) => RemoteGateway;\n\nexport class LarkGateway implements RemoteGateway {\n private readonly channel: LarkChannel;\n private readonly signer: ActionSigner;\n private readonly formActions = new Map<string, Map<string, SignedAction>>();\n private readonly formActionsInFlight = new Set<string>();\n\n constructor(config: AppConfig, secrets: AppSecrets, private readonly handler: LarkGatewayHandler) {\n this.signer = new ActionSigner(secrets.callbackSecret);\n this.channel = createLarkChannel({\n appId: config.appId,\n appSecret: secrets.appSecret,\n domain: config.tenant === 'lark' ? 'https://open.larksuite.com' : 'https://open.feishu.cn',\n source: 'lark-coding-assistant',\n policy: { dmMode: 'open', requireMention: false, respondToMentionAll: false },\n safety: { chatQueue: { enabled: true, mergeWhileBusy: false } },\n handshakeTimeoutMs: 8_000,\n httpTimeoutMs: 30_000,\n respectProxyEnv: true,\n });\n this.channel.on('message', async (message) => this.handler.onMessage(message));\n this.channel.on('cardAction', async (event) => {\n const mappedFormAction = event.action.formValue && event.action.name\n ? this.formActions.get(event.messageId)?.get(event.action.name)\n : undefined;\n const action = this.signer.verify(event.action.value, event.chatId)\n ?? (mappedFormAction ? this.signer.verify(mappedFormAction, event.chatId) : undefined);\n if (!action) return { toast: { type: 'error', content: '操作已失效,请等待新卡片。' } };\n if (event.action.formValue || action.kind === 'manual') {\n if (this.formActionsInFlight.has(event.messageId)) {\n return { toast: { type: 'warning', content: action.kind === 'manual' ? '终端操作正在执行,请稍候。' : '答案正在提交,请稍候。' } };\n }\n this.formActionsInFlight.add(event.messageId);\n void this.handleDeferredCardAction(event, action).finally(() => {\n this.formActionsInFlight.delete(event.messageId);\n });\n return { toast: { type: 'success', content: action.kind === 'manual' ? '正在操作本地终端…' : '正在提交到本地终端…' } };\n }\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') return { toast: result };\n if (result.type === 'manual') {\n this.rememberManualFormActions(event.messageId, event.chatId, result.view);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: manualControlCard(event.chatId, result.view, this.signer) },\n };\n }\n if (result.type === 'refresh') {\n this.rememberFormActions(event.messageId, event.chatId, result.paneId, result.screen, result.agent);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: choiceCard(event.chatId, result.paneId, result.screen, this.signer, result.agent) },\n };\n }\n if (result.type === 'awaiting-input') {\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: interactionInputCard(result.agent, result.label) },\n };\n }\n return {\n toast: result,\n card: { type: 'raw', data: handledActionCard(action, result.content) },\n };\n });\n }\n\n private async handleDeferredCardAction(event: CardActionEvent, action: SignedAction): Promise<void> {\n try {\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') {\n await this.channel.send(event.chatId, { text: `卡片操作未完成:${result.content}` });\n return;\n }\n if (result.type === 'refresh') {\n await this.updateCardAfterAction(\n event.messageId,\n choiceCard(event.chatId, result.paneId, result.screen, this.signer, result.agent),\n );\n this.rememberFormActions(event.messageId, event.chatId, result.paneId, result.screen, result.agent);\n return;\n }\n if (result.type === 'manual') {\n await this.updateCardAfterAction(event.messageId, manualControlCard(event.chatId, result.view, this.signer));\n this.rememberManualFormActions(event.messageId, event.chatId, result.view);\n return;\n }\n if (result.type === 'awaiting-input') {\n await this.updateCardAfterAction(event.messageId, interactionInputCard(result.agent, result.label));\n return;\n }\n await this.updateCardAfterAction(event.messageId, handledActionCard(action, result.content));\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n await this.channel.send(event.chatId, { text: `卡片操作同步失败:${detail}` }).catch(() => undefined);\n }\n }\n\n private async updateCardAfterAction(messageId: string, card: object): Promise<void> {\n const retryDelays = [0, 300, 800, 1_600];\n let lastError: unknown;\n for (const delay of retryDelays) {\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n try {\n await this.channel.updateCard(messageId, card);\n return;\n } catch (error) {\n lastError = error;\n if (!cardActionLocked(error)) throw error;\n }\n }\n throw lastError;\n }\n\n connect(): Promise<void> {\n return this.channel.connect();\n }\n\n disconnect(): Promise<void> {\n return this.channel.disconnect();\n }\n\n sendText(chatId: string, text: string): Promise<unknown> {\n return this.channel.send(chatId, { text });\n }\n\n sendMarkdown(chatId: string, markdown: string): Promise<unknown> {\n return this.channel.send(chatId, { markdown });\n }\n\n async sendChoice(chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown> {\n const result = await this.channel.send(chatId, { card: choiceCard(chatId, paneId, screen, this.signer, agent) });\n this.rememberFormActions(result.messageId, chatId, paneId, screen, agent);\n return result;\n }\n\n async updateChoice(messageId: string, chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<void> {\n await this.channel.updateCard(messageId, choiceCard(chatId, paneId, screen, this.signer, agent));\n this.rememberFormActions(messageId, chatId, paneId, screen, agent);\n }\n\n async completeChoiceInput(messageId: string, action: SignedAction, content: string): Promise<void> {\n await this.channel.updateCard(messageId, handledActionCard(action, content));\n this.formActions.delete(messageId);\n }\n\n async sendManual(chatId: string, view: ManualControlView): Promise<unknown> {\n const result = await this.channel.send(chatId, { card: manualControlCard(chatId, view, this.signer) });\n this.rememberManualFormActions(result.messageId, chatId, view);\n return result;\n }\n\n private rememberManualFormActions(messageId: string, chatId: string, view: ManualControlView): void {\n if (view.state === 'recovered' || view.state === 'exited') {\n this.formActions.delete(messageId);\n return;\n }\n const common = {\n kind: 'manual' as const,\n sessionId: view.session.id,\n manualMode: view.mode ?? 'fallback',\n agent: view.session.agent,\n paneId: view.session.paneId,\n fingerprint: view.screen.fingerprint,\n chatId,\n };\n this.formActions.set(messageId, new Map([\n [MANUAL_TYPE_ACTION, this.signer.sign({ ...common, action: MANUAL_TYPE_ACTION }, 10 * 60_000)],\n [MANUAL_SUBMIT_ACTION, this.signer.sign({ ...common, action: MANUAL_SUBMIT_ACTION }, 10 * 60_000)],\n ]));\n }\n\n private rememberFormActions(\n messageId: string,\n chatId: string,\n paneId: string,\n screen: ScreenDetection,\n agent: AgentId,\n ): void {\n if (screen.interaction?.semantics?.activation !== 'toggle') {\n this.formActions.delete(messageId);\n return;\n }\n const actions = new Map<string, SignedAction>();\n actions.set(choiceFormSubmitName(), this.signer.sign({\n kind: 'choice',\n interactionKind: screen.interaction?.kind,\n agent,\n action: CHOICE_FORM_SUBMIT_ACTION,\n paneId,\n fingerprint: screen.interaction?.revision ?? screen.fingerprint,\n chatId,\n }));\n this.formActions.set(messageId, actions);\n while (this.formActions.size > 256) {\n const oldest = this.formActions.keys().next().value;\n if (!oldest) break;\n this.formActions.delete(oldest);\n }\n }\n\n sendStatus(chatId: string, status: RuntimeStatus): Promise<unknown> {\n return this.channel.send(chatId, { card: statusCard(status) });\n }\n\n sendSessionPicker(chatId: string, sessions: ManagedSession[], activeSessionId?: string): Promise<unknown> {\n return this.channel.send(chatId, { card: sessionPickerCard(chatId, sessions, activeSessionId, this.signer) });\n }\n\n sendStopConfirmation(chatId: string, paneId: string, fingerprint: string, agent: AgentId): Promise<unknown> {\n return this.channel.send(chatId, { card: stopCard(chatId, paneId, fingerprint, this.signer, agent) });\n }\n}\n\nfunction cardActionLocked(error: unknown): boolean {\n if (typeof error === 'string') return /card action is lock/i.test(error);\n if (error instanceof Error && /card action is lock/i.test(error.message)) return true;\n if (!error || typeof error !== 'object') return false;\n const record = error as Record<string, unknown>;\n return ['message', 'msg', 'cause'].some((key) => cardActionLocked(record[key]));\n}\n","import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { isAgentId } from '../agents/registry.js';\nimport type { AgentId } from '../agents/types.js';\nimport type { ChoiceInteractionKind } from '../screen/detector.js';\n\nexport interface SignedAction {\n v: 1;\n kind: 'choice' | 'stop' | 'session' | 'manual';\n interactionKind?: ChoiceInteractionKind;\n sessionId?: string;\n manualMode?: 'explicit' | 'fallback';\n agent: AgentId;\n action: string;\n paneId: string;\n fingerprint: string;\n chatId: string;\n nonce: string;\n expiresAt: number;\n sig: string;\n}\n\ntype UnsignedAction = Omit<SignedAction, 'v' | 'nonce' | 'expiresAt' | 'sig'>;\nconst APPROVAL_NONCE_RETENTION_MS = 7 * 24 * 60 * 60_000;\n\nfunction remainsValidWhilePending(kind: SignedAction['kind']): boolean {\n return kind === 'choice';\n}\n\nexport class ActionSigner {\n private readonly usedNonces = new Map<string, number>();\n\n constructor(private readonly secret: string, private readonly now: () => number = Date.now) {}\n\n sign(action: UnsignedAction, ttlMs = 5 * 60_000): SignedAction {\n const value: Omit<SignedAction, 'sig'> = {\n v: 1,\n ...action,\n nonce: randomBytes(18).toString('base64url'),\n expiresAt: this.now() + ttlMs,\n };\n return { ...value, sig: this.mac(value) };\n }\n\n verify(value: unknown, expectedChatId?: string): SignedAction | undefined {\n const now = this.now();\n this.prune(now);\n if (!isSignedAction(value)\n || (expectedChatId && value.chatId !== expectedChatId)\n || (!remainsValidWhilePending(value.kind) && value.expiresAt < now)\n || this.usedNonces.has(value.nonce)) return undefined;\n const expected = Buffer.from(this.mac(withoutSignature(value)), 'base64url');\n const actual = Buffer.from(value.sig, 'base64url');\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) return undefined;\n this.usedNonces.set(\n value.nonce,\n remainsValidWhilePending(value.kind) ? Math.max(value.expiresAt, now + APPROVAL_NONCE_RETENTION_MS) : value.expiresAt,\n );\n return value;\n }\n\n private mac(value: Omit<SignedAction, 'sig'>): string {\n const canonical = JSON.stringify([\n value.v,\n value.kind,\n value.interactionKind ?? null,\n value.sessionId ?? null,\n value.manualMode ?? null,\n value.agent,\n value.action,\n value.paneId,\n value.fingerprint,\n value.chatId,\n value.nonce,\n value.expiresAt,\n ]);\n return createHmac('sha256', this.secret).update(canonical).digest('base64url');\n }\n\n private prune(now: number): void {\n for (const [nonce, expiresAt] of this.usedNonces) {\n if (expiresAt < now) this.usedNonces.delete(nonce);\n }\n }\n}\n\nfunction withoutSignature(value: SignedAction): Omit<SignedAction, 'sig'> {\n const { sig: _sig, ...unsigned } = value;\n return unsigned;\n}\n\nfunction isSignedAction(value: unknown): value is SignedAction {\n if (!value || typeof value !== 'object') return false;\n const item = value as Record<string, unknown>;\n return item.v === 1\n && (item.kind === 'choice' || item.kind === 'stop' || item.kind === 'session' || item.kind === 'manual')\n && (item.kind !== 'choice' || item.interactionKind === 'approval' || item.interactionKind === 'question' || item.interactionKind === 'choice')\n && (item.kind !== 'manual' || (typeof item.sessionId === 'string'\n && (item.manualMode === 'explicit' || item.manualMode === 'fallback')))\n && typeof item.agent === 'string'\n && isAgentId(item.agent)\n && typeof item.action === 'string'\n && typeof item.paneId === 'string'\n && typeof item.fingerprint === 'string'\n && typeof item.chatId === 'string'\n && typeof item.nonce === 'string'\n && typeof item.expiresAt === 'number'\n && typeof item.sig === 'string';\n}\n","import { homedir } from 'node:os';\nimport type { ScreenDetection } from '../screen/detector.js';\nimport type { ManagedSession } from '../core/model.js';\nimport type { ActionSigner } from './action-signing.js';\nimport type { SignedAction } from './action-signing.js';\nimport { getAgentAdapter, listAgentAdapters } from '../agents/registry.js';\nimport type { AgentId } from '../agents/types.js';\nimport type { RuntimeStatus } from '../daemon/protocol.js';\n\nexport function choiceCard(\n chatId: string,\n paneId: string,\n screen: ScreenDetection,\n signer: ActionSigner,\n agent: AgentId = 'codex',\n): object {\n if (!screen.interaction) throw new Error('choice card requires a structured interaction');\n const interaction = screen.interaction;\n const buttons = screen.actions.map((action) => ({\n tag: 'button',\n text: { tag: 'plain_text', content: choiceActionLabel(action.key, action.label, action.description) },\n type: choiceButtonType(action.risk, action.focused),\n width: 'fill',\n size: 'medium',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'choice',\n interactionKind: interaction.kind,\n agent,\n action: action.key,\n paneId,\n fingerprint: interaction.revision ?? screen.fingerprint,\n chatId,\n }),\n }],\n }));\n const context = interaction.context.join('\\n').slice(0, 1800);\n if (interaction.semantics?.activation === 'toggle') {\n const formElements = screen.actions.flatMap((action, index): Array<Record<string, unknown>> => {\n if (action.role === 'custom-input') {\n const selected = action.marker === 'checked' || action.marker === 'selected';\n return [\n {\n tag: 'checker',\n name: choiceFormFieldName(index),\n checked: selected,\n text: { tag: 'plain_text', content: `${action.key}. ${action.label}` },\n },\n {\n tag: 'input',\n name: inlineInputName(index),\n placeholder: { tag: 'plain_text', content: '请输入自定义内容' },\n input_type: 'multiline_text',\n rows: 2,\n auto_resize: true,\n max_rows: 4,\n max_length: 1000,\n width: 'fill',\n default_value: action.inputValue ?? '',\n },\n ];\n }\n if (action.role === 'submit') {\n return [{ tag: 'hr' }, {\n tag: 'button',\n name: choiceFormSubmitName(),\n text: { tag: 'plain_text', content: '提交答案' },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n form_action_type: 'submit',\n }];\n }\n if (action.role !== 'answer') return [];\n const selected = action.marker === 'checked' || action.marker === 'selected';\n const details = action.description ? `\\n${action.description}` : '';\n return [{\n tag: 'checker',\n name: choiceFormFieldName(index),\n checked: selected,\n text: { tag: 'plain_text', content: `${action.key}. ${action.label}${details}` },\n }];\n });\n if (!screen.actions.some(({ role }) => role === 'submit')) {\n formElements.push({ tag: 'hr' }, {\n tag: 'button',\n name: choiceFormSubmitName(),\n text: { tag: 'plain_text', content: '提交答案' },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n form_action_type: 'submit',\n });\n }\n const immediateButtons = screen.actions\n .filter(({ role }) => role !== 'answer' && role !== 'custom-input' && role !== 'submit')\n .map((action) => ({\n tag: 'button',\n text: { tag: 'plain_text', content: choiceActionLabel(action.key, action.label, action.description) },\n type: choiceButtonType(action.risk, action.focused),\n width: 'fill',\n size: 'medium',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'choice', interactionKind: interaction.kind, agent, action: action.key, paneId,\n fingerprint: interaction.revision ?? screen.fingerprint, chatId,\n }),\n }],\n }));\n return cardElements(\n `${getAgentAdapter(agent).displayName} ${interactionTitle(interaction.kind)}`,\n [{ tag: 'markdown', content: `\\`\\`\\`text\\n${escapeFence(context || interaction.title)}\\n\\`\\`\\`` }, {\n tag: 'form',\n name: 'choice_form',\n direction: 'vertical',\n vertical_spacing: '8px',\n elements: formElements,\n }, ...immediateButtons],\n );\n }\n return card(\n `${getAgentAdapter(agent).displayName} ${interactionTitle(interaction.kind)}`,\n `\\`\\`\\`text\\n${escapeFence(context || '请选择一个选项')}\\n\\`\\`\\``,\n buttons,\n );\n}\n\nexport const CHOICE_FORM_SUBMIT_ACTION = '__choice_form_submit__';\n\nexport function choiceFormSubmitName(): string {\n return 'choice_form_submit';\n}\n\nexport function choiceFormFieldName(index: number): string {\n return `choice_selected_${index}`;\n}\n\nexport function inlineInputName(index: number): string {\n return `custom_input_${index}`;\n}\n\nexport function stopCard(\n chatId: string,\n paneId: string,\n fingerprint: string,\n signer: ActionSigner,\n agent: AgentId = 'codex',\n): object {\n const agentName = getAgentAdapter(agent).displayName;\n return card(`确认停止 ${agentName}?`, `这会终止当前 ${agentName} 进程和受管 tmux 会话。`, [{\n tag: 'button',\n text: { tag: 'plain_text', content: '停止会话' },\n type: 'danger',\n behaviors: [{\n type: 'callback',\n value: signer.sign({ kind: 'stop', agent, action: 'confirm', paneId, fingerprint, chatId }, 2 * 60_000),\n }],\n }]);\n}\n\nexport function interactionInputCard(agent: AgentId, label: string): object {\n return card(\n `${getAgentAdapter(agent).displayName} 等待补充内容`,\n `已进入 **${escapeMarkdown(label)}**。请直接发送补充说明。`,\n [],\n 'orange',\n );\n}\n\nexport type ManualControlState = 'active' | 'stale' | 'recovered' | 'exited' | 'error';\n\nexport interface ManualControlView {\n session: ManagedSession;\n screen: ScreenDetection;\n output: string;\n capturedAt: Date;\n state?: ManualControlState;\n notice?: string;\n lastOperation?: string;\n mode?: 'explicit' | 'fallback';\n}\n\nexport const MANUAL_TEXT_FIELD = 'manual_text';\nexport const MANUAL_TYPE_ACTION = 'type';\nexport const MANUAL_SUBMIT_ACTION = 'submit';\n\nexport function manualControlCard(\n chatId: string,\n view: ManualControlView,\n signer: ActionSigner,\n): object {\n const state = view.state ?? 'active';\n const mode = view.mode ?? 'fallback';\n const agentName = getAgentAdapter(view.session.agent).displayName;\n const fingerprint = view.screen.fingerprint;\n const sign = (action: string): SignedAction => signer.sign({\n kind: 'manual',\n sessionId: view.session.id,\n manualMode: mode,\n agent: view.session.agent,\n action,\n paneId: view.session.paneId,\n fingerprint,\n chatId,\n }, 10 * 60_000);\n const status = state === 'recovered'\n ? '✅ 已恢复结构化识别,请使用新发送的语义化操作卡。'\n : state === 'exited'\n ? '✅ 已退出手动遥控模式,本地 Agent 和 tmux 仍在运行。'\n : state === 'stale'\n ? '⚠️ 终端画面已变化,旧操作未执行;请确认最新画面后重试。'\n : state === 'error'\n ? `⚠️ ${escapeMarkdown(view.notice ?? '手动操作失败,请确认最新画面。')}`\n : mode === 'explicit'\n ? '⚠️ 已锁定手动遥控;即使恢复结构化识别,也会继续由你直接操作终端。'\n : '⚠️ 当前为手动遥控模式,所有操作都不会进行语义安全判断。';\n const metadata = [\n `**Session** \\`${escapeInlineCode(view.session.id)}\\` · **Agent** ${escapeMarkdown(agentName)}`,\n `**状态** \\`${view.screen.state}\\` · **采集时间** ${formatHandledAt(view.capturedAt)}`,\n view.lastOperation ? `**最近操作** ${escapeMarkdown(view.lastOperation)}` : undefined,\n view.notice && state !== 'error' ? escapeMarkdown(view.notice) : undefined,\n ].filter(Boolean).join('\\n');\n const elements: object[] = [\n { tag: 'markdown', content: status },\n { tag: 'markdown', content: metadata },\n { tag: 'markdown', content: `\\`\\`\\`text\\n${escapeFence(view.output).slice(-5000)}\\n\\`\\`\\`` },\n ];\n if (state === 'recovered' || state === 'exited') {\n return cardElements(`${view.session.id} · ${agentName} 手动遥控`, elements, state === 'recovered' ? 'green' : 'grey');\n }\n elements.push(\n manualButtonRow([\n manualButton('↖ 刷新', sign('refresh')),\n manualButton('↑', sign('up')),\n manualButton('Esc', sign('esc')),\n ]),\n manualButtonRow([\n manualButton('←', sign('left')),\n manualButton('Enter', sign('enter'), 'primary'),\n manualButton('→', sign('right')),\n ]),\n manualButtonRow([\n manualButton('Tab', sign('tab')),\n manualButton('↓', sign('down')),\n manualButton('Space', sign('space')),\n ]),\n {\n tag: 'form', name: 'manual_text_form', direction: 'vertical', vertical_spacing: '8px', elements: [\n {\n tag: 'input', name: MANUAL_TEXT_FIELD, input_type: 'multiline_text', rows: 2,\n auto_resize: true, max_rows: 4, max_length: 1000, width: 'fill',\n placeholder: { tag: 'plain_text', content: '输入要发送到当前终端的文本' },\n },\n manualFormButton('仅输入', MANUAL_TYPE_ACTION),\n manualFormButton('输入并提交', MANUAL_SUBMIT_ACTION, 'primary'),\n ],\n },\n manualButtonRow([\n manualButton('⌫ 退格', sign('backspace')),\n manualButton('Ctrl+C', sign('ctrl-c'), 'danger'),\n manualButton('结束遥控', sign('exit')),\n ]),\n );\n return cardElements(`${view.session.id} · ${agentName} 手动遥控`, elements, 'orange');\n}\n\nfunction manualButton(label: string, value: SignedAction, type = 'default'): object {\n return {\n tag: 'button', text: { tag: 'plain_text', content: label }, type, width: 'fill', size: 'medium',\n behaviors: [{ type: 'callback', value }],\n };\n}\n\nfunction manualFormButton(label: string, name: string, type = 'default'): object {\n return {\n tag: 'button', name, text: { tag: 'plain_text', content: label }, type, width: 'fill', size: 'medium',\n form_action_type: 'submit',\n };\n}\n\nfunction manualButtonRow(buttons: object[]): object {\n return {\n tag: 'column_set', flex_mode: 'none', horizontal_spacing: '6px',\n columns: buttons.map((button) => ({\n tag: 'column', width: 'weighted', weight: 1, elements: [button],\n })),\n };\n}\n\nexport function statusCard(status: RuntimeStatus): object {\n const session = status.session;\n if (!session) {\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: 'Coding Assistant 状态' }, template: 'grey' },\n body: {\n padding: '12px',\n elements: [{\n tag: 'markdown',\n content: `⚪ **暂无 active session**\\n\\n当前共有 ${Object.keys(status.state.sessions ?? {}).length} 个可用 session,可发送 /sessions 进行选择。`,\n }],\n },\n };\n }\n\n const adapter = getAgentAdapter(session.agent);\n const visual = statusVisual(status);\n const path = formatDisplayPath(session.cwd);\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: `${session.id} · ${adapter.displayName}` }, template: visual.template },\n body: {\n vertical_spacing: '10px',\n padding: '12px',\n elements: [\n { tag: 'markdown', content: `<text_tag color='${visual.color}'>● ${visual.label}</text_tag> **当前连接**` },\n {\n tag: 'column_set',\n flex_mode: 'none',\n horizontal_spacing: '8px',\n columns: [\n statusColumn('Agent', `${agentMarker(session.agent)} ${adapter.displayName}`),\n statusColumn('tmux', status.paneAlive ? '✅ 运行中' : '⛔ 已停止'),\n ],\n },\n {\n tag: 'column_set',\n flex_mode: 'none',\n horizontal_spacing: '0px',\n columns: [{\n tag: 'column',\n width: 'weighted',\n weight: 1,\n background_style: 'grey',\n padding: '9px 10px',\n elements: [{ tag: 'markdown', content: `**工作目录**\\n\\`${escapeInlineCode(path)}\\`` }],\n }],\n },\n { tag: 'markdown', content: `**版本** \\`${escapeInlineCode(session.agentVersion)}\\`\\n**飞书连接** ${status.state.boundChatId ? '已绑定' : '未绑定'}` },\n ],\n },\n };\n}\n\nexport function sessionPickerCard(\n chatId: string,\n sessions: ManagedSession[],\n activeSessionId: string | undefined,\n signer: ActionSigner,\n): object {\n const groups = listAgentAdapters()\n .map((adapter) => ({ adapter, sessions: sessions.filter((session) => session.agent === adapter.id) }))\n .filter(({ sessions: group }) => group.length > 0);\n const elements = groups.flatMap(({ adapter, sessions: group }, groupIndex) => [\n ...(groupIndex > 0 ? [{ tag: 'hr', margin: '6px 0px' }] : []),\n {\n tag: 'markdown',\n content: `${agentMarker(adapter.id)} **${adapter.displayName}** · ${group.length} 个 session`,\n text_size: 'heading',\n margin: '2px 0px 0px 0px',\n },\n ...group.map((session) => sessionCard(chatId, session, session.id === activeSessionId, signer)),\n ]);\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: '选择 Coding Session' }, template: 'blue' },\n body: {\n vertical_spacing: '10px',\n padding: '12px',\n elements: elements.length > 0\n ? elements\n : [{ tag: 'markdown', content: '暂无可连接的 Coding Session。' }],\n },\n };\n}\n\nfunction sessionCard(\n chatId: string,\n session: ManagedSession,\n active: boolean,\n signer: ActionSigner,\n): object {\n const content = [\n active\n ? `**${escapeMarkdown(session.id)}** <text_tag color='green'>● 当前连接</text_tag>`\n : `**${escapeMarkdown(session.id)}**`,\n `📁 \\`${escapeInlineCode(formatDisplayPath(session.cwd))}\\``,\n ].join('\\n\\n');\n const elements: object[] = [{ tag: 'markdown', content }];\n if (!active) {\n elements.push({\n tag: 'button',\n text: { tag: 'plain_text', content: `连接 ${session.id}` },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n margin: '2px 0px 0px 0px',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'session',\n agent: session.agent,\n action: session.id,\n paneId: session.paneId,\n fingerprint: String(session.updatedAt),\n chatId,\n }),\n }],\n });\n }\n const contentColumn = {\n tag: 'column',\n width: 'weighted',\n weight: 1,\n vertical_spacing: '8px',\n background_style: 'grey',\n padding: '10px 12px',\n elements,\n };\n return {\n tag: 'column_set',\n flex_mode: 'none',\n horizontal_spacing: '0px',\n margin: '0px',\n columns: active\n ? [{\n tag: 'column',\n width: 'auto',\n background_style: 'green',\n padding: '0px 3px',\n elements: [],\n }, contentColumn]\n : [contentColumn],\n };\n}\n\nexport function formatDisplayPath(path: string, home = homedir(), maxLength = 44): string {\n const display = path === home\n ? '~'\n : path.startsWith(`${home}/`)\n ? `~${path.slice(home.length)}`\n : path;\n if (display.length <= maxLength) return display;\n const segments = display.split('/').filter(Boolean);\n return segments.length <= 2 ? display : `…/${segments.slice(-2).join('/')}`;\n}\n\nfunction agentMarker(agent: AgentId): string {\n if (agent === 'codex') return '🔵';\n if (agent === 'trae-cli') return '🟣';\n return '🟠';\n}\n\nfunction statusColumn(title: string, value: string): object {\n return {\n tag: 'column',\n width: 'weighted',\n weight: 1,\n background_style: 'grey',\n padding: '9px 10px',\n elements: [{ tag: 'markdown', content: `**${title}**\\n${value}` }],\n };\n}\n\nfunction statusVisual(status: RuntimeStatus): { label: string; color: string; template: string } {\n if (!status.paneAlive || status.screen?.state === 'exited') return { label: '已停止', color: 'red', template: 'red' };\n if (status.screen?.state === 'failed') return { label: '执行失败', color: 'red', template: 'red' };\n if (status.screen?.interaction?.kind === 'approval') return { label: '等待审批', color: 'orange', template: 'orange' };\n if (status.screen?.interaction?.kind === 'question') return { label: '等待回答', color: 'orange', template: 'orange' };\n if (status.screen?.interaction?.kind === 'choice') return { label: '等待选择', color: 'orange', template: 'orange' };\n if (status.screen?.state === 'input') return { label: '等待输入', color: 'orange', template: 'orange' };\n if (status.screen?.state === 'running') return { label: '执行中', color: 'blue', template: 'blue' };\n if (status.screen?.state === 'starting') return { label: '启动中', color: 'blue', template: 'blue' };\n if (status.screen?.state === 'idle') return { label: '等待用户输入', color: 'green', template: 'green' };\n return { label: '状态未知', color: 'grey', template: 'grey' };\n}\n\nexport function handledActionCard(\n action: SignedAction,\n result: string,\n handledAt = new Date(),\n): object {\n const agentName = getAgentAdapter(action.agent).displayName;\n const title = action.kind === 'choice'\n ? `${agentName} ${handledInteractionTitle(action.interactionKind)}`\n : action.kind === 'session'\n ? `${agentName} session 已切换`\n : `${agentName} 会话已停止`;\n const actionLabel = action.kind === 'choice'\n ? `选择第 ${action.action} 项`\n : action.kind === 'session'\n ? `连接 ${action.action}`\n : '停止会话';\n const content = [\n `✅ ${escapeMarkdown(result)}`,\n '',\n `**操作**:${escapeMarkdown(actionLabel)}`,\n `**处理时间**:${formatHandledAt(handledAt)}`,\n ].join('\\n');\n return card(title, content, [], 'green');\n}\n\nfunction card(title: string, content: string, buttons: object[], template = 'blue'): object {\n return cardElements(title, [{ tag: 'markdown', content }, ...buttons], template);\n}\n\nfunction cardElements(title: string, elements: object[], template = 'blue'): object {\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: title }, template },\n body: { vertical_spacing: '8px', padding: '12px', elements },\n };\n}\n\nfunction interactionTitle(kind: 'approval' | 'question' | 'choice'): string {\n if (kind === 'approval') return '等待审批';\n if (kind === 'question') return '等待回答';\n return '等待选择';\n}\n\nfunction handledInteractionTitle(kind?: 'approval' | 'question' | 'choice'): string {\n if (kind === 'approval') return '审批已处理';\n if (kind === 'question') return '回答已提交';\n return '选择已提交';\n}\n\nfunction choiceButtonType(risk?: string, focused?: boolean): string {\n if (risk === 'persistent' || risk === 'privileged') return 'danger';\n if (risk === 'reject') return 'default';\n return focused ? 'primary' : 'default';\n}\n\nfunction choiceActionLabel(key: string, label: string, description?: string): string {\n const suffix = description ? ` · ${description}` : '';\n return `${key}. ${label}${suffix}`.slice(0, 80);\n}\n\nfunction toggleActionLabel(action: ScreenDetection['actions'][number]): string {\n if (action.role === 'submit') return '提交答案';\n if (action.role === 'custom-input') return '自定义输入';\n if (action.role === 'chat') return '继续对话';\n return action.marker === 'checked' || action.marker === 'selected' ? '取消选择' : '选择此项';\n}\n\nfunction escapeFence(value: string): string {\n return value.replace(/```/g, '``\\\\`');\n}\n\nfunction escapeInlineCode(value: string): string {\n return value.replace(/`/g, '\\\\`');\n}\n\nfunction formatHandledAt(value: Date): string {\n const parts = new Intl.DateTimeFormat('zh-CN', {\n timeZone: 'Asia/Shanghai',\n year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit',\n hour12: false,\n }).formatToParts(value);\n const part = (type: Intl.DateTimeFormatPartTypes): string => parts.find((item) => item.type === type)?.value ?? '';\n return `${part('year')}-${part('month')}-${part('day')} ${part('hour')}:${part('minute')}:${part('second')}`;\n}\n\nfunction escapeMarkdown(value: string): string {\n return value.replace(/([\\\\`*_{}[\\]()#+.!|>-])/g, '\\\\$1');\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 { AssistantDaemon } from './daemon/server.js';\nimport { resolveAppPaths } from './core/paths.js';\nimport { AppStore } from './core/store.js';\nimport { readFile } from 'node:fs/promises';\n\nconst paths = resolveAppPaths();\nconst packageInfo = JSON.parse(\n await readFile(new URL('../package.json', import.meta.url), 'utf8'),\n) as { version: string };\nconst daemon = new AssistantDaemon(\n new AppStore(paths), paths, undefined, undefined, undefined, undefined, packageInfo.version,\n);\n\ntry {\n await daemon.start();\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.on(signal, () => {\n console.error(`${new Date().toISOString()} daemon received ${signal}; shutting down`);\n void daemon.close().finally(() => process.exit(0));\n });\n }\n} catch (error) {\n console.error(`${new Date().toISOString()} daemon crashed during startup`, error);\n process.exitCode = 1;\n}\n\nprocess.on('uncaughtException', (error) => {\n console.error(`${new Date().toISOString()} daemon uncaught exception`, error);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (error) => {\n console.error(`${new Date().toISOString()} daemon unhandled rejection`, error);\n process.exit(1);\n});\n"],"mappings":"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","names":["chmod","open","readFile","chmod","mkdir","paths","mkdir","chmod","randomBytes","ANSI","randomBytes","randomBytes","timingSafeEqual","randomBytes","timingSafeEqual","selected","result","result","card","paths","chmod","open","readFile","escapeFence","result","current","navigation","homedir","readFile"]}
1
+ {"version":3,"sources":["../src/daemon/server.ts","../src/platform/process.ts","../src/screen/normalize.ts","../src/core/store.ts","../src/core/model.ts","../src/core/atomic-json.ts","../src/core/errors.ts","../src/tmux/controller.ts","../src/tmux/input.ts","../src/screen/detector.ts","../src/screen/dialects.ts","../src/agents/resume.ts","../src/agents/stop-hook.ts","../src/agents/codex.ts","../src/agents/trae-cli.ts","../src/agents/claude-code.ts","../src/agents/types.ts","../src/agents/registry.ts","../src/agents/stop-event.ts","../src/lark/gateway.ts","../src/lark/action-signing.ts","../src/lark/cards.ts","../src/core/paths.ts","../src/daemon-entry.ts"],"sourcesContent":["import { appendFile, chmod, open, readFile, rm } from 'node:fs/promises';\nimport { createServer, type Socket } from 'node:net';\nimport { basename } from 'node:path';\nimport { runFile } from '../platform/process.js';\nimport type { ScreenDetection } from '../screen/detector.js';\nimport { tailScreen } from '../screen/normalize.js';\nimport { AppStore, createBindCode, hashBindCode } from '../core/store.js';\nimport type { AppConfig, ManagedSession, SessionState } from '../core/model.js';\nimport type { AppPaths } from '../core/paths.js';\nimport { AppError, serializeAppError } from '../core/errors.js';\nimport { TmuxController } from '../tmux/controller.js';\nimport type { DaemonRequest, DaemonResult, RuntimeStatus } from './protocol.js';\nimport { getAgentAdapter } from '../agents/registry.js';\nimport type { AgentId, AgentResume, TurnCompleteCandidate } from '../agents/types.js';\nimport { validTurnCompleteCandidate } from '../agents/stop-event.js';\nimport { LarkGateway, type GatewayFactory, type LarkActionResult, type RemoteGateway } from '../lark/gateway.js';\nimport type { CardActionEvent, NormalizedMessage } from '@larksuite/channel';\nimport type { SignedAction } from '../lark/action-signing.js';\nimport { verifyBindCode } from '../core/store.js';\nimport {\n CHOICE_FORM_SUBMIT_ACTION,\n MANUAL_TEXT_FIELD,\n choiceFormFieldName,\n inlineInputName,\n type ManualControlState,\n type ManualControlView,\n} from '../lark/cards.js';\n\nexport class AssistantDaemon {\n private config!: AppConfig;\n private state!: SessionState;\n private tmux!: TmuxController;\n private screen?: ScreenDetection;\n private previousScreen?: ScreenDetection;\n private readonly completedEvents = new Set<string>();\n private pendingCompletion?: TurnCompleteCandidate;\n private pendingCompletionAt = 0;\n private outputStableSince = Date.now();\n private timer?: NodeJS.Timeout;\n private pollInFlight?: Promise<void>;\n private ownsRuntimeFiles = false;\n private closing = false;\n private gateway?: RemoteGateway;\n private readonly pendingMessages: string[] = [];\n private interactionNotificationsSuppressed = 0;\n private unresolvedCandidate?: { key: string; since: number };\n private readonly unresolvedNotified = new Set<string>();\n private readonly closedManualCards = new Set<string>();\n private pendingInteractionInput?: {\n sessionId: string;\n interactionId: string;\n controlId: string;\n role: 'custom-input' | 'chat';\n label: string;\n cardMessageId: string;\n submitOnInput: boolean;\n action: SignedAction;\n };\n private readonly attachAttempts = new Map<string, number[]>();\n private server = createServer((socket) => this.handleSocket(socket));\n\n constructor(\n private readonly store: AppStore,\n private readonly paths: AppPaths,\n private readonly gatewayFactory: GatewayFactory = (config, secrets, handler) => new LarkGateway(config, secrets, handler),\n private readonly sessionName = 'lark-coding-assistant',\n private readonly stopHookCommand = 'lark-coding-assistant-hook',\n private readonly completionQuietMs = 2_500,\n private readonly appVersion = 'dev',\n ) {}\n\n async start(): Promise<void> {\n await this.store.ensure();\n const config = await this.store.loadConfig();\n if (!config) throw new Error('not initialized; run lark-coding-assistant init first');\n this.config = config;\n this.state = await this.store.loadState();\n this.tmux = new TmuxController(config.tmuxBinary);\n const secrets = await this.store.loadSecrets();\n if (!secrets) throw new Error('missing secrets; run lark-coding-assistant init again');\n await this.acquireRuntimeFiles();\n try {\n await this.reconcileSessions();\n await rm(this.paths.socket, { force: true });\n await new Promise<void>((resolve, reject) => {\n this.server.once('error', reject);\n this.server.listen(this.paths.socket, () => resolve());\n });\n await chmod(this.paths.socket, 0o600);\n this.gateway = this.gatewayFactory(config, secrets, {\n onMessage: (message) => this.onLarkMessage(message),\n onAction: (event, action) => this.onLarkAction(event, action),\n });\n await this.gateway.connect();\n this.schedulePoll();\n await this.log('daemon started');\n } catch (error) {\n await this.releaseRuntimeFiles();\n throw error;\n }\n }\n\n async close(): Promise<void> {\n this.closing = true;\n await this.log('daemon stopping').catch(() => undefined);\n if (this.timer) clearTimeout(this.timer);\n await this.pollInFlight?.catch(() => undefined);\n await this.gateway?.disconnect().catch(() => undefined);\n await new Promise<void>((resolve) => this.server.close(() => resolve()));\n await this.releaseRuntimeFiles();\n }\n\n private async acquireRuntimeFiles(): Promise<void> {\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const pidFile = await open(this.paths.pid, 'wx', 0o600);\n try {\n await pidFile.writeFile(`${process.pid}\\n`);\n } finally {\n await pidFile.close();\n }\n this.ownsRuntimeFiles = true;\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) throw error;\n const existingPid = Number.parseInt(await readFile(this.paths.pid, 'utf8').catch(() => ''), 10);\n if (Number.isInteger(existingPid) && processIsAlive(existingPid)) {\n throw new Error(`daemon is already running with PID ${existingPid}`);\n }\n await rm(this.paths.pid, { force: true });\n }\n }\n throw new Error('failed to acquire daemon PID file');\n }\n\n private async releaseRuntimeFiles(): Promise<void> {\n if (!this.ownsRuntimeFiles) return;\n const ownerPid = Number.parseInt(await readFile(this.paths.pid, 'utf8').catch(() => ''), 10);\n if (ownerPid === process.pid) {\n await Promise.all([rm(this.paths.socket, { force: true }), rm(this.paths.pid, { force: true })]);\n }\n this.ownsRuntimeFiles = false;\n }\n\n private handleSocket(socket: Socket): void {\n socket.setEncoding('utf8');\n let buffer = '';\n let dispatched = false;\n socket.on('data', (chunk) => {\n if (dispatched) return;\n buffer += chunk;\n const newline = buffer.indexOf('\\n');\n if (newline === -1) return;\n dispatched = true;\n const line = buffer.slice(0, newline);\n void Promise.resolve()\n .then(() => JSON.parse(line) as DaemonRequest)\n .then((request) => this.dispatch(request))\n .then((response) => socket.end(`${JSON.stringify(response)}\\n`))\n .catch((error) => socket.end(`${JSON.stringify(fail(error))}\\n`));\n });\n socket.on('end', () => {\n if (!dispatched) socket.end();\n });\n }\n\n private async dispatch(request: DaemonRequest): Promise<DaemonResult> {\n switch (request.method) {\n case 'ping': return { ok: true, value: { version: this.appVersion, pid: process.pid } };\n case 'shutdown': {\n setTimeout(() => void this.close(), 25);\n return { ok: true };\n }\n case 'start': return this.startSession(request.sessionId, request.cwd, request.agent, request.resume);\n case 'status': return { ok: true, value: await this.runtimeStatus(request.sessionId) };\n case 'tail': return { ok: true, value: await this.tail(request.lines ?? 80) };\n case 'send': return this.send(request.text);\n case 'key': return this.key(request.key, request.fingerprint);\n case 'stop': return this.stopSession(request.sessionId);\n case 'useSession': return this.useSession(request.sessionId);\n case 'bindCode': return this.rotateBindCode();\n case 'resetOwner': return this.resetOwner();\n case 'turnComplete': return this.handleTurnComplete(request.candidate);\n }\n }\n\n private async startSession(\n sessionId: string,\n cwd: string,\n agentId: AgentId,\n resume?: AgentResume,\n ): Promise<DaemonResult> {\n if (!validSessionId(sessionId)) {\n return fail(new AppError(\n 'INVALID_SESSION_NAME',\n 'session name must use letters, digits, underscore, or dash',\n { sessionId },\n ));\n }\n const existing = this.state.sessions?.[sessionId];\n if (existing && await this.tmux.inspect(existing.paneId)) {\n return fail(new AppError(\n 'SESSION_EXISTS',\n `managed coding-agent session is already running: ${sessionId}`,\n { sessionId },\n ));\n }\n const becomesActive = !this.state.activeSessionId;\n if (becomesActive) {\n this.pendingMessages.length = 0;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n }\n const adapter = getAgentAdapter(agentId);\n const binary = adapter.binary(this.config);\n const agentVersion = (await runFile(binary, [...adapter.versionArgs])).stdout.trim();\n const tmuxSessionName = existing?.sessionName ?? `${this.sessionName}-${sessionId}`;\n const pane = await this.tmux.create({\n sessionName: tmuxSessionName,\n cwd,\n binary,\n args: adapter.buildLaunchArgs({\n resume,\n stopHookCommand: this.stopHookCommand,\n }),\n env: {\n LARK_CODING_ASSISTANT_SOCKET: this.paths.socket,\n LARK_CODING_ASSISTANT_SESSION_ID: sessionId,\n },\n });\n const binding = this.createSessionBinding();\n const session: ManagedSession = {\n id: sessionId,\n agent: agentId,\n sessionName: pane.sessionName,\n paneId: pane.paneId,\n cwd,\n agentVersion,\n updatedAt: Date.now(),\n };\n this.state = {\n ...this.state,\n sessions: { ...this.state.sessions, [sessionId]: session },\n activeSessionId: this.state.activeSessionId ?? sessionId,\n boundChatId: binding.mode === 'reused' ? this.state.boundChatId : undefined,\n bindCodeHash: binding.mode === 'code' ? hashBindCode(binding.bindCode) : undefined,\n bindCodeExpiresAt: binding.mode === 'code' ? Date.now() + 10 * 60_000 : undefined,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n await this.poll();\n return { ok: true, value: { pane, session, binding, active: this.state.activeSessionId === sessionId } };\n }\n\n private createSessionBinding():\n | { mode: 'reused' }\n | { mode: 'awaiting-owner-message' }\n | { mode: 'code'; bindCode: string; expiresInSeconds: number } {\n if (this.state.ownerOpenId && this.state.boundChatId && !this.state.autoBindDisabled) {\n return { mode: 'reused' };\n }\n if (this.state.ownerOpenId && !this.state.autoBindDisabled) {\n return { mode: 'awaiting-owner-message' };\n }\n return { mode: 'code', bindCode: createBindCode(), expiresInSeconds: 600 };\n }\n\n private async runtimeStatus(sessionId = this.state.activeSessionId): Promise<RuntimeStatus> {\n const session = sessionId ? this.state.sessions?.[sessionId] : undefined;\n const pane = session ? await this.tmux.inspect(session.paneId) : undefined;\n return { state: this.state, session, screen: sessionId === this.state.activeSessionId ? this.screen : undefined, paneAlive: Boolean(pane && !pane.dead) };\n }\n\n private async tail(lines: number): Promise<string> {\n const session = this.activeSession();\n if (!session) throw new Error('no active managed session');\n return tailScreen(await this.tmux.capture(session.paneId, lines), lines);\n }\n\n private async send(text: string): Promise<DaemonResult> {\n const session = this.activeSession();\n if (!session) return { ok: false, error: 'no active managed session' };\n await this.poll();\n if (this.screen?.state === 'approval') return { ok: false, error: 'approval is pending' };\n if (this.screen?.hasDraftInput) return { ok: false, error: 'local draft input detected' };\n if (!this.screen || this.screen.state === 'unknown') return { ok: false, error: 'screen state is unknown' };\n this.clearPendingCompletion();\n await this.tmux.sendText(session.paneId, text);\n return { ok: true };\n }\n\n private async onLarkMessage(message: NormalizedMessage): Promise<void> {\n if (message.chatType !== 'p2p' || message.senderIsBot || message.senderType === 'bot') return;\n const text = message.content.trim();\n const attachCode = text.match(/^\\/attach\\s+([^\\s]+)\\s*$/)?.[1];\n if (!this.state.boundChatId) {\n if (this.canAutoBind(message)) {\n await this.bindChat(message, true);\n } else {\n if (!attachCode) return;\n await this.handleAttach(message, attachCode);\n return;\n }\n }\n if (message.senderId !== this.state.ownerOpenId || message.chatId !== this.state.boundChatId) return;\n\n const tailMatch = text.match(/^\\/tail(?:\\s+(\\d+))?$/);\n if (tailMatch) {\n const lines = tailMatch[1] ? Number(tailMatch[1]) : 80;\n if (!Number.isInteger(lines) || lines < 20 || lines > 300) {\n await this.gateway?.sendText(message.chatId, '用法:/tail [20-300]');\n return;\n }\n const output = await this.tail(lines).catch((error) => `读取失败:${errorMessage(error)}`);\n const session = this.activeSession();\n const metadata = session\n ? `**${session.id} · ${getAgentAdapter(session.agent).displayName}** · 状态 \\`${this.screen?.state ?? 'unknown'}\\` · ${manualTimestamp()}`\n : '**当前没有 active session**';\n await this.gateway?.sendMarkdown(message.chatId, `${metadata}\\n\\n\\`\\`\\`text\\n${escapeFence(output).slice(-6800)}\\n\\`\\`\\``);\n return;\n }\n if (text.startsWith('/tail')) {\n await this.gateway?.sendText(message.chatId, '用法:/tail [20-300]');\n return;\n }\n if (text === '/manual') {\n await this.poll();\n const view = this.currentManualView();\n if (!view) await this.gateway?.sendText(message.chatId, '当前没有可遥控的 active tmux session。');\n else {\n try {\n await this.gateway?.sendManual(message.chatId, view);\n } catch (error) {\n await this.log(`manual card failed: ${errorMessage(error)}`);\n await this.gateway?.sendText(\n message.chatId,\n '手动遥控卡发送失败。可使用 /tail 120 查看终端,或使用 /key、/type、/submit 操作。',\n );\n }\n }\n return;\n }\n const manualKey = text.match(/^\\/key\\s+(up|down|left|right|enter|esc|tab|space|backspace|ctrl-c)$/i)?.[1];\n if (manualKey) {\n await this.executeManualCommand(message.chatId, `按键 ${manualKey}`, async (session) => {\n await this.tmux.sendKey(session.paneId, manualTmuxKey(manualKey));\n });\n return;\n }\n if (text.startsWith('/key')) {\n await this.gateway?.sendText(message.chatId, '用法:/key up|down|left|right|enter|esc|tab|space|backspace|ctrl-c');\n return;\n }\n const typeMatch = text.match(/^\\/(type|submit)\\s+([\\s\\S]+)$/);\n if (typeMatch?.[1] && typeMatch[2]?.trim()) {\n const submit = typeMatch[1] === 'submit';\n await this.executeManualCommand(message.chatId, submit ? '输入并提交' : '仅输入', async (session) => {\n await this.tmux.sendText(session.paneId, typeMatch[2] as string, submit);\n });\n return;\n }\n if (text === '/type' || text === '/submit') {\n await this.gateway?.sendText(message.chatId, `用法:${text} <文本>`);\n return;\n }\n if (text === '/status') {\n const status = await this.runtimeStatus();\n await this.gateway?.sendStatus(message.chatId, status);\n return;\n }\n if (text === '/sessions') {\n const sessions = await this.reconcileSessions();\n try {\n await this.gateway?.sendSessionPicker(\n message.chatId,\n sessions,\n this.state.activeSessionId,\n );\n } catch (error) {\n await this.log(`session picker notification failed: ${errorMessage(error)}`);\n await this.gateway?.sendText(\n message.chatId,\n 'Session 选择卡片发送失败,请稍后重试;也可以发送 /use <session 名称> 进行切换。',\n );\n }\n return;\n }\n const useSessionId = text.match(/^\\/use\\s+([a-zA-Z0-9_-]+)\\s*$/)?.[1];\n if (useSessionId) {\n const result = await this.useSession(useSessionId);\n const target = this.state.sessions?.[useSessionId];\n const reply = result.ok\n ? `已连接到 ${target ? getAgentAdapter(target.agent).displayName : 'coding agent'} session:${useSessionId}`\n : `切换失败:${result.error}`;\n await this.gateway?.sendText(\n message.chatId,\n reply,\n );\n return;\n }\n if (text === '/detach') {\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n this.state = {\n ...this.state,\n boundChatId: undefined,\n autoBindDisabled: true,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n await this.gateway?.sendText(message.chatId, '已解除本次飞书绑定;coding agent 和 tmux 仍在运行。');\n return;\n }\n if (text === '/stop') {\n await this.poll();\n const session = this.activeSession();\n if (!session || !this.screen) {\n await this.gateway?.sendText(message.chatId, '当前没有可停止的 coding agent 会话。');\n } else {\n await this.gateway?.sendStopConfirmation(message.chatId, session.paneId, this.screen.fingerprint, session.agent);\n }\n return;\n }\n\n const pendingInput = this.pendingInteractionInput;\n if (pendingInput) {\n const session = this.activeSession();\n if (!session || session.id !== pendingInput.sessionId) {\n this.pendingInteractionInput = undefined;\n await this.gateway?.sendText(message.chatId, '交互会话已经变化,请重新操作。');\n return;\n }\n await this.tmux.sendText(session.paneId, message.content, pendingInput.submitOnInput);\n this.pendingInteractionInput = undefined;\n if (pendingInput.submitOnInput) {\n await this.waitForInteractionChange(pendingInput.interactionId);\n if (this.screen?.interaction?.interactionId === pendingInput.interactionId) {\n await this.gateway?.sendText(message.chatId, '补充内容已输入,但终端仍停留在原问题,请用 /tail 检查。');\n return;\n }\n const content = `已向 ${getAgentAdapter(session.agent).displayName} 提交补充内容。`;\n await this.gateway?.completeChoiceInput(pendingInput.cardMessageId, pendingInput.action, content);\n await this.flushPending();\n return;\n }\n if (pendingInput.role === 'custom-input') {\n const refreshed = await this.withInteractionNotificationsSuppressed(async () => {\n await this.waitForCustomInputValue(pendingInput.interactionId, pendingInput.controlId, message.content);\n const current = this.screen;\n if (current?.interaction?.semantics && (current.interaction.actionConfidence ?? 0) >= 0.85) {\n await this.gateway?.updateChoice(\n pendingInput.cardMessageId,\n message.chatId,\n session.paneId,\n current,\n session.agent,\n );\n return true;\n }\n return false;\n });\n if (refreshed) return;\n }\n await this.gateway?.sendText(message.chatId, `已向 ${getAgentAdapter(session.agent).displayName} 提交补充内容。`);\n return;\n }\n\n await this.poll();\n if (this.shouldQueueMessage()) {\n if (this.pendingMessages.length >= 100) {\n await this.gateway?.sendText(message.chatId, '待发送队列已满,请先处理当前终端状态。');\n return;\n }\n this.pendingMessages.push(message.content);\n await this.gateway?.sendText(message.chatId, `当前终端暂不可安全写入,消息已排队(${this.pendingMessages.length} 条)。`);\n return;\n }\n const result = await this.send(message.content);\n if (!result.ok) await this.gateway?.sendText(message.chatId, `未发送:${result.error}`);\n }\n\n private async handleAttach(message: NormalizedMessage, code: string): Promise<void> {\n if (this.state.ownerOpenId && message.senderId !== this.state.ownerOpenId) return;\n if (!this.allowAttachAttempt(message.senderId)) return;\n const valid = Boolean(\n this.state.bindCodeHash\n && this.state.bindCodeExpiresAt\n && this.state.bindCodeExpiresAt >= Date.now()\n && verifyBindCode(code, this.state.bindCodeHash),\n );\n if (!valid) {\n await this.gateway?.sendText(message.chatId, '绑定失败:绑定码无效或已过期。');\n return;\n }\n await this.bindChat(message, false);\n }\n\n private canAutoBind(message: NormalizedMessage): boolean {\n return !this.state.autoBindDisabled\n && Boolean(this.state.ownerOpenId)\n && message.senderId === this.state.ownerOpenId;\n }\n\n private async bindChat(message: NormalizedMessage, automatic: boolean): Promise<void> {\n this.state = {\n ...this.state,\n ownerOpenId: this.state.ownerOpenId ?? message.senderId,\n boundChatId: message.chatId,\n autoBindDisabled: false,\n bindCodeHash: undefined,\n bindCodeExpiresAt: undefined,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n await this.gateway?.sendText(\n message.chatId,\n automatic\n ? '已自动连接当前 coding agent 会话。之后直接发送普通消息即可。'\n : '绑定成功。之后的普通消息会发送到当前 tmux 中的 coding agent;可用 /tail、/status、/sessions、/detach、/stop。',\n );\n this.previousScreen = undefined;\n await this.poll();\n }\n\n private allowAttachAttempt(senderId: string): boolean {\n const cutoff = Date.now() - 60_000;\n const attempts = (this.attachAttempts.get(senderId) ?? []).filter((time) => time >= cutoff);\n if (attempts.length >= 5) return false;\n attempts.push(Date.now());\n this.attachAttempts.set(senderId, attempts);\n return true;\n }\n\n private shouldQueueMessage(): boolean {\n return !this.screen\n || this.screen.state === 'approval'\n || this.screen.state === 'unknown'\n || this.screen.state === 'failed'\n || this.screen.state === 'exited'\n || this.screen.hasDraftInput;\n }\n\n private async onLarkAction(\n event: CardActionEvent,\n action: SignedAction,\n ): Promise<LarkActionResult> {\n if (event.operator.openId !== this.state.ownerOpenId || event.chatId !== this.state.boundChatId) {\n return { type: 'error', content: '无权操作当前会话。' };\n }\n if (action.kind === 'session') {\n const target = this.state.sessions?.[action.action];\n if (!target\n || target.agent !== action.agent\n || target.paneId !== action.paneId\n || String(target.updatedAt) !== action.fingerprint) {\n return { type: 'error', content: '目标 session 已变化,请重新发送 /sessions。' };\n }\n const result = await this.useSession(target.id);\n return result.ok\n ? { type: 'success', content: `已连接到 ${target.id}` }\n : { type: 'error', content: result.error };\n }\n if (action.kind === 'manual') {\n return this.withInteractionNotificationsSuppressed(() => this.handleManualAction(action, event));\n }\n await this.poll();\n const session = this.activeSession();\n if (action.kind === 'choice') {\n return this.withInteractionNotificationsSuppressed(() => this.handleChoiceAction(action, session, event));\n }\n if (action.paneId !== session?.paneId || action.agent !== session.agent || action.fingerprint !== this.screen?.fingerprint) {\n return { type: 'error', content: '会话画面已变化,请重新发送 /stop。' };\n }\n const result = await this.stopSession(session.id);\n return result.ok\n ? { type: 'success', content: `${getAgentAdapter(session.agent).displayName} 会话已停止。` }\n : { type: 'error', content: result.error };\n }\n\n private async handleManualAction(action: SignedAction, event: CardActionEvent): Promise<LarkActionResult> {\n await this.poll();\n const session = this.activeSession();\n const screen = this.screen;\n if (!session || !screen || action.sessionId !== session.id || action.agent !== session.agent || action.paneId !== session.paneId) {\n return { type: 'error', content: '手动遥控对应的 session 已变化,请重新发送 /manual。' };\n }\n if (this.closedManualCards.has(event.messageId)) {\n return {\n type: 'manual', content: '该手动遥控卡已经结束。',\n view: this.manualView(session, screen, 'exited', undefined, '结束遥控', action.manualMode),\n };\n }\n if (action.action !== 'refresh' && action.fingerprint !== screen.fingerprint) {\n return {\n type: 'manual', content: '终端画面已变化,旧操作未执行。',\n view: this.manualView(session, screen, 'stale', '请确认最新终端画面后重试。', undefined, action.manualMode),\n };\n }\n if (action.action === 'exit') {\n remember(this.closedManualCards, event.messageId, 256);\n return {\n type: 'manual', content: '已结束手动遥控。',\n view: this.manualView(session, screen, 'exited', undefined, '结束遥控', action.manualMode),\n };\n }\n let operation = '刷新终端输出';\n try {\n if (action.action === 'type' || action.action === 'submit') {\n const value = event.action.formValue?.[MANUAL_TEXT_FIELD];\n if (typeof value !== 'string' || !value.trim()) return { type: 'error', content: '请输入要发送到终端的文本。' };\n const submit = action.action === 'submit';\n operation = submit ? '输入文本并提交' : '仅输入文本';\n await this.tmux.sendText(session.paneId, value, submit);\n } else if (action.action !== 'refresh') {\n const key = manualTmuxKey(action.action);\n operation = `按键 ${action.action}`;\n await this.tmux.sendKey(session.paneId, key);\n }\n if (action.action === 'refresh') await this.poll();\n else await this.settleManualScreen();\n } catch (error) {\n await this.poll().catch(() => undefined);\n const current = this.screen ?? screen;\n return {\n type: 'manual', content: '手动操作失败。',\n view: this.manualView(session, current, 'error', errorMessage(error), operation, action.manualMode),\n };\n }\n const current = this.screen ?? screen;\n if (action.manualMode !== 'explicit' && safeStructuredInteraction(current)) {\n await this.gateway?.sendChoice(event.chatId, session.paneId, current, session.agent);\n return {\n type: 'manual', content: '已恢复结构化识别。',\n view: this.manualView(session, current, 'recovered', undefined, operation, action.manualMode),\n };\n }\n return {\n type: 'manual', content: `${operation}已执行。`,\n view: this.manualView(session, current, 'active', undefined, operation, action.manualMode),\n };\n }\n\n private currentManualView(): ManualControlView | undefined {\n const session = this.activeSession();\n if (!session || !this.screen || this.screen.state === 'exited') return undefined;\n return this.manualView(session, this.screen, 'active', undefined, undefined, 'explicit');\n }\n\n private async settleManualScreen(): Promise<void> {\n let previousFingerprint: string | undefined;\n const deadline = Date.now() + 900;\n do {\n await new Promise((resolve) => setTimeout(resolve, 120));\n await this.poll();\n const fingerprint = this.screen?.fingerprint;\n if (fingerprint && fingerprint === previousFingerprint) return;\n previousFingerprint = fingerprint;\n } while (Date.now() < deadline);\n }\n\n private manualView(\n session: ManagedSession,\n screen: ScreenDetection,\n state: ManualControlState = 'active',\n notice?: string,\n lastOperation?: string,\n mode: ManualControlView['mode'] = 'fallback',\n ): ManualControlView {\n return {\n session,\n screen,\n output: tailScreen(screen.normalized, 40),\n capturedAt: new Date(),\n state,\n notice,\n lastOperation,\n mode,\n };\n }\n\n private async executeManualCommand(\n chatId: string,\n operation: string,\n execute: (session: ManagedSession) => Promise<void>,\n ): Promise<void> {\n await this.poll();\n const session = this.activeSession();\n if (!session || !this.screen || this.screen.state === 'exited') {\n await this.gateway?.sendText(chatId, '当前没有可遥控的 active tmux session。');\n return;\n }\n try {\n await execute(session);\n await new Promise((resolve) => setTimeout(resolve, 120));\n await this.poll();\n const output = this.screen ? tailScreen(this.screen.normalized, 60) : '无法读取最新终端画面。';\n await this.gateway?.sendMarkdown(chatId, `**手动操作:${operation}**\\n\\n\\`\\`\\`text\\n${escapeFence(output).slice(-6500)}\\n\\`\\`\\``);\n } catch (error) {\n await this.gateway?.sendText(chatId, `手动操作失败:${errorMessage(error)}`);\n }\n }\n\n private async handleChoiceAction(action: SignedAction, session: ManagedSession | undefined, event: CardActionEvent): Promise<LarkActionResult> {\n if (action.paneId !== session?.paneId || action.agent !== session.agent) return { type: 'error', content: '会话已变化。' };\n if (event.action.formValue) {\n if (action.action !== CHOICE_FORM_SUBMIT_ACTION) return { type: 'error', content: '无法识别该表单操作,请使用最新卡片。' };\n return this.handleToggleFormSubmit(action, session, event.action.formValue);\n }\n const before = this.screen?.interaction;\n const target = this.screen?.actions.find(({ key }) => key === action.action);\n const fingerprint = before?.revision ?? this.screen?.fingerprint ?? action.fingerprint;\n const customAlreadySelected = target?.role === 'custom-input'\n && (target.marker === 'checked' || target.marker === 'selected')\n && fingerprint === action.fingerprint\n && before?.kind === action.interactionKind;\n const opensEditor = target?.role === 'custom-input' && target.editor;\n let result: DaemonResult;\n if (customAlreadySelected) {\n result = { ok: true, value: `继续填写:${target.label}` };\n } else if (opensEditor && before?.interactionId) {\n const navigation = await this.navigateToControl(session.paneId, target.id, before.interactionId);\n if (!navigation.ok) return { type: 'error', content: navigation.error };\n if (opensEditor.openKey) await this.tmux.sendKey(session.paneId, opensEditor.openKey);\n result = { ok: true, value: `继续填写:${target.label}` };\n } else {\n result = await this.submitChoice(action.action, fingerprint, action.interactionKind);\n }\n if (!result.ok) return { type: 'error', content: result.error };\n if (before?.semantics?.activation === 'toggle' && target?.role === 'answer') {\n await this.waitForControlMarker(before.interactionId, target.id, target.marker);\n const currentScreen = this.screen;\n const currentTarget = currentScreen?.actions.find(({ id }) => id === target.id);\n if (!currentScreen || !currentTarget || currentScreen.interaction?.interactionId !== before.interactionId || currentTarget.marker === target.marker) {\n return { type: 'error', content: '终端选择状态没有按预期更新,请用 /tail 检查。' };\n }\n return {\n type: 'refresh', content: `${currentTarget.marker === 'checked' || currentTarget.marker === 'selected' ? '已选择' : '已取消'}:${target.label}`,\n screen: currentScreen, paneId: session.paneId, agent: session.agent,\n };\n }\n if (target?.role === 'custom-input' || target?.role === 'chat') {\n await new Promise((resolve) => setTimeout(resolve, 100));\n await this.poll();\n if (!before?.interactionId) return { type: 'error', content: '无法确认当前交互,请用 /tail 检查。' };\n this.pendingInteractionInput = {\n sessionId: session.id,\n interactionId: this.screen?.interaction?.interactionId ?? before.interactionId,\n controlId: target.id,\n role: target.role,\n label: target.label,\n cardMessageId: event.messageId,\n submitOnInput: target.role === 'chat' || before.semantics?.activation === 'submit',\n action,\n };\n return { type: 'awaiting-input', content: '请发送下一条普通消息。', agent: session.agent, label: target.label };\n }\n await this.waitForInteractionChange(before?.interactionId);\n if (this.screen?.interaction\n && this.screen.interaction.interactionId !== before?.interactionId\n && this.screen.interaction.semantics\n && (this.screen.interaction.actionConfidence ?? 0) >= 0.85) {\n return {\n type: 'refresh',\n content: '已进入下一步确认。',\n screen: this.screen,\n paneId: session.paneId,\n agent: session.agent,\n };\n }\n if ((target?.role === 'submit' || before?.semantics?.commit.mode === 'immediate')\n && this.screen?.interaction?.interactionId === before?.interactionId) {\n return { type: 'error', content: '终端仍停留在原问题,未确认提交成功。' };\n }\n await this.flushPending();\n return { type: 'success', content: result.value as string };\n }\n\n private async handleToggleFormSubmit(\n action: SignedAction,\n session: ManagedSession,\n formValue: Record<string, unknown>,\n ): Promise<LarkActionResult> {\n const initialScreen = this.screen;\n const interaction = initialScreen?.interaction;\n if (!initialScreen || !interaction?.interactionId || interaction.semantics?.activation !== 'toggle'\n || (interaction.revision ?? initialScreen.fingerprint) !== action.fingerprint\n || interaction.kind !== action.interactionKind) {\n return { type: 'error', content: '卡片状态已变化,请使用最新卡片。' };\n }\n const synced = await this.syncToggleFormState(session.paneId, initialScreen, formValue);\n if (!synced.ok) return { type: 'error', content: synced.error };\n\n if (synced.committed) {\n await this.waitForInteractionChange(interaction.interactionId);\n if (this.screen?.interaction?.interactionId === interaction.interactionId) {\n return { type: 'error', content: '自定义内容已同步,但终端仍停留在原问题。' };\n }\n if (this.screen?.interaction?.semantics && (this.screen.interaction.actionConfidence ?? 0) >= 0.85) {\n return {\n type: 'refresh', content: '答案已提交,已进入下一步确认。', screen: this.screen,\n paneId: session.paneId, agent: session.agent,\n };\n }\n await this.flushPending();\n return { type: 'success', content: `已向 ${getAgentAdapter(session.agent).displayName} 提交答案。` };\n }\n\n await this.poll();\n const current = this.screen;\n if (!current?.interaction || current.interaction.interactionId !== interaction.interactionId) {\n return { type: 'error', content: '终端问题在提交前已经变化,请使用最新卡片。' };\n }\n const commit = current.interaction.semantics?.commit;\n if (!commit || commit.mode === 'immediate') return { type: 'error', content: '无法确定终端提交方式,请用 /tail 检查。' };\n if (commit.mode === 'key') {\n await this.tmux.sendKey(session.paneId, commit.key);\n } else {\n const submit = current.actions.find(({ id }) => id === commit.controlId);\n if (!submit) return { type: 'error', content: '终端提交按钮已经变化,请使用最新卡片。' };\n const navigation = await this.navigateToControl(session.paneId, submit.id, interaction.interactionId);\n if (!navigation.ok) return { type: 'error', content: navigation.error };\n await this.tmux.sendKey(session.paneId, 'Enter');\n }\n\n await this.waitForInteractionChange(interaction.interactionId);\n if (this.screen?.interaction?.interactionId === interaction.interactionId) {\n return { type: 'error', content: '终端仍停留在原问题,未确认提交成功。' };\n }\n if (this.screen?.interaction?.semantics && (this.screen.interaction.actionConfidence ?? 0) >= 0.85) {\n return {\n type: 'refresh', content: '答案已提交,已进入下一步确认。', screen: this.screen,\n paneId: session.paneId, agent: session.agent,\n };\n }\n await this.flushPending();\n return { type: 'success', content: `已向 ${getAgentAdapter(session.agent).displayName} 提交答案。` };\n }\n\n private async withInteractionNotificationsSuppressed<T>(operation: () => Promise<T>): Promise<T> {\n this.interactionNotificationsSuppressed += 1;\n try {\n return await operation();\n } finally {\n this.interactionNotificationsSuppressed -= 1;\n }\n }\n\n private async key(key: string, fingerprint: string): Promise<DaemonResult> {\n return this.submitChoice(key, fingerprint);\n }\n\n private async submitChoice(\n choice: string,\n fingerprint: string,\n expectedKind?: 'approval' | 'question' | 'choice',\n ): Promise<DaemonResult> {\n const session = this.activeSession();\n if (!session) return { ok: false, error: 'no active managed session' };\n await this.poll();\n const screen = this.screen;\n const interaction = screen?.interaction;\n const revision = interaction?.revision ?? screen?.fingerprint;\n if (!screen || !interaction?.semantics || !interaction.actionConfidence || interaction.actionConfidence < 0.85\n || revision !== fingerprint || screen.actions.length === 0\n || (expectedKind && interaction.kind !== expectedKind)) {\n return { ok: false, error: 'choice screen changed; refusing stale action' };\n }\n const target = screen.actions.find((action) => action.key === choice);\n if (!target) return { ok: false, error: 'option is not valid for current choice' };\n if (target.shortcut && (target.role === 'custom-input' || target.role === 'chat')) {\n await this.tmux.sendKey(session.paneId, target.shortcut);\n } else {\n const navigation = await this.navigateToControl(session.paneId, target.id, interaction.interactionId);\n if (!navigation.ok) return navigation;\n await this.tmux.sendKey(session.paneId, 'Enter');\n }\n const verb = interaction.kind === 'approval' ? '提交审批选择' : interaction.kind === 'question' ? '提交答案' : '提交选择';\n return { ok: true, value: `已向 ${getAgentAdapter(session.agent).displayName} ${verb}:${target.label}` };\n }\n\n private async navigateToControl(paneId: string, targetId: string, interactionId?: string): Promise<DaemonResult> {\n for (let step = 0; step < 24; step += 1) {\n const screen = this.screen;\n if (!screen?.interaction || screen.interaction.interactionId !== interactionId) {\n return { ok: false, error: 'interaction changed while navigating; refusing action' };\n }\n const focusedIndex = screen.actions.findIndex(({ focused }) => focused);\n const targetIndex = screen.actions.findIndex(({ id }) => id === targetId);\n if (focusedIndex === -1 || targetIndex === -1) return { ok: false, error: 'cannot determine current or target focus' };\n if (focusedIndex === targetIndex) return { ok: true };\n const direction = targetIndex > focusedIndex ? 'Down' : 'Up';\n await this.tmux.sendKey(paneId, direction);\n await new Promise((resolve) => setTimeout(resolve, 40));\n await this.poll();\n const nextFocused = this.screen?.actions.findIndex(({ focused }) => focused) ?? -1;\n if (nextFocused === focusedIndex) return { ok: false, error: 'terminal focus did not move as expected' };\n }\n return { ok: false, error: 'terminal focus navigation exceeded its safe step limit' };\n }\n\n private async waitForInteractionChange(interactionId?: string): Promise<void> {\n const deadline = Date.now() + 1_500;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 75));\n await this.poll();\n const current = this.screen?.interaction;\n if (!current || current.interactionId !== interactionId) return;\n }\n }\n\n private async waitForControlMarker(interactionId: string | undefined, controlId: string, marker: import('../screen/interaction-types.js').SelectionMarker | undefined): Promise<void> {\n const deadline = Date.now() + 1_500;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 75));\n await this.poll();\n const current = this.screen?.interaction;\n const control = this.screen?.actions.find(({ id }) => id === controlId);\n if (!current || current.interactionId !== interactionId || control?.marker !== marker) return;\n }\n }\n\n private async waitForCustomInputValue(interactionId: string, controlId: string, input: string): Promise<void> {\n const expected = input.trim();\n const deadline = Date.now() + 1_500;\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 75));\n await this.poll();\n const control = this.screen?.actions.find(({ id }) => id === controlId);\n if (this.screen?.interaction?.interactionId === interactionId\n && control?.inputValue\n && (control.inputValue === expected || expected.startsWith(control.inputValue))) return;\n }\n }\n\n private async syncToggleFormState(\n paneId: string,\n initialScreen: ScreenDetection,\n formValue: Record<string, unknown>,\n ): Promise<{ ok: true; committed: boolean } | { ok: false; error: string }> {\n const interactionId = initialScreen.interaction?.interactionId;\n if (!interactionId) return { ok: false, error: '无法确定当前终端问题。' };\n const desiredControls = initialScreen.actions.flatMap((control, index) => {\n if (control.role !== 'answer' && control.role !== 'custom-input') return [];\n const selected = formChecked(formValue[choiceFormFieldName(index)]);\n const rawInput = formValue[inlineInputName(index)];\n const input = control.role === 'custom-input' && typeof rawInput === 'string'\n ? rawInput.trim()\n : undefined;\n return [{ id: control.id, role: control.role, selected, input, editor: control.editor }];\n }).sort((left, right) => Number(left.role === 'custom-input') - Number(right.role === 'custom-input'));\n const emptyCustom = desiredControls.find(({ role, selected, input }) => role === 'custom-input' && selected && !input);\n if (emptyCustom) return { ok: false, error: '已勾选自定义输入,但内容为空。请填写内容后再提交。' };\n\n const toggleKey = initialScreen.interaction?.semantics?.toggleKey ?? 'Enter';\n for (const desired of desiredControls) {\n await this.poll();\n let control = this.screen?.actions.find(({ id }) => id === desired.id);\n if (!control || this.screen?.interaction?.interactionId !== interactionId) {\n return { ok: false, error: '终端选项已经变化,请使用最新卡片。' };\n }\n const currentlySelected = control.marker === 'checked' || control.marker === 'selected';\n if (currentlySelected !== desired.selected) {\n const navigation = await this.navigateToControl(paneId, control.id, interactionId);\n if (!navigation.ok) return navigation;\n const previousMarker = control.marker;\n await this.tmux.sendKey(paneId, toggleKey);\n await this.waitForControlMarker(interactionId, control.id, previousMarker);\n control = this.screen?.actions.find(({ id }) => id === desired.id);\n const selectedAfterToggle = control?.marker === 'checked' || control?.marker === 'selected';\n if (!control || selectedAfterToggle !== desired.selected) {\n return { ok: false, error: `终端选项“${control?.label ?? desired.id}”没有按预期更新。` };\n }\n }\n if (desired.role !== 'custom-input' || !desired.selected || desired.input === undefined) continue;\n control = this.screen?.actions.find(({ id }) => id === desired.id);\n if (control?.inputValue?.trim() === desired.input) continue;\n const navigation = await this.navigateToControl(paneId, desired.id, interactionId);\n if (!navigation.ok) return navigation;\n if (desired.editor) {\n if (desired.editor.openKey) await this.tmux.sendKey(paneId, desired.editor.openKey);\n await new Promise((resolve) => setTimeout(resolve, 100));\n await this.tmux.sendKey(paneId, 'C-u');\n await this.tmux.sendKey(paneId, 'C-k');\n await this.tmux.sendText(paneId, desired.input, false);\n await this.tmux.sendKey(paneId, desired.editor.submitKey);\n return { ok: true, committed: desired.editor.commitsInteraction };\n }\n await this.tmux.sendKey(paneId, 'C-u');\n await this.tmux.sendKey(paneId, 'C-k');\n await this.tmux.sendText(paneId, desired.input, false);\n await this.waitForCustomInputValue(interactionId, desired.id, desired.input);\n control = this.screen?.actions.find(({ id }) => id === desired.id);\n if (!control?.inputValue || !(desired.input === control.inputValue || desired.input.startsWith(control.inputValue))) {\n return { ok: false, error: '自定义内容没有完整同步到终端,请重试。' };\n }\n }\n return { ok: true, committed: false };\n }\n\n private async stopSession(sessionId = this.state.activeSessionId): Promise<DaemonResult> {\n if (!sessionId) {\n return fail(new AppError('SESSION_NOT_FOUND', 'no active managed session', { sessionId: 'default' }));\n }\n const session = this.state.sessions?.[sessionId];\n if (!session) {\n return fail(new AppError('SESSION_NOT_FOUND', `unknown session: ${sessionId}`, { sessionId }));\n }\n if (await this.tmux.hasSession(session.sessionName)) {\n await this.tmux.killSession(session.sessionName);\n }\n const sessions = { ...this.state.sessions };\n delete sessions[sessionId];\n const wasActive = this.state.activeSessionId === sessionId;\n const activeSessionId = wasActive\n ? Object.keys(sessions)[0]\n : this.state.activeSessionId;\n this.state = {\n ...this.state,\n sessions,\n activeSessionId,\n updatedAt: Date.now(),\n };\n if (wasActive) {\n this.screen = undefined;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n }\n await this.store.saveState(this.state);\n return { ok: true };\n }\n\n private async resetOwner(): Promise<DaemonResult> {\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n this.state = {\n ...this.state,\n ownerOpenId: undefined,\n boundChatId: undefined,\n autoBindDisabled: true,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n return { ok: true };\n }\n\n private async rotateBindCode(): Promise<DaemonResult> {\n if (Object.keys(this.state.sessions ?? {}).length === 0) return { ok: false, error: 'no managed coding-agent session is running' };\n const bindCode = createBindCode();\n this.state = {\n ...this.state,\n boundChatId: undefined,\n autoBindDisabled: true,\n bindCodeHash: hashBindCode(bindCode),\n bindCodeExpiresAt: Date.now() + 10 * 60_000,\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state);\n return { ok: true, value: { bindCode, expiresInSeconds: 600 } };\n }\n\n private schedulePoll(): void {\n if (this.closing) return;\n this.timer = setTimeout(() => {\n void this.runScheduledPoll();\n }, this.config.pollIntervalMs);\n }\n\n private async runScheduledPoll(): Promise<void> {\n const operation = this.poll().catch(async (error) => {\n if (!this.closing) await this.log(`poll failed: ${errorMessage(error)}`);\n });\n this.pollInFlight = operation;\n try {\n await operation;\n } finally {\n if (this.pollInFlight === operation) this.pollInFlight = undefined;\n if (!this.closing) this.schedulePoll();\n }\n }\n\n private async poll(): Promise<void> {\n const session = this.activeSession();\n const paneId = session?.paneId;\n if (!paneId) {\n await this.reconcileSessions();\n return;\n }\n const pane = await this.tmux.inspect(paneId);\n const adapter = getAgentAdapter(session.agent);\n if (!pane || pane.dead) {\n this.updateScreen(adapter.detectScreen('', false));\n await this.notifyTransition();\n await this.maybeNotifyUnresolved();\n await this.maybeNotifyCompletion();\n await this.reconcileSessions();\n return;\n }\n const raw = await this.tmux.capture(paneId, 160);\n this.updateScreen(adapter.detectScreen(raw, true, { x: pane.cursorX, y: pane.cursorY }));\n await this.notifyTransition();\n await this.maybeNotifyUnresolved();\n await this.maybeNotifyCompletion();\n await this.flushPending();\n await this.reconcileSessions();\n }\n\n private async notifyTransition(): Promise<void> {\n const current = this.screen;\n const previous = this.previousScreen;\n this.previousScreen = current;\n const session = this.activeSession();\n if (!current || !session || !this.gateway) return;\n const agentName = getAgentAdapter(session.agent).displayName;\n if (previous?.state === current.state && previous.fingerprint === current.fingerprint\n && selectionSnapshot(previous) === selectionSnapshot(current)) return;\n if (this.interactionNotificationsSuppressed > 0 && current.interaction) return;\n try {\n if (!this.state.boundChatId) return;\n if (current.interaction?.semantics && current.interaction.actionConfidence && current.interaction.actionConfidence >= 0.85\n && current.actions.length > 0 && current.confidence >= 0.85) {\n await this.gateway.sendChoice(this.state.boundChatId, session.paneId, current, session.agent);\n } else if (current.state === 'failed' && previous?.state !== 'failed') {\n await this.gateway.sendText(this.state.boundChatId, `${agentName} 检测到失败状态,请用 /tail 查看。`);\n } else if (current.state === 'exited' && previous?.state !== 'exited') {\n await this.gateway.sendText(this.state.boundChatId, `${agentName}/tmux pane 已退出。`);\n }\n } catch (error) {\n await this.log(`notification failed: ${errorMessage(error)}`);\n }\n }\n\n private async maybeNotifyUnresolved(): Promise<void> {\n const screen = this.screen;\n const session = this.activeSession();\n if (this.interactionNotificationsSuppressed > 0 || !screen || !session || !this.gateway || !this.state.boundChatId\n || (screen.state !== 'input' && screen.state !== 'unknown') || safeStructuredInteraction(screen)) {\n this.unresolvedCandidate = undefined;\n return;\n }\n const key = `${session.id}:${session.paneId}:${screen.fingerprint}`;\n if (this.unresolvedCandidate?.key !== key) {\n this.unresolvedCandidate = { key, since: Date.now() };\n return;\n }\n if (Date.now() - this.unresolvedCandidate.since < 3_000 || this.unresolvedNotified.has(key)) return;\n remember(this.unresolvedNotified, key, 256);\n try {\n await this.gateway.sendManual(\n this.state.boundChatId,\n this.manualView(session, screen, 'active', '当前终端交互无法安全识别,已自动进入手动遥控兜底。'),\n );\n } catch (error) {\n await this.log(`manual fallback card failed: ${errorMessage(error)}`);\n await this.gateway.sendText(\n this.state.boundChatId,\n '当前终端交互无法安全识别,且手动遥控卡发送失败。可使用 /tail 120、/key、/type 或 /submit 处理。',\n ).catch((sendError) => this.log(`manual fallback text failed: ${errorMessage(sendError)}`));\n }\n }\n\n private async handleTurnComplete(candidate: TurnCompleteCandidate): Promise<DaemonResult> {\n if (!validTurnCompleteCandidate(candidate)) return { ok: false, error: 'invalid turn-complete candidate' };\n const eventKey = `${candidate.agentSessionId}:${candidate.eventId}`;\n if (this.completedEvents.has(eventKey)) return { ok: true };\n remember(this.completedEvents, eventKey, 256);\n if (candidate.sessionId !== this.state.activeSessionId) return { ok: true };\n if (!this.activeSession() || !this.state.boundChatId || !this.gateway) return { ok: true };\n this.pendingCompletion = candidate;\n this.pendingCompletionAt = Date.now();\n return { ok: true };\n }\n\n private updateScreen(next: ScreenDetection): void {\n if (this.screen?.fingerprint !== next.fingerprint || this.screen.state !== next.state) {\n this.outputStableSince = Date.now();\n }\n this.screen = next;\n }\n\n private async maybeNotifyCompletion(): Promise<void> {\n const candidate = this.pendingCompletion;\n const session = this.activeSession();\n if (!candidate || !session || !this.state.boundChatId || !this.gateway) return;\n if (this.screen?.state === 'approval' || this.screen?.state === 'input'\n || this.screen?.state === 'failed' || this.screen?.state === 'exited') {\n this.clearPendingCompletion();\n return;\n }\n if (this.screen?.state !== 'idle') return;\n const quietSince = Math.max(this.pendingCompletionAt, this.outputStableSince);\n if (Date.now() - quietSince < this.completionQuietMs) return;\n\n // Clear before sending so a slow Lark request cannot duplicate the notification.\n this.clearPendingCompletion();\n const adapter = getAgentAdapter(session.agent);\n const output = candidate.lastAssistantMessage.trim();\n if (!output) return;\n await this.gateway.sendMarkdown(\n this.state.boundChatId,\n `**${adapter.displayName} 等待用户输入**\\n\\n${output}`,\n );\n }\n\n private clearPendingCompletion(): void {\n this.pendingCompletion = undefined;\n this.pendingCompletionAt = 0;\n }\n\n private async flushPending(): Promise<void> {\n const session = this.activeSession();\n if (!session || this.shouldQueueMessage()) return;\n while (this.pendingMessages.length > 0 && !this.shouldQueueMessage()) {\n const message = this.pendingMessages[0];\n if (!message) {\n this.pendingMessages.shift();\n continue;\n }\n this.clearPendingCompletion();\n await this.tmux.sendText(session.paneId, message);\n this.pendingMessages.shift();\n }\n if (this.pendingMessages.length === 0 && this.state.boundChatId) {\n // Intentionally no per-message acknowledgement; transition notifications remain concise.\n }\n }\n\n private activeSession(): ManagedSession | undefined {\n return this.state.activeSessionId ? this.state.sessions?.[this.state.activeSessionId] : undefined;\n }\n\n private async reconcileSessions(): Promise<ManagedSession[]> {\n const sessions = Object.values(this.state.sessions ?? {});\n const inspections = await Promise.all(sessions.map(async (session) => ({\n session,\n pane: await this.tmux.inspect(session.paneId),\n })));\n const liveSessions = inspections\n .filter(({ pane }) => pane && !pane.dead)\n .map(({ session }) => session);\n const liveById = Object.fromEntries(liveSessions.map((session) => [session.id, session]));\n const activeSessionId = this.state.activeSessionId && liveById[this.state.activeSessionId]\n ? this.state.activeSessionId\n : liveSessions[0]?.id;\n const sessionsChanged = liveSessions.length !== sessions.length;\n const activeChanged = activeSessionId !== this.state.activeSessionId;\n if (!sessionsChanged && !activeChanged) return liveSessions;\n const removedActive = this.state.activeSessionId\n ? this.state.sessions?.[this.state.activeSessionId]\n : undefined;\n if (activeChanged && removedActive && !liveById[removedActive.id]\n && this.previousScreen?.state !== 'exited' && this.state.boundChatId) {\n await this.gateway?.sendText(\n this.state.boundChatId,\n `${getAgentAdapter(removedActive.agent).displayName}/tmux pane 已退出。`,\n ).catch((error) => this.log(`exit notification failed: ${errorMessage(error)}`));\n }\n this.state = {\n ...this.state,\n sessions: liveById,\n activeSessionId,\n updatedAt: Date.now(),\n };\n if (activeChanged) {\n this.screen = undefined;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n }\n await this.store.saveState(this.state);\n return liveSessions;\n }\n\n private async useSession(sessionId: string): Promise<DaemonResult> {\n const session = this.state.sessions?.[sessionId];\n if (!session || !await this.tmux.inspect(session.paneId)) return { ok: false, error: `unknown or stopped session: ${sessionId}` };\n this.state = { ...this.state, activeSessionId: sessionId, updatedAt: Date.now() };\n this.screen = undefined;\n this.previousScreen = undefined;\n this.completedEvents.clear();\n this.clearPendingCompletion();\n this.pendingMessages.length = 0;\n this.pendingInteractionInput = undefined;\n this.unresolvedCandidate = undefined;\n this.unresolvedNotified.clear();\n await this.store.saveState(this.state);\n await this.poll();\n return { ok: true, value: session };\n }\n\n private async log(message: string): Promise<void> {\n await appendFile(this.paths.logFile, `${new Date().toISOString()} ${message}\\n`, { mode: 0o600 });\n }\n}\n\nfunction fail(error: unknown): DaemonResult {\n return { ok: false, ...serializeAppError(error) };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'EEXIST';\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 validSessionId(value: string): boolean {\n return /^[a-zA-Z0-9_-]{1,40}$/.test(value);\n}\n\nfunction remember(values: Set<string>, value: string, limit: number): void {\n values.add(value);\n while (values.size > limit) {\n const oldest = values.values().next().value as string | undefined;\n if (oldest === undefined) break;\n values.delete(oldest);\n }\n}\n\nfunction escapeFence(value: string): string {\n return value.replace(/```/g, '``\\\\`');\n}\n\nfunction selectionSnapshot(screen: ScreenDetection): string {\n return screen.actions.map(({ id, marker, inputValue }) => `${id}:${marker ?? ''}:${inputValue ?? ''}`).join('|');\n}\n\nfunction formChecked(value: unknown): boolean {\n return value === true || value === 1 || value === 'true' || value === '1' || value === 'on' || value === 'checked';\n}\n\nfunction safeStructuredInteraction(screen: ScreenDetection): boolean {\n return Boolean(\n screen.interaction?.semantics\n && screen.interaction.actionConfidence\n && screen.interaction.actionConfidence >= 0.85\n && screen.actions.length > 0\n && screen.confidence >= 0.85,\n );\n}\n\nfunction manualTmuxKey(value: string): string {\n const keys: Record<string, string> = {\n up: 'Up',\n down: 'Down',\n left: 'Left',\n right: 'Right',\n enter: 'Enter',\n esc: 'Escape',\n tab: 'Tab',\n space: 'Space',\n backspace: 'BSpace',\n 'ctrl-c': 'C-c',\n };\n const key = keys[value.toLowerCase()];\n if (!key) throw new Error(`不支持的手动按键:${value}`);\n return key;\n}\n\nfunction manualTimestamp(): string {\n return new Intl.DateTimeFormat('zh-CN', {\n timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false,\n }).format(new Date());\n}\n","import { execFile, spawn } from 'node:child_process';\n\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n}\n\nexport function runFile(\n file: string,\n args: readonly string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n execFile(\n file,\n [...args],\n {\n cwd: options.cwd,\n timeout: options.timeoutMs ?? 10_000,\n encoding: 'utf8',\n maxBuffer: 4 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n}\n\nexport function runFileWithInput(\n file: string,\n args: readonly string[],\n input: string,\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => (stdout += chunk));\n child.stderr.on('data', (chunk: string) => (stderr += chunk));\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr });\n else reject(new Error(`${file} exited with ${code ?? signal}: ${stderr.trim()}`));\n });\n child.stdin.end(input, 'utf8');\n });\n}\n","// 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 { randomBytes, scryptSync, timingSafeEqual } from 'node:crypto';\nimport { chmod, mkdir } from 'node:fs/promises';\nimport type { AppConfig, AppSecrets, SessionState } from './model.js';\nimport { emptyState } from './model.js';\nimport type { AppPaths } from './paths.js';\nimport { readJson, writeJsonAtomic } from './atomic-json.js';\n\nexport class AppStore {\n constructor(readonly paths: AppPaths) {}\n\n async ensure(): Promise<void> {\n await mkdir(this.paths.root, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.logsDir, { recursive: true, mode: 0o700 });\n await Promise.all([\n chmod(this.paths.root, 0o700),\n chmod(this.paths.runtimeDir, 0o700),\n chmod(this.paths.logsDir, 0o700),\n ]);\n }\n\n loadConfig(): Promise<AppConfig | undefined> {\n return readJson<AppConfig>(this.paths.config);\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, config);\n }\n\n loadSecrets(): Promise<AppSecrets | undefined> {\n return readJson(this.paths.secrets);\n }\n\n saveSecrets(secrets: AppSecrets): Promise<void> {\n return writeJsonAtomic(this.paths.secrets, secrets);\n }\n\n async loadState(): Promise<SessionState> {\n return (await readJson<SessionState>(this.paths.state)) ?? emptyState();\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\nexport function createBindCode(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function hashBindCode(code: string): string {\n const salt = randomBytes(16);\n const digest = scryptSync(code, salt, 32);\n return `${salt.toString('base64url')}.${digest.toString('base64url')}`;\n}\n\nexport function verifyBindCode(code: string, encoded: string): boolean {\n const [saltText, digestText] = encoded.split('.');\n if (!saltText || !digestText) return false;\n const expected = Buffer.from(digestText, 'base64url');\n const actual = scryptSync(code, Buffer.from(saltText, 'base64url'), expected.length);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n","import type { AgentId } from '../agents/types.js';\n\nexport type Tenant = 'feishu' | 'lark';\n\nexport interface AppConfig {\n tenant: Tenant;\n appId: string;\n tmuxBinary: string;\n agentBinaries: Record<AgentId, string>;\n pollIntervalMs: number;\n}\n\nexport interface AppSecrets {\n appSecret: string;\n callbackSecret: string;\n}\n\nexport interface ManagedSession {\n id: string;\n agent: AgentId;\n sessionName: string;\n paneId: string;\n cwd: string;\n agentVersion: string;\n updatedAt: number;\n}\n\nexport interface SessionState {\n schemaVersion: 2;\n ownerOpenId?: string;\n boundChatId?: string;\n autoBindDisabled?: boolean;\n activeSessionId?: string;\n sessions?: Record<string, ManagedSession>;\n bindCodeHash?: string;\n bindCodeExpiresAt?: number;\n updatedAt: number;\n}\n\nexport function emptyState(now = Date.now()): SessionState {\n return { schemaVersion: 2, sessions: {}, updatedAt: now };\n}\n","import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nexport async function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown, mode = 0o600): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await chmod(parent, 0o700).catch(() => undefined);\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;\n const file = await open(temporary, 'w', mode);\n try {\n await file.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await file.sync();\n } finally {\n await file.close();\n }\n await rename(temporary, path);\n await chmod(path, mode);\n}\n","export const APP_ERROR_CODES = [\n 'SESSION_EXISTS',\n 'SESSION_NOT_FOUND',\n 'INVALID_SESSION_NAME',\n 'NOT_INITIALIZED',\n 'INVALID_CWD',\n 'BINARY_NOT_FOUND',\n 'INVALID_OPTIONS',\n 'DAEMON_UNAVAILABLE',\n 'REQUEST_TIMEOUT',\n 'UNKNOWN',\n] as const;\n\nexport type AppErrorCode = typeof APP_ERROR_CODES[number];\n\nexport type ErrorContext = Record<string, string | number | boolean | undefined>;\n\nexport class AppError extends Error {\n readonly code: AppErrorCode;\n readonly context: ErrorContext;\n\n constructor(\n code: AppErrorCode,\n message: string,\n context: ErrorContext = {},\n options: { cause?: unknown } = {},\n ) {\n super(message, options);\n this.name = 'AppError';\n this.code = code;\n this.context = context;\n }\n}\n\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n\nexport function isAppErrorCode(value: unknown): value is AppErrorCode {\n return typeof value === 'string' && APP_ERROR_CODES.includes(value as AppErrorCode);\n}\n\nexport function asAppError(\n error: unknown,\n code: AppErrorCode = 'UNKNOWN',\n context: ErrorContext = {},\n): AppError {\n if (isAppError(error)) {\n if (Object.keys(context).length === 0) return error;\n return new AppError(error.code, error.message, { ...context, ...error.context }, { cause: error });\n }\n return new AppError(code, errorMessage(error), context, { cause: error });\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function serializeAppError(error: unknown): {\n error: string;\n errorCode?: AppErrorCode;\n errorContext?: ErrorContext;\n} {\n if (!isAppError(error)) return { error: errorMessage(error) };\n const errorContext = Object.fromEntries(\n Object.entries(error.context).filter(([, value]) => value !== undefined),\n );\n return {\n error: error.message,\n errorCode: error.code,\n ...(Object.keys(errorContext).length > 0 ? { errorContext } : {}),\n };\n}\n\nexport function systemErrorCode(error: unknown): string | undefined {\n return error instanceof Error && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined;\n}\n","import { randomBytes } from 'node:crypto';\nimport { runFile, runFileWithInput } from '../platform/process.js';\nimport { assertSafeTmuxTarget, sanitizeRemoteInput, shellQuote } from './input.js';\nimport type { TmuxCreateOptions, TmuxPane } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nconst PANE_FORMAT = '#{session_name}\\t#{pane_id}\\t#{pane_pid}\\t#{pane_current_command}\\t#{pane_current_path}\\t#{pane_dead}\\t#{cursor_x}\\t#{cursor_y}';\n\nexport class TmuxController {\n private writes: Promise<void> = Promise.resolve();\n\n constructor(readonly binary = 'tmux') {}\n\n async version(): Promise<string> {\n return (await runFile(this.binary, ['-V'])).stdout.trim();\n }\n\n async create(options: TmuxCreateOptions): Promise<TmuxPane> {\n if (!/^[a-zA-Z0-9_-]{1,64}$/.test(options.sessionName)) {\n throw new AppError(\n 'INVALID_SESSION_NAME',\n 'tmux session name must contain only letters, digits, underscore, or dash',\n { sessionId: options.sessionName },\n );\n }\n if (await this.hasSession(options.sessionName)) {\n throw new AppError(\n 'SESSION_EXISTS',\n `tmux session already exists: ${options.sessionName}`,\n { sessionId: displaySessionId(options.sessionName) },\n );\n }\n const environment = Object.entries(options.env ?? {}).map(([key, value]) => {\n if (!/^[A-Z][A-Z0-9_]*$/.test(key)) throw new Error(`unsafe tmux environment key: ${key}`);\n return `${key}=${value}`;\n });\n const command = [\n ...(environment.length > 0 ? ['/usr/bin/env', ...environment] : []),\n options.binary,\n ...(options.args ?? []),\n ].map(shellQuote).join(' ');\n await runFile(this.binary, [\n 'new-session', '-d', '-s', options.sessionName, '-c', options.cwd,\n '-x', '120', '-y', '40', command,\n ]);\n const pane = await this.findBySession(options.sessionName);\n if (!pane) throw new Error('tmux created a session without a discoverable pane');\n return pane;\n }\n\n async hasSession(sessionName: string): Promise<boolean> {\n try {\n await runFile(this.binary, ['has-session', '-t', `=${sessionName}`]);\n return true;\n } catch {\n return false;\n }\n }\n\n async findBySession(sessionName: string): Promise<TmuxPane | undefined> {\n const { stdout } = await runFile(this.binary, [\n 'list-panes', '-t', `=${sessionName}`, '-F', PANE_FORMAT,\n ]);\n return stdout.split('\\n').map(parsePane).find(Boolean);\n }\n\n async inspect(paneId: string): Promise<TmuxPane | undefined> {\n assertSafeTmuxTarget(paneId);\n try {\n const { stdout } = await runFile(this.binary, [\n 'display-message', '-p', '-t', paneId, PANE_FORMAT,\n ]);\n return parsePane(stdout.trim());\n } catch {\n return undefined;\n }\n }\n\n async capture(paneId: string, lines = 200): Promise<string> {\n assertSafeTmuxTarget(paneId);\n const { stdout } = await runFile(this.binary, [\n 'capture-pane', '-p', '-J', '-e', '-t', paneId, '-S', `-${Math.max(1, lines)}`,\n ]);\n return stdout;\n }\n\n sendText(paneId: string, input: string, submit = true): Promise<void> {\n assertSafeTmuxTarget(paneId);\n const text = sanitizeRemoteInput(input);\n if (!text.trim()) return Promise.reject(new Error('message is empty after sanitization'));\n const operation = async (): Promise<void> => {\n const bufferName = `lca-${process.pid}-${randomBytes(6).toString('hex')}`;\n await runFileWithInput(this.binary, ['load-buffer', '-b', bufferName, '-'], text);\n try {\n await runFile(this.binary, ['paste-buffer', '-b', bufferName, '-d', '-t', paneId]);\n } finally {\n await runFile(this.binary, ['delete-buffer', '-b', bufferName]).catch(() => undefined);\n }\n if (submit) await runFile(this.binary, ['send-keys', '-t', paneId, 'Enter']);\n };\n this.writes = this.writes.then(operation, operation);\n return this.writes;\n }\n\n async sendKey(paneId: string, key: string): Promise<void> {\n assertSafeTmuxTarget(paneId);\n if (!/^(Enter|Escape|Space|Tab|BSpace|Up|Down|Left|Right|C-c|C-u|C-k|C-Enter|[yandpcq1-9])$/.test(key)) {\n throw new Error(`unsupported tmux key: ${key}`);\n }\n await runFile(this.binary, ['send-keys', '-t', paneId, key]);\n }\n\n async killSession(sessionName: string): Promise<void> {\n await runFile(this.binary, ['kill-session', '-t', `=${sessionName}`]);\n }\n}\n\nfunction displaySessionId(sessionName: string): string {\n return sessionName.replace(/^lark-coding-assistant-/, '');\n}\n\nfunction parsePane(line: string): TmuxPane | undefined {\n const [sessionName, paneId, pidText, currentCommand, cwd, deadText, cursorXText, cursorYText] = line.trim().split('\\t');\n const pid = Number(pidText);\n const cursorX = Number(cursorXText);\n const cursorY = Number(cursorYText);\n if (!sessionName || !paneId || !Number.isInteger(pid) || !currentCommand || !cwd\n || !Number.isInteger(cursorX) || !Number.isInteger(cursorY)) return undefined;\n return { sessionName, paneId, pid, currentCommand, cwd, dead: deadText === '1', cursorX, cursorY };\n}\n","const ANSI = /\\u001b(?:\\][^\\u0007]*(?:\\u0007|\\u001b\\\\)|\\[[0-?]*[ -/]*[@-~]|[@-_])/g;\nconst FORBIDDEN_CONTROL = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/g;\n\nexport function sanitizeRemoteInput(input: string): string {\n return input.replace(ANSI, '').replace(/\\r\\n?/g, '\\n').replace(FORBIDDEN_CONTROL, '');\n}\n\nexport function assertSafeTmuxTarget(target: string): void {\n if (!/^%\\d+$/.test(target)) throw new Error(`unsafe tmux pane target: ${target}`);\n}\n\nexport function shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\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","import type { TerminalDialect } from './interaction-types.js';\n\nconst commonHeaders = [\n /^\\s*(?:Would you like to|Do you want to|Approval required|Allow command|.*requires approval)/i,\n];\nconst commonFooters = [\n /(?:press\\s+)?enter\\s+to\\s+(?:confirm|submit(?:\\s+answer)?|select|choose|continue)/i,\n /esc\\s+to\\s+cancel.*(?:tab\\s+to\\s+amend|ctrl\\+e\\s+to\\s+explain)/i,\n];\n\nexport const CODEX_DIALECT: TerminalDialect = {\n id: 'codex',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n footerPatterns: commonFooters,\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type something|none of the above|add notes)$/i],\n chatControls: [/^chat about this$/i],\n};\n\nexport const TRAE_DIALECT: TerminalDialect = {\n ...CODEX_DIALECT,\n id: 'trae-cli',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n customInputControls: [/^(?:other|none of the above|add notes)$/i],\n};\n\nexport const CLAUDE_DIALECT: TerminalDialect = {\n id: 'claude-code',\n headerPatterns: [\n ...commonHeaders,\n /^\\s*(?:←\\s*)?[☐☑☒]\\s+.+?(?:\\s+✔\\s+Submit\\s*→)?\\s*$/i,\n /^\\s*[☐☑☒]\\s+\\S/,\n ],\n footerPatterns: commonFooters,\n footerlessChoiceHeaders: [/^ready to submit your answers\\?$/i],\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type(?:\\s+.+)?|add notes)\\.?$/i, /^notes:\\s*press\\s+n\\s+to\\s+add\\b/i],\n directInputControls: [/^type(?:\\s+.+)?\\.?$/i],\n customInputValuePattern: /^type\\s+(.+?)\\.?$/i,\n chatControls: [/^chat about this$/i],\n};\n","import type { AgentResume, ResumeOptions } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nexport function resolveResumeOption(options: ResumeOptions): AgentResume | undefined {\n const modes = [options.resume !== undefined, options.resumeLast, options.resumeAll].filter(Boolean).length;\n if (modes > 1) {\n throw new AppError(\n 'INVALID_OPTIONS',\n '--resume, --resume-last, and --resume-all cannot be used together',\n { reason: '--resume、--resume-last 和 --resume-all 不能同时使用' },\n );\n }\n if (options.resumeLast) return { mode: 'last' };\n if (options.resumeAll) return { mode: 'picker', all: true };\n if (typeof options.resume === 'string') return { mode: 'session', sessionId: options.resume };\n if (options.resume) return { mode: 'picker' };\n return undefined;\n}\n\nexport function resumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['resume', '--last'];\n if (resume.mode === 'session') return ['resume', resume.sessionId];\n return resume.all ? ['resume', '--all'] : ['resume'];\n}\n\nexport function claudeResumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['--continue'];\n if (resume.mode === 'session') return ['--resume', resume.sessionId];\n return ['--resume'];\n}\n","export function codexStyleStopHookArgs(command: string): string[] {\n const hook = `{hooks=[{type=\"command\",command=${JSON.stringify(command)},timeout=5}]}`;\n return ['--dangerously-bypass-hook-trust', '-c', `hooks.Stop=[${hook}]`];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n Stop: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n },\n })];\n}\n","import { detectCodexScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const codexAdapter: AgentAdapter = {\n id: 'codex',\n displayName: 'Codex',\n groupOrder: 10,\n binary: (config) => config.agentBinaries.codex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectCodexScreen,\n};\n","import { detectTraeScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const traeCliAdapter: AgentAdapter = {\n id: 'trae-cli',\n displayName: 'Trae CLI',\n groupOrder: 20,\n binary: (config) => config.agentBinaries['trae-cli'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectTraeScreen,\n};\n","import { detectClaudeScreen } from '../screen/detector.js';\nimport { claudeResumeArgs } from './resume.js';\nimport { claudeStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: 'claude-code',\n displayName: 'Claude Code',\n groupOrder: 30,\n binary: (config) => config.agentBinaries['claude-code'],\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'trae-cli', 'claude-code'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\n\nexport type AgentResume =\n | { mode: 'picker'; all?: boolean }\n | { mode: 'last' }\n | { mode: 'session'; sessionId: string };\n\nexport interface ResumeOptions {\n resume?: boolean | string;\n resumeLast?: boolean;\n resumeAll?: boolean;\n}\n\nexport interface TurnCompleteCandidate {\n sessionId: string;\n eventId: string;\n agentSessionId: string;\n cwd: string;\n lastAssistantMessage: string;\n}\n\nexport interface LaunchInput {\n resume?: AgentResume;\n stopHookCommand: string;\n}\n\nexport interface AgentAdapter {\n id: AgentId;\n displayName: string;\n groupOrder: number;\n binary(config: AppConfig): string;\n versionArgs: readonly string[];\n buildLaunchArgs(input: LaunchInput): string[];\n detectScreen(raw: string, paneAlive: boolean, cursor?: { x: number; y: number }): ScreenDetection;\n}\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { AGENT_IDS, type AgentAdapter, type AgentId } from './types.js';\n\nconst adapters = new Map<AgentId, AgentAdapter>([\n [codexAdapter.id, codexAdapter],\n [traeCliAdapter.id, traeCliAdapter],\n [claudeCodeAdapter.id, claudeCodeAdapter],\n]);\n\nexport function getAgentAdapter(id: AgentId): AgentAdapter {\n const adapter = adapters.get(id);\n if (!adapter) throw new Error(`unsupported coding agent: ${id}`);\n return adapter;\n}\n\nexport function listAgentAdapters(): AgentAdapter[] {\n return [...adapters.values()].sort((left, right) => left.groupOrder - right.groupOrder);\n}\n\nexport function isAgentId(value: string): value is AgentId {\n return (AGENT_IDS as readonly string[]).includes(value);\n}\n","import type { TurnCompleteCandidate } from './types.js';\n\nexport function normalizeStopEvent(\n bridgeSessionId: string,\n value: unknown,\n): TurnCompleteCandidate | undefined {\n if (!bridgeSessionId || !value || typeof value !== 'object') return undefined;\n const event = value as Record<string, unknown>;\n if (event.hook_event_name !== 'Stop') return undefined;\n const eventId = stringField(event, 'turn_id') ?? stringField(event, 'prompt_id');\n const agentSessionId = stringField(event, 'session_id');\n const cwd = stringField(event, 'cwd');\n const lastAssistantMessage = stringField(event, 'last_assistant_message')?.trim();\n if (!eventId || !agentSessionId || !cwd || !lastAssistantMessage) return undefined;\n return { sessionId: bridgeSessionId, eventId, agentSessionId, cwd, lastAssistantMessage };\n}\n\nexport function validTurnCompleteCandidate(value: unknown): value is TurnCompleteCandidate {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return ['sessionId', 'eventId', 'agentSessionId', 'cwd', 'lastAssistantMessage']\n .every((key) => typeof candidate[key] === 'string' && (candidate[key] as string).length > 0);\n}\n\nfunction stringField(value: Record<string, unknown>, key: string): string | undefined {\n const field = value[key];\n return typeof field === 'string' && field.length > 0 ? field : undefined;\n}\n","import {\n createLarkChannel,\n type CardActionEvent,\n type LarkChannel,\n type NormalizedMessage,\n} from '@larksuite/channel';\nimport type { AppConfig, AppSecrets, ManagedSession } from '../core/model.js';\nimport type { RuntimeStatus } from '../daemon/protocol.js';\nimport type { ScreenDetection } from '../screen/detector.js';\nimport type { AgentId } from '../agents/types.js';\nimport { ActionSigner, type SignedAction } from './action-signing.js';\nimport {\n CHOICE_FORM_SUBMIT_ACTION,\n choiceCard,\n choiceFormSubmitName,\n handledActionCard,\n interactionInputCard,\n manualControlCard,\n MANUAL_SUBMIT_ACTION,\n MANUAL_TYPE_ACTION,\n type ManualControlView,\n sessionPickerCard,\n statusCard,\n stopCard,\n} from './cards.js';\n\nexport interface LarkGatewayHandler {\n onMessage(message: NormalizedMessage): Promise<void>;\n onAction(event: CardActionEvent, action: SignedAction): Promise<LarkActionResult>;\n}\n\nexport type LarkActionResult =\n | { type: 'error'; content: string }\n | { type: 'success'; content: string }\n | { type: 'awaiting-input'; content: string; agent: AgentId; label: string }\n | { type: 'refresh'; content: string; screen: ScreenDetection; paneId: string; agent: AgentId }\n | { type: 'manual'; content: string; view: ManualControlView };\n\nexport interface RemoteGateway {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n sendText(chatId: string, text: string): Promise<unknown>;\n sendMarkdown(chatId: string, markdown: string): Promise<unknown>;\n sendChoice(chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown>;\n updateChoice(messageId: string, chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown>;\n completeChoiceInput(messageId: string, action: SignedAction, content: string): Promise<unknown>;\n sendManual(chatId: string, view: ManualControlView): Promise<unknown>;\n sendStatus(chatId: string, status: RuntimeStatus): Promise<unknown>;\n sendSessionPicker(chatId: string, sessions: ManagedSession[], activeSessionId?: string): Promise<unknown>;\n sendStopConfirmation(chatId: string, paneId: string, fingerprint: string, agent: AgentId): Promise<unknown>;\n}\n\nexport type GatewayFactory = (config: AppConfig, secrets: AppSecrets, handler: LarkGatewayHandler) => RemoteGateway;\n\nexport class LarkGateway implements RemoteGateway {\n private readonly channel: LarkChannel;\n private readonly signer: ActionSigner;\n private readonly formActions = new Map<string, Map<string, SignedAction>>();\n private readonly formActionsInFlight = new Set<string>();\n\n constructor(config: AppConfig, secrets: AppSecrets, private readonly handler: LarkGatewayHandler) {\n this.signer = new ActionSigner(secrets.callbackSecret);\n this.channel = createLarkChannel({\n appId: config.appId,\n appSecret: secrets.appSecret,\n domain: config.tenant === 'lark' ? 'https://open.larksuite.com' : 'https://open.feishu.cn',\n source: 'lark-coding-assistant',\n policy: { dmMode: 'open', requireMention: false, respondToMentionAll: false },\n safety: { chatQueue: { enabled: true, mergeWhileBusy: false } },\n handshakeTimeoutMs: 8_000,\n httpTimeoutMs: 30_000,\n respectProxyEnv: true,\n });\n this.channel.on('message', async (message) => this.handler.onMessage(message));\n this.channel.on('cardAction', async (event) => {\n const mappedFormAction = event.action.formValue && event.action.name\n ? this.formActions.get(event.messageId)?.get(event.action.name)\n : undefined;\n const action = this.signer.verify(event.action.value, event.chatId)\n ?? (mappedFormAction ? this.signer.verify(mappedFormAction, event.chatId) : undefined);\n if (!action) return { toast: { type: 'error', content: '操作已失效,请等待新卡片。' } };\n if (event.action.formValue || action.kind === 'manual') {\n if (this.formActionsInFlight.has(event.messageId)) {\n return { toast: { type: 'warning', content: action.kind === 'manual' ? '终端操作正在执行,请稍候。' : '答案正在提交,请稍候。' } };\n }\n this.formActionsInFlight.add(event.messageId);\n void this.handleDeferredCardAction(event, action).finally(() => {\n this.formActionsInFlight.delete(event.messageId);\n });\n return { toast: { type: 'success', content: action.kind === 'manual' ? '正在操作本地终端…' : '正在提交到本地终端…' } };\n }\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') return { toast: result };\n if (result.type === 'manual') {\n this.rememberManualFormActions(event.messageId, event.chatId, result.view);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: manualControlCard(event.chatId, result.view, this.signer) },\n };\n }\n if (result.type === 'refresh') {\n this.rememberFormActions(event.messageId, event.chatId, result.paneId, result.screen, result.agent);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: choiceCard(event.chatId, result.paneId, result.screen, this.signer, result.agent) },\n };\n }\n if (result.type === 'awaiting-input') {\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: interactionInputCard(result.agent, result.label) },\n };\n }\n return {\n toast: result,\n card: { type: 'raw', data: handledActionCard(action, result.content) },\n };\n });\n }\n\n private async handleDeferredCardAction(event: CardActionEvent, action: SignedAction): Promise<void> {\n try {\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') {\n await this.channel.send(event.chatId, { text: `卡片操作未完成:${result.content}` });\n return;\n }\n if (result.type === 'refresh') {\n await this.updateCardAfterAction(\n event.messageId,\n choiceCard(event.chatId, result.paneId, result.screen, this.signer, result.agent),\n );\n this.rememberFormActions(event.messageId, event.chatId, result.paneId, result.screen, result.agent);\n return;\n }\n if (result.type === 'manual') {\n await this.updateCardAfterAction(event.messageId, manualControlCard(event.chatId, result.view, this.signer));\n this.rememberManualFormActions(event.messageId, event.chatId, result.view);\n return;\n }\n if (result.type === 'awaiting-input') {\n await this.updateCardAfterAction(event.messageId, interactionInputCard(result.agent, result.label));\n return;\n }\n await this.updateCardAfterAction(event.messageId, handledActionCard(action, result.content));\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n await this.channel.send(event.chatId, { text: `卡片操作同步失败:${detail}` }).catch(() => undefined);\n }\n }\n\n private async updateCardAfterAction(messageId: string, card: object): Promise<void> {\n const retryDelays = [0, 300, 800, 1_600];\n let lastError: unknown;\n for (const delay of retryDelays) {\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));\n try {\n await this.channel.updateCard(messageId, card);\n return;\n } catch (error) {\n lastError = error;\n if (!cardActionLocked(error)) throw error;\n }\n }\n throw lastError;\n }\n\n connect(): Promise<void> {\n return this.channel.connect();\n }\n\n disconnect(): Promise<void> {\n return this.channel.disconnect();\n }\n\n sendText(chatId: string, text: string): Promise<unknown> {\n return this.channel.send(chatId, { text });\n }\n\n sendMarkdown(chatId: string, markdown: string): Promise<unknown> {\n return this.channel.send(chatId, { markdown });\n }\n\n async sendChoice(chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown> {\n const result = await this.channel.send(chatId, { card: choiceCard(chatId, paneId, screen, this.signer, agent) });\n this.rememberFormActions(result.messageId, chatId, paneId, screen, agent);\n return result;\n }\n\n async updateChoice(messageId: string, chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<void> {\n await this.channel.updateCard(messageId, choiceCard(chatId, paneId, screen, this.signer, agent));\n this.rememberFormActions(messageId, chatId, paneId, screen, agent);\n }\n\n async completeChoiceInput(messageId: string, action: SignedAction, content: string): Promise<void> {\n await this.channel.updateCard(messageId, handledActionCard(action, content));\n this.formActions.delete(messageId);\n }\n\n async sendManual(chatId: string, view: ManualControlView): Promise<unknown> {\n const result = await this.channel.send(chatId, { card: manualControlCard(chatId, view, this.signer) });\n this.rememberManualFormActions(result.messageId, chatId, view);\n return result;\n }\n\n private rememberManualFormActions(messageId: string, chatId: string, view: ManualControlView): void {\n if (view.state === 'recovered' || view.state === 'exited') {\n this.formActions.delete(messageId);\n return;\n }\n const common = {\n kind: 'manual' as const,\n sessionId: view.session.id,\n manualMode: view.mode ?? 'fallback',\n agent: view.session.agent,\n paneId: view.session.paneId,\n fingerprint: view.screen.fingerprint,\n chatId,\n };\n this.formActions.set(messageId, new Map([\n [MANUAL_TYPE_ACTION, this.signer.sign({ ...common, action: MANUAL_TYPE_ACTION }, 10 * 60_000)],\n [MANUAL_SUBMIT_ACTION, this.signer.sign({ ...common, action: MANUAL_SUBMIT_ACTION }, 10 * 60_000)],\n ]));\n }\n\n private rememberFormActions(\n messageId: string,\n chatId: string,\n paneId: string,\n screen: ScreenDetection,\n agent: AgentId,\n ): void {\n if (screen.interaction?.semantics?.activation !== 'toggle') {\n this.formActions.delete(messageId);\n return;\n }\n const actions = new Map<string, SignedAction>();\n actions.set(choiceFormSubmitName(), this.signer.sign({\n kind: 'choice',\n interactionKind: screen.interaction?.kind,\n agent,\n action: CHOICE_FORM_SUBMIT_ACTION,\n paneId,\n fingerprint: screen.interaction?.revision ?? screen.fingerprint,\n chatId,\n }));\n this.formActions.set(messageId, actions);\n while (this.formActions.size > 256) {\n const oldest = this.formActions.keys().next().value;\n if (!oldest) break;\n this.formActions.delete(oldest);\n }\n }\n\n sendStatus(chatId: string, status: RuntimeStatus): Promise<unknown> {\n return this.channel.send(chatId, { card: statusCard(status) });\n }\n\n sendSessionPicker(chatId: string, sessions: ManagedSession[], activeSessionId?: string): Promise<unknown> {\n return this.channel.send(chatId, { card: sessionPickerCard(chatId, sessions, activeSessionId, this.signer) });\n }\n\n sendStopConfirmation(chatId: string, paneId: string, fingerprint: string, agent: AgentId): Promise<unknown> {\n return this.channel.send(chatId, { card: stopCard(chatId, paneId, fingerprint, this.signer, agent) });\n }\n}\n\nfunction cardActionLocked(error: unknown): boolean {\n if (typeof error === 'string') return /card action is lock/i.test(error);\n if (error instanceof Error && /card action is lock/i.test(error.message)) return true;\n if (!error || typeof error !== 'object') return false;\n const record = error as Record<string, unknown>;\n return ['message', 'msg', 'cause'].some((key) => cardActionLocked(record[key]));\n}\n","import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { isAgentId } from '../agents/registry.js';\nimport type { AgentId } from '../agents/types.js';\nimport type { ChoiceInteractionKind } from '../screen/detector.js';\n\nexport interface SignedAction {\n v: 1;\n kind: 'choice' | 'stop' | 'session' | 'manual';\n interactionKind?: ChoiceInteractionKind;\n sessionId?: string;\n manualMode?: 'explicit' | 'fallback';\n agent: AgentId;\n action: string;\n paneId: string;\n fingerprint: string;\n chatId: string;\n nonce: string;\n expiresAt: number;\n sig: string;\n}\n\ntype UnsignedAction = Omit<SignedAction, 'v' | 'nonce' | 'expiresAt' | 'sig'>;\nconst APPROVAL_NONCE_RETENTION_MS = 7 * 24 * 60 * 60_000;\n\nfunction remainsValidWhilePending(kind: SignedAction['kind']): boolean {\n return kind === 'choice';\n}\n\nexport class ActionSigner {\n private readonly usedNonces = new Map<string, number>();\n\n constructor(private readonly secret: string, private readonly now: () => number = Date.now) {}\n\n sign(action: UnsignedAction, ttlMs = 5 * 60_000): SignedAction {\n const value: Omit<SignedAction, 'sig'> = {\n v: 1,\n ...action,\n nonce: randomBytes(18).toString('base64url'),\n expiresAt: this.now() + ttlMs,\n };\n return { ...value, sig: this.mac(value) };\n }\n\n verify(value: unknown, expectedChatId?: string): SignedAction | undefined {\n const now = this.now();\n this.prune(now);\n if (!isSignedAction(value)\n || (expectedChatId && value.chatId !== expectedChatId)\n || (!remainsValidWhilePending(value.kind) && value.expiresAt < now)\n || this.usedNonces.has(value.nonce)) return undefined;\n const expected = Buffer.from(this.mac(withoutSignature(value)), 'base64url');\n const actual = Buffer.from(value.sig, 'base64url');\n if (actual.length !== expected.length || !timingSafeEqual(actual, expected)) return undefined;\n this.usedNonces.set(\n value.nonce,\n remainsValidWhilePending(value.kind) ? Math.max(value.expiresAt, now + APPROVAL_NONCE_RETENTION_MS) : value.expiresAt,\n );\n return value;\n }\n\n private mac(value: Omit<SignedAction, 'sig'>): string {\n const canonical = JSON.stringify([\n value.v,\n value.kind,\n value.interactionKind ?? null,\n value.sessionId ?? null,\n value.manualMode ?? null,\n value.agent,\n value.action,\n value.paneId,\n value.fingerprint,\n value.chatId,\n value.nonce,\n value.expiresAt,\n ]);\n return createHmac('sha256', this.secret).update(canonical).digest('base64url');\n }\n\n private prune(now: number): void {\n for (const [nonce, expiresAt] of this.usedNonces) {\n if (expiresAt < now) this.usedNonces.delete(nonce);\n }\n }\n}\n\nfunction withoutSignature(value: SignedAction): Omit<SignedAction, 'sig'> {\n const { sig: _sig, ...unsigned } = value;\n return unsigned;\n}\n\nfunction isSignedAction(value: unknown): value is SignedAction {\n if (!value || typeof value !== 'object') return false;\n const item = value as Record<string, unknown>;\n return item.v === 1\n && (item.kind === 'choice' || item.kind === 'stop' || item.kind === 'session' || item.kind === 'manual')\n && (item.kind !== 'choice' || item.interactionKind === 'approval' || item.interactionKind === 'question' || item.interactionKind === 'choice')\n && (item.kind !== 'manual' || (typeof item.sessionId === 'string'\n && (item.manualMode === 'explicit' || item.manualMode === 'fallback')))\n && typeof item.agent === 'string'\n && isAgentId(item.agent)\n && typeof item.action === 'string'\n && typeof item.paneId === 'string'\n && typeof item.fingerprint === 'string'\n && typeof item.chatId === 'string'\n && typeof item.nonce === 'string'\n && typeof item.expiresAt === 'number'\n && typeof item.sig === 'string';\n}\n","import { homedir } from 'node:os';\nimport type { ScreenDetection } from '../screen/detector.js';\nimport type { ManagedSession } from '../core/model.js';\nimport type { ActionSigner } from './action-signing.js';\nimport type { SignedAction } from './action-signing.js';\nimport { getAgentAdapter, listAgentAdapters } from '../agents/registry.js';\nimport type { AgentId } from '../agents/types.js';\nimport type { RuntimeStatus } from '../daemon/protocol.js';\n\nexport function choiceCard(\n chatId: string,\n paneId: string,\n screen: ScreenDetection,\n signer: ActionSigner,\n agent: AgentId = 'codex',\n): object {\n if (!screen.interaction) throw new Error('choice card requires a structured interaction');\n const interaction = screen.interaction;\n const buttons = screen.actions.map((action) => ({\n tag: 'button',\n text: { tag: 'plain_text', content: choiceActionLabel(action.key, action.label, action.description) },\n type: choiceButtonType(action.risk, action.focused),\n width: 'fill',\n size: 'medium',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'choice',\n interactionKind: interaction.kind,\n agent,\n action: action.key,\n paneId,\n fingerprint: interaction.revision ?? screen.fingerprint,\n chatId,\n }),\n }],\n }));\n const context = interaction.context.join('\\n').slice(0, 1800);\n if (interaction.semantics?.activation === 'toggle') {\n const formElements = screen.actions.flatMap((action, index): Array<Record<string, unknown>> => {\n if (action.role === 'custom-input') {\n const selected = action.marker === 'checked' || action.marker === 'selected';\n return [\n {\n tag: 'checker',\n name: choiceFormFieldName(index),\n checked: selected,\n text: { tag: 'plain_text', content: `${action.key}. ${action.label}` },\n },\n {\n tag: 'input',\n name: inlineInputName(index),\n placeholder: { tag: 'plain_text', content: '请输入自定义内容' },\n input_type: 'multiline_text',\n rows: 2,\n auto_resize: true,\n max_rows: 4,\n max_length: 1000,\n width: 'fill',\n default_value: action.inputValue ?? '',\n },\n ];\n }\n if (action.role === 'submit') {\n return [{ tag: 'hr' }, {\n tag: 'button',\n name: choiceFormSubmitName(),\n text: { tag: 'plain_text', content: '提交答案' },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n form_action_type: 'submit',\n }];\n }\n if (action.role !== 'answer') return [];\n const selected = action.marker === 'checked' || action.marker === 'selected';\n const details = action.description ? `\\n${action.description}` : '';\n return [{\n tag: 'checker',\n name: choiceFormFieldName(index),\n checked: selected,\n text: { tag: 'plain_text', content: `${action.key}. ${action.label}${details}` },\n }];\n });\n if (!screen.actions.some(({ role }) => role === 'submit')) {\n formElements.push({ tag: 'hr' }, {\n tag: 'button',\n name: choiceFormSubmitName(),\n text: { tag: 'plain_text', content: '提交答案' },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n form_action_type: 'submit',\n });\n }\n const immediateButtons = screen.actions\n .filter(({ role }) => role !== 'answer' && role !== 'custom-input' && role !== 'submit')\n .map((action) => ({\n tag: 'button',\n text: { tag: 'plain_text', content: choiceActionLabel(action.key, action.label, action.description) },\n type: choiceButtonType(action.risk, action.focused),\n width: 'fill',\n size: 'medium',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'choice', interactionKind: interaction.kind, agent, action: action.key, paneId,\n fingerprint: interaction.revision ?? screen.fingerprint, chatId,\n }),\n }],\n }));\n return cardElements(\n `${getAgentAdapter(agent).displayName} ${interactionTitle(interaction.kind)}`,\n [{ tag: 'markdown', content: `\\`\\`\\`text\\n${escapeFence(context || interaction.title)}\\n\\`\\`\\`` }, {\n tag: 'form',\n name: 'choice_form',\n direction: 'vertical',\n vertical_spacing: '8px',\n elements: formElements,\n }, ...immediateButtons],\n );\n }\n return card(\n `${getAgentAdapter(agent).displayName} ${interactionTitle(interaction.kind)}`,\n `\\`\\`\\`text\\n${escapeFence(context || '请选择一个选项')}\\n\\`\\`\\``,\n buttons,\n );\n}\n\nexport const CHOICE_FORM_SUBMIT_ACTION = '__choice_form_submit__';\n\nexport function choiceFormSubmitName(): string {\n return 'choice_form_submit';\n}\n\nexport function choiceFormFieldName(index: number): string {\n return `choice_selected_${index}`;\n}\n\nexport function inlineInputName(index: number): string {\n return `custom_input_${index}`;\n}\n\nexport function stopCard(\n chatId: string,\n paneId: string,\n fingerprint: string,\n signer: ActionSigner,\n agent: AgentId = 'codex',\n): object {\n const agentName = getAgentAdapter(agent).displayName;\n return card(`确认停止 ${agentName}?`, `这会终止当前 ${agentName} 进程和受管 tmux 会话。`, [{\n tag: 'button',\n text: { tag: 'plain_text', content: '停止会话' },\n type: 'danger',\n behaviors: [{\n type: 'callback',\n value: signer.sign({ kind: 'stop', agent, action: 'confirm', paneId, fingerprint, chatId }, 2 * 60_000),\n }],\n }]);\n}\n\nexport function interactionInputCard(agent: AgentId, label: string): object {\n return card(\n `${getAgentAdapter(agent).displayName} 等待补充内容`,\n `已进入 **${escapeMarkdown(label)}**。请直接发送补充说明。`,\n [],\n 'orange',\n );\n}\n\nexport type ManualControlState = 'active' | 'stale' | 'recovered' | 'exited' | 'error';\n\nexport interface ManualControlView {\n session: ManagedSession;\n screen: ScreenDetection;\n output: string;\n capturedAt: Date;\n state?: ManualControlState;\n notice?: string;\n lastOperation?: string;\n mode?: 'explicit' | 'fallback';\n}\n\nexport const MANUAL_TEXT_FIELD = 'manual_text';\nexport const MANUAL_TYPE_ACTION = 'type';\nexport const MANUAL_SUBMIT_ACTION = 'submit';\n\nexport function manualControlCard(\n chatId: string,\n view: ManualControlView,\n signer: ActionSigner,\n): object {\n const state = view.state ?? 'active';\n const mode = view.mode ?? 'fallback';\n const agentName = getAgentAdapter(view.session.agent).displayName;\n const fingerprint = view.screen.fingerprint;\n const sign = (action: string): SignedAction => signer.sign({\n kind: 'manual',\n sessionId: view.session.id,\n manualMode: mode,\n agent: view.session.agent,\n action,\n paneId: view.session.paneId,\n fingerprint,\n chatId,\n }, 10 * 60_000);\n const status = state === 'recovered'\n ? '✅ 已恢复结构化识别,请使用新发送的语义化操作卡。'\n : state === 'exited'\n ? '✅ 已退出手动遥控模式,本地 Agent 和 tmux 仍在运行。'\n : state === 'stale'\n ? '⚠️ 终端画面已变化,旧操作未执行;请确认最新画面后重试。'\n : state === 'error'\n ? `⚠️ ${escapeMarkdown(view.notice ?? '手动操作失败,请确认最新画面。')}`\n : mode === 'explicit'\n ? '⚠️ 已锁定手动遥控;即使恢复结构化识别,也会继续由你直接操作终端。'\n : '⚠️ 当前为手动遥控模式,所有操作都不会进行语义安全判断。';\n const metadata = [\n `**Session** \\`${escapeInlineCode(view.session.id)}\\` · **Agent** ${escapeMarkdown(agentName)}`,\n `**状态** \\`${view.screen.state}\\` · **采集时间** ${formatHandledAt(view.capturedAt)}`,\n view.lastOperation ? `**最近操作** ${escapeMarkdown(view.lastOperation)}` : undefined,\n view.notice && state !== 'error' ? escapeMarkdown(view.notice) : undefined,\n ].filter(Boolean).join('\\n');\n const elements: object[] = [\n { tag: 'markdown', content: status },\n { tag: 'markdown', content: metadata },\n { tag: 'markdown', content: `\\`\\`\\`text\\n${escapeFence(view.output).slice(-5000)}\\n\\`\\`\\`` },\n ];\n if (state === 'recovered' || state === 'exited') {\n return cardElements(`${view.session.id} · ${agentName} 手动遥控`, elements, state === 'recovered' ? 'green' : 'grey');\n }\n elements.push(\n manualButtonRow([\n manualButton('↖ 刷新', sign('refresh')),\n manualButton('↑', sign('up')),\n manualButton('Esc', sign('esc')),\n ]),\n manualButtonRow([\n manualButton('←', sign('left')),\n manualButton('Enter', sign('enter'), 'primary'),\n manualButton('→', sign('right')),\n ]),\n manualButtonRow([\n manualButton('Tab', sign('tab')),\n manualButton('↓', sign('down')),\n manualButton('Space', sign('space')),\n ]),\n {\n tag: 'form', name: 'manual_text_form', direction: 'vertical', vertical_spacing: '8px', elements: [\n {\n tag: 'input', name: MANUAL_TEXT_FIELD, input_type: 'multiline_text', rows: 2,\n auto_resize: true, max_rows: 4, max_length: 1000, width: 'fill',\n placeholder: { tag: 'plain_text', content: '输入要发送到当前终端的文本' },\n },\n manualFormButton('仅输入', MANUAL_TYPE_ACTION),\n manualFormButton('输入并提交', MANUAL_SUBMIT_ACTION, 'primary'),\n ],\n },\n manualButtonRow([\n manualButton('⌫ 退格', sign('backspace')),\n manualButton('Ctrl+C', sign('ctrl-c'), 'danger'),\n manualButton('结束遥控', sign('exit')),\n ]),\n );\n return cardElements(`${view.session.id} · ${agentName} 手动遥控`, elements, 'orange');\n}\n\nfunction manualButton(label: string, value: SignedAction, type = 'default'): object {\n return {\n tag: 'button', text: { tag: 'plain_text', content: label }, type, width: 'fill', size: 'medium',\n behaviors: [{ type: 'callback', value }],\n };\n}\n\nfunction manualFormButton(label: string, name: string, type = 'default'): object {\n return {\n tag: 'button', name, text: { tag: 'plain_text', content: label }, type, width: 'fill', size: 'medium',\n form_action_type: 'submit',\n };\n}\n\nfunction manualButtonRow(buttons: object[]): object {\n return {\n tag: 'column_set', flex_mode: 'none', horizontal_spacing: '6px',\n columns: buttons.map((button) => ({\n tag: 'column', width: 'weighted', weight: 1, elements: [button],\n })),\n };\n}\n\nexport function statusCard(status: RuntimeStatus): object {\n const session = status.session;\n if (!session) {\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: 'Coding Assistant 状态' }, template: 'grey' },\n body: {\n padding: '12px',\n elements: [{\n tag: 'markdown',\n content: `⚪ **暂无 active session**\\n\\n当前共有 ${Object.keys(status.state.sessions ?? {}).length} 个可用 session,可发送 /sessions 进行选择。`,\n }],\n },\n };\n }\n\n const adapter = getAgentAdapter(session.agent);\n const visual = statusVisual(status);\n const path = formatDisplayPath(session.cwd);\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: `${session.id} · ${adapter.displayName}` }, template: visual.template },\n body: {\n vertical_spacing: '10px',\n padding: '12px',\n elements: [\n { tag: 'markdown', content: `<text_tag color='${visual.color}'>● ${visual.label}</text_tag> **当前连接**` },\n {\n tag: 'column_set',\n flex_mode: 'none',\n horizontal_spacing: '8px',\n columns: [\n statusColumn('Agent', `${agentMarker(session.agent)} ${adapter.displayName}`),\n statusColumn('tmux', status.paneAlive ? '✅ 运行中' : '⛔ 已停止'),\n ],\n },\n {\n tag: 'column_set',\n flex_mode: 'none',\n horizontal_spacing: '0px',\n columns: [{\n tag: 'column',\n width: 'weighted',\n weight: 1,\n background_style: 'grey',\n padding: '9px 10px',\n elements: [{ tag: 'markdown', content: `**工作目录**\\n\\`${escapeInlineCode(path)}\\`` }],\n }],\n },\n { tag: 'markdown', content: `**版本** \\`${escapeInlineCode(session.agentVersion)}\\`\\n**飞书连接** ${status.state.boundChatId ? '已绑定' : '未绑定'}` },\n ],\n },\n };\n}\n\nexport function sessionPickerCard(\n chatId: string,\n sessions: ManagedSession[],\n activeSessionId: string | undefined,\n signer: ActionSigner,\n): object {\n const groups = listAgentAdapters()\n .map((adapter) => ({ adapter, sessions: sessions.filter((session) => session.agent === adapter.id) }))\n .filter(({ sessions: group }) => group.length > 0);\n const elements = groups.flatMap(({ adapter, sessions: group }, groupIndex) => [\n ...(groupIndex > 0 ? [{ tag: 'hr', margin: '6px 0px' }] : []),\n {\n tag: 'markdown',\n content: `${agentMarker(adapter.id)} **${adapter.displayName}** · ${group.length} 个 session`,\n text_size: 'heading',\n margin: '2px 0px 0px 0px',\n },\n ...group.map((session) => sessionCard(chatId, session, session.id === activeSessionId, signer)),\n ]);\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: '选择 Coding Session' }, template: 'blue' },\n body: {\n vertical_spacing: '10px',\n padding: '12px',\n elements: elements.length > 0\n ? elements\n : [{ tag: 'markdown', content: '暂无可连接的 Coding Session。' }],\n },\n };\n}\n\nfunction sessionCard(\n chatId: string,\n session: ManagedSession,\n active: boolean,\n signer: ActionSigner,\n): object {\n const content = [\n active\n ? `**${escapeMarkdown(session.id)}** <text_tag color='green'>● 当前连接</text_tag>`\n : `**${escapeMarkdown(session.id)}**`,\n `📁 \\`${escapeInlineCode(formatDisplayPath(session.cwd))}\\``,\n ].join('\\n\\n');\n const elements: object[] = [{ tag: 'markdown', content }];\n if (!active) {\n elements.push({\n tag: 'button',\n text: { tag: 'plain_text', content: `连接 ${session.id}` },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n margin: '2px 0px 0px 0px',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'session',\n agent: session.agent,\n action: session.id,\n paneId: session.paneId,\n fingerprint: String(session.updatedAt),\n chatId,\n }),\n }],\n });\n }\n const contentColumn = {\n tag: 'column',\n width: 'weighted',\n weight: 1,\n vertical_spacing: '8px',\n background_style: 'grey',\n padding: '10px 12px',\n elements,\n };\n return {\n tag: 'column_set',\n flex_mode: 'none',\n horizontal_spacing: '0px',\n margin: '0px',\n columns: active\n ? [{\n tag: 'column',\n width: 'auto',\n background_style: 'green',\n padding: '0px 3px',\n elements: [],\n }, contentColumn]\n : [contentColumn],\n };\n}\n\nexport function formatDisplayPath(path: string, home = homedir(), maxLength = 44): string {\n const display = path === home\n ? '~'\n : path.startsWith(`${home}/`)\n ? `~${path.slice(home.length)}`\n : path;\n if (display.length <= maxLength) return display;\n const segments = display.split('/').filter(Boolean);\n return segments.length <= 2 ? display : `…/${segments.slice(-2).join('/')}`;\n}\n\nfunction agentMarker(agent: AgentId): string {\n if (agent === 'codex') return '🔵';\n if (agent === 'trae-cli') return '🟣';\n return '🟠';\n}\n\nfunction statusColumn(title: string, value: string): object {\n return {\n tag: 'column',\n width: 'weighted',\n weight: 1,\n background_style: 'grey',\n padding: '9px 10px',\n elements: [{ tag: 'markdown', content: `**${title}**\\n${value}` }],\n };\n}\n\nfunction statusVisual(status: RuntimeStatus): { label: string; color: string; template: string } {\n if (!status.paneAlive || status.screen?.state === 'exited') return { label: '已停止', color: 'red', template: 'red' };\n if (status.screen?.state === 'failed') return { label: '执行失败', color: 'red', template: 'red' };\n if (status.screen?.interaction?.kind === 'approval') return { label: '等待审批', color: 'orange', template: 'orange' };\n if (status.screen?.interaction?.kind === 'question') return { label: '等待回答', color: 'orange', template: 'orange' };\n if (status.screen?.interaction?.kind === 'choice') return { label: '等待选择', color: 'orange', template: 'orange' };\n if (status.screen?.state === 'input') return { label: '等待输入', color: 'orange', template: 'orange' };\n if (status.screen?.state === 'running') return { label: '执行中', color: 'blue', template: 'blue' };\n if (status.screen?.state === 'starting') return { label: '启动中', color: 'blue', template: 'blue' };\n if (status.screen?.state === 'idle') return { label: '等待用户输入', color: 'green', template: 'green' };\n return { label: '状态未知', color: 'grey', template: 'grey' };\n}\n\nexport function handledActionCard(\n action: SignedAction,\n result: string,\n handledAt = new Date(),\n): object {\n const agentName = getAgentAdapter(action.agent).displayName;\n const title = action.kind === 'choice'\n ? `${agentName} ${handledInteractionTitle(action.interactionKind)}`\n : action.kind === 'session'\n ? `${agentName} session 已切换`\n : `${agentName} 会话已停止`;\n const actionLabel = action.kind === 'choice'\n ? `选择第 ${action.action} 项`\n : action.kind === 'session'\n ? `连接 ${action.action}`\n : '停止会话';\n const content = [\n `✅ ${escapeMarkdown(result)}`,\n '',\n `**操作**:${escapeMarkdown(actionLabel)}`,\n `**处理时间**:${formatHandledAt(handledAt)}`,\n ].join('\\n');\n return card(title, content, [], 'green');\n}\n\nfunction card(title: string, content: string, buttons: object[], template = 'blue'): object {\n return cardElements(title, [{ tag: 'markdown', content }, ...buttons], template);\n}\n\nfunction cardElements(title: string, elements: object[], template = 'blue'): object {\n return {\n schema: '2.0',\n config: { update_multi: true },\n header: { title: { tag: 'plain_text', content: title }, template },\n body: { vertical_spacing: '8px', padding: '12px', elements },\n };\n}\n\nfunction interactionTitle(kind: 'approval' | 'question' | 'choice'): string {\n if (kind === 'approval') return '等待审批';\n if (kind === 'question') return '等待回答';\n return '等待选择';\n}\n\nfunction handledInteractionTitle(kind?: 'approval' | 'question' | 'choice'): string {\n if (kind === 'approval') return '审批已处理';\n if (kind === 'question') return '回答已提交';\n return '选择已提交';\n}\n\nfunction choiceButtonType(risk?: string, focused?: boolean): string {\n if (risk === 'persistent' || risk === 'privileged') return 'danger';\n if (risk === 'reject') return 'default';\n return focused ? 'primary' : 'default';\n}\n\nfunction choiceActionLabel(key: string, label: string, description?: string): string {\n const suffix = description ? ` · ${description}` : '';\n return `${key}. ${label}${suffix}`.slice(0, 80);\n}\n\nfunction toggleActionLabel(action: ScreenDetection['actions'][number]): string {\n if (action.role === 'submit') return '提交答案';\n if (action.role === 'custom-input') return '自定义输入';\n if (action.role === 'chat') return '继续对话';\n return action.marker === 'checked' || action.marker === 'selected' ? '取消选择' : '选择此项';\n}\n\nfunction escapeFence(value: string): string {\n return value.replace(/```/g, '``\\\\`');\n}\n\nfunction escapeInlineCode(value: string): string {\n return value.replace(/`/g, '\\\\`');\n}\n\nfunction formatHandledAt(value: Date): string {\n const parts = new Intl.DateTimeFormat('zh-CN', {\n timeZone: 'Asia/Shanghai',\n year: 'numeric', month: '2-digit', day: '2-digit',\n hour: '2-digit', minute: '2-digit', second: '2-digit',\n hour12: false,\n }).formatToParts(value);\n const part = (type: Intl.DateTimeFormatPartTypes): string => parts.find((item) => item.type === type)?.value ?? '';\n return `${part('year')}-${part('month')}-${part('day')} ${part('hour')}:${part('minute')}:${part('second')}`;\n}\n\nfunction escapeMarkdown(value: string): string {\n return value.replace(/([\\\\`*_{}[\\]()#+.!|>-])/g, '\\\\$1');\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 { AssistantDaemon } from './daemon/server.js';\nimport { resolveAppPaths } from './core/paths.js';\nimport { AppStore } from './core/store.js';\nimport { readFile } from 'node:fs/promises';\n\nconst paths = resolveAppPaths();\nconst packageInfo = JSON.parse(\n await readFile(new URL('../package.json', import.meta.url), 'utf8'),\n) as { version: string };\nconst daemon = new AssistantDaemon(\n new AppStore(paths), paths, undefined, undefined, undefined, undefined, packageInfo.version,\n);\n\ntry {\n await daemon.start();\n for (const signal of ['SIGINT', 'SIGTERM'] as const) {\n process.on(signal, () => {\n console.error(`${new Date().toISOString()} daemon received ${signal}; shutting down`);\n void daemon.close().finally(() => process.exit(0));\n });\n }\n} catch (error) {\n console.error(`${new Date().toISOString()} daemon crashed during startup`, error);\n process.exitCode = 1;\n}\n\nprocess.on('uncaughtException', (error) => {\n console.error(`${new Date().toISOString()} daemon uncaught exception`, error);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (error) => {\n console.error(`${new Date().toISOString()} daemon unhandled rejection`, error);\n process.exit(1);\n});\n"],"mappings":"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","names":["chmod","open","readFile","chmod","mkdir","paths","mkdir","chmod","randomBytes","ANSI","randomBytes","randomBytes","timingSafeEqual","randomBytes","timingSafeEqual","selected","result","result","card","paths","chmod","open","readFile","errorMessage","escapeFence","result","current","navigation","homedir","readFile"]}