botmux 2.2.7 → 2.3.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.
Files changed (117) hide show
  1. package/README.en.md +63 -13
  2. package/README.md +52 -14
  3. package/dist/adapters/cli/aiden.d.ts.map +1 -1
  4. package/dist/adapters/cli/aiden.js +0 -40
  5. package/dist/adapters/cli/aiden.js.map +1 -1
  6. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  7. package/dist/adapters/cli/claude-code.js +21 -67
  8. package/dist/adapters/cli/claude-code.js.map +1 -1
  9. package/dist/adapters/cli/coco.d.ts.map +1 -1
  10. package/dist/adapters/cli/coco.js +0 -33
  11. package/dist/adapters/cli/coco.js.map +1 -1
  12. package/dist/adapters/cli/codex.d.ts.map +1 -1
  13. package/dist/adapters/cli/codex.js +0 -27
  14. package/dist/adapters/cli/codex.js.map +1 -1
  15. package/dist/adapters/cli/gemini.d.ts.map +1 -1
  16. package/dist/adapters/cli/gemini.js +1 -29
  17. package/dist/adapters/cli/gemini.js.map +1 -1
  18. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  19. package/dist/adapters/cli/opencode.js +1 -44
  20. package/dist/adapters/cli/opencode.js.map +1 -1
  21. package/dist/adapters/cli/types.d.ts +11 -8
  22. package/dist/adapters/cli/types.d.ts.map +1 -1
  23. package/dist/cli.js +737 -16
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts +16 -0
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +30 -0
  28. package/dist/config.js.map +1 -1
  29. package/dist/core/command-handler.d.ts.map +1 -1
  30. package/dist/core/command-handler.js +8 -4
  31. package/dist/core/command-handler.js.map +1 -1
  32. package/dist/core/scheduler.d.ts +38 -16
  33. package/dist/core/scheduler.d.ts.map +1 -1
  34. package/dist/core/scheduler.js +335 -149
  35. package/dist/core/scheduler.js.map +1 -1
  36. package/dist/core/session-manager.d.ts +6 -0
  37. package/dist/core/session-manager.d.ts.map +1 -1
  38. package/dist/core/session-manager.js +105 -16
  39. package/dist/core/session-manager.js.map +1 -1
  40. package/dist/core/types.d.ts +26 -4
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/core/types.js +6 -0
  43. package/dist/core/types.js.map +1 -1
  44. package/dist/core/worker-pool.d.ts +15 -3
  45. package/dist/core/worker-pool.d.ts.map +1 -1
  46. package/dist/core/worker-pool.js +233 -31
  47. package/dist/core/worker-pool.js.map +1 -1
  48. package/dist/daemon.d.ts.map +1 -1
  49. package/dist/daemon.js +49 -10
  50. package/dist/daemon.js.map +1 -1
  51. package/dist/im/lark/card-builder.d.ts +29 -1
  52. package/dist/im/lark/card-builder.d.ts.map +1 -1
  53. package/dist/im/lark/card-builder.js +240 -55
  54. package/dist/im/lark/card-builder.js.map +1 -1
  55. package/dist/im/lark/card-handler.d.ts +1 -0
  56. package/dist/im/lark/card-handler.d.ts.map +1 -1
  57. package/dist/im/lark/card-handler.js +200 -40
  58. package/dist/im/lark/card-handler.js.map +1 -1
  59. package/dist/services/schedule-store.d.ts +20 -3
  60. package/dist/services/schedule-store.d.ts.map +1 -1
  61. package/dist/services/schedule-store.js +140 -16
  62. package/dist/services/schedule-store.js.map +1 -1
  63. package/dist/skills/definitions.d.ts +17 -0
  64. package/dist/skills/definitions.d.ts.map +1 -0
  65. package/dist/skills/definitions.js +254 -0
  66. package/dist/skills/definitions.js.map +1 -0
  67. package/dist/skills/installer.d.ts +9 -0
  68. package/dist/skills/installer.d.ts.map +1 -0
  69. package/dist/skills/installer.js +42 -0
  70. package/dist/skills/installer.js.map +1 -0
  71. package/dist/types.d.ts +80 -7
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js +1 -5
  74. package/dist/types.js.map +1 -1
  75. package/dist/utils/lark-upload.d.ts +2 -0
  76. package/dist/utils/lark-upload.d.ts.map +1 -0
  77. package/dist/utils/lark-upload.js +27 -0
  78. package/dist/utils/lark-upload.js.map +1 -0
  79. package/dist/utils/screen-analyzer.d.ts +67 -0
  80. package/dist/utils/screen-analyzer.d.ts.map +1 -0
  81. package/dist/utils/screen-analyzer.js +256 -0
  82. package/dist/utils/screen-analyzer.js.map +1 -0
  83. package/dist/utils/screenshot-renderer.d.ts +11 -0
  84. package/dist/utils/screenshot-renderer.d.ts.map +1 -0
  85. package/dist/utils/screenshot-renderer.js +225 -0
  86. package/dist/utils/screenshot-renderer.js.map +1 -0
  87. package/dist/utils/terminal-renderer.d.ts +33 -0
  88. package/dist/utils/terminal-renderer.d.ts.map +1 -1
  89. package/dist/utils/terminal-renderer.js +33 -0
  90. package/dist/utils/terminal-renderer.js.map +1 -1
  91. package/dist/worker.js +283 -14
  92. package/dist/worker.js.map +1 -1
  93. package/package.json +2 -5
  94. package/dist/index.d.ts +0 -3
  95. package/dist/index.d.ts.map +0 -1
  96. package/dist/index.js +0 -16
  97. package/dist/index.js.map +0 -1
  98. package/dist/server.d.ts +0 -3
  99. package/dist/server.d.ts.map +0 -1
  100. package/dist/server.js +0 -133
  101. package/dist/server.js.map +0 -1
  102. package/dist/tools/get-thread-messages.d.ts +0 -26
  103. package/dist/tools/get-thread-messages.d.ts.map +0 -1
  104. package/dist/tools/get-thread-messages.js +0 -38
  105. package/dist/tools/get-thread-messages.js.map +0 -1
  106. package/dist/tools/index.d.ts +0 -9
  107. package/dist/tools/index.d.ts.map +0 -1
  108. package/dist/tools/index.js +0 -10
  109. package/dist/tools/index.js.map +0 -1
  110. package/dist/tools/list-bots.d.ts +0 -40
  111. package/dist/tools/list-bots.d.ts.map +0 -1
  112. package/dist/tools/list-bots.js +0 -77
  113. package/dist/tools/list-bots.js.map +0 -1
  114. package/dist/tools/send-to-thread.d.ts +0 -46
  115. package/dist/tools/send-to-thread.d.ts.map +0 -1
  116. package/dist/tools/send-to-thread.js +0 -275
  117. package/dist/tools/send-to-thread.js.map +0 -1
