lark-coding-assistant 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -3
- package/dist/cli.js +205 -64
- package/dist/cli.js.map +1 -1
- package/dist/daemon-entry.js +1087 -375
- package/dist/daemon-entry.js.map +1 -1
- package/dist/hook-entry.js.map +1 -1
- package/package.json +1 -1
package/dist/daemon-entry.js.map
CHANGED
|
@@ -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/agents/types.ts","../src/core/errors.ts","../src/session/start-request.ts","../src/session/startup-failure.ts","../src/session/reconciler.ts","../src/session/native-session.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/registry.ts","../src/agents/stop-event.ts","../src/lark/gateway.ts","../src/lark/action-signing.ts","../src/lark/cards.ts","../src/lark/start-command.ts","../src/screen/resume-picker.ts","../src/terminal/startup-error.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, isAppError, serializeAppError, systemErrorCode } from '../core/errors.js';\nimport { validateStartSessionRequest, type StartSessionRequest } from '../session/start-request.js';\nimport { sessionStartupFailure } from '../session/startup-failure.js';\nimport { SessionReconciler } from '../session/reconciler.js';\nimport { resolveNativeAgentSessionId } from '../session/native-session.js';\nimport { TmuxController } from '../tmux/controller.js';\nimport type { DaemonRequest, DaemonResult, RuntimeSessionStatus, RuntimeStatus } from './protocol.js';\nimport { getAgentAdapter } from '../agents/registry.js';\nimport type { AgentId, AgentResume, AgentSessionStartedCandidate, TurnCompleteCandidate } from '../agents/types.js';\nimport { validSessionStartCandidate, 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 SESSION_CREATE_AGENT_FIELD,\n SESSION_CREATE_CWD_FIELD,\n SESSION_CREATE_NAME_FIELD,\n SESSION_CREATE_RESUME_FIELD,\n choiceFormFieldName,\n inlineInputName,\n type ManualControlState,\n type ManualControlView,\n} from '../lark/cards.js';\nimport { parseStartCommand } from '../lark/start-command.js';\nimport { normalizeAgentId } from '../agents/types.js';\nimport { parseResumePicker, type ResumePickerView } from '../screen/resume-picker.js';\nimport { startupTerminalExcerpt } from '../terminal/startup-error.js';\n\nexport class AssistantDaemon {\n private config!: AppConfig;\n private state!: SessionState;\n private tmux!: TmuxController;\n private reconciler!: SessionReconciler;\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 readonly pendingAgentSessionClaims = new Map<string, AgentSessionStartedCandidate>();\n private readonly pendingResumePickers = new Map<string, StartSessionRequest>();\n private readonly pendingStartupConflicts = new Map<string, { request: StartSessionRequest; ownerSessionId: 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 this.reconciler = new SessionReconciler(\n this.tmux,\n this.sessionName,\n 3,\n (message) => this.log(message),\n async (agent) => {\n const adapter = getAgentAdapter(agent);\n return (await runFile(adapter.binary(this.config), [...adapter.versionArgs])).stdout.trim();\n },\n );\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(true);\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 onResumePickerDeliveryFailure: (session) => this.handleResumePickerDeliveryFailure(session),\n });\n await this.gateway.connect();\n await this.refreshNativeAgentSessionClaims();\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 'agentSessionStarted': return this.handleAgentSessionStarted(request.candidate);\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 try {\n await validateStartSessionRequest({ sessionId, cwd, agent: agentId, resume });\n } catch (error) {\n return fail(error);\n }\n await this.reconcileSessions(true);\n const existing = this.state.sessions?.[sessionId];\n if (existing) {\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 let agentVersion: string;\n try {\n agentVersion = (await runFile(binary, [...adapter.versionArgs])).stdout.trim();\n } catch (error) {\n return fail(systemErrorCode(error) === 'ENOENT'\n ? new AppError('BINARY_NOT_FOUND', `command not found: ${binary}`, { binary }, { cause: error })\n : new AppError('START_FAILED', `failed to inspect agent binary: ${binary}`, { sessionId }, { cause: error }));\n }\n const tmuxSessionName = `${this.sessionName}-${sessionId}`;\n let pane;\n try {\n 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 LARK_CODING_ASSISTANT_AGENT: agentId,\n },\n preserveOnExit: true,\n });\n } catch (error) {\n return fail(isAppError(error)\n ? error\n : new AppError('START_FAILED', 'failed to create tmux session', { sessionId }, { cause: error }));\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 const pendingClaim = this.pendingAgentSessionClaims.get(sessionId);\n if (pendingClaim?.agent === agentId) {\n const owner = this.findAgentSessionOwner(agentId, pendingClaim.agentSessionId, sessionId);\n if (owner) {\n this.pendingAgentSessionClaims.delete(sessionId);\n await this.tmux.killSession(pane.sessionName).catch(() => undefined);\n return fail(agentSessionInUse(sessionId, owner.id));\n }\n session.agentSessionId = pendingClaim.agentSessionId;\n this.pendingAgentSessionClaims.delete(sessionId);\n }\n try {\n await this.tmux.writeMetadata(pane.sessionName, {\n managed: true,\n sessionId,\n agent: agentId,\n cwd,\n agentVersion,\n agentSessionId: session.agentSessionId,\n });\n } catch (error) {\n await this.tmux.killSession(pane.sessionName).catch((cleanupError) => this.log(\n `failed to clean session ${sessionId} after metadata error: ${errorMessage(cleanupError)}`,\n ));\n return fail(new AppError('START_FAILED', 'failed to persist tmux session metadata', { sessionId }, { cause: error }));\n }\n const nextState: SessionState = {\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 try {\n await this.store.saveState(nextState);\n } catch (error) {\n await this.tmux.killSession(pane.sessionName).catch((cleanupError) => this.log(\n `failed to clean session ${sessionId} after state error: ${errorMessage(cleanupError)}`,\n ));\n return fail(new AppError('START_FAILED', 'failed to persist session state', { sessionId }, { cause: error }));\n }\n this.state = nextState;\n const lateClaim = this.pendingAgentSessionClaims.get(sessionId);\n if (lateClaim) {\n const claimed = await this.handleAgentSessionStarted(lateClaim);\n if (!claimed.ok) {\n await this.stopSession(sessionId).catch(() => undefined);\n return claimed;\n }\n }\n if (resume && resume.mode !== 'picker') {\n const initialClaim = await this.waitForInitialAgentSessionClaim(sessionId, pane.pid);\n if (!initialClaim.ok) {\n await this.stopSession(sessionId).catch(() => undefined);\n return initialClaim;\n }\n } else if (!resume) {\n const stable = await this.waitForStartupStability(session, 500);\n if (!stable.ok) {\n await this.stopSession(sessionId).catch(() => undefined);\n return stable;\n }\n }\n if (resume?.mode !== 'picker') {\n await this.tmux.preserveOnExit(session.sessionName, false).catch((error) => this.log(\n `failed to disable startup preservation for ${sessionId}: ${errorMessage(error)}`,\n ));\n }\n await this.log(\n `session created: session=${session.id} agent=${session.agent} pane=${session.paneId} active=${this.state.activeSessionId === session.id}`,\n );\n await this.poll().catch((error) => this.log(`initial poll failed for ${sessionId}: ${errorMessage(error)}`));\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?: string): Promise<RuntimeStatus> {\n const selectedSessionId = sessionId ?? this.state.activeSessionId;\n const selected = selectedSessionId ? this.state.sessions?.[selectedSessionId] : undefined;\n const requestedSessions = sessionId\n ? (selected ? [selected] : [])\n : Object.values(this.state.sessions ?? {});\n const sessions = await Promise.all(requestedSessions.map((session) => this.sessionRuntimeStatus(session)));\n const selectedRuntime = selected\n ? sessions.find(({ session }) => session.id === selected.id)\n ?? await this.sessionRuntimeStatus(selected)\n : undefined;\n return {\n state: this.state,\n session: selected,\n screen: selectedRuntime?.screen,\n paneAlive: selectedRuntime?.paneAlive === true,\n sessions,\n };\n }\n\n private async sessionRuntimeStatus(session: ManagedSession): Promise<RuntimeSessionStatus> {\n const active = session.id === this.state.activeSessionId;\n try {\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) {\n return {\n session,\n screen: getAgentAdapter(session.agent).detectScreen('', false),\n paneAlive: false,\n active,\n };\n }\n const screen = active && this.screen\n ? this.screen\n : getAgentAdapter(session.agent).detectScreen(\n await this.tmux.capture(session.paneId, 160),\n true,\n { x: pane.cursorX, y: pane.cursorY },\n );\n return { session, screen, paneAlive: true, active };\n } catch {\n return { session, active };\n }\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 if (text === '/start') {\n try {\n await this.gateway?.sendSessionCreate(message.chatId);\n } catch (error) {\n await this.log(`session create card failed: ${errorMessage(error)}`);\n await this.gateway?.sendText(message.chatId, '新建 Session 表单发送失败。请使用 /start <name> --agent <agent> --cwd <绝对路径>。');\n }\n return;\n }\n if (text.startsWith('/start ')) {\n let request: StartSessionRequest;\n try {\n request = parseStartCommand(text);\n } catch (error) {\n await this.gateway?.sendText(message.chatId, remoteError(fail(error)));\n return;\n }\n const result = await this.startRemoteSession(request);\n if (!result.ok) {\n const failure = sessionStartupFailure(result.error, request);\n if (failure) await this.gateway?.sendSessionStartupFailure(message.chatId, failure);\n else await this.gateway?.sendText(message.chatId, remoteError(result.error));\n }\n else if (result.state === 'picker') {\n try {\n await this.gateway?.sendResumePicker(message.chatId, result.session, result.picker);\n } catch (error) {\n await this.handleResumePickerDeliveryFailure(result.session);\n await this.log(`resume picker notification failed: session=${result.session.id} error=${errorMessage(error)}`);\n await this.gateway?.sendText(message.chatId, 'Resume Picker 卡片发送失败,临时 Session 已清理,请重试。');\n }\n }\n else if (result.state === 'conflict') await this.gateway?.sendStartupConflict(message.chatId, result.request, result.owner);\n else await this.gateway?.sendText(message.chatId, remoteStartSuccess(result.session));\n return;\n }\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(true);\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.gateway?.startProcessing(message);\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 === 'session-stop') return this.handleSessionStopAction(action);\n if (action.kind === 'session-start-error') {\n if (action.action === 'create') return { type: 'session-create-form', content: '请填写启动信息。' };\n if (action.action === 'sessions') {\n await this.reconcileSessions(true);\n return this.sessionPickerActionResult('已发送最新 Sessions。');\n }\n return { type: 'error', content: '无法识别启动失败卡片操作。' };\n }\n if (action.kind === 'startup-conflict') return this.handleStartupConflictAction(action);\n if (action.kind === 'resume-picker') return this.handleResumePickerAction(action);\n if (action.kind === 'session-create') {\n if (action.action === 'open') {\n return {\n type: 'session-create-form',\n content: '请填写启动信息。',\n sessions: Object.values(this.state.sessions ?? {}),\n activeSessionId: this.state.activeSessionId,\n };\n }\n if (action.action !== 'submit' || !event.action.formValue) {\n return { type: 'error', content: '无法识别新建 Session 表单,请重新发送 /sessions。' };\n }\n const request = startRequestFromForm(event.action.formValue);\n if (!request.ok) return { type: 'error', content: request.error };\n const result = await this.startRemoteSession(request.value);\n if (!result.ok) return larkStartupError(result.error, request.value);\n if (result.state === 'picker') {\n return { type: 'resume-picker', content: '请选择要恢复的历史 Session。', session: result.session, picker: result.picker };\n }\n if (result.state === 'conflict') {\n return { type: 'startup-conflict', content: '目标原生 Session 已由现有 LCA Session 连接。', request: result.request, owner: result.owner };\n }\n return { type: 'session-created', content: remoteStartSuccess(result.session), session: result.session };\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 async handleSessionStopAction(action: SignedAction): Promise<LarkActionResult> {\n const sessionId = action.sessionId ?? '';\n const target = this.state.sessions?.[sessionId];\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 if (action.action === 'request') {\n return this.sessionPickerActionResult(`请确认是否关闭 ${target.id}。`, target.id);\n }\n if (action.action === 'cancel') {\n return this.sessionPickerActionResult(`已取消关闭 ${target.id}。`);\n }\n if (action.action !== 'confirm') return { type: 'error', content: '无法识别关闭操作,请重新发送 /sessions。' };\n const stopped = await this.stopSession(target.id);\n if (!stopped.ok) return { type: 'error', content: remoteError(stopped) };\n return this.sessionPickerActionResult(`已关闭 ${target.id}。`);\n }\n\n private async handleStartupConflictAction(action: SignedAction): Promise<LarkActionResult> {\n const requestedSessionId = action.sessionId ?? '';\n const pending = this.pendingStartupConflicts.get(requestedSessionId);\n const owner = pending ? this.state.sessions?.[pending.ownerSessionId] : undefined;\n if (!pending || !owner || pending.request.agent !== action.agent\n || owner.paneId !== action.paneId || String(owner.updatedAt) !== action.fingerprint) {\n return { type: 'error', content: 'Session 冲突状态已变化,请重新创建 Session。' };\n }\n if (action.action === 'cancel') {\n this.pendingStartupConflicts.delete(requestedSessionId);\n return { type: 'success', content: `已取消创建 ${requestedSessionId}。` };\n }\n if (action.action === 'connect') {\n const selected = await this.useSession(owner.id);\n if (!selected.ok) return { type: 'error', content: remoteError(selected) };\n this.pendingStartupConflicts.delete(requestedSessionId);\n return { type: 'session-created', content: `已连接现有 session「${owner.id}」。`, session: owner };\n }\n if (action.action !== 'new') return { type: 'error', content: '无法识别冲突处理操作。' };\n this.pendingStartupConflicts.delete(requestedSessionId);\n const result = await this.startRemoteSession({ ...pending.request, resume: undefined });\n if (!result.ok) return larkStartupError(result.error, pending.request);\n if (result.state !== 'ready') return { type: 'error', content: '启动新会话时出现了意外恢复状态,请重试。' };\n return { type: 'session-created', content: remoteStartSuccess(result.session), session: result.session };\n }\n\n private sessionPickerActionResult(content: string, confirmingStopSessionId?: string): LarkActionResult {\n return {\n type: 'session-picker',\n content,\n sessions: Object.values(this.state.sessions ?? {}),\n activeSessionId: this.state.activeSessionId,\n confirmingStopSessionId,\n };\n }\n\n private async handleResumePickerAction(action: SignedAction): Promise<LarkActionResult> {\n const sessionId = action.sessionId ?? '';\n const request = this.pendingResumePickers.get(sessionId);\n const session = this.state.sessions?.[sessionId];\n if (!request || !session || session.agent !== action.agent || session.paneId !== action.paneId) {\n return { type: 'error', content: 'Resume Picker 已变化,请重新创建 Session。' };\n }\n if (action.action === 'cancel') {\n this.pendingResumePickers.delete(sessionId);\n const stopped = await this.stopSession(sessionId);\n return stopped.ok\n ? { type: 'success', content: `已取消创建 ${sessionId}。` }\n : { type: 'error', content: remoteError(stopped) };\n }\n let picker = await this.readResumePicker(session);\n if (!picker) {\n this.pendingResumePickers.delete(sessionId);\n return { type: 'error', content: '原生 Resume Picker 当前无法安全识别,已允许手动遥控兜底;请发送 /manual。' };\n }\n if (action.action !== 'refresh' && picker.fingerprint !== action.fingerprint) {\n return { type: 'resume-picker', content: 'Picker 已变化,已刷新为最新内容。', session, picker };\n }\n if (action.action === 'refresh') {\n return { type: 'resume-picker', content: '已刷新 Resume Picker。', session, picker };\n }\n if (action.action === 'previous' || action.action === 'next') {\n await this.tmux.sendKey(session.paneId, action.action === 'previous' ? 'PPage' : 'NPage');\n picker = await this.waitForResumePicker(session, picker.fingerprint) ?? picker;\n return { type: 'resume-picker', content: '已切换 Picker 页面。', session, picker };\n }\n const optionId = action.action.startsWith('select:') ? action.action.slice('select:'.length) : '';\n const option = picker.options.find((candidate) => candidate.id === optionId);\n if (!option) return { type: 'resume-picker', content: '所选项已变化,已刷新。', session, picker };\n const delta = option.visibleIndex - picker.selectedIndex;\n const key = delta < 0 ? 'Up' : 'Down';\n for (let step = 0; step < Math.abs(delta); step += 1) await this.tmux.sendKey(session.paneId, key);\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) {\n this.pendingResumePickers.delete(sessionId);\n return larkStartupError(fail(await this.startupExitedError(session, pane)), request);\n }\n await this.tmux.sendKey(session.paneId, 'Enter');\n this.pendingResumePickers.delete(sessionId);\n const claimed = await this.waitForInitialAgentSessionClaim(sessionId, pane.pid);\n if (!claimed.ok) {\n await this.stopSession(sessionId).catch(() => undefined);\n if (claimed.errorCode === 'AGENT_SESSION_IN_USE') {\n const ownerSessionId = typeof claimed.errorContext?.ownerSessionId === 'string'\n ? claimed.errorContext.ownerSessionId\n : undefined;\n const owner = ownerSessionId ? this.state.sessions?.[ownerSessionId] : undefined;\n if (owner) {\n this.pendingStartupConflicts.set(sessionId, { request, ownerSessionId: owner.id });\n return {\n type: 'startup-conflict',\n content: '所选原生 Session 已由现有 LCA Session 连接。',\n request,\n owner,\n };\n }\n }\n return larkStartupError(claimed, request);\n }\n await this.tmux.preserveOnExit(session.sessionName, false).catch(() => undefined);\n const selected = await this.useSession(sessionId);\n if (!selected.ok) return { type: 'error', content: remoteError(selected) };\n return { type: 'session-created', content: remoteStartSuccess(session), session };\n }\n\n private async readResumePicker(session: ManagedSession): Promise<ResumePickerView | undefined> {\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) return undefined;\n const raw = await this.tmux.capture(session.paneId, 120).catch(() => '');\n return parseResumePicker(raw, session.agent);\n }\n\n private async handleResumePickerDeliveryFailure(candidate: ManagedSession): Promise<void> {\n const current = this.state.sessions?.[candidate.id];\n if (!current || current.paneId !== candidate.paneId || !this.pendingResumePickers.has(candidate.id)) return;\n await this.log(`resume picker delivery failed; rolling back provisional session: session=${candidate.id} pane=${candidate.paneId}`);\n await this.stopSession(candidate.id);\n }\n\n private async waitForResumePicker(\n session: ManagedSession,\n previousFingerprint?: string,\n timeoutMs = 2_500,\n ): Promise<ResumePickerView | undefined> {\n const deadline = Date.now() + timeoutMs;\n let latest: ResumePickerView | undefined;\n while (Date.now() < deadline) {\n latest = await this.readResumePicker(session);\n if (latest && (!previousFingerprint || latest.fingerprint !== previousFingerprint)) return latest;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return latest;\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 this.pendingResumePickers.delete(sessionId);\n this.pendingStartupConflicts.delete(sessionId);\n for (const [pendingId, conflict] of this.pendingStartupConflicts) {\n if (conflict.ownerSessionId === sessionId) this.pendingStartupConflicts.delete(pendingId);\n }\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 await this.refreshNativeAgentSessionClaims();\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 || this.pendingResumePickers?.has(session.id)\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 await this.log(\n `manual fallback sent: session=${session.id} agent=${session.agent} pane=${session.paneId} state=${screen.state} fingerprint=${screen.fingerprint}`,\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 completingSession = this.state.sessions?.[candidate.sessionId];\n if (completingSession) {\n const claimed = await this.handleAgentSessionStarted({\n sessionId: candidate.sessionId,\n agent: completingSession.agent,\n agentSessionId: candidate.agentSessionId,\n cwd: candidate.cwd,\n source: 'Stop',\n });\n if (!claimed.ok) return claimed;\n }\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 async handleAgentSessionStarted(candidate: AgentSessionStartedCandidate): Promise<DaemonResult> {\n if (!validSessionStartCandidate(candidate)) return { ok: false, error: 'invalid agent-session candidate' };\n const session = this.state.sessions?.[candidate.sessionId];\n if (session && session.agent !== candidate.agent) {\n return { ok: false, error: 'agent-session candidate does not match managed session' };\n }\n const owner = this.findAgentSessionOwner(candidate.agent, candidate.agentSessionId, candidate.sessionId);\n if (owner) {\n this.pendingAgentSessionClaims.set(candidate.sessionId, candidate);\n await this.log(\n `agent session conflict: session=${candidate.sessionId} agent=${candidate.agent} agentSession=${candidate.agentSessionId} owner=${owner.id}`,\n );\n setTimeout(() => void this.rejectDuplicateAgentSession(candidate, owner), 100);\n return fail(agentSessionInUse(candidate.sessionId, owner.id));\n }\n if (!session) {\n this.pendingAgentSessionClaims.set(candidate.sessionId, candidate);\n return { ok: true };\n }\n if (session.agentSessionId === candidate.agentSessionId) return { ok: true };\n const updated = { ...session, agentSessionId: candidate.agentSessionId, updatedAt: Date.now() };\n this.state = {\n ...this.state,\n sessions: { ...this.state.sessions, [session.id]: updated },\n updatedAt: Date.now(),\n };\n this.pendingAgentSessionClaims.delete(session.id);\n await this.store.saveState(this.state);\n await this.tmux.writeMetadata(session.sessionName, {\n managed: true,\n sessionId: session.id,\n agent: session.agent,\n cwd: session.cwd,\n agentVersion: session.agentVersion,\n agentSessionId: candidate.agentSessionId,\n }).catch((error) => this.log(`failed to persist agent session claim for ${session.id}: ${errorMessage(error)}`));\n await this.log(\n `agent session claimed: session=${session.id} agent=${session.agent} agentSession=${candidate.agentSessionId}`,\n );\n return { ok: true };\n }\n\n private async refreshNativeAgentSessionClaims(): Promise<void> {\n for (const session of Object.values(this.state.sessions ?? {})) {\n if (session.agentSessionId) continue;\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) continue;\n const agentSessionId = await resolveNativeAgentSessionId(session.agent, pane.pid).catch((error) => {\n void this.log(`failed to resolve native agent session for ${session.id}: ${errorMessage(error)}`);\n return undefined;\n });\n if (!agentSessionId) continue;\n await this.handleAgentSessionStarted({\n sessionId: session.id,\n agent: session.agent,\n agentSessionId,\n cwd: session.cwd,\n source: 'runtime-discovery',\n });\n }\n }\n\n private async waitForInitialAgentSessionClaim(sessionId: string, panePid: number): Promise<DaemonResult> {\n const deadline = Date.now() + 3_500;\n while (Date.now() < deadline) {\n const session = this.state.sessions?.[sessionId];\n if (!session) return { ok: false, error: `session disappeared during startup: ${sessionId}` };\n if (session.agentSessionId) return { ok: true };\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\n const agentSessionId = await resolveNativeAgentSessionId(session.agent, panePid).catch(() => undefined);\n if (agentSessionId) {\n return this.handleAgentSessionStarted({\n sessionId,\n agent: session.agent,\n agentSessionId,\n cwd: session.cwd,\n source: 'startup-discovery',\n });\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n const session = this.state.sessions?.[sessionId];\n if (!session) return fail(new AppError('SESSION_NOT_FOUND', `session disappeared during startup: ${sessionId}`, { sessionId }));\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\n if (session.agentSessionId || this.pendingAgentSessionClaims.has(sessionId)) return { ok: true };\n return fail(new AppError(\n 'AGENT_IDENTITY_TIMEOUT',\n `unable to identify resumed native session: ${sessionId}`,\n { sessionId, agent: session.agent },\n ));\n }\n\n private async startupExitedError(session: ManagedSession, pane?: { exitStatus?: number }): Promise<AppError> {\n const terminalTail = await this.tmux.capture(session.paneId, 40)\n .then((output) => tailScreen(output, 40).slice(-3_000))\n .catch(() => '');\n return new AppError(\n 'AGENT_EXITED_DURING_STARTUP',\n `agent exited during startup: ${session.id}`,\n {\n sessionId: session.id,\n agent: session.agent,\n terminalExcerpt: startupTerminalExcerpt(terminalTail),\n exitStatus: pane?.exitStatus,\n },\n );\n }\n\n private async waitForStartupStability(session: ManagedSession, durationMs: number): Promise<DaemonResult> {\n const deadline = Date.now() + durationMs;\n while (Date.now() < deadline) {\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\n await new Promise((resolve) => setTimeout(resolve, 80));\n }\n return { ok: true };\n }\n\n private findAgentSessionOwner(\n agent: AgentId,\n agentSessionId: string,\n excludeSessionId: string,\n ): Pick<ManagedSession, 'id'> | undefined {\n const persisted = Object.values(this.state.sessions ?? {}).find((candidate) => (\n candidate.id !== excludeSessionId\n && candidate.agent === agent\n && candidate.agentSessionId === agentSessionId\n ));\n if (persisted) return persisted;\n const pending = [...this.pendingAgentSessionClaims.values()].find((candidate) => (\n candidate.sessionId !== excludeSessionId\n && candidate.agent === agent\n && candidate.agentSessionId === agentSessionId\n ));\n return pending ? { id: pending.sessionId } : undefined;\n }\n\n private async rejectDuplicateAgentSession(\n candidate: AgentSessionStartedCandidate,\n owner: Pick<ManagedSession, 'id'>,\n ): Promise<void> {\n const duplicate = this.state.sessions?.[candidate.sessionId];\n if (duplicate) await this.stopSession(duplicate.id).catch((error) => this.log(\n `failed to stop duplicate agent session ${duplicate.id}: ${errorMessage(error)}`,\n ));\n else {\n const sessionName = `${this.sessionName}-${candidate.sessionId}`;\n if (await this.tmux.hasSession(sessionName)) await this.tmux.killSession(sessionName).catch(() => undefined);\n }\n this.pendingAgentSessionClaims.delete(candidate.sessionId);\n if (this.state.boundChatId) {\n await this.gateway?.sendText(\n this.state.boundChatId,\n `${candidate.agent} 原生 session 已由 LCA session「${owner.id}」连接;已停止重复创建的「${candidate.sessionId}」。请用 /sessions 连接「${owner.id}」。`,\n ).catch((error) => this.log(`agent session conflict notification failed: ${errorMessage(error)}`));\n }\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(discover = false): Promise<ManagedSession[]> {\n const previousActive = this.state.activeSessionId;\n const result = await this.reconciler.reconcile(this.state, discover);\n if (!result.changed) return result.liveSessions;\n const activeChanged = result.state.activeSessionId !== previousActive;\n if (result.removedActive) {\n await this.log(\n `session removed: session=${result.removedActive.id} agent=${result.removedActive.agent} pane=${result.removedActive.paneId} wasActive=true nextActive=${result.state.activeSessionId ?? '-'}`,\n );\n }\n if (activeChanged && result.removedActive\n && this.previousScreen?.state !== 'exited' && this.state.boundChatId) {\n await this.gateway?.sendText(\n this.state.boundChatId,\n `${getAgentAdapter(result.removedActive.agent).displayName}/tmux pane 已退出。`,\n ).catch((error) => this.log(`exit notification failed: ${errorMessage(error)}`));\n }\n this.state = result.state;\n for (const sessionId of this.pendingResumePickers.keys()) {\n if (!this.state.sessions?.[sessionId]) this.pendingResumePickers.delete(sessionId);\n }\n for (const [sessionId, conflict] of this.pendingStartupConflicts) {\n if (!this.state.sessions?.[conflict.ownerSessionId]) this.pendingStartupConflicts.delete(sessionId);\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 result.liveSessions;\n }\n\n private async useSession(sessionId: string): Promise<DaemonResult> {\n const session = this.state.sessions?.[sessionId];\n if (!session) return fail(new AppError('SESSION_NOT_FOUND', `unknown session: ${sessionId}`, { sessionId }));\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\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 await this.log(`session activated: session=${session.id} agent=${session.agent} pane=${session.paneId}`);\n return { ok: true, value: session };\n }\n\n private async startRemoteSession(\n request: StartSessionRequest,\n ): Promise<\n | { ok: true; state: 'ready'; session: ManagedSession }\n | { ok: true; state: 'picker'; session: ManagedSession; picker: ResumePickerView }\n | { ok: true; state: 'conflict'; request: StartSessionRequest; owner: ManagedSession }\n | { ok: false; error: DaemonResult }\n > {\n await this.log(\n `remote session create requested: session=${request.sessionId} agent=${request.agent} resume=${request.resume?.mode ?? 'new'}`,\n );\n const started = await this.startSession(request.sessionId, request.cwd, request.agent, request.resume);\n if (!started.ok) {\n await this.log(`remote session create failed: session=${request.sessionId} code=${started.errorCode ?? 'UNKNOWN'}`);\n if (started.errorCode === 'AGENT_SESSION_IN_USE') {\n const ownerSessionId = typeof started.errorContext?.ownerSessionId === 'string'\n ? started.errorContext.ownerSessionId\n : undefined;\n const owner = ownerSessionId ? this.state.sessions?.[ownerSessionId] : undefined;\n if (owner) {\n this.pendingStartupConflicts.set(request.sessionId, { request, ownerSessionId: owner.id });\n return { ok: true, state: 'conflict', request, owner };\n }\n }\n return { ok: false, error: started };\n }\n const selected = await this.useSession(request.sessionId);\n if (!selected.ok) {\n await this.log(`remote session activation failed: session=${request.sessionId} code=${selected.errorCode ?? 'UNKNOWN'}`);\n return { ok: false, error: selected };\n }\n const session = selected.value as ManagedSession;\n if (request.resume?.mode === 'picker') {\n const picker = await this.waitForResumePicker(session);\n if (picker) {\n this.pendingResumePickers.set(session.id, request);\n return { ok: true, state: 'picker', session, picker };\n }\n await this.tmux.preserveOnExit(session.sessionName, false).catch((error) => this.log(\n `failed to disable remain-on-exit after resume picker fallback: session=${session.id} error=${errorMessage(error)}`,\n ));\n }\n return { ok: true, state: 'ready', 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 agentSessionInUse(sessionId: string, ownerSessionId: string): AppError {\n return new AppError(\n 'AGENT_SESSION_IN_USE',\n `agent session is already managed by ${ownerSessionId}`,\n { sessionId, ownerSessionId },\n );\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 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 startRequestFromForm(\n values: Record<string, unknown>,\n): { ok: true; value: StartSessionRequest } | { ok: false; error: string } {\n const sessionId = formString(values[SESSION_CREATE_NAME_FIELD]);\n const agentValue = formString(values[SESSION_CREATE_AGENT_FIELD]);\n const cwd = formString(values[SESSION_CREATE_CWD_FIELD]);\n const resumeMode = formString(values[SESSION_CREATE_RESUME_FIELD]) || 'new';\n if (!sessionId) return { ok: false, error: '请填写 Session 名称。' };\n const agent = normalizeAgentId(agentValue);\n if (!agent) return { ok: false, error: '请选择有效的 Agent:codex、traex 或 claude。' };\n if (!cwd) return { ok: false, error: '请填写绝对工作目录。' };\n let resume: AgentResume | undefined;\n if (resumeMode === 'last') {\n return { ok: false, error: '飞书已不再支持“恢复上次会话”,请重新打开表单并使用 Resume Picker。' };\n }\n if (resumeMode === 'picker') resume = { mode: 'picker' };\n else if (resumeMode !== 'new') {\n return { ok: false, error: '无法识别启动方式,请重新打开新建 Session 表单。' };\n }\n return { ok: true, value: { sessionId, agent, cwd, resume } };\n}\n\nfunction formString(value: unknown): string {\n if (typeof value === 'string') return value.trim();\n if (value && typeof value === 'object' && typeof (value as Record<string, unknown>).value === 'string') {\n return ((value as Record<string, unknown>).value as string).trim();\n }\n return '';\n}\n\nfunction remoteStartSuccess(session: ManagedSession): string {\n return `已启动并连接 ${getAgentAdapter(session.agent).displayName} session「${session.id}」。`;\n}\n\nfunction larkStartupError(result: DaemonResult, request: Pick<StartSessionRequest, 'sessionId' | 'agent'>): LarkActionResult {\n const failure = sessionStartupFailure(result, request);\n return failure\n ? { type: 'session-start-failed', content: `${failure.agent} 启动失败。`, failure }\n : { type: 'error', content: remoteError(result) };\n}\n\nfunction remoteError(result: DaemonResult): string {\n if (result.ok) return '操作已完成。';\n const context = result.errorContext ?? {};\n const sessionId = typeof context.sessionId === 'string' ? context.sessionId : '该名称';\n switch (result.errorCode) {\n case 'SESSION_EXISTS': return `无法启动 session「${sessionId}」:该 session 已在运行。请换一个名称,或用 /sessions 连接现有 session。`;\n case 'AGENT_SESSION_IN_USE': {\n const ownerSessionId = typeof context.ownerSessionId === 'string' ? context.ownerSessionId : '现有 session';\n return `无法启动 session「${sessionId}」:该 Agent 原生 session 已由 LCA session「${ownerSessionId}」连接。请用 /sessions 连接现有 session。`;\n }\n case 'AGENT_EXITED_DURING_STARTUP': {\n const agent = typeof context.agent === 'string' ? context.agent : 'Agent';\n const exitStatus = typeof context.exitStatus === 'number' ? `(退出码 ${context.exitStatus})` : '';\n const excerpt = typeof context.terminalExcerpt === 'string'\n ? context.terminalExcerpt\n : 'Agent 未输出可用错误信息。';\n return `无法启动 session「${sessionId}」:${agent} 启动后立即退出${exitStatus}。\\n\\n原始错误:\\n${excerpt}`;\n }\n case 'AGENT_IDENTITY_TIMEOUT':\n return `无法恢复 session「${sessionId}」:Agent 仍在运行,但未能确认原生 session ID。请重试或启动新会话。`;\n case 'INVALID_SESSION_NAME': return 'Session 名称无效:只能包含字母、数字、下划线和短横线,长度为 1–40 个字符。';\n case 'INVALID_CWD': return `工作目录不可用:${typeof context.cwd === 'string' ? context.cwd : '请填写本机存在的绝对路径'}。`;\n case 'BINARY_NOT_FOUND': return `找不到 Agent 命令:${typeof context.binary === 'string' ? context.binary : '请检查安装与 PATH'}。`;\n case 'INVALID_OPTIONS':\n case 'INVALID_RESUME': return typeof context.reason === 'string' ? context.reason : '启动参数无效,请检查后重试。';\n case 'START_FAILED': return `无法启动 session「${sessionId}」。请检查工作目录、Agent 安装,或在本机运行 lca logs 查看日志。`;\n default: return '操作失败,请稍后重试;可在本机运行 lca status 和 lca logs 检查。';\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';\nimport { normalizeAgentId } from '../agents/types.js';\n\nexport class AppStore {\n constructor(readonly paths: AppPaths) {}\n\n async ensure(): Promise<void> {\n await mkdir(this.paths.root, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.logsDir, { recursive: true, mode: 0o700 });\n await Promise.all([\n chmod(this.paths.root, 0o700),\n chmod(this.paths.runtimeDir, 0o700),\n chmod(this.paths.logsDir, 0o700),\n ]);\n }\n\n async loadConfig(): Promise<AppConfig | undefined> {\n const config = await readJson<LegacyConfig>(this.paths.config);\n if (!config) return undefined;\n const binaries = config.agentBinaries ?? {};\n return {\n tenant: config.tenant,\n appId: config.appId,\n tmuxBinary: config.tmuxBinary,\n agentBinaries: {\n codex: binaries.codex ?? 'codex',\n traex: binaries.traex ?? binaries['trae-cli'] ?? 'trae-cli',\n claude: binaries.claude ?? binaries['claude-code'] ?? 'claude',\n },\n pollIntervalMs: config.pollIntervalMs,\n };\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 const state = await readJson<LegacyState>(this.paths.state);\n if (!state) return emptyState();\n const sessions = Object.fromEntries(Object.entries(state.sessions ?? {}).flatMap(([id, session]) => {\n const agent = normalizeAgentId(session.agent);\n return agent ? [[id, { ...session, agent }]] : [];\n }));\n return { ...state, sessions };\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\ninterface LegacyConfig extends Omit<AppConfig, 'agentBinaries'> {\n agentBinaries: Partial<Record<'codex' | 'traex' | 'claude' | 'trae-cli' | 'claude-code', string>>;\n}\n\ninterface LegacyState extends Omit<SessionState, 'sessions'> {\n sessions?: Record<string, Omit<NonNullable<SessionState['sessions']>[string], 'agent'> & { agent: string }>;\n}\n\nexport function createBindCode(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function hashBindCode(code: string): string {\n const salt = randomBytes(16);\n const digest = scryptSync(code, salt, 32);\n return `${salt.toString('base64url')}.${digest.toString('base64url')}`;\n}\n\nexport function verifyBindCode(code: string, encoded: string): boolean {\n const [saltText, digestText] = encoded.split('.');\n if (!saltText || !digestText) return false;\n const expected = Buffer.from(digestText, 'base64url');\n const actual = scryptSync(code, Buffer.from(saltText, 'base64url'), expected.length);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n","import type { AgentId } from '../agents/types.js';\n\nexport type Tenant = 'feishu' | 'lark';\n\nexport interface AppConfig {\n tenant: Tenant;\n appId: string;\n tmuxBinary: string;\n agentBinaries: Record<AgentId, string>;\n pollIntervalMs: number;\n}\n\nexport interface AppSecrets {\n appSecret: string;\n callbackSecret: string;\n}\n\nexport interface ManagedSession {\n id: string;\n agent: AgentId;\n sessionName: string;\n paneId: string;\n cwd: string;\n agentVersion: string;\n agentSessionId?: string;\n updatedAt: number;\n}\n\nexport interface SessionState {\n schemaVersion: 2;\n ownerOpenId?: string;\n boundChatId?: string;\n autoBindDisabled?: boolean;\n activeSessionId?: string;\n sessions?: Record<string, ManagedSession>;\n bindCodeHash?: string;\n bindCodeExpiresAt?: number;\n updatedAt: number;\n}\n\nexport function emptyState(now = Date.now()): SessionState {\n return { schemaVersion: 2, sessions: {}, updatedAt: now };\n}\n","import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nexport async function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown, mode = 0o600): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await chmod(parent, 0o700).catch(() => undefined);\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;\n const file = await open(temporary, 'w', mode);\n try {\n await file.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await file.sync();\n } finally {\n await file.close();\n }\n await rename(temporary, path);\n await chmod(path, mode);\n}\n","import type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'traex', 'claude'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\nexport type LegacyAgentId = 'trae-cli' | 'claude-code';\n\nexport function normalizeAgentId(value: string): AgentId | undefined {\n if (value === 'trae-cli') return 'traex';\n if (value === 'claude-code') return 'claude';\n return (AGENT_IDS as readonly string[]).includes(value) ? value as AgentId : undefined;\n}\n\nexport type AgentResume =\n | { mode: 'picker'; all?: boolean }\n | { mode: 'last' }\n | { mode: 'session'; sessionId: string };\n\nexport interface ResumeOptions {\n resume?: boolean | string;\n resumeLast?: boolean;\n resumeAll?: boolean;\n}\n\nexport interface TurnCompleteCandidate {\n sessionId: string;\n eventId: string;\n agentSessionId: string;\n cwd: string;\n lastAssistantMessage: string;\n}\n\nexport interface AgentSessionStartedCandidate {\n sessionId: string;\n agent: AgentId;\n agentSessionId: string;\n cwd: string;\n source?: string;\n}\n\nexport interface LaunchInput {\n resume?: AgentResume;\n stopHookCommand: string;\n}\n\nexport interface AgentAdapter {\n id: AgentId;\n displayName: string;\n groupOrder: number;\n binary(config: AppConfig): string;\n versionArgs: readonly string[];\n buildLaunchArgs(input: LaunchInput): string[];\n detectScreen(raw: string, paneAlive: boolean, cursor?: { x: number; y: number }): ScreenDetection;\n}\n","export const APP_ERROR_CODES = [\n 'SESSION_EXISTS',\n 'AGENT_SESSION_IN_USE',\n 'AGENT_EXITED_DURING_STARTUP',\n 'AGENT_IDENTITY_TIMEOUT',\n 'SESSION_NOT_FOUND',\n 'INVALID_SESSION_NAME',\n 'NOT_INITIALIZED',\n 'INVALID_CWD',\n 'BINARY_NOT_FOUND',\n 'INVALID_OPTIONS',\n 'INVALID_RESUME',\n 'START_FAILED',\n 'DAEMON_UNAVAILABLE',\n 'DAEMON_UNRESPONSIVE',\n 'REQUEST_TIMEOUT',\n 'UNKNOWN',\n] as const;\n\nexport type AppErrorCode = typeof APP_ERROR_CODES[number];\n\nexport type ErrorContext = Record<string, string | number | boolean | undefined>;\n\nexport class AppError extends Error {\n readonly code: AppErrorCode;\n readonly context: ErrorContext;\n\n constructor(\n code: AppErrorCode,\n message: string,\n context: ErrorContext = {},\n options: { cause?: unknown } = {},\n ) {\n super(message, options);\n this.name = 'AppError';\n this.code = code;\n this.context = context;\n }\n}\n\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n\nexport function isAppErrorCode(value: unknown): value is AppErrorCode {\n return typeof value === 'string' && APP_ERROR_CODES.includes(value as AppErrorCode);\n}\n\nexport function asAppError(\n error: unknown,\n code: AppErrorCode = 'UNKNOWN',\n context: ErrorContext = {},\n): AppError {\n if (isAppError(error)) {\n if (Object.keys(context).length === 0) return error;\n return new AppError(error.code, error.message, { ...context, ...error.context }, { cause: error });\n }\n return new AppError(code, errorMessage(error), context, { cause: error });\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function serializeAppError(error: unknown): {\n error: string;\n errorCode?: AppErrorCode;\n errorContext?: ErrorContext;\n} {\n if (!isAppError(error)) return { error: errorMessage(error) };\n const errorContext = Object.fromEntries(\n Object.entries(error.context).filter(([, value]) => value !== undefined),\n );\n return {\n error: error.message,\n errorCode: error.code,\n ...(Object.keys(errorContext).length > 0 ? { errorContext } : {}),\n };\n}\n\nexport function systemErrorCode(error: unknown): string | undefined {\n return error instanceof Error && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined;\n}\n","import { stat } from 'node:fs/promises';\nimport { isAbsolute } from 'node:path';\nimport type { AgentId, AgentResume } from '../agents/types.js';\nimport { AppError } from '../core/errors.js';\n\nexport interface StartSessionRequest {\n sessionId: string;\n agent: AgentId;\n cwd: string;\n resume?: AgentResume;\n}\n\nexport async function validateStartSessionRequest(request: StartSessionRequest): Promise<StartSessionRequest> {\n if (!validSessionId(request.sessionId)) {\n throw new AppError(\n 'INVALID_SESSION_NAME',\n 'session name must use letters, digits, underscore, or dash',\n { sessionId: request.sessionId },\n );\n }\n if (!isAbsolute(request.cwd)) {\n throw new AppError('INVALID_CWD', 'working directory must be absolute', { cwd: request.cwd });\n }\n const info = await stat(request.cwd).catch((error) => {\n throw new AppError('INVALID_CWD', `working directory is unavailable: ${request.cwd}`, { cwd: request.cwd }, { cause: error });\n });\n if (!info.isDirectory()) {\n throw new AppError('INVALID_CWD', `working directory is not a directory: ${request.cwd}`, { cwd: request.cwd });\n }\n if (request.resume?.mode === 'session' && !request.resume.sessionId.trim()) {\n throw new AppError('INVALID_RESUME', 'resume session id must not be empty', {\n reason: '恢复历史会话时必须提供 session ID',\n });\n }\n return request;\n}\n\nexport function validSessionId(value: string): boolean {\n return /^[a-zA-Z0-9_-]{1,40}$/.test(value);\n}\n","import type { AgentId } from '../agents/types.js';\nimport type { DaemonResult } from '../daemon/protocol.js';\n\nexport interface SessionStartupFailure {\n sessionId: string;\n agent: AgentId;\n exitStatus?: number;\n terminalExcerpt: string;\n}\n\nexport function sessionStartupFailure(\n result: DaemonResult,\n fallback: Pick<SessionStartupFailure, 'sessionId' | 'agent'>,\n): SessionStartupFailure | undefined {\n if (result.ok || result.errorCode !== 'AGENT_EXITED_DURING_STARTUP') return undefined;\n const context = result.errorContext ?? {};\n return {\n sessionId: typeof context.sessionId === 'string' ? context.sessionId : fallback.sessionId,\n agent: fallback.agent,\n ...(typeof context.exitStatus === 'number' ? { exitStatus: context.exitStatus } : {}),\n terminalExcerpt: typeof context.terminalExcerpt === 'string' && context.terminalExcerpt.trim()\n ? context.terminalExcerpt\n : 'Agent 未输出可用错误信息。',\n };\n}\n","import type { AgentId } from '../agents/types.js';\nimport type { ManagedSession, SessionState } from '../core/model.js';\nimport type { TmuxInspectResult, TmuxPane, TmuxSessionMetadata } from '../tmux/types.js';\nimport { validSessionId } from './start-request.js';\n\nexport interface SessionTmux {\n inspectStatus(paneId: string): Promise<TmuxInspectResult>;\n inspectSession(sessionName: string): Promise<TmuxInspectResult>;\n listSessions(prefix: string): Promise<TmuxPane[]>;\n readMetadata(sessionName: string): Promise<TmuxSessionMetadata | undefined>;\n writeMetadata(sessionName: string, metadata: TmuxSessionMetadata): Promise<void>;\n}\n\nexport interface ReconcileResult {\n state: SessionState;\n liveSessions: ManagedSession[];\n removedActive?: ManagedSession;\n changed: boolean;\n}\n\nexport class SessionReconciler {\n private readonly misses = new Map<string, number>();\n\n constructor(\n private readonly tmux: SessionTmux,\n private readonly sessionPrefix = 'lark-coding-assistant',\n private readonly missingThreshold = 3,\n private readonly log: (message: string) => Promise<void> = async () => undefined,\n private readonly resolveAgentVersion: (agent: AgentId) => Promise<string> = async () => 'unknown',\n ) {}\n\n async reconcile(input: SessionState, discover = false): Promise<ReconcileResult> {\n const sessions = { ...input.sessions };\n let changed = false;\n for (const [id, session] of Object.entries(sessions)) {\n const result = await this.confirm(session);\n if (result.status === 'unavailable') {\n await this.log(`tmux inspection unavailable for ${id}: ${errorMessage(result.error)}`);\n continue;\n }\n if (result.status === 'live') {\n this.misses.delete(id);\n if (result.pane.paneId !== session.paneId || result.pane.sessionName !== session.sessionName) {\n sessions[id] = { ...session, paneId: result.pane.paneId, sessionName: result.pane.sessionName, updatedAt: Date.now() };\n changed = true;\n }\n continue;\n }\n const misses = (this.misses.get(id) ?? 0) + 1;\n this.misses.set(id, misses);\n if (misses < this.missingThreshold) continue;\n delete sessions[id];\n this.misses.delete(id);\n changed = true;\n }\n\n if (discover) {\n changed = await this.discover(sessions) || changed;\n }\n\n const activeSessionId = input.activeSessionId && sessions[input.activeSessionId]\n ? input.activeSessionId\n : Object.keys(sessions)[0];\n if (activeSessionId !== input.activeSessionId) changed = true;\n const removedActive = input.activeSessionId && !sessions[input.activeSessionId]\n ? input.sessions?.[input.activeSessionId]\n : undefined;\n const state = changed\n ? { ...input, sessions, activeSessionId, updatedAt: Date.now() }\n : input;\n return { state, liveSessions: Object.values(sessions), removedActive, changed };\n }\n\n private async confirm(session: ManagedSession): Promise<TmuxInspectResult> {\n const direct = await this.tmux.inspectStatus(session.paneId);\n if (direct.status === 'live' || direct.status === 'unavailable') return direct;\n const byName = await this.tmux.inspectSession(session.sessionName);\n if (byName.status === 'live' || byName.status === 'unavailable') return byName;\n return byName.status === 'dead' ? byName : direct;\n }\n\n private async discover(sessions: Record<string, ManagedSession>): Promise<boolean> {\n let panes: TmuxPane[];\n try {\n panes = await this.tmux.listSessions(`${this.sessionPrefix}-`);\n } catch (error) {\n await this.log(`tmux session discovery unavailable: ${errorMessage(error)}`);\n return false;\n }\n let changed = false;\n const seen = new Set<string>();\n for (const pane of panes) {\n if (seen.has(pane.sessionName) || pane.dead) continue;\n seen.add(pane.sessionName);\n const registered = Object.values(sessions).find((session) => session.sessionName === pane.sessionName);\n if (registered) {\n if (registered.paneId !== pane.paneId) {\n sessions[registered.id] = { ...registered, paneId: pane.paneId, updatedAt: Date.now() };\n changed = true;\n }\n if (!await this.tmux.readMetadata(pane.sessionName)) {\n await this.writeMetadata(pane, registered).catch((error) => this.log(\n `failed to backfill tmux metadata for ${registered.id}: ${errorMessage(error)}`,\n ));\n }\n continue;\n }\n\n const metadata = await this.tmux.readMetadata(pane.sessionName);\n const recovered = metadata\n ? this.fromMetadata(pane, metadata)\n : await this.fromLegacy(pane);\n if (!recovered || sessions[recovered.id]) continue;\n if (!metadata) {\n try {\n await this.writeMetadata(pane, recovered);\n } catch (error) {\n await this.log(`failed to persist recovered tmux metadata for ${recovered.id}: ${errorMessage(error)}`);\n continue;\n }\n }\n sessions[recovered.id] = recovered;\n this.misses.delete(recovered.id);\n changed = true;\n await this.log(`recovered managed session ${recovered.id} from tmux`);\n }\n return changed;\n }\n\n private fromMetadata(pane: TmuxPane, metadata: TmuxSessionMetadata): ManagedSession | undefined {\n if (!validSessionId(metadata.sessionId)\n || pane.sessionName !== `${this.sessionPrefix}-${metadata.sessionId}`) return undefined;\n return {\n id: metadata.sessionId,\n agent: metadata.agent,\n sessionName: pane.sessionName,\n paneId: pane.paneId,\n cwd: metadata.cwd,\n agentVersion: metadata.agentVersion,\n agentSessionId: metadata.agentSessionId,\n updatedAt: Date.now(),\n };\n }\n\n private async fromLegacy(pane: TmuxPane): Promise<ManagedSession | undefined> {\n const id = pane.sessionName.startsWith(`${this.sessionPrefix}-`)\n ? pane.sessionName.slice(this.sessionPrefix.length + 1)\n : '';\n const agent = inferLegacyAgent(pane);\n if (!validSessionId(id) || !agent) return undefined;\n const agentVersion = await this.resolveAgentVersion(agent).catch(() => 'unknown');\n return {\n id,\n agent,\n sessionName: pane.sessionName,\n paneId: pane.paneId,\n cwd: pane.cwd,\n agentVersion,\n updatedAt: Date.now(),\n };\n }\n\n private writeMetadata(pane: TmuxPane, session: ManagedSession): Promise<void> {\n return this.tmux.writeMetadata(pane.sessionName, {\n managed: true,\n sessionId: session.id,\n agent: session.agent,\n cwd: session.cwd,\n agentVersion: session.agentVersion,\n agentSessionId: session.agentSessionId,\n });\n }\n}\n\nexport function inferLegacyAgent(pane: Pick<TmuxPane, 'startCommand' | 'currentCommand'>): AgentId | undefined {\n const command = `${pane.startCommand}\\n${pane.currentCommand}`;\n if (/(?:^|[\\s/'\"])(?:trae-cli|traex)(?:[\\s/'\"]|$)/i.test(command)) return 'traex';\n if (/(?:^|[\\s/'\"])claude(?:[\\s/'\"]|$)/i.test(command)) return 'claude';\n if (/(?:^|[\\s/'\"])codex(?:[\\s/'\"]|$)/i.test(command)) return 'codex';\n return undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { AgentId } from '../agents/types.js';\nimport { runFile } from '../platform/process.js';\n\nconst UUID = '[0-9a-fA-F-]{32,36}';\n\nexport async function resolveNativeAgentSessionId(\n agent: AgentId,\n pid: number,\n home = homedir(),\n): Promise<string | undefined> {\n if (!Number.isInteger(pid) || pid <= 0) return undefined;\n if (agent === 'traex') {\n const peer = await resolveTraexPeer(pid, home);\n if (peer) return peer;\n return matchPath(\n await processOpenFiles(pid),\n new RegExp(`/\\\\.trae/cli/sessions/.+/rollout-[^/]+-(${UUID})\\\\.jsonl(?:\\\\.lock)?$`),\n );\n }\n const openFiles = await processOpenFiles(pid);\n if (agent === 'codex') return matchPath(openFiles, new RegExp(`/\\\\.codex/thread-writer-locks/(${UUID})\\\\.lock$`));\n return matchPath(openFiles, new RegExp(`/\\\\.claude/projects/[^/]+/(${UUID})\\\\.jsonl$`));\n}\n\nasync function resolveTraexPeer(pid: number, home: string): Promise<string | undefined> {\n const directory = join(home, '.trae', 'cli', 'session-peers');\n const entries = await readdir(directory).catch(() => [] as string[]);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) continue;\n const value = await readFile(join(directory, entry), 'utf8').then(JSON.parse).catch(() => undefined) as unknown;\n if (!value || typeof value !== 'object') continue;\n const peer = value as Record<string, unknown>;\n if (peer.pid === pid && typeof peer.threadId === 'string' && peer.threadId) return peer.threadId;\n }\n return undefined;\n}\n\nasync function processOpenFiles(pid: number): Promise<string[]> {\n const result = await runFile('lsof', ['-Fn', '-p', String(pid)], { timeoutMs: 3_000 }).catch(() => undefined);\n if (!result) return [];\n return result.stdout.split('\\n').filter((line) => line.startsWith('n')).map((line) => line.slice(1));\n}\n\nfunction matchPath(paths: string[], pattern: RegExp): string | undefined {\n for (const path of paths) {\n const match = path.match(pattern);\n if (match?.[1]) return match[1];\n }\n return 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, TmuxInspectResult, TmuxPane, TmuxSessionMetadata } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nconst PANE_FORMAT = '#{session_name}\\t#{pane_id}\\t#{pane_pid}\\t#{pane_start_command}\\t#{pane_current_command}\\t#{pane_current_path}\\t#{pane_dead}\\t#{pane_dead_status}\\t#{cursor_x}\\t#{cursor_y}';\nconst METADATA_OPTIONS = {\n managed: '@lca-managed',\n sessionId: '@lca-session-id',\n agent: '@lca-agent',\n cwd: '@lca-cwd',\n agentVersion: '@lca-agent-version',\n agentSessionId: '@lca-agent-session-id',\n} as const;\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 const createArgs = [\n 'new-session', '-d', '-s', options.sessionName, '-c', options.cwd,\n '-x', '120', '-y', '40', command,\n ];\n if (options.preserveOnExit) {\n createArgs.push(';', 'set-option', '-w', '-t', `=${options.sessionName}:`, 'remain-on-exit', 'on');\n }\n await runFile(this.binary, createArgs);\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 const result = await this.inspectStatus(paneId);\n return result.status === 'live' || result.status === 'dead' ? result.pane : undefined;\n }\n\n async inspectStatus(paneId: string): Promise<TmuxInspectResult> {\n assertSafeTmuxTarget(paneId);\n try {\n const { stdout } = await runFile(this.binary, [\n 'display-message', '-p', '-t', paneId, PANE_FORMAT,\n ]);\n if (!stdout.trim()) return { status: 'missing' };\n const pane = parsePane(stdout.trim());\n if (!pane) return { status: 'unavailable', error: new Error('invalid tmux pane response') };\n return pane.dead ? { status: 'dead', pane } : { status: 'live', pane };\n } catch (error) {\n return tmuxTargetMissing(error) ? { status: 'missing' } : { status: 'unavailable', error };\n }\n }\n\n async inspectSession(sessionName: string): Promise<TmuxInspectResult> {\n try {\n const pane = await this.findBySession(sessionName);\n if (!pane) return { status: 'missing' };\n return pane.dead ? { status: 'dead', pane } : { status: 'live', pane };\n } catch (error) {\n return tmuxTargetMissing(error) ? { status: 'missing' } : { status: 'unavailable', error };\n }\n }\n\n async listSessions(prefix: string): Promise<TmuxPane[]> {\n const { stdout } = await runFile(this.binary, ['list-panes', '-a', '-F', PANE_FORMAT]);\n return stdout.split('\\n')\n .map(parsePane)\n .filter((pane): pane is TmuxPane => Boolean(pane?.sessionName.startsWith(prefix)));\n }\n\n async writeMetadata(sessionName: string, metadata: TmuxSessionMetadata): Promise<void> {\n const values: Partial<Record<keyof typeof METADATA_OPTIONS, string>> = {\n managed: '1',\n sessionId: metadata.sessionId,\n agent: metadata.agent,\n cwd: metadata.cwd,\n agentVersion: metadata.agentVersion,\n agentSessionId: metadata.agentSessionId,\n };\n for (const [key, option] of Object.entries(METADATA_OPTIONS) as [keyof typeof METADATA_OPTIONS, string][]) {\n const value = values[key];\n if (value === undefined) {\n await runFile(this.binary, ['set-option', '-u', '-t', sessionName, option]).catch(() => undefined);\n } else {\n await runFile(this.binary, ['set-option', '-t', sessionName, option, value]);\n }\n }\n }\n\n async readMetadata(sessionName: string): Promise<TmuxSessionMetadata | undefined> {\n const values: Partial<Record<keyof typeof METADATA_OPTIONS, string>> = {};\n for (const [key, option] of Object.entries(METADATA_OPTIONS) as [keyof typeof METADATA_OPTIONS, string][]) {\n const result = await runFile(this.binary, ['show-options', '-t', sessionName, '-v', option]).catch(() => undefined);\n if (!result) {\n if (key === 'agentSessionId') continue;\n return undefined;\n }\n values[key] = result.stdout.trim();\n }\n if (values.managed !== '1' || !values.sessionId || !values.cwd || !values.agentVersion\n || (values.agent !== 'codex' && values.agent !== 'traex' && values.agent !== 'claude')) return undefined;\n return {\n managed: true,\n sessionId: values.sessionId,\n agent: values.agent,\n cwd: values.cwd,\n agentVersion: values.agentVersion,\n agentSessionId: values.agentSessionId || 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 async preserveOnExit(sessionName: string, enabled: boolean): Promise<void> {\n await runFile(this.binary, [\n 'set-option', '-w', '-t', `=${sessionName}:`, 'remain-on-exit', enabled ? 'on' : 'off',\n ]);\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|PPage|NPage|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 try {\n await runFile(this.binary, ['kill-session', '-t', `=${sessionName}`]);\n } catch (error) {\n if (!tmuxTargetMissing(error)) throw error;\n }\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, startCommand, currentCommand, cwd, deadText, exitStatusText, 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) || !startCommand || !currentCommand || (!cwd && deadText !== '1')\n || !Number.isInteger(cursorX) || !Number.isInteger(cursorY)) return undefined;\n const exitStatus = exitStatusText === '' ? undefined : Number(exitStatusText);\n return {\n sessionName, paneId, pid, startCommand, currentCommand, cwd: cwd || '/', dead: deadText === '1',\n exitStatus: Number.isInteger(exitStatus) ? exitStatus : undefined,\n cursorX, cursorY,\n };\n}\n\nfunction tmuxTargetMissing(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n const stderr = error && typeof error === 'object' && 'stderr' in error ? String(error.stderr) : '';\n return /can't find (?:pane|session|window)|no such (?:pane|session|window)|(?:pane|session|window) not found/i.test(`${message}\\n${stderr}`);\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: 'traex',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n customInputControls: [/^(?:other|none of the above|add notes)$/i],\n};\n\nexport const CLAUDE_DIALECT: TerminalDialect = {\n id: 'claude',\n headerPatterns: [\n ...commonHeaders,\n /^\\s*(?:←\\s*)?[☐☑☒]\\s+.+?(?:\\s+✔\\s+Submit\\s*→)?\\s*$/i,\n /^\\s*[☐☑☒]\\s+\\S/,\n ],\n footerPatterns: commonFooters,\n footerlessChoiceHeaders: [/^ready to submit your answers\\?$/i],\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type(?:\\s+.+)?|add notes)\\.?$/i, /^notes:\\s*press\\s+n\\s+to\\s+add\\b/i],\n directInputControls: [/^type(?:\\s+.+)?\\.?$/i],\n customInputValuePattern: /^type\\s+(.+?)\\.?$/i,\n chatControls: [/^chat about this$/i],\n};\n","import type { AgentResume, ResumeOptions } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nexport function resolveResumeOption(options: ResumeOptions): AgentResume | undefined {\n const modes = [options.resume !== undefined, options.resumeLast, options.resumeAll].filter(Boolean).length;\n if (modes > 1) {\n throw new AppError(\n 'INVALID_RESUME',\n '--resume, --resume-last, and --resume-all cannot be used together',\n { reason: '--resume、--resume-last 和 --resume-all 不能同时使用' },\n );\n }\n if (options.resumeLast) return { mode: 'last' };\n if (options.resumeAll) return { mode: 'picker', all: true };\n if (typeof options.resume === 'string') return { mode: 'session', sessionId: options.resume };\n if (options.resume) return { mode: 'picker' };\n return undefined;\n}\n\nexport function resumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['resume', '--last'];\n if (resume.mode === 'session') return ['resume', resume.sessionId];\n return resume.all ? ['resume', '--all'] : ['resume'];\n}\n\nexport function claudeResumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['--continue'];\n if (resume.mode === 'session') return ['--resume', resume.sessionId];\n return ['--resume'];\n}\n","export function codexStyleStopHookArgs(command: string): string[] {\n const hook = `{hooks=[{type=\"command\",command=${JSON.stringify(command)},timeout=5}]}`;\n return [\n '--dangerously-bypass-hook-trust',\n '-c', `hooks.SessionStart=[${hook}]`,\n '-c', `hooks.Stop=[${hook}]`,\n ];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n SessionStart: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n Stop: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n },\n })];\n}\n","import { detectCodexScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const codexAdapter: AgentAdapter = {\n id: 'codex',\n displayName: 'codex',\n groupOrder: 10,\n binary: (config) => config.agentBinaries.codex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectCodexScreen,\n};\n","import { detectTraeScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const traeCliAdapter: AgentAdapter = {\n id: 'traex',\n displayName: 'traex',\n groupOrder: 20,\n binary: (config) => config.agentBinaries.traex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectTraeScreen,\n};\n","import { detectClaudeScreen } from '../screen/detector.js';\nimport { claudeResumeArgs } from './resume.js';\nimport { claudeStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: 'claude',\n displayName: 'claude',\n groupOrder: 30,\n binary: (config) => config.agentBinaries.claude,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { normalizeAgentId, type AgentAdapter, type AgentId } from './types.js';\n\nexport { normalizeAgentId } from './types.js';\n\nconst adapters = new Map<AgentId, AgentAdapter>([\n [codexAdapter.id, codexAdapter],\n [traeCliAdapter.id, traeCliAdapter],\n [claudeCodeAdapter.id, claudeCodeAdapter],\n]);\n\nexport function getAgentAdapter(id: AgentId): AgentAdapter {\n const adapter = adapters.get(id);\n if (!adapter) throw new Error(`unsupported coding agent: ${id}`);\n return adapter;\n}\n\nexport function listAgentAdapters(): AgentAdapter[] {\n return [...adapters.values()].sort((left, right) => left.groupOrder - right.groupOrder);\n}\n\nexport function isAgentId(value: string): value is AgentId {\n return normalizeAgentId(value) === value;\n}\n","import type { AgentId, AgentSessionStartedCandidate, TurnCompleteCandidate } from './types.js';\n\nexport function normalizeSessionStartEvent(\n bridgeSessionId: string,\n agent: AgentId,\n value: unknown,\n): AgentSessionStartedCandidate | undefined {\n if (!bridgeSessionId || !value || typeof value !== 'object') return undefined;\n const event = value as Record<string, unknown>;\n if (event.hook_event_name !== 'SessionStart') return undefined;\n const agentSessionId = stringField(event, 'session_id');\n const cwd = stringField(event, 'cwd');\n if (!agentSessionId || !cwd) return undefined;\n return { sessionId: bridgeSessionId, agent, agentSessionId, cwd, source: stringField(event, 'source') };\n}\n\nexport function validSessionStartCandidate(value: unknown): value is AgentSessionStartedCandidate {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return typeof candidate.sessionId === 'string' && candidate.sessionId.length > 0\n && (candidate.agent === 'codex' || candidate.agent === 'traex' || candidate.agent === 'claude')\n && typeof candidate.agentSessionId === 'string' && candidate.agentSessionId.length > 0\n && typeof candidate.cwd === 'string' && candidate.cwd.length > 0;\n}\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 type { ResumePickerView } from '../screen/resume-picker.js';\nimport type { StartSessionRequest } from '../session/start-request.js';\nimport type { SessionStartupFailure } from '../session/startup-failure.js';\nimport { ActionSigner, type SignedAction } from './action-signing.js';\nimport {\n CHOICE_FORM_SUBMIT_ACTION,\n choiceCard,\n choiceFormSubmitName,\n expiredActionCard,\n handledActionCard,\n interactionInputCard,\n manualControlCard,\n MANUAL_SUBMIT_ACTION,\n MANUAL_TYPE_ACTION,\n SESSION_CREATE_SUBMIT_ACTION,\n sessionCreateCard,\n sessionCreateFailureCard,\n sessionCreateOpenedCard,\n sessionCreateProgressCard,\n sessionCreateResultCard,\n sessionStartupFailureCard,\n type ManualControlView,\n sessionPickerCard,\n resumePickerCard,\n startupConflictCard,\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 onResumePickerDeliveryFailure?(session: ManagedSession): Promise<void>;\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 | { type: 'session-create-form'; content: string; sessions?: ManagedSession[]; activeSessionId?: string }\n | { type: 'session-created'; content: string; session: ManagedSession }\n | { type: 'session-start-failed'; content: string; failure: SessionStartupFailure }\n | { type: 'resume-picker'; content: string; session: ManagedSession; picker: ResumePickerView }\n | { type: 'startup-conflict'; content: string; request: StartSessionRequest; owner: ManagedSession }\n | {\n type: 'session-picker'; content: string; sessions: ManagedSession[]; activeSessionId?: string;\n confirmingStopSessionId?: string;\n };\n\nexport interface RemoteGateway {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n startProcessing(message: NormalizedMessage): 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 sendResumePicker(chatId: string, session: ManagedSession, picker: ResumePickerView): Promise<unknown>;\n sendStartupConflict(chatId: string, request: StartSessionRequest, owner: ManagedSession): Promise<unknown>;\n sendSessionCreate(chatId: string): Promise<unknown>;\n sendSessionStartupFailure(chatId: string, failure: SessionStartupFailure): 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 private readonly processingReactions = new Map<string, {\n messageId: string;\n reactionId: string;\n timer: ReturnType<typeof setTimeout>;\n generation: number;\n }>();\n private readonly processingGenerations = new Map<string, number>();\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 console.error(`[lca] card action received: tag=${event.action.tag ?? 'unknown'} name=${event.action.name ?? '-'} message=${event.messageId}`);\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) {\n if (this.formActionsInFlight.has(event.messageId)) {\n return { toast: { type: 'warning', content: '操作正在处理中,请稍候。' } };\n }\n console.error(`[lca] card action rejected: signature or mapping invalid for message=${event.messageId}`);\n void this.markExpiredCard(event);\n return { toast: { type: 'error', content: '卡片或按钮已失效,请获取最新卡片。' } };\n }\n if (event.action.formValue || action.kind === 'manual' || action.kind === 'session-create'\n || action.kind === 'startup-conflict' || action.kind === 'resume-picker'\n || action.kind === 'session-stop' || action.kind === 'session-start-error') {\n if (this.formActionsInFlight.has(event.messageId)) {\n return { toast: { type: 'warning', content: inFlightToast(action) } };\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: progressToast(action) } };\n }\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') return { toast: result };\n if (result.type === 'session-create-form') {\n this.rememberSessionCreateFormAction(event.messageId, event.chatId);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: sessionCreateCard() },\n };\n }\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 if (result.type === 'session-created') {\n this.formActions.delete(event.messageId);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: sessionCreateResultCard(true, result.content, result.session) },\n };\n }\n if (result.type === 'session-start-failed') {\n return {\n toast: { type: 'error', content: result.content },\n card: { type: 'raw', data: sessionStartupFailureCard(event.chatId, result.failure, this.signer) },\n };\n }\n if (result.type === 'resume-picker') {\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: resumePickerCard(event.chatId, result.session, result.picker, this.signer) },\n };\n }\n if (result.type === 'startup-conflict') {\n return {\n toast: { type: 'warning', content: result.content },\n card: { type: 'raw', data: startupConflictCard(event.chatId, requestSession(result.request), result.owner, this.signer) },\n };\n }\n if (result.type === 'session-picker') {\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: sessionPickerCard(\n event.chatId, result.sessions, result.activeSessionId, this.signer, result.confirmingStopSessionId,\n ) },\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 let initialResumePicker: ManagedSession | undefined;\n try {\n if (action.kind === 'session-create' && action.action === 'submit') {\n await this.updateCardAfterAction(event.messageId, sessionCreateProgressCard());\n }\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') {\n if (action.kind === 'session-create') {\n await this.updateCardAfterAction(\n event.messageId,\n sessionCreateFailureCard(event.chatId, result.content, this.signer),\n );\n this.formActions.delete(event.messageId);\n return;\n }\n await this.sendMessage(event.chatId, { text: `卡片操作未完成:${result.content}` });\n return;\n }\n if (result.type === 'session-created') {\n await this.updateCardAfterAction(event.messageId, sessionCreateResultCard(true, result.content, result.session));\n this.formActions.delete(event.messageId);\n return;\n }\n if (result.type === 'session-start-failed') {\n await this.updateCardAfterAction(\n event.messageId,\n sessionStartupFailureCard(event.chatId, result.failure, this.signer),\n );\n this.formActions.delete(event.messageId);\n return;\n }\n if (result.type === 'resume-picker') {\n if (action.kind === 'session-create') initialResumePicker = result.session;\n await this.updateCardAfterAction(event.messageId, resumePickerCard(event.chatId, result.session, result.picker, this.signer));\n return;\n }\n if (result.type === 'startup-conflict') {\n await this.updateCardAfterAction(\n event.messageId,\n startupConflictCard(event.chatId, requestSession(result.request), result.owner, this.signer),\n );\n return;\n }\n if (result.type === 'session-picker') {\n if (action.kind === 'session-start-error') {\n await this.sendMessage(event.chatId, { card: sessionPickerCard(\n event.chatId, result.sessions, result.activeSessionId, this.signer, result.confirmingStopSessionId,\n ) });\n return;\n }\n await this.updateCardAfterAction(event.messageId, sessionPickerCard(\n event.chatId, result.sessions, result.activeSessionId, this.signer, result.confirmingStopSessionId,\n ));\n return;\n }\n if (result.type === 'session-create-form') {\n const sent = await this.sendMessage(event.chatId, { card: sessionCreateCard() });\n this.rememberSessionCreateFormAction(sent.messageId, event.chatId);\n const sourceCard = action.kind === 'session-create' && result.sessions\n ? sessionPickerCard(event.chatId, result.sessions, result.activeSessionId, this.signer, undefined, false)\n : sessionCreateOpenedCard();\n await this.updateCardAfterAction(event.messageId, sourceCard).catch(async (error) => {\n const detail = cardErrorDetail(error);\n console.error(`[lca] failed to retire session-create source card: message=${event.messageId} detail=${detail}`);\n await this.sendMessage(event.chatId, {\n text: '新建表单已发送,但原卡片状态更新失败;请使用最新的“新建 Coding Session”卡片继续操作。',\n }).catch(() => undefined);\n });\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 = cardErrorDetail(error);\n if (initialResumePicker) {\n await this.handler.onResumePickerDeliveryFailure?.(initialResumePicker).catch((cleanupError) => {\n console.error(`[lca] resume picker rollback failed: session=${initialResumePicker?.id} detail=${cardErrorDetail(cleanupError)}`);\n });\n }\n if (action.kind === 'session-create') this.formActions.delete(event.messageId);\n console.error(`[lca] deferred card action failed: kind=${action.kind} action=${action.action} message=${event.messageId} detail=${detail}`);\n await this.sendMessage(event.chatId, {\n text: action.kind === 'session-create'\n ? `新建 Session 表单打开失败:${detail}。请重新发送 /sessions,或直接使用 /start 命令。`\n : `卡片操作同步失败:${detail}`,\n }).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 private async markExpiredCard(event: CardActionEvent): Promise<void> {\n try {\n await this.updateCardAfterAction(event.messageId, expiredActionCard());\n } catch (error) {\n const detail = cardErrorDetail(error);\n console.error(`[lca] failed to mark expired card: message=${event.messageId} detail=${detail}`);\n await this.sendMessage(event.chatId, {\n text: '卡片或按钮已失效,请重新发送对应命令获取最新卡片;Session 相关操作可发送 /sessions。',\n }).catch(() => undefined);\n }\n }\n\n connect(): Promise<void> {\n return this.channel.connect();\n }\n\n async disconnect(): Promise<void> {\n const chats = new Set([...this.processingGenerations.keys(), ...this.processingReactions.keys()]);\n await Promise.all([...chats].map((chatId) => this.clearProcessing(chatId)));\n await this.channel.disconnect();\n }\n\n async startProcessing(message: NormalizedMessage): Promise<void> {\n await this.clearProcessing(message.chatId);\n const generation = this.processingGenerations.get(message.chatId) ?? 0;\n try {\n const reactionId = await this.channel.addReaction(message.messageId, 'Typing');\n if (this.processingGenerations.get(message.chatId) !== generation) {\n await this.removeProcessingReaction(message.messageId, reactionId);\n return;\n }\n const timer = setTimeout(() => {\n void this.clearProcessing(message.chatId, generation);\n }, 10 * 60_000);\n timer.unref?.();\n this.processingReactions.set(message.chatId, { messageId: message.messageId, reactionId, timer, generation });\n } catch (error) {\n console.error(`[lca] failed to add processing reaction: chat=${message.chatId} message=${message.messageId} detail=${cardErrorDetail(error)}`);\n }\n }\n\n sendText(chatId: string, text: string): Promise<unknown> {\n return this.sendMessage(chatId, { text });\n }\n\n sendMarkdown(chatId: string, markdown: string): Promise<unknown> {\n return this.sendMessage(chatId, { markdown });\n }\n\n async sendChoice(chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown> {\n const result = await this.sendMessage(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.sendMessage(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 rememberSessionCreateFormAction(messageId: string, chatId: string): void {\n this.formActions.set(messageId, new Map([[\n SESSION_CREATE_SUBMIT_ACTION,\n this.signer.sign({\n kind: 'session-create', agent: 'codex', action: 'submit', paneId: '', fingerprint: 'create', chatId,\n }, 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.sendMessage(chatId, { card: statusCard(status) });\n }\n\n sendSessionPicker(chatId: string, sessions: ManagedSession[], activeSessionId?: string): Promise<unknown> {\n return this.sendMessage(chatId, { card: sessionPickerCard(chatId, sessions, activeSessionId, this.signer) });\n }\n\n sendResumePicker(chatId: string, session: ManagedSession, picker: ResumePickerView): Promise<unknown> {\n return this.sendMessage(chatId, { card: resumePickerCard(chatId, session, picker, this.signer) });\n }\n\n sendStartupConflict(chatId: string, request: StartSessionRequest, owner: ManagedSession): Promise<unknown> {\n return this.sendMessage(chatId, { card: startupConflictCard(chatId, requestSession(request), owner, this.signer) });\n }\n\n async sendSessionCreate(chatId: string): Promise<unknown> {\n const result = await this.sendMessage(chatId, { card: sessionCreateCard() });\n this.rememberSessionCreateFormAction(result.messageId, chatId);\n return result;\n }\n\n sendSessionStartupFailure(chatId: string, failure: SessionStartupFailure): Promise<unknown> {\n return this.sendMessage(chatId, { card: sessionStartupFailureCard(chatId, failure, this.signer) });\n }\n\n sendStopConfirmation(chatId: string, paneId: string, fingerprint: string, agent: AgentId): Promise<unknown> {\n return this.sendMessage(chatId, { card: stopCard(chatId, paneId, fingerprint, this.signer, agent) });\n }\n\n private async sendMessage(chatId: string, input: Parameters<LarkChannel['send']>[1]): Promise<Awaited<ReturnType<LarkChannel['send']>>> {\n await this.clearProcessing(chatId);\n return this.channel.send(chatId, input);\n }\n\n private async clearProcessing(chatId: string, expectedGeneration?: number): Promise<void> {\n const currentGeneration = this.processingGenerations.get(chatId) ?? 0;\n if (expectedGeneration !== undefined && currentGeneration !== expectedGeneration) return;\n this.processingGenerations.set(chatId, currentGeneration + 1);\n const pending = this.processingReactions.get(chatId);\n if (!pending) return;\n this.processingReactions.delete(chatId);\n clearTimeout(pending.timer);\n await this.removeProcessingReaction(pending.messageId, pending.reactionId);\n }\n\n private async removeProcessingReaction(messageId: string, reactionId: string): Promise<void> {\n try {\n await this.channel.removeReaction(messageId, reactionId);\n } catch (error) {\n console.error(`[lca] failed to remove processing reaction by id: message=${messageId} detail=${cardErrorDetail(error)}`);\n await this.channel.removeReactionByEmoji(messageId, 'Typing').catch((fallbackError) => {\n console.error(`[lca] failed to remove processing reaction by emoji: message=${messageId} detail=${cardErrorDetail(fallbackError)}`);\n });\n }\n }\n}\n\nfunction requestSession(request: StartSessionRequest): Pick<ManagedSession, 'id' | 'agent' | 'cwd'> {\n return { id: request.sessionId, agent: request.agent, cwd: request.cwd };\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\nfunction progressToast(action: SignedAction): string {\n if (action.kind === 'manual') return '正在操作本地终端…';\n if (action.kind === 'session-create') return action.action === 'open' ? '正在打开新建表单…' : '正在启动 Session…';\n if (action.kind === 'resume-picker') return action.action.startsWith('select:') ? '正在恢复 Session…' : '正在更新 Resume Picker…';\n if (action.kind === 'startup-conflict') return action.action === 'new' ? '正在启动新 Session…' : '正在处理 Session 冲突…';\n if (action.kind === 'session-stop') return '正在处理 Session…';\n if (action.kind === 'session-start-error') return action.action === 'create' ? '正在打开新建表单…' : '正在打开 Sessions…';\n return '正在提交到本地终端…';\n}\n\nfunction inFlightToast(action: SignedAction): string {\n if (action.kind === 'manual') return '终端操作正在执行,请稍候。';\n if (action.kind === 'session-create') return action.action === 'open' ? '正在打开新建表单,请稍候。' : 'Session 正在启动,请稍候。';\n if (action.kind === 'resume-picker') return 'Resume Picker 操作正在执行,请稍候。';\n if (action.kind === 'startup-conflict') return 'Session 冲突操作正在执行,请稍候。';\n if (action.kind === 'session-stop') return 'Session 操作正在执行,请稍候。';\n if (action.kind === 'session-start-error') return '正在处理启动失败操作,请稍候。';\n return '答案正在提交,请稍候。';\n}\n\nfunction cardErrorDetail(error: unknown): string {\n const response = error && typeof error === 'object' ? (error as Record<string, unknown>).response : undefined;\n const data = response && typeof response === 'object' ? (response as Record<string, unknown>).data : undefined;\n const record = data && typeof data === 'object' ? data as Record<string, unknown> : undefined;\n const code = typeof record?.code === 'number' || typeof record?.code === 'string' ? String(record.code) : undefined;\n const message = typeof record?.msg === 'string'\n ? record.msg\n : error instanceof Error ? error.message : String(error);\n const sanitized = message\n .replace(/(?:authorization\\s*:\\s*bearer|bearer)\\s+[^\\s,'\"\\]}]+/gi, 'Bearer [REDACTED]')\n .replace(/[\\u0000-\\u001f\\u007f]/g, ' ')\n .slice(0, 1200);\n return code ? `code=${code} ${sanitized}` : sanitized;\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' | 'session-stop' | 'session-create' | 'session-start-error'\n | 'startup-conflict' | 'resume-picker' | '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 === 'session-stop'\n || item.kind === 'session-create' || item.kind === 'session-start-error' || item.kind === 'startup-conflict'\n || item.kind === 'resume-picker' || 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 && ((item.kind !== 'session-stop' && item.kind !== 'session-start-error'\n && item.kind !== 'resume-picker' && item.kind !== 'startup-conflict')\n || typeof item.sessionId === 'string')\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 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 { ResumePickerView } from '../screen/resume-picker.js';\nimport type { RuntimeStatus } from '../daemon/protocol.js';\nimport type { SessionStartupFailure } from '../session/startup-failure.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 = 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 confirmingStopSessionId?: string,\n allowCreate = true,\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: object[] = 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(\n chatId,\n session,\n session.id === activeSessionId,\n signer,\n confirmingStopSessionId === session.id,\n )),\n ]);\n if (elements.length > 0) elements.push({ tag: 'hr', margin: '8px 0px' });\n else elements.push({ tag: 'markdown', content: '暂无可连接的 Coding Session,可以直接新建一个。' });\n elements.push(allowCreate\n ? {\n tag: 'button',\n text: { tag: 'plain_text', content: '+ 新建 Session' },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'session-create', agent: 'codex', action: 'open', paneId: '', fingerprint: 'create', chatId,\n }, 10 * 60_000),\n }],\n }\n : {\n tag: 'markdown',\n content: '✅ 新建 Session 表单已发送;仍可查看或操作上方 Session。',\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,\n },\n };\n}\n\nexport const SESSION_CREATE_SUBMIT_ACTION = 'session_create_submit';\nexport const SESSION_CREATE_NAME_FIELD = 'session_name';\nexport const SESSION_CREATE_AGENT_FIELD = 'session_agent';\nexport const SESSION_CREATE_CWD_FIELD = 'session_cwd';\nexport const SESSION_CREATE_RESUME_FIELD = 'session_resume';\n\nexport function sessionCreateCard(): object {\n return cardElements('新建 Coding Session', [\n { tag: 'markdown', content: '在本机受管 tmux 中启动一个新会话;创建成功后会自动连接。' },\n {\n tag: 'form', name: 'session_create_form', direction: 'vertical', vertical_spacing: '10px', elements: [\n {\n tag: 'input', name: SESSION_CREATE_NAME_FIELD, required: true,\n placeholder: { tag: 'plain_text', content: 'Session 名称,例如 helix' },\n label: { tag: 'plain_text', content: 'Session 名称' },\n },\n {\n tag: 'select_static', name: SESSION_CREATE_AGENT_FIELD, required: true,\n placeholder: { tag: 'plain_text', content: '选择 Agent' },\n initial_option: 'codex',\n options: listAgentAdapters().map((adapter) => ({\n text: { tag: 'plain_text', content: adapter.displayName }, value: adapter.id,\n })),\n },\n {\n tag: 'input', name: SESSION_CREATE_CWD_FIELD, required: true,\n placeholder: { tag: 'plain_text', content: '/absolute/path/to/project' },\n label: { tag: 'plain_text', content: '工作目录(必须为绝对路径)' },\n },\n {\n tag: 'select_static', name: SESSION_CREATE_RESUME_FIELD,\n placeholder: { tag: 'plain_text', content: '选择启动方式' },\n initial_option: 'new',\n options: [\n { text: { tag: 'plain_text', content: '新会话' }, value: 'new' },\n { text: { tag: 'plain_text', content: '打开原生 Resume Picker' }, value: 'picker' },\n ],\n },\n {\n tag: 'button', name: SESSION_CREATE_SUBMIT_ACTION,\n text: { tag: 'plain_text', content: '启动并连接' }, type: 'primary', width: 'fill', size: 'medium',\n form_action_type: 'submit',\n },\n ],\n },\n ]);\n}\n\nexport function sessionCreateResultCard(\n success: boolean,\n content: string,\n session?: Pick<ManagedSession, 'id' | 'agent' | 'cwd'>,\n): object {\n const details = session\n ? `\\n\\n**Session** \\`${escapeInlineCode(session.id)}\\`\\n**Agent** ${escapeMarkdown(getAgentAdapter(session.agent).displayName)}\\n**工作目录** \\`${escapeInlineCode(session.cwd)}\\``\n : '';\n return cardElements(\n success ? 'Session 已启动' : 'Session 启动失败',\n [{ tag: 'markdown', content: `${success ? '✅' : '⚠️'} ${escapeMarkdown(content)}${details}` }],\n success ? 'green' : 'red',\n );\n}\n\nexport function sessionCreateProgressCard(): object {\n return cardElements('正在启动 Session', [\n { tag: 'markdown', content: '⏳ 正在创建 tmux pane,并确认 Agent 和原生 Session 状态…' },\n ], 'blue');\n}\n\nexport function sessionCreateOpenedCard(): object {\n return cardElements('新建表单已打开', [{\n tag: 'markdown',\n content: '✅ 请在最新发送的“新建 Coding Session”卡片中继续操作。\\n\\n如需查看 Session,请发送 `/sessions`。',\n }], 'grey');\n}\n\nexport function sessionCreateFailureCard(chatId: string, content: string, signer: ActionSigner): object {\n return cardElements('Session 启动失败', [\n { tag: 'markdown', content: `⚠️ ${escapeMarkdown(content)}` },\n ...sessionFailureActions(chatId, '', 'codex', signer),\n ], 'red');\n}\n\nexport function sessionStartupFailureCard(\n chatId: string,\n failure: SessionStartupFailure,\n signer: ActionSigner,\n): object {\n const exitStatus = failure.exitStatus === undefined ? '未知' : String(failure.exitStatus);\n return cardElements('Session 启动失败', [\n {\n tag: 'markdown',\n content: `⚠️ **Session** \\`${escapeInlineCode(failure.sessionId)}\\`\\n**Agent** ${escapeMarkdown(getAgentAdapter(failure.agent).displayName)}\\n**退出码** \\`${exitStatus}\\``,\n },\n { tag: 'markdown', content: `**原始错误**\\n\\n\\`\\`\\`text\\n${escapeFence(failure.terminalExcerpt)}\\n\\`\\`\\`` },\n ...sessionFailureActions(chatId, failure.sessionId, failure.agent, signer),\n ], 'red');\n}\n\nfunction sessionFailureActions(chatId: string, sessionId: string, agent: AgentId, signer: ActionSigner): object[] {\n const common = {\n kind: 'session-start-error' as const,\n sessionId,\n agent,\n paneId: '',\n fingerprint: 'startup-error',\n chatId,\n };\n return [\n actionButton('新建 Session', 'primary', signer.sign({ ...common, action: 'create' }, 10 * 60_000)),\n actionButton('查看 Sessions', 'default', signer.sign({ ...common, action: 'sessions' }, 10 * 60_000)),\n ];\n}\n\nfunction sessionCard(\n chatId: string,\n session: ManagedSession,\n active: boolean,\n signer: ActionSigner,\n confirmingStop = false,\n): object {\n const content = [\n active\n ? `**${escapeMarkdown(session.id)}** <text_tag color='green'>● 当前连接</text_tag>`\n : `**${escapeMarkdown(session.id)}**`,\n `📁 \\`${escapeInlineCode(session.cwd)}\\``,\n ].join('\\n\\n');\n const elements: object[] = [{ tag: 'markdown', content }];\n elements.push(confirmingStop\n ? sessionStopConfirmation(chatId, session, signer)\n : sessionActions(chatId, session, active, signer));\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\nfunction sessionActions(chatId: string, session: ManagedSession, active: boolean, signer: ActionSigner): object {\n const buttons: object[] = [];\n if (!active) buttons.push(actionButton(`连接 ${session.id}`, 'primary', signer.sign({\n kind: 'session', agent: session.agent, action: session.id, paneId: session.paneId,\n fingerprint: String(session.updatedAt), chatId,\n })));\n buttons.push(actionButton('关闭', 'danger', signer.sign({\n kind: 'session-stop', sessionId: session.id, agent: session.agent, action: 'request', paneId: session.paneId,\n fingerprint: String(session.updatedAt), chatId,\n })));\n return buttonRow(buttons);\n}\n\nfunction sessionStopConfirmation(chatId: string, session: ManagedSession, signer: ActionSigner): object {\n const common = {\n kind: 'session-stop' as const, sessionId: session.id, agent: session.agent, paneId: session.paneId,\n fingerprint: String(session.updatedAt), chatId,\n };\n return {\n tag: 'column_set', flex_mode: 'none', columns: [{\n tag: 'column', width: 'weighted', weight: 1, background_style: 'grey', padding: '8px 10px',\n vertical_spacing: '6px',\n elements: [\n { tag: 'markdown', content: `⚠️ 确认关闭 **${escapeMarkdown(session.id)}**?Agent 和 tmux session 将退出。` },\n buttonRow([\n actionButton('确认关闭', 'danger', signer.sign({ ...common, action: 'confirm' })),\n actionButton('取消', 'default', signer.sign({ ...common, action: 'cancel' })),\n ]),\n ],\n }],\n };\n}\n\nexport function resumePickerCard(\n chatId: string,\n session: ManagedSession,\n picker: ResumePickerView,\n signer: ActionSigner,\n): object {\n const common = {\n kind: 'resume-picker' as const, sessionId: session.id, agent: session.agent, paneId: session.paneId,\n fingerprint: picker.fingerprint, chatId,\n };\n const optionElements = picker.options.map((option) => ({\n tag: 'column_set', flex_mode: 'none', columns: [{\n tag: 'column', width: 'weighted', weight: 1, background_style: 'grey',\n padding: '9px 10px', vertical_spacing: '5px',\n elements: [\n { tag: 'markdown', content: `${option.selected ? '●' : '○'} **${escapeMarkdown(option.label)}**${option.detail ? `\\n${escapeMarkdown(option.detail)}` : ''}` },\n actionButton('恢复此 Session', option.selected ? 'primary' : 'default', signer.sign({ ...common, action: `select:${option.id}` }, 10 * 60_000)),\n ],\n }],\n }));\n const navigation = [\n ...(picker.canPrevious ? [actionButton('上一页', 'default', signer.sign({ ...common, action: 'previous' }, 10 * 60_000))] : []),\n actionButton('刷新', 'default', signer.sign({ ...common, action: 'refresh' }, 10 * 60_000)),\n ...(picker.canNext ? [actionButton('下一页', 'default', signer.sign({ ...common, action: 'next' }, 10 * 60_000))] : []),\n actionButton('取消', 'danger', signer.sign({ ...common, action: 'cancel' }, 10 * 60_000)),\n ];\n return cardElements(\n '选择要恢复的 Session',\n [\n { tag: 'markdown', content: `**${escapeMarkdown(session.id)} · ${escapeMarkdown(getAgentAdapter(session.agent).displayName)}**${picker.position && picker.total ? ` · 当前 ${picker.position}/${picker.total}` : ''}` },\n ...optionElements,\n buttonRow(navigation),\n ],\n 'yellow',\n );\n}\n\nexport function startupConflictCard(\n chatId: string,\n requested: Pick<ManagedSession, 'id' | 'agent' | 'cwd'>,\n owner: ManagedSession,\n signer: ActionSigner,\n): object {\n const common = {\n kind: 'startup-conflict' as const,\n sessionId: requested.id,\n agent: requested.agent,\n paneId: owner.paneId,\n fingerprint: String(owner.updatedAt),\n chatId,\n };\n return cardElements('Session 已由其他连接占用', [\n {\n tag: 'markdown',\n content: `要恢复的 **${escapeMarkdown(requested.agent)}** 原生 Session 已由 LCA Session **${escapeMarkdown(owner.id)}** 连接。\\n\\n**请求名称** \\`${escapeInlineCode(requested.id)}\\`\\n**工作目录** \\`${escapeInlineCode(requested.cwd)}\\``,\n },\n buttonRow([\n actionButton(`连接 ${owner.id}`, 'primary', signer.sign({ ...common, action: 'connect' }, 10 * 60_000)),\n actionButton('启动新会话', 'default', signer.sign({ ...common, action: 'new' }, 10 * 60_000)),\n actionButton('取消', 'danger', signer.sign({ ...common, action: 'cancel' }, 10 * 60_000)),\n ]),\n ], 'yellow');\n}\n\nfunction actionButton(text: string, type: string, value: SignedAction): object {\n return {\n tag: 'button', text: { tag: 'plain_text', content: text }, type, size: 'medium',\n behaviors: [{ type: 'callback', value }],\n };\n}\n\nfunction buttonRow(buttons: object[]): object {\n return {\n tag: 'column_set', flex_mode: 'none', horizontal_spacing: '8px', margin: '2px 0px 0px 0px',\n columns: buttons.map((button) => ({ tag: 'column', width: 'weighted', weight: 1, elements: [button] })),\n };\n}\n\nfunction agentMarker(agent: AgentId): string {\n if (agent === 'codex') return '🔵';\n if (agent === 'traex') 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\nexport function expiredActionCard(): object {\n return cardElements('卡片已失效', [{\n tag: 'markdown',\n content: '⚠️ 此卡片或按钮已过期、已处理,或 bridge daemon 已重启。\\n\\n请重新发送对应命令获取最新卡片;Session 相关操作可发送 `/sessions`。',\n }], 'grey');\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 { normalizeAgentId } from '../agents/types.js';\nimport type { AgentResume } from '../agents/types.js';\nimport { AppError } from '../core/errors.js';\nimport type { StartSessionRequest } from '../session/start-request.js';\n\nexport function parseStartCommand(input: string): StartSessionRequest {\n const tokens = tokenize(input);\n if (tokens[0] !== '/start') throw invalid('命令必须以 /start 开头');\n const sessionId = tokens[1];\n if (!sessionId || sessionId.startsWith('--')) throw invalid('请提供 session 名称');\n\n let agentValue: string | undefined;\n let cwd: string | undefined;\n let resume: AgentResume | undefined;\n for (let index = 2; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === '--agent') {\n if (agentValue !== undefined) throw invalid('--agent 不能重复');\n agentValue = requiredValue(tokens, ++index, '--agent');\n continue;\n }\n if (token === '--cwd') {\n if (cwd !== undefined) throw invalid('--cwd 不能重复');\n cwd = requiredValue(tokens, ++index, '--cwd');\n continue;\n }\n if (token === '--resume-last') {\n throw invalid('飞书端不支持 --resume-last,请使用 --resume 打开原生 Resume Picker');\n }\n if (token === '--resume') {\n if (resume) throw invalid('只能选择一种恢复方式');\n const candidate = tokens[index + 1];\n if (candidate && !candidate.startsWith('--')) {\n throw invalid('飞书端不支持输入历史 Session ID,请使用 --resume 打开原生 Resume Picker');\n }\n resume = { mode: 'picker' };\n continue;\n }\n throw invalid(`无法识别参数:${token}`);\n }\n\n const agent = agentValue ? normalizeAgentId(agentValue) : undefined;\n if (!agentValue) throw invalid('请提供 --agent');\n if (!agent) throw invalid(`不支持的 agent:${agentValue};可选 codex、traex、claude`);\n if (!cwd) throw invalid('请提供 --cwd');\n return { sessionId, agent, cwd, resume };\n}\n\nexport function tokenize(input: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: \"'\" | '\"' | undefined;\n let escaped = false;\n const push = (): void => {\n if (current) tokens.push(current);\n current = '';\n };\n for (const char of input.trim()) {\n if (escaped) {\n current += char;\n escaped = false;\n } else if (char === '\\\\' && quote !== \"'\") {\n escaped = true;\n } else if (quote) {\n if (char === quote) quote = undefined;\n else current += char;\n } else if (char === \"'\" || char === '\"') {\n quote = char;\n } else if (/\\s/.test(char)) {\n push();\n } else {\n current += char;\n }\n }\n if (escaped) current += '\\\\';\n if (quote) throw invalid('引号没有闭合');\n push();\n return tokens;\n}\n\nfunction requiredValue(tokens: string[], index: number, option: string): string {\n const value = tokens[index];\n if (!value || value.startsWith('--')) throw invalid(`${option} 缺少参数值`);\n return value;\n}\n\nfunction invalid(reason: string): AppError {\n return new AppError('INVALID_OPTIONS', reason, { reason });\n}\n","import { createHash } from 'node:crypto';\nimport type { AgentId } from '../agents/types.js';\nimport { normalizeScreen } from './normalize.js';\n\nexport interface ResumePickerOption {\n id: string;\n label: string;\n detail?: string;\n selected: boolean;\n visibleIndex: number;\n}\n\nexport interface ResumePickerView {\n agent: AgentId;\n fingerprint: string;\n options: ResumePickerOption[];\n selectedIndex: number;\n position?: number;\n total?: number;\n canPrevious: boolean;\n canNext: boolean;\n}\n\nexport function parseResumePicker(raw: string, agent: AgentId): ResumePickerView | undefined {\n const normalized = normalizeScreen(raw);\n return agent === 'claude'\n ? parseClaudePicker(normalized, agent)\n : parseCodexStylePicker(normalized, agent);\n}\n\nfunction parseCodexStylePicker(normalized: string, agent: AgentId): ResumePickerView | undefined {\n if (!/^\\s*Resume a previous session\\s*$/mi.test(normalized)) return undefined;\n const lines = normalized.split('\\n');\n const start = lines.findIndex((line) => /Type to search/i.test(line));\n const end = lines.findIndex((line, index) => index > start && /enter\\s+resume/i.test(line));\n if (start < 0 || end < 0) return undefined;\n const options: ResumePickerOption[] = [];\n for (const line of lines.slice(start + 1, end)) {\n const match = line.match(/^\\s*(❯)?\\s*(\\d+\\s*(?:m|h|d|w|mo|y)\\s+ago)\\s+(.+?)\\s*$/i);\n if (!match?.[3]) continue;\n const label = match[3].trim();\n options.push(option(options.length, label, match[2]?.replace(/\\s+/g, ''), Boolean(match[1])));\n }\n if (options.length === 0) return undefined;\n const positionMatch = normalized.match(/(\\d+)\\s*\\/\\s*(\\d+)\\s*·\\s*(\\d+)%/);\n return view(\n agent,\n normalized,\n options,\n positionMatch ? Number(positionMatch[1]) : undefined,\n positionMatch ? Number(positionMatch[2]) : undefined,\n );\n}\n\nfunction parseClaudePicker(normalized: string, agent: AgentId): ResumePickerView | undefined {\n const header = normalized.match(/^\\s*Resume session(?:\\s*\\((\\d+)\\s+of\\s+(\\d+)\\))?\\s*$/mi);\n if (!header) return undefined;\n const lines = normalized.split('\\n');\n const start = lines.findIndex((line) => /⌕\\s*Search|Search…/i.test(line));\n const end = lines.findIndex((line, index) => index > start && /Ctrl\\+A to show all projects/i.test(line));\n if (start < 0 || end < 0) return undefined;\n const options: ResumePickerOption[] = [];\n const body = lines.slice(start + 1, end);\n const navigation = {\n canPrevious: body.some((line) => /^\\s*↑/.test(line)),\n canNext: body.some((line) => /^\\s*↓/.test(line)),\n };\n for (let index = 0; index < body.length - 1; index += 1) {\n const title = body[index] ?? '';\n const detail = body[index + 1] ?? '';\n if (!/\\b(?:minute|hour|day|week|month|year)s? ago\\s*·/i.test(detail)) continue;\n const selected = /^\\s*❯/.test(title);\n const label = title.replace(/^\\s*[❯↓↑]?\\s*/, '').trim();\n if (!label || /^[↓↑]/.test(title.trim())) continue;\n options.push(option(options.length, label, detail.trim(), selected));\n index += 1;\n }\n if (options.length === 0) return undefined;\n return view(\n agent,\n normalized,\n options,\n header[1] ? Number(header[1]) : undefined,\n header[2] ? Number(header[2]) : undefined,\n navigation,\n );\n}\n\nfunction option(visibleIndex: number, label: string, detail: string | undefined, selected: boolean): ResumePickerOption {\n const id = createHash('sha256').update(`${visibleIndex}\\n${label}\\n${detail ?? ''}`).digest('hex').slice(0, 16);\n return { id, label, detail, selected, visibleIndex };\n}\n\nfunction view(\n agent: AgentId,\n normalized: string,\n options: ResumePickerOption[],\n position?: number,\n total?: number,\n navigation?: { canPrevious: boolean; canNext: boolean },\n): ResumePickerView {\n const selectedIndex = Math.max(0, options.findIndex((candidate) => candidate.selected));\n const hasHiddenOptions = position !== undefined && total !== undefined && total > options.length;\n return {\n agent,\n fingerprint: createHash('sha256').update(normalized).digest('hex'),\n options,\n selectedIndex,\n position,\n total,\n canPrevious: navigation?.canPrevious || (hasHiddenOptions && position > 1),\n canNext: navigation?.canNext || (hasHiddenOptions && position < total),\n };\n}\n","const MAX_LINES = 20;\nconst MAX_CHARS = 2_000;\nconst EMPTY_EXCERPT = 'Agent 未输出可用错误信息。';\n\nexport function startupTerminalExcerpt(raw: string): string {\n const sanitized = redactSecrets(stripTerminalControls(raw));\n const lines = sanitized\n .split('\\n')\n .map(cleanLine)\n .filter((line) => line !== undefined) as string[];\n while (lines[0] === '') lines.shift();\n while (lines.at(-1) === '') lines.pop();\n if (lines.length === 0) return EMPTY_EXCERPT;\n\n const errorIndex = lines.findIndex((line) => /\\b(?:error|failed|fatal)\\b/i.test(line));\n const selected = (errorIndex >= 0 ? lines.slice(errorIndex) : lines.slice(-MAX_LINES)).slice(0, MAX_LINES);\n let excerpt = selected.join('\\n').trim();\n if (!excerpt) return EMPTY_EXCERPT;\n\n const lineTruncated = errorIndex >= 0\n ? lines.length - errorIndex > MAX_LINES\n : lines.length > MAX_LINES;\n const charTruncated = excerpt.length > MAX_CHARS;\n if (charTruncated) excerpt = excerpt.slice(0, MAX_CHARS).trimEnd();\n if (lineTruncated || charTruncated) excerpt = `${excerpt}\\n… 输出已截断`;\n return excerpt;\n}\n\nfunction stripTerminalControls(value: string): string {\n return value\n // CSI and OSC escape sequences emitted by interactive TUIs.\n .replace(/\\u001B\\][^\\u0007]*(?:\\u0007|\\u001B\\\\)/g, '')\n .replace(/\\u001B(?:[@-_][0-?]*[ -/]*[@-~]|\\[[0-?]*[ -/]*[@-~])/g, '')\n .replace(/\\r/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001A\\u001C-\\u001F\\u007F]/g, '');\n}\n\nfunction cleanLine(value: string): string | undefined {\n const line = value.replace(/[ \\t]+$/g, '').trimStart();\n if (/^Pane is dead(?:\\s|\\(|$)/i.test(line)) return undefined;\n if (/^[╭╮╰╯┌┐└┘─━═│┃┊┋┄┅┈┉┼├┤┬┴┿╋+\\-_=\\s]+$/.test(line)) return undefined;\n return line.replace(/^[│┃]\\s?/, '').replace(/\\s?[│┃]$/, '').trimEnd();\n}\n\nfunction redactSecrets(value: string): string {\n return value\n .replace(/\\b(authorization\\s*[:=]\\s*)(?:Bearer\\s+)?[^\\s,;]+/gi, '$1[REDACTED]')\n .replace(/\\b(Bearer)\\s+[^\\s,'\"\\]}]+/gi, '$1 [REDACTED]')\n .replace(\n /\\b(api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|app[_-]?secret|cookie)\\b(\\s*[:=]\\s*)([^\\s,;]+)/gi,\n '$1$2[REDACTED]',\n )\n .replace(/([?&](?:api[_-]?key|access[_-]?token|token|secret|signature)=)[^&#\\s]+/gi, '$1[REDACTED]');\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","result","result","errorMessage","readFile","readFile","result","paths","randomBytes","ANSI","result","option","randomBytes","randomBytes","timingSafeEqual","randomBytes","timingSafeEqual","selected","view","option","result","result","card","view","option","createHash","createHash","paths","chmod","open","readFile","errorMessage","result","escapeFence","view","current","option","navigation","session","pane","homedir","join","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/agents/types.ts","../src/workspace/path.ts","../src/core/errors.ts","../src/session/start-request.ts","../src/session/startup-failure.ts","../src/session/start-coordinator.ts","../src/session/reconciler.ts","../src/session/native-session.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/registry.ts","../src/agents/stop-event.ts","../src/lark/gateway.ts","../src/lark/action-signing.ts","../src/workspace/session-create.ts","../src/lark/cards.ts","../src/lark/start-command.ts","../src/screen/resume-picker.ts","../src/terminal/startup-error.ts","../src/workspace/discovery.ts","../src/workspace/recent.ts","../src/workspace/snapshot.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, isAppError, serializeAppError, systemErrorCode } from '../core/errors.js';\nimport { validateStartSessionRequest, type StartSessionRequest } from '../session/start-request.js';\nimport { sessionStartupFailure } from '../session/startup-failure.js';\nimport { SessionStartCoordinator, type SessionStartContext, type SessionStartSource } from '../session/start-coordinator.js';\nimport { SessionReconciler } from '../session/reconciler.js';\nimport { resolveNativeAgentSessionId } from '../session/native-session.js';\nimport { TmuxController } from '../tmux/controller.js';\nimport type { DaemonRequest, DaemonResult, RuntimeSessionStatus, RuntimeStatus } from './protocol.js';\nimport { getAgentAdapter } from '../agents/registry.js';\nimport type { AgentId, AgentResume, AgentSessionStartedCandidate, TurnCompleteCandidate } from '../agents/types.js';\nimport { validSessionStartCandidate, 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 SESSION_CREATE_AGENT_FIELD,\n SESSION_CREATE_CWD_FIELD,\n SESSION_CREATE_MANUAL_VALUE,\n SESSION_CREATE_NAME_FIELD,\n SESSION_CREATE_PROJECT_FIELD,\n SESSION_CREATE_RESUME_FIELD,\n choiceFormFieldName,\n inlineInputName,\n type ManualControlState,\n type ManualControlView,\n} from '../lark/cards.js';\nimport { parseStartCommand } from '../lark/start-command.js';\nimport { normalizeAgentId } from '../agents/types.js';\nimport { parseResumePicker, type ResumePickerView } from '../screen/resume-picker.js';\nimport { startupTerminalExcerpt } from '../terminal/startup-error.js';\nimport { discoverWorkspaces } from '../workspace/discovery.js';\nimport { rememberRecentWorkspace } from '../workspace/recent.js';\nimport { WorkspaceSnapshotStore, type WorkspaceSnapshot } from '../workspace/snapshot.js';\nimport {\n emptySessionCreateDraft,\n type SessionCreateDraft,\n type SessionCreateView,\n} from '../workspace/session-create.js';\n\nexport class AssistantDaemon {\n private config!: AppConfig;\n private state!: SessionState;\n private tmux!: TmuxController;\n private reconciler!: SessionReconciler;\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 readonly pendingAgentSessionClaims = new Map<string, AgentSessionStartedCandidate>();\n private readonly pendingResumePickers = new Map<string, StartSessionRequest>();\n private readonly pendingStartupConflicts = new Map<string, { request: StartSessionRequest; ownerSessionId: string }>();\n private readonly workspaceSnapshots = new WorkspaceSnapshotStore();\n private readonly sessionStarts: SessionStartCoordinator;\n private startStateWrites: Promise<void> = Promise.resolve();\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 sessionStartTimeoutMs = 30_000,\n ) {\n this.sessionStarts = new SessionStartCoordinator(sessionStartTimeoutMs, (message) => this.log(message));\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 this.reconciler = new SessionReconciler(\n this.tmux,\n this.sessionName,\n 3,\n (message) => this.log(message),\n async (agent, signal) => {\n const adapter = getAgentAdapter(agent);\n return (await runFile(adapter.binary(this.config), [...adapter.versionArgs], { signal })).stdout.trim();\n },\n );\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(true);\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 onResumePickerDeliveryFailure: (session) => this.handleResumePickerDeliveryFailure(session),\n });\n await this.gateway.connect();\n await this.refreshNativeAgentSessionClaims();\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 'agentSessionStarted': return this.handleAgentSessionStarted(request.candidate);\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 source: SessionStartSource = 'cli',\n ): Promise<DaemonResult> {\n try {\n const validated = await validateStartSessionRequest({ sessionId, cwd, agent: agentId, resume });\n cwd = validated.cwd;\n } catch (error) {\n return fail(error);\n }\n let createdSessionName: string | undefined;\n const outcome = await this.sessionStarts.run(\n { sessionId, cwd, agent: agentId, resume, source },\n async (context) => {\n const result = await this.startSessionCore(\n sessionId,\n cwd,\n agentId,\n resume,\n context,\n (sessionName) => { createdSessionName = sessionName; },\n );\n if (!result.ok) throw daemonResultAppError(result);\n return result.value;\n },\n async (_context, error) => this.cleanupStartTransaction(sessionId, createdSessionName, error),\n );\n return outcome.ok ? { ok: true, value: outcome.value } : fail(outcome.error);\n }\n\n private async startSessionCore(\n sessionId: string,\n cwd: string,\n agentId: AgentId,\n resume: AgentResume | undefined,\n context: SessionStartContext,\n created: (sessionName: string) => void,\n ): Promise<DaemonResult> {\n await context.stage('reconcile', () => this.reconcileSessions(true, context.signal));\n const existing = this.state.sessions?.[sessionId];\n if (existing) {\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 let agentVersion: string;\n try {\n agentVersion = (await context.stage('agent-version', () => runFile(binary, [...adapter.versionArgs], {\n timeoutMs: context.remainingMs(),\n signal: context.signal,\n }))).stdout.trim();\n } catch (error) {\n return fail(isAppError(error)\n ? error\n : systemErrorCode(error) === 'ENOENT'\n ? new AppError('BINARY_NOT_FOUND', `command not found: ${binary}`, { binary }, { cause: error })\n : new AppError('START_FAILED', `failed to inspect agent binary: ${binary}`, { sessionId }, { cause: error }));\n }\n const tmuxSessionName = `${this.sessionName}-${sessionId}`;\n let pane;\n try {\n pane = await context.stage('tmux-create', () => 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 LARK_CODING_ASSISTANT_AGENT: agentId,\n },\n preserveOnExit: true,\n signal: context.signal,\n }));\n created(pane.sessionName);\n } catch (error) {\n return fail(isAppError(error)\n ? error\n : new AppError('START_FAILED', 'failed to create tmux session', { sessionId }, { cause: error }));\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 const pendingClaim = this.pendingAgentSessionClaims.get(sessionId);\n if (pendingClaim) {\n const claimed = this.claimStartingAgentSession(session, pendingClaim);\n if (!claimed.ok) return claimed;\n }\n if (resume && resume.mode !== 'picker') {\n const initialClaim = await context.stage(\n 'agent-identity',\n () => this.waitForInitialAgentSessionClaim(session, pane.pid, context.signal),\n );\n if (!initialClaim.ok) {\n return initialClaim;\n }\n } else {\n const stable = await context.stage(\n 'startup-stability',\n () => this.waitForStartupStability(session, 500, context.signal),\n );\n if (!stable.ok) {\n return stable;\n }\n }\n const resumePicker = resume?.mode === 'picker' && context.source === 'lark'\n ? await context.stage('resume-picker', async () => {\n const picker = await this.waitForResumePicker(\n session,\n undefined,\n context.remainingMs(),\n context.signal,\n );\n if (!picker) {\n throw new AppError('START_FAILED', 'agent resume picker did not become available', {\n sessionId,\n agent: agentId,\n });\n }\n return picker;\n })\n : undefined;\n if (resume?.mode !== 'picker') {\n await this.tmux.preserveOnExit(session.sessionName, false, context.signal).catch((error) => this.log(\n `failed to disable startup preservation for ${sessionId}: ${errorMessage(error)}`,\n ));\n await this.rememberSessionWorkspace(session.cwd);\n }\n const lateClaim = this.pendingAgentSessionClaims.get(sessionId);\n if (lateClaim) {\n const claimed = this.claimStartingAgentSession(session, lateClaim);\n if (!claimed.ok) return claimed;\n }\n try {\n await context.stage('metadata', () => this.tmux.writeMetadata(pane.sessionName, {\n managed: true,\n sessionId,\n agent: agentId,\n cwd,\n agentVersion,\n agentSessionId: session.agentSessionId,\n }, context.signal));\n await context.stage('state', () => this.commitStartedSession(session, binding));\n } catch (error) {\n return fail(isAppError(error)\n ? error\n : new AppError('START_FAILED', 'failed to persist completed session', { sessionId }, { cause: error }));\n }\n const postCommitClaim = this.pendingAgentSessionClaims.get(sessionId);\n if (postCommitClaim) {\n const claimed = await this.handleAgentSessionStarted(postCommitClaim);\n if (!claimed.ok) return claimed;\n }\n await this.log(\n `session created: session=${session.id} agent=${session.agent} pane=${session.paneId} active=${this.state.activeSessionId === session.id}`,\n );\n return {\n ok: true,\n value: { pane, session, binding, active: this.state.activeSessionId === sessionId, resumePicker },\n };\n }\n\n private async cleanupStartTransaction(\n sessionId: string,\n createdSessionName: string | undefined,\n error: AppError,\n ): Promise<void> {\n const session = this.state.sessions?.[sessionId];\n const ownsSession = Boolean(createdSessionName && session?.sessionName === createdSessionName);\n const createdPane = createdSessionName\n ? await this.tmux.findBySession(createdSessionName, AbortSignal.timeout(750)).catch(() => undefined)\n : undefined;\n const paneId = ownsSession ? session?.paneId : createdPane?.paneId;\n if (paneId && !error.context.terminalExcerpt) {\n const terminalExcerpt = await this.tmux.capture(paneId, 40, AbortSignal.timeout(1_000))\n .then((output) => startupTerminalExcerpt(tailScreen(output, 40).slice(-3_000)))\n .catch(() => '');\n if (terminalExcerpt) error.context.terminalExcerpt = terminalExcerpt;\n }\n if (session && ownsSession) {\n await this.stopSession(sessionId, AbortSignal.timeout(2_000)).catch((cleanupError) => this.log(\n `session start state cleanup failed: session=${sessionId} detail=${errorMessage(cleanupError)}`,\n ));\n if (this.state.sessions?.[sessionId]?.sessionName === createdSessionName) {\n await this.forgetSessionState(sessionId).catch((cleanupError) => this.log(\n `session start forced state cleanup failed: session=${sessionId} detail=${errorMessage(cleanupError)}`,\n ));\n }\n } else if (createdSessionName) {\n await this.tmux.killSession(createdSessionName, AbortSignal.timeout(2_000)).catch((cleanupError) => this.log(\n `session start tmux cleanup failed: session=${sessionId} detail=${errorMessage(cleanupError)}`,\n ));\n }\n this.pendingAgentSessionClaims.delete(sessionId);\n this.pendingResumePickers.delete(sessionId);\n this.pendingStartupConflicts.delete(sessionId);\n }\n\n private commitStartedSession(\n session: ManagedSession,\n binding:\n | { mode: 'reused' }\n | { mode: 'awaiting-owner-message' }\n | { mode: 'code'; bindCode: string; expiresInSeconds: number },\n ): Promise<void> {\n const commit = async (): Promise<void> => {\n if (this.state.sessions?.[session.id]) {\n throw new AppError('SESSION_EXISTS', `managed coding-agent session is already running: ${session.id}`, {\n sessionId: session.id,\n });\n }\n const nextState: SessionState = {\n ...this.state,\n sessions: { ...this.state.sessions, [session.id]: session },\n activeSessionId: this.state.activeSessionId ?? session.id,\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(nextState);\n this.state = nextState;\n };\n const pending = this.startStateWrites.then(commit, commit);\n this.startStateWrites = pending.catch(() => undefined);\n return pending;\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?: string): Promise<RuntimeStatus> {\n const selectedSessionId = sessionId ?? this.state.activeSessionId;\n const selected = selectedSessionId ? this.state.sessions?.[selectedSessionId] : undefined;\n const requestedSessions = sessionId\n ? (selected ? [selected] : [])\n : Object.values(this.state.sessions ?? {});\n const sessions = await Promise.all(requestedSessions.map((session) => this.sessionRuntimeStatus(session)));\n const selectedRuntime = selected\n ? sessions.find(({ session }) => session.id === selected.id)\n ?? await this.sessionRuntimeStatus(selected)\n : undefined;\n return {\n state: this.state,\n session: selected,\n screen: selectedRuntime?.screen,\n paneAlive: selectedRuntime?.paneAlive === true,\n sessions,\n };\n }\n\n private async sessionRuntimeStatus(session: ManagedSession): Promise<RuntimeSessionStatus> {\n const active = session.id === this.state.activeSessionId;\n try {\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) {\n return {\n session,\n screen: getAgentAdapter(session.agent).detectScreen('', false),\n paneAlive: false,\n active,\n };\n }\n const screen = active && this.screen\n ? this.screen\n : getAgentAdapter(session.agent).detectScreen(\n await this.tmux.capture(session.paneId, 160),\n true,\n { x: pane.cursorX, y: pane.cursorY },\n );\n return { session, screen, paneAlive: true, active };\n } catch {\n return { session, active };\n }\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 if (text === '/start') {\n try {\n await this.gateway?.sendSessionCreate(message.chatId, await this.createSessionWorkspaceView(message.chatId));\n } catch (error) {\n await this.log(`session create card failed: ${errorMessage(error)}`);\n await this.gateway?.sendText(message.chatId, '新建 Session 表单发送失败。请使用 /start <name> --agent <agent> --cwd <绝对路径>。');\n }\n return;\n }\n if (text.startsWith('/start ')) {\n let request: StartSessionRequest;\n try {\n request = parseStartCommand(text);\n } catch (error) {\n await this.gateway?.sendText(message.chatId, remoteError(fail(error)));\n return;\n }\n const result = await this.startRemoteSession(request);\n if (!result.ok) {\n const failure = sessionStartupFailure(result.error, request);\n if (failure) await this.gateway?.sendSessionStartupFailure(message.chatId, failure);\n else await this.gateway?.sendText(message.chatId, remoteError(result.error));\n }\n else if (result.state === 'picker') {\n try {\n await this.gateway?.sendResumePicker(message.chatId, result.session, result.picker);\n } catch (error) {\n await this.handleResumePickerDeliveryFailure(result.session);\n await this.log(`resume picker notification failed: session=${result.session.id} error=${errorMessage(error)}`);\n await this.gateway?.sendText(message.chatId, 'Resume Picker 卡片发送失败,临时 Session 已清理,请重试。');\n }\n }\n else if (result.state === 'conflict') await this.gateway?.sendStartupConflict(message.chatId, result.request, result.owner);\n else await this.gateway?.sendText(message.chatId, remoteStartSuccess(result.session));\n return;\n }\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(true);\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.gateway?.startProcessing(message);\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 === 'session-stop') return this.handleSessionStopAction(action);\n if (action.kind === 'session-start-error') {\n if (action.action === 'create') return {\n type: 'session-create-form', content: '请填写启动信息。',\n view: await this.createSessionWorkspaceView(event.chatId),\n };\n if (action.action === 'sessions') {\n await this.reconcileSessions(true);\n return this.sessionPickerActionResult('已发送最新 Sessions。');\n }\n return { type: 'error', content: '无法识别启动失败卡片操作。' };\n }\n if (action.kind === 'startup-conflict') return this.handleStartupConflictAction(action);\n if (action.kind === 'resume-picker') return this.handleResumePickerAction(action);\n if (action.kind === 'session-create') {\n if (action.action === 'open') {\n return {\n type: 'session-create-form',\n content: '请填写启动信息。',\n view: await this.createSessionWorkspaceView(event.chatId),\n sessions: Object.values(this.state.sessions ?? {}),\n activeSessionId: this.state.activeSessionId,\n };\n }\n const snapshot = action.snapshotId\n ? this.workspaceSnapshots.get(action.snapshotId, event.chatId, event.operator.openId)\n : undefined;\n if (!snapshot && action.snapshotId) {\n return {\n type: 'session-create-form', content: '项目目录列表已过期,已重新加载。',\n view: await this.createSessionWorkspaceView(event.chatId),\n };\n }\n if (action.action !== 'submit') return { type: 'error', content: '无法识别新建 Session 操作。' };\n if (!event.action.formValue) {\n return { type: 'error', content: '无法识别新建 Session 表单,请重新发送 /sessions。' };\n }\n const submittedResumeMode = formString(event.action.formValue[SESSION_CREATE_RESUME_FIELD]) || 'new';\n if (submittedResumeMode === 'last') {\n return { type: 'error', content: '飞书已不再支持“恢复上次会话”,请重新打开表单并使用 Resume Picker。' };\n }\n if (submittedResumeMode !== 'new' && submittedResumeMode !== 'picker') {\n return { type: 'error', content: '无法识别启动方式,请重新打开新建 Session 表单。' };\n }\n const submittedAgent = formString(event.action.formValue[SESSION_CREATE_AGENT_FIELD]);\n if (!normalizeAgentId(submittedAgent)) {\n return { type: 'error', content: '请选择有效的 Agent:codex、traex 或 claude。' };\n }\n const draft = sessionCreateDraftFromForm(event.action.formValue);\n const submittedProject = formString(event.action.formValue[SESSION_CREATE_PROJECT_FIELD]);\n const manualForm = action.fingerprint === 'manual';\n const selectedProject = submittedProject !== SESSION_CREATE_MANUAL_VALUE ? submittedProject : '';\n if (selectedProject && !manualForm && (!snapshot\n || !snapshot.candidates.some((candidate) => candidate.cwd === selectedProject))) {\n return {\n type: 'session-create-form', content: '项目目录列表已变化,已重新加载。',\n view: await this.createSessionWorkspaceView(event.chatId),\n };\n }\n const request = startRequestFromDraft(draft);\n if (!request.ok) {\n return {\n type: 'session-create-form', content: request.error,\n view: this.sessionCreateRetryView(snapshot, draft),\n };\n }\n const result = await this.startRemoteSession(request.value);\n if (!result.ok) return larkStartupError(result.error, request.value);\n if (result.state === 'picker') {\n return { type: 'resume-picker', content: '请选择要恢复的历史 Session。', session: result.session, picker: result.picker };\n }\n if (result.state === 'conflict') {\n return { type: 'startup-conflict', content: '目标原生 Session 已由现有 LCA Session 连接。', request: result.request, owner: result.owner };\n }\n return { type: 'session-created', content: remoteStartSuccess(result.session), session: result.session };\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 async handleSessionStopAction(action: SignedAction): Promise<LarkActionResult> {\n const sessionId = action.sessionId ?? '';\n const target = this.state.sessions?.[sessionId];\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 if (action.action === 'request') {\n return this.sessionPickerActionResult(`请确认是否关闭 ${target.id}。`, target.id);\n }\n if (action.action === 'cancel') {\n return this.sessionPickerActionResult(`已取消关闭 ${target.id}。`);\n }\n if (action.action !== 'confirm') return { type: 'error', content: '无法识别关闭操作,请重新发送 /sessions。' };\n const stopped = await this.stopSession(target.id);\n if (!stopped.ok) return { type: 'error', content: remoteError(stopped) };\n return this.sessionPickerActionResult(`已关闭 ${target.id}。`);\n }\n\n private async handleStartupConflictAction(action: SignedAction): Promise<LarkActionResult> {\n const requestedSessionId = action.sessionId ?? '';\n const pending = this.pendingStartupConflicts.get(requestedSessionId);\n const owner = pending ? this.state.sessions?.[pending.ownerSessionId] : undefined;\n if (!pending || !owner || pending.request.agent !== action.agent\n || owner.paneId !== action.paneId || String(owner.updatedAt) !== action.fingerprint) {\n return { type: 'error', content: 'Session 冲突状态已变化,请重新创建 Session。' };\n }\n if (action.action === 'cancel') {\n this.pendingStartupConflicts.delete(requestedSessionId);\n return { type: 'success', content: `已取消创建 ${requestedSessionId}。` };\n }\n if (action.action === 'connect') {\n const selected = await this.useSession(owner.id);\n if (!selected.ok) return { type: 'error', content: remoteError(selected) };\n this.pendingStartupConflicts.delete(requestedSessionId);\n return { type: 'session-created', content: `已连接现有 session「${owner.id}」。`, session: owner };\n }\n if (action.action !== 'new') return { type: 'error', content: '无法识别冲突处理操作。' };\n this.pendingStartupConflicts.delete(requestedSessionId);\n const result = await this.startRemoteSession({ ...pending.request, resume: undefined });\n if (!result.ok) return larkStartupError(result.error, pending.request);\n if (result.state !== 'ready') return { type: 'error', content: '启动新会话时出现了意外恢复状态,请重试。' };\n return { type: 'session-created', content: remoteStartSuccess(result.session), session: result.session };\n }\n\n private sessionPickerActionResult(content: string, confirmingStopSessionId?: string): LarkActionResult {\n return {\n type: 'session-picker',\n content,\n sessions: Object.values(this.state.sessions ?? {}),\n activeSessionId: this.state.activeSessionId,\n confirmingStopSessionId,\n };\n }\n\n private async handleResumePickerAction(action: SignedAction): Promise<LarkActionResult> {\n const sessionId = action.sessionId ?? '';\n const request = this.pendingResumePickers.get(sessionId);\n const session = this.state.sessions?.[sessionId];\n if (!request || !session || session.agent !== action.agent || session.paneId !== action.paneId) {\n return { type: 'error', content: 'Resume Picker 已变化,请重新创建 Session。' };\n }\n if (action.action === 'cancel') {\n this.pendingResumePickers.delete(sessionId);\n const stopped = await this.stopSession(sessionId);\n return stopped.ok\n ? { type: 'success', content: `已取消创建 ${sessionId}。` }\n : { type: 'error', content: remoteError(stopped) };\n }\n let picker = await this.readResumePicker(session);\n if (!picker) {\n this.pendingResumePickers.delete(sessionId);\n return { type: 'error', content: '原生 Resume Picker 当前无法安全识别,已允许手动遥控兜底;请发送 /manual。' };\n }\n if (action.action !== 'refresh' && picker.fingerprint !== action.fingerprint) {\n return { type: 'resume-picker', content: 'Picker 已变化,已刷新为最新内容。', session, picker };\n }\n if (action.action === 'refresh') {\n return { type: 'resume-picker', content: '已刷新 Resume Picker。', session, picker };\n }\n if (action.action === 'previous' || action.action === 'next') {\n await this.tmux.sendKey(session.paneId, action.action === 'previous' ? 'PPage' : 'NPage');\n picker = await this.waitForResumePicker(session, picker.fingerprint) ?? picker;\n return { type: 'resume-picker', content: '已切换 Picker 页面。', session, picker };\n }\n const optionId = action.action.startsWith('select:') ? action.action.slice('select:'.length) : '';\n const option = picker.options.find((candidate) => candidate.id === optionId);\n if (!option) return { type: 'resume-picker', content: '所选项已变化,已刷新。', session, picker };\n const restored = await this.sessionStarts.run(\n { sessionId, agent: session.agent, cwd: session.cwd, resume: request.resume, source: 'resume-picker' },\n async (context) => {\n const restoringSession = { ...session };\n const delta = option.visibleIndex - picker.selectedIndex;\n const key = delta < 0 ? 'Up' : 'Down';\n await context.stage('resume-selection', async () => {\n for (let step = 0; step < Math.abs(delta); step += 1) {\n await this.tmux.sendKey(session.paneId, key, context.signal);\n }\n const pane = await this.tmux.inspect(session.paneId, context.signal);\n if (!pane || pane.dead) throw await this.startupExitedError(session, pane);\n await this.tmux.sendKey(session.paneId, 'Enter', context.signal);\n this.pendingResumePickers.delete(sessionId);\n const claimed = await this.waitForInitialAgentSessionClaim(restoringSession, pane.pid, context.signal);\n if (!claimed.ok) throw daemonResultAppError(claimed);\n if (restoringSession.agentSessionId) {\n const persisted = await this.handleAgentSessionStarted({\n sessionId,\n agent: session.agent,\n agentSessionId: restoringSession.agentSessionId,\n cwd: session.cwd,\n source: 'resume-picker',\n });\n if (!persisted.ok) throw daemonResultAppError(persisted);\n }\n await this.tmux.preserveOnExit(session.sessionName, false, context.signal);\n });\n return session;\n },\n async (_context, error) => this.cleanupStartTransaction(sessionId, session.sessionName, error),\n );\n if (!restored.ok) {\n const failed = fail(restored.error);\n if (restored.error.code === 'AGENT_SESSION_IN_USE') {\n const ownerSessionId = typeof restored.error.context.ownerSessionId === 'string'\n ? restored.error.context.ownerSessionId\n : undefined;\n const owner = ownerSessionId ? this.state.sessions?.[ownerSessionId] : undefined;\n if (owner) {\n this.pendingStartupConflicts.set(sessionId, { request, ownerSessionId: owner.id });\n return {\n type: 'startup-conflict',\n content: '所选原生 Session 已由现有 LCA Session 连接。',\n request,\n owner,\n };\n }\n }\n return larkStartupError(failed, request);\n }\n const selected = await this.useSession(sessionId);\n if (!selected.ok) return { type: 'error', content: remoteError(selected) };\n await this.rememberSessionWorkspace(session.cwd);\n return { type: 'session-created', content: remoteStartSuccess(session), session };\n }\n\n private async readResumePicker(session: ManagedSession, signal?: AbortSignal): Promise<ResumePickerView | undefined> {\n const pane = await this.tmux.inspect(session.paneId, signal);\n if (!pane || pane.dead) return undefined;\n const raw = await this.tmux.capture(session.paneId, 120, signal).catch(() => '');\n return parseResumePicker(raw, session.agent);\n }\n\n private async handleResumePickerDeliveryFailure(candidate: ManagedSession): Promise<void> {\n const current = this.state.sessions?.[candidate.id];\n if (!current || current.paneId !== candidate.paneId || !this.pendingResumePickers.has(candidate.id)) return;\n await this.log(`resume picker delivery failed; rolling back provisional session: session=${candidate.id} pane=${candidate.paneId}`);\n await this.stopSession(candidate.id);\n }\n\n private async waitForResumePicker(\n session: ManagedSession,\n previousFingerprint?: string,\n timeoutMs = 2_500,\n signal?: AbortSignal,\n ): Promise<ResumePickerView | undefined> {\n const deadline = Date.now() + timeoutMs;\n let latest: ResumePickerView | undefined;\n while (Date.now() < deadline) {\n if (signal?.aborted) throw signal.reason;\n latest = await this.readResumePicker(session, signal);\n if (latest && (!previousFingerprint || latest.fingerprint !== previousFingerprint)) return latest;\n await abortableDelay(100, signal);\n }\n return latest;\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, signal?: AbortSignal): 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 await this.tmux.killSession(session.sessionName, signal);\n await this.forgetSessionState(sessionId);\n return { ok: true };\n }\n\n private async forgetSessionState(sessionId: string): Promise<void> {\n const sessions = { ...this.state.sessions };\n delete sessions[sessionId];\n this.pendingResumePickers.delete(sessionId);\n this.pendingStartupConflicts.delete(sessionId);\n for (const [pendingId, conflict] of this.pendingStartupConflicts) {\n if (conflict.ownerSessionId === sessionId) this.pendingStartupConflicts.delete(pendingId);\n }\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 }\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 await this.refreshNativeAgentSessionClaims();\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 || this.pendingResumePickers?.has(session.id)\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 await this.log(\n `manual fallback sent: session=${session.id} agent=${session.agent} pane=${session.paneId} state=${screen.state} fingerprint=${screen.fingerprint}`,\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 completingSession = this.state.sessions?.[candidate.sessionId];\n if (completingSession) {\n const claimed = await this.handleAgentSessionStarted({\n sessionId: candidate.sessionId,\n agent: completingSession.agent,\n agentSessionId: candidate.agentSessionId,\n cwd: candidate.cwd,\n source: 'Stop',\n });\n if (!claimed.ok) return claimed;\n }\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 async handleAgentSessionStarted(candidate: AgentSessionStartedCandidate): Promise<DaemonResult> {\n if (!validSessionStartCandidate(candidate)) return { ok: false, error: 'invalid agent-session candidate' };\n const session = this.state.sessions?.[candidate.sessionId];\n if (session && session.agent !== candidate.agent) {\n return { ok: false, error: 'agent-session candidate does not match managed session' };\n }\n const owner = this.findAgentSessionOwner(candidate.agent, candidate.agentSessionId, candidate.sessionId);\n if (owner) {\n this.pendingAgentSessionClaims.set(candidate.sessionId, candidate);\n await this.log(\n `agent session conflict: session=${candidate.sessionId} agent=${candidate.agent} agentSession=${candidate.agentSessionId} owner=${owner.id}`,\n );\n setTimeout(() => void this.rejectDuplicateAgentSession(candidate, owner), 100);\n return fail(agentSessionInUse(candidate.sessionId, owner.id));\n }\n if (!session) {\n this.pendingAgentSessionClaims.set(candidate.sessionId, candidate);\n return { ok: true };\n }\n if (session.agentSessionId === candidate.agentSessionId) return { ok: true };\n const updated = { ...session, agentSessionId: candidate.agentSessionId, updatedAt: Date.now() };\n this.state = {\n ...this.state,\n sessions: { ...this.state.sessions, [session.id]: updated },\n updatedAt: Date.now(),\n };\n this.pendingAgentSessionClaims.delete(session.id);\n await this.store.saveState(this.state);\n await this.tmux.writeMetadata(session.sessionName, {\n managed: true,\n sessionId: session.id,\n agent: session.agent,\n cwd: session.cwd,\n agentVersion: session.agentVersion,\n agentSessionId: candidate.agentSessionId,\n }).catch((error) => this.log(`failed to persist agent session claim for ${session.id}: ${errorMessage(error)}`));\n await this.log(\n `agent session claimed: session=${session.id} agent=${session.agent} agentSession=${candidate.agentSessionId}`,\n );\n return { ok: true };\n }\n\n private async refreshNativeAgentSessionClaims(): Promise<void> {\n for (const session of Object.values(this.state.sessions ?? {})) {\n if (session.agentSessionId) continue;\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) continue;\n const agentSessionId = await resolveNativeAgentSessionId(session.agent, pane.pid).catch((error) => {\n void this.log(`failed to resolve native agent session for ${session.id}: ${errorMessage(error)}`);\n return undefined;\n });\n if (!agentSessionId) continue;\n await this.handleAgentSessionStarted({\n sessionId: session.id,\n agent: session.agent,\n agentSessionId,\n cwd: session.cwd,\n source: 'runtime-discovery',\n });\n }\n }\n\n private async waitForInitialAgentSessionClaim(\n session: ManagedSession,\n panePid: number,\n signal?: AbortSignal,\n ): Promise<DaemonResult> {\n const deadline = Date.now() + 3_500;\n while (Date.now() < deadline) {\n if (session.agentSessionId) return { ok: true };\n const committedClaim = this.state.sessions?.[session.id]?.agentSessionId;\n if (committedClaim) {\n session.agentSessionId = committedClaim;\n return { ok: true };\n }\n const pending = this.pendingAgentSessionClaims.get(session.id);\n if (pending) {\n const claimed = this.claimStartingAgentSession(session, pending);\n if (!claimed.ok || session.agentSessionId) return claimed;\n }\n if (signal?.aborted) throw signal.reason;\n const pane = await this.tmux.inspect(session.paneId, signal);\n if (signal?.aborted) throw signal.reason;\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\n const agentSessionId = await resolveNativeAgentSessionId(\n session.agent,\n panePid,\n undefined,\n signal,\n ).catch(() => undefined);\n if (agentSessionId) {\n return this.claimStartingAgentSession(session, {\n sessionId: session.id,\n agent: session.agent,\n agentSessionId,\n cwd: session.cwd,\n source: 'startup-discovery',\n });\n }\n await abortableDelay(100, signal);\n }\n const pane = await this.tmux.inspect(session.paneId, signal);\n if (signal?.aborted) throw signal.reason;\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\n const pending = this.pendingAgentSessionClaims.get(session.id);\n if (pending) return this.claimStartingAgentSession(session, pending);\n const committedClaim = this.state.sessions?.[session.id]?.agentSessionId;\n if (committedClaim) {\n session.agentSessionId = committedClaim;\n return { ok: true };\n }\n if (session.agentSessionId) return { ok: true };\n return fail(new AppError(\n 'AGENT_IDENTITY_TIMEOUT',\n `unable to identify resumed native session: ${session.id}`,\n { sessionId: session.id, agent: session.agent },\n ));\n }\n\n private claimStartingAgentSession(\n session: ManagedSession,\n candidate: AgentSessionStartedCandidate,\n ): DaemonResult {\n if (candidate.agent !== session.agent) {\n return fail(new AppError('START_FAILED', 'agent-session candidate does not match starting session', {\n sessionId: session.id,\n agent: session.agent,\n }));\n }\n const owner = this.findAgentSessionOwner(candidate.agent, candidate.agentSessionId, session.id);\n if (owner) {\n this.pendingAgentSessionClaims.delete(session.id);\n return fail(agentSessionInUse(session.id, owner.id));\n }\n session.agentSessionId = candidate.agentSessionId;\n session.updatedAt = Date.now();\n this.pendingAgentSessionClaims.delete(session.id);\n return { ok: true };\n }\n\n private async startupExitedError(session: ManagedSession, pane?: { exitStatus?: number }): Promise<AppError> {\n const terminalTail = await this.tmux.capture(session.paneId, 40)\n .then((output) => tailScreen(output, 40).slice(-3_000))\n .catch(() => '');\n return new AppError(\n 'AGENT_EXITED_DURING_STARTUP',\n `agent exited during startup: ${session.id}`,\n {\n sessionId: session.id,\n agent: session.agent,\n terminalExcerpt: startupTerminalExcerpt(terminalTail),\n exitStatus: pane?.exitStatus,\n },\n );\n }\n\n private async waitForStartupStability(\n session: ManagedSession,\n durationMs: number,\n signal?: AbortSignal,\n ): Promise<DaemonResult> {\n const deadline = Date.now() + durationMs;\n while (Date.now() < deadline) {\n if (signal?.aborted) throw signal.reason;\n const pane = await this.tmux.inspect(session.paneId, signal);\n if (signal?.aborted) throw signal.reason;\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\n await abortableDelay(80, signal);\n }\n return { ok: true };\n }\n\n private findAgentSessionOwner(\n agent: AgentId,\n agentSessionId: string,\n excludeSessionId: string,\n ): Pick<ManagedSession, 'id'> | undefined {\n const persisted = Object.values(this.state.sessions ?? {}).find((candidate) => (\n candidate.id !== excludeSessionId\n && candidate.agent === agent\n && candidate.agentSessionId === agentSessionId\n ));\n if (persisted) return persisted;\n const pending = [...this.pendingAgentSessionClaims.values()].find((candidate) => (\n candidate.sessionId !== excludeSessionId\n && candidate.agent === agent\n && candidate.agentSessionId === agentSessionId\n ));\n return pending ? { id: pending.sessionId } : undefined;\n }\n\n private async rejectDuplicateAgentSession(\n candidate: AgentSessionStartedCandidate,\n owner: Pick<ManagedSession, 'id'>,\n ): Promise<void> {\n const duplicate = this.state.sessions?.[candidate.sessionId];\n if (duplicate) await this.stopSession(duplicate.id).catch((error) => this.log(\n `failed to stop duplicate agent session ${duplicate.id}: ${errorMessage(error)}`,\n ));\n else {\n const sessionName = `${this.sessionName}-${candidate.sessionId}`;\n if (await this.tmux.hasSession(sessionName)) await this.tmux.killSession(sessionName).catch(() => undefined);\n }\n this.pendingAgentSessionClaims.delete(candidate.sessionId);\n if (this.state.boundChatId) {\n await this.gateway?.sendText(\n this.state.boundChatId,\n `${candidate.agent} 原生 session 已由 LCA session「${owner.id}」连接;已停止重复创建的「${candidate.sessionId}」。请用 /sessions 连接「${owner.id}」。`,\n ).catch((error) => this.log(`agent session conflict notification failed: ${errorMessage(error)}`));\n }\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(discover = false, signal?: AbortSignal): Promise<ManagedSession[]> {\n const previousActive = this.state.activeSessionId;\n const result = await this.reconciler.reconcile(this.state, discover, signal);\n if (!result.changed) return result.liveSessions;\n const activeChanged = result.state.activeSessionId !== previousActive;\n if (result.removedActive) {\n await this.log(\n `session removed: session=${result.removedActive.id} agent=${result.removedActive.agent} pane=${result.removedActive.paneId} wasActive=true nextActive=${result.state.activeSessionId ?? '-'}`,\n );\n }\n if (activeChanged && result.removedActive\n && this.previousScreen?.state !== 'exited' && this.state.boundChatId) {\n await this.gateway?.sendText(\n this.state.boundChatId,\n `${getAgentAdapter(result.removedActive.agent).displayName}/tmux pane 已退出。`,\n ).catch((error) => this.log(`exit notification failed: ${errorMessage(error)}`));\n }\n this.state = result.state;\n for (const sessionId of this.pendingResumePickers.keys()) {\n if (!this.state.sessions?.[sessionId]) this.pendingResumePickers.delete(sessionId);\n }\n for (const [sessionId, conflict] of this.pendingStartupConflicts) {\n if (!this.state.sessions?.[conflict.ownerSessionId]) this.pendingStartupConflicts.delete(sessionId);\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 result.liveSessions;\n }\n\n private async useSession(sessionId: string): Promise<DaemonResult> {\n const session = this.state.sessions?.[sessionId];\n if (!session) return fail(new AppError('SESSION_NOT_FOUND', `unknown session: ${sessionId}`, { sessionId }));\n const pane = await this.tmux.inspect(session.paneId);\n if (!pane || pane.dead) return fail(await this.startupExitedError(session, pane));\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 await this.log(`session activated: session=${session.id} agent=${session.agent} pane=${session.paneId}`);\n return { ok: true, value: session };\n }\n\n private async startRemoteSession(\n request: StartSessionRequest,\n ): Promise<\n | { ok: true; state: 'ready'; session: ManagedSession }\n | { ok: true; state: 'picker'; session: ManagedSession; picker: ResumePickerView }\n | { ok: true; state: 'conflict'; request: StartSessionRequest; owner: ManagedSession }\n | { ok: false; error: DaemonResult }\n > {\n await this.log(\n `remote session create requested: session=${request.sessionId} agent=${request.agent} resume=${request.resume?.mode ?? 'new'}`,\n );\n const started = await this.startSession(request.sessionId, request.cwd, request.agent, request.resume, 'lark');\n if (!started.ok) {\n await this.log(`remote session create failed: session=${request.sessionId} code=${started.errorCode ?? 'UNKNOWN'}`);\n if (started.errorCode === 'AGENT_SESSION_IN_USE') {\n const ownerSessionId = typeof started.errorContext?.ownerSessionId === 'string'\n ? started.errorContext.ownerSessionId\n : undefined;\n const owner = ownerSessionId ? this.state.sessions?.[ownerSessionId] : undefined;\n if (owner) {\n this.pendingStartupConflicts.set(request.sessionId, { request, ownerSessionId: owner.id });\n return { ok: true, state: 'conflict', request, owner };\n }\n }\n return { ok: false, error: started };\n }\n const selected = await this.useSession(request.sessionId);\n if (!selected.ok) {\n await this.log(`remote session activation failed: session=${request.sessionId} code=${selected.errorCode ?? 'UNKNOWN'}`);\n return { ok: false, error: selected };\n }\n const session = selected.value as ManagedSession;\n if (request.resume?.mode === 'picker') {\n const picker = (started.value as { resumePicker?: ResumePickerView }).resumePicker;\n if (picker) {\n this.pendingResumePickers.set(session.id, request);\n return { ok: true, state: 'picker', session, picker };\n }\n await this.tmux.preserveOnExit(session.sessionName, false).catch((error) => this.log(\n `failed to disable remain-on-exit after resume picker fallback: session=${session.id} error=${errorMessage(error)}`,\n ));\n }\n return { ok: true, state: 'ready', session };\n }\n\n private async createSessionWorkspaceView(\n chatId: string,\n draft: SessionCreateDraft = emptySessionCreateDraft(),\n ): Promise<SessionCreateView> {\n await this.reconcileSessions(true);\n const latestConfig = await this.store.loadConfig();\n const discovered = await discoverWorkspaces({\n workspaceRoots: latestConfig?.workspaceRoots ?? this.config.workspaceRoots,\n activeSessions: Object.values(this.state.sessions ?? {}),\n recentWorkspaces: this.state.recentWorkspaces ?? [],\n });\n for (const warning of discovered.warnings) await this.log(`workspace discovery warning: ${warning}`);\n const snapshot = this.workspaceSnapshots.create({\n chatId,\n ownerOpenId: this.state.ownerOpenId ?? '',\n candidates: discovered.candidates,\n warnings: discovered.warnings,\n partial: discovered.partial,\n });\n return discovered.candidates.length > 0\n ? this.sessionWorkspaceView(snapshot, draft)\n : this.manualSessionCreateView(snapshot, draft);\n }\n\n private sessionWorkspaceView(snapshot: WorkspaceSnapshot, draft: SessionCreateDraft): SessionCreateView {\n const visibleCandidates = snapshot.candidates.slice(0, 99);\n return {\n mode: 'projects', snapshotId: snapshot.id, page: 0, pageCount: 1,\n hasProjectCandidates: snapshot.candidates.length > 0,\n candidates: visibleCandidates,\n warnings: snapshot.warnings,\n partial: snapshot.partial || visibleCandidates.length < snapshot.candidates.length,\n draft,\n };\n }\n\n private sessionCreateRetryView(snapshot: WorkspaceSnapshot | undefined, draft: SessionCreateDraft): SessionCreateView {\n return snapshot && snapshot.candidates.length > 0\n ? this.sessionWorkspaceView(snapshot, draft)\n : this.manualSessionCreateView(snapshot, draft);\n }\n\n private manualSessionCreateView(\n snapshot: WorkspaceSnapshot | undefined,\n draft: SessionCreateDraft,\n requestedPage = 0,\n ): SessionCreateView {\n const pageCount = Math.max(1, Math.ceil((snapshot?.candidates.length ?? 0) / 20));\n const page = Math.max(0, Math.min(pageCount - 1, requestedPage));\n const noCandidates = snapshot && snapshot.candidates.length === 0\n ? ['尚未发现可选项目;请手动填写路径,或在本机运行 lca workspace add ~/workspace。']\n : [];\n return {\n mode: 'manual', snapshotId: snapshot?.id, page,\n hasProjectCandidates: (snapshot?.candidates.length ?? 0) > 0,\n pageCount, candidates: [],\n warnings: [...(snapshot?.warnings ?? []), ...noCandidates], partial: snapshot?.partial ?? false,\n draft: { ...draft, manualCwd: draft.manualCwd ?? (draft.cwd !== SESSION_CREATE_MANUAL_VALUE ? draft.cwd : undefined) },\n };\n }\n\n private async rememberSessionWorkspace(cwd: string): Promise<void> {\n this.state = {\n ...this.state,\n recentWorkspaces: rememberRecentWorkspace(this.state.recentWorkspaces, cwd),\n updatedAt: Date.now(),\n };\n await this.store.saveState(this.state).catch((error) => this.log(\n `failed to persist recent workspace: cwd=${cwd} error=${errorMessage(error)}`,\n ));\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 daemonResultAppError(result: Extract<DaemonResult, { ok: false }>): AppError {\n return new AppError(\n result.errorCode ?? 'START_FAILED',\n result.error,\n result.errorContext ?? {},\n );\n}\n\nfunction abortableDelay(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', aborted);\n resolve();\n }, ms);\n const aborted = (): void => {\n clearTimeout(timer);\n reject(signal.reason);\n };\n signal.addEventListener('abort', aborted, { once: true });\n });\n}\n\nfunction agentSessionInUse(sessionId: string, ownerSessionId: string): AppError {\n return new AppError(\n 'AGENT_SESSION_IN_USE',\n `agent session is already managed by ${ownerSessionId}`,\n { sessionId, ownerSessionId },\n );\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 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 sessionCreateDraftFromForm(values: Record<string, unknown>): SessionCreateDraft {\n const sessionId = formString(values[SESSION_CREATE_NAME_FIELD]);\n const agentValue = formString(values[SESSION_CREATE_AGENT_FIELD]);\n const projectCwd = formString(values[SESSION_CREATE_PROJECT_FIELD]);\n const manualCwd = formString(values[SESSION_CREATE_CWD_FIELD]);\n const resumeMode = formString(values[SESSION_CREATE_RESUME_FIELD]) || 'new';\n const cwd = projectCwd === SESSION_CREATE_MANUAL_VALUE\n ? manualCwd\n : projectCwd || manualCwd;\n return {\n sessionId: sessionId || undefined,\n agent: normalizeAgentId(agentValue) ?? 'codex',\n resumeMode: resumeMode === 'picker' ? 'picker' : 'new',\n cwd: cwd || undefined,\n projectCwd: projectCwd || undefined,\n manualCwd: manualCwd || undefined,\n };\n}\n\nfunction startRequestFromDraft(\n draft: SessionCreateDraft,\n): { ok: true; value: StartSessionRequest } | { ok: false; error: string } {\n const sessionId = draft.sessionId?.trim() ?? '';\n if (!sessionId) return { ok: false, error: '请填写 Session 名称。' };\n if (!draft.cwd || draft.cwd === SESSION_CREATE_MANUAL_VALUE) return { ok: false, error: '请选择或填写项目目录。' };\n let resume: AgentResume | undefined;\n if (draft.resumeMode === 'picker') resume = { mode: 'picker' };\n return { ok: true, value: { sessionId, agent: draft.agent, cwd: draft.cwd, resume } };\n}\n\nfunction formString(value: unknown): string {\n if (typeof value === 'string') return value.trim();\n if (value && typeof value === 'object' && typeof (value as Record<string, unknown>).value === 'string') {\n return ((value as Record<string, unknown>).value as string).trim();\n }\n return '';\n}\n\nfunction remoteStartSuccess(session: ManagedSession): string {\n return `已启动并连接 ${getAgentAdapter(session.agent).displayName} session「${session.id}」。`;\n}\n\nfunction larkStartupError(result: DaemonResult, request: Pick<StartSessionRequest, 'sessionId' | 'agent'>): LarkActionResult {\n const failure = sessionStartupFailure(result, request);\n return failure\n ? { type: 'session-start-failed', content: `${failure.agent} 启动失败。`, failure }\n : { type: 'error', content: remoteError(result) };\n}\n\nfunction remoteError(result: DaemonResult): string {\n if (result.ok) return '操作已完成。';\n const context = result.errorContext ?? {};\n const sessionId = typeof context.sessionId === 'string' ? context.sessionId : '该名称';\n switch (result.errorCode) {\n case 'SESSION_EXISTS': return context.source === 'tmux'\n ? `无法启动 session「${sessionId}」:检测到同名 tmux 会话,但它未登记为可连接的 LCA session。请换一个名称,或在本机检查 tmux 会话。`\n : `无法启动 session「${sessionId}」:该 session 已在运行。请换一个名称,或用 /sessions 连接现有 session。`;\n case 'SESSION_STARTING':\n return `session「${sessionId}」正在启动,请等待当前操作完成后再试。`;\n case 'SESSION_START_TIMEOUT': {\n const agent = typeof context.agent === 'string' ? context.agent : 'Agent';\n const cwd = typeof context.cwd === 'string' ? context.cwd : '未知目录';\n const stage = typeof context.stage === 'string' ? context.stage : 'unknown';\n const excerpt = typeof context.terminalExcerpt === 'string' && context.terminalExcerpt.trim()\n ? `\\n\\n最近终端输出:\\n${context.terminalExcerpt}`\n : '';\n return `无法启动 session「${sessionId}」:${agent} 启动超过 30 秒,已取消并清理。\\n\\n工作目录:${cwd}\\n超时阶段:${stage}${excerpt}`;\n }\n case 'AGENT_SESSION_IN_USE': {\n const ownerSessionId = typeof context.ownerSessionId === 'string' ? context.ownerSessionId : '现有 session';\n return `无法启动 session「${sessionId}」:该 Agent 原生 session 已由 LCA session「${ownerSessionId}」连接。请用 /sessions 连接现有 session。`;\n }\n case 'AGENT_EXITED_DURING_STARTUP': {\n const agent = typeof context.agent === 'string' ? context.agent : 'Agent';\n const exitStatus = typeof context.exitStatus === 'number' ? `(退出码 ${context.exitStatus})` : '';\n const excerpt = typeof context.terminalExcerpt === 'string'\n ? context.terminalExcerpt\n : 'Agent 未输出可用错误信息。';\n return `无法启动 session「${sessionId}」:${agent} 启动后立即退出${exitStatus}。\\n\\n原始错误:\\n${excerpt}`;\n }\n case 'AGENT_IDENTITY_TIMEOUT':\n return `无法恢复 session「${sessionId}」:Agent 仍在运行,但未能确认原生 session ID。请重试或启动新会话。`;\n case 'INVALID_SESSION_NAME': return 'Session 名称无效:只能包含字母、数字、下划线和短横线,长度为 1–40 个字符。';\n case 'INVALID_CWD': return `工作目录不可用:${typeof context.cwd === 'string' ? context.cwd : '请填写本机存在的绝对路径'}。`;\n case 'BINARY_NOT_FOUND': return `找不到 Agent 命令:${typeof context.binary === 'string' ? context.binary : '请检查安装与 PATH'}。`;\n case 'INVALID_OPTIONS':\n case 'INVALID_RESUME': return typeof context.reason === 'string' ? context.reason : '启动参数无效,请检查后重试。';\n case 'START_FAILED': return `无法启动 session「${sessionId}」。请检查工作目录、Agent 安装,或在本机运行 lca logs 查看日志。`;\n default: return '操作失败,请稍后重试;可在本机运行 lca status 和 lca logs 检查。';\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; signal?: AbortSignal } = {},\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n execFile(\n file,\n [...args],\n {\n cwd: options.cwd,\n timeout: options.timeoutMs ?? 10_000,\n signal: options.signal,\n encoding: 'utf8',\n maxBuffer: 4 * 1024 * 1024,\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n}\n\nexport function runFileWithInput(\n file: string,\n args: readonly string[],\n input: string,\n): Promise<CommandResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, [...args], { stdio: ['pipe', 'pipe', 'pipe'] });\n let stdout = '';\n let stderr = '';\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => (stdout += chunk));\n child.stderr.on('data', (chunk: string) => (stderr += chunk));\n child.once('error', reject);\n child.once('exit', (code, signal) => {\n if (code === 0) resolve({ stdout, stderr });\n else reject(new Error(`${file} exited with ${code ?? signal}: ${stderr.trim()}`));\n });\n child.stdin.end(input, 'utf8');\n });\n}\n","// 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';\nimport { normalizeAgentId } from '../agents/types.js';\nimport { normalizeWorkspacePath, normalizeWorkspaceRoots, validateWorkspaceDirectory } from '../workspace/path.js';\n\nexport class AppStore {\n constructor(readonly paths: AppPaths) {}\n\n async ensure(): Promise<void> {\n await mkdir(this.paths.root, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.runtimeDir, { recursive: true, mode: 0o700 });\n await mkdir(this.paths.logsDir, { recursive: true, mode: 0o700 });\n await Promise.all([\n chmod(this.paths.root, 0o700),\n chmod(this.paths.runtimeDir, 0o700),\n chmod(this.paths.logsDir, 0o700),\n ]);\n }\n\n async loadConfig(): Promise<AppConfig | undefined> {\n const config = await readJson<LegacyConfig>(this.paths.config);\n if (!config) return undefined;\n const binaries = config.agentBinaries ?? {};\n return {\n tenant: config.tenant,\n appId: config.appId,\n tmuxBinary: config.tmuxBinary,\n agentBinaries: {\n codex: binaries.codex ?? 'codex',\n traex: binaries.traex ?? binaries['trae-cli'] ?? 'trae-cli',\n claude: binaries.claude ?? binaries['claude-code'] ?? 'claude',\n },\n pollIntervalMs: config.pollIntervalMs,\n workspaceRoots: normalizeWorkspaceRoots(config.workspaceRoots ?? []),\n };\n }\n\n saveConfig(config: AppConfig): Promise<void> {\n return writeJsonAtomic(this.paths.config, {\n ...config,\n workspaceRoots: normalizeWorkspaceRoots(config.workspaceRoots),\n });\n }\n\n loadSecrets(): Promise<AppSecrets | undefined> {\n return readJson(this.paths.secrets);\n }\n\n saveSecrets(secrets: AppSecrets): Promise<void> {\n return writeJsonAtomic(this.paths.secrets, secrets);\n }\n\n async loadState(): Promise<SessionState> {\n const state = await readJson<LegacyState>(this.paths.state);\n if (!state) return emptyState();\n const sessions = Object.fromEntries(Object.entries(state.sessions ?? {}).flatMap(([id, session]) => {\n const agent = normalizeAgentId(session.agent);\n return agent ? [[id, { ...session, agent }]] : [];\n }));\n const recentWorkspaces = await normalizeRecentWorkspaces(state.recentWorkspaces ?? []);\n return { ...state, sessions, recentWorkspaces };\n }\n\n saveState(state: SessionState): Promise<void> {\n return writeJsonAtomic(this.paths.state, state);\n }\n}\n\ninterface LegacyConfig extends Omit<AppConfig, 'agentBinaries' | 'workspaceRoots'> {\n agentBinaries: Partial<Record<'codex' | 'traex' | 'claude' | 'trae-cli' | 'claude-code', string>>;\n workspaceRoots?: string[];\n}\n\nasync function normalizeRecentWorkspaces(\n values: NonNullable<SessionState['recentWorkspaces']>,\n): Promise<NonNullable<SessionState['recentWorkspaces']>> {\n const unique = new Set<string>();\n const result: NonNullable<SessionState['recentWorkspaces']> = [];\n const ordered = [...values].sort((left, right) => right.lastUsedAt - left.lastUsedAt);\n for (const value of ordered) {\n if (result.length >= 30) break;\n if (!Number.isFinite(value.lastUsedAt)) continue;\n let cwd: string;\n try {\n cwd = normalizeWorkspacePath(value.cwd);\n await validateWorkspaceDirectory(cwd);\n } catch {\n continue;\n }\n if (unique.has(cwd)) continue;\n unique.add(cwd);\n result.push({ cwd, lastUsedAt: value.lastUsedAt });\n }\n return result;\n}\n\ninterface LegacyState extends Omit<SessionState, 'sessions'> {\n sessions?: Record<string, Omit<NonNullable<SessionState['sessions']>[string], 'agent'> & { agent: string }>;\n}\n\nexport function createBindCode(): string {\n return randomBytes(16).toString('base64url');\n}\n\nexport function hashBindCode(code: string): string {\n const salt = randomBytes(16);\n const digest = scryptSync(code, salt, 32);\n return `${salt.toString('base64url')}.${digest.toString('base64url')}`;\n}\n\nexport function verifyBindCode(code: string, encoded: string): boolean {\n const [saltText, digestText] = encoded.split('.');\n if (!saltText || !digestText) return false;\n const expected = Buffer.from(digestText, 'base64url');\n const actual = scryptSync(code, Buffer.from(saltText, 'base64url'), expected.length);\n return actual.length === expected.length && timingSafeEqual(actual, expected);\n}\n","import type { AgentId } from '../agents/types.js';\n\nexport type Tenant = 'feishu' | 'lark';\n\nexport interface AppConfig {\n tenant: Tenant;\n appId: string;\n tmuxBinary: string;\n agentBinaries: Record<AgentId, string>;\n pollIntervalMs: number;\n workspaceRoots: string[];\n}\n\nexport interface RecentWorkspace {\n cwd: string;\n lastUsedAt: number;\n}\n\nexport interface AppSecrets {\n appSecret: string;\n callbackSecret: string;\n}\n\nexport interface ManagedSession {\n id: string;\n agent: AgentId;\n sessionName: string;\n paneId: string;\n cwd: string;\n agentVersion: string;\n agentSessionId?: string;\n updatedAt: number;\n}\n\nexport interface SessionState {\n schemaVersion: 2;\n ownerOpenId?: string;\n boundChatId?: string;\n autoBindDisabled?: boolean;\n activeSessionId?: string;\n sessions?: Record<string, ManagedSession>;\n recentWorkspaces?: RecentWorkspace[];\n bindCodeHash?: string;\n bindCodeExpiresAt?: number;\n updatedAt: number;\n}\n\nexport function emptyState(now = Date.now()): SessionState {\n return { schemaVersion: 2, sessions: {}, updatedAt: now };\n}\n","import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nexport async function readJson<T>(path: string): Promise<T | undefined> {\n try {\n return JSON.parse(await readFile(path, 'utf8')) as T;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n throw error;\n }\n}\n\nexport async function writeJsonAtomic(path: string, value: unknown, mode = 0o600): Promise<void> {\n const parent = dirname(path);\n await mkdir(parent, { recursive: true, mode: 0o700 });\n await chmod(parent, 0o700).catch(() => undefined);\n const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;\n const file = await open(temporary, 'w', mode);\n try {\n await file.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n await file.sync();\n } finally {\n await file.close();\n }\n await rename(temporary, path);\n await chmod(path, mode);\n}\n","import type { AppConfig } from '../core/model.js';\nimport type { ScreenDetection } from '../screen/detector.js';\n\nexport const AGENT_IDS = ['codex', 'traex', 'claude'] as const;\nexport type AgentId = typeof AGENT_IDS[number];\nexport type LegacyAgentId = 'trae-cli' | 'claude-code';\n\nexport function normalizeAgentId(value: string): AgentId | undefined {\n if (value === 'trae-cli') return 'traex';\n if (value === 'claude-code') return 'claude';\n return (AGENT_IDS as readonly string[]).includes(value) ? value as AgentId : undefined;\n}\n\nexport type AgentResume =\n | { mode: 'picker'; all?: boolean }\n | { mode: 'last' }\n | { mode: 'session'; sessionId: string };\n\nexport interface ResumeOptions {\n resume?: boolean | string;\n resumeLast?: boolean;\n resumeAll?: boolean;\n}\n\nexport interface TurnCompleteCandidate {\n sessionId: string;\n eventId: string;\n agentSessionId: string;\n cwd: string;\n lastAssistantMessage: string;\n}\n\nexport interface AgentSessionStartedCandidate {\n sessionId: string;\n agent: AgentId;\n agentSessionId: string;\n cwd: string;\n source?: string;\n}\n\nexport interface LaunchInput {\n resume?: AgentResume;\n stopHookCommand: string;\n}\n\nexport interface AgentAdapter {\n id: AgentId;\n displayName: string;\n groupOrder: number;\n binary(config: AppConfig): string;\n versionArgs: readonly string[];\n buildLaunchArgs(input: LaunchInput): string[];\n detectScreen(raw: string, paneAlive: boolean, cursor?: { x: number; y: number }): ScreenDetection;\n}\n","import { constants } from 'node:fs';\nimport { access, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { isAbsolute, normalize, resolve } from 'node:path';\nimport { AppError, systemErrorCode } from '../core/errors.js';\n\nexport function normalizeWorkspacePath(input: string, home = homedir()): string {\n const value = input.trim();\n if (!value) throw invalidCwd(input, '工作目录不能为空');\n let expanded = value;\n if (value === '~') expanded = home;\n else if (value.startsWith('~/')) expanded = resolve(home, value.slice(2));\n else if (value.startsWith('~')) throw invalidCwd(input, '不支持 ~other-user,请使用 ~ 或 ~/目录');\n if (!isAbsolute(expanded)) throw invalidCwd(input, '工作目录必须是绝对路径,或使用 ~/目录');\n return normalize(expanded);\n}\n\nexport async function validateWorkspaceDirectory(input: string, home = homedir()): Promise<string> {\n const cwd = normalizeWorkspacePath(input, home);\n let info;\n try {\n info = await stat(cwd);\n } catch (error) {\n const reason = systemErrorCode(error) === 'EACCES'\n ? `无权访问工作目录:${cwd}`\n : `工作目录不存在或不可用:${cwd}`;\n throw invalidCwd(cwd, reason, error);\n }\n if (!info.isDirectory()) throw invalidCwd(cwd, `工作目录不是文件夹:${cwd}`);\n try {\n await access(cwd, constants.R_OK | constants.X_OK);\n } catch (error) {\n throw invalidCwd(cwd, `无权进入工作目录:${cwd}`, error);\n }\n return cwd;\n}\n\nexport function normalizeWorkspaceRoots(values: readonly string[], home = homedir()): string[] {\n const unique = new Set<string>();\n for (const value of values) unique.add(normalizeWorkspacePath(value, home));\n return [...unique];\n}\n\nfunction invalidCwd(cwd: string, reason: string, cause?: unknown): AppError {\n return new AppError('INVALID_CWD', reason, { cwd, reason }, cause === undefined ? {} : { cause });\n}\n","export const APP_ERROR_CODES = [\n 'SESSION_EXISTS',\n 'SESSION_STARTING',\n 'SESSION_START_TIMEOUT',\n 'AGENT_SESSION_IN_USE',\n 'AGENT_EXITED_DURING_STARTUP',\n 'AGENT_IDENTITY_TIMEOUT',\n 'SESSION_NOT_FOUND',\n 'INVALID_SESSION_NAME',\n 'NOT_INITIALIZED',\n 'INVALID_CWD',\n 'BINARY_NOT_FOUND',\n 'INVALID_OPTIONS',\n 'INVALID_RESUME',\n 'START_FAILED',\n 'DAEMON_UNAVAILABLE',\n 'DAEMON_UNRESPONSIVE',\n 'REQUEST_TIMEOUT',\n 'UNKNOWN',\n] as const;\n\nexport type AppErrorCode = typeof APP_ERROR_CODES[number];\n\nexport type ErrorContext = Record<string, string | number | boolean | undefined>;\n\nexport class AppError extends Error {\n readonly code: AppErrorCode;\n readonly context: ErrorContext;\n\n constructor(\n code: AppErrorCode,\n message: string,\n context: ErrorContext = {},\n options: { cause?: unknown } = {},\n ) {\n super(message, options);\n this.name = 'AppError';\n this.code = code;\n this.context = context;\n }\n}\n\nexport function isAppError(error: unknown): error is AppError {\n return error instanceof AppError;\n}\n\nexport function isAppErrorCode(value: unknown): value is AppErrorCode {\n return typeof value === 'string' && APP_ERROR_CODES.includes(value as AppErrorCode);\n}\n\nexport function asAppError(\n error: unknown,\n code: AppErrorCode = 'UNKNOWN',\n context: ErrorContext = {},\n): AppError {\n if (isAppError(error)) {\n if (Object.keys(context).length === 0) return error;\n return new AppError(error.code, error.message, { ...context, ...error.context }, { cause: error });\n }\n return new AppError(code, errorMessage(error), context, { cause: error });\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function serializeAppError(error: unknown): {\n error: string;\n errorCode?: AppErrorCode;\n errorContext?: ErrorContext;\n} {\n if (!isAppError(error)) return { error: errorMessage(error) };\n const errorContext = Object.fromEntries(\n Object.entries(error.context).filter(([, value]) => value !== undefined),\n );\n return {\n error: error.message,\n errorCode: error.code,\n ...(Object.keys(errorContext).length > 0 ? { errorContext } : {}),\n };\n}\n\nexport function systemErrorCode(error: unknown): string | undefined {\n return error instanceof Error && 'code' in error && typeof error.code === 'string'\n ? error.code\n : undefined;\n}\n","import type { AgentId, AgentResume } from '../agents/types.js';\nimport { AppError } from '../core/errors.js';\nimport { validateWorkspaceDirectory } from '../workspace/path.js';\n\nexport interface StartSessionRequest {\n sessionId: string;\n agent: AgentId;\n cwd: string;\n resume?: AgentResume;\n}\n\nexport async function validateStartSessionRequest(request: StartSessionRequest): Promise<StartSessionRequest> {\n if (!validSessionId(request.sessionId)) {\n throw new AppError(\n 'INVALID_SESSION_NAME',\n 'session name must use letters, digits, underscore, or dash',\n { sessionId: request.sessionId },\n );\n }\n const cwd = await validateWorkspaceDirectory(request.cwd);\n if (request.resume?.mode === 'session' && !request.resume.sessionId.trim()) {\n throw new AppError('INVALID_RESUME', 'resume session id must not be empty', {\n reason: '恢复历史会话时必须提供 session ID',\n });\n }\n return { ...request, cwd };\n}\n\nexport function validSessionId(value: string): boolean {\n return /^[a-zA-Z0-9_-]{1,40}$/.test(value);\n}\n","import type { AgentId } from '../agents/types.js';\nimport type { DaemonResult } from '../daemon/protocol.js';\n\nexport interface SessionStartupFailure {\n sessionId: string;\n agent: AgentId;\n cwd?: string;\n reason?: 'exited' | 'timeout';\n stage?: string;\n elapsedMs?: number;\n exitStatus?: number;\n terminalExcerpt: string;\n}\n\nexport function sessionStartupFailure(\n result: DaemonResult,\n fallback: Pick<SessionStartupFailure, 'sessionId' | 'agent'>,\n): SessionStartupFailure | undefined {\n if (result.ok || (result.errorCode !== 'AGENT_EXITED_DURING_STARTUP'\n && result.errorCode !== 'SESSION_START_TIMEOUT')) return undefined;\n const context = result.errorContext ?? {};\n return {\n sessionId: typeof context.sessionId === 'string' ? context.sessionId : fallback.sessionId,\n agent: fallback.agent,\n reason: result.errorCode === 'SESSION_START_TIMEOUT' ? 'timeout' : 'exited',\n ...(typeof context.cwd === 'string' ? { cwd: context.cwd } : {}),\n ...(typeof context.stage === 'string' ? { stage: context.stage } : {}),\n ...(typeof context.elapsedMs === 'number' ? { elapsedMs: context.elapsedMs } : {}),\n ...(typeof context.exitStatus === 'number' ? { exitStatus: context.exitStatus } : {}),\n terminalExcerpt: typeof context.terminalExcerpt === 'string' && context.terminalExcerpt.trim()\n ? context.terminalExcerpt\n : 'Agent 未输出可用错误信息。',\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport type { AgentId, AgentResume } from '../agents/types.js';\nimport { AppError, asAppError } from '../core/errors.js';\n\nexport type SessionStartSource = 'cli' | 'lark' | 'resume-picker';\n\nexport interface SessionStartDescriptor {\n sessionId: string;\n agent: AgentId;\n cwd: string;\n resume?: AgentResume;\n source: SessionStartSource;\n}\n\nexport interface SessionStartContext extends SessionStartDescriptor {\n startId: string;\n startedAt: number;\n deadline: number;\n signal: AbortSignal;\n remainingMs(): number;\n stage<T>(name: string, operation: () => Promise<T>): Promise<T>;\n}\n\nexport type SessionStartOutcome<T> =\n | { ok: true; value: T }\n | { ok: false; error: AppError };\n\nexport class SessionStartCoordinator {\n private readonly active = new Map<string, { startId: string; startedAt: number }>();\n\n constructor(\n private readonly timeoutMs = 30_000,\n private readonly log: (message: string) => Promise<void> = async () => undefined,\n ) {}\n\n async run<T>(\n descriptor: SessionStartDescriptor,\n execute: (context: SessionStartContext) => Promise<T>,\n cleanup: (context: SessionStartContext, error: AppError) => Promise<void>,\n ): Promise<SessionStartOutcome<T>> {\n const existing = this.active.get(descriptor.sessionId);\n if (existing) {\n return {\n ok: false,\n error: new AppError('SESSION_STARTING', `session is already starting: ${descriptor.sessionId}`, {\n sessionId: descriptor.sessionId,\n agent: descriptor.agent,\n cwd: descriptor.cwd,\n startId: existing.startId,\n elapsedMs: Date.now() - existing.startedAt,\n }),\n };\n }\n\n const startId = randomUUID();\n const startedAt = Date.now();\n const deadline = startedAt + this.timeoutMs;\n const controller = new AbortController();\n let currentStage = 'initializing';\n const fields = logFields({ ...descriptor, startId });\n const context: SessionStartContext = {\n ...descriptor,\n startId,\n startedAt,\n deadline,\n signal: controller.signal,\n remainingMs: () => Math.max(1, deadline - Date.now()),\n stage: async <Value>(name: string, operation: () => Promise<Value>): Promise<Value> => {\n if (controller.signal.aborted || Date.now() >= deadline) {\n throw timeoutError(descriptor, startId, name, startedAt, this.timeoutMs);\n }\n currentStage = name;\n const stageStartedAt = Date.now();\n await this.record(`session start stage requested: ${fields} stage=${name}`);\n try {\n const value = await operation();\n await this.record(`session start stage succeeded: ${fields} stage=${name} elapsedMs=${Date.now() - stageStartedAt}`);\n return value;\n } catch (error) {\n const normalized = controller.signal.aborted || Date.now() >= deadline\n ? timeoutError(descriptor, startId, name, startedAt, this.timeoutMs)\n : asAppError(error, 'START_FAILED', startErrorContext(descriptor, startId, name, startedAt));\n await this.record(`session start stage failed: ${fields} stage=${name} code=${normalized.code} elapsedMs=${Date.now() - stageStartedAt}`);\n throw normalized;\n } finally {\n if (currentStage === name) currentStage = 'finalizing';\n }\n },\n };\n this.active.set(descriptor.sessionId, { startId, startedAt });\n await this.record(`session start requested: ${fields}`);\n\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n const error = timeoutError(descriptor, startId, currentStage, startedAt, this.timeoutMs);\n controller.abort(error);\n reject(error);\n }, this.timeoutMs);\n });\n const operation = execute(context);\n try {\n const value = await Promise.race([operation, timeout]);\n await this.record(`session start succeeded: ${fields} elapsedMs=${Date.now() - startedAt}`);\n return { ok: true, value };\n } catch (error) {\n const normalized = controller.signal.aborted || Date.now() >= deadline\n ? timeoutError(descriptor, startId, errorStage(error), startedAt, this.timeoutMs)\n : asAppError(error, 'START_FAILED', startErrorContext(descriptor, startId, errorStage(error), startedAt));\n if (!controller.signal.aborted) controller.abort(normalized);\n await operation.catch(() => undefined);\n await cleanup(context, normalized).catch(async (cleanupError) => {\n await this.record(`session start cleanup failed: ${fields} code=${normalized.code} detail=${message(cleanupError)}`);\n });\n await this.record(`${normalized.code === 'SESSION_START_TIMEOUT' ? 'session start timed out' : 'session start failed'}: ${fields} code=${normalized.code} stage=${String(normalized.context.stage ?? 'unknown')} elapsedMs=${Date.now() - startedAt}`);\n return { ok: false, error: normalized };\n } finally {\n if (timer) clearTimeout(timer);\n this.active.delete(descriptor.sessionId);\n }\n }\n\n private async record(message: string): Promise<void> {\n await this.log(message).catch(() => undefined);\n }\n}\n\nfunction timeoutError(\n descriptor: SessionStartDescriptor,\n startId: string,\n stage: string,\n startedAt: number,\n timeoutMs: number,\n): AppError {\n return new AppError('SESSION_START_TIMEOUT', `session start exceeded ${timeoutMs} ms: ${descriptor.sessionId}`, {\n ...startErrorContext(descriptor, startId, stage, startedAt),\n timeoutMs,\n });\n}\n\nfunction startErrorContext(\n descriptor: SessionStartDescriptor,\n startId: string,\n stage: string,\n startedAt: number,\n): Record<string, string | number | undefined> {\n return {\n sessionId: descriptor.sessionId,\n agent: descriptor.agent,\n cwd: descriptor.cwd,\n resume: descriptor.resume?.mode ?? 'new',\n source: descriptor.source,\n startId,\n stage,\n elapsedMs: Date.now() - startedAt,\n };\n}\n\nfunction errorStage(error: unknown): string {\n return error instanceof AppError && typeof error.context.stage === 'string' ? error.context.stage : 'unknown';\n}\n\nfunction logFields(descriptor: SessionStartDescriptor & { startId: string }): string {\n return `startId=${descriptor.startId} source=${descriptor.source} session=${descriptor.sessionId} agent=${descriptor.agent} cwd=${JSON.stringify(descriptor.cwd)} resume=${descriptor.resume?.mode ?? 'new'}`;\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { AgentId } from '../agents/types.js';\nimport type { ManagedSession, SessionState } from '../core/model.js';\nimport type { TmuxInspectResult, TmuxPane, TmuxSessionMetadata } from '../tmux/types.js';\nimport { validSessionId } from './start-request.js';\n\nexport interface SessionTmux {\n inspectStatus(paneId: string, signal?: AbortSignal): Promise<TmuxInspectResult>;\n inspectSession(sessionName: string, signal?: AbortSignal): Promise<TmuxInspectResult>;\n listSessions(prefix: string, signal?: AbortSignal): Promise<TmuxPane[]>;\n readMetadata(sessionName: string, signal?: AbortSignal): Promise<TmuxSessionMetadata | undefined>;\n writeMetadata(sessionName: string, metadata: TmuxSessionMetadata, signal?: AbortSignal): Promise<void>;\n killSession(sessionName: string, signal?: AbortSignal): Promise<void>;\n}\n\nexport interface ReconcileResult {\n state: SessionState;\n liveSessions: ManagedSession[];\n removedActive?: ManagedSession;\n changed: boolean;\n}\n\nexport class SessionReconciler {\n private readonly misses = new Map<string, number>();\n\n constructor(\n private readonly tmux: SessionTmux,\n private readonly sessionPrefix = 'lark-coding-assistant',\n private readonly missingThreshold = 3,\n private readonly log: (message: string) => Promise<void> = async () => undefined,\n private readonly resolveAgentVersion: (agent: AgentId, signal?: AbortSignal) => Promise<string> = async () => 'unknown',\n ) {}\n\n async reconcile(input: SessionState, discover = false, signal?: AbortSignal): Promise<ReconcileResult> {\n const sessions = { ...input.sessions };\n let changed = false;\n for (const [id, session] of Object.entries(sessions)) {\n if (signal?.aborted) throw signal.reason;\n const result = await this.confirm(session, signal);\n if (result.status === 'unavailable') {\n await this.log(`tmux inspection unavailable for ${id}: ${errorMessage(result.error)}`);\n continue;\n }\n if (result.status === 'live') {\n this.misses.delete(id);\n if (result.pane.paneId !== session.paneId || result.pane.sessionName !== session.sessionName) {\n sessions[id] = { ...session, paneId: result.pane.paneId, sessionName: result.pane.sessionName, updatedAt: Date.now() };\n changed = true;\n }\n continue;\n }\n if (result.status === 'dead') {\n await this.tmux.killSession(result.pane.sessionName, signal).catch((error) => this.log(\n `failed to clean dead tmux session ${result.pane.sessionName}: ${errorMessage(error)}`,\n ));\n delete sessions[id];\n this.misses.delete(id);\n changed = true;\n continue;\n }\n const misses = (this.misses.get(id) ?? 0) + 1;\n this.misses.set(id, misses);\n if (misses < this.missingThreshold) continue;\n delete sessions[id];\n this.misses.delete(id);\n changed = true;\n }\n\n if (discover) {\n changed = await this.discover(sessions, signal) || changed;\n }\n\n const activeSessionId = input.activeSessionId && sessions[input.activeSessionId]\n ? input.activeSessionId\n : Object.keys(sessions)[0];\n if (activeSessionId !== input.activeSessionId) changed = true;\n const removedActive = input.activeSessionId && !sessions[input.activeSessionId]\n ? input.sessions?.[input.activeSessionId]\n : undefined;\n const state = changed\n ? { ...input, sessions, activeSessionId, updatedAt: Date.now() }\n : input;\n return { state, liveSessions: Object.values(sessions), removedActive, changed };\n }\n\n private async confirm(session: ManagedSession, signal?: AbortSignal): Promise<TmuxInspectResult> {\n const direct = await this.tmux.inspectStatus(session.paneId, signal);\n if (direct.status === 'live' || direct.status === 'unavailable') return direct;\n const byName = await this.tmux.inspectSession(session.sessionName, signal);\n if (byName.status === 'live' || byName.status === 'unavailable') return byName;\n return byName.status === 'dead' ? byName : direct;\n }\n\n private async discover(sessions: Record<string, ManagedSession>, signal?: AbortSignal): Promise<boolean> {\n let panes: TmuxPane[];\n try {\n panes = await this.tmux.listSessions(`${this.sessionPrefix}-`, signal);\n } catch (error) {\n await this.log(`tmux session discovery unavailable: ${errorMessage(error)}`);\n return false;\n }\n let changed = false;\n const seen = new Set<string>();\n const liveSessionNames = new Set(panes.filter((pane) => !pane.dead).map((pane) => pane.sessionName));\n for (const pane of panes) {\n if (signal?.aborted) throw signal.reason;\n if (seen.has(pane.sessionName)) continue;\n seen.add(pane.sessionName);\n if (pane.dead) {\n if (!liveSessionNames.has(pane.sessionName)) {\n await this.tmux.killSession(pane.sessionName, signal).catch((error) => this.log(\n `failed to clean orphaned dead tmux session ${pane.sessionName}: ${errorMessage(error)}`,\n ));\n }\n continue;\n }\n const registered = Object.values(sessions).find((session) => session.sessionName === pane.sessionName);\n if (registered) {\n if (registered.paneId !== pane.paneId) {\n sessions[registered.id] = { ...registered, paneId: pane.paneId, updatedAt: Date.now() };\n changed = true;\n }\n if (!await this.tmux.readMetadata(pane.sessionName, signal)) {\n await this.writeMetadata(pane, registered, signal).catch((error) => this.log(\n `failed to backfill tmux metadata for ${registered.id}: ${errorMessage(error)}`,\n ));\n }\n continue;\n }\n\n const metadata = await this.tmux.readMetadata(pane.sessionName, signal);\n const recovered = metadata\n ? this.fromMetadata(pane, metadata)\n : await this.fromLegacy(pane, signal);\n if (!recovered || sessions[recovered.id]) continue;\n if (!metadata) {\n try {\n await this.writeMetadata(pane, recovered, signal);\n } catch (error) {\n await this.log(`failed to persist recovered tmux metadata for ${recovered.id}: ${errorMessage(error)}`);\n continue;\n }\n }\n sessions[recovered.id] = recovered;\n this.misses.delete(recovered.id);\n changed = true;\n await this.log(`recovered managed session ${recovered.id} from tmux`);\n }\n return changed;\n }\n\n private fromMetadata(pane: TmuxPane, metadata: TmuxSessionMetadata): ManagedSession | undefined {\n if (!validSessionId(metadata.sessionId)\n || pane.sessionName !== `${this.sessionPrefix}-${metadata.sessionId}`) return undefined;\n return {\n id: metadata.sessionId,\n agent: metadata.agent,\n sessionName: pane.sessionName,\n paneId: pane.paneId,\n cwd: metadata.cwd,\n agentVersion: metadata.agentVersion,\n agentSessionId: metadata.agentSessionId,\n updatedAt: Date.now(),\n };\n }\n\n private async fromLegacy(pane: TmuxPane, signal?: AbortSignal): Promise<ManagedSession | undefined> {\n const id = pane.sessionName.startsWith(`${this.sessionPrefix}-`)\n ? pane.sessionName.slice(this.sessionPrefix.length + 1)\n : '';\n const agent = inferLegacyAgent(pane);\n if (!validSessionId(id) || !agent) return undefined;\n const agentVersion = await this.resolveAgentVersion(agent, signal).catch(() => 'unknown');\n return {\n id,\n agent,\n sessionName: pane.sessionName,\n paneId: pane.paneId,\n cwd: pane.cwd,\n agentVersion,\n updatedAt: Date.now(),\n };\n }\n\n private writeMetadata(pane: TmuxPane, session: ManagedSession, signal?: AbortSignal): Promise<void> {\n return this.tmux.writeMetadata(pane.sessionName, {\n managed: true,\n sessionId: session.id,\n agent: session.agent,\n cwd: session.cwd,\n agentVersion: session.agentVersion,\n agentSessionId: session.agentSessionId,\n }, signal);\n }\n}\n\nexport function inferLegacyAgent(pane: Pick<TmuxPane, 'startCommand' | 'currentCommand'>): AgentId | undefined {\n const command = `${pane.startCommand}\\n${pane.currentCommand}`;\n if (/(?:^|[\\s/'\"])(?:trae-cli|traex)(?:[\\s/'\"]|$)/i.test(command)) return 'traex';\n if (/(?:^|[\\s/'\"])claude(?:[\\s/'\"]|$)/i.test(command)) return 'claude';\n if (/(?:^|[\\s/'\"])codex(?:[\\s/'\"]|$)/i.test(command)) return 'codex';\n return undefined;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { AgentId } from '../agents/types.js';\nimport { runFile } from '../platform/process.js';\n\nconst UUID = '[0-9a-fA-F-]{32,36}';\n\nexport async function resolveNativeAgentSessionId(\n agent: AgentId,\n pid: number,\n home = homedir(),\n signal?: AbortSignal,\n): Promise<string | undefined> {\n if (!Number.isInteger(pid) || pid <= 0) return undefined;\n if (agent === 'traex') {\n const peer = await resolveTraexPeer(pid, home);\n if (peer) return peer;\n return matchPath(\n await processOpenFiles(pid, signal),\n new RegExp(`/\\\\.trae/cli/sessions/.+/rollout-[^/]+-(${UUID})\\\\.jsonl(?:\\\\.lock)?$`),\n );\n }\n const openFiles = await processOpenFiles(pid, signal);\n if (agent === 'codex') return matchPath(openFiles, new RegExp(`/\\\\.codex/thread-writer-locks/(${UUID})\\\\.lock$`));\n return matchPath(openFiles, new RegExp(`/\\\\.claude/projects/[^/]+/(${UUID})\\\\.jsonl$`));\n}\n\nasync function resolveTraexPeer(pid: number, home: string): Promise<string | undefined> {\n const directory = join(home, '.trae', 'cli', 'session-peers');\n const entries = await readdir(directory).catch(() => [] as string[]);\n for (const entry of entries) {\n if (!entry.endsWith('.json')) continue;\n const value = await readFile(join(directory, entry), 'utf8').then(JSON.parse).catch(() => undefined) as unknown;\n if (!value || typeof value !== 'object') continue;\n const peer = value as Record<string, unknown>;\n if (peer.pid === pid && typeof peer.threadId === 'string' && peer.threadId) return peer.threadId;\n }\n return undefined;\n}\n\nasync function processOpenFiles(pid: number, signal?: AbortSignal): Promise<string[]> {\n const result = await runFile('lsof', ['-Fn', '-p', String(pid)], { timeoutMs: 3_000, signal }).catch(() => undefined);\n if (!result) return [];\n return result.stdout.split('\\n').filter((line) => line.startsWith('n')).map((line) => line.slice(1));\n}\n\nfunction matchPath(paths: string[], pattern: RegExp): string | undefined {\n for (const path of paths) {\n const match = path.match(pattern);\n if (match?.[1]) return match[1];\n }\n return 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, TmuxInspectResult, TmuxPane, TmuxSessionMetadata } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nconst PANE_FORMAT = '#{session_name}\\t#{pane_id}\\t#{pane_pid}\\t#{pane_start_command}\\t#{pane_current_command}\\t#{pane_current_path}\\t#{pane_dead}\\t#{pane_dead_status}\\t#{cursor_x}\\t#{cursor_y}';\nconst METADATA_OPTIONS = {\n managed: '@lca-managed',\n sessionId: '@lca-session-id',\n agent: '@lca-agent',\n cwd: '@lca-cwd',\n agentVersion: '@lca-agent-version',\n agentSessionId: '@lca-agent-session-id',\n} as const;\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, options.signal)) {\n throw new AppError(\n 'SESSION_EXISTS',\n `tmux session already exists: ${options.sessionName}`,\n { sessionId: displaySessionId(options.sessionName), source: 'tmux' },\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 const createArgs = [\n 'new-session', '-d', '-s', options.sessionName, '-c', options.cwd,\n '-x', '120', '-y', '40', command,\n ];\n if (options.preserveOnExit) {\n createArgs.push(';', 'set-option', '-w', '-t', `=${options.sessionName}:`, 'remain-on-exit', 'on');\n }\n await runFile(this.binary, createArgs, { signal: options.signal });\n const pane = await this.findBySession(options.sessionName, options.signal);\n if (!pane) throw new Error('tmux created a session without a discoverable pane');\n return pane;\n }\n\n async hasSession(sessionName: string, signal?: AbortSignal): Promise<boolean> {\n try {\n await runFile(this.binary, ['has-session', '-t', `=${sessionName}`], { signal });\n return true;\n } catch {\n return false;\n }\n }\n\n async findBySession(sessionName: string, signal?: AbortSignal): Promise<TmuxPane | undefined> {\n const { stdout } = await runFile(this.binary, [\n 'list-panes', '-t', `=${sessionName}`, '-F', PANE_FORMAT,\n ], { signal });\n return stdout.split('\\n').map(parsePane).find(Boolean);\n }\n\n async inspect(paneId: string, signal?: AbortSignal): Promise<TmuxPane | undefined> {\n const result = await this.inspectStatus(paneId, signal);\n return result.status === 'live' || result.status === 'dead' ? result.pane : undefined;\n }\n\n async inspectStatus(paneId: string, signal?: AbortSignal): Promise<TmuxInspectResult> {\n assertSafeTmuxTarget(paneId);\n try {\n const { stdout } = await runFile(this.binary, [\n 'display-message', '-p', '-t', paneId, PANE_FORMAT,\n ], { signal });\n if (!stdout.trim()) return { status: 'missing' };\n const pane = parsePane(stdout.trim());\n if (!pane) return { status: 'unavailable', error: new Error('invalid tmux pane response') };\n return pane.dead ? { status: 'dead', pane } : { status: 'live', pane };\n } catch (error) {\n return tmuxTargetMissing(error) ? { status: 'missing' } : { status: 'unavailable', error };\n }\n }\n\n async inspectSession(sessionName: string, signal?: AbortSignal): Promise<TmuxInspectResult> {\n try {\n const pane = await this.findBySession(sessionName, signal);\n if (!pane) return { status: 'missing' };\n return pane.dead ? { status: 'dead', pane } : { status: 'live', pane };\n } catch (error) {\n return tmuxTargetMissing(error) ? { status: 'missing' } : { status: 'unavailable', error };\n }\n }\n\n async listSessions(prefix: string, signal?: AbortSignal): Promise<TmuxPane[]> {\n const { stdout } = await runFile(this.binary, ['list-panes', '-a', '-F', PANE_FORMAT], { signal });\n return stdout.split('\\n')\n .map(parsePane)\n .filter((pane): pane is TmuxPane => Boolean(pane?.sessionName.startsWith(prefix)));\n }\n\n async writeMetadata(sessionName: string, metadata: TmuxSessionMetadata, signal?: AbortSignal): Promise<void> {\n const values: Partial<Record<keyof typeof METADATA_OPTIONS, string>> = {\n managed: '1',\n sessionId: metadata.sessionId,\n agent: metadata.agent,\n cwd: metadata.cwd,\n agentVersion: metadata.agentVersion,\n agentSessionId: metadata.agentSessionId,\n };\n for (const [key, option] of Object.entries(METADATA_OPTIONS) as [keyof typeof METADATA_OPTIONS, string][]) {\n const value = values[key];\n if (value === undefined) {\n await runFile(this.binary, ['set-option', '-u', '-t', sessionName, option], { signal }).catch(() => undefined);\n } else {\n await runFile(this.binary, ['set-option', '-t', sessionName, option, value], { signal });\n }\n }\n }\n\n async readMetadata(sessionName: string, signal?: AbortSignal): Promise<TmuxSessionMetadata | undefined> {\n const values: Partial<Record<keyof typeof METADATA_OPTIONS, string>> = {};\n for (const [key, option] of Object.entries(METADATA_OPTIONS) as [keyof typeof METADATA_OPTIONS, string][]) {\n const result = await runFile(this.binary, ['show-options', '-t', sessionName, '-v', option], { signal }).catch(() => undefined);\n if (!result) {\n if (key === 'agentSessionId') continue;\n return undefined;\n }\n values[key] = result.stdout.trim();\n }\n if (values.managed !== '1' || !values.sessionId || !values.cwd || !values.agentVersion\n || (values.agent !== 'codex' && values.agent !== 'traex' && values.agent !== 'claude')) return undefined;\n return {\n managed: true,\n sessionId: values.sessionId,\n agent: values.agent,\n cwd: values.cwd,\n agentVersion: values.agentVersion,\n agentSessionId: values.agentSessionId || undefined,\n };\n }\n\n async capture(paneId: string, lines = 200, signal?: AbortSignal): 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 ], { signal });\n return stdout;\n }\n\n async preserveOnExit(sessionName: string, enabled: boolean, signal?: AbortSignal): Promise<void> {\n await runFile(this.binary, [\n 'set-option', '-w', '-t', `=${sessionName}:`, 'remain-on-exit', enabled ? 'on' : 'off',\n ], { signal });\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, signal?: AbortSignal): Promise<void> {\n assertSafeTmuxTarget(paneId);\n if (!/^(Enter|Escape|Space|Tab|BSpace|Up|Down|Left|Right|PPage|NPage|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], { signal });\n }\n\n async killSession(sessionName: string, signal?: AbortSignal): Promise<void> {\n try {\n await runFile(this.binary, ['kill-session', '-t', `=${sessionName}`], { signal });\n } catch (error) {\n if (!tmuxTargetMissing(error)) throw error;\n }\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, startCommand, currentCommand, cwd, deadText, exitStatusText, 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) || !startCommand || !currentCommand || (!cwd && deadText !== '1')\n || !Number.isInteger(cursorX) || !Number.isInteger(cursorY)) return undefined;\n const exitStatus = exitStatusText === '' ? undefined : Number(exitStatusText);\n return {\n sessionName, paneId, pid, startCommand, currentCommand, cwd: cwd || '/', dead: deadText === '1',\n exitStatus: Number.isInteger(exitStatus) ? exitStatus : undefined,\n cursorX, cursorY,\n };\n}\n\nfunction tmuxTargetMissing(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n const stderr = error && typeof error === 'object' && 'stderr' in error ? String(error.stderr) : '';\n return /can't find (?:pane|session|window)|no such (?:pane|session|window)|(?:pane|session|window) not found|no server running/i.test(`${message}\\n${stderr}`);\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: 'traex',\n headerPatterns: [...commonHeaders, /^\\s*Question\\s+\\d+\\/\\d+/i],\n customInputControls: [/^(?:other|none of the above|add notes)$/i],\n};\n\nexport const CLAUDE_DIALECT: TerminalDialect = {\n id: 'claude',\n headerPatterns: [\n ...commonHeaders,\n /^\\s*(?:←\\s*)?[☐☑☒]\\s+.+?(?:\\s+✔\\s+Submit\\s*→)?\\s*$/i,\n /^\\s*[☐☑☒]\\s+\\S/,\n ],\n footerPatterns: commonFooters,\n footerlessChoiceHeaders: [/^ready to submit your answers\\?$/i],\n submitControls: [/^(?:submit|confirm)$/i],\n customInputControls: [/^(?:type(?:\\s+.+)?|add notes)\\.?$/i, /^notes:\\s*press\\s+n\\s+to\\s+add\\b/i],\n directInputControls: [/^type(?:\\s+.+)?\\.?$/i],\n customInputValuePattern: /^type\\s+(.+?)\\.?$/i,\n chatControls: [/^chat about this$/i],\n};\n","import type { AgentResume, ResumeOptions } from './types.js';\nimport { AppError } from '../core/errors.js';\n\nexport function resolveResumeOption(options: ResumeOptions): AgentResume | undefined {\n const modes = [options.resume !== undefined, options.resumeLast, options.resumeAll].filter(Boolean).length;\n if (modes > 1) {\n throw new AppError(\n 'INVALID_RESUME',\n '--resume, --resume-last, and --resume-all cannot be used together',\n { reason: '--resume、--resume-last 和 --resume-all 不能同时使用' },\n );\n }\n if (options.resumeLast) return { mode: 'last' };\n if (options.resumeAll) return { mode: 'picker', all: true };\n if (typeof options.resume === 'string') return { mode: 'session', sessionId: options.resume };\n if (options.resume) return { mode: 'picker' };\n return undefined;\n}\n\nexport function resumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['resume', '--last'];\n if (resume.mode === 'session') return ['resume', resume.sessionId];\n return resume.all ? ['resume', '--all'] : ['resume'];\n}\n\nexport function claudeResumeArgs(resume?: AgentResume): string[] {\n if (!resume) return [];\n if (resume.mode === 'last') return ['--continue'];\n if (resume.mode === 'session') return ['--resume', resume.sessionId];\n return ['--resume'];\n}\n","export function codexStyleStopHookArgs(command: string): string[] {\n const hook = `{hooks=[{type=\"command\",command=${JSON.stringify(command)},timeout=5}]}`;\n return [\n '--dangerously-bypass-hook-trust',\n '-c', `hooks.SessionStart=[${hook}]`,\n '-c', `hooks.Stop=[${hook}]`,\n ];\n}\n\nexport function claudeStopHookArgs(command: string): string[] {\n return ['--settings', JSON.stringify({\n hooks: {\n SessionStart: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n Stop: [{ hooks: [{ type: 'command', command, timeout: 5 }] }],\n },\n })];\n}\n","import { detectCodexScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const codexAdapter: AgentAdapter = {\n id: 'codex',\n displayName: 'codex',\n groupOrder: 10,\n binary: (config) => config.agentBinaries.codex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectCodexScreen,\n};\n","import { detectTraeScreen } from '../screen/detector.js';\nimport { resumeArgs } from './resume.js';\nimport { codexStyleStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const traeCliAdapter: AgentAdapter = {\n id: 'traex',\n displayName: 'traex',\n groupOrder: 20,\n binary: (config) => config.agentBinaries.traex,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...codexStyleStopHookArgs(stopHookCommand),\n ...resumeArgs(resume),\n ],\n detectScreen: detectTraeScreen,\n};\n","import { detectClaudeScreen } from '../screen/detector.js';\nimport { claudeResumeArgs } from './resume.js';\nimport { claudeStopHookArgs } from './stop-hook.js';\nimport type { AgentAdapter } from './types.js';\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: 'claude',\n displayName: 'claude',\n groupOrder: 30,\n binary: (config) => config.agentBinaries.claude,\n versionArgs: ['--version'],\n buildLaunchArgs: ({ resume, stopHookCommand }) => [\n ...claudeStopHookArgs(stopHookCommand),\n ...claudeResumeArgs(resume),\n ],\n detectScreen: detectClaudeScreen,\n};\n","import { codexAdapter } from './codex.js';\nimport { traeCliAdapter } from './trae-cli.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { normalizeAgentId, type AgentAdapter, type AgentId } from './types.js';\n\nexport { normalizeAgentId } from './types.js';\n\nconst adapters = new Map<AgentId, AgentAdapter>([\n [codexAdapter.id, codexAdapter],\n [traeCliAdapter.id, traeCliAdapter],\n [claudeCodeAdapter.id, claudeCodeAdapter],\n]);\n\nexport function getAgentAdapter(id: AgentId): AgentAdapter {\n const adapter = adapters.get(id);\n if (!adapter) throw new Error(`unsupported coding agent: ${id}`);\n return adapter;\n}\n\nexport function listAgentAdapters(): AgentAdapter[] {\n return [...adapters.values()].sort((left, right) => left.groupOrder - right.groupOrder);\n}\n\nexport function isAgentId(value: string): value is AgentId {\n return normalizeAgentId(value) === value;\n}\n","import type { AgentId, AgentSessionStartedCandidate, TurnCompleteCandidate } from './types.js';\n\nexport function normalizeSessionStartEvent(\n bridgeSessionId: string,\n agent: AgentId,\n value: unknown,\n): AgentSessionStartedCandidate | undefined {\n if (!bridgeSessionId || !value || typeof value !== 'object') return undefined;\n const event = value as Record<string, unknown>;\n if (event.hook_event_name !== 'SessionStart') return undefined;\n const agentSessionId = stringField(event, 'session_id');\n const cwd = stringField(event, 'cwd');\n if (!agentSessionId || !cwd) return undefined;\n return { sessionId: bridgeSessionId, agent, agentSessionId, cwd, source: stringField(event, 'source') };\n}\n\nexport function validSessionStartCandidate(value: unknown): value is AgentSessionStartedCandidate {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return typeof candidate.sessionId === 'string' && candidate.sessionId.length > 0\n && (candidate.agent === 'codex' || candidate.agent === 'traex' || candidate.agent === 'claude')\n && typeof candidate.agentSessionId === 'string' && candidate.agentSessionId.length > 0\n && typeof candidate.cwd === 'string' && candidate.cwd.length > 0;\n}\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 type { ResumePickerView } from '../screen/resume-picker.js';\nimport type { StartSessionRequest } from '../session/start-request.js';\nimport type { SessionStartupFailure } from '../session/startup-failure.js';\nimport type { SessionCreateView } from '../workspace/session-create.js';\nimport { ActionSigner, type SignedAction } from './action-signing.js';\nimport {\n CHOICE_FORM_SUBMIT_ACTION,\n choiceCard,\n choiceFormSubmitName,\n expiredActionCard,\n handledActionCard,\n interactionInputCard,\n manualControlCard,\n MANUAL_SUBMIT_ACTION,\n MANUAL_TYPE_ACTION,\n SESSION_CREATE_SUBMIT_ACTION,\n sessionCreateCard,\n sessionCreateFailureCard,\n sessionCreateOpenedCard,\n sessionCreateProgressCard,\n sessionCreateResultCard,\n sessionStartupFailureCard,\n type ManualControlView,\n sessionPickerCard,\n resumePickerCard,\n startupConflictCard,\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 onResumePickerDeliveryFailure?(session: ManagedSession): Promise<void>;\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 | { type: 'session-create-form'; content: string; view: SessionCreateView; sessions?: ManagedSession[]; activeSessionId?: string }\n | { type: 'session-created'; content: string; session: ManagedSession }\n | { type: 'session-start-failed'; content: string; failure: SessionStartupFailure }\n | { type: 'resume-picker'; content: string; session: ManagedSession; picker: ResumePickerView }\n | { type: 'startup-conflict'; content: string; request: StartSessionRequest; owner: ManagedSession }\n | {\n type: 'session-picker'; content: string; sessions: ManagedSession[]; activeSessionId?: string;\n confirmingStopSessionId?: string;\n };\n\nexport interface RemoteGateway {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n startProcessing(message: NormalizedMessage): 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 sendResumePicker(chatId: string, session: ManagedSession, picker: ResumePickerView): Promise<unknown>;\n sendStartupConflict(chatId: string, request: StartSessionRequest, owner: ManagedSession): Promise<unknown>;\n sendSessionCreate(chatId: string, view: SessionCreateView): Promise<unknown>;\n sendSessionStartupFailure(chatId: string, failure: SessionStartupFailure): 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 private readonly processingReactions = new Map<string, {\n messageId: string;\n reactionId: string;\n timer: ReturnType<typeof setTimeout>;\n generation: number;\n }>();\n private readonly processingGenerations = new Map<string, number>();\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 console.error(`[lca] card action received: tag=${event.action.tag ?? 'unknown'} name=${event.action.name ?? '-'} message=${event.messageId}`);\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) {\n if (this.formActionsInFlight.has(event.messageId)) {\n return { toast: { type: 'warning', content: '操作正在处理中,请稍候。' } };\n }\n console.error(`[lca] card action rejected: signature or mapping invalid for message=${event.messageId}`);\n void this.markExpiredCard(event);\n return { toast: { type: 'error', content: '卡片或按钮已失效,请获取最新卡片。' } };\n }\n if (event.action.formValue || action.kind === 'manual' || action.kind === 'session-create'\n || action.kind === 'startup-conflict' || action.kind === 'resume-picker'\n || action.kind === 'session-stop' || action.kind === 'session-start-error') {\n if (this.formActionsInFlight.has(event.messageId)) {\n return { toast: { type: 'warning', content: inFlightToast(action) } };\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: progressToast(action) } };\n }\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') return { toast: result };\n if (result.type === 'session-create-form') {\n this.rememberSessionCreateFormActions(event.messageId, event.chatId, result.view);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: sessionCreateCard(result.view) },\n };\n }\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 if (result.type === 'session-created') {\n this.formActions.delete(event.messageId);\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: sessionCreateResultCard(true, result.content, result.session) },\n };\n }\n if (result.type === 'session-start-failed') {\n return {\n toast: { type: 'error', content: result.content },\n card: { type: 'raw', data: sessionStartupFailureCard(event.chatId, result.failure, this.signer) },\n };\n }\n if (result.type === 'resume-picker') {\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: resumePickerCard(event.chatId, result.session, result.picker, this.signer) },\n };\n }\n if (result.type === 'startup-conflict') {\n return {\n toast: { type: 'warning', content: result.content },\n card: { type: 'raw', data: startupConflictCard(event.chatId, requestSession(result.request), result.owner, this.signer) },\n };\n }\n if (result.type === 'session-picker') {\n return {\n toast: { type: 'success', content: result.content },\n card: { type: 'raw', data: sessionPickerCard(\n event.chatId, result.sessions, result.activeSessionId, this.signer, result.confirmingStopSessionId,\n ) },\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 let initialResumePicker: ManagedSession | undefined;\n try {\n if (action.kind === 'session-create' && action.action === 'submit') {\n await this.updateCardAfterAction(event.messageId, sessionCreateProgressCard());\n }\n const result = await this.handler.onAction(event, action);\n if (result.type === 'error') {\n if (action.kind === 'session-create') {\n await this.updateCardAfterAction(\n event.messageId,\n sessionCreateFailureCard(event.chatId, result.content, this.signer),\n );\n this.formActions.delete(event.messageId);\n return;\n }\n await this.sendMessage(event.chatId, { text: `卡片操作未完成:${result.content}` });\n return;\n }\n if (result.type === 'session-created') {\n await this.updateCardAfterAction(event.messageId, sessionCreateResultCard(true, result.content, result.session));\n this.formActions.delete(event.messageId);\n return;\n }\n if (result.type === 'session-start-failed') {\n await this.updateCardAfterAction(\n event.messageId,\n sessionStartupFailureCard(event.chatId, result.failure, this.signer),\n );\n this.formActions.delete(event.messageId);\n return;\n }\n if (result.type === 'resume-picker') {\n if (action.kind === 'session-create') initialResumePicker = result.session;\n await this.updateCardAfterAction(event.messageId, resumePickerCard(event.chatId, result.session, result.picker, this.signer));\n return;\n }\n if (result.type === 'startup-conflict') {\n await this.updateCardAfterAction(\n event.messageId,\n startupConflictCard(event.chatId, requestSession(result.request), result.owner, this.signer),\n );\n return;\n }\n if (result.type === 'session-picker') {\n if (action.kind === 'session-start-error') {\n await this.sendMessage(event.chatId, { card: sessionPickerCard(\n event.chatId, result.sessions, result.activeSessionId, this.signer, result.confirmingStopSessionId,\n ) });\n return;\n }\n await this.updateCardAfterAction(event.messageId, sessionPickerCard(\n event.chatId, result.sessions, result.activeSessionId, this.signer, result.confirmingStopSessionId,\n ));\n return;\n }\n if (result.type === 'session-create-form') {\n if (action.kind === 'session-create' && action.action !== 'open') {\n await this.updateCardAfterAction(event.messageId, sessionCreateCard(result.view));\n this.rememberSessionCreateFormActions(event.messageId, event.chatId, result.view);\n return;\n }\n const sent = await this.sendMessage(event.chatId, { card: sessionCreateCard(result.view) });\n this.rememberSessionCreateFormActions(sent.messageId, event.chatId, result.view);\n const sourceCard = action.kind === 'session-create' && result.sessions\n ? sessionPickerCard(event.chatId, result.sessions, result.activeSessionId, this.signer, undefined, false)\n : sessionCreateOpenedCard();\n await this.updateCardAfterAction(event.messageId, sourceCard).catch(async (error) => {\n const detail = cardErrorDetail(error);\n console.error(`[lca] failed to retire session-create source card: message=${event.messageId} detail=${detail}`);\n await this.sendMessage(event.chatId, {\n text: '新建表单已发送,但原卡片状态更新失败;请使用最新的“新建 Coding Session”卡片继续操作。',\n }).catch(() => undefined);\n });\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 = cardErrorDetail(error);\n if (initialResumePicker) {\n await this.handler.onResumePickerDeliveryFailure?.(initialResumePicker).catch((cleanupError) => {\n console.error(`[lca] resume picker rollback failed: session=${initialResumePicker?.id} detail=${cardErrorDetail(cleanupError)}`);\n });\n }\n if (action.kind === 'session-create') this.formActions.delete(event.messageId);\n console.error(`[lca] deferred card action failed: kind=${action.kind} action=${action.action} message=${event.messageId} detail=${detail}`);\n await this.sendMessage(event.chatId, {\n text: action.kind === 'session-create'\n ? `新建 Session 表单打开失败:${detail}。请重新发送 /sessions,或直接使用 /start 命令。`\n : `卡片操作同步失败:${detail}`,\n }).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 private async markExpiredCard(event: CardActionEvent): Promise<void> {\n try {\n await this.updateCardAfterAction(event.messageId, expiredActionCard());\n } catch (error) {\n const detail = cardErrorDetail(error);\n console.error(`[lca] failed to mark expired card: message=${event.messageId} detail=${detail}`);\n await this.sendMessage(event.chatId, {\n text: '卡片或按钮已失效,请重新发送对应命令获取最新卡片;Session 相关操作可发送 /sessions。',\n }).catch(() => undefined);\n }\n }\n\n connect(): Promise<void> {\n return this.channel.connect();\n }\n\n async disconnect(): Promise<void> {\n const chats = new Set([...this.processingGenerations.keys(), ...this.processingReactions.keys()]);\n await Promise.all([...chats].map((chatId) => this.clearProcessing(chatId)));\n await this.channel.disconnect();\n }\n\n async startProcessing(message: NormalizedMessage): Promise<void> {\n await this.clearProcessing(message.chatId);\n const generation = this.processingGenerations.get(message.chatId) ?? 0;\n try {\n const reactionId = await this.channel.addReaction(message.messageId, 'Typing');\n if (this.processingGenerations.get(message.chatId) !== generation) {\n await this.removeProcessingReaction(message.messageId, reactionId);\n return;\n }\n const timer = setTimeout(() => {\n void this.clearProcessing(message.chatId, generation);\n }, 10 * 60_000);\n timer.unref?.();\n this.processingReactions.set(message.chatId, { messageId: message.messageId, reactionId, timer, generation });\n } catch (error) {\n console.error(`[lca] failed to add processing reaction: chat=${message.chatId} message=${message.messageId} detail=${cardErrorDetail(error)}`);\n }\n }\n\n sendText(chatId: string, text: string): Promise<unknown> {\n return this.sendMessage(chatId, { text });\n }\n\n sendMarkdown(chatId: string, markdown: string): Promise<unknown> {\n return this.sendMessage(chatId, { markdown });\n }\n\n async sendChoice(chatId: string, paneId: string, screen: ScreenDetection, agent: AgentId): Promise<unknown> {\n const result = await this.sendMessage(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.sendMessage(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 rememberSessionCreateFormActions(messageId: string, chatId: string, view: SessionCreateView): void {\n const actions = new Map<string, SignedAction>();\n actions.set(SESSION_CREATE_SUBMIT_ACTION, this.signer.sign({\n kind: 'session-create', agent: view.draft.agent, action: 'submit', paneId: '', fingerprint: view.mode, chatId,\n snapshotId: view.snapshotId, page: view.page,\n }, 10 * 60_000));\n this.formActions.set(messageId, actions);\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.sendMessage(chatId, { card: statusCard(status) });\n }\n\n sendSessionPicker(chatId: string, sessions: ManagedSession[], activeSessionId?: string): Promise<unknown> {\n return this.sendMessage(chatId, { card: sessionPickerCard(chatId, sessions, activeSessionId, this.signer) });\n }\n\n sendResumePicker(chatId: string, session: ManagedSession, picker: ResumePickerView): Promise<unknown> {\n return this.sendMessage(chatId, { card: resumePickerCard(chatId, session, picker, this.signer) });\n }\n\n sendStartupConflict(chatId: string, request: StartSessionRequest, owner: ManagedSession): Promise<unknown> {\n return this.sendMessage(chatId, { card: startupConflictCard(chatId, requestSession(request), owner, this.signer) });\n }\n\n async sendSessionCreate(chatId: string, view: SessionCreateView): Promise<unknown> {\n const result = await this.sendMessage(chatId, { card: sessionCreateCard(view) });\n this.rememberSessionCreateFormActions(result.messageId, chatId, view);\n return result;\n }\n\n sendSessionStartupFailure(chatId: string, failure: SessionStartupFailure): Promise<unknown> {\n return this.sendMessage(chatId, { card: sessionStartupFailureCard(chatId, failure, this.signer) });\n }\n\n sendStopConfirmation(chatId: string, paneId: string, fingerprint: string, agent: AgentId): Promise<unknown> {\n return this.sendMessage(chatId, { card: stopCard(chatId, paneId, fingerprint, this.signer, agent) });\n }\n\n private async sendMessage(chatId: string, input: Parameters<LarkChannel['send']>[1]): Promise<Awaited<ReturnType<LarkChannel['send']>>> {\n await this.clearProcessing(chatId);\n return this.channel.send(chatId, input);\n }\n\n private async clearProcessing(chatId: string, expectedGeneration?: number): Promise<void> {\n const currentGeneration = this.processingGenerations.get(chatId) ?? 0;\n if (expectedGeneration !== undefined && currentGeneration !== expectedGeneration) return;\n this.processingGenerations.set(chatId, currentGeneration + 1);\n const pending = this.processingReactions.get(chatId);\n if (!pending) return;\n this.processingReactions.delete(chatId);\n clearTimeout(pending.timer);\n await this.removeProcessingReaction(pending.messageId, pending.reactionId);\n }\n\n private async removeProcessingReaction(messageId: string, reactionId: string): Promise<void> {\n try {\n await this.channel.removeReaction(messageId, reactionId);\n } catch (error) {\n console.error(`[lca] failed to remove processing reaction by id: message=${messageId} detail=${cardErrorDetail(error)}`);\n await this.channel.removeReactionByEmoji(messageId, 'Typing').catch((fallbackError) => {\n console.error(`[lca] failed to remove processing reaction by emoji: message=${messageId} detail=${cardErrorDetail(fallbackError)}`);\n });\n }\n }\n}\n\nfunction requestSession(request: StartSessionRequest): Pick<ManagedSession, 'id' | 'agent' | 'cwd'> {\n return { id: request.sessionId, agent: request.agent, cwd: request.cwd };\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\nfunction progressToast(action: SignedAction): string {\n if (action.kind === 'manual') return '正在操作本地终端…';\n if (action.kind === 'session-create') return action.action === 'open' ? '正在打开新建表单…' : '正在启动 Session…';\n if (action.kind === 'resume-picker') return action.action.startsWith('select:') ? '正在恢复 Session…' : '正在更新 Resume Picker…';\n if (action.kind === 'startup-conflict') return action.action === 'new' ? '正在启动新 Session…' : '正在处理 Session 冲突…';\n if (action.kind === 'session-stop') return '正在处理 Session…';\n if (action.kind === 'session-start-error') return action.action === 'create' ? '正在打开新建表单…' : '正在打开 Sessions…';\n return '正在提交到本地终端…';\n}\n\nfunction inFlightToast(action: SignedAction): string {\n if (action.kind === 'manual') return '终端操作正在执行,请稍候。';\n if (action.kind === 'session-create') return action.action === 'open' ? '正在打开新建表单,请稍候。' : 'Session 正在启动,请稍候。';\n if (action.kind === 'resume-picker') return 'Resume Picker 操作正在执行,请稍候。';\n if (action.kind === 'startup-conflict') return 'Session 冲突操作正在执行,请稍候。';\n if (action.kind === 'session-stop') return 'Session 操作正在执行,请稍候。';\n if (action.kind === 'session-start-error') return '正在处理启动失败操作,请稍候。';\n return '答案正在提交,请稍候。';\n}\n\nfunction cardErrorDetail(error: unknown): string {\n const response = error && typeof error === 'object' ? (error as Record<string, unknown>).response : undefined;\n const data = response && typeof response === 'object' ? (response as Record<string, unknown>).data : undefined;\n const record = data && typeof data === 'object' ? data as Record<string, unknown> : undefined;\n const code = typeof record?.code === 'number' || typeof record?.code === 'string' ? String(record.code) : undefined;\n const message = typeof record?.msg === 'string'\n ? record.msg\n : error instanceof Error ? error.message : String(error);\n const sanitized = message\n .replace(/(?:authorization\\s*:\\s*bearer|bearer)\\s+[^\\s,'\"\\]}]+/gi, 'Bearer [REDACTED]')\n .replace(/[\\u0000-\\u001f\\u007f]/g, ' ')\n .slice(0, 1200);\n return code ? `code=${code} ${sanitized}` : sanitized;\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' | 'session-stop' | 'session-create' | 'session-start-error'\n | 'startup-conflict' | 'resume-picker' | 'manual';\n interactionKind?: ChoiceInteractionKind;\n sessionId?: string;\n manualMode?: 'explicit' | 'fallback';\n snapshotId?: string;\n page?: number;\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.snapshotId ?? null,\n value.page ?? 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 === 'session-stop'\n || item.kind === 'session-create' || item.kind === 'session-start-error' || item.kind === 'startup-conflict'\n || item.kind === 'resume-picker' || 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 && (item.snapshotId === undefined || typeof item.snapshotId === 'string')\n && (item.page === undefined || (typeof item.page === 'number' && Number.isInteger(item.page) && item.page >= 0))\n && ((item.kind !== 'session-stop' && item.kind !== 'session-start-error'\n && item.kind !== 'resume-picker' && item.kind !== 'startup-conflict')\n || typeof item.sessionId === 'string')\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 type { AgentId } from '../agents/types.js';\nimport type { WorkspaceCandidate } from './discovery.js';\n\nexport interface SessionCreateDraft {\n sessionId?: string;\n agent: AgentId;\n resumeMode: 'new' | 'picker';\n cwd?: string;\n projectCwd?: string;\n manualCwd?: string;\n}\n\nexport interface SessionCreateView {\n mode: 'projects' | 'manual';\n snapshotId?: string;\n page: number;\n pageCount: number;\n candidates: WorkspaceCandidate[];\n hasProjectCandidates?: boolean;\n partial: boolean;\n warnings: string[];\n draft: SessionCreateDraft;\n}\n\nexport function emptySessionCreateDraft(): SessionCreateDraft {\n return { agent: 'codex', resumeMode: 'new' };\n}\n","import type { ScreenDetection } from '../screen/detector.js';\nimport type { ManagedSession } from '../core/model.js';\nimport type { SessionCreateView } from '../workspace/session-create.js';\nimport { emptySessionCreateDraft } from '../workspace/session-create.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 { ResumePickerView } from '../screen/resume-picker.js';\nimport type { RuntimeStatus } from '../daemon/protocol.js';\nimport type { SessionStartupFailure } from '../session/startup-failure.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 = 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 confirmingStopSessionId?: string,\n allowCreate = true,\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: object[] = 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(\n chatId,\n session,\n session.id === activeSessionId,\n signer,\n confirmingStopSessionId === session.id,\n )),\n ]);\n if (elements.length > 0) elements.push({ tag: 'hr', margin: '8px 0px' });\n else elements.push({ tag: 'markdown', content: '暂无可连接的 Coding Session,可以直接新建一个。' });\n elements.push(allowCreate\n ? {\n tag: 'button',\n text: { tag: 'plain_text', content: '+ 新建 Session' },\n type: 'primary',\n width: 'fill',\n size: 'medium',\n behaviors: [{\n type: 'callback',\n value: signer.sign({\n kind: 'session-create', agent: 'codex', action: 'open', paneId: '', fingerprint: 'create', chatId,\n }, 10 * 60_000),\n }],\n }\n : {\n tag: 'markdown',\n content: '✅ 新建 Session 表单已发送;仍可查看或操作上方 Session。',\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,\n },\n };\n}\n\nexport const SESSION_CREATE_SUBMIT_ACTION = 'session_create_submit';\nexport const SESSION_CREATE_NAME_FIELD = 'session_name';\nexport const SESSION_CREATE_AGENT_FIELD = 'session_agent';\nexport const SESSION_CREATE_CWD_FIELD = 'session_cwd';\nexport const SESSION_CREATE_PROJECT_FIELD = 'session_project';\nexport const SESSION_CREATE_RESUME_FIELD = 'session_resume';\nexport const SESSION_CREATE_MANUAL_VALUE = '__manual__';\n\nexport function sessionCreateCard(view: SessionCreateView = {\n mode: 'manual', page: 0, pageCount: 1, candidates: [], partial: false, warnings: [], draft: emptySessionCreateDraft(),\n}): object {\n const directoryElements = view.mode === 'projects'\n ? projectDirectoryFields(view)\n : [{\n tag: 'input', name: SESSION_CREATE_CWD_FIELD,\n default_value: view.draft.manualCwd,\n placeholder: { tag: 'plain_text', content: '~/workspace/project 或 /absolute/path' },\n label: { tag: 'plain_text', content: '项目目录' },\n }];\n const noticeLines = [\n ...view.warnings.map((warning) => `⚠️ ${escapeMarkdown(warning)}`),\n ...(view.partial ? ['⚠️ 部分目录未加载;可选择已显示项目或手动填写路径。'] : []),\n ];\n const notices = noticeLines.length > 0\n ? [{ tag: 'markdown', content: noticeLines.join('\\n') }]\n : [];\n return cardElements('新建 Coding Session', [\n { tag: 'markdown', content: '在本机受管 tmux 中启动一个新会话;创建成功后会自动连接。' },\n ...notices,\n {\n tag: 'form', name: 'session_create_form', direction: 'vertical', vertical_spacing: '10px', elements: [\n {\n tag: 'input', name: SESSION_CREATE_NAME_FIELD, required: true,\n default_value: view.draft.sessionId,\n placeholder: { tag: 'plain_text', content: 'Session 名称,例如 helix' },\n label: { tag: 'plain_text', content: 'Session 名称' },\n },\n {\n tag: 'select_static', name: SESSION_CREATE_AGENT_FIELD, required: true,\n placeholder: { tag: 'plain_text', content: '选择 Agent' },\n initial_option: view.draft.agent,\n options: listAgentAdapters().map((adapter) => ({\n text: { tag: 'plain_text', content: adapter.displayName }, value: adapter.id,\n })),\n },\n ...directoryElements,\n {\n tag: 'select_static', name: SESSION_CREATE_RESUME_FIELD,\n placeholder: { tag: 'plain_text', content: '选择启动方式' },\n initial_option: view.draft.resumeMode,\n options: [\n { text: { tag: 'plain_text', content: '新会话' }, value: 'new' },\n { text: { tag: 'plain_text', content: '打开原生 Resume Picker' }, value: 'picker' },\n ],\n },\n {\n tag: 'button', name: SESSION_CREATE_SUBMIT_ACTION,\n text: { tag: 'plain_text', content: '启动并连接' }, type: 'primary', width: 'fill', size: 'medium',\n form_action_type: 'submit',\n },\n ],\n },\n ]);\n}\n\nfunction projectDirectoryFields(view: SessionCreateView): object[] {\n const options = [...view.candidates.map((candidate) => ({\n text: { tag: 'plain_text', content: candidate.label }, value: candidate.cwd,\n })), { text: { tag: 'plain_text', content: '手动填写其他路径…' }, value: SESSION_CREATE_MANUAL_VALUE }];\n return [{\n tag: 'select_static', name: SESSION_CREATE_PROJECT_FIELD,\n placeholder: { tag: 'plain_text', content: '选择项目目录' },\n initial_option: view.draft.projectCwd,\n required: true,\n options,\n }, {\n tag: 'input', name: SESSION_CREATE_CWD_FIELD,\n default_value: view.draft.manualCwd,\n placeholder: { tag: 'plain_text', content: '选择“手动填写其他路径…”时填写' },\n label: { tag: 'plain_text', content: '其他路径(可选)' },\n }];\n}\n\nexport function sessionCreateResultCard(\n success: boolean,\n content: string,\n session?: Pick<ManagedSession, 'id' | 'agent' | 'cwd'>,\n): object {\n const details = session\n ? `\\n\\n**Session** \\`${escapeInlineCode(session.id)}\\`\\n**Agent** ${escapeMarkdown(getAgentAdapter(session.agent).displayName)}\\n**工作目录** \\`${escapeInlineCode(session.cwd)}\\``\n : '';\n return cardElements(\n success ? 'Session 已启动' : 'Session 启动失败',\n [{ tag: 'markdown', content: `${success ? '✅' : '⚠️'} ${escapeMarkdown(content)}${details}` }],\n success ? 'green' : 'red',\n );\n}\n\nexport function sessionCreateProgressCard(): object {\n return cardElements('正在启动 Session', [\n { tag: 'markdown', content: '⏳ 正在创建 tmux pane,并确认 Agent 和原生 Session 状态…' },\n ], 'blue');\n}\n\nexport function sessionCreateOpenedCard(): object {\n return cardElements('新建表单已打开', [{\n tag: 'markdown',\n content: '✅ 请在最新发送的“新建 Coding Session”卡片中继续操作。\\n\\n如需查看 Session,请发送 `/sessions`。',\n }], 'grey');\n}\n\nexport function sessionCreateFailureCard(chatId: string, content: string, signer: ActionSigner): object {\n return cardElements('Session 启动失败', [\n { tag: 'markdown', content: `⚠️ ${escapeMarkdown(content)}` },\n ...sessionFailureActions(chatId, '', 'codex', signer),\n ], 'red');\n}\n\nexport function sessionStartupFailureCard(\n chatId: string,\n failure: SessionStartupFailure,\n signer: ActionSigner,\n): object {\n if (failure.reason === 'timeout') {\n const details = [\n `⚠️ **Session** \\`${escapeInlineCode(failure.sessionId)}\\``,\n `**Agent** ${escapeMarkdown(getAgentAdapter(failure.agent).displayName)}`,\n `**工作目录** \\`${escapeInlineCode(failure.cwd ?? '未知')}\\``,\n `**结果** 启动超过 30 秒,已取消并清理`,\n `**超时阶段** \\`${escapeInlineCode(failure.stage ?? 'unknown')}\\``,\n ].join('\\n');\n const output = failure.terminalExcerpt.trim()\n ? [{ tag: 'markdown', content: `**最近终端输出**\\n\\n\\`\\`\\`text\\n${escapeFence(failure.terminalExcerpt)}\\n\\`\\`\\`` }]\n : [];\n return cardElements('Session 启动失败', [\n { tag: 'markdown', content: details },\n ...output,\n ...sessionFailureActions(chatId, failure.sessionId, failure.agent, signer),\n ], 'red');\n }\n const exitStatus = failure.exitStatus === undefined ? '未知' : String(failure.exitStatus);\n return cardElements('Session 启动失败', [\n {\n tag: 'markdown',\n content: `⚠️ **Session** \\`${escapeInlineCode(failure.sessionId)}\\`\\n**Agent** ${escapeMarkdown(getAgentAdapter(failure.agent).displayName)}\\n**退出码** \\`${exitStatus}\\``,\n },\n { tag: 'markdown', content: `**原始错误**\\n\\n\\`\\`\\`text\\n${escapeFence(failure.terminalExcerpt)}\\n\\`\\`\\`` },\n ...sessionFailureActions(chatId, failure.sessionId, failure.agent, signer),\n ], 'red');\n}\n\nfunction sessionFailureActions(chatId: string, sessionId: string, agent: AgentId, signer: ActionSigner): object[] {\n const common = {\n kind: 'session-start-error' as const,\n sessionId,\n agent,\n paneId: '',\n fingerprint: 'startup-error',\n chatId,\n };\n return [\n actionButton('新建 Session', 'primary', signer.sign({ ...common, action: 'create' }, 10 * 60_000)),\n actionButton('查看 Sessions', 'default', signer.sign({ ...common, action: 'sessions' }, 10 * 60_000)),\n ];\n}\n\nfunction sessionCard(\n chatId: string,\n session: ManagedSession,\n active: boolean,\n signer: ActionSigner,\n confirmingStop = false,\n): object {\n const content = [\n active\n ? `**${escapeMarkdown(session.id)}** <text_tag color='green'>● 当前连接</text_tag>`\n : `**${escapeMarkdown(session.id)}**`,\n `📁 \\`${escapeInlineCode(session.cwd)}\\``,\n ].join('\\n\\n');\n const elements: object[] = [{ tag: 'markdown', content }];\n elements.push(confirmingStop\n ? sessionStopConfirmation(chatId, session, signer)\n : sessionActions(chatId, session, active, signer));\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\nfunction sessionActions(chatId: string, session: ManagedSession, active: boolean, signer: ActionSigner): object {\n const buttons: object[] = [];\n if (!active) buttons.push(actionButton(`连接 ${session.id}`, 'primary', signer.sign({\n kind: 'session', agent: session.agent, action: session.id, paneId: session.paneId,\n fingerprint: String(session.updatedAt), chatId,\n })));\n buttons.push(actionButton('关闭', 'danger', signer.sign({\n kind: 'session-stop', sessionId: session.id, agent: session.agent, action: 'request', paneId: session.paneId,\n fingerprint: String(session.updatedAt), chatId,\n })));\n return buttonRow(buttons);\n}\n\nfunction sessionStopConfirmation(chatId: string, session: ManagedSession, signer: ActionSigner): object {\n const common = {\n kind: 'session-stop' as const, sessionId: session.id, agent: session.agent, paneId: session.paneId,\n fingerprint: String(session.updatedAt), chatId,\n };\n return {\n tag: 'column_set', flex_mode: 'none', columns: [{\n tag: 'column', width: 'weighted', weight: 1, background_style: 'grey', padding: '8px 10px',\n vertical_spacing: '6px',\n elements: [\n { tag: 'markdown', content: `⚠️ 确认关闭 **${escapeMarkdown(session.id)}**?Agent 和 tmux session 将退出。` },\n buttonRow([\n actionButton('确认关闭', 'danger', signer.sign({ ...common, action: 'confirm' })),\n actionButton('取消', 'default', signer.sign({ ...common, action: 'cancel' })),\n ]),\n ],\n }],\n };\n}\n\nexport function resumePickerCard(\n chatId: string,\n session: ManagedSession,\n picker: ResumePickerView,\n signer: ActionSigner,\n): object {\n const common = {\n kind: 'resume-picker' as const, sessionId: session.id, agent: session.agent, paneId: session.paneId,\n fingerprint: picker.fingerprint, chatId,\n };\n const optionElements = picker.options.map((option) => ({\n tag: 'column_set', flex_mode: 'none', columns: [{\n tag: 'column', width: 'weighted', weight: 1, background_style: 'grey',\n padding: '9px 10px', vertical_spacing: '5px',\n elements: [\n { tag: 'markdown', content: `${option.selected ? '●' : '○'} **${escapeMarkdown(option.label)}**${option.detail ? `\\n${escapeMarkdown(option.detail)}` : ''}` },\n actionButton('恢复此 Session', option.selected ? 'primary' : 'default', signer.sign({ ...common, action: `select:${option.id}` }, 10 * 60_000)),\n ],\n }],\n }));\n const navigation = [\n ...(picker.canPrevious ? [actionButton('上一页', 'default', signer.sign({ ...common, action: 'previous' }, 10 * 60_000))] : []),\n actionButton('刷新', 'default', signer.sign({ ...common, action: 'refresh' }, 10 * 60_000)),\n ...(picker.canNext ? [actionButton('下一页', 'default', signer.sign({ ...common, action: 'next' }, 10 * 60_000))] : []),\n actionButton('取消', 'danger', signer.sign({ ...common, action: 'cancel' }, 10 * 60_000)),\n ];\n return cardElements(\n '选择要恢复的 Session',\n [\n { tag: 'markdown', content: `**${escapeMarkdown(session.id)} · ${escapeMarkdown(getAgentAdapter(session.agent).displayName)}**${picker.position && picker.total ? ` · 当前 ${picker.position}/${picker.total}` : ''}` },\n ...optionElements,\n buttonRow(navigation),\n ],\n 'yellow',\n );\n}\n\nexport function startupConflictCard(\n chatId: string,\n requested: Pick<ManagedSession, 'id' | 'agent' | 'cwd'>,\n owner: ManagedSession,\n signer: ActionSigner,\n): object {\n const common = {\n kind: 'startup-conflict' as const,\n sessionId: requested.id,\n agent: requested.agent,\n paneId: owner.paneId,\n fingerprint: String(owner.updatedAt),\n chatId,\n };\n return cardElements('Session 已由其他连接占用', [\n {\n tag: 'markdown',\n content: `要恢复的 **${escapeMarkdown(requested.agent)}** 原生 Session 已由 LCA Session **${escapeMarkdown(owner.id)}** 连接。\\n\\n**请求名称** \\`${escapeInlineCode(requested.id)}\\`\\n**工作目录** \\`${escapeInlineCode(requested.cwd)}\\``,\n },\n buttonRow([\n actionButton(`连接 ${owner.id}`, 'primary', signer.sign({ ...common, action: 'connect' }, 10 * 60_000)),\n actionButton('启动新会话', 'default', signer.sign({ ...common, action: 'new' }, 10 * 60_000)),\n actionButton('取消', 'danger', signer.sign({ ...common, action: 'cancel' }, 10 * 60_000)),\n ]),\n ], 'yellow');\n}\n\nfunction actionButton(text: string, type: string, value: SignedAction): object {\n return {\n tag: 'button', text: { tag: 'plain_text', content: text }, type, size: 'medium',\n behaviors: [{ type: 'callback', value }],\n };\n}\n\nfunction buttonRow(buttons: object[]): object {\n return {\n tag: 'column_set', flex_mode: 'none', horizontal_spacing: '8px', margin: '2px 0px 0px 0px',\n columns: buttons.map((button) => ({ tag: 'column', width: 'weighted', weight: 1, elements: [button] })),\n };\n}\n\nfunction agentMarker(agent: AgentId): string {\n if (agent === 'codex') return '🔵';\n if (agent === 'traex') 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\nexport function expiredActionCard(): object {\n return cardElements('卡片已失效', [{\n tag: 'markdown',\n content: '⚠️ 此卡片或按钮已过期、已处理,或 bridge daemon 已重启。\\n\\n请重新发送对应命令获取最新卡片;Session 相关操作可发送 `/sessions`。',\n }], 'grey');\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 { normalizeAgentId } from '../agents/types.js';\nimport type { AgentResume } from '../agents/types.js';\nimport { AppError } from '../core/errors.js';\nimport type { StartSessionRequest } from '../session/start-request.js';\n\nexport function parseStartCommand(input: string): StartSessionRequest {\n const tokens = tokenize(input);\n if (tokens[0] !== '/start') throw invalid('命令必须以 /start 开头');\n const sessionId = tokens[1];\n if (!sessionId || sessionId.startsWith('--')) throw invalid('请提供 session 名称');\n\n let agentValue: string | undefined;\n let cwd: string | undefined;\n let resume: AgentResume | undefined;\n for (let index = 2; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === '--agent') {\n if (agentValue !== undefined) throw invalid('--agent 不能重复');\n agentValue = requiredValue(tokens, ++index, '--agent');\n continue;\n }\n if (token === '--cwd') {\n if (cwd !== undefined) throw invalid('--cwd 不能重复');\n cwd = requiredValue(tokens, ++index, '--cwd');\n continue;\n }\n if (token === '--resume-last') {\n throw invalid('飞书端不支持 --resume-last,请使用 --resume 打开原生 Resume Picker');\n }\n if (token === '--resume') {\n if (resume) throw invalid('只能选择一种恢复方式');\n const candidate = tokens[index + 1];\n if (candidate && !candidate.startsWith('--')) {\n throw invalid('飞书端不支持输入历史 Session ID,请使用 --resume 打开原生 Resume Picker');\n }\n resume = { mode: 'picker' };\n continue;\n }\n throw invalid(`无法识别参数:${token}`);\n }\n\n const agent = agentValue ? normalizeAgentId(agentValue) : undefined;\n if (!agentValue) throw invalid('请提供 --agent');\n if (!agent) throw invalid(`不支持的 agent:${agentValue};可选 codex、traex、claude`);\n if (!cwd) throw invalid('请提供 --cwd');\n return { sessionId, agent, cwd, resume };\n}\n\nexport function tokenize(input: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: \"'\" | '\"' | undefined;\n let escaped = false;\n const push = (): void => {\n if (current) tokens.push(current);\n current = '';\n };\n for (const char of input.trim()) {\n if (escaped) {\n current += char;\n escaped = false;\n } else if (char === '\\\\' && quote !== \"'\") {\n escaped = true;\n } else if (quote) {\n if (char === quote) quote = undefined;\n else current += char;\n } else if (char === \"'\" || char === '\"') {\n quote = char;\n } else if (/\\s/.test(char)) {\n push();\n } else {\n current += char;\n }\n }\n if (escaped) current += '\\\\';\n if (quote) throw invalid('引号没有闭合');\n push();\n return tokens;\n}\n\nfunction requiredValue(tokens: string[], index: number, option: string): string {\n const value = tokens[index];\n if (!value || value.startsWith('--')) throw invalid(`${option} 缺少参数值`);\n return value;\n}\n\nfunction invalid(reason: string): AppError {\n return new AppError('INVALID_OPTIONS', reason, { reason });\n}\n","import { createHash } from 'node:crypto';\nimport type { AgentId } from '../agents/types.js';\nimport { normalizeScreen } from './normalize.js';\n\nexport interface ResumePickerOption {\n id: string;\n label: string;\n detail?: string;\n selected: boolean;\n visibleIndex: number;\n}\n\nexport interface ResumePickerView {\n agent: AgentId;\n fingerprint: string;\n options: ResumePickerOption[];\n selectedIndex: number;\n position?: number;\n total?: number;\n canPrevious: boolean;\n canNext: boolean;\n}\n\nexport function parseResumePicker(raw: string, agent: AgentId): ResumePickerView | undefined {\n const normalized = normalizeScreen(raw);\n return agent === 'claude'\n ? parseClaudePicker(normalized, agent)\n : parseCodexStylePicker(normalized, agent);\n}\n\nfunction parseCodexStylePicker(normalized: string, agent: AgentId): ResumePickerView | undefined {\n if (!/^\\s*Resume a previous session\\s*$/mi.test(normalized)) return undefined;\n const lines = normalized.split('\\n');\n const start = lines.findIndex((line) => /Type to search/i.test(line));\n const end = lines.findIndex((line, index) => index > start && /enter\\s+resume/i.test(line));\n if (start < 0 || end < 0) return undefined;\n const options: ResumePickerOption[] = [];\n for (const line of lines.slice(start + 1, end)) {\n const match = line.match(/^\\s*(❯)?\\s*(\\d+\\s*(?:m|h|d|w|mo|y)\\s+ago)\\s+(.+?)\\s*$/i);\n if (!match?.[3]) continue;\n const label = match[3].trim();\n options.push(option(options.length, label, match[2]?.replace(/\\s+/g, ''), Boolean(match[1])));\n }\n if (options.length === 0) return undefined;\n const positionMatch = normalized.match(/(\\d+)\\s*\\/\\s*(\\d+)\\s*·\\s*(\\d+)%/);\n return view(\n agent,\n normalized,\n options,\n positionMatch ? Number(positionMatch[1]) : undefined,\n positionMatch ? Number(positionMatch[2]) : undefined,\n );\n}\n\nfunction parseClaudePicker(normalized: string, agent: AgentId): ResumePickerView | undefined {\n const header = normalized.match(/^\\s*Resume session(?:\\s*\\((\\d+)\\s+of\\s+(\\d+)\\))?\\s*$/mi);\n if (!header) return undefined;\n const lines = normalized.split('\\n');\n const start = lines.findIndex((line) => /⌕\\s*Search|Search…/i.test(line));\n const end = lines.findIndex((line, index) => index > start && /Ctrl\\+A to show all projects/i.test(line));\n if (start < 0 || end < 0) return undefined;\n const options: ResumePickerOption[] = [];\n const body = lines.slice(start + 1, end);\n const navigation = {\n canPrevious: body.some((line) => /^\\s*↑/.test(line)),\n canNext: body.some((line) => /^\\s*↓/.test(line)),\n };\n for (let index = 0; index < body.length - 1; index += 1) {\n const title = body[index] ?? '';\n const detail = body[index + 1] ?? '';\n if (!/\\b(?:minute|hour|day|week|month|year)s? ago\\s*·/i.test(detail)) continue;\n const selected = /^\\s*❯/.test(title);\n const label = title.replace(/^\\s*[❯↓↑]?\\s*/, '').trim();\n if (!label || /^[↓↑]/.test(title.trim())) continue;\n options.push(option(options.length, label, detail.trim(), selected));\n index += 1;\n }\n if (options.length === 0) return undefined;\n return view(\n agent,\n normalized,\n options,\n header[1] ? Number(header[1]) : undefined,\n header[2] ? Number(header[2]) : undefined,\n navigation,\n );\n}\n\nfunction option(visibleIndex: number, label: string, detail: string | undefined, selected: boolean): ResumePickerOption {\n const id = createHash('sha256').update(`${visibleIndex}\\n${label}\\n${detail ?? ''}`).digest('hex').slice(0, 16);\n return { id, label, detail, selected, visibleIndex };\n}\n\nfunction view(\n agent: AgentId,\n normalized: string,\n options: ResumePickerOption[],\n position?: number,\n total?: number,\n navigation?: { canPrevious: boolean; canNext: boolean },\n): ResumePickerView {\n const selectedIndex = Math.max(0, options.findIndex((candidate) => candidate.selected));\n const hasHiddenOptions = position !== undefined && total !== undefined && total > options.length;\n return {\n agent,\n fingerprint: createHash('sha256').update(normalized).digest('hex'),\n options,\n selectedIndex,\n position,\n total,\n canPrevious: navigation?.canPrevious || (hasHiddenOptions && position > 1),\n canNext: navigation?.canNext || (hasHiddenOptions && position < total),\n };\n}\n","const MAX_LINES = 20;\nconst MAX_CHARS = 2_000;\nconst EMPTY_EXCERPT = 'Agent 未输出可用错误信息。';\n\nexport function startupTerminalExcerpt(raw: string): string {\n const sanitized = redactSecrets(stripTerminalControls(raw));\n const lines = sanitized\n .split('\\n')\n .map(cleanLine)\n .filter((line) => line !== undefined) as string[];\n while (lines[0] === '') lines.shift();\n while (lines.at(-1) === '') lines.pop();\n if (lines.length === 0) return EMPTY_EXCERPT;\n\n const errorIndex = lines.findIndex((line) => /\\b(?:error|failed|fatal)\\b/i.test(line));\n const selected = (errorIndex >= 0 ? lines.slice(errorIndex) : lines.slice(-MAX_LINES)).slice(0, MAX_LINES);\n let excerpt = selected.join('\\n').trim();\n if (!excerpt) return EMPTY_EXCERPT;\n\n const lineTruncated = errorIndex >= 0\n ? lines.length - errorIndex > MAX_LINES\n : lines.length > MAX_LINES;\n const charTruncated = excerpt.length > MAX_CHARS;\n if (charTruncated) excerpt = excerpt.slice(0, MAX_CHARS).trimEnd();\n if (lineTruncated || charTruncated) excerpt = `${excerpt}\\n… 输出已截断`;\n return excerpt;\n}\n\nfunction stripTerminalControls(value: string): string {\n return value\n // CSI and OSC escape sequences emitted by interactive TUIs.\n .replace(/\\u001B\\][^\\u0007]*(?:\\u0007|\\u001B\\\\)/g, '')\n .replace(/\\u001B(?:[@-_][0-?]*[ -/]*[@-~]|\\[[0-?]*[ -/]*[@-~])/g, '')\n .replace(/\\r/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001A\\u001C-\\u001F\\u007F]/g, '');\n}\n\nfunction cleanLine(value: string): string | undefined {\n const line = value.replace(/[ \\t]+$/g, '').trimStart();\n if (/^Pane is dead(?:\\s|\\(|$)/i.test(line)) return undefined;\n if (/^[╭╮╰╯┌┐└┘─━═│┃┊┋┄┅┈┉┼├┤┬┴┿╋+\\-_=\\s]+$/.test(line)) return undefined;\n return line.replace(/^[│┃]\\s?/, '').replace(/\\s?[│┃]$/, '').trimEnd();\n}\n\nfunction redactSecrets(value: string): string {\n return value\n .replace(/\\b(authorization\\s*[:=]\\s*)(?:Bearer\\s+)?[^\\s,;]+/gi, '$1[REDACTED]')\n .replace(/\\b(Bearer)\\s+[^\\s,'\"\\]}]+/gi, '$1 [REDACTED]')\n .replace(\n /\\b(api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|app[_-]?secret|cookie)\\b(\\s*[:=]\\s*)([^\\s,;]+)/gi,\n '$1$2[REDACTED]',\n )\n .replace(/([?&](?:api[_-]?key|access[_-]?token|token|secret|signature)=)[^&#\\s]+/gi, '$1[REDACTED]');\n}\n","import { lstat, readdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { basename, dirname, join, relative } from 'node:path';\nimport type { ManagedSession, RecentWorkspace } from '../core/model.js';\nimport { normalizeWorkspacePath } from './path.js';\n\nexport type WorkspaceCandidateSource = 'active' | 'recent' | 'configured';\n\nexport interface WorkspaceCandidate {\n cwd: string;\n label: string;\n source: WorkspaceCandidateSource;\n git: boolean;\n}\n\nexport interface WorkspaceDiscoveryResult {\n candidates: WorkspaceCandidate[];\n partial: boolean;\n warnings: string[];\n visitedDirectories: number;\n}\n\nexport interface DiscoverWorkspaceOptions {\n workspaceRoots: readonly string[];\n activeSessions: readonly ManagedSession[];\n recentWorkspaces: readonly RecentWorkspace[];\n maxDepth?: number;\n maxDirectories?: number;\n timeBudgetMs?: number;\n now?: () => number;\n home?: string;\n}\n\nexport async function discoverWorkspaces(options: DiscoverWorkspaceOptions): Promise<WorkspaceDiscoveryResult> {\n const maxDepth = options.maxDepth ?? 1;\n const maxDirectories = options.maxDirectories ?? 500;\n const timeBudgetMs = options.timeBudgetMs ?? 2_000;\n const now = options.now ?? Date.now;\n const home = options.home ?? homedir();\n const startedAt = now();\n const warnings: string[] = [];\n const byPath = new Map<string, WorkspaceCandidate>();\n let visitedDirectories = 0;\n let partial = false;\n\n const budgetAvailable = (): boolean => {\n const available = visitedDirectories < maxDirectories && now() - startedAt <= timeBudgetMs;\n if (!available) partial = true;\n return available;\n };\n const add = async (input: string, source: WorkspaceCandidateSource): Promise<void> => {\n if (!budgetAvailable()) return;\n let cwd: string;\n try {\n cwd = normalizeWorkspacePath(input, home);\n } catch {\n return;\n }\n if (byPath.has(cwd)) return;\n visitedDirectories += 1;\n try {\n const info = await lstat(cwd);\n if (!info.isDirectory() || info.isSymbolicLink()) return;\n byPath.set(cwd, { cwd, label: workspaceLabel(cwd, home), source, git: await hasGitEntry(cwd) });\n } catch {\n if (source === 'configured') warnings.push(`无法读取 workspace:${cwd}`);\n }\n };\n\n for (const session of options.activeSessions) await add(session.cwd, 'active');\n for (const recent of [...options.recentWorkspaces].sort((a, b) => b.lastUsedAt - a.lastUsedAt)) {\n await add(recent.cwd, 'recent');\n }\n for (const rootInput of options.workspaceRoots) {\n if (!budgetAvailable()) break;\n let root: string;\n try {\n root = normalizeWorkspacePath(rootInput, home);\n const info = await lstat(root);\n if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('not a directory');\n } catch {\n warnings.push(`无法读取 workspace:${rootInput}`);\n continue;\n }\n await add(root, 'configured');\n let frontier = [root];\n for (let depth = 1; depth <= maxDepth && frontier.length > 0 && budgetAvailable(); depth += 1) {\n const next: string[] = [];\n for (const parent of frontier) {\n if (!budgetAvailable()) break;\n let entries;\n try {\n entries = await readdir(parent, { withFileTypes: true });\n } catch {\n warnings.push(`无法读取目录:${parent}`);\n continue;\n }\n for (const entry of entries) {\n if (!budgetAvailable()) break;\n if (!entry.isDirectory() || entry.isSymbolicLink() || entry.name.startsWith('.')) continue;\n const child = join(parent, entry.name);\n await add(child, 'configured');\n if (depth < maxDepth) next.push(child);\n }\n }\n frontier = next;\n }\n }\n\n const priority: Record<WorkspaceCandidateSource, number> = { active: 0, recent: 1, configured: 2 };\n const candidates = [...byPath.values()].sort((left, right) =>\n priority[left.source] - priority[right.source]\n || Number(right.git) - Number(left.git)\n || left.label.localeCompare(right.label, 'zh-CN'),\n );\n return { candidates, partial, warnings: [...new Set(warnings)], visitedDirectories };\n}\n\nexport function workspaceLabel(cwd: string, home = homedir()): string {\n const parent = dirname(cwd);\n const rel = relative(home, parent);\n const displayParent = rel === '' ? '~' : !rel.startsWith('..') ? `~/${rel}` : parent;\n return `${basename(cwd) || cwd} · ${displayParent}`;\n}\n\nasync function hasGitEntry(cwd: string): Promise<boolean> {\n return stat(join(cwd, '.git')).then(() => true).catch(() => false);\n}\n","import type { RecentWorkspace } from '../core/model.js';\nimport { normalizeWorkspacePath } from './path.js';\n\nexport function rememberRecentWorkspace(\n existing: readonly RecentWorkspace[] | undefined,\n cwd: string,\n now = Date.now(),\n limit = 30,\n): RecentWorkspace[] {\n const normalized = normalizeWorkspacePath(cwd);\n return [\n { cwd: normalized, lastUsedAt: now },\n ...(existing ?? []).filter((item) => normalizeWorkspacePath(item.cwd) !== normalized),\n ].slice(0, limit);\n}\n","import { randomBytes } from 'node:crypto';\nimport type { WorkspaceCandidate } from './discovery.js';\n\nexport interface WorkspaceSnapshot {\n id: string;\n chatId: string;\n ownerOpenId: string;\n candidates: WorkspaceCandidate[];\n warnings: string[];\n partial: boolean;\n createdAt: number;\n expiresAt: number;\n}\n\nexport class WorkspaceSnapshotStore {\n private readonly values = new Map<string, WorkspaceSnapshot>();\n\n constructor(\n private readonly ttlMs = 10 * 60_000,\n private readonly capacity = 64,\n private readonly now: () => number = Date.now,\n private readonly createId: () => string = () => randomBytes(12).toString('base64url'),\n ) {}\n\n create(input: Omit<WorkspaceSnapshot, 'id' | 'createdAt' | 'expiresAt'>): WorkspaceSnapshot {\n const now = this.now();\n this.prune(now);\n const snapshot: WorkspaceSnapshot = {\n ...input, id: this.createId(), createdAt: now, expiresAt: now + this.ttlMs,\n };\n this.values.set(snapshot.id, snapshot);\n while (this.values.size > this.capacity) {\n const oldest = this.values.keys().next().value as string | undefined;\n if (!oldest) break;\n this.values.delete(oldest);\n }\n return snapshot;\n }\n\n get(id: string, chatId: string, ownerOpenId: string): WorkspaceSnapshot | undefined {\n const now = this.now();\n this.prune(now);\n const value = this.values.get(id);\n return value?.chatId === chatId && value.ownerOpenId === ownerOpenId ? value : undefined;\n }\n\n private prune(now: number): void {\n for (const [id, value] of this.values) {\n if (value.expiresAt <= now) this.values.delete(id);\n }\n }\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","resolve","chmod","mkdir","message","paths","mkdir","chmod","result","result","operation","message","result","errorMessage","readFile","homedir","homedir","readFile","result","paths","randomBytes","ANSI","result","option","randomBytes","message","randomBytes","timingSafeEqual","randomBytes","timingSafeEqual","selected","view","option","result","message","result","card","resolve","view","option","createHash","createHash","readdir","stat","homedir","dirname","join","homedir","readdir","join","dirname","stat","randomBytes","paths","message","resolve","chmod","open","readFile","result","errorMessage","escapeFence","view","current","option","navigation","committedClaim","pending","pane","homedir","join","readFile"]}
|