botmux 2.2.7 → 2.3.1
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 +63 -13
- package/README.md +52 -14
- package/dist/adapters/backend/tmux-backend.d.ts +8 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +18 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/cli/aiden.d.ts.map +1 -1
- package/dist/adapters/cli/aiden.js +0 -40
- package/dist/adapters/cli/aiden.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +21 -67
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +0 -33
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +0 -27
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +1 -29
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +1 -44
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +11 -8
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/cli.js +737 -16
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +8 -4
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/scheduler.d.ts +38 -16
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +335 -149
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-manager.d.ts +6 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +105 -16
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +26 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +15 -3
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +233 -31
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +49 -10
- package/dist/daemon.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +29 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +241 -55
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +1 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +195 -40
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/services/schedule-store.d.ts +20 -3
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +140 -16
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/skills/definitions.d.ts +17 -0
- package/dist/skills/definitions.d.ts.map +1 -0
- package/dist/skills/definitions.js +254 -0
- package/dist/skills/definitions.js.map +1 -0
- package/dist/skills/installer.d.ts +9 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +42 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/types.d.ts +84 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -5
- package/dist/types.js.map +1 -1
- package/dist/utils/lark-upload.d.ts +2 -0
- package/dist/utils/lark-upload.d.ts.map +1 -0
- package/dist/utils/lark-upload.js +27 -0
- package/dist/utils/lark-upload.js.map +1 -0
- package/dist/utils/screen-analyzer.d.ts +67 -0
- package/dist/utils/screen-analyzer.d.ts.map +1 -0
- package/dist/utils/screen-analyzer.js +279 -0
- package/dist/utils/screen-analyzer.js.map +1 -0
- package/dist/utils/screenshot-renderer.d.ts +11 -0
- package/dist/utils/screenshot-renderer.d.ts.map +1 -0
- package/dist/utils/screenshot-renderer.js +225 -0
- package/dist/utils/screenshot-renderer.js.map +1 -0
- package/dist/utils/terminal-renderer.d.ts +30 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +25 -0
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/worker.js +372 -14
- package/dist/worker.js.map +1 -1
- package/package.json +2 -5
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -16
- package/dist/index.js.map +0 -1
- package/dist/server.d.ts +0 -3
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -133
- package/dist/server.js.map +0 -1
- package/dist/tools/get-thread-messages.d.ts +0 -26
- package/dist/tools/get-thread-messages.d.ts.map +0 -1
- package/dist/tools/get-thread-messages.js +0 -38
- package/dist/tools/get-thread-messages.js.map +0 -1
- package/dist/tools/index.d.ts +0 -9
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -10
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/list-bots.d.ts +0 -40
- package/dist/tools/list-bots.d.ts.map +0 -1
- package/dist/tools/list-bots.js +0 -77
- package/dist/tools/list-bots.js.map +0 -1
- package/dist/tools/send-to-thread.d.ts +0 -46
- package/dist/tools/send-to-thread.d.ts.map +0 -1
- package/dist/tools/send-to-thread.js +0 -275
- 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
|
|
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
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
###
|
|
239
|
+
### Lark integration (Skill + CLI)
|
|
237
240
|
|
|
238
|
-
|
|
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
|
-
-
|
|
241
|
-
-
|
|
242
|
-
-
|
|
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
|
|
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`
|
|
127
|
+
- **一键接管** — 点击流式卡片上的「🔄 接管」按钮,Botmux 以 `--resume` 重建会话,转为标准 Botmux 会话
|
|
128
128
|
- **安全断开** — 点击「⏏ 断开」,Botmux 退出观察,原 CLI 不受影响
|
|
129
129
|
|
|
130
130
|
### 定时任务
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
支持三种调度类型 + 中文自然语言,支持原话题延续(到点在同一话题内继续,不另开 thread)。
|
|
133
133
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
/schedule 每周一10:00 生成周报
|
|
138
|
-
```
|
|
134
|
+
**两种创建方式**:
|
|
135
|
+
- **斜杠命令**(快捷):`/schedule 每日17:50 帮我看看AI圈有什么新闻`
|
|
136
|
+
- **对话触发**(灵活):直接跟 agent 说「帮我加个每天 18:00 检查部署的定时任务」,自动触发 `botmux-schedule` Skill
|
|
139
137
|
|
|
140
|
-
|
|
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
|
-
|
|
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 通过
|
|
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
|
## 配置
|
|
@@ -40,6 +40,14 @@ export declare class TmuxBackend implements SessionBackend {
|
|
|
40
40
|
sendText(text: string): void;
|
|
41
41
|
/** Send special keys (Enter, Escape, C-c, etc.) to the tmux pane. */
|
|
42
42
|
sendSpecialKeys(...keys: string[]): void;
|
|
43
|
+
/**
|
|
44
|
+
* Enter copy-mode on the pane (`-e` makes it auto-exit when scrolled back to
|
|
45
|
+
* the bottom). Lets us use tmux's own scrollback even when the running app
|
|
46
|
+
* is in the alternate screen buffer (Claude Code, vim, etc.).
|
|
47
|
+
*/
|
|
48
|
+
enterCopyMode(): void;
|
|
49
|
+
/** Send a copy-mode X-command (e.g. 'halfpage-up', 'halfpage-down', 'cancel'). */
|
|
50
|
+
sendCopyModeCommand(xCommand: string): void;
|
|
43
51
|
/**
|
|
44
52
|
* Paste text into the tmux pane via load-buffer + paste-buffer.
|
|
45
53
|
* Tmux automatically wraps in bracketed paste if the pane has it enabled.
|
|
@@ -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,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAOjE,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;IAiEzD,wEAAwE;IACxE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5B,qEAAqE;IACrE,eAAe,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAOxC;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY7B,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,WAAW,IAAI,MAAM,GAAG,IAAI;IAa5B,wEAAwE;IACxE,IAAI,IAAI,IAAI;IAqBZ,oEAAoE;IACpE,cAAc,IAAI,IAAI;IAOtB;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAoB3D,kFAAkF;IAClF,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,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,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE;IAOjE,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;IAiEzD,wEAAwE;IACxE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5B,qEAAqE;IACrE,eAAe,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAOxC;;;;OAIG;IACH,aAAa,IAAI,IAAI;IAOrB,kFAAkF;IAClF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO3C;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY7B,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,WAAW,IAAI,MAAM,GAAG,IAAI;IAa5B,wEAAwE;IACxE,IAAI,IAAI,IAAI;IAqBZ,oEAAoE;IACpE,cAAc,IAAI,IAAI;IAOtB;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAoB3D,kFAAkF;IAClF,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,aAAa;;;;CAGd"}
|
|
@@ -153,6 +153,24 @@ export class TmuxBackend {
|
|
|
153
153
|
timeout: 5000,
|
|
154
154
|
});
|
|
155
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Enter copy-mode on the pane (`-e` makes it auto-exit when scrolled back to
|
|
158
|
+
* the bottom). Lets us use tmux's own scrollback even when the running app
|
|
159
|
+
* is in the alternate screen buffer (Claude Code, vim, etc.).
|
|
160
|
+
*/
|
|
161
|
+
enterCopyMode() {
|
|
162
|
+
execFileSync('tmux', ['copy-mode', '-e', '-t', this.sessionName], {
|
|
163
|
+
stdio: 'ignore',
|
|
164
|
+
timeout: 5000,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/** Send a copy-mode X-command (e.g. 'halfpage-up', 'halfpage-down', 'cancel'). */
|
|
168
|
+
sendCopyModeCommand(xCommand) {
|
|
169
|
+
execFileSync('tmux', ['send-keys', '-t', this.sessionName, '-X', xCommand], {
|
|
170
|
+
stdio: 'ignore',
|
|
171
|
+
timeout: 5000,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
156
174
|
/**
|
|
157
175
|
* Paste text into the tmux pane via load-buffer + paste-buffer.
|
|
158
176
|
* Tmux automatically wraps in bracketed paste if the pane has it enabled.
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiden.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/aiden.ts"],"names":[],"mappings":"
|
|
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,
|
|
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":"
|
|
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
|
-
'想让用户看到的内容必须通过
|
|
21
|
+
'想让用户看到的内容必须通过 `botmux send` 命令发送,终端输出不会到达聊天。',
|
|
24
22
|
'',
|
|
25
23
|
'使用指南:',
|
|
26
|
-
'- 用
|
|
27
|
-
'-
|
|
28
|
-
'-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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":"AAAA,OAAO,EAAE,
|
|
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":"
|
|
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":"AAAA,OAAO,EAAE,
|
|
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":"
|
|
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"}
|