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.
Files changed (219) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/adapters/cli/genius.d.ts +4 -0
  4. package/dist/adapters/cli/genius.d.ts.map +1 -0
  5. package/dist/adapters/cli/genius.js +216 -0
  6. package/dist/adapters/cli/genius.js.map +1 -0
  7. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  8. package/dist/adapters/cli/opencode.js +241 -13
  9. package/dist/adapters/cli/opencode.js.map +1 -1
  10. package/dist/adapters/cli/registry.d.ts +2 -1
  11. package/dist/adapters/cli/registry.d.ts.map +1 -1
  12. package/dist/adapters/cli/registry.js +3 -1
  13. package/dist/adapters/cli/registry.js.map +1 -1
  14. package/dist/adapters/cli/traex.d.ts.map +1 -1
  15. package/dist/adapters/cli/traex.js +8 -6
  16. package/dist/adapters/cli/traex.js.map +1 -1
  17. package/dist/adapters/cli/types.d.ts +11 -4
  18. package/dist/adapters/cli/types.d.ts.map +1 -1
  19. package/dist/core/dashboard-rows.d.ts +1 -1
  20. package/dist/core/dashboard-rows.d.ts.map +1 -1
  21. package/dist/core/dashboard-rows.js +2 -1
  22. package/dist/core/dashboard-rows.js.map +1 -1
  23. package/dist/dashboard/session-card-model.d.ts +2 -2
  24. package/dist/dashboard/session-card-model.d.ts.map +1 -1
  25. package/dist/dashboard/session-card-model.js +5 -2
  26. package/dist/dashboard/session-card-model.js.map +1 -1
  27. package/dist/dashboard/web/app.d.ts.map +1 -1
  28. package/dist/dashboard/web/app.js +28 -63
  29. package/dist/dashboard/web/app.js.map +1 -1
  30. package/dist/dashboard/web/bot-defaults-page.d.ts +3 -0
  31. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -0
  32. package/dist/dashboard/web/bot-defaults-page.js +23 -0
  33. package/dist/dashboard/web/bot-defaults-page.js.map +1 -0
  34. package/dist/dashboard/web/bot-defaults.d.ts +2 -1
  35. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  36. package/dist/dashboard/web/bot-defaults.js +30 -30
  37. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  38. package/dist/dashboard/web/connectors-page.d.ts +14 -0
  39. package/dist/dashboard/web/connectors-page.d.ts.map +1 -0
  40. package/dist/dashboard/web/connectors-page.js +303 -0
  41. package/dist/dashboard/web/connectors-page.js.map +1 -0
  42. package/dist/dashboard/web/connectors.d.ts +1 -12
  43. package/dist/dashboard/web/connectors.d.ts.map +1 -1
  44. package/dist/dashboard/web/connectors.js +1 -325
  45. package/dist/dashboard/web/connectors.js.map +1 -1
  46. package/dist/dashboard/web/dashboard-routes.d.ts +14 -0
  47. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -0
  48. package/dist/dashboard/web/dashboard-routes.js +176 -0
  49. package/dist/dashboard/web/dashboard-routes.js.map +1 -0
  50. package/dist/dashboard/web/groups-page.d.ts +3 -0
  51. package/dist/dashboard/web/groups-page.d.ts.map +1 -0
  52. package/dist/dashboard/web/groups-page.js +26 -0
  53. package/dist/dashboard/web/groups-page.js.map +1 -0
  54. package/dist/dashboard/web/groups.d.ts +1 -1
  55. package/dist/dashboard/web/groups.d.ts.map +1 -1
  56. package/dist/dashboard/web/groups.js +113 -52
  57. package/dist/dashboard/web/groups.js.map +1 -1
  58. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  59. package/dist/dashboard/web/i18n.js +18 -0
  60. package/dist/dashboard/web/i18n.js.map +1 -1
  61. package/dist/dashboard/web/insights-page.d.ts +3 -0
  62. package/dist/dashboard/web/insights-page.d.ts.map +1 -0
  63. package/dist/dashboard/web/insights-page.js +26 -0
  64. package/dist/dashboard/web/insights-page.js.map +1 -0
  65. package/dist/dashboard/web/insights.d.ts +18 -1
  66. package/dist/dashboard/web/insights.d.ts.map +1 -1
  67. package/dist/dashboard/web/insights.js +25 -61
  68. package/dist/dashboard/web/insights.js.map +1 -1
  69. package/dist/dashboard/web/office-page.d.ts +3 -0
  70. package/dist/dashboard/web/office-page.d.ts.map +1 -0
  71. package/dist/dashboard/web/office-page.js +149 -0
  72. package/dist/dashboard/web/office-page.js.map +1 -0
  73. package/dist/dashboard/web/office.d.ts +1 -1
  74. package/dist/dashboard/web/office.d.ts.map +1 -1
  75. package/dist/dashboard/web/office.js +1 -139
  76. package/dist/dashboard/web/office.js.map +1 -1
  77. package/dist/dashboard/web/overview-page.d.ts +3 -0
  78. package/dist/dashboard/web/overview-page.d.ts.map +1 -0
  79. package/dist/dashboard/web/overview-page.js +149 -0
  80. package/dist/dashboard/web/overview-page.js.map +1 -0
  81. package/dist/dashboard/web/overview.d.ts +2 -2
  82. package/dist/dashboard/web/overview.d.ts.map +1 -1
  83. package/dist/dashboard/web/overview.js +14 -3
  84. package/dist/dashboard/web/overview.js.map +1 -1
  85. package/dist/dashboard/web/react-hooks.d.ts +8 -0
  86. package/dist/dashboard/web/react-hooks.d.ts.map +1 -0
  87. package/dist/dashboard/web/react-hooks.js +43 -0
  88. package/dist/dashboard/web/react-hooks.js.map +1 -0
  89. package/dist/dashboard/web/react-mount.d.ts +4 -0
  90. package/dist/dashboard/web/react-mount.d.ts.map +1 -0
  91. package/dist/dashboard/web/react-mount.js +7 -0
  92. package/dist/dashboard/web/react-mount.js.map +1 -0
  93. package/dist/dashboard/web/roles-page.d.ts +4 -0
  94. package/dist/dashboard/web/roles-page.d.ts.map +1 -0
  95. package/dist/dashboard/web/roles-page.js +26 -0
  96. package/dist/dashboard/web/roles-page.js.map +1 -0
  97. package/dist/dashboard/web/roles.d.ts +1 -2
  98. package/dist/dashboard/web/roles.d.ts.map +1 -1
  99. package/dist/dashboard/web/roles.js +189 -135
  100. package/dist/dashboard/web/roles.js.map +1 -1
  101. package/dist/dashboard/web/route-lifecycle.d.ts +14 -0
  102. package/dist/dashboard/web/route-lifecycle.d.ts.map +1 -0
  103. package/dist/dashboard/web/route-lifecycle.js +29 -0
  104. package/dist/dashboard/web/route-lifecycle.js.map +1 -0
  105. package/dist/dashboard/web/schedules-page.d.ts +14 -0
  106. package/dist/dashboard/web/schedules-page.d.ts.map +1 -0
  107. package/dist/dashboard/web/schedules-page.js +84 -0
  108. package/dist/dashboard/web/schedules-page.js.map +1 -0
  109. package/dist/dashboard/web/schedules.d.ts +1 -1
  110. package/dist/dashboard/web/schedules.d.ts.map +1 -1
  111. package/dist/dashboard/web/schedules.js +1 -115
  112. package/dist/dashboard/web/schedules.js.map +1 -1
  113. package/dist/dashboard/web/sessions-page.d.ts +3 -0
  114. package/dist/dashboard/web/sessions-page.d.ts.map +1 -0
  115. package/dist/dashboard/web/sessions-page.js +28 -0
  116. package/dist/dashboard/web/sessions-page.js.map +1 -0
  117. package/dist/dashboard/web/sessions.d.ts +4 -1
  118. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  119. package/dist/dashboard/web/sessions.js +43 -10
  120. package/dist/dashboard/web/sessions.js.map +1 -1
  121. package/dist/dashboard/web/settings-page.d.ts +3 -0
  122. package/dist/dashboard/web/settings-page.d.ts.map +1 -0
  123. package/dist/dashboard/web/settings-page.js +387 -0
  124. package/dist/dashboard/web/settings-page.js.map +1 -0
  125. package/dist/dashboard/web/settings.d.ts +1 -1
  126. package/dist/dashboard/web/settings.d.ts.map +1 -1
  127. package/dist/dashboard/web/settings.js +1 -534
  128. package/dist/dashboard/web/settings.js.map +1 -1
  129. package/dist/dashboard/web/skills-page.d.ts +33 -0
  130. package/dist/dashboard/web/skills-page.d.ts.map +1 -0
  131. package/dist/dashboard/web/skills-page.js +515 -0
  132. package/dist/dashboard/web/skills-page.js.map +1 -0
  133. package/dist/dashboard/web/skills.d.ts +1 -1
  134. package/dist/dashboard/web/skills.d.ts.map +1 -1
  135. package/dist/dashboard/web/skills.js +1 -711
  136. package/dist/dashboard/web/skills.js.map +1 -1
  137. package/dist/dashboard/web/store.d.ts +9 -0
  138. package/dist/dashboard/web/store.d.ts.map +1 -1
  139. package/dist/dashboard/web/store.js +19 -2
  140. package/dist/dashboard/web/store.js.map +1 -1
  141. package/dist/dashboard/web/team-federation-page.d.ts +4 -0
  142. package/dist/dashboard/web/team-federation-page.d.ts.map +1 -0
  143. package/dist/dashboard/web/team-federation-page.js +47 -0
  144. package/dist/dashboard/web/team-federation-page.js.map +1 -0
  145. package/dist/dashboard/web/team-federation.d.ts +2 -2
  146. package/dist/dashboard/web/team-federation.d.ts.map +1 -1
  147. package/dist/dashboard/web/team-federation.js +104 -97
  148. package/dist/dashboard/web/team-federation.js.map +1 -1
  149. package/dist/dashboard/web/v3-page.d.ts +3 -0
  150. package/dist/dashboard/web/v3-page.d.ts.map +1 -0
  151. package/dist/dashboard/web/v3-page.js +27 -0
  152. package/dist/dashboard/web/v3-page.js.map +1 -0
  153. package/dist/dashboard/web/v3.d.ts +2 -1
  154. package/dist/dashboard/web/v3.d.ts.map +1 -1
  155. package/dist/dashboard/web/v3.js +18 -43
  156. package/dist/dashboard/web/v3.js.map +1 -1
  157. package/dist/dashboard/web/whiteboards-page.d.ts +3 -0
  158. package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -0
  159. package/dist/dashboard/web/whiteboards-page.js +203 -0
  160. package/dist/dashboard/web/whiteboards-page.js.map +1 -0
  161. package/dist/dashboard/web/whiteboards.d.ts +1 -1
  162. package/dist/dashboard/web/whiteboards.d.ts.map +1 -1
  163. package/dist/dashboard/web/whiteboards.js +1 -275
  164. package/dist/dashboard/web/whiteboards.js.map +1 -1
  165. package/dist/dashboard-web/app.js +36 -2550
  166. package/dist/dashboard-web/chunks/bot-defaults-page-3EV7K6LJ.js +358 -0
  167. package/dist/dashboard-web/chunks/chunk-5E3MJJL4.js +1 -0
  168. package/dist/dashboard-web/chunks/chunk-76J7PNZI.js +1 -0
  169. package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +1 -0
  170. package/dist/dashboard-web/chunks/chunk-JTSE5VP6.js +54 -0
  171. package/dist/dashboard-web/chunks/chunk-JXLHRRJD.js +31 -0
  172. package/dist/dashboard-web/chunks/chunk-NASYW5FD.js +1 -0
  173. package/dist/dashboard-web/chunks/connectors-XPZKEHF6.js +1 -0
  174. package/dist/dashboard-web/chunks/groups-page-C54PVKYP.js +207 -0
  175. package/dist/dashboard-web/chunks/insights-page-BBQYR7WY.js +309 -0
  176. package/dist/dashboard-web/chunks/office-page-6DXYOG55.js +1 -0
  177. package/dist/dashboard-web/chunks/overview-page-5PJCAMID.js +1 -0
  178. package/dist/dashboard-web/chunks/roles-page-APUDLPVM.js +98 -0
  179. package/dist/dashboard-web/chunks/schedules-WG2UKHSO.js +1 -0
  180. package/dist/dashboard-web/chunks/sessions-page-F3U5NFPD.js +238 -0
  181. package/dist/dashboard-web/chunks/settings-page-OSBZNCXL.js +2 -0
  182. package/dist/dashboard-web/chunks/skills-page-Y3VUAOYG.js +2 -0
  183. package/dist/dashboard-web/chunks/team-federation-page-CRH3WZPH.js +10 -0
  184. package/dist/dashboard-web/chunks/v3-page-FVPUL665.js +149 -0
  185. package/dist/dashboard-web/chunks/whiteboards-page-HLCTYSSV.js +1 -0
  186. package/dist/dashboard-web/chunks/workflows-UB7OPYGI.js +184 -0
  187. package/dist/dashboard-web/index.html +1 -1
  188. package/dist/dashboard-web/style.css +82 -1
  189. package/dist/dashboard.js +5 -6
  190. package/dist/dashboard.js.map +1 -1
  191. package/dist/i18n/en.d.ts.map +1 -1
  192. package/dist/i18n/en.js +1 -0
  193. package/dist/i18n/en.js.map +1 -1
  194. package/dist/i18n/zh.d.ts.map +1 -1
  195. package/dist/i18n/zh.js +1 -0
  196. package/dist/i18n/zh.js.map +1 -1
  197. package/dist/im/lark/card-builder.d.ts +2 -2
  198. package/dist/im/lark/card-builder.d.ts.map +1 -1
  199. package/dist/im/lark/card-builder.js +3 -2
  200. package/dist/im/lark/card-builder.js.map +1 -1
  201. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  202. package/dist/im/lark/event-dispatcher.js +18 -0
  203. package/dist/im/lark/event-dispatcher.js.map +1 -1
  204. package/dist/im/lark/sessions-card.d.ts.map +1 -1
  205. package/dist/im/lark/sessions-card.js +4 -1
  206. package/dist/im/lark/sessions-card.js.map +1 -1
  207. package/dist/services/opencode-paths.d.ts +7 -0
  208. package/dist/services/opencode-paths.d.ts.map +1 -0
  209. package/dist/services/opencode-paths.js +18 -0
  210. package/dist/services/opencode-paths.js.map +1 -0
  211. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  212. package/dist/setup/bot-config-editor.js +16 -14
  213. package/dist/setup/bot-config-editor.js.map +1 -1
  214. package/dist/worker.js +11 -3
  215. package/dist/worker.js.map +1 -1
  216. package/dist/workflows/attempt-resume.d.ts.map +1 -1
  217. package/dist/workflows/attempt-resume.js +4 -1
  218. package/dist/workflows/attempt-resume.js.map +1 -1
  219. 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,4 @@
