botmux 2.87.0 → 2.88.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 +1 -0
- package/README.md +1 -0
- package/dist/adapters/backend/liveness-gate.d.ts +38 -0
- package/dist/adapters/backend/liveness-gate.d.ts.map +1 -0
- package/dist/adapters/backend/liveness-gate.js +53 -0
- package/dist/adapters/backend/liveness-gate.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts +21 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +102 -27
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +20 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +85 -19
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.d.ts +13 -0
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +51 -12
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +4 -0
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +6 -0
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +13 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +3 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.js +1 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +165 -5
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +3 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +4 -1
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/session-activity.d.ts +1 -0
- package/dist/core/session-activity.d.ts.map +1 -1
- package/dist/core/session-activity.js +7 -4
- package/dist/core/session-activity.js.map +1 -1
- package/dist/core/session-create.d.ts +61 -0
- package/dist/core/session-create.d.ts.map +1 -0
- package/dist/core/session-create.js +128 -0
- package/dist/core/session-create.js.map +1 -0
- package/dist/core/session-manager.d.ts +40 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +237 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +78 -4
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +11 -5
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +1 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +1 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/session-cleanup.d.ts +30 -0
- package/dist/dashboard/session-cleanup.d.ts.map +1 -0
- package/dist/dashboard/session-cleanup.js +47 -0
- package/dist/dashboard/session-cleanup.js.map +1 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +20 -5
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +184 -2
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights.d.ts.map +1 -1
- package/dist/dashboard/web/insights.js +355 -30
- package/dist/dashboard/web/insights.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +2 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +457 -30
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard-web/app.js +767 -640
- package/dist/dashboard-web/style.css +257 -7
- package/dist/dashboard.js +211 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +21 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +21 -1
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +4 -5
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +113 -11
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +3 -2
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +167 -11
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +19 -5
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-pending.d.ts.map +1 -1
- package/dist/im/lark/grant-pending.js +9 -2
- package/dist/im/lark/grant-pending.js.map +1 -1
- package/dist/index-daemon.js +5 -0
- package/dist/index-daemon.js.map +1 -1
- package/dist/platform/bind.d.ts +2 -0
- package/dist/platform/bind.d.ts.map +1 -0
- package/dist/platform/bind.js +91 -0
- package/dist/platform/bind.js.map +1 -0
- package/dist/platform/binding.d.ts +22 -0
- package/dist/platform/binding.d.ts.map +1 -0
- package/dist/platform/binding.js +33 -0
- package/dist/platform/binding.js.map +1 -0
- package/dist/platform/tunnel-client.d.ts +15 -0
- package/dist/platform/tunnel-client.d.ts.map +1 -0
- package/dist/platform/tunnel-client.js +193 -0
- package/dist/platform/tunnel-client.js.map +1 -0
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +1 -0
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/git-worktree.d.ts +10 -0
- package/dist/services/git-worktree.d.ts.map +1 -1
- package/dist/services/git-worktree.js +71 -26
- package/dist/services/git-worktree.js.map +1 -1
- package/dist/services/grant-prefs-store.d.ts +3 -0
- package/dist/services/grant-prefs-store.d.ts.map +1 -1
- package/dist/services/grant-prefs-store.js +17 -2
- package/dist/services/grant-prefs-store.js.map +1 -1
- package/dist/services/insight/claude-span-reader.d.ts.map +1 -1
- package/dist/services/insight/claude-span-reader.js +18 -2
- package/dist/services/insight/claude-span-reader.js.map +1 -1
- package/dist/services/insight/codex-span-reader.d.ts.map +1 -1
- package/dist/services/insight/codex-span-reader.js +17 -1
- package/dist/services/insight/codex-span-reader.js.map +1 -1
- package/dist/services/insight/report.d.ts.map +1 -1
- package/dist/services/insight/report.js +48 -6
- package/dist/services/insight/report.js.map +1 -1
- package/dist/services/insight/types.d.ts +9 -0
- package/dist/services/insight/types.d.ts.map +1 -1
- package/dist/services/insight/types.js.map +1 -1
- package/dist/services/worktree-slug-ai.d.ts.map +1 -1
- package/dist/services/worktree-slug-ai.js +3 -1
- package/dist/services/worktree-slug-ai.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/crash-log.d.ts +22 -0
- package/dist/utils/crash-log.d.ts.map +1 -0
- package/dist/utils/crash-log.js +37 -0
- package/dist/utils/crash-log.js.map +1 -0
- package/dist/utils/input-gate.d.ts +10 -0
- package/dist/utils/input-gate.d.ts.map +1 -1
- package/dist/utils/input-gate.js +7 -0
- package/dist/utils/input-gate.js.map +1 -1
- package/dist/utils/stdio-epipe-guard.d.ts +39 -0
- package/dist/utils/stdio-epipe-guard.d.ts.map +1 -0
- package/dist/utils/stdio-epipe-guard.js +67 -0
- package/dist/utils/stdio-epipe-guard.js.map +1 -0
- package/dist/worker.js +210 -26
- package/dist/worker.js.map +1 -1
- package/dist/workflows/daemon-spawn.d.ts +2 -0
- package/dist/workflows/daemon-spawn.d.ts.map +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -306,6 +306,7 @@ Gemini / OpenCode / Antigravity / GitHub Copilot), with no MCP protocol support
|
|
|
306
306
|
- One-click locate back to the Feishu thread / open Web Terminal / multi-select batch close
|
|
307
307
|
- Create a new group with auto owner-transfer + @-mention notification
|
|
308
308
|
- Disband or leave a chat (associated sessions auto-closed)
|
|
309
|
+
- **Session Insights** (owner-only, read-only): parse each session's transcript to view action spans / work timeline / context curve / failure aggregates + diagnostic suggestions; send `/insight` in chat for the current session's summary card
|
|
309
310
|
- **Workflows console**:
|
|
310
311
|
- Run List (5 s poll) + Run Detail with summary, dangling-work red panel, node/activity table, event timeline, and a **parallel-execution timeline** (attempt-level), auto-stopping polling once the run reaches a terminal state
|
|
311
312
|
- **Cancel a run directly from the dashboard**; approve / reject `humanGate` with reviewer comments
|
package/README.md
CHANGED
|
@@ -191,6 +191,7 @@ CLI 进入 botmux 会话时自动获得 `~/.botmux/bin` 在 PATH 中,以及一
|
|
|
191
191
|
- 一键定位回飞书话题 / 跳 Web 终端 / 多选批量关闭会话
|
|
192
192
|
- 拉新群、自动转让群主、@ 提醒
|
|
193
193
|
- 解散群聊、bot 退群(关联会话自动清理)
|
|
194
|
+
- **会话洞察**(owner-only,只读):解析各会话 transcript,看动作 span / 工作时序 / 上下文曲线 / 失败聚合 + 诊断建议;聊天里发 `/insight` 可取当前会话摘要卡
|
|
194
195
|
- **Workflows 管控面**:
|
|
195
196
|
- Run List 5s 轮询;Run Detail 看 summary / dangling 红区 / node-activity 表 / event timeline / **并发执行 timeline**(attempt 级时序),到 terminal 自动停轮询
|
|
196
197
|
- **Dashboard 内可直接 cancel run**、批准/拒绝 humanGate(approve/reject + 评论)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LivenessGate — debounce transient liveness-probe failures for /adopt backends.
|
|
3
|
+
*
|
|
4
|
+
* The adopt observers (TmuxPipeBackend, ZellijObserveBackend) poll the external
|
|
5
|
+
* pane/CLI once per second to detect when the adopted target really exited. The
|
|
6
|
+
* original logic tore the session down on the FIRST failed probe, so any
|
|
7
|
+
* transient hiccup — a `tmux display-message` timeout, a busy zellij server, fd
|
|
8
|
+
* pressure (EMFILE) when many workers are live — produced a spurious
|
|
9
|
+
* "⏏ /adopt的 CLI 会话已断开" even though the CLI was still alive and still
|
|
10
|
+
* receiving messages.
|
|
11
|
+
*
|
|
12
|
+
* This gate counts CONSECUTIVE failures and only reports the target as gone once
|
|
13
|
+
* `threshold` failures pile up with no intervening success. Any single success
|
|
14
|
+
* resets the counter, so steady-state liveness never trips it. Callers should
|
|
15
|
+
* follow a tripped gate with one final authoritative re-probe (ideally with a
|
|
16
|
+
* more lenient timeout) before actually tearing down — see the backends.
|
|
17
|
+
*/
|
|
18
|
+
export declare class LivenessGate {
|
|
19
|
+
private readonly threshold;
|
|
20
|
+
private failures;
|
|
21
|
+
constructor(threshold: number);
|
|
22
|
+
/**
|
|
23
|
+
* Feed one probe verdict.
|
|
24
|
+
* @returns true iff this verdict pushed the consecutive-failure count to the
|
|
25
|
+
* threshold — the caller should now confirm + tear down. A success
|
|
26
|
+
* resets the counter and always returns false.
|
|
27
|
+
*/
|
|
28
|
+
record(alive: boolean): boolean;
|
|
29
|
+
/** Consecutive failures observed so far (0 once a success resets it). */
|
|
30
|
+
get consecutiveFailures(): number;
|
|
31
|
+
reset(): void;
|
|
32
|
+
}
|
|
33
|
+
/** Default consecutive-failure budget before an adopt backend declares its
|
|
34
|
+
* target gone. 3 one-second probes (~3s of sustained failure) plus a final
|
|
35
|
+
* lenient confirm — enough to ride out command timeouts / server hiccups while
|
|
36
|
+
* still detecting a genuine exit promptly. */
|
|
37
|
+
export declare const ADOPT_LIVENESS_MAX_FAILURES = 3;
|
|
38
|
+
//# sourceMappingURL=liveness-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveness-gate.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/liveness-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAK;gBAEQ,SAAS,EAAE,MAAM;IAI9C;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAS/B,yEAAyE;IACzE,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,KAAK,IAAI,IAAI;CAGd;AAED;;;+CAG+C;AAC/C,eAAO,MAAM,2BAA2B,IAAI,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LivenessGate — debounce transient liveness-probe failures for /adopt backends.
|
|
3
|
+
*
|
|
4
|
+
* The adopt observers (TmuxPipeBackend, ZellijObserveBackend) poll the external
|
|
5
|
+
* pane/CLI once per second to detect when the adopted target really exited. The
|
|
6
|
+
* original logic tore the session down on the FIRST failed probe, so any
|
|
7
|
+
* transient hiccup — a `tmux display-message` timeout, a busy zellij server, fd
|
|
8
|
+
* pressure (EMFILE) when many workers are live — produced a spurious
|
|
9
|
+
* "⏏ /adopt的 CLI 会话已断开" even though the CLI was still alive and still
|
|
10
|
+
* receiving messages.
|
|
11
|
+
*
|
|
12
|
+
* This gate counts CONSECUTIVE failures and only reports the target as gone once
|
|
13
|
+
* `threshold` failures pile up with no intervening success. Any single success
|
|
14
|
+
* resets the counter, so steady-state liveness never trips it. Callers should
|
|
15
|
+
* follow a tripped gate with one final authoritative re-probe (ideally with a
|
|
16
|
+
* more lenient timeout) before actually tearing down — see the backends.
|
|
17
|
+
*/
|
|
18
|
+
export class LivenessGate {
|
|
19
|
+
threshold;
|
|
20
|
+
failures = 0;
|
|
21
|
+
constructor(threshold) {
|
|
22
|
+
this.threshold = threshold;
|
|
23
|
+
if (threshold < 1)
|
|
24
|
+
throw new Error(`LivenessGate threshold must be >= 1, got ${threshold}`);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Feed one probe verdict.
|
|
28
|
+
* @returns true iff this verdict pushed the consecutive-failure count to the
|
|
29
|
+
* threshold — the caller should now confirm + tear down. A success
|
|
30
|
+
* resets the counter and always returns false.
|
|
31
|
+
*/
|
|
32
|
+
record(alive) {
|
|
33
|
+
if (alive) {
|
|
34
|
+
this.failures = 0;
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
this.failures += 1;
|
|
38
|
+
return this.failures >= this.threshold;
|
|
39
|
+
}
|
|
40
|
+
/** Consecutive failures observed so far (0 once a success resets it). */
|
|
41
|
+
get consecutiveFailures() {
|
|
42
|
+
return this.failures;
|
|
43
|
+
}
|
|
44
|
+
reset() {
|
|
45
|
+
this.failures = 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Default consecutive-failure budget before an adopt backend declares its
|
|
49
|
+
* target gone. 3 one-second probes (~3s of sustained failure) plus a final
|
|
50
|
+
* lenient confirm — enough to ride out command timeouts / server hiccups while
|
|
51
|
+
* still detecting a genuine exit promptly. */
|
|
52
|
+
export const ADOPT_LIVENESS_MAX_FAILURES = 3;
|
|
53
|
+
//# sourceMappingURL=liveness-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveness-gate.js","sourceRoot":"","sources":["../../../src/adapters/backend/liveness-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,YAAY;IAGM;IAFrB,QAAQ,GAAG,CAAC,CAAC;IAErB,YAA6B,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;QAC5C,IAAI,SAAS,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAc;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC;IACzC,CAAC;IAED,yEAAyE;IACzE,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;CACF;AAED;;;+CAG+C;AAC/C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC"}
|
|
@@ -36,6 +36,14 @@ export declare class TmuxBackend implements SessionBackend {
|
|
|
36
36
|
static isAvailable(): boolean;
|
|
37
37
|
/** Derive tmux session name from a session UUID. */
|
|
38
38
|
static sessionName(sessionId: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Name of the parked crash-diagnostic shell session. DISTINCT from
|
|
41
|
+
* {@link sessionName} on purpose: the diagnostic shell must never collide with
|
|
42
|
+
* the live CLI's backing-session name, or restore/cold-resume/`botmux resume`
|
|
43
|
+
* would reattach the bare shell as if it were the CLI. Stays `bmx-`-prefixed
|
|
44
|
+
* so adopt-discovery still skips it.
|
|
45
|
+
*/
|
|
46
|
+
static diagnosticSessionName(sessionId: string): string;
|
|
39
47
|
/** Check if a named tmux session exists. */
|
|
40
48
|
static hasSession(name: string): boolean;
|
|
41
49
|
/**
|
|
@@ -82,6 +90,18 @@ export declare class TmuxBackend implements SessionBackend {
|
|
|
82
90
|
static killSession(name: string): void;
|
|
83
91
|
/** List all botmux tmux sessions (bmx-* prefix). */
|
|
84
92
|
static listBotmuxSessions(): string[];
|
|
93
|
+
/**
|
|
94
|
+
* Create a parked diagnostic session after a CLI has exited. The worker uses
|
|
95
|
+
* this only after it has already captured the failed pane's output, so the
|
|
96
|
+
* browser can still attach to `bmx-*` and see the startup error while daemon
|
|
97
|
+
* auto-restart is paused.
|
|
98
|
+
*/
|
|
99
|
+
static parkDiagnosticSession(name: string, opts: {
|
|
100
|
+
cwd: string;
|
|
101
|
+
cols: number;
|
|
102
|
+
rows: number;
|
|
103
|
+
contentPath: string;
|
|
104
|
+
}): boolean;
|
|
85
105
|
spawn(bin: string, args: string[], opts: SpawnOpts): void;
|
|
86
106
|
/** Whether the last spawn() re-attached to an existing tmux session. */
|
|
87
107
|
get isReattach(): boolean;
|
|
@@ -164,6 +184,7 @@ export declare function buildBotmuxEnvAssignments(env: NodeJS.ProcessEnv | undef
|
|
|
164
184
|
* bash/zsh/sh by resolveUserShell() so they hit the same SCRIPT path.
|
|
165
185
|
*/
|
|
166
186
|
export declare const SHELL_WRAPPER_SCRIPT: string;
|
|
187
|
+
export declare const DIAGNOSTIC_SHELL_SCRIPT: string;
|
|
167
188
|
/**
|
|
168
189
|
* Debug variant of the wrapper script — same prelude, but the CLI runs as
|
|
169
190
|
* a *child* (no `exec`) and the wrapper hands off to an interactive shell
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tmux-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import * as pty from 'node-pty';
|
|
|
2
2
|
import { execSync, execFileSync } from 'node:child_process';
|
|
3
3
|
import { accessSync, constants as fsConstants } from 'node:fs';
|
|
4
4
|
import { basename } from 'node:path';
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
5
6
|
import { probeTmuxFunctional, tmuxEnv } from '../../setup/ensure-tmux.js';
|
|
6
7
|
import { REDACTED_CHILD_ENV_KEYS } from '../../utils/child-env.js';
|
|
7
8
|
import { sanitizePerBotEnv } from '../../core/per-bot-env.js';
|
|
@@ -61,6 +62,16 @@ export class TmuxBackend {
|
|
|
61
62
|
static sessionName(sessionId) {
|
|
62
63
|
return `bmx-${sessionId.slice(0, 8)}`;
|
|
63
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Name of the parked crash-diagnostic shell session. DISTINCT from
|
|
67
|
+
* {@link sessionName} on purpose: the diagnostic shell must never collide with
|
|
68
|
+
* the live CLI's backing-session name, or restore/cold-resume/`botmux resume`
|
|
69
|
+
* would reattach the bare shell as if it were the CLI. Stays `bmx-`-prefixed
|
|
70
|
+
* so adopt-discovery still skips it.
|
|
71
|
+
*/
|
|
72
|
+
static diagnosticSessionName(sessionId) {
|
|
73
|
+
return `bmx-diag-${sessionId.slice(0, 8)}`;
|
|
74
|
+
}
|
|
64
75
|
/** Check if a named tmux session exists. */
|
|
65
76
|
static hasSession(name) {
|
|
66
77
|
return TmuxBackend.probeSession(name) === 'exists';
|
|
@@ -145,6 +156,41 @@ export class TmuxBackend {
|
|
|
145
156
|
return [];
|
|
146
157
|
}
|
|
147
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Create a parked diagnostic session after a CLI has exited. The worker uses
|
|
161
|
+
* this only after it has already captured the failed pane's output, so the
|
|
162
|
+
* browser can still attach to `bmx-*` and see the startup error while daemon
|
|
163
|
+
* auto-restart is paused.
|
|
164
|
+
*/
|
|
165
|
+
static parkDiagnosticSession(name, opts) {
|
|
166
|
+
try {
|
|
167
|
+
TmuxBackend.killSession(name);
|
|
168
|
+
const shellSpec = resolveUserShell();
|
|
169
|
+
execFileSync('tmux', [
|
|
170
|
+
'new-session',
|
|
171
|
+
'-d',
|
|
172
|
+
'-s', name,
|
|
173
|
+
'-x', String(opts.cols),
|
|
174
|
+
'-y', String(opts.rows),
|
|
175
|
+
'--',
|
|
176
|
+
shellSpec.shell, ...shellSpec.flags, '-c', DIAGNOSTIC_SHELL_SCRIPT, '_',
|
|
177
|
+
opts.cwd,
|
|
178
|
+
opts.contentPath,
|
|
179
|
+
shellSpec.shell,
|
|
180
|
+
], {
|
|
181
|
+
stdio: 'ignore',
|
|
182
|
+
cwd: opts.cwd,
|
|
183
|
+
env: tmuxEnv(),
|
|
184
|
+
timeout: 5000,
|
|
185
|
+
});
|
|
186
|
+
configureTmuxSessionOptions(name);
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
logger.warn(`[tmux:${name}] failed to park diagnostic session: ${err instanceof Error ? err.message : err}`);
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
148
194
|
// ─── SessionBackend implementation ────────────────────────────────────────
|
|
149
195
|
spawn(bin, args, opts) {
|
|
150
196
|
this.reattaching = TmuxBackend.hasSession(this.sessionName);
|
|
@@ -241,22 +287,7 @@ export class TmuxBackend {
|
|
|
241
287
|
// backfill options added after the session was originally created.
|
|
242
288
|
// Setting an already-applied option is idempotent.
|
|
243
289
|
setTimeout(() => {
|
|
244
|
-
|
|
245
|
-
const t = shellescape(this.sessionName);
|
|
246
|
-
const env = tmuxEnv();
|
|
247
|
-
execSync(`tmux set-option -t ${t} status off`, { stdio: 'ignore', env });
|
|
248
|
-
execSync(`tmux set-option -t ${t} mouse on`, { stdio: 'ignore', env });
|
|
249
|
-
// set-clipboard is a server option — enable OSC 52 passthrough for web copy
|
|
250
|
-
execSync(`tmux set-option -s set-clipboard on`, { stdio: 'ignore', env });
|
|
251
|
-
execSync(`tmux set-option -t ${t} history-limit 50000`, { stdio: 'ignore', env });
|
|
252
|
-
// Prevent web terminal clients (smaller viewport) from shrinking the
|
|
253
|
-
// tmux window. If a web client at 80×24 causes tmux to resize the
|
|
254
|
-
// window down, reflowed content shifts buffer positions and the
|
|
255
|
-
// terminal renderer's baseline tracking breaks — historical output
|
|
256
|
-
// leaks into the streaming card.
|
|
257
|
-
execSync(`tmux set-option -t ${t} window-size largest`, { stdio: 'ignore', env });
|
|
258
|
-
}
|
|
259
|
-
catch { /* session may not be ready yet — benign */ }
|
|
290
|
+
configureTmuxSessionOptions(this.sessionName);
|
|
260
291
|
}, 500);
|
|
261
292
|
}
|
|
262
293
|
/** Whether the last spawn() re-attached to an existing tmux session. */
|
|
@@ -326,17 +357,35 @@ export class TmuxBackend {
|
|
|
326
357
|
*/
|
|
327
358
|
pasteText(text) {
|
|
328
359
|
this.exitCopyModeIfNeeded();
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
360
|
+
const bufferName = `botmux-${randomBytes(8).toString('hex')}`;
|
|
361
|
+
let loaded = false;
|
|
362
|
+
try {
|
|
363
|
+
execFileSync('tmux', ['load-buffer', '-b', bufferName, '-'], {
|
|
364
|
+
input: text,
|
|
365
|
+
stdio: ['pipe', 'ignore', 'ignore'],
|
|
366
|
+
timeout: 5000,
|
|
367
|
+
env: tmuxEnv(),
|
|
368
|
+
});
|
|
369
|
+
loaded = true;
|
|
370
|
+
execFileSync('tmux', ['paste-buffer', '-b', bufferName, '-t', this.cmdTarget, '-d', '-p'], {
|
|
371
|
+
stdio: 'ignore',
|
|
372
|
+
timeout: 5000,
|
|
373
|
+
env: tmuxEnv(),
|
|
374
|
+
});
|
|
375
|
+
loaded = false;
|
|
376
|
+
}
|
|
377
|
+
finally {
|
|
378
|
+
if (loaded) {
|
|
379
|
+
try {
|
|
380
|
+
execFileSync('tmux', ['delete-buffer', '-b', bufferName], {
|
|
381
|
+
stdio: 'ignore',
|
|
382
|
+
timeout: 1000,
|
|
383
|
+
env: tmuxEnv(),
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
catch { /* best-effort cleanup after a failed paste */ }
|
|
387
|
+
}
|
|
388
|
+
}
|
|
340
389
|
}
|
|
341
390
|
exitCopyModeIfNeeded() {
|
|
342
391
|
try {
|
|
@@ -552,6 +601,15 @@ export function buildBotmuxEnvAssignments(env, injectEnv) {
|
|
|
552
601
|
* bash/zsh/sh by resolveUserShell() so they hit the same SCRIPT path.
|
|
553
602
|
*/
|
|
554
603
|
export const SHELL_WRAPPER_SCRIPT = `cd -- "$1" && shift && ${REDACTED_ENV_UNSET_CLAUSE} && exec /usr/bin/env "$@"`;
|
|
604
|
+
export const DIAGNOSTIC_SHELL_SCRIPT = [
|
|
605
|
+
'cd -- "$1" 2>/dev/null || cd "$HOME" 2>/dev/null || cd /',
|
|
606
|
+
REDACTED_ENV_UNSET_CLAUSE,
|
|
607
|
+
'clear',
|
|
608
|
+
`printf '\\033[1;31m[botmux] Agent CLI exited. Auto-restart is paused and the last terminal output is preserved below.\\033[0m\\n\\n'`,
|
|
609
|
+
'cat -- "$2" 2>/dev/null || true',
|
|
610
|
+
`printf '\\n\\033[1;33m[botmux] Fix the startup error, then send a new message to retry. Type exit to close this diagnostic shell.\\033[0m\\n'`,
|
|
611
|
+
'exec "$3" -i',
|
|
612
|
+
].join('; ');
|
|
555
613
|
/**
|
|
556
614
|
* Debug variant of the wrapper script — same prelude, but the CLI runs as
|
|
557
615
|
* a *child* (no `exec`) and the wrapper hands off to an interactive shell
|
|
@@ -594,6 +652,23 @@ function specForKind(shell, kind) {
|
|
|
594
652
|
// 'sh' adds nothing — POSIX sh has no portable interactive rcfile.
|
|
595
653
|
return { shell, flags };
|
|
596
654
|
}
|
|
655
|
+
function configureTmuxSessionOptions(sessionName) {
|
|
656
|
+
try {
|
|
657
|
+
const t = shellescape(sessionName);
|
|
658
|
+
const env = tmuxEnv();
|
|
659
|
+
execSync(`tmux set-option -t ${t} status off`, { stdio: 'ignore', env });
|
|
660
|
+
execSync(`tmux set-option -t ${t} mouse on`, { stdio: 'ignore', env });
|
|
661
|
+
// set-clipboard is a server option — enable OSC 52 passthrough for web copy
|
|
662
|
+
execSync(`tmux set-option -s set-clipboard on`, { stdio: 'ignore', env });
|
|
663
|
+
execSync(`tmux set-option -t ${t} history-limit 50000`, { stdio: 'ignore', env });
|
|
664
|
+
// Prevent web terminal clients (smaller viewport) from shrinking the
|
|
665
|
+
// tmux window. If a web client at 80x24 causes tmux to resize the window
|
|
666
|
+
// down, reflowed content shifts buffer positions and historical output
|
|
667
|
+
// leaks into the streaming card.
|
|
668
|
+
execSync(`tmux set-option -t ${t} window-size largest`, { stdio: 'ignore', env });
|
|
669
|
+
}
|
|
670
|
+
catch { /* session may not be ready yet — benign */ }
|
|
671
|
+
}
|
|
597
672
|
/** Classify a shell binary path by basename. Returns null for shells whose
|
|
598
673
|
* syntax we don't support (fish, nu, csh, tcsh, ...). */
|
|
599
674
|
function classifyShell(path) {
|
|
@@ -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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"}
|
|
@@ -62,6 +62,10 @@ export declare class TmuxPipeBackend implements SessionBackend {
|
|
|
62
62
|
private static readonly RECENT_OUTPUT_MAX;
|
|
63
63
|
private readonly exitCbs;
|
|
64
64
|
private lifecycleTimer;
|
|
65
|
+
/** Debounce transient pane-probe failures so one flaky `tmux display-message`
|
|
66
|
+
* (timeout / server hiccup under fd pressure) doesn't tear down an adopted
|
|
67
|
+
* pane that's still alive. See recordPaneProbe. (pid-death stays decisive.) */
|
|
68
|
+
private readonly livenessGate;
|
|
65
69
|
private cols;
|
|
66
70
|
private rows;
|
|
67
71
|
private exited;
|
|
@@ -150,6 +154,22 @@ export declare class TmuxPipeBackend implements SessionBackend {
|
|
|
150
154
|
getChildPid(): number | null;
|
|
151
155
|
getAttachInfo(): null;
|
|
152
156
|
private startLifecycleWatcher;
|
|
157
|
+
/** Is the pane still addressable in tmux? This `display-message` IS the flaky,
|
|
158
|
+
* fd/server-dependent signal (command timeout / busy server under EMFILE) —
|
|
159
|
+
* which is why recordPaneProbe debounces it. `timeoutMs` lets the final
|
|
160
|
+
* confirm wait longer than the 1s poll so an overloaded server can still
|
|
161
|
+
* answer before we declare a live pane dead. */
|
|
162
|
+
private isPaneAddressable;
|
|
163
|
+
/**
|
|
164
|
+
* Debounce the (flaky) pane-addressability probe. Tearing down on the FIRST
|
|
165
|
+
* failed probe produced the spurious "⏏ /adopt的 CLI 会话已断开" — a tmux command
|
|
166
|
+
* timeout / busy server (e.g. under EMFILE fd pressure) momentarily fails the
|
|
167
|
+
* probe while the pane is still alive and the CLI still receiving messages.
|
|
168
|
+
* Only after ADOPT_LIVENESS_MAX_FAILURES consecutive failures, AND a final
|
|
169
|
+
* lenient-timeout re-probe that still fails, do we detach. Any success resets.
|
|
170
|
+
* (pid-death is handled decisively in the watcher — see startLifecycleWatcher.)
|
|
171
|
+
*/
|
|
172
|
+
private recordPaneProbe;
|
|
153
173
|
private stopLifecycleWatcher;
|
|
154
174
|
private handlePaneExit;
|
|
155
175
|
private createDetachedSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux-pipe-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-pipe-backend.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tmux-pipe-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/tmux-pipe-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ import { randomBytes } from 'node:crypto';
|
|
|
31
31
|
import { StringDecoder } from 'node:string_decoder';
|
|
32
32
|
import { tmuxEnv } from '../../setup/ensure-tmux.js';
|
|
33
33
|
import { buildBotmuxEnvAssignments, resolveUserShell, SHELL_WRAPPER_SCRIPT, TmuxBackend } from './tmux-backend.js';
|
|
34
|
+
import { LivenessGate, ADOPT_LIVENESS_MAX_FAILURES } from './liveness-gate.js';
|
|
34
35
|
function shellescape(s) {
|
|
35
36
|
// Single-quote-escape, replacing internal ' with '\''
|
|
36
37
|
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
@@ -102,6 +103,10 @@ export class TmuxPipeBackend {
|
|
|
102
103
|
static RECENT_OUTPUT_MAX = 4096;
|
|
103
104
|
exitCbs = [];
|
|
104
105
|
lifecycleTimer = null;
|
|
106
|
+
/** Debounce transient pane-probe failures so one flaky `tmux display-message`
|
|
107
|
+
* (timeout / server hiccup under fd pressure) doesn't tear down an adopted
|
|
108
|
+
* pane that's still alive. See recordPaneProbe. (pid-death stays decisive.) */
|
|
109
|
+
livenessGate = new LivenessGate(ADOPT_LIVENESS_MAX_FAILURES);
|
|
105
110
|
cols = 200;
|
|
106
111
|
rows = 50;
|
|
107
112
|
exited = false;
|
|
@@ -248,18 +253,36 @@ export class TmuxPipeBackend {
|
|
|
248
253
|
if (this.exited)
|
|
249
254
|
return;
|
|
250
255
|
this.exitCopyModeIfNeeded();
|
|
256
|
+
const bufferName = `botmux-${randomBytes(8).toString('hex')}`;
|
|
251
257
|
this.guardedSend('paste-buffer', () => {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
258
|
+
let loaded = false;
|
|
259
|
+
try {
|
|
260
|
+
execFileSync('tmux', ['load-buffer', '-b', bufferName, '-'], {
|
|
261
|
+
input: text,
|
|
262
|
+
stdio: ['pipe', 'ignore', 'ignore'],
|
|
263
|
+
timeout: 5000,
|
|
264
|
+
env: tmuxEnv(),
|
|
265
|
+
});
|
|
266
|
+
loaded = true;
|
|
267
|
+
execFileSync('tmux', ['paste-buffer', '-b', bufferName, '-t', this.paneTarget, '-d', '-p'], {
|
|
268
|
+
stdio: 'ignore',
|
|
269
|
+
timeout: 5000,
|
|
270
|
+
env: tmuxEnv(),
|
|
271
|
+
});
|
|
272
|
+
loaded = false;
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
if (loaded) {
|
|
276
|
+
try {
|
|
277
|
+
execFileSync('tmux', ['delete-buffer', '-b', bufferName], {
|
|
278
|
+
stdio: 'ignore',
|
|
279
|
+
timeout: 1000,
|
|
280
|
+
env: tmuxEnv(),
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
catch { /* best-effort cleanup after a failed paste */ }
|
|
284
|
+
}
|
|
285
|
+
}
|
|
263
286
|
});
|
|
264
287
|
}
|
|
265
288
|
/**
|
|
@@ -427,24 +450,67 @@ export class TmuxPipeBackend {
|
|
|
427
450
|
// ─── Pipe-specific helpers ────────────────────────────────────────────────
|
|
428
451
|
startLifecycleWatcher() {
|
|
429
452
|
this.stopLifecycleWatcher();
|
|
453
|
+
this.livenessGate.reset();
|
|
430
454
|
this.lifecycleTimer = setInterval(() => {
|
|
431
455
|
if (this.exited)
|
|
432
456
|
return;
|
|
457
|
+
// The watched CLI pid (adopt mode) is a pure process.kill(pid,0) syscall —
|
|
458
|
+
// it can only report ESRCH (gone) or EPERM (alive), never a transient
|
|
459
|
+
// timeout / EMFILE failure. So pid-death is DECISIVE: tear down at once.
|
|
460
|
+
// This keeps the ≤1s guard against routing Lark input into the user's bare
|
|
461
|
+
// shell after the CLI exits to a still-alive pane. Only the flaky pane
|
|
462
|
+
// probe below gets debounced.
|
|
433
463
|
if (!this.isCliPidAlive()) {
|
|
434
464
|
process.stderr.write(`[tmux-pipe-backend] adopted CLI pid ${this.watchCliPid} exited; detaching observer\n`);
|
|
435
465
|
this.handlePaneExit();
|
|
436
466
|
return;
|
|
437
467
|
}
|
|
438
|
-
|
|
439
|
-
const paneId = execSync(`tmux display-message -p -t ${shellescape(this.paneTarget)} '#{pane_id}'`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 2000, env: tmuxEnv() }).trim();
|
|
440
|
-
if (!paneId)
|
|
441
|
-
this.handlePaneExit();
|
|
442
|
-
}
|
|
443
|
-
catch {
|
|
444
|
-
this.handlePaneExit();
|
|
445
|
-
}
|
|
468
|
+
this.recordPaneProbe(this.isPaneAddressable(2000));
|
|
446
469
|
}, 1000);
|
|
447
470
|
}
|
|
471
|
+
/** Is the pane still addressable in tmux? This `display-message` IS the flaky,
|
|
472
|
+
* fd/server-dependent signal (command timeout / busy server under EMFILE) —
|
|
473
|
+
* which is why recordPaneProbe debounces it. `timeoutMs` lets the final
|
|
474
|
+
* confirm wait longer than the 1s poll so an overloaded server can still
|
|
475
|
+
* answer before we declare a live pane dead. */
|
|
476
|
+
isPaneAddressable(timeoutMs) {
|
|
477
|
+
try {
|
|
478
|
+
const paneId = execSync(`tmux display-message -p -t ${shellescape(this.paneTarget)} '#{pane_id}'`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: timeoutMs, env: tmuxEnv() }).trim();
|
|
479
|
+
return paneId.length > 0;
|
|
480
|
+
}
|
|
481
|
+
catch {
|
|
482
|
+
return false;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Debounce the (flaky) pane-addressability probe. Tearing down on the FIRST
|
|
487
|
+
* failed probe produced the spurious "⏏ /adopt的 CLI 会话已断开" — a tmux command
|
|
488
|
+
* timeout / busy server (e.g. under EMFILE fd pressure) momentarily fails the
|
|
489
|
+
* probe while the pane is still alive and the CLI still receiving messages.
|
|
490
|
+
* Only after ADOPT_LIVENESS_MAX_FAILURES consecutive failures, AND a final
|
|
491
|
+
* lenient-timeout re-probe that still fails, do we detach. Any success resets.
|
|
492
|
+
* (pid-death is handled decisively in the watcher — see startLifecycleWatcher.)
|
|
493
|
+
*/
|
|
494
|
+
recordPaneProbe(alive) {
|
|
495
|
+
if (this.exited)
|
|
496
|
+
return;
|
|
497
|
+
if (!this.livenessGate.record(alive)) {
|
|
498
|
+
if (!alive) {
|
|
499
|
+
process.stderr.write(`[tmux-pipe-backend] adopt pane probe failed (${this.livenessGate.consecutiveFailures}/${ADOPT_LIVENESS_MAX_FAILURES}); retrying before teardown\n`);
|
|
500
|
+
}
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
// Threshold reached — one final authoritative probe with a more lenient
|
|
504
|
+
// timeout so a transiently overloaded tmux server gets a fair chance to
|
|
505
|
+
// answer before we detach a pane that's actually still alive.
|
|
506
|
+
if (this.isPaneAddressable(3000)) {
|
|
507
|
+
this.livenessGate.reset();
|
|
508
|
+
process.stderr.write('[tmux-pipe-backend] adopt pane recovered on final check; staying attached\n');
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
process.stderr.write(`[tmux-pipe-backend] adopted pane gone after ${ADOPT_LIVENESS_MAX_FAILURES} consecutive probe failures; detaching observer\n`);
|
|
512
|
+
this.handlePaneExit();
|
|
513
|
+
}
|
|
448
514
|
stopLifecycleWatcher() {
|
|
449
515
|
if (this.lifecycleTimer) {
|
|
450
516
|
clearInterval(this.lifecycleTimer);
|