botmux 2.55.0 → 2.56.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/dist/adapters/backend/herdr-backend.d.ts +80 -0
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -0
- package/dist/adapters/backend/herdr-backend.js +519 -0
- package/dist/adapters/backend/herdr-backend.js.map +1 -0
- package/dist/adapters/backend/session-backend-selector.d.ts +2 -2
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +19 -1
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +29 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +51 -4
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +7 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +11 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/bot-registry.d.ts +2 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +262 -15
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -3
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +12 -7
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/pending-response.d.ts +16 -1
- package/dist/core/pending-response.d.ts.map +1 -1
- package/dist/core/pending-response.js +19 -1
- package/dist/core/pending-response.js.map +1 -1
- package/dist/core/session-discovery.d.ts +20 -4
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +228 -72
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +77 -45
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +8 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +74 -62
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.js +4 -4
- package/dist/daemon.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 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +19 -2
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +5 -3
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.js +3 -3
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/setup/agent-preset.d.ts +78 -0
- package/dist/setup/agent-preset.d.ts.map +1 -0
- package/dist/setup/agent-preset.js +127 -0
- package/dist/setup/agent-preset.js.map +1 -0
- package/dist/setup/bot-config-editor.js +2 -2
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/ensure-herdr-integrations.d.ts +26 -0
- package/dist/setup/ensure-herdr-integrations.d.ts.map +1 -0
- package/dist/setup/ensure-herdr-integrations.js +127 -0
- package/dist/setup/ensure-herdr-integrations.js.map +1 -0
- package/dist/setup/ensure-herdr.d.ts +12 -0
- package/dist/setup/ensure-herdr.d.ts.map +1 -0
- package/dist/setup/ensure-herdr.js +70 -0
- package/dist/setup/ensure-herdr.js.map +1 -0
- package/dist/setup/ensure-opus.d.ts +13 -0
- package/dist/setup/ensure-opus.d.ts.map +1 -0
- package/dist/setup/ensure-opus.js +64 -0
- package/dist/setup/ensure-opus.js.map +1 -0
- package/dist/setup/ensure-tmux.d.ts +13 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -1
- package/dist/setup/ensure-tmux.js +4 -4
- package/dist/setup/ensure-tmux.js.map +1 -1
- package/dist/setup/index.d.ts +4 -0
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +78 -1
- package/dist/setup/index.js.map +1 -1
- package/dist/types.d.ts +14 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/transient-snapshot.d.ts +3 -3
- package/dist/utils/transient-snapshot.js +3 -3
- package/dist/worker.js +251 -179
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts +2 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/definition.d.ts +22 -22
- package/package.json +1 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { BackendType, SessionBackend, SpawnOpts } from './types.js';
|
|
2
|
+
export type PersistentBackendType = Exclude<BackendType, 'pty'>;
|
|
3
|
+
export interface HerdrExternalTarget {
|
|
4
|
+
sessionName: string;
|
|
5
|
+
target: string;
|
|
6
|
+
paneId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class HerdrBackend implements SessionBackend {
|
|
9
|
+
private readonly sessionName;
|
|
10
|
+
private readonly opts;
|
|
11
|
+
private serverProcess;
|
|
12
|
+
private pollTimer;
|
|
13
|
+
private statusWaitProcesses;
|
|
14
|
+
private readonly dataCbs;
|
|
15
|
+
private readonly exitCbs;
|
|
16
|
+
private readonly agentName;
|
|
17
|
+
private paneId;
|
|
18
|
+
private lastText;
|
|
19
|
+
private exited;
|
|
20
|
+
private started;
|
|
21
|
+
private cols;
|
|
22
|
+
private rows;
|
|
23
|
+
private agentProbeFailures;
|
|
24
|
+
private childEnv;
|
|
25
|
+
claudeJsonlPath?: string;
|
|
26
|
+
cliPid?: number;
|
|
27
|
+
cliCwd?: string;
|
|
28
|
+
constructor(sessionName: string, opts?: {
|
|
29
|
+
createSession?: boolean;
|
|
30
|
+
isReattach?: boolean;
|
|
31
|
+
externalTarget?: HerdrExternalTarget;
|
|
32
|
+
});
|
|
33
|
+
static isAvailable(): boolean;
|
|
34
|
+
static sessionName(sessionId: string): string;
|
|
35
|
+
static hasSession(name: string): boolean;
|
|
36
|
+
static killSession(name: string): void;
|
|
37
|
+
static listBotmuxSessions(): string[];
|
|
38
|
+
get isReattach(): boolean;
|
|
39
|
+
spawn(bin: string, args: string[], opts: SpawnOpts): void;
|
|
40
|
+
write(data: string): void;
|
|
41
|
+
sendText(text: string): void;
|
|
42
|
+
sendSpecialKeys(...keys: string[]): void;
|
|
43
|
+
pasteText(text: string): void;
|
|
44
|
+
resize(cols: number, rows: number): void;
|
|
45
|
+
onData(cb: (data: string) => void): void;
|
|
46
|
+
onExit(cb: (code: number | null, signal: string | null) => void): void;
|
|
47
|
+
kill(): void;
|
|
48
|
+
destroySession(): void;
|
|
49
|
+
getChildPid(): number | null;
|
|
50
|
+
getAttachInfo(): null;
|
|
51
|
+
captureCurrentScreen(): string;
|
|
52
|
+
captureViewport(): string;
|
|
53
|
+
getPaneSize(): {
|
|
54
|
+
cols: number;
|
|
55
|
+
rows: number;
|
|
56
|
+
} | null;
|
|
57
|
+
private ensureServer;
|
|
58
|
+
private getAgent;
|
|
59
|
+
private listAgents;
|
|
60
|
+
private readVisibleAnsi;
|
|
61
|
+
private readRecentAnsi;
|
|
62
|
+
private startPolling;
|
|
63
|
+
private stopPolling;
|
|
64
|
+
private poll;
|
|
65
|
+
/** Read herdr pane recent output and emit the delta vs. last snapshot. */
|
|
66
|
+
private readAndEmitDelta;
|
|
67
|
+
/**
|
|
68
|
+
* Spawn one `herdr wait agent-status` child per "result settled" status
|
|
69
|
+
* (done / blocked / idle). The first to fire wins → we read+emit, then
|
|
70
|
+
* tear down the losers and re-arm a fresh cohort. Parallel watchers are
|
|
71
|
+
* needed because the herdr CLI only accepts one --status at a time, and
|
|
72
|
+
* we genuinely care about all three transitions: `done` is "turn finished
|
|
73
|
+
* with output", `blocked` is "agent wants user input", `idle` is the
|
|
74
|
+
* degraded form of done after herdr's UI marks it seen.
|
|
75
|
+
*/
|
|
76
|
+
private startStatusWatcher;
|
|
77
|
+
private stopStatusWatcher;
|
|
78
|
+
private handleExit;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=herdr-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"herdr-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/herdr-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
2
|
+
// Slow output-streaming poll. We deliberately avoid the original 250ms tick:
|
|
3
|
+
// herdr exposes `wait agent-status`, which we use to fire an immediate read on
|
|
4
|
+
// every idle/working/blocked transition. The 500ms timer is a fallback for the
|
|
5
|
+
// in-the-middle-of-working case where output streams without a status flip.
|
|
6
|
+
const POLL_INTERVAL_MS = 500;
|
|
7
|
+
const READ_LINES = 10_000;
|
|
8
|
+
const MAX_AGENT_PROBE_FAILURES = 3;
|
|
9
|
+
// Inter-attempt sleep while waiting for `herdr server` to come up.
|
|
10
|
+
// Synchronous (execFileSync 'sleep') because spawn() must stay sync.
|
|
11
|
+
const SERVER_BOOT_POLL_MS = 100;
|
|
12
|
+
const SERVER_BOOT_DEADLINE_MS = 5000;
|
|
13
|
+
// `herdr wait agent-status` blocks until a transition; we cap it so a
|
|
14
|
+
// long-stuck agent still re-arms the watcher and we never accumulate an
|
|
15
|
+
// indefinitely-orphaned subprocess on process teardown.
|
|
16
|
+
const STATUS_WAIT_TIMEOUT_MS = 30_000;
|
|
17
|
+
// States we treat as "result settled — flush the pane now". `done` and
|
|
18
|
+
// `blocked` are the user-facing signals (turn finished / input requested);
|
|
19
|
+
// `idle` is the degraded form of `done` after the herdr UI marks it seen,
|
|
20
|
+
// included because we read via the socket API and herdr may not register
|
|
21
|
+
// our reads as "seeing" → without it the watcher could miss legitimate
|
|
22
|
+
// turn completions. `working` is intentionally absent: we don't need an
|
|
23
|
+
// event for "started streaming", the slow timer covers that path.
|
|
24
|
+
const SETTLED_STATUSES = ['done', 'blocked', 'idle'];
|
|
25
|
+
function tryJsonCommand(args, opts) {
|
|
26
|
+
try {
|
|
27
|
+
const out = execFileSync('herdr', args, {
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
input: opts?.input,
|
|
30
|
+
stdio: opts?.input === undefined ? ['ignore', 'pipe', 'pipe'] : ['pipe', 'pipe', 'pipe'],
|
|
31
|
+
timeout: opts?.timeout ?? 5000,
|
|
32
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
33
|
+
env: opts?.env,
|
|
34
|
+
}).trim();
|
|
35
|
+
return { ok: true, value: out ? JSON.parse(out) : undefined };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return { ok: false };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function jsonCommand(args, opts) {
|
|
42
|
+
const result = tryJsonCommand(args, opts);
|
|
43
|
+
return result.ok ? result.value : undefined;
|
|
44
|
+
}
|
|
45
|
+
function runHerdr(args, opts) {
|
|
46
|
+
try {
|
|
47
|
+
execFileSync('herdr', args, {
|
|
48
|
+
input: opts?.input,
|
|
49
|
+
stdio: opts?.input === undefined ? 'ignore' : ['pipe', 'ignore', 'ignore'],
|
|
50
|
+
timeout: opts?.timeout ?? 5000,
|
|
51
|
+
});
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function herdrSessionArgs(sessionName, args) {
|
|
59
|
+
return ['--session', sessionName, ...args];
|
|
60
|
+
}
|
|
61
|
+
function extractAgent(raw) {
|
|
62
|
+
return raw?.result?.agent;
|
|
63
|
+
}
|
|
64
|
+
function extractAgents(raw) {
|
|
65
|
+
const agents = raw?.result?.agents;
|
|
66
|
+
return Array.isArray(agents) ? agents : [];
|
|
67
|
+
}
|
|
68
|
+
// Whether a matched `agent list` row represents an exited CLI. Verified against
|
|
69
|
+
// herdr v0.6.6: a live agent carries `agent_status` ('unknown' | 'working' |
|
|
70
|
+
// 'idle' | 'blocked' | 'done'); once the underlying process exits, herdr drops
|
|
71
|
+
// the row entirely (so absence — handled by the caller — is the primary exit
|
|
72
|
+
// signal). We still defensively treat an explicit terminal marker as exited so
|
|
73
|
+
// a future herdr that keeps a tombstone row (e.g. agent_status:'exited' or a
|
|
74
|
+
// running:false / status fields) doesn't hang the session.
|
|
75
|
+
function agentRowExited(agent) {
|
|
76
|
+
return agent?.agent_status === 'exited'
|
|
77
|
+
|| agent?.status === 'exited'
|
|
78
|
+
|| agent?.running === false;
|
|
79
|
+
}
|
|
80
|
+
function extractReadText(raw) {
|
|
81
|
+
return typeof raw?.result?.read?.text === 'string' ? raw.result.read.text : '';
|
|
82
|
+
}
|
|
83
|
+
function longestSuffixPrefix(previous, next) {
|
|
84
|
+
const max = Math.min(previous.length, next.length);
|
|
85
|
+
for (let len = max; len > 0; len--) {
|
|
86
|
+
if (previous.endsWith(next.slice(0, len)))
|
|
87
|
+
return len;
|
|
88
|
+
}
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
export class HerdrBackend {
|
|
92
|
+
sessionName;
|
|
93
|
+
opts;
|
|
94
|
+
serverProcess = null;
|
|
95
|
+
pollTimer = null;
|
|
96
|
+
statusWaitProcesses = [];
|
|
97
|
+
dataCbs = [];
|
|
98
|
+
exitCbs = [];
|
|
99
|
+
agentName = 'botmux';
|
|
100
|
+
paneId;
|
|
101
|
+
lastText = '';
|
|
102
|
+
exited = false;
|
|
103
|
+
started = false;
|
|
104
|
+
cols = 200;
|
|
105
|
+
rows = 50;
|
|
106
|
+
agentProbeFailures = 0;
|
|
107
|
+
childEnv;
|
|
108
|
+
claudeJsonlPath;
|
|
109
|
+
cliPid;
|
|
110
|
+
cliCwd;
|
|
111
|
+
constructor(sessionName, opts = {}) {
|
|
112
|
+
this.sessionName = sessionName;
|
|
113
|
+
this.opts = opts;
|
|
114
|
+
if (opts.externalTarget?.paneId)
|
|
115
|
+
this.paneId = opts.externalTarget.paneId;
|
|
116
|
+
}
|
|
117
|
+
static isAvailable() {
|
|
118
|
+
try {
|
|
119
|
+
execFileSync('herdr', ['--version'], { stdio: 'ignore', timeout: 3000 });
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
static sessionName(sessionId) {
|
|
127
|
+
return `bmx-${sessionId.slice(0, 8)}`;
|
|
128
|
+
}
|
|
129
|
+
static hasSession(name) {
|
|
130
|
+
const raw = jsonCommand(['session', 'list', '--json']);
|
|
131
|
+
return extractSessions(raw).some((s) => s?.name === name && s?.running === true);
|
|
132
|
+
}
|
|
133
|
+
static killSession(name) {
|
|
134
|
+
// stop AND delete. `session stop` alone leaves the session dir + agent
|
|
135
|
+
// metadata on disk (verified on herdr v0.6.6: the session lingers with
|
|
136
|
+
// running:false). When the server is later rebooted for the same name —
|
|
137
|
+
// e.g. the resume:true respawn after a /restart — herdr AUTO-RESTORES the
|
|
138
|
+
// old `botmux` agent row pointing at a DEAD pane. spawn()'s reuse branch
|
|
139
|
+
// would then treat that zombie as a live agent, skip `agent start`, and the
|
|
140
|
+
// new CLI would never run (the pane shows only a shell prompt). Deleting
|
|
141
|
+
// the session clears that metadata so the next spawn starts clean.
|
|
142
|
+
runHerdr(['session', 'stop', name, '--json'], { timeout: 5000 });
|
|
143
|
+
runHerdr(['session', 'delete', name, '--json'], { timeout: 5000 });
|
|
144
|
+
}
|
|
145
|
+
static listBotmuxSessions() {
|
|
146
|
+
const raw = jsonCommand(['session', 'list', '--json']);
|
|
147
|
+
return extractSessions(raw)
|
|
148
|
+
.map((s) => typeof s?.name === 'string' ? s.name : '')
|
|
149
|
+
.filter((name) => name.startsWith('bmx-'));
|
|
150
|
+
}
|
|
151
|
+
get isReattach() {
|
|
152
|
+
return this.opts.isReattach ?? false;
|
|
153
|
+
}
|
|
154
|
+
spawn(bin, args, opts) {
|
|
155
|
+
this.cols = opts.cols;
|
|
156
|
+
this.rows = opts.rows;
|
|
157
|
+
this.cliCwd = opts.cwd;
|
|
158
|
+
// worker.ts builds opts.env via redactChildEnv() (drops bare LARK_APP_*)
|
|
159
|
+
// and injects BOTMUX_SESSION_ID/CHAT_ID/LARK_APP_ID/ROOT_MESSAGE_ID. We
|
|
160
|
+
// must thread this env into the herdr daemon spawn AND the agent-start
|
|
161
|
+
// call so the CLI inside herdr sees the same env the PTY/tmux backends
|
|
162
|
+
// would have given it. Otherwise:
|
|
163
|
+
// - botmux send/ask in the CLI see no BOTMUX_* and exit 2
|
|
164
|
+
// - the worker's bare LARK_APP_SECRET (still in process.env) leaks
|
|
165
|
+
// into the CLI process via plain process.env inheritance
|
|
166
|
+
// Skip on externalTarget: that's the user's own pre-existing herdr
|
|
167
|
+
// session; we can't (and shouldn't) re-env an already-running CLI.
|
|
168
|
+
this.childEnv = this.opts.externalTarget ? undefined : { ...opts.env };
|
|
169
|
+
this.ensureServer();
|
|
170
|
+
const external = this.opts.externalTarget;
|
|
171
|
+
if (external) {
|
|
172
|
+
this.paneId = external.paneId ?? external.target;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// Reuse an existing `botmux` agent ONLY when we're genuinely re-attaching
|
|
176
|
+
// to a still-alive session (daemon restart while the herdr server kept
|
|
177
|
+
// running). On a fresh start — including the resume:true respawn after a
|
|
178
|
+
// /restart — we must always `agent start` the new CLI. Reusing here is
|
|
179
|
+
// what made /restart silently no-op: herdr can resurrect a dead `botmux`
|
|
180
|
+
// row from persisted metadata, and reuse would skip `agent start` so the
|
|
181
|
+
// new command never ran. killSession() now deletes that metadata, but we
|
|
182
|
+
// also gate reuse on isReattach so a stale row can never be adopted.
|
|
183
|
+
const existing = this.isReattach ? this.getAgent() : undefined;
|
|
184
|
+
if (existing) {
|
|
185
|
+
this.paneId = existing.pane_id;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const started = jsonCommand(herdrSessionArgs(this.sessionName, [
|
|
189
|
+
'agent', 'start', this.agentName,
|
|
190
|
+
'--cwd', opts.cwd,
|
|
191
|
+
'--', bin, ...args,
|
|
192
|
+
]), { timeout: 10_000, env: this.childEnv });
|
|
193
|
+
const agent = extractAgent(started);
|
|
194
|
+
if (!agent)
|
|
195
|
+
throw new Error(`failed to start herdr agent ${this.agentName} in ${this.sessionName}`);
|
|
196
|
+
this.paneId = agent.pane_id;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
this.started = true;
|
|
200
|
+
// Baseline policy mirrors the tmux/PTY backends:
|
|
201
|
+
// - Fresh spawn: lastText='' so the first poll emits everything from
|
|
202
|
+
// t=0 (matches the PTY contract — listeners see all output even if
|
|
203
|
+
// the agent echoed before the first read).
|
|
204
|
+
// - Re-attach / external adopt: snapshot the current screen so we only
|
|
205
|
+
// stream new deltas. Worker.ts explicitly seeds the initial screen
|
|
206
|
+
// via captureCurrentScreen() in those paths.
|
|
207
|
+
this.lastText = (this.isReattach || this.opts.externalTarget) ? this.readRecentAnsi() : '';
|
|
208
|
+
this.startPolling();
|
|
209
|
+
this.startStatusWatcher();
|
|
210
|
+
}
|
|
211
|
+
write(data) {
|
|
212
|
+
if (this.exited)
|
|
213
|
+
return;
|
|
214
|
+
const target = this.paneId ?? this.agentName;
|
|
215
|
+
runHerdr(herdrSessionArgs(this.sessionName, ['pane', 'send-text', target, data]), { timeout: 5000 });
|
|
216
|
+
}
|
|
217
|
+
sendText(text) {
|
|
218
|
+
this.write(text);
|
|
219
|
+
}
|
|
220
|
+
sendSpecialKeys(...keys) {
|
|
221
|
+
if (this.exited)
|
|
222
|
+
return;
|
|
223
|
+
const target = this.paneId ?? this.agentName;
|
|
224
|
+
runHerdr(herdrSessionArgs(this.sessionName, ['pane', 'send-keys', target, ...keys]), { timeout: 5000 });
|
|
225
|
+
}
|
|
226
|
+
pasteText(text) {
|
|
227
|
+
this.write(text);
|
|
228
|
+
}
|
|
229
|
+
resize(cols, rows) {
|
|
230
|
+
this.cols = cols;
|
|
231
|
+
this.rows = rows;
|
|
232
|
+
}
|
|
233
|
+
onData(cb) {
|
|
234
|
+
this.dataCbs.push(cb);
|
|
235
|
+
}
|
|
236
|
+
onExit(cb) {
|
|
237
|
+
this.exitCbs.push(cb);
|
|
238
|
+
}
|
|
239
|
+
kill() {
|
|
240
|
+
if (this.exited)
|
|
241
|
+
return;
|
|
242
|
+
this.exited = true;
|
|
243
|
+
this.stopPolling();
|
|
244
|
+
this.stopStatusWatcher();
|
|
245
|
+
this.serverProcess = null;
|
|
246
|
+
}
|
|
247
|
+
destroySession() {
|
|
248
|
+
this.kill();
|
|
249
|
+
// Only tear down the herdr session if botmux owns it. An adopted external
|
|
250
|
+
// target (externalTarget) is the user's own herdr session — botmux merely
|
|
251
|
+
// observes it, so /close must detach (kill) without stopping their CLI.
|
|
252
|
+
// Mirrors TmuxPipeBackend's ownsSession guard.
|
|
253
|
+
if (!this.opts.externalTarget) {
|
|
254
|
+
HerdrBackend.killSession(this.sessionName);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
getChildPid() {
|
|
258
|
+
return this.cliPid ?? null;
|
|
259
|
+
}
|
|
260
|
+
getAttachInfo() {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
captureCurrentScreen() {
|
|
264
|
+
return this.readRecentAnsi();
|
|
265
|
+
}
|
|
266
|
+
captureViewport() {
|
|
267
|
+
return this.readVisibleAnsi();
|
|
268
|
+
}
|
|
269
|
+
getPaneSize() {
|
|
270
|
+
return { cols: this.cols, rows: this.rows };
|
|
271
|
+
}
|
|
272
|
+
ensureServer() {
|
|
273
|
+
if (HerdrBackend.hasSession(this.sessionName))
|
|
274
|
+
return;
|
|
275
|
+
if (this.opts.externalTarget)
|
|
276
|
+
throw new Error(`herdr session ${this.sessionName} is not running`);
|
|
277
|
+
// Pass childEnv to the herdr daemon: the daemon forks the agent CLI as
|
|
278
|
+
// its own child, so the daemon's env is what the CLI ultimately
|
|
279
|
+
// inherits. Without this, the CLI would see worker.ts process.env (bare
|
|
280
|
+
// LARK_APP_SECRET, no BOTMUX_*).
|
|
281
|
+
this.serverProcess = spawn('herdr', ['--session', this.sessionName, 'server'], {
|
|
282
|
+
stdio: 'ignore',
|
|
283
|
+
detached: true,
|
|
284
|
+
env: this.childEnv,
|
|
285
|
+
});
|
|
286
|
+
this.serverProcess.unref();
|
|
287
|
+
// Bounded poll with sleeps so we don't pin a core spamming `session list`
|
|
288
|
+
// while the herdr server is still binding its socket.
|
|
289
|
+
const deadline = Date.now() + SERVER_BOOT_DEADLINE_MS;
|
|
290
|
+
while (Date.now() < deadline) {
|
|
291
|
+
if (HerdrBackend.hasSession(this.sessionName))
|
|
292
|
+
return;
|
|
293
|
+
sleepSync(SERVER_BOOT_POLL_MS);
|
|
294
|
+
}
|
|
295
|
+
throw new Error(`failed to start herdr session ${this.sessionName}`);
|
|
296
|
+
}
|
|
297
|
+
getAgent() {
|
|
298
|
+
const raw = jsonCommand(herdrSessionArgs(this.sessionName, ['agent', 'get', this.agentName]), { timeout: 5000 });
|
|
299
|
+
return extractAgent(raw);
|
|
300
|
+
}
|
|
301
|
+
listAgents() {
|
|
302
|
+
const raw = tryJsonCommand(herdrSessionArgs(this.sessionName, ['agent', 'list']), { timeout: 5000 });
|
|
303
|
+
return raw.ok ? extractAgents(raw.value) : null;
|
|
304
|
+
}
|
|
305
|
+
// NOTE: we use `agent read` (not `pane read`) for capture. Both accept the
|
|
306
|
+
// same target shapes (pane_id, agent name, terminal_id), but `pane read`
|
|
307
|
+
// prints raw text while `agent read` prints JSON with `result.read.text`.
|
|
308
|
+
// Routing reads through JSON keeps the parsing path uniform with the rest
|
|
309
|
+
// of the herdr CLI surface and gives us a hard "did the call succeed"
|
|
310
|
+
// signal instead of treating raw bytes as opaque text.
|
|
311
|
+
readVisibleAnsi() {
|
|
312
|
+
const target = this.paneId ?? this.agentName;
|
|
313
|
+
return extractReadText(jsonCommand(herdrSessionArgs(this.sessionName, ['agent', 'read', target, '--source', 'visible', '--lines', String(this.rows), '--format', 'ansi']), { timeout: 5000 }));
|
|
314
|
+
}
|
|
315
|
+
readRecentAnsi() {
|
|
316
|
+
const target = this.paneId ?? this.agentName;
|
|
317
|
+
return extractReadText(jsonCommand(herdrSessionArgs(this.sessionName, ['agent', 'read', target, '--source', 'recent', '--lines', String(READ_LINES), '--format', 'ansi']), { timeout: 5000 }));
|
|
318
|
+
}
|
|
319
|
+
startPolling() {
|
|
320
|
+
this.stopPolling();
|
|
321
|
+
this.pollTimer = setInterval(() => this.poll(), POLL_INTERVAL_MS);
|
|
322
|
+
this.pollTimer.unref?.();
|
|
323
|
+
}
|
|
324
|
+
stopPolling() {
|
|
325
|
+
if (this.pollTimer)
|
|
326
|
+
clearInterval(this.pollTimer);
|
|
327
|
+
this.pollTimer = null;
|
|
328
|
+
}
|
|
329
|
+
poll() {
|
|
330
|
+
if (this.exited)
|
|
331
|
+
return;
|
|
332
|
+
const agents = this.listAgents();
|
|
333
|
+
if (agents === null) {
|
|
334
|
+
this.agentProbeFailures++;
|
|
335
|
+
if (this.agentProbeFailures < MAX_AGENT_PROBE_FAILURES)
|
|
336
|
+
return;
|
|
337
|
+
this.handleExit(0, null);
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
this.agentProbeFailures = 0;
|
|
341
|
+
// Exit detection. Verified against herdr v0.6.6: when the CLI process exits,
|
|
342
|
+
// herdr DROPS the agent row from `agent list` (it does NOT keep a
|
|
343
|
+
// running:false tombstone). So the primary signal is "our agent is no
|
|
344
|
+
// longer in the list". We also treat an explicit terminal marker as exited
|
|
345
|
+
// (agentRowExited) to stay robust if a future herdr keeps a tombstone row —
|
|
346
|
+
// otherwise name-presence alone would never report the exit and the worker
|
|
347
|
+
// would never emit `claude_exit`, hanging the session.
|
|
348
|
+
const matchingAgent = agents.find(agent => agent?.name === this.agentName || agent?.pane_id === this.paneId);
|
|
349
|
+
const agentExited = matchingAgent ? agentRowExited(matchingAgent) : true;
|
|
350
|
+
if (this.started && agentExited) {
|
|
351
|
+
const exitCode = typeof matchingAgent?.exit_code === 'number' ? matchingAgent.exit_code : 0;
|
|
352
|
+
this.handleExit(exitCode, null);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
this.readAndEmitDelta();
|
|
356
|
+
}
|
|
357
|
+
/** Read herdr pane recent output and emit the delta vs. last snapshot. */
|
|
358
|
+
readAndEmitDelta() {
|
|
359
|
+
if (this.exited)
|
|
360
|
+
return;
|
|
361
|
+
const next = this.readRecentAnsi();
|
|
362
|
+
if (!next || next === this.lastText)
|
|
363
|
+
return;
|
|
364
|
+
let delta = '';
|
|
365
|
+
if (next.startsWith(this.lastText)) {
|
|
366
|
+
delta = next.slice(this.lastText.length);
|
|
367
|
+
}
|
|
368
|
+
else if (this.lastText.endsWith(next)) {
|
|
369
|
+
this.lastText = next;
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
const overlap = longestSuffixPrefix(this.lastText, next);
|
|
374
|
+
delta = overlap > 0 ? next.slice(overlap) : next;
|
|
375
|
+
}
|
|
376
|
+
this.lastText = next;
|
|
377
|
+
if (!delta)
|
|
378
|
+
return;
|
|
379
|
+
for (const cb of this.dataCbs) {
|
|
380
|
+
try {
|
|
381
|
+
cb(delta);
|
|
382
|
+
}
|
|
383
|
+
catch { /* listener crash shouldn't kill polling */ }
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Spawn one `herdr wait agent-status` child per "result settled" status
|
|
388
|
+
* (done / blocked / idle). The first to fire wins → we read+emit, then
|
|
389
|
+
* tear down the losers and re-arm a fresh cohort. Parallel watchers are
|
|
390
|
+
* needed because the herdr CLI only accepts one --status at a time, and
|
|
391
|
+
* we genuinely care about all three transitions: `done` is "turn finished
|
|
392
|
+
* with output", `blocked` is "agent wants user input", `idle` is the
|
|
393
|
+
* degraded form of done after herdr's UI marks it seen.
|
|
394
|
+
*/
|
|
395
|
+
startStatusWatcher() {
|
|
396
|
+
if (this.exited)
|
|
397
|
+
return;
|
|
398
|
+
const paneTarget = this.paneId ?? this.agentName;
|
|
399
|
+
if (!paneTarget)
|
|
400
|
+
return;
|
|
401
|
+
this.stopStatusWatcher();
|
|
402
|
+
const cohort = [];
|
|
403
|
+
const armedAt = Date.now();
|
|
404
|
+
for (const status of SETTLED_STATUSES) {
|
|
405
|
+
const child = spawn('herdr', [
|
|
406
|
+
'--session', this.sessionName,
|
|
407
|
+
'wait', 'agent-status', paneTarget,
|
|
408
|
+
'--status', status,
|
|
409
|
+
'--timeout', String(STATUS_WAIT_TIMEOUT_MS),
|
|
410
|
+
], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
411
|
+
cohort.push(child);
|
|
412
|
+
child.on('exit', (code) => {
|
|
413
|
+
// Only the first child to finish (across the cohort) drives the
|
|
414
|
+
// re-arm cycle; later finishers in the same cohort are dropped.
|
|
415
|
+
if (!this.statusWaitProcesses.includes(child))
|
|
416
|
+
return;
|
|
417
|
+
const wasFirstSettle = this.statusWaitProcesses === cohort;
|
|
418
|
+
// Drop this child from the active cohort.
|
|
419
|
+
this.statusWaitProcesses = this.statusWaitProcesses.filter(c => c !== child);
|
|
420
|
+
if (!wasFirstSettle || this.exited)
|
|
421
|
+
return;
|
|
422
|
+
// First exit in this cohort — tear down siblings, then read+re-arm.
|
|
423
|
+
this.stopStatusWatcher();
|
|
424
|
+
this.readAndEmitDelta();
|
|
425
|
+
// Storm guard. code 0 = the watched status was genuinely reached (a
|
|
426
|
+
// real transition, which can legitimately happen instantly) → re-arm
|
|
427
|
+
// immediately, the normal hot path. The danger is a NON-ZERO instant
|
|
428
|
+
// return: when the agent's pane has gone away (the CLI exited), `herdr
|
|
429
|
+
// wait agent-status` returns code 1 within MILLISECONDS rather than
|
|
430
|
+
// after the 30s timeout. The old code re-armed on every non-0 code
|
|
431
|
+
// synchronously, so a dead pane spun a tight spawn loop (thousands of
|
|
432
|
+
// `herdr wait` children/sec) that starved the 500ms poll timer → the
|
|
433
|
+
// session never reported its exit and hung. So for a non-zero code we
|
|
434
|
+
// first distinguish "real long timeout" (child lived a meaningful
|
|
435
|
+
// fraction of the window — agent still working, re-arm normally) from
|
|
436
|
+
// "instant return" (pane likely gone — check liveness; only re-arm via
|
|
437
|
+
// a deferred timer, never synchronously, so poll() can run and we can't
|
|
438
|
+
// spin). Verified on v0.6.6: the exited agent's row disappears from
|
|
439
|
+
// `agent list`.
|
|
440
|
+
if (code !== 0) {
|
|
441
|
+
const elapsed = Date.now() - armedAt;
|
|
442
|
+
const returnedInstantly = elapsed < STATUS_WAIT_TIMEOUT_MS / 2;
|
|
443
|
+
if (returnedInstantly) {
|
|
444
|
+
const agents = this.listAgents();
|
|
445
|
+
if (agents !== null) {
|
|
446
|
+
const matching = agents.find(a => a?.pane_id === this.paneId || a?.name === this.agentName);
|
|
447
|
+
const exited = matching ? agentRowExited(matching) : true;
|
|
448
|
+
if (exited) {
|
|
449
|
+
const exitCode = typeof matching?.exit_code === 'number' ? matching.exit_code : 0;
|
|
450
|
+
this.handleExit(exitCode, null);
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Agent still alive but the wait returned instantly (transient
|
|
455
|
+
// herdr hiccup). Re-arm on a later tick, never synchronously, so we
|
|
456
|
+
// can't spin: the deferred timer yields the loop to poll(). unref
|
|
457
|
+
// so we never hold the event loop open.
|
|
458
|
+
if (this.exited)
|
|
459
|
+
return;
|
|
460
|
+
const t = setTimeout(() => { if (!this.exited)
|
|
461
|
+
this.startStatusWatcher(); }, POLL_INTERVAL_MS);
|
|
462
|
+
t.unref?.();
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
// Normal path: a genuine status transition (code 0) or a real
|
|
467
|
+
// long-timeout (code 1 after ~30s of working) — re-arm immediately.
|
|
468
|
+
this.startStatusWatcher();
|
|
469
|
+
});
|
|
470
|
+
child.on('error', () => {
|
|
471
|
+
// `herdr` missing or unspawnable: drop from cohort. Timer-based poll
|
|
472
|
+
// still acts as the fallback signal.
|
|
473
|
+
this.statusWaitProcesses = this.statusWaitProcesses.filter(c => c !== child);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
this.statusWaitProcesses = cohort;
|
|
477
|
+
}
|
|
478
|
+
stopStatusWatcher() {
|
|
479
|
+
const active = this.statusWaitProcesses;
|
|
480
|
+
this.statusWaitProcesses = [];
|
|
481
|
+
for (const child of active) {
|
|
482
|
+
try {
|
|
483
|
+
child.kill('SIGTERM');
|
|
484
|
+
}
|
|
485
|
+
catch { /* already gone */ }
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
handleExit(code, signal) {
|
|
489
|
+
if (this.exited)
|
|
490
|
+
return;
|
|
491
|
+
this.exited = true;
|
|
492
|
+
this.stopPolling();
|
|
493
|
+
this.stopStatusWatcher();
|
|
494
|
+
for (const cb of this.exitCbs) {
|
|
495
|
+
try {
|
|
496
|
+
cb(code, signal);
|
|
497
|
+
}
|
|
498
|
+
catch { /* listener crash shouldn't kill teardown */ }
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
function sleepSync(ms) {
|
|
503
|
+
if (ms <= 0)
|
|
504
|
+
return;
|
|
505
|
+
// Synchronous nap that doesn't pin a CPU core. `sleep` only accepts
|
|
506
|
+
// fractional seconds with `.` separator on POSIX; clamp to ms granularity.
|
|
507
|
+
const seconds = Math.max(0.05, ms / 1000);
|
|
508
|
+
try {
|
|
509
|
+
execFileSync('sleep', [seconds.toFixed(3)], { stdio: 'ignore', timeout: ms + 1000 });
|
|
510
|
+
}
|
|
511
|
+
catch {
|
|
512
|
+
// best effort — if `sleep` is missing the caller will just retry sooner
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
function extractSessions(raw) {
|
|
516
|
+
const sessions = raw?.sessions ?? raw?.result?.sessions;
|
|
517
|
+
return Array.isArray(sessions) ? sessions : [];
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=herdr-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"herdr-backend.js","sourceRoot":"","sources":["../../../src/adapters/backend/herdr-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SessionBackend } from './types.js';
|
|
1
|
+
import type { BackendType, SessionBackend } from './types.js';
|
|
2
2
|
export interface SelectedSessionBackend {
|
|
3
3
|
backend: SessionBackend;
|
|
4
4
|
isTmuxMode: boolean;
|
|
@@ -10,6 +10,6 @@ export interface SelectedSessionBackend {
|
|
|
10
10
|
}
|
|
11
11
|
export declare function selectSessionBackend(opts: {
|
|
12
12
|
sessionId: string;
|
|
13
|
-
backendType:
|
|
13
|
+
backendType: BackendType;
|
|
14
14
|
}): SelectedSessionBackend;
|
|
15
15
|
//# sourceMappingURL=session-backend-selector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-backend-selector.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/session-backend-selector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-backend-selector.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/session-backend-selector.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB;;mFAE+E;IAC/E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAAG,sBAAsB,CAwDlH"}
|