1
+ import type { CliAdapter } from './types.js';
2
+ export declare function createGeniusAdapter(pathOverride?: string): CliAdapter;
3
+ export declare const create: typeof createGeniusAdapter;
4
+ //# sourceMappingURL=genius.d.ts.map
@@ -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":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAIxD,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAgEvE;AAED,eAAO,MAAM,MAAM,8BAAwB,CAAC"}
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
- if (pty.sendText && pty.sendSpecialKeys) {
34
- pty.sendText(content);
35
- await delay(200);
36
- pty.sendSpecialKeys('Enter');
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
- else {
39
- pty.write(content);
40
- await delay(1000);
41
- pty.write('\r');
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;AAGvD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,YAAqB;IACzD,qEAAqE;IACrE,4EAA4E;IAC5E,2BAA2B;IAC3B,MAAM,MAAM,GAAG,YAAY,IAAI,UAAU,CAAC;IAC1C,IAAI,SAA6B,CAAC;IAClC,OAAO;QACL,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,CAAC,mCAAmC,CAAC;QAChD,IAAI,WAAW,KAAa,OAAO,CAAC,SAAS,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE;YAChC,uDAAuD;YACvD,+DAA+D;YAC/D,iEAAiE;YACjE,8CAA8C;YAC9C,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,kEAAkE;YAClE,kEAAkE;YAClE,2DAA2D;YAC3D,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACvC,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,oFAAoF;QACpH,WAAW,EAAE,kBAAkB;QAC/B,SAAS,EAAE,IAAI,EAAiB,gDAAgD;QAChF,SAAS,EAAE,2BAA2B;QACtC,0CAA0C;QAC1C,mDAAmD;QACnD,WAAW,EAAE;YACX,UAAU,EAAE,yCAAyC;YACrD,MAAM,EAAE,iBAAiB;SAC1B;QACD,WAAW,EAAE,IAAI;QACjB,8EAA8E;QAC9E,qCAAqC;QACrC,YAAY,EAAE;YACZ,2BAA2B;YAC3B,yBAAyB;YACzB,cAAc;YACd,uBAAuB;SACxB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,qBAAqB,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;AAEta,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAwBjF"}
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"}