botmux 2.98.4-canary.2 → 2.100.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 +2 -2
- package/README.md +2 -2
- package/dist/adapters/cli/genius.d.ts +4 -0
- package/dist/adapters/cli/genius.d.ts.map +1 -0
- package/dist/adapters/cli/genius.js +216 -0
- package/dist/adapters/cli/genius.js.map +1 -0
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +241 -13
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +3 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +8 -6
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +11 -4
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/core/dashboard-rows.d.ts +1 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +2 -1
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/dashboard/session-card-model.d.ts +2 -2
- package/dist/dashboard/session-card-model.d.ts.map +1 -1
- package/dist/dashboard/session-card-model.js +5 -2
- package/dist/dashboard/session-card-model.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +28 -63
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +3 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -0
- package/dist/dashboard/web/bot-defaults-page.js +23 -0
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts +2 -1
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +30 -30
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts +14 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -0
- package/dist/dashboard/web/connectors-page.js +303 -0
- package/dist/dashboard/web/connectors-page.js.map +1 -0
- package/dist/dashboard/web/connectors.d.ts +1 -12
- package/dist/dashboard/web/connectors.d.ts.map +1 -1
- package/dist/dashboard/web/connectors.js +1 -325
- package/dist/dashboard/web/connectors.js.map +1 -1
- package/dist/dashboard/web/dashboard-routes.d.ts +14 -0
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -0
- package/dist/dashboard/web/dashboard-routes.js +176 -0
- package/dist/dashboard/web/dashboard-routes.js.map +1 -0
- package/dist/dashboard/web/groups-page.d.ts +3 -0
- package/dist/dashboard/web/groups-page.d.ts.map +1 -0
- package/dist/dashboard/web/groups-page.js +26 -0
- package/dist/dashboard/web/groups-page.js.map +1 -0
- package/dist/dashboard/web/groups.d.ts +1 -1
- package/dist/dashboard/web/groups.d.ts.map +1 -1
- package/dist/dashboard/web/groups.js +113 -52
- package/dist/dashboard/web/groups.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +18 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights-page.d.ts +3 -0
- package/dist/dashboard/web/insights-page.d.ts.map +1 -0
- package/dist/dashboard/web/insights-page.js +26 -0
- package/dist/dashboard/web/insights-page.js.map +1 -0
- package/dist/dashboard/web/insights.d.ts +18 -1
- package/dist/dashboard/web/insights.d.ts.map +1 -1
- package/dist/dashboard/web/insights.js +25 -61
- package/dist/dashboard/web/insights.js.map +1 -1
- package/dist/dashboard/web/office-page.d.ts +3 -0
- package/dist/dashboard/web/office-page.d.ts.map +1 -0
- package/dist/dashboard/web/office-page.js +149 -0
- package/dist/dashboard/web/office-page.js.map +1 -0
- package/dist/dashboard/web/office.d.ts +1 -1
- package/dist/dashboard/web/office.d.ts.map +1 -1
- package/dist/dashboard/web/office.js +1 -139
- package/dist/dashboard/web/office.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts +3 -0
- package/dist/dashboard/web/overview-page.d.ts.map +1 -0
- package/dist/dashboard/web/overview-page.js +149 -0
- package/dist/dashboard/web/overview-page.js.map +1 -0
- package/dist/dashboard/web/overview.d.ts +2 -2
- package/dist/dashboard/web/overview.d.ts.map +1 -1
- package/dist/dashboard/web/overview.js +14 -3
- package/dist/dashboard/web/overview.js.map +1 -1
- package/dist/dashboard/web/react-hooks.d.ts +8 -0
- package/dist/dashboard/web/react-hooks.d.ts.map +1 -0
- package/dist/dashboard/web/react-hooks.js +43 -0
- package/dist/dashboard/web/react-hooks.js.map +1 -0
- package/dist/dashboard/web/react-mount.d.ts +4 -0
- package/dist/dashboard/web/react-mount.d.ts.map +1 -0
- package/dist/dashboard/web/react-mount.js +7 -0
- package/dist/dashboard/web/react-mount.js.map +1 -0
- package/dist/dashboard/web/roles-page.d.ts +4 -0
- package/dist/dashboard/web/roles-page.d.ts.map +1 -0
- package/dist/dashboard/web/roles-page.js +26 -0
- package/dist/dashboard/web/roles-page.js.map +1 -0
- package/dist/dashboard/web/roles.d.ts +1 -2
- package/dist/dashboard/web/roles.d.ts.map +1 -1
- package/dist/dashboard/web/roles.js +189 -135
- package/dist/dashboard/web/roles.js.map +1 -1
- package/dist/dashboard/web/route-lifecycle.d.ts +14 -0
- package/dist/dashboard/web/route-lifecycle.d.ts.map +1 -0
- package/dist/dashboard/web/route-lifecycle.js +29 -0
- package/dist/dashboard/web/route-lifecycle.js.map +1 -0
- package/dist/dashboard/web/schedules-page.d.ts +14 -0
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -0
- package/dist/dashboard/web/schedules-page.js +84 -0
- package/dist/dashboard/web/schedules-page.js.map +1 -0
- package/dist/dashboard/web/schedules.d.ts +1 -1
- package/dist/dashboard/web/schedules.d.ts.map +1 -1
- package/dist/dashboard/web/schedules.js +1 -115
- package/dist/dashboard/web/schedules.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts +3 -0
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -0
- package/dist/dashboard/web/sessions-page.js +28 -0
- package/dist/dashboard/web/sessions-page.js.map +1 -0
- package/dist/dashboard/web/sessions.d.ts +4 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +43 -10
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +3 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -0
- package/dist/dashboard/web/settings-page.js +387 -0
- package/dist/dashboard/web/settings-page.js.map +1 -0
- package/dist/dashboard/web/settings.d.ts +1 -1
- package/dist/dashboard/web/settings.d.ts.map +1 -1
- package/dist/dashboard/web/settings.js +1 -534
- package/dist/dashboard/web/settings.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts +33 -0
- package/dist/dashboard/web/skills-page.d.ts.map +1 -0
- package/dist/dashboard/web/skills-page.js +515 -0
- package/dist/dashboard/web/skills-page.js.map +1 -0
- package/dist/dashboard/web/skills.d.ts +1 -1
- package/dist/dashboard/web/skills.d.ts.map +1 -1
- package/dist/dashboard/web/skills.js +1 -711
- package/dist/dashboard/web/skills.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +9 -0
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +19 -2
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard/web/team-federation-page.d.ts +4 -0
- package/dist/dashboard/web/team-federation-page.d.ts.map +1 -0
- package/dist/dashboard/web/team-federation-page.js +47 -0
- package/dist/dashboard/web/team-federation-page.js.map +1 -0
- package/dist/dashboard/web/team-federation.d.ts +2 -2
- package/dist/dashboard/web/team-federation.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation.js +104 -97
- package/dist/dashboard/web/team-federation.js.map +1 -1
- package/dist/dashboard/web/v3-page.d.ts +3 -0
- package/dist/dashboard/web/v3-page.d.ts.map +1 -0
- package/dist/dashboard/web/v3-page.js +27 -0
- package/dist/dashboard/web/v3-page.js.map +1 -0
- package/dist/dashboard/web/v3.d.ts +2 -1
- package/dist/dashboard/web/v3.d.ts.map +1 -1
- package/dist/dashboard/web/v3.js +18 -43
- package/dist/dashboard/web/v3.js.map +1 -1
- package/dist/dashboard/web/whiteboards-page.d.ts +3 -0
- package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -0
- package/dist/dashboard/web/whiteboards-page.js +203 -0
- package/dist/dashboard/web/whiteboards-page.js.map +1 -0
- package/dist/dashboard/web/whiteboards.d.ts +1 -1
- package/dist/dashboard/web/whiteboards.d.ts.map +1 -1
- package/dist/dashboard/web/whiteboards.js +1 -275
- package/dist/dashboard/web/whiteboards.js.map +1 -1
- package/dist/dashboard-web/app.js +36 -2550
- package/dist/dashboard-web/chunks/bot-defaults-page-3EV7K6LJ.js +358 -0
- package/dist/dashboard-web/chunks/chunk-5E3MJJL4.js +1 -0
- package/dist/dashboard-web/chunks/chunk-76J7PNZI.js +1 -0
- package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +1 -0
- package/dist/dashboard-web/chunks/chunk-JTSE5VP6.js +54 -0
- package/dist/dashboard-web/chunks/chunk-JXLHRRJD.js +31 -0
- package/dist/dashboard-web/chunks/chunk-NASYW5FD.js +1 -0
- package/dist/dashboard-web/chunks/connectors-XPZKEHF6.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-C54PVKYP.js +207 -0
- package/dist/dashboard-web/chunks/insights-page-BBQYR7WY.js +309 -0
- package/dist/dashboard-web/chunks/office-page-6DXYOG55.js +1 -0
- package/dist/dashboard-web/chunks/overview-page-5PJCAMID.js +1 -0
- package/dist/dashboard-web/chunks/roles-page-APUDLPVM.js +98 -0
- package/dist/dashboard-web/chunks/schedules-WG2UKHSO.js +1 -0
- package/dist/dashboard-web/chunks/sessions-page-F3U5NFPD.js +238 -0
- package/dist/dashboard-web/chunks/settings-page-OSBZNCXL.js +2 -0
- package/dist/dashboard-web/chunks/skills-page-Y3VUAOYG.js +2 -0
- package/dist/dashboard-web/chunks/team-federation-page-CRH3WZPH.js +10 -0
- package/dist/dashboard-web/chunks/v3-page-FVPUL665.js +149 -0
- package/dist/dashboard-web/chunks/whiteboards-page-HLCTYSSV.js +1 -0
- package/dist/dashboard-web/chunks/workflows-UB7OPYGI.js +184 -0
- package/dist/dashboard-web/index.html +1 -1
- package/dist/dashboard-web/style.css +82 -1
- package/dist/dashboard.js +5 -6
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +2 -2
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +3 -2
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +18 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/sessions-card.d.ts.map +1 -1
- package/dist/im/lark/sessions-card.js +4 -1
- package/dist/im/lark/sessions-card.js.map +1 -1
- package/dist/services/opencode-paths.d.ts +7 -0
- package/dist/services/opencode-paths.d.ts.map +1 -0
- package/dist/services/opencode-paths.js +18 -0
- package/dist/services/opencode-paths.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +16 -14
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/worker.js +11 -3
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +4 -1
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/package.json +8 -2
package/README.en.md
CHANGED
|
@@ -64,7 +64,7 @@ Compared to OpenClaw-style approaches built on Agent SDKs:
|
|
|
64
64
|
## Prerequisites
|
|
65
65
|
|
|
66
66
|
- **Node.js** >= 22
|
|
67
|
-
- **AI coding CLI / local agent app** installed and authenticated (`claude`, `codex`, `coco`, `cursor-agent`, `gemini`, `opencode`, `hermes`, `seed` (Seed CLI, a Claude Code fork), `relay` (Relay CLI, the new release of Seed), `pi`, `omp` (oh-my-pi, a Pi fork), `copilot` (GitHub Copilot CLI), `traex` (TRAE CLI), `mircli` (Mir CLI), `agy` (Antigravity), or `kimi` (Kimi Code) in PATH)
|
|
67
|
+
- **AI coding CLI / local agent app** installed and authenticated (`claude`, `codex`, `coco`, `cursor-agent`, `gemini`, `genius`, `opencode`, `hermes`, `seed` (Seed CLI, a Claude Code fork), `relay` (Relay CLI, the new release of Seed), `pi`, `omp` (oh-my-pi, a Pi fork), `copilot` (GitHub Copilot CLI), `traex` (TRAE CLI), `mircli` (Mir CLI), `agy` (Antigravity), or `kimi` (Kimi Code) in PATH)
|
|
68
68
|
- **CoCo requires `0.120.32+`**: type-ahead (sending a new message while a turn is still running, parked in CoCo's own message queue) relies on 0.120.32+ behavior; earlier versions may drop or serialize input while busy — upgrade before use
|
|
69
69
|
- **tmux** >= 3.x (optional — auto-enabled when installed for persistent CLI sessions)
|
|
70
70
|
- **CJK fonts** (only needed for screenshot rendering of Chinese text / emoji):
|
|
@@ -262,7 +262,7 @@ Seamlessly connect Botmux to CLI processes already running in tmux — monitor a
|
|
|
262
262
|
/adopt 0:2.0 # Directly adopt a tmux pane (or pass a past session id to resume-import it)
|
|
263
263
|
```
|
|
264
264
|
|
|
265
|
-
- **Import past sessions** — The card's second filter lists this host's past sessions for the CLI (claude-code / seed / codex / traex / antigravity); pick one to rebuild it as a standard Botmux session via `--resume` in its original working dir — no live process required, no need to move it into tmux first
|
|
265
|
+
- **Import past sessions** — The card's second filter lists this host's past sessions for the CLI (claude-code / seed / codex / traex / antigravity / genius); pick one to rebuild it as a standard Botmux session via `--resume` in its original working dir — no live process required, no need to move it into tmux first
|
|
266
266
|
- **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
|
|
267
267
|
- **One-click takeover** — Click the "Takeover" button on the streaming card to rebuild the session with `--resume` and convert to a standard Botmux session
|
|
268
268
|
- **Safe disconnect** — Click "Disconnect" to detach Botmux without affecting the original CLI
|
package/README.md
CHANGED
|
@@ -153,7 +153,7 @@ BACKEND_TYPE=pty botmux start
|
|
|
153
153
|
/adopt 0:2.0 # 直接接入指定 tmux pane(或传历史会话 id 直接 resume 导入)
|
|
154
154
|
```
|
|
155
155
|
|
|
156
|
-
- **历史会话导入** — 卡片第二栏列出本机该 CLI 的历史会话(claude-code / seed / codex / traex / antigravity),选中即以 `--resume` 在原工作目录重建为标准 Botmux 会话,无需进程仍在运行、也不用先迁进 tmux
|
|
156
|
+
- **历史会话导入** — 卡片第二栏列出本机该 CLI 的历史会话(claude-code / seed / codex / traex / antigravity / genius),选中即以 `--resume` 在原工作目录重建为标准 Botmux 会话,无需进程仍在运行、也不用先迁进 tmux
|
|
157
157
|
- **共享模式** — Botmux 接入后,iTerm2 和飞书双向同步:流式卡片实时显示终端输出,飞书聊天框输入直接透传到终端
|
|
158
158
|
- **一键接管** — 点击流式卡片上的「🔄 接管」按钮,Botmux 以 `--resume` 重建会话,转为标准 Botmux 会话
|
|
159
159
|
- **安全断开** — 点击「⏏ 断开」,Botmux 退出观察,原 CLI 不受影响
|
|
@@ -205,7 +205,7 @@ CLI 进入 botmux 会话时自动获得 `~/.botmux/bin` 在 PATH 中,以及一
|
|
|
205
205
|
## 前置要求
|
|
206
206
|
|
|
207
207
|
- **Node.js** >= 22
|
|
208
|
-
- **AI 编程 CLI / 本地 Agent 应用** 已安装并完成认证(`claude`、`codex`、`coco`、`cursor-agent`、`gemini`、`opencode`、`hermes`、`seed`(Seed CLI,Claude Code 衍生)、`relay`(Relay CLI,Seed 新版)、`pi`、`omp`(oh-my-pi,Pi 衍生)、`copilot`(GitHub Copilot CLI)、`traex`(TRAE CLI)、`mircli`(Mir CLI)、`agy`(Antigravity)或 `kimi`(Kimi Code)在 PATH 中)
|
|
208
|
+
- **AI 编程 CLI / 本地 Agent 应用** 已安装并完成认证(`claude`、`codex`、`coco`、`cursor-agent`、`gemini`、`genius`、`opencode`、`hermes`、`seed`(Seed CLI,Claude Code 衍生)、`relay`(Relay CLI,Seed 新版)、`pi`、`omp`(oh-my-pi,Pi 衍生)、`copilot`(GitHub Copilot CLI)、`traex`(TRAE CLI)、`mircli`(Mir CLI)、`agy`(Antigravity)或 `kimi`(Kimi Code)在 PATH 中)
|
|
209
209
|
- **CoCo 最低版本 `0.120.32`**:type-ahead(会话忙时即可发新消息,由 CoCo 自己的消息队列接住)依赖 0.120.32+ 的行为;更早版本忙时输入可能丢失或串行,请升级后再用
|
|
210
210
|
- **tmux** >= 3.x(可选,安装后自动启用会话常驻)
|
|
211
211
|
- **CJK 字体**(用于截图渲染中文/emoji):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genius.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/genius.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAwExD,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA6GrE;AAED,eAAO,MAAM,MAAM,4BAAsB,CAAC"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { existsSync, statSync, openSync, readSync, closeSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { basename, join } from 'node:path';
|
|
4
|
+
import { resolveCommand } from './registry.js';
|
|
5
|
+
import { buildBotmuxSystemPromptText } from './shared-hints.js';
|
|
6
|
+
import { discoverClaudeFamilySessions } from '../../services/resumable-session-discovery.js';
|
|
7
|
+
import { delay, scaleMs } from '../../utils/timing.js';
|
|
8
|
+
const GENIUS_DATA_DIR = join(homedir(), '.genius');
|
|
9
|
+
const GENIUS_SKILLS_DIR = join(GENIUS_DATA_DIR, 'skills');
|
|
10
|
+
const GENIUS_AUTH_PATHS = ['~/.genius/.credentials.json', '~/.genius/auth.json'];
|
|
11
|
+
const GENIUS_BOTMUX_SEND_TOOL = 'Bash(botmux send:*)';
|
|
12
|
+
function realpathCwd(cwd) {
|
|
13
|
+
try {
|
|
14
|
+
return realpathSync(cwd);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return cwd;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function geniusProjectDir(cwd) {
|
|
21
|
+
return join(GENIUS_DATA_DIR, 'projects', realpathCwd(cwd).replace(/[^A-Za-z0-9-]/g, '-'));
|
|
22
|
+
}
|
|
23
|
+
function geniusJsonlPathForSession(sessionId, cwd) {
|
|
24
|
+
return join(geniusProjectDir(cwd), `${sessionId}.jsonl`);
|
|
25
|
+
}
|
|
26
|
+
function currentFileSize(path) {
|
|
27
|
+
if (!existsSync(path))
|
|
28
|
+
return 0;
|
|
29
|
+
try {
|
|
30
|
+
return statSync(path).size;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function deltaHasUserEvent(path, fromByte, expectedText) {
|
|
37
|
+
if (!existsSync(path))
|
|
38
|
+
return false;
|
|
39
|
+
let size;
|
|
40
|
+
try {
|
|
41
|
+
size = statSync(path).size;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (size <= fromByte)
|
|
47
|
+
return false;
|
|
48
|
+
const len = size - fromByte;
|
|
49
|
+
const buf = Buffer.alloc(len);
|
|
50
|
+
const fd = openSync(path, 'r');
|
|
51
|
+
try {
|
|
52
|
+
readSync(fd, buf, 0, len, fromByte);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
closeSync(fd);
|
|
56
|
+
}
|
|
57
|
+
const delta = buf.toString('utf8');
|
|
58
|
+
const lines = delta.endsWith('\n') ? delta.split('\n') : delta.split('\n').slice(0, -1);
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
if (!line.trim())
|
|
61
|
+
continue;
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(line);
|
|
64
|
+
if (parsed?.type === 'user'
|
|
65
|
+
&& typeof parsed?.message?.content === 'string'
|
|
66
|
+
&& parsed.message.content === expectedText) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (parsed?.type === 'queue-operation'
|
|
70
|
+
&& parsed?.operation === 'enqueue'
|
|
71
|
+
&& typeof parsed?.content === 'string'
|
|
72
|
+
&& parsed.content === expectedText) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Ignore partial / malformed trailing lines; a later poll sees the completed record.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
async function waitForUserEvent(path, fromByte, expectedText, timeoutMs) {
|
|
83
|
+
const deadline = Date.now() + scaleMs(timeoutMs);
|
|
84
|
+
while (Date.now() < deadline) {
|
|
85
|
+
if (deltaHasUserEvent(path, fromByte, expectedText))
|
|
86
|
+
return true;
|
|
87
|
+
await delay(100);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
export function createGeniusAdapter(pathOverride) {
|
|
92
|
+
const rawBin = pathOverride ?? 'genius';
|
|
93
|
+
let cachedBin;
|
|
94
|
+
return {
|
|
95
|
+
id: 'genius',
|
|
96
|
+
authPaths: GENIUS_AUTH_PATHS,
|
|
97
|
+
get resolvedBin() { return (cachedBin ??= resolveCommand(rawBin)); },
|
|
98
|
+
supportsTypeAhead: true,
|
|
99
|
+
claudeDataDir: GENIUS_DATA_DIR,
|
|
100
|
+
claudeStateJsonPath: join(GENIUS_DATA_DIR, '.claude.json'),
|
|
101
|
+
checkResumeTargetExists({ sessionId, cliSessionId, workingDir }) {
|
|
102
|
+
if (!workingDir)
|
|
103
|
+
return undefined;
|
|
104
|
+
const sid = cliSessionId ?? sessionId;
|
|
105
|
+
if (!sid)
|
|
106
|
+
return undefined;
|
|
107
|
+
try {
|
|
108
|
+
const p = geniusJsonlPathForSession(sid, workingDir);
|
|
109
|
+
if (existsSync(p))
|
|
110
|
+
return true;
|
|
111
|
+
if (!existsSync(geniusProjectDir(workingDir)))
|
|
112
|
+
return false;
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
buildArgs({ sessionId, resume, resumeSessionId, botName, botOpenId, locale, model, disableCliBypass, workingDir, skillPluginDir }) {
|
|
120
|
+
const args = [];
|
|
121
|
+
if (workingDir)
|
|
122
|
+
args.push('--add-dir', workingDir);
|
|
123
|
+
if (resume) {
|
|
124
|
+
args.push('--resume', resumeSessionId ?? sessionId);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
args.push('--session-id', sessionId);
|
|
128
|
+
}
|
|
129
|
+
if (model && model.trim())
|
|
130
|
+
args.push('--model', model.trim());
|
|
131
|
+
if (!disableCliBypass) {
|
|
132
|
+
// Genius is Claude-family: use the same approval-bypass posture as
|
|
133
|
+
// Claude Code so routine `botmux send` replies do not block on terminal
|
|
134
|
+
// confirmation, including shell-risk prompts such as backticks inside
|
|
135
|
+
// the message text.
|
|
136
|
+
args.push('--dangerously-skip-permissions');
|
|
137
|
+
args.push('--settings', JSON.stringify({
|
|
138
|
+
skipDangerousModePermissionPrompt: true,
|
|
139
|
+
permissions: { defaultMode: 'bypassPermissions' },
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Hardened mode keeps normal approvals but still pre-authorizes the one
|
|
144
|
+
// bridge command the model needs to reply into Feishu.
|
|
145
|
+
args.push('--permission-mode', 'default');
|
|
146
|
+
args.push('--allowedTools', GENIUS_BOTMUX_SEND_TOOL);
|
|
147
|
+
}
|
|
148
|
+
args.push('--append-system-prompt', buildBotmuxSystemPromptText({ locale, botName, botOpenId }));
|
|
149
|
+
if (skillPluginDir)
|
|
150
|
+
args.push('--plugin-dir', skillPluginDir);
|
|
151
|
+
return args;
|
|
152
|
+
},
|
|
153
|
+
buildResumeCommand({ sessionId, cliSessionId }) {
|
|
154
|
+
return `genius --resume ${cliSessionId ?? sessionId}`;
|
|
155
|
+
},
|
|
156
|
+
listResumableSessions({ limit, exclude }) {
|
|
157
|
+
return discoverClaudeFamilySessions(GENIUS_DATA_DIR, limit, exclude);
|
|
158
|
+
},
|
|
159
|
+
async writeInput(pty, content) {
|
|
160
|
+
const cwd = pty.cliCwd;
|
|
161
|
+
const sessionId = pty.claudeJsonlPath
|
|
162
|
+
? basename(pty.claudeJsonlPath, '.jsonl')
|
|
163
|
+
: undefined;
|
|
164
|
+
const transcriptPath = cwd && sessionId
|
|
165
|
+
? geniusJsonlPathForSession(sessionId, cwd)
|
|
166
|
+
: undefined;
|
|
167
|
+
const baseByte = transcriptPath ? currentFileSize(transcriptPath) : 0;
|
|
168
|
+
try {
|
|
169
|
+
if (pty.sendText)
|
|
170
|
+
pty.sendText(content);
|
|
171
|
+
else
|
|
172
|
+
pty.write(content);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return { submitted: false };
|
|
176
|
+
}
|
|
177
|
+
await delay(200);
|
|
178
|
+
try {
|
|
179
|
+
if (pty.sendSpecialKeys)
|
|
180
|
+
pty.sendSpecialKeys('Enter');
|
|
181
|
+
else
|
|
182
|
+
pty.write('\r');
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return { submitted: false };
|
|
186
|
+
}
|
|
187
|
+
if (!transcriptPath)
|
|
188
|
+
return;
|
|
189
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
190
|
+
if (await waitForUserEvent(transcriptPath, baseByte, content, 800))
|
|
191
|
+
return;
|
|
192
|
+
try {
|
|
193
|
+
if (pty.sendSpecialKeys)
|
|
194
|
+
pty.sendSpecialKeys('Enter');
|
|
195
|
+
else
|
|
196
|
+
pty.write('\r');
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return { submitted: false };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const recheck = () => deltaHasUserEvent(transcriptPath, baseByte, content);
|
|
203
|
+
return { submitted: false, recheck };
|
|
204
|
+
},
|
|
205
|
+
completionPattern: undefined,
|
|
206
|
+
busyPattern: /Working…|esc to interrupt/i,
|
|
207
|
+
readyPattern: /⏵⏵\s+accept edits on|(?:^|[\n\r])[❯›]\s*/,
|
|
208
|
+
systemHints: [],
|
|
209
|
+
injectsSessionContext: true,
|
|
210
|
+
altScreen: true,
|
|
211
|
+
skillsDir: `~/${GENIUS_SKILLS_DIR.slice(homedir().length + 1)}`,
|
|
212
|
+
modelChoices: ['gpt-5.5'],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export const create = createGeniusAdapter;
|
|
216
|
+
//# sourceMappingURL=genius.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genius.js","sourceRoot":"","sources":["../../../src/adapters/cli/genius.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/opencode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/opencode.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA+B,MAAM,YAAY,CAAC;AA+I1E,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAsKvE;AAED,eAAO,MAAM,MAAM,8BAAwB,CAAC"}
|
|
@@ -1,6 +1,131 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
1
3
|
import { resolveCommand } from './registry.js';
|
|
2
4
|
import { BOTMUX_SHELL_HINTS } from './shared-hints.js';
|
|
5
|
+
import { opencodeDbPath } from '../../services/opencode-paths.js';
|
|
3
6
|
import { delay } from '../../utils/timing.js';
|
|
7
|
+
/**
|
|
8
|
+
* OpenCode 会话存储:1.17+ 是一个全局 SQLite 库(opencode.db),session 表一行一个
|
|
9
|
+
* 会话(id 形如 `ses_…`,带 directory/title/时间戳),message/part 表存对话内容。
|
|
10
|
+
* TUI 用 `-s/--session <id>` 精确续接既有会话(实测 1.17.11:同目录重启后历史完整
|
|
11
|
+
* 加载、新消息落在同一 session 行;不存在的 id 会立即 exit 1 "Session not found",
|
|
12
|
+
* 所以 checkResumeTargetExists 必须先探测,否则 daemon 自动重启路径会 crash-loop)。
|
|
13
|
+
*
|
|
14
|
+
* 会话 id 的发现走 traex 同款两条路:
|
|
15
|
+
* - writeInput 后到 DB 里验证 user part 是否落库(顺带拿到 session_id 持久化);
|
|
16
|
+
* - 兜底:botmux 每条 prompt 都嵌 `<session_id>` 块,直接在 part 表按文本反查。
|
|
17
|
+
*/
|
|
18
|
+
const OPENCODE_SESSION_ID_RE = /^ses_[0-9A-Za-z]+$/;
|
|
19
|
+
function isOpenCodeSessionId(value) {
|
|
20
|
+
return typeof value === 'string' && OPENCODE_SESSION_ID_RE.test(value);
|
|
21
|
+
}
|
|
22
|
+
function normaliseText(text) {
|
|
23
|
+
return text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
24
|
+
}
|
|
25
|
+
function textMatches(actual, expected) {
|
|
26
|
+
if (actual === expected)
|
|
27
|
+
return true;
|
|
28
|
+
const na = normaliseText(actual);
|
|
29
|
+
const ne = normaliseText(expected);
|
|
30
|
+
if (na === ne)
|
|
31
|
+
return true;
|
|
32
|
+
// 宽容前缀匹配:多行内容在 TUI 里可能被嵌入换行提前提交(只提交了第一段),
|
|
33
|
+
// 或 DB 侧截断。宁可认作已提交,也不误报"未确认"(与旧盲发行为对齐,不回退)。
|
|
34
|
+
if (na.length > 0 && (ne.startsWith(na) || na.startsWith(ne.slice(0, na.length))))
|
|
35
|
+
return true;
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
let sqliteModule = null;
|
|
39
|
+
let sqliteLoadAttempted = false;
|
|
40
|
+
function loadSqlite() {
|
|
41
|
+
if (sqliteLoadAttempted)
|
|
42
|
+
return sqliteModule;
|
|
43
|
+
sqliteLoadAttempted = true;
|
|
44
|
+
// ESM 下没有裸 require(ReferenceError),必须走 createRequire —— traex.ts 曾因
|
|
45
|
+
// 裸 require 被 try/catch 吞掉而在生产 dist 里整条 SQLite 链路静默失效。
|
|
46
|
+
try {
|
|
47
|
+
const req = createRequire(import.meta.url);
|
|
48
|
+
sqliteModule = req('node:sqlite');
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
sqliteModule = null;
|
|
52
|
+
}
|
|
53
|
+
return sqliteModule;
|
|
54
|
+
}
|
|
55
|
+
/** 只读打开 opencode.db 执行一次查询。DB 是 WAL 模式且被活跃 OpenCode 进程持有,
|
|
56
|
+
* read-only 连接可并发读;任何失败(模块缺失/文件不存在/短暂锁忙)都回落 null,
|
|
57
|
+
* 上层按"无法验证"降级,不影响输入投递本身。 */
|
|
58
|
+
function withDb(fn) {
|
|
59
|
+
const mod = loadSqlite();
|
|
60
|
+
if (!mod)
|
|
61
|
+
return null;
|
|
62
|
+
const dbPath = opencodeDbPath();
|
|
63
|
+
if (!existsSync(dbPath))
|
|
64
|
+
return null;
|
|
65
|
+
let db;
|
|
66
|
+
try {
|
|
67
|
+
db = new mod.DatabaseSync(dbPath, { readOnly: true });
|
|
68
|
+
return fn(db);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
try {
|
|
75
|
+
db?.close();
|
|
76
|
+
}
|
|
77
|
+
catch { /* ignore */ }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** 提交验证基线:part 表当前最大 time_created(epoch ms,与 worker 同机同钟)。
|
|
81
|
+
* 之后只认 >= 基线的新行,避免历史消息误配。 */
|
|
82
|
+
function snapPartBaseline() {
|
|
83
|
+
return withDb((db) => {
|
|
84
|
+
const row = db.prepare('SELECT COALESCE(MAX(time_created), 0) AS ts FROM part').get();
|
|
85
|
+
return row?.ts ?? 0;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/** 基线之后是否出现文本匹配的 user part;命中则带回其 session_id(= OpenCode 原生
|
|
89
|
+
* 会话 id)。全局 DB 多实例并发写也安全:靠文本相等排除别的会话的行。
|
|
90
|
+
* 严格 `>` 基线:`>=` 会在"用户因疑似丢失而重发同一段文本"时误配上一条的行,
|
|
91
|
+
* 把真丢失误报为已提交;同毫秒漏检的窗口可忽略(新行时间戳必然晚于既有最大值)。 */
|
|
92
|
+
function detectNewSubmit(baseline, expectedText) {
|
|
93
|
+
return withDb((db) => {
|
|
94
|
+
const rows = db.prepare("SELECT p.session_id AS sid, json_extract(p.data, '$.text') AS text " +
|
|
95
|
+
'FROM part p JOIN message m ON m.id = p.message_id ' +
|
|
96
|
+
"WHERE json_extract(m.data, '$.role') = 'user' " +
|
|
97
|
+
" AND json_extract(p.data, '$.type') = 'text' " +
|
|
98
|
+
' AND p.time_created > ? ' +
|
|
99
|
+
'ORDER BY p.time_created DESC LIMIT 20').all(baseline);
|
|
100
|
+
for (const r of rows) {
|
|
101
|
+
if (r.text && textMatches(r.text, expectedText)) {
|
|
102
|
+
return { found: true, cliSessionId: r.sid };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { found: false };
|
|
106
|
+
}) ?? { found: false };
|
|
107
|
+
}
|
|
108
|
+
/** 兜底反查:botmux 每条 prompt 都带 `<session_id>xxx</session_id>` 块,按该文本在
|
|
109
|
+
* user part 里找最近命中的 OpenCode 会话。用于 cliSessionId 尚未持久化时的 resume
|
|
110
|
+
* (典型:首条消息经 --prompt 注入、没走 writeInput 就被 suspend/重启)。 */
|
|
111
|
+
function latestOpenCodeSessionForBotmuxSession(botmuxSessionId) {
|
|
112
|
+
return withDb((db) => {
|
|
113
|
+
const row = db.prepare('SELECT p.session_id AS sid ' +
|
|
114
|
+
'FROM part p JOIN message m ON m.id = p.message_id ' +
|
|
115
|
+
"WHERE json_extract(m.data, '$.role') = 'user' " +
|
|
116
|
+
" AND json_extract(p.data, '$.type') = 'text' " +
|
|
117
|
+
' AND instr(p.data, ?) > 0 ' +
|
|
118
|
+
'ORDER BY p.time_created DESC LIMIT 1').get(botmuxSessionId);
|
|
119
|
+
return row?.sid;
|
|
120
|
+
}) ?? undefined;
|
|
121
|
+
}
|
|
122
|
+
function sessionRowExists(cliSessionId) {
|
|
123
|
+
return withDb((db) => {
|
|
124
|
+
const row = db.prepare('SELECT 1 AS ok FROM session WHERE id = ? LIMIT 1').get(cliSessionId);
|
|
125
|
+
return !!row?.ok;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// -------------------------------------------------------------------------
|
|
4
129
|
export function createOpenCodeAdapter(pathOverride) {
|
|
5
130
|
// resolvedBin is lazy: setup constructs adapters only to read static
|
|
6
131
|
// modelChoices and must not shell out (see resolveCommand); the binary path
|
|
@@ -11,35 +136,138 @@ export function createOpenCodeAdapter(pathOverride) {
|
|
|
11
136
|
id: 'opencode',
|
|
12
137
|
authPaths: ['~/.local/share/opencode/auth.json'],
|
|
13
138
|
get resolvedBin() { return (cachedBin ??= resolveCommand(rawBin)); },
|
|
14
|
-
buildArgs({ initialPrompt, model }) {
|
|
15
|
-
// OpenCode manages sessions internally (SQLite store).
|
|
16
|
-
// Resume not supported — always start fresh. --continue exits
|
|
17
|
-
// immediately (code 0) when there is no prior session, causing a
|
|
18
|
-
// crash-loop in the daemon auto-restart path.
|
|
139
|
+
buildArgs({ sessionId, resume, resumeSessionId, initialPrompt, model }) {
|
|
19
140
|
const args = [];
|
|
20
141
|
if (model && model.trim()) {
|
|
21
142
|
args.push('--model', model.trim());
|
|
22
143
|
}
|
|
144
|
+
// Resume:优先用持久化的 cliSessionId,否则按 botmux session id 文本反查。
|
|
145
|
+
// 找不到就退化为全新会话(与旧行为一致)——绝不带无效 id 启动,
|
|
146
|
+
// `opencode -s <不存在的id>` 会立即 exit 1 → daemon 自动重启 crash-loop。
|
|
147
|
+
const openCodeSessionId = resume
|
|
148
|
+
? (isOpenCodeSessionId(resumeSessionId) ? resumeSessionId : latestOpenCodeSessionForBotmuxSession(sessionId))
|
|
149
|
+
: undefined;
|
|
150
|
+
if (openCodeSessionId) {
|
|
151
|
+
args.push('--session', openCodeSessionId);
|
|
152
|
+
}
|
|
23
153
|
// Use --prompt for the initial prompt. OpenCode's Bubble Tea TUI
|
|
24
154
|
// has an async startup phase; writing to stdin during this window
|
|
25
155
|
// may be lost. --prompt injects it once the TUI is ready.
|
|
156
|
+
// 注意:`-s` resume 下 --prompt 会被 OpenCode 忽略(实测 1.17.11),worker 靠
|
|
157
|
+
// initialPromptArgsIgnoredOnResume 在 resume 时把 prompt 改走输入队列,
|
|
158
|
+
// 所以这里 resume 分支收到的 initialPrompt 恒为 undefined。
|
|
26
159
|
if (initialPrompt) {
|
|
27
160
|
args.push('--prompt', initialPrompt);
|
|
28
161
|
}
|
|
29
162
|
return args;
|
|
30
163
|
},
|
|
31
164
|
passesInitialPromptViaArgs: true,
|
|
165
|
+
// OpenCode 只在"新会话"应用 --prompt,`-s` 续接时静默忽略(消息会丢)。
|
|
166
|
+
// 置位后 worker 在 resume spawn 时把初始 prompt 转入常规输入队列。
|
|
167
|
+
initialPromptArgsIgnoredOnResume: true,
|
|
168
|
+
buildResumeCommand({ sessionId, cliSessionId }) {
|
|
169
|
+
const sid = isOpenCodeSessionId(cliSessionId) ? cliSessionId : latestOpenCodeSessionForBotmuxSession(sessionId);
|
|
170
|
+
if (!sid)
|
|
171
|
+
return null;
|
|
172
|
+
return `opencode -s ${sid}`;
|
|
173
|
+
},
|
|
174
|
+
/** Resume 目标预检:id 不在 session 表 → false(worker 落回全新会话并提示),
|
|
175
|
+
* 避免 `Session not found` exit 1 被放大成自动重启 crash-loop。DB 读不了
|
|
176
|
+
* (node:sqlite 缺失 / 首次运行 / sandbox overlay 挡住)→ undefined,交给
|
|
177
|
+
* worker 的二级重启护栏。 */
|
|
178
|
+
checkResumeTargetExists({ sessionId, cliSessionId }) {
|
|
179
|
+
const sid = isOpenCodeSessionId(cliSessionId) ? cliSessionId : latestOpenCodeSessionForBotmuxSession(sessionId);
|
|
180
|
+
if (!sid) {
|
|
181
|
+
// 反查也找不到 → buildArgs 会退化为全新会话,spawn 本身不会失败。
|
|
182
|
+
// 返回 undefined 让 spawn 正常走(fresh),不触发"无法恢复"提示误报。
|
|
183
|
+
return withDb(() => true) === null ? undefined : false;
|
|
184
|
+
}
|
|
185
|
+
const exists = sessionRowExists(sid);
|
|
186
|
+
return exists === null ? undefined : exists;
|
|
187
|
+
},
|
|
188
|
+
/** Import path(/adopt 第二过滤器):从全局 session 表列出可续接的顶层会话
|
|
189
|
+
* (parent_id 非空的是子代理会话,跳过)。title 是 OpenCode 自动生成的摘要。 */
|
|
190
|
+
listResumableSessions({ limit, exclude }) {
|
|
191
|
+
const rows = withDb((db) => db.prepare('SELECT id, directory, title, time_updated AS timeUpdated FROM session ' +
|
|
192
|
+
'WHERE parent_id IS NULL AND time_archived IS NULL ' +
|
|
193
|
+
'ORDER BY time_updated DESC LIMIT ?').all(limit + (exclude?.size ?? 0))) ?? [];
|
|
194
|
+
const out = [];
|
|
195
|
+
for (const r of rows) {
|
|
196
|
+
if (out.length >= limit)
|
|
197
|
+
break;
|
|
198
|
+
if (exclude?.has(r.id))
|
|
199
|
+
continue;
|
|
200
|
+
if (!r.directory || !existsSync(r.directory))
|
|
201
|
+
continue;
|
|
202
|
+
out.push({
|
|
203
|
+
cliSessionId: r.id,
|
|
204
|
+
cwd: r.directory,
|
|
205
|
+
title: (r.title ?? '').trim() || r.id,
|
|
206
|
+
lastActivityAt: r.timeUpdated,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return Promise.resolve(out);
|
|
210
|
+
},
|
|
32
211
|
async writeInput(pty, content) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
212
|
+
// 提交验证基线先于写入采样(traex 同款)。斜杠命令是 TUI 命令面板输入,
|
|
213
|
+
// 不产生 user message 行,跳过验证(重试 Enter 还可能误触面板项)。
|
|
214
|
+
const isSlashCommand = content.startsWith('/');
|
|
215
|
+
const baseline = isSlashCommand ? null : snapPartBaseline();
|
|
216
|
+
const trySendEnter = () => {
|
|
217
|
+
try {
|
|
218
|
+
if (pty.sendSpecialKeys)
|
|
219
|
+
pty.sendSpecialKeys('Enter');
|
|
220
|
+
else
|
|
221
|
+
pty.write('\r');
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
try {
|
|
229
|
+
if (pty.sendText && pty.sendSpecialKeys) {
|
|
230
|
+
pty.sendText(content);
|
|
231
|
+
await delay(200);
|
|
232
|
+
pty.sendSpecialKeys('Enter');
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
pty.write(content);
|
|
236
|
+
await delay(1000);
|
|
237
|
+
pty.write('\r');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return { submitted: false };
|
|
242
|
+
}
|
|
243
|
+
// DB-backed submit verification + cliSessionId 捕获。node:sqlite 不可用或
|
|
244
|
+
// DB 缺失(首次运行 / sandbox overlay)→ 维持旧行为:盲发、假定成功。
|
|
245
|
+
if (baseline === null)
|
|
246
|
+
return undefined;
|
|
247
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
248
|
+
const match = detectNewSubmit(baseline, content);
|
|
249
|
+
if (match.found) {
|
|
250
|
+
return match.cliSessionId
|
|
251
|
+
? { submitted: true, cliSessionId: match.cliSessionId }
|
|
252
|
+
: { submitted: true };
|
|
253
|
+
}
|
|
254
|
+
await delay(800);
|
|
255
|
+
if (!trySendEnter())
|
|
256
|
+
return { submitted: false };
|
|
37
257
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
258
|
+
const finalMatch = detectNewSubmit(baseline, content);
|
|
259
|
+
if (finalMatch.found) {
|
|
260
|
+
return finalMatch.cliSessionId
|
|
261
|
+
? { submitted: true, cliSessionId: finalMatch.cliSessionId }
|
|
262
|
+
: { submitted: true };
|
|
42
263
|
}
|
|
264
|
+
const recheck = () => {
|
|
265
|
+
const late = detectNewSubmit(baseline, content);
|
|
266
|
+
return late.found
|
|
267
|
+
? { submitted: true, cliSessionId: late.cliSessionId }
|
|
268
|
+
: false;
|
|
269
|
+
};
|
|
270
|
+
return { submitted: false, recheck };
|
|
43
271
|
},
|
|
44
272
|
completionPattern: undefined, // quiescence only — no explicit completion marker
|
|
45
273
|
readyPattern: undefined, // Bubble Tea TUI — no reliable prompt indicator; rely on quiescence + spinner guard
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/adapters/cli/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/adapters/cli/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { createCodexAdapter } from './codex.js';
|
|
|
8
8
|
import { createCodexAppAdapter } from './codex-app.js';
|
|
9
9
|
import { createCursorAdapter } from './cursor.js';
|
|
10
10
|
import { createGeminiAdapter } from './gemini.js';
|
|
11
|
+
import { createGeniusAdapter } from './genius.js';
|
|
11
12
|
import { createOpenCodeAdapter } from './opencode.js';
|
|
12
13
|
import { createAntigravityAdapter } from './antigravity.js';
|
|
13
14
|
import { createMtrAdapter } from './mtr.js';
|
|
@@ -35,7 +36,7 @@ export declare function resolveCommand(cmd: string): string;
|
|
|
35
36
|
export declare function locateOnPath(cmd: string): string | null;
|
|
36
37
|
/** Async adapter factory (uses dynamic import for lazy loading in daemon process). */
|
|
37
38
|
export declare function createCliAdapter(id: CliId, pathOverride?: string): Promise<CliAdapter>;
|
|
38
|
-
export { createClaudeCodeAdapter, createSeedAdapter, createRelayAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter, createCodexAppAdapter, createCursorAdapter, createGeminiAdapter, createOpenCodeAdapter, createAntigravityAdapter, createMtrAdapter, createHermesAdapter, createMiraAdapter, createMirAdapter, createTraexAdapter, createPiAdapter, createCopilotAdapter, createOhMyPiAdapter, createKimiAdapter };
|
|
39
|
+
export { createClaudeCodeAdapter, createSeedAdapter, createRelayAdapter, createAidenAdapter, createCocoAdapter, createCodexAdapter, createCodexAppAdapter, createCursorAdapter, createGeminiAdapter, createGeniusAdapter, createOpenCodeAdapter, createAntigravityAdapter, createMtrAdapter, createHermesAdapter, createMiraAdapter, createMirAdapter, createTraexAdapter, createPiAdapter, createCopilotAdapter, createOhMyPiAdapter, createKimiAdapter };
|
|
39
40
|
/** Synchronous version for use in worker process. */
|
|
40
41
|
export declare function createCliAdapterSync(id: CliId, pathOverride?: string): CliAdapter;
|
|
41
42
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,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,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;gEAEgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4ClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAO5F;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,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,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;gEAEgE;AAChE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4ClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvD;AAID,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAO5F;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAE3b,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAyBjF"}
|