package/README.en.md CHANGED
@@ -220,26 +220,35 @@ Seamlessly connect Botmux to CLI processes already running in tmux — monitor a
220
220
  ```
221
221
 
222
222
  - **Shared mode** — After adopting, iTerm2 and Lark stay in sync: streaming card shows real-time terminal output, Lark chat input is forwarded directly to the terminal
223
- - **One-click takeover** — Click the "Takeover" button on the streaming card to rebuild the session with `--resume`, enable MCP, and convert to a standard Botmux session
223
+ - **One-click takeover** — Click the "Takeover" button on the streaming card to rebuild the session with `--resume` and convert to a standard Botmux session
224
224
  - **Safe disconnect** — Click "Disconnect" to detach Botmux without affecting the original CLI
225
225
 
226
226
  ### Scheduled Tasks
227
227
 
228
- Create recurring tasks with natural language:
228
+ Three schedule types (once / interval / cron) with Chinese/English natural
229
+ language, executed inside the original thread (no new topic per run).
229
230
 
230
- ```
231
- /schedule every day at 17:50 check AI news
232
- /schedule weekdays at 9:00 run health check
233
- /schedule every Monday at 10:00 generate weekly report
234
- ```
231
+ **Two ways to create**:
232
+ - **Slash command** (quick): `/schedule 每日17:50 check AI news`
233
+ - **Conversation** (flexible): just tell the agent "add a reminder for every day at 9:00 to check deploys" — the `botmux-schedule` Skill fires automatically.
234
+
235
+ Supported formats: Chinese NL (`每日17:50` / `30分钟后` / `明天9:00`),
236
+ English duration (`30m`), interval (`every 2h`), cron (`0 9 * * *`),
237
+ ISO timestamp (`2026-05-01T10:00`).
235
238
 
236
- ### MCP Integration
239
+ ### Lark integration (Skill + CLI)
237
240
 
238
- botmux exposes MCP tools so the CLI can interact with Lark directly:
241
+ When a CLI spawns inside a botmux session it automatically gets
242
+ `~/.botmux/bin` on PATH plus a set of ready-to-use Skills:
239
243
 
240
- - Reply to the current Lark thread
241
- - Read message history from the thread
242
- - Add emoji reactions to messages
244
+ - `botmux send` — send a message to the current thread (text, images, files, @mention)
245
+ - `botmux thread messages` fetch thread history
246
+ - `botmux bots list` discover bots + their `open_id`s
247
+ - `botmux schedule` — manage scheduled tasks
248
+
249
+ These capabilities are wired via `--append-system-prompt` and Skill
250
+ descriptions, so the agent picks them up automatically. The pre-April-2026
251
+ MCP entry point has been removed (stale config is auto-cleaned on upgrade).
243
252
 
244
253
  ---
245
254
 
@@ -253,7 +262,7 @@ botmux exposes MCP tools so the CLI can interact with Lark directly:
253
262
  4. A live streaming card appears in the thread, showing real-time terminal output with markdown rendering
254
263
  5. Each reply creates a new streaming card for that turn; previous cards freeze at their last state
255
264
  6. Click "Get Write Link" on the card to receive a write-enabled terminal URL via DM
256
- 7. The CLI replies in the thread via MCP tools
265
+ 7. The CLI replies in the thread via the `botmux send` command (wired through the `botmux-send` Skill)
257
266
 
258
267
  ### Slash Commands
259
268
 
@@ -274,6 +283,31 @@ botmux exposes MCP tools so the CLI can interact with Lark directly:
274
283
 
275
284
  ### Scheduled Task Management
276
285
 
286
+ **Recommended: talk to the agent**
287
+ Just say "add a reminder to summarize yesterday's PRs every morning at 9:00" — the `botmux-schedule` Skill handles it and confirms with you.
288
+
289
+ **Slash command (quick)**
290
+
291
+ ```
292
+ # Chinese NL
293
+ /schedule 每日17:50 check AI news
294
+ /schedule 工作日每天9:00 run health check
295
+ /schedule 每周一10:00 generate weekly report
296
+
297
+ # One-shot
298
+ /schedule 30分钟后 verify deployment
299
+ /schedule 明天9:00 standup reminder
300
+
301
+ # English
302
+ /schedule every 2h probe services
303
+ /schedule 30m remind me to drink water
304
+
305
+ # Cron
306
+ /schedule 0 9 * * * good morning
307
+ ```
308
+
309
+ Manage tasks:
310
+
277
311
  ```
