botmux 1.5.1 → 1.8.0

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.en.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [中文](README.md) | English
4
4
 
5
- Bridge between Lark (Feishu) topic groups and AI coding CLIs. The daemon listens for Lark messages and automatically spawns an independent CLI process (supporting Claude Code, Aiden, CoCo, Codex) for each new topic thread, with live streaming cards and a web-based terminal.
5
+ Bridge between Lark (Feishu) topic groups and AI coding CLIs. The daemon listens for Lark messages and automatically spawns an independent CLI process (supporting Claude Code, Aiden, CoCo, Codex, Gemini) for each new topic thread, with live streaming cards and a web-based terminal.
6
6
 
7
7
  ## Demo
8
8
 
@@ -11,47 +11,19 @@ Bridge between Lark (Feishu) topic groups and AI coding CLIs. The daemon listens
11
11
  ## Features
12
12
 
13
13
  - **One topic = one AI coding session** — each Lark thread gets its own isolated CLI process
14
- - **Multi-CLI support** — adapter architecture supports Claude Code, Aiden, CoCo, Codex, and is extensible
14
+ - **Multi-CLI support** — adapter architecture supports Claude Code, Aiden, CoCo, Codex, Gemini, and is extensible
15
15
  - **Live streaming cards** — real-time terminal output rendered in Feishu cards with markdown support, per-turn card lifecycle
16
- - **Web terminal (xterm.js)** — full PTY output in the browser with optional write access via on-demand DM link
16
+ - **Web terminal (xterm.js)** — full PTY output in the browser with a mobile shortcut toolbar and on-demand write access via DM link
17
17
  - **Session persistence** — sessions survive daemon restarts; with tmux backend, CLI processes persist across restarts with zero interruption
18
18
  - **Scheduled tasks** — cron-based recurring prompts with natural language scheduling (Chinese supported)
19
19
  - **Project management** — interactive repo selector, per-session working directory
20
20
  - **MCP integration** — CLI can reply to Lark threads, read message history, and add reactions via MCP tools
21
21
  - **Access control** — allowlist for users, token-based write access for terminals, button restrictions on cards
22
22
 
23
- ## Architecture
24
-
25
- ```
26
- Lark WebSocket Events
27
- |
28
- Daemon (daemon.ts → core/ modules)
29
- |-- im/lark/event-dispatcher: Lark event routing
30
- |-- im/lark/card-handler: card interaction handling
31
- |-- core/worker-pool: worker process pool management
32
- |-- core/command-handler: slash command processing
33
- |-- core/session-manager: session lifecycle
34
- |-- core/scheduler: cron task scheduling
35
- |
36
- Worker (worker.ts) -- forked child process per session
37
- |-- adapters/cli/*: CLI adapters (Claude Code / Aiden / CoCo / Codex)
38
- |-- adapters/backend: PtyBackend (node-pty) or TmuxBackend (tmux + node-pty)
39
- |-- utils/idle-detector: idle detection (quiescence + spinner + completion marker)
40
- |-- HTTP + WebSocket server: serves xterm.js web terminal
41
- |-- Headless xterm: captures screen for streaming cards
42
- |-- IPC: communicates with daemon
43
- |
44
- AI Coding CLI (interactive TTY mode)
45
- |-- MCP Server (stdio): send_to_thread, get_thread_messages, react_to_message
46
- |
47
- Lark API
48
- |-- Replies, reactions, card updates, DMs
49
- ```
50
-
51
23
  ## Prerequisites
52
24
 
53
25
  - **Node.js** >= 20
54
- - **AI coding CLI** installed and authenticated (`claude`, `aiden`, `coco`, or `codex` in PATH)
26
+ - **AI coding CLI** installed and authenticated (`claude`, `aiden`, `coco`, `codex`, or `gemini` in PATH)
55
27
  - **Lark app** with Bot and Message permissions (WebSocket event subscription)
56
28
  - **tmux** >= 3.x (optional — auto-enabled when installed for persistent CLI sessions)
57
29
 
@@ -107,7 +79,7 @@ Configuration is stored at `~/.botmux/.env`. Run `botmux setup` to create it int
107
79
 
108
80
  | Variable | Default | Description |
109
81
  |----------|---------|-------------|
110
- | `CLI_ID` | `claude-code` | CLI adapter (`claude-code`, `aiden`, `coco`, `codex`) |
82
+ | `CLI_ID` | `claude-code` | CLI adapter (`claude-code`, `aiden`, `coco`, `codex`, `gemini`) |
111
83
  | `CLI_PATH` | _(auto-detect by CLI_ID)_ | CLI binary path override |
