botmux 2.56.0-canary.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.
Files changed (136) hide show
  1. package/dist/adapters/backend/herdr-backend.d.ts +80 -0
  2. package/dist/adapters/backend/herdr-backend.d.ts.map +1 -0
  3. package/dist/adapters/backend/herdr-backend.js +519 -0
  4. package/dist/adapters/backend/herdr-backend.js.map +1 -0
  5. package/dist/adapters/backend/session-backend-selector.d.ts +2 -2
  6. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
  7. package/dist/adapters/backend/session-backend-selector.js +19 -1
  8. package/dist/adapters/backend/session-backend-selector.js.map +1 -1
  9. package/dist/adapters/backend/types.d.ts +7 -0
  10. package/dist/adapters/backend/types.d.ts.map +1 -1
  11. package/dist/adapters/backend/types.js.map +1 -1
  12. package/dist/adapters/cli/codex.d.ts.map +1 -1
  13. package/dist/adapters/cli/codex.js +11 -0
  14. package/dist/adapters/cli/codex.js.map +1 -1
  15. package/dist/bot-registry.d.ts +2 -16
  16. package/dist/bot-registry.d.ts.map +1 -1
  17. package/dist/bot-registry.js +0 -14
  18. package/dist/bot-registry.js.map +1 -1
  19. package/dist/cli.d.ts.map +1 -1
  20. package/dist/cli.js +293 -43
  21. package/dist/cli.js.map +1 -1
  22. package/dist/config.d.ts +2 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +13 -3
  25. package/dist/config.js.map +1 -1
  26. package/dist/core/command-handler.d.ts.map +1 -1
  27. package/dist/core/command-handler.js +19 -16
  28. package/dist/core/command-handler.js.map +1 -1
  29. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  30. package/dist/core/dashboard-ipc-server.js +1 -2
  31. package/dist/core/dashboard-ipc-server.js.map +1 -1
  32. package/dist/core/dashboard-rows.d.ts +1 -2
  33. package/dist/core/dashboard-rows.d.ts.map +1 -1
  34. package/dist/core/dashboard-rows.js +4 -6
  35. package/dist/core/dashboard-rows.js.map +1 -1
  36. package/dist/core/pending-response.d.ts +16 -1
  37. package/dist/core/pending-response.d.ts.map +1 -1
  38. package/dist/core/pending-response.js +19 -1
  39. package/dist/core/pending-response.js.map +1 -1
  40. package/dist/core/session-discovery.d.ts +20 -4
  41. package/dist/core/session-discovery.d.ts.map +1 -1
  42. package/dist/core/session-discovery.js +228 -72
  43. package/dist/core/session-discovery.js.map +1 -1
  44. package/dist/core/session-manager.d.ts +2 -1
  45. package/dist/core/session-manager.d.ts.map +1 -1
  46. package/dist/core/session-manager.js +77 -45
  47. package/dist/core/session-manager.js.map +1 -1
  48. package/dist/core/types.d.ts +8 -1
  49. package/dist/core/types.d.ts.map +1 -1
  50. package/dist/core/types.js.map +1 -1
  51. package/dist/core/worker-pool.d.ts.map +1 -1
  52. package/dist/core/worker-pool.js +74 -65
  53. package/dist/core/worker-pool.js.map +1 -1
  54. package/dist/daemon.d.ts.map +1 -1
  55. package/dist/daemon.js +5 -6
  56. package/dist/daemon.js.map +1 -1
  57. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  58. package/dist/dashboard/bot-onboarding.js +13 -10
  59. package/dist/dashboard/bot-onboarding.js.map +1 -1
  60. package/dist/dashboard/web/groups.d.ts.map +1 -1
  61. package/dist/dashboard/web/groups.js +1 -6
  62. package/dist/dashboard/web/groups.js.map +1 -1
  63. package/dist/dashboard-web/app.js +1 -1
  64. package/dist/i18n/en.d.ts.map +1 -1
  65. package/dist/i18n/en.js +1 -0
  66. package/dist/i18n/en.js.map +1 -1
  67. package/dist/i18n/zh.d.ts.map +1 -1
  68. package/dist/i18n/zh.js +1 -0
  69. package/dist/i18n/zh.js.map +1 -1
  70. package/dist/im/lark/card-builder.d.ts +2 -1
  71. package/dist/im/lark/card-builder.d.ts.map +1 -1
  72. package/dist/im/lark/card-builder.js +19 -2
  73. package/dist/im/lark/card-builder.js.map +1 -1
  74. package/dist/im/lark/card-handler.d.ts.map +1 -1
  75. package/dist/im/lark/card-handler.js +5 -3
  76. package/dist/im/lark/card-handler.js.map +1 -1
  77. package/dist/im/lark/client.d.ts.map +1 -1
  78. package/dist/im/lark/client.js +5 -7
  79. package/dist/im/lark/client.js.map +1 -1
  80. package/dist/im/lark/event-dispatcher.d.ts +1 -2
  81. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  82. package/dist/im/lark/event-dispatcher.js +12 -18
  83. package/dist/im/lark/event-dispatcher.js.map +1 -1
  84. package/dist/setup/agent-preset.d.ts +78 -0
  85. package/dist/setup/agent-preset.d.ts.map +1 -0
  86. package/dist/setup/agent-preset.js +127 -0
  87. package/dist/setup/agent-preset.js.map +1 -0
  88. package/dist/setup/bot-config-editor.js +2 -2
  89. package/dist/setup/bot-config-editor.js.map +1 -1
  90. package/dist/setup/ensure-herdr-integrations.d.ts +26 -0
  91. package/dist/setup/ensure-herdr-integrations.d.ts.map +1 -0
  92. package/dist/setup/ensure-herdr-integrations.js +127 -0
  93. package/dist/setup/ensure-herdr-integrations.js.map +1 -0
  94. package/dist/setup/ensure-herdr.d.ts +12 -0
  95. package/dist/setup/ensure-herdr.d.ts.map +1 -0
  96. package/dist/setup/ensure-herdr.js +70 -0
  97. package/dist/setup/ensure-herdr.js.map +1 -0
  98. package/dist/setup/ensure-opus.d.ts +13 -0
  99. package/dist/setup/ensure-opus.d.ts.map +1 -0
  100. package/dist/setup/ensure-opus.js +64 -0
  101. package/dist/setup/ensure-opus.js.map +1 -0
  102. package/dist/setup/ensure-tmux.d.ts +13 -0
  103. package/dist/setup/ensure-tmux.d.ts.map +1 -1
  104. package/dist/setup/ensure-tmux.js +4 -4
  105. package/dist/setup/ensure-tmux.js.map +1 -1
  106. package/dist/setup/index.d.ts +4 -0
  107. package/dist/setup/index.d.ts.map +1 -1
  108. package/dist/setup/index.js +78 -1
  109. package/dist/setup/index.js.map +1 -1
  110. package/dist/setup/verify-permissions.d.ts +1 -2
  111. package/dist/setup/verify-permissions.d.ts.map +1 -1
  112. package/dist/setup/verify-permissions.js +8 -5
  113. package/dist/setup/verify-permissions.js.map +1 -1
  114. package/dist/types.d.ts +14 -3
  115. package/dist/types.d.ts.map +1 -1
  116. package/dist/utils/lark-upload.d.ts +1 -2
  117. package/dist/utils/lark-upload.d.ts.map +1 -1
  118. package/dist/utils/lark-upload.js +7 -11
  119. package/dist/utils/lark-upload.js.map +1 -1
  120. package/dist/utils/transient-snapshot.d.ts +3 -3
  121. package/dist/utils/transient-snapshot.js +3 -3
  122. package/dist/utils/user-token.d.ts +4 -12
  123. package/dist/utils/user-token.d.ts.map +1 -1
  124. package/dist/utils/user-token.js +25 -64
  125. package/dist/utils/user-token.js.map +1 -1
  126. package/dist/worker.js +252 -183
  127. package/dist/worker.js.map +1 -1
  128. package/dist/workflows/attempt-resume.d.ts +2 -1
  129. package/dist/workflows/attempt-resume.d.ts.map +1 -1
  130. package/dist/workflows/attempt-resume.js.map +1 -1
  131. package/dist/workflows/definition.d.ts +22 -22
  132. package/package.json +1 -1
  133. package/dist/im/lark/lark-hosts.d.ts +0 -44
  134. package/dist/im/lark/lark-hosts.d.ts.map +0 -1
  135. package/dist/im/lark/lark-hosts.js +0 -49
  136. package/dist/im/lark/lark-hosts.js.map +0 -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: 'pty' | 'tmux' | 'zellij';
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":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,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,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;CAAE,GAAG,sBAAsB,CAqChI"}
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"}