278
312
  /schedule list
279
313
  /schedule remove <id>
@@ -282,6 +316,8 @@ botmux exposes MCP tools so the CLI can interact with Lark directly:
282
316
  /schedule run <id>
283
317
  ```
284
318
 
319
+ **Execution behavior**: the task fires inside the **original thread where it was created** — no new topic per run. Working directory is preserved. If the original session is still alive, the prompt is injected into it; otherwise a fresh worker spawns bound to the same thread root.
320
+
285
321
  ---
286
322
 
287
323
  ## Configuration
@@ -362,6 +398,20 @@ botmux setup
362
398
  | `botmux delete all` | Close all active sessions |
363
399
  | `botmux delete stopped` | Clean up zombie sessions with dead processes |
364
400
 
401
+ ### Agent-facing subcommands
402
+
403
+ Run from inside a botmux-spawned CLI session — session context is auto-detected via ancestor process markers:
404
+
405
+ | Subcommand | Description |
406
+ |------------|-------------|
407
+ | `botmux send [content]` | Send a message to the current thread (stdin / heredoc / `--content-file`; `--images` / `--files` / `--mention` flags) |
408
+ | `botmux bots list` | List bots in the current chat (includes `open_id` for `--mention`) |
409
+ | `botmux thread messages [--limit N]` | Fetch thread message history (JSON) |
410
+ | `botmux schedule add <schedule> <prompt>` | Create a scheduled task bound to the current thread |
411
+ | `botmux schedule list/remove/pause/resume/run` | Manage scheduled tasks |
412
+
413
+ These require the `~/.botmux/bin/botmux` wrapper, which the daemon writes at startup and prepends to the worker's `PATH` — always matches the running daemon's version (no `npm i -g` needed).
414
+
365
415
  ---
366
416
 
367
417
  ## Contributing
package/README.md CHANGED
@@ -124,26 +124,33 @@ BACKEND_TYPE=pty botmux start
124
124
  ```
125
125
 
126
126
  - **共享模式** — Botmux 接入后,iTerm2 和飞书双向同步:流式卡片实时显示终端输出,飞书聊天框输入直接透传到终端
127
- - **一键接管** — 点击流式卡片上的「🔄 接管」按钮,Botmux 以 `--resume` 重建会话,启用 MCP,转为标准 Botmux 会话
127
+ - **一键接管** — 点击流式卡片上的「🔄 接管」按钮,Botmux 以 `--resume` 重建会话,转为标准 Botmux 会话
128
128
  - **安全断开** — 点击「⏏ 断开」,Botmux 退出观察,原 CLI 不受影响
129
129
 
130
130
  ### 定时任务
131
131
 
132
- 基于 Cron 的周期性任务,支持中文自然语言配置。
132
+ 支持三种调度类型 + 中文自然语言,支持原话题延续(到点在同一话题内继续,不另开 thread)。
133
133
 
134
- ```
135
- /schedule 每日17:50 帮我看看AI圈有什么新闻
136
- /schedule 工作日每天9:00 检查服务状态
137
- /schedule 每周一10:00 生成周报
138
- ```
134
+ **两种创建方式**:
135
+ - **斜杠命令**(快捷):`/schedule 每日17:50 帮我看看AI圈有什么新闻`
136
+ - **对话触发**(灵活):直接跟 agent 说「帮我加个每天 18:00 检查部署的定时任务」,自动触发 `botmux-schedule` Skill
139
137
 