112
84
  | `BACKEND_TYPE` | _(auto-detect)_ | Session backend: `tmux` if available, otherwise `pty` |
113
85
  | `WORKING_DIR` | `~` | Default working directory; supports comma-separated multiple dirs (e.g. `~/a,~/b`), `/repo` scans all |
@@ -168,7 +140,7 @@ botmux setup
168
140
  | `allowedUsers` | No | Allowed user list |
169
141
  | `projectScanDir` | No | Directory to scan for git repos |
170
142
 
171
- **Config priority:** `BOTS_CONFIG` env var `~/.botmux/bots.json` `.env` single-bot mode
143
+ **Config priority:** `BOTS_CONFIG` env var > `~/.botmux/bots.json` > `.env` single-bot mode
172
144
 
173
145
  ## File Locations
174
146
 
@@ -231,7 +203,7 @@ Manage tasks:
231
203
  Each conversation turn gets a live-updating Feishu card that shows:
232
204
 
233
205
  - Real-time terminal output (rendered via headless xterm + Feishu Card v2 markdown)
234
- - Status indicator: 🟡 Starting 🔵 Working 🟢 Idle
206
+ - Status indicator: 🟡 Starting > 🔵 Working > 🟢 Idle
235
207
  - Action buttons: Open Terminal, Get Write Link, Restart Claude, Close Session
236
208
 
237
209
  The card content is captured from a headless xterm terminal that filters out TUI chrome (logo, status bar, prompts, box-drawing characters) and shows only Claude's actual work output.
@@ -243,11 +215,11 @@ Each session exposes a web terminal at `http://<WEB_EXTERNAL_HOST>:<port>`.
243
215
  - **Read-only link** — shown on the streaming card in the group thread
244
216
  - **Write-enabled link** — sent via DM on demand (click "🔑 Get Write Link" on the card)
245
217
 
246
- Features: xterm.js with fit/unicode11/web-links addons, TokyoNight theme, scrollback buffer, mobile-friendly viewport.
218
+ Features: xterm.js with fit/unicode11/web-links addons, TokyoNight theme, scrollback buffer. On mobile/tablet, a floating shortcut toolbar provides Esc, Ctrl+C, Tab, arrow keys and other control keys missing from virtual keyboards, with automatic keyboard avoidance.
247
219
 
248
220
  ### Tmux Persistent Sessions
249
221
 
250
- When tmux is installed, botmux automatically uses the tmux backend (pty-under-tmux architecture). CLI processes run inside tmux sessions while the daemon attaches via node-pty to capture output — streaming cards, idle detection, and web terminal all work unchanged.
222
+ When tmux is installed, botmux automatically uses the tmux backend. CLI processes run inside tmux sessions while the daemon attaches via node-pty to capture output — streaming cards, idle detection, and web terminal all work unchanged.
251
223
 
252
224
  **Key benefit: daemon restarts don't interrupt the CLI.** During `botmux restart`, the worker process exits but the tmux session (and the CLI inside it) keeps running. The next incoming message triggers a re-attach — no `--resume` context reload needed.
253
225
 
@@ -263,7 +235,7 @@ tmux attach -t bmx-<first-8-chars-of-session-id>
263
235
  BACKEND_TYPE=pty botmux start
264
236
  ```
265
237
 
266
- **Session naming:** `bmx-<first 8 chars of session UUID>`, deterministically derived.
238
+ **Session naming:** `bmx-<first 8 chars of session UUID>`
267
239
 
268
240
  **Lifecycle:**
269
241
 
@@ -272,92 +244,10 @@ BACKEND_TYPE=pty botmux start
272
244
  | `botmux restart` | Survives | Survives (re-attaches on next message) |
273
245
  | `/close` or close button | Destroyed | Terminated (SIGHUP) |
274
246
  | CLI exits / crashes | Closes with it | Already exited (auto-restart creates new session) |
275
- | `CLI_ID` changed + restart | All destroyed | All terminated (prevents pattern mismatch) |
276
-
277
- **Notes:**
278
- - Switching `CLI_ID` (e.g. `claude-code` → `coco`) and restarting the daemon will kill all existing tmux sessions, since the old CLI's idle detection patterns are incompatible with the new adapter
279
- - Orphaned tmux sessions (not in the active session list) are cleaned up automatically on daemon startup
280
- - Set `BACKEND_TYPE=pty` to opt out of tmux persistence
281
-
282
- ## MCP Tools
283
-
284
- Claude Code has access to three MCP tools for interacting with Lark:
285
-
286
- | Tool | Description |
287
- |------|-------------|
288
- | `send_to_thread` | Send a message (text or rich post) to the Lark thread |
289
- | `get_thread_messages` | Retrieve message history from the thread |
290
- | `react_to_message` | Add or remove emoji reactions on messages |
291
247
 
292
- ## Development
248
+ ## Contributing
293
249
 
294
- ```bash
295
- git clone <repo-url>
296
- cd botmux
297
- pnpm install
298
- pnpm build
299
-
300
- # Run directly (no PM2)
301
- pnpm daemon
302
-
303
- # Or with PM2
304
- pnpm daemon:start
305
- pnpm daemon:logs
306
- ```
307
-
308
- ## Project Structure
309
-
310
- ```
311
- src/
312
- cli.ts # CLI entry point (setup/start/stop/restart/logs/list/delete)
313
- daemon.ts # Daemon orchestrator (~400 lines, wires modules together)
314
- worker.ts # Worker process: uses adapters to manage CLI + PTY
315
- bot-registry.ts # Multi-bot registry (config loading, per-bot state)
316
- config.ts # Configuration from environment variables
317
- server.ts # MCP server setup
318
- types.ts # IPC message types
319
- adapters/
320
- cli/
321
- types.ts # CliAdapter interface, CliId type
322
- registry.ts # Adapter factory + resolveCommand
323
- claude-code.ts # Claude Code adapter
324
- aiden.ts # Aiden adapter
325
- coco.ts # CoCo adapter
326
- codex.ts # Codex adapter
327
- backend/
328
- types.ts # SessionBackend interface
329
- pty-backend.ts # node-pty backend
330
- tmux-backend.ts # tmux backend (pty-under-tmux, persistent sessions)
331
- core/
332
- types.ts # DaemonSession core type
333
- worker-pool.ts # Worker process pool management
334
- command-handler.ts # Slash command processing
335
- session-manager.ts # Session lifecycle + path resolution
336
- cost-calculator.ts # Token usage & cost estimation
337
- scheduler.ts # Cron scheduling with natural language parsing
338
- im/
339
- types.ts # ImAdapter interface definitions (multi-IM abstraction)
340
- lark/
341
- client.ts # Lark API wrapper
342
- event-dispatcher.ts # Lark WebSocket event routing
343
- card-handler.ts # Lark card interaction handling
344
- card-builder.ts # Lark interactive card builders
345
- message-parser.ts # Lark event message parsing
346
- tools/
347
- index.ts # MCP tool registry
348
- send-to-thread.ts # MCP tool: send message
349
- get-thread-messages.ts # MCP tool: read messages
350
- react-to-message.ts # MCP tool: emoji reactions
351
- services/
352
- session-store.ts # Session persistence (JSON)
353
- schedule-store.ts # Scheduled task persistence
354
- message-queue.ts # Per-thread JSONL message queue
355
- project-scanner.ts # Git repo/worktree discovery
356
- utils/
357
- idle-detector.ts # CLI idle detection (quiescence + spinner + completion marker)
358
- terminal-renderer.ts # Headless xterm renderer for screen capture & TUI filtering
359
- logger.ts # Logging utility
360
- ```
250
+ See [CONTRIBUTING.md](CONTRIBUTING.md).
361
251
 
362
252
  ## License
363
253
 
package/README.md CHANGED
@@ -2,57 +2,28 @@
2
2
 
3
3
  中文 | [English](README.en.md)
4
4
 
5
- 飞书话题群与 AI 编程 CLI 的桥接工具。Daemon 监听飞书消息,为每个新话题自动启动一个独立的 CLI 进程(支持 Claude Code、Aiden、CoCo、Codex),提供实时流式卡片和 Web 终端。
5
+ 飞书话题群与 AI 编程 CLI 的桥接工具。Daemon 监听飞书消息,为每个新话题自动启动一个独立的 CLI 进程(支持 Claude Code、Aiden、CoCo、Codex、Gemini),提供实时流式卡片和 Web 终端。
6
6
 
7
7
  ## 演示
8
8
 
9
9
  [演示视频](https://github.com/user-attachments/assets/3ba4c681-0a7e-4a03-89c8-b8d26b544a65)
10
10
 
11
-
12
11
  ## 功能特性
13
12
 
14
13
  - **一个话题 = 一个 AI 编程会话** — 每个飞书话题线程对应一个独立的 CLI 进程
15
- - **多 CLI 支持** — 通过适配器架构支持 Claude Code、Aiden、CoCo、Codex,可扩展
14
+ - **多 CLI 支持** — 通过适配器架构支持 Claude Code、Aiden、CoCo、Codex、Gemini,可扩展
16
15
  - **实时流式卡片** — 终端输出实时渲染到飞书卡片中,支持 Markdown 格式,每轮对话独立卡片
17
- - **Web 终端 (xterm.js)** — 浏览器查看完整 PTY 输出,按需获取可操作链接
16
+ - **Web 终端 (xterm.js)** — 浏览器查看完整 PTY 输出,移动端快捷键工具栏,按需获取可操作链接
18
17
  - **会话持久化** — 会话在 Daemon 重启后自动恢复;tmux 后端下 CLI 进程常驻,重启零中断
19
18
  - **定时任务** — 基于 Cron 的周期性任务,支持中文自然语言配置
20
19
  - **项目管理** — 交互式仓库选择器,每个会话独立工作目录
21
20
  - **MCP 集成** — CLI 可通过 MCP 工具回复飞书话题、读取消息历史、添加表情回应
22
21
  - **权限控制** — 用户白名单、终端 Token 写入权限、卡片按钮操作限制
23
22
 
24
- ## 架构
25
-
26
- ```
27
- 飞书 WebSocket 事件
28
- |
29
- Daemon (daemon.ts → core/ 模块)
30
- |-- im/lark/event-dispatcher: 飞书事件路由
31
- |-- im/lark/card-handler: 卡片交互处理
32
- |-- core/worker-pool: Worker 进程池管理
33
- |-- core/command-handler: 斜杠命令处理
34
- |-- core/session-manager: 会话生命周期
35
- |-- core/scheduler: 定时任务调度
36
- |
37
- Worker (worker.ts) -- 每个会话 fork 一个子进程
38
- |-- adapters/cli/*: CLI 适配器 (Claude Code / Aiden / CoCo / Codex)
39
- |-- adapters/backend: PtyBackend (node-pty) 或 TmuxBackend (tmux + node-pty)
40
- |-- utils/idle-detector: 空闲检测(静默 + Spinner + 完成标记)
41
- |-- HTTP + WebSocket: 提供 xterm.js Web 终端
42
- |-- Headless xterm: 捕获屏幕内容用于流式卡片
43
- |-- IPC: 与 Daemon 通信
44
- |
45
- AI 编程 CLI (交互式 TTY 模式)
46
- |-- MCP Server (stdio): send_to_thread, get_thread_messages, react_to_message
47
- |
48
- 飞书 API
49
- |-- 回复消息、表情回应、卡片更新、私聊
50
- ```
51
-
52
23
  ## 前置要求
53
24
 
54
25
  - **Node.js** >= 20
55
- - **AI 编程 CLI** 已安装并完成认证(`claude`、`aiden`、`coco` 或 `codex` 在 PATH 中)
26
+ - **AI 编程 CLI** 已安装并完成认证(`claude`、`aiden`、`coco`、`codex` 或 `gemini` 在 PATH 中)
56
27
  - **飞书应用** 具备机器人和消息权限(WebSocket 事件订阅)
57
28
  - **tmux** >= 3.x(可选,安装后自动启用会话常驻)
58
29
 
@@ -108,7 +79,7 @@ botmux start
108
79
 
109
80
  | 变量 | 默认值 | 说明 |
110
81
  |------|--------|------|
111
- | `CLI_ID` | `claude-code` | CLI 适配器(`claude-code`、`aiden`、`coco`、`codex`) |
82
+ | `CLI_ID` | `claude-code` | CLI 适配器(`claude-code`、`aiden`、`coco`、`codex`、`gemini`) |
112
83
  | `CLI_PATH` | _(按 CLI_ID 自动检测)_ | CLI 可执行文件路径覆盖 |
113
84
  | `BACKEND_TYPE` | _(自动检测)_ | 会话后端:有 tmux 则用 `tmux`,否则 `pty` |
114
85
  | `WORKING_DIR` | `~` | 默认工作目录,支持逗号分隔多个目录(如 `~/a,~/b`),`/repo` 会扫描所有目录 |
@@ -244,11 +215,11 @@ botmux setup
244
215
  - **只读链接** — 展示在群话题的流式卡片上
245
216
  - **可操作链接** — 按需获取(点击卡片上的「🔑 获取操作链接」通过私聊发送)
246
217
 
247
- 特性:xterm.js + fit/unicode11/web-links 插件、TokyoNight 主题、滚动缓冲区、移动端适配。
218
+ 特性:xterm.js + fit/unicode11/web-links 插件、TokyoNight 主题、滚动缓冲区。移动端/平板通过悬浮快捷键工具栏提供 Esc、Ctrl+C、Tab、方向键等虚拟键盘缺失的控制键,工具栏自动避让虚拟键盘。
248
219
 
249
220
  ### Tmux 会话常驻
250
221
 
251
- 安装 tmux 后,botmux 自动使用 tmux 后端(`pty-under-tmux` 架构)。CLI 进程运行在 tmux session 内,daemon 通过 node-pty attach 到 tmux 来捕获输出,现有的流式卡片、空闲检测、Web 终端等功能全部不受影响。
222
+ 安装 tmux 后,botmux 自动使用 tmux 后端。CLI 进程运行在 tmux session 内,daemon 通过 node-pty attach 到 tmux 来捕获输出,流式卡片、空闲检测、Web 终端等功能全部不受影响。
252
223
 
253
224
  **核心收益:Daemon 重启不中断 CLI。** `botmux restart` 时 worker 进程退出,但 tmux session(及其中的 CLI 进程)保持运行。下次收到消息时 worker 自动 re-attach,无需 `--resume` 重载上下文。
254
225
 
@@ -264,7 +235,7 @@ tmux attach -t bmx-<session-id-前8位>
264
235
  BACKEND_TYPE=pty botmux start
265
236
  ```
266
237
 
267
- **tmux 会话命名规则:** `bmx-<sessionId 前 8 位>`,由 session UUID 确定性派生。
238
+ **tmux 会话命名规则:** `bmx-<sessionId 前 8 位>`
268
239
 
269
240
  **生命周期:**
270
241
 
@@ -273,92 +244,10 @@ BACKEND_TYPE=pty botmux start
273
244
  | `botmux restart` | 存活 | 存活(下次消息 re-attach) |
274
245
  | `/close` 或关闭按钮 | 销毁 | 终止(SIGHUP) |
275
246
  | CLI 自行退出 / 崩溃 | 随之关闭 | 已退出(自动重启用新 session) |
276
- | 切换 `CLI_ID` 后重启 | 全部销毁 | 全部终止(防止 pattern 不匹配) |
277
-
278
- **注意事项:**
279
- - 切换 `CLI_ID`(如 `claude-code` → `coco`)后重启 daemon,所有旧 tmux session 会被自动清理,因为旧 CLI 的 idle detection pattern 与新适配器不兼容
280
- - 孤儿 tmux session(不在 active session 列表中的)会在 daemon 启动时自动清理
281
- - 如果不需要 tmux 常驻特性,设置 `BACKEND_TYPE=pty` 即可降级
282
-
283
- ## MCP 工具
284
-
285
- Claude Code 可使用三个 MCP 工具与飞书交互:
286
-
287
- | 工具 | 说明 |
288
- |------|------|
289
- | `send_to_thread` | 向飞书话题发送消息(纯文本或富文本) |
290
- | `get_thread_messages` | 获取话题的消息历史 |
291
- | `react_to_message` | 添加或移除消息的表情回应 |
292
-
293
- ## 开发
294
247
 
295
- ```bash
296
- git clone <repo-url>
297
- cd botmux
298
- pnpm install
299
- pnpm build
248
+ ## 贡献
300
249
 
301
- # 直接运行(不经 PM2)
302
- pnpm daemon
303
-
304
- # 或使用 PM2
305
- pnpm daemon:start
306
- pnpm daemon:logs
307
- ```
308
-
309
- ## 项目结构
310
-
311
- ```
312
- src/
313
- cli.ts # CLI 入口(setup/start/stop/restart/logs/list/delete)
314
- daemon.ts # Daemon 编排入口(~400 行,调用各模块)
315
- worker.ts # Worker 进程:使用适配器管理 CLI + PTY
316
- bot-registry.ts # 多机器人注册表(配置加载、per-bot 状态管理)
317
- config.ts # 环境变量配置
318
- server.ts # MCP Server
319
- types.ts # IPC 消息类型
320
- adapters/
321
- cli/
322
- types.ts # CliAdapter 接口、CliId 类型
323
- registry.ts # 适配器工厂 + resolveCommand
324
- claude-code.ts # Claude Code 适配器
325
- aiden.ts # Aiden 适配器
326
- coco.ts # CoCo 适配器
327
- codex.ts # Codex 适配器
328
- backend/
329
- types.ts # SessionBackend 接口
330
- pty-backend.ts # node-pty 后端
331
- tmux-backend.ts # tmux 后端(pty-under-tmux,会话常驻)
332
- core/
333
- types.ts # DaemonSession 核心类型
334
- worker-pool.ts # Worker 进程池管理
335
- command-handler.ts # 斜杠命令处理
336
- session-manager.ts # 会话生命周期 + 路径解析
337
- cost-calculator.ts # Token 用量 & 费用估算
338
- scheduler.ts # 定时任务调度(自然语言解析)
339
- im/
340
- types.ts # ImAdapter 接口定义(多 IM 抽象)
341
- lark/
342
- client.ts # 飞书 API 封装
343
- event-dispatcher.ts # 飞书 WebSocket 事件路由
344
- card-handler.ts # 飞书卡片交互处理
345
- card-builder.ts # 飞书交互卡片构建
346
- message-parser.ts # 飞书事件消息解析
347
- tools/
348
- index.ts # MCP 工具注册表
349
- send-to-thread.ts # MCP 工具:发送消息
350
- get-thread-messages.ts # MCP 工具:读取消息
351
- react-to-message.ts # MCP 工具:表情回应
352
- services/
353
- session-store.ts # 会话持久化 (JSON)
354
- schedule-store.ts # 定时任务持久化
355
- message-queue.ts # 话题消息队列 (JSONL)
356
- project-scanner.ts # Git 仓库/Worktree 扫描
357
- utils/
358
- idle-detector.ts # CLI 空闲检测(静默 + Spinner + 完成标记)
359
- terminal-renderer.ts # Headless xterm 渲染器(屏幕捕获 & TUI 过滤)
360
- logger.ts # 日志工具
361
- ```
250
+ 参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
362
251
 
363
252
  ## 许可证
364
253
 
@@ -1 +1 @@
1
- {"version":3,"file":"tmux-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAM/B,iDAAiD;IACjD,MAAM,CAAC,WAAW,IAAI,OAAO;IAS7B,oDAAoD;IACpD,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI7C,4CAA4C;IAC5C,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IASxC,6DAA6D;IAC7D,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMtC,oDAAoD;IACpD,MAAM,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAarC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAmDzD,wEAAwE;IACxE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,yFAAyF;IACzF,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIxC,yFAAyF;IACzF,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IAMtE,wEAAwE;IACxE,IAAI,IAAI,IAAI;IAOZ,oEAAoE;IACpE,cAAc,IAAI,IAAI;IAKtB,aAAa;;;;CAGd"}
1
+ {"version":3,"file":"tmux-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAM/B,iDAAiD;IACjD,MAAM,CAAC,WAAW,IAAI,OAAO;IAS7B,oDAAoD;IACpD,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI7C,4CAA4C;IAC5C,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IASxC,6DAA6D;IAC7D,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMtC,oDAAoD;IACpD,MAAM,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAarC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAwDzD,wEAAwE;IACxE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,yFAAyF;IACzF,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIxC,yFAAyF;IACzF,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IAMtE,wEAAwE;IACxE,IAAI,IAAI,IAAI;IAOZ,oEAAoE;IACpE,cAAc,IAAI,IAAI;IAKtB,aAAa;;;;CAGd"}
@@ -102,11 +102,16 @@ export class TmuxBackend {
102
102
  cwd: opts.cwd,
103
103
  env: opts.env,
104
104
  });
105
- // Disable status bar to avoid cursor-positioning noise that can
106
- // interfere with xterm.js rendering in the web terminal.
105
+ // Configure tmux session for web terminal use:
106
+ // - status off: avoid cursor-positioning noise in xterm.js
107
+ // - mouse on: let tmux handle scroll wheel → copy mode for scrollback
108
+ // - history-limit: large scrollback buffer (tmux default is 2000)
107
109
  setTimeout(() => {
108
110
  try {
109
- execSync(`tmux set-option -t ${shellescape(this.sessionName)} status off`, { stdio: 'ignore' });
111
+ const t = shellescape(this.sessionName);
112
+ execSync(`tmux set-option -t ${t} status off`, { stdio: 'ignore' });
113
+ execSync(`tmux set-option -t ${t} mouse on`, { stdio: 'ignore' });
114
+ execSync(`tmux set-option -t ${t} history-limit 50000`, { stdio: 'ignore' });
110
115
  }
111
116
  catch { /* session may not be ready yet — benign */ }