140
- ### MCP 集成
138
+ 支持的调度格式:
139
+ - 中文自然语言:`每日17:50` / `每周一10:00` / `30分钟后` / `明天9:00`
140
+ - 英文 duration/interval:`30m` / `2h` / `every 30m` / `every 2h`
141
+ - Cron 表达式:`0 9 * * *`
142
+ - ISO 时间戳:`2026-05-01T10:00`
141
143
 
142
- CLI 可通过 MCP 工具与飞书话题交互:
144
+ ### 与飞书话题的交互(Skill + CLI)
143
145
 
144
- - 回复飞书话题
145
- - 读取消息历史
146
- - 添加表情回应
146
+ CLI 进入 botmux 会话时自动获得 `~/.botmux/bin` 在 PATH 中,以及一组开箱即用的 Skill:
147
+
148
+ - `botmux send` — 向当前话题发消息(支持文本、图片、文件、@mention)
149
+ - `botmux thread messages` — 读取当前话题的历史消息
150
+ - `botmux bots list` — 查询当前群聊的机器人及 open_id
151
+ - `botmux schedule` — 增删改查定时任务
152
+
153
+ 这些能力通过 `--append-system-prompt` 注入和 Skill 描述自动引导 agent 使用,老用户熟悉的 MCP 入口已移除(旧配置会被自动清理)。
147
154
 
148
155
  ---
149
156
 
@@ -254,7 +261,7 @@ botmux start
254
261
  4. 话题中出现实时流式卡片,展示终端输出并支持 Markdown 渲染
255
262
  5. 每次回复创建新的流式卡片,上一轮卡片冻结在最后状态
256
263
  6. 点击卡片上的「🔑 获取操作链接」通过私聊获取可写终端链接
257
- 7. CLI 通过 MCP 工具在话题中回复
264
+ 7. CLI 通过 `botmux send` 命令在话题中回复(由 `botmux-send` Skill 自动引导)
258
265
 
259
266
  ### 斜杠命令
260
267
 
@@ -275,12 +282,27 @@ botmux start
275
282
 
276
283
  ### 定时任务管理
277
284
 
278
- 用自然语言创建周期性任务:
285
+ **推荐方式:跟 agent 对话**
286
+ 直接说「每天 9:00 帮我生成昨天 PR 汇总」,agent 会用 `botmux-schedule` Skill 处理并跟你确认。
287
+
288
+ **斜杠命令方式(快捷)**
279
289
 
280
290
  ```
291
+ # 中文自然语言
281
292
  /schedule 每日17:50 帮我看看AI圈有什么新闻
282
293
  /schedule 工作日每天9:00 检查服务状态
283
294
  /schedule 每周一10:00 生成周报
295
+
296
+ # 一次性任务
297
+ /schedule 30分钟后 检查部署状态
298
+ /schedule 明天9:00 发早会提醒
299
+
300
+ # 英文语法
301
+ /schedule every 2h 巡检服务
302
+ /schedule 30m 提醒我喝水
303
+
304
+ # 标准 cron
305
+ /schedule 0 9 * * * 早安问候
284
306
  ```
285
307
 
286
308
  管理任务:
@@ -293,6 +315,8 @@ botmux start
293
315
  /schedule run <id>
294
316
  ```
295
317
 
318
+ **任务执行行为**:到点会在**创建任务的原话题**内续一条消息并执行,不会另开 thread。工作目录与创建时一致。如果原话题的会话还活着,prompt 直接注入现有会话(不另起 worker)。
319
+
296
320
  ---
297
321
 
298
322
  ## CLI 命令
@@ -311,6 +335,20 @@ botmux start
311
335
  | `botmux delete all` | 关闭所有活跃会话 |
312
336
  | `botmux delete stopped` | 清理所有进程已退出的僵尸会话 |
313
337
 
338
+ ### 会话内子命令(给 CLI agent 用)
339
+
340
+ 会话内的 agent 可以直接调用这些命令,session 信息通过祖先进程标记自动推断:
341
+
342
+ | 命令 | 说明 |
343
+ |------|------|
344
+ | `botmux send [content]` | 向当前话题发消息。支持 stdin / heredoc / `--content-file` 传内容,`--images`/`--files`/`--mention` 附加资源 |
345
+ | `botmux bots list` | 列出当前群聊中的机器人(含 open_id,供 `--mention` 使用) |
346
+ | `botmux thread messages [--limit N]` | 拉取当前话题的消息历史(JSON) |
347
+ | `botmux schedule add <schedule> <prompt>` | 创建定时任务(自动绑定当前话题) |
348
+ | `botmux schedule list/remove/pause/resume/run` | 管理定时任务 |
349
+
350
+ 这些命令依赖 `~/.botmux/bin/botmux` 这个 wrapper 脚本,daemon 启动时自动写入并加入 worker 的 PATH,版本始终与 daemon 一致(不需要 `npm i -g`)。
351
+
314
352
  ---
315
353
 
316
354
  ## 配置
@@ -1 +1 @@
1
- {"version":3,"file":"aiden.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAkEpE;AAED,eAAO,MAAM,MAAM,2BAAqB,CAAC"}
1
+ {"version":3,"file":"aiden.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAMxD,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAgCpE;AAED,eAAO,MAAM,MAAM,2BAAqB,CAAC"}
@@ -1,6 +1,3 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { homedir } from 'node:os';
4
1
  import { resolveCommand } from './registry.js';
5
2
  function delay(ms) {
6
3
  return new Promise(resolve => setTimeout(resolve, ms));
@@ -31,43 +28,6 @@ export function createAidenAdapter(pathOverride) {
31
28
  pty.write('\r');
32
29
  }
33
30
  },
34
- ensureMcpConfig(entry) {
35
- const configPath = join(homedir(), '.aiden', '.mcp.json');
36
- let data = {};
37
- if (existsSync(configPath)) {
38
- try {
39
- data = JSON.parse(readFileSync(configPath, 'utf-8'));
40
- }
41
- catch { /* fresh */ }
42
- }
43
- if (!data.mcpServers)
44
- data.mcpServers = {};
45
- // Clean up stale entries pointing to the same server script under a different name
46
- const serverScript = entry.args[0];
47
- let dirty = false;
48
- for (const [name, cfg] of Object.entries(data.mcpServers)) {
49
- if (name !== entry.name && cfg?.args?.[0] === serverScript) {
50
- delete data.mcpServers[name];
51
- dirty = true;
52
- }
53
- }
54
- const existing = data.mcpServers[entry.name];
55
- const envMatch = existing && JSON.stringify(existing.env) === JSON.stringify(entry.env);
56
- if (!dirty && existing && existing.args?.[0] === serverScript && envMatch)
57
- return;
58
- data.mcpServers[entry.name] = {
59
- command: entry.command,
60
- args: entry.args,
61
- env: entry.env,
62
- };
63
- try {
64
- mkdirSync(dirname(configPath), { recursive: true });
65
- writeFileSync(configPath, JSON.stringify(data, null, 2) + '\n');
66
- }
67
- catch (err) {
68
- console.warn(`[aiden] Failed to write MCP config: ${err.message}`);
69
- }
70
- },
71
31
  completionPattern: undefined, // quiescence only
72
32
  systemHints: [],
73
33
  altScreen: false,
@@ -1 +1 @@
1
- {"version":3,"file":"aiden.js","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAAqB;IACtD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;IACpD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,GAAG;QAEhB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;YACD,mDAAmD;YACnD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,eAAe,CAAC,KAAqB;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC1D,IAAI,IAAI,GAAQ,EAAE,CAAC;YACnB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAE3C,mFAAmF;YACnF,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAoB,EAAE,CAAC;gBAC7E,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;oBAC3D,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC7B,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxF,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,QAAQ;gBAAE,OAAO;YAClF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC;YACF,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,uCAAuC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS,EAAG,kBAAkB;QACjD,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"aiden.js","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAAqB;IACtD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;IACpD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,GAAG;QAEhB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;YACD,mDAAmD;YACnD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS,EAAG,kBAAkB;QACjD,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/claude-code.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAIxE,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAgGzE;AAED,eAAO,MAAM,MAAM,gCAA0B,CAAC"}
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/claude-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAIxD,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA0DzE;AAED,eAAO,MAAM,MAAM,gCAA0B,CAAC"}
@@ -1,6 +1,3 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { homedir } from 'node:os';
4
1
  import { resolveCommand } from './registry.js';
5
2
  const COMPLETION_RE = /\u2733\s*(?:Worked|Crunched|Cogitated|Cooked|Churned|Saut[eé]ed) for \d+[smh]/;
6
3
  export function createClaudeCodeAdapter(pathOverride) {
@@ -8,6 +5,7 @@ export function createClaudeCodeAdapter(pathOverride) {
8
5
  return {
9
6
  id: 'claude-code',
10
7
  resolvedBin: bin,
8
+ supportsTypeAhead: true,
11
9
  buildArgs({ sessionId, resume }) {
12
10
  const args = [];
13
11
  if (resume) {
@@ -20,86 +18,42 @@ export function createClaudeCodeAdapter(pathOverride) {
20
18
  args.push('--disallowed-tools', 'EnterPlanMode,ExitPlanMode');
21
19
  args.push('--append-system-prompt', [
22
20
  '你连接到了飞书(Lark)话题群。用户在飞书上阅读,看不到你的终端输出。',
23
- '想让用户看到的内容必须通过 send_to_thread 工具发送,终端输出不会到达聊天。',
21
+ '想让用户看到的内容必须通过 `botmux send` 命令发送,终端输出不会到达聊天。',
24
22
  '',
25
23
  '使用指南:',
26
- '- 用 send_to_thread 发送:关键结论、方案(等用户确认再执行)、最终结果、进度更新。',
27
- '- 发送纯文本即可,格式会自动处理。也可以通过 images files 参数附带图片和文件。',
28
- '- 需要上下文时用 get_thread_messages 读取之前的对话。',
24
+ '- 用 `botmux send` 发送:关键结论、方案(等用户确认再执行)、最终结果、进度更新。',
25
+ '- 发送纯文本即可:`botmux send "消息"` 或用 heredoc 传多行。格式自动处理。',
26
+ '- 附带图片:`botmux send --images /path/to/img.png "说明文字"`',
27
+ '- 附带文件:`botmux send --files /path/to/file.pdf "请查收"`',
28
+ '- 需要上下文时用 `botmux thread messages` 读取之前的对话。',
29
+ '- 查看可协作的机器人:`botmux bots list`',
29
30
  ].join('\n'));
30
31
  return args;
31
32
  },
32
33
  injectsSessionContext: true,
33
34
  async writeInput(pty, content) {
35
+ // Always use bracketed paste: Claude Code's paste-burst heuristic can
36
+ // swallow a trailing Enter sent via send-keys -l + send-keys Enter,
37
+ // leaving content in the input box. Bracketed paste marks an explicit
38
+ // \x1b[201~ boundary so the post-paste Enter is unambiguously submit.
34
39
  const hasImagePath = /\.(jpe?g|png|gif|webp|svg|bmp)\b/i.test(content);
35
- if (content.includes('\n')) {
36
- if (pty.pasteText && pty.sendSpecialKeys) {
37
- // Tmux mode: paste-buffer auto-handles bracketed paste
38
- pty.pasteText(content);
39
- await new Promise(r => setTimeout(r, hasImagePath ? 800 : 500));
40
- pty.sendSpecialKeys('Enter');
41
- }
42
- else {
43
- // Non-tmux fallback: manual bracketed paste
44
- pty.write('\x1b[200~' + content + '\x1b[201~');
45
- await new Promise(r => setTimeout(r, hasImagePath ? 800 : 500));
46
- pty.write('\r');
47
- }
40
+ const submitDelay = hasImagePath ? 800 : 500;
41
+ if (pty.pasteText && pty.sendSpecialKeys) {
42
+ pty.pasteText(content);
43
+ await new Promise(r => setTimeout(r, submitDelay));
44
+ pty.sendSpecialKeys('Enter');
48
45
  }
49
46
  else {
50
- if (pty.sendText && pty.sendSpecialKeys) {
51
- // Tmux mode: send-keys -l + Enter
52
- pty.sendText(content);
53
- pty.sendSpecialKeys('Enter');
54
- }
55
- else {
56
- pty.write(content + '\r');
57
- }
58
- }
59
- },
60
- ensureMcpConfig(entry) {
61
- const configPath = join(homedir(), '.claude.json');
62
- let data = {};
63
- if (existsSync(configPath)) {
64
- try {
65
- data = JSON.parse(readFileSync(configPath, 'utf-8'));
66
- }
67
- catch { /* fresh */ }
68
- }
69
- if (!data.mcpServers)
70
- data.mcpServers = {};
71
- // Clean up stale entries pointing to the same server script under a different name.
72
- // Old installations may have entries (e.g. "claude-code-robot") with hardcoded
73
- // LARK_APP_ID/SECRET that override per-bot credentials from the worker env.
74
- const serverScript = entry.args[0];
75
- let dirty = false;
76
- for (const [name, cfg] of Object.entries(data.mcpServers)) {
77
- if (name !== entry.name && cfg?.args?.[0] === serverScript) {
78
- delete data.mcpServers[name];
79
- dirty = true;
80
- }
81
- }
82
- const existing = data.mcpServers[entry.name];
83
- const envMatch = existing && JSON.stringify(existing.env) === JSON.stringify(entry.env);
84
- if (!dirty && existing && existing.args?.[0] === serverScript && envMatch)
85
- return;
86
- data.mcpServers[entry.name] = {
87
- command: entry.command,
88
- args: entry.args,
89
- env: entry.env,
90
- };
91
- try {
92
- mkdirSync(dirname(configPath), { recursive: true });
93
- writeFileSync(configPath, JSON.stringify(data, null, 2) + '\n');
94
- }
95
- catch (err) {
96
- console.warn(`[claude-code] Failed to write MCP config: ${err.message}`);
47
+ pty.write('\x1b[200~' + content + '\x1b[201~');
48
+ await new Promise(r => setTimeout(r, submitDelay));
49
+ pty.write('\r');
97
50
  }
98
51
  },
99
52
  completionPattern: COMPLETION_RE,
100
53
  readyPattern: /❯/,
101
54
  systemHints: [],
102
55
  altScreen: false,
56
+ skillsDir: '~/.claude/skills',
103
57
  };
104
58
  }
105
59
  export const create = createClaudeCodeAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/adapters/cli/claude-code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/adapters/cli/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,aAAa,GAAG,+EAA+E,CAAC;AAEtG,MAAM,UAAU,uBAAuB,CAAC,YAAqB;IAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC;IACrD,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,GAAG;QAChB,iBAAiB,EAAE,IAAI;QAEvB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBAClC,sCAAsC;gBACtC,8CAA8C;gBAC9C,EAAE;gBACF,OAAO;gBACP,mDAAmD;gBACnD,qDAAqD;gBACrD,uDAAuD;gBACvD,sDAAsD;gBACtD,6CAA6C;gBAC7C,gCAAgC;aACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qBAAqB,EAAE,IAAI;QAE3B,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO;YAC3B,sEAAsE;YACtE,oEAAoE;YACpE,sEAAsE;YACtE,sEAAsE;YACtE,MAAM,YAAY,GAAG,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAE7C,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACzC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACvB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBACnD,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;gBAC/C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBACnD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,aAAa;QAChC,YAAY,EAAE,GAAG;QACjB,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"coco.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/coco.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA0EnE;AAED,eAAO,MAAM,MAAM,0BAAoB,CAAC"}
1
+ {"version":3,"file":"coco.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/coco.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAMxD,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA0CnE;AAED,eAAO,MAAM,MAAM,0BAAoB,CAAC"}
@@ -1,4 +1,3 @@
1
- import { execSync } from 'node:child_process';
2
1
  import { resolveCommand } from './registry.js';
3
2
  function delay(ms) {
4
3
  return new Promise(resolve => setTimeout(resolve, ms));
@@ -32,38 +31,6 @@ export function createCocoAdapter(pathOverride) {
32
31
  pty.write('\r');
33
32
  }
34
33
  },
35
- ensureMcpConfig(entry) {
36
- // Use `coco mcp add-json` CLI — coco stores config in ~/.trae/traecli.yaml
37
- // Clean up stale entries (e.g. old "claude-code-robot" → renamed to "botmux")
38
- for (const stale of ['claude-code-robot']) {
39
- if (stale !== entry.name) {
40
- try {
41
- execSync(`${bin} mcp remove ${stale}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
42
- }
43
- catch { /* not present — fine */ }
44
- }
45
- }
46
- // Remove existing entry first to ensure env is fully replaced (no stale LARK_APP_ID)
47
- try {
48
- execSync(`${bin} mcp remove ${entry.name}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
49
- }
50
- catch { /* not present — fine */ }
51
- const json = JSON.stringify({
52
- command: entry.command,
53
- args: entry.args,
54
- env: entry.env,
55
- });
56
- try {
57
- execSync(`${bin} mcp add-json ${entry.name} ${JSON.stringify(json)}`, {
58
- encoding: 'utf-8',
59
- timeout: 10_000,
60
- stdio: 'ignore',
61
- });
62
- }
63
- catch (err) {
64
- console.warn(`[coco] Failed to add MCP config: ${err.message}`);
65
- }
66
- },
67
34
  completionPattern: undefined,
68
35
  readyPattern: /⏵⏵/, // status bar indicator — present when CoCo's TUI is rendered
69
36
  systemHints: [
@@ -1 +1 @@
1
- {"version":3,"file":"coco.js","sourceRoot":"","sources":["../../../src/adapters/cli/coco.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coco.js","sourceRoot":"","sources":["../../../src/adapters/cli/coco.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAqB;IACrD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;IACnD,OAAO;QACL,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,GAAG;QAEhB,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,IAAI,EAAI,6DAA6D;QACnF,WAAW,EAAE;YACX,qGAAqG;YACrG,gCAAgC;YAChC,+CAA+C;YAC/C,wEAAwE;YAExE,sCAAsC;SACvC;QACD,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAyDpE;AAED,eAAO,MAAM,MAAM,2BAAqB,CAAC"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/codex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAMxD,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAgCpE;AAED,eAAO,MAAM,MAAM,2BAAqB,CAAC"}
@@ -1,4 +1,3 @@
1
- import { execSync } from 'node:child_process';
2
1
  import { resolveCommand } from './registry.js';
3
2
  function delay(ms) {
4
3
  return new Promise(resolve => setTimeout(resolve, ms));
@@ -28,32 +27,6 @@ export function createCodexAdapter(pathOverride) {
28
27
  pty.write('\r');
29
28
  }
30
29
  },
31
- ensureMcpConfig(entry) {
32
- // Clean up stale entries (e.g. old "claude-code-robot" → renamed to "botmux")
33
- for (const stale of ['claude-code-robot']) {
34
- if (stale !== entry.name) {
35
- try {
36
- execSync(`${bin} mcp remove ${stale}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
37
- }
38
- catch { /* not present — fine */ }
39
- }
40
- }
41
- // Remove first so re-registration picks up env changes (e.g. new SESSION_DATA_DIR)
42
- try {
43
- execSync(`${bin} mcp remove ${entry.name}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
44
- }
45
- catch { /* not registered yet — fine */ }
46
- const envArgs = Object.entries(entry.env)
47
- .map(([k, v]) => `--env ${k}=${v}`)
48
- .join(' ');
49
- const cmd = `${bin} mcp add ${entry.name} ${envArgs} -- ${entry.command} ${entry.args.join(' ')}`;
50
- try {
51
- execSync(cmd, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
52
- }
53
- catch (err) {
54
- console.warn(`[codex] Failed to add MCP config: ${err.message}`);
55
- }
56
- },
57
30
  completionPattern: undefined,
58
31
  readyPattern: /›|\d+% left/, // › for input box, or status bar pattern (e.g. "97% left")
59
32
  systemHints: [],
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/adapters/cli/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/adapters/cli/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,YAAqB;IACtD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC;IACpD,OAAO;QACL,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,GAAG;QAEhB,SAAS;YACP,sEAAsE;YACtE,uEAAuE;YACvE,OAAO;gBACL,4CAA4C;gBAC5C,iBAAiB;aAClB,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,aAAa,EAAG,2DAA2D;QACzF,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,KAAK,EAAI,4CAA4C;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC"}
@@ -1 +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,CAmErE;AAED,eAAO,MAAM,MAAM,4BAAsB,CAAC"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAMxD,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAyCrE;AAED,eAAO,MAAM,MAAM,4BAAsB,CAAC"}
@@ -1,4 +1,3 @@
1
- import { execSync } from 'node:child_process';
2
1
  import { resolveCommand } from './registry.js';
3
2
  function delay(ms) {
4
3
  return new Promise(resolve => setTimeout(resolve, ms));
@@ -35,38 +34,11 @@ export function createGeminiAdapter(pathOverride) {
35
34
  pty.write('\r');
36
35
  }
37
36
  },
38
- ensureMcpConfig(entry) {
39
- // Clean up stale entries (e.g. old "claude-code-robot" → renamed to "botmux")
40
- for (const stale of ['claude-code-robot']) {
41
- if (stale !== entry.name) {
42
- try {
43
- execSync(`${bin} mcp remove ${stale}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
44
- }
45
- catch { /* not present — fine */ }
46
- }
47
- }
48
- // Remove first so re-registration picks up env changes
49
- try {
50
- execSync(`${bin} mcp remove ${entry.name}`, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
51
- }
52
- catch { /* not registered yet — fine */ }
53
- // gemini mcp add <name> <command> [args...] -e K=V --trust --scope user
54
- const envArgs = Object.entries(entry.env)
55
- .map(([k, v]) => `-e ${k}=${v}`)
56
- .join(' ');
57
- const argsStr = entry.args.join(' ');
58
- const cmd = `${bin} mcp add ${entry.name} ${entry.command} ${argsStr} ${envArgs} --trust --scope user`;
59
- try {
60
- execSync(cmd, { encoding: 'utf-8', timeout: 10_000, stdio: 'ignore' });
61
- }
62
- catch (err) {
63
- console.warn(`[gemini] Failed to add MCP config: ${err.message}`);
64
- }
65
- },
66
37
  completionPattern: undefined, // quiescence only — no explicit completion marker