112
117
  }, 500);
@@ -1 +1 @@
1
- {"version":3,"file":"tmux-backend.js","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tmux-backend.js","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliAdapter } from './types.js';
2
+ export declare function createGeminiAdapter(pathOverride?: string): CliAdapter;
3
+ export declare const create: typeof createGeminiAdapter;
4
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/gemini.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAiErE;AAED,eAAO,MAAM,MAAM,4BAAsB,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { resolveCommand } from './registry.js';
3
+ function delay(ms) {
4
+ return new Promise(resolve => setTimeout(resolve, ms));
5
+ }
6
+ export function createGeminiAdapter(pathOverride) {
7
+ const bin = resolveCommand(pathOverride ?? 'gemini');
8
+ return {
9
+ id: 'gemini',
10
+ resolvedBin: bin,
11
+ buildArgs({ initialPrompt }) {
12
+ // Gemini CLI manages sessions internally (--resume takes "latest" or
13
+ // an index/UUID, not our daemon session IDs). We always start fresh.
14
+ const args = ['--yolo'];
15
+ // Use -i (prompt-interactive) for the initial prompt. Gemini's Ink TUI
16
+ // has a startup phase where the TextInput component isn't mounted yet
17
+ // (auth, model loading, extensions). Writing to stdin during this phase
18
+ // is silently lost. -i injects the prompt inside the session so Gemini
19
+ // processes it once the TUI is fully ready.
20
+ if (initialPrompt) {
21
+ args.push('-i', initialPrompt);
22
+ }
23
+ return args;
24
+ },
25
+ passesInitialPromptViaArgs: true,
26
+ async writeInput(pty, content) {
27
+ // Gemini uses Ink TextInput — multi-line paste needs a delay before Enter
28
+ // to let the TUI process the pasted content.
29
+ pty.write(content);
30
+ await delay(200);
31
+ pty.write('\r');
32
+ },
33
+ ensureMcpConfig(entry) {
34
+ // Clean up stale entries (e.g. old "claude-code-robot" → renamed to "botmux")
35
+ for (const stale of ['claude-code-robot']) {
36
+ if (stale !== entry.name) {
37
+ try {
38
+ execSync(`${bin} mcp remove ${stale}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
39
+ }
40
+ catch { /* not present — fine */ }
41
+ }
42
+ }
43
+ // Remove first so re-registration picks up env changes
44
+ try {
45
+ execSync(`${bin} mcp remove ${entry.name}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
46
+ }
47
+ catch { /* not registered yet — fine */ }
48
+ // gemini mcp add <name> <command> [args...] -e K=V --trust --scope user
49
+ const envArgs = Object.entries(entry.env)
50
+ .map(([k, v]) => `-e ${k}=${v}`)
51
+ .join(' ');
52
+ const argsStr = entry.args.join(' ');
53
+ const cmd = `${bin} mcp add ${entry.name} ${entry.command} ${argsStr} ${envArgs} --trust --scope user`;
54
+ try {
55
+ execSync(cmd, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
56
+ }
57
+ catch (err) {
58
+ console.warn(`[gemini] Failed to add MCP config: ${err.message}`);
59
+ }
60
+ },
61
+ completionPattern: undefined, // quiescence only — no explicit completion marker
62
+ readyPattern: undefined, // Ink TUI — '>' is too generic; rely on quiescence + spinner guard
63
+ systemHints: [
64
+ '消息可能包含 attachments,每个有 path 字段,用 Read 工具查看',
65
+ ],
66
+ altScreen: true, // Ink renders in alternate screen buffer by default
67
+ };
68
+ }
69
+ export const create = createGeminiAdapter;
70
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/adapters/cli/gemini.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,12 @@ import { createClaudeCodeAdapter } from './claude-code.js';
3
3
  import { createAidenAdapter } from './aiden.js';
4
4
  import { createCocoAdapter } from './coco.js';
5
5
  import { createCodexAdapter } from './codex.js';
6
+ import { createGeminiAdapter } from './gemini.js';
6
7
  /** Resolve a command name to its absolute path via login-shell `which`. */
7
8
  export declare function resolveCommand(cmd: string): string;
8
9
  /** Async adapter factory (uses dynamic import for lazy loading in daemon process). */
9
10
  export declare function createCliAdapter(id: CliId, pathOverride?: string): Promise<CliAdapter>;
10
- export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter };
11
+ export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter, createGeminiAdapter };
11
12
  /** Synchronous version for use in worker process. */
12
13
  export declare function createCliAdapterSync(id: CliId, pathOverride?: string): CliAdapter;
13
14
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUlD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5F;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AAE9F,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAQjF"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUlD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM5F;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AAEnH,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CASjF"}
@@ -4,6 +4,7 @@ import { createClaudeCodeAdapter } from './claude-code.js';
4
4
  import { createAidenAdapter } from './aiden.js';
5
5
  import { createCocoAdapter } from './coco.js';
6
6
  import { createCodexAdapter } from './codex.js';
7
+ import { createGeminiAdapter } from './gemini.js';
7
8
  /** Resolve a command name to its absolute path via login-shell `which`. */
8
9
  export function resolveCommand(cmd) {
9
10
  if (isAbsolute(cmd))
@@ -28,7 +29,7 @@ export async function createCliAdapter(id, pathOverride) {
28
29
  adapterCache.set(key, adapter);
29
30
  return adapter;
30
31
  }
31
- export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter };
32
+ export { createClaudeCodeAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter, createGeminiAdapter };
32
33
  /** Synchronous version for use in worker process. */
33
34
  export function createCliAdapterSync(id, pathOverride) {
34
35
  switch (id) {
@@ -36,6 +37,7 @@ export function createCliAdapterSync(id, pathOverride) {
36
37
  case 'aiden': return createAidenAdapter(pathOverride);
37
38
  case 'coco': return createCocoAdapter(pathOverride);
38
39
  case 'codex': return createCodexAdapter(pathOverride);
40
+ case 'gemini': return createGeminiAdapter(pathOverride);
39
41
  default: throw new Error(`Unknown CLI adapter: ${id}`);
40
42
  }
41
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEnD,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAS,EAAE,YAAqB;IACrE,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;IAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACzD,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACvD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AAE9F,qDAAqD;AACrD,MAAM,UAAU,oBAAoB,CAAC,EAAS,EAAE,YAAqB;IACnE,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,aAAa,CAAC,CAAC,OAAO,uBAAuB,CAAC,YAAY,CAAC,CAAC;QACjE,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,CAAC,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACpD,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5F,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEnD,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAS,EAAE,YAAqB;IACrE,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;IAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACzD,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACvD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AAEnH,qDAAqD;AACrD,MAAM,UAAU,oBAAoB,CAAC,EAAS,EAAE,YAAqB;IACnE,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,aAAa,CAAC,CAAC,OAAO,uBAAuB,CAAC,YAAY,CAAC,CAAC;QACjE,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,MAAM,CAAC,CAAC,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACpD,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACtD,KAAK,QAAQ,CAAC,CAAC,OAAO,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -13,11 +13,18 @@ export interface CliAdapter {
13
13
  /** Resolved absolute path to the CLI binary */
14
14
  readonly resolvedBin: string;
15
15
  /** Build spawn arguments (bin comes from resolvedBin).
16
- * Note: workingDir is NOT passed here — it's the backend's cwd, not a CLI arg. */
16
+ * Note: workingDir is NOT passed here — it's the backend's cwd, not a CLI arg.
17
+ * When initialPrompt is provided and the adapter supports it, the prompt
18
+ * is baked into CLI args (e.g. Gemini's -i flag) instead of being written
19
+ * to stdin after idle detection. */
17
20
  buildArgs(opts: {
18
21
  sessionId: string;
19
22
  resume: boolean;
23
+ initialPrompt?: string;
20
24
  }): string[];
25
+ /** When true, the adapter passes the initial prompt via CLI args (e.g. -i).
26
+ * The worker skips queuing the prompt for stdin write. */
27
+ readonly passesInitialPromptViaArgs?: boolean;
21
28
  /** Write user input to PTY. May fire writes asynchronously (e.g. Aiden delayed Enter).
22
29
  * Resolves when all writes are complete. */
23
30
  writeInput(pty: PtyHandle, content: string): Promise<void>;
@@ -38,5 +45,5 @@ export interface CliAdapter {
38
45
  /** Whether CLI uses alternate screen buffer */
39
46
  readonly altScreen: boolean;
40
47
  }
41
- export type CliId = 'claude-code' | 'aiden' | 'coco' | 'codex';
48
+ export type CliId = 'claude-code' | 'aiden' | 'coco' | 'codex' | 'gemini';
42
49
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;uFACmF;IACnF,SAAS,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;KACjB,GAAG,MAAM,EAAE,CAAC;IAEb;iDAC6C;IAC7C,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D,mEAAmE;IACnE,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAE7C,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;;;sEAKkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;qEACiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAE/B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;yCAIqC;IACrC,SAAS,CAAC,IAAI,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,MAAM,EAAE,CAAC;IAEb;+DAC2D;IAC3D,QAAQ,CAAC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAE9C;iDAC6C;IAC7C,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D,mEAAmE;IACnE,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAE7C,wFAAwF;IACxF,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAEpC;;;;;sEAKkE;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;qEACiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAE/B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC"}