67
38
  readyPattern: undefined, // Ink TUI — '>' is too generic; rely on quiescence + spinner guard
68
39
  systemHints: [],
69
40
  altScreen: true, // Ink renders in alternate screen buffer by default
41
+ skillsDir: '~/.gemini/skills',
70
42
  };
71
43
  }
72
44
  export const create = createGeminiAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/adapters/cli/gemini.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/adapters/cli/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,YAAqB;IACvD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC;IACrD,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,WAAW,EAAE,GAAG;QAEhB,SAAS,CAAC,EAAE,aAAa,EAAE;YACzB,qEAAqE;YACrE,sEAAsE;YACtE,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,wEAAwE;YACxE,sEAAsE;YACtE,yEAAyE;YACzE,wEAAwE;YACxE,4CAA4C;YAC5C,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0BAA0B,EAAE,IAAI;QAEhC,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,SAAS,EAAI,kDAAkD;QAClF,YAAY,EAAE,SAAS,EAAS,mEAAmE;QACnG,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,IAAI,EAAiB,oDAAoD;QACpF,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/opencode.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAMxE,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAgFvE;AAED,eAAO,MAAM,MAAM,8BAAwB,CAAC"}
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/opencode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAMxD,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAyCvE;AAED,eAAO,MAAM,MAAM,8BAAwB,CAAC"}