agent-relay 6.2.7 → 6.3.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.
@@ -0,0 +1,367 @@
1
+ /**
2
+ * `agent-relay activity` — broker-wide activity tail.
3
+ *
4
+ * Streams the broker `/ws` event feed and renders high-signal lifecycle,
5
+ * delivery, message, and worker output events as readable log lines.
6
+ */
7
+ import WebSocket from 'ws';
8
+ import { defaultStateDir, readConnectionFileFromDisk, resolveBrokerConnection, toWsUrl, } from '../lib/broker-connection.js';
9
+ import { defaultExit, runSignalHandler } from '../lib/exit.js';
10
+ import { sanitizeForTerminalLine } from '../lib/formatting.js';
11
+ function withDefaults(overrides = {}) {
12
+ return {
13
+ readConnectionFile: readConnectionFileFromDisk,
14
+ getDefaultStateDir: defaultStateDir,
15
+ env: process.env,
16
+ createWebSocket: (url, headers) => new WebSocket(url, { headers }),
17
+ writeLine: (line) => {
18
+ process.stdout.write(`${line}\n`);
19
+ },
20
+ log: (...args) => console.error(...args),
21
+ error: (...args) => console.error(...args),
22
+ onSignal: (signal, handler) => {
23
+ process.on(signal, () => runSignalHandler(handler));
24
+ },
25
+ nowIso: () => new Date().toISOString(),
26
+ exit: defaultExit,
27
+ ...overrides,
28
+ };
29
+ }
30
+ function readString(event, key) {
31
+ const value = event[key];
32
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
33
+ }
34
+ function readNumber(event, key) {
35
+ const value = event[key];
36
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
37
+ }
38
+ function readCount(event, key) {
39
+ const value = event[key];
40
+ if (typeof value === 'number' && Number.isFinite(value))
41
+ return String(value);
42
+ if (typeof value === 'string' && value.trim() !== '')
43
+ return value;
44
+ return undefined;
45
+ }
46
+ function actorName(event) {
47
+ return readString(event, 'name') ?? readString(event, 'agent') ?? readString(event, 'worker_name') ?? '?';
48
+ }
49
+ function eventId(event) {
50
+ return readString(event, 'event_id');
51
+ }
52
+ function deliveryId(event) {
53
+ return readString(event, 'delivery_id');
54
+ }
55
+ function seqSuffix(event) {
56
+ const seq = readNumber(event, 'seq');
57
+ return seq === undefined ? '' : ` #${seq}`;
58
+ }
59
+ function quotePreview(value, max = 140) {
60
+ if (!value)
61
+ return '';
62
+ const clean = sanitizeForTerminalLine(value).replace(/\s+/g, ' ').trim();
63
+ if (!clean)
64
+ return '';
65
+ return `"${clean.length > max ? `${clean.slice(0, max - 1)}...` : clean}"`;
66
+ }
67
+ function humanizeCode(value) {
68
+ if (!value)
69
+ return undefined;
70
+ const clean = sanitizeForTerminalLine(value).replace(/[_-]+/g, ' ').replace(/\s+/g, ' ').trim();
71
+ return clean || undefined;
72
+ }
73
+ function reasonSuffix(event) {
74
+ const reason = humanizeCode(readString(event, 'reason'));
75
+ return reason ? `(${reason})` : undefined;
76
+ }
77
+ function detail(parts) {
78
+ return parts
79
+ .filter((part) => Boolean(part))
80
+ .map((part) => part.trim())
81
+ .filter(Boolean)
82
+ .join(' ');
83
+ }
84
+ function formatClock(iso) {
85
+ const parsed = Date.parse(iso);
86
+ if (Number.isNaN(parsed))
87
+ return '??:??:??';
88
+ return new Date(parsed).toISOString().slice(11, 19);
89
+ }
90
+ function metadataSuffix(event, options) {
91
+ if (!options.ids)
92
+ return '';
93
+ const parts = [
94
+ eventId(event) ? `event ${eventId(event)}` : undefined,
95
+ deliveryId(event) ? `delivery ${deliveryId(event)}` : undefined,
96
+ seqSuffix(event) ? `seq ${seqSuffix(event).slice(2)}` : undefined,
97
+ ].filter((part) => Boolean(part));
98
+ return parts.length > 0 ? ` [${parts.join(', ')}]` : '';
99
+ }
100
+ function formatLine(nowIso, label, message, event, options) {
101
+ return `${formatClock(nowIso)} ${label.padEnd(18)} ${message}${metadataSuffix(event, options)}`.trimEnd();
102
+ }
103
+ function formatDelivery(label, preposition, event, nowIso, options) {
104
+ return formatLine(nowIso, label, detail([
105
+ `${preposition} ${actorName(event)}`,
106
+ readString(event, 'from') && readString(event, 'target')
107
+ ? `${readString(event, 'from')} -> ${readString(event, 'target')}`
108
+ : undefined,
109
+ reasonSuffix(event),
110
+ ]), event, options);
111
+ }
112
+ export function formatActivityEvent(event, nowIso, options = {}) {
113
+ const kind = readString(event, 'kind');
114
+ switch (kind) {
115
+ case 'relay_inbound': {
116
+ const from = readString(event, 'from') ?? '?';
117
+ const target = readString(event, 'target') ?? '?';
118
+ const thread = readString(event, 'thread_id');
119
+ const route = `${from} -> ${target}${thread ? ` (thread ${thread})` : ''}`;
120
+ const preview = quotePreview(readString(event, 'body'));
121
+ return formatLine(nowIso, 'Message received', preview ? `${route}: ${preview}` : route, event, options);
122
+ }
123
+ case 'relaycast_published':
124
+ return formatLine(nowIso, 'Message sent', detail([
125
+ `broker -> ${readString(event, 'to') ?? '?'}`,
126
+ readString(event, 'target_type') ? `(${readString(event, 'target_type')})` : undefined,
127
+ ]), event, options);
128
+ case 'relaycast_publish_failed':
129
+ return formatLine(nowIso, 'Send failed', detail([`broker -> ${readString(event, 'to') ?? '?'}`, reasonSuffix(event)]), event, options);
130
+ case 'delivery_queued':
131
+ return formatDelivery('Delivery queued', 'for', event, nowIso, options);
132
+ case 'delivery_injected':
133
+ return formatDelivery('Delivery injected', 'into', event, nowIso, options);
134
+ case 'delivery_active':
135
+ return formatDelivery('Delivery active', 'in', event, nowIso, options);
136
+ case 'delivery_ack':
137
+ return formatDelivery('Delivery acked', 'by', event, nowIso, options);
138
+ case 'delivery_verified':
139
+ return formatDelivery('Delivery verified', 'by', event, nowIso, options);
140
+ case 'delivery_retry':
141
+ return formatLine(nowIso, 'Delivery retry', detail([`${actorName(event)} attempt ${readCount(event, 'attempts') ?? '?'}`]), event, options);
142
+ case 'delivery_failed':
143
+ return formatLine(nowIso, 'Delivery failed', detail([`${actorName(event)}`, reasonSuffix(event)]), event, options);
144
+ case 'delivery_dropped':
145
+ return formatLine(nowIso, 'Delivery dropped', detail([
146
+ `${actorName(event)} dropped ${readCount(event, 'count') ?? '?'} pending`,
147
+ reasonSuffix(event),
148
+ ]), event, options);
149
+ case 'message_delivery_confirmed':
150
+ return formatLine(nowIso, 'Message delivered', detail([
151
+ `${readString(event, 'from') ?? '?'} -> ${readString(event, 'to') ?? '?'}`,
152
+ `through ${actorName(event)}`,
153
+ ]), event, options);
154
+ case 'message_delivery_failed':
155
+ return formatLine(nowIso, 'Message failed', detail([
156
+ `${readString(event, 'from') ?? '?'} -> ${readString(event, 'to') ?? '?'}`,
157
+ `through ${actorName(event)}`,
158
+ readCount(event, 'attempts') ? `after ${readCount(event, 'attempts')} attempts` : undefined,
159
+ quotePreview(readString(event, 'lastError') ?? readString(event, 'last_error'), 100),
160
+ ]), event, options);
161
+ case 'worker_stream': {
162
+ const preview = quotePreview(readString(event, 'chunk'), 160);
163
+ if (!preview)
164
+ return null;
165
+ return formatLine(nowIso, 'Output', `${actorName(event)} ${readString(event, 'stream') ?? 'stream'}: ${preview}`, event, options);
166
+ }
167
+ case 'agent_spawned':
168
+ return formatLine(nowIso, 'Agent spawned', detail([
169
+ `${actorName(event)}`,
170
+ readString(event, 'runtime') ? `(${readString(event, 'runtime')})` : undefined,
171
+ readString(event, 'cli') ? `cli=${readString(event, 'cli')}` : undefined,
172
+ readString(event, 'model') ? `model=${readString(event, 'model')}` : undefined,
173
+ readCount(event, 'pid') ? `pid=${readCount(event, 'pid')}` : undefined,
174
+ ]), event, options);
175
+ case 'worker_ready':
176
+ return formatLine(nowIso, 'Agent ready', detail([
177
+ `${actorName(event)}`,
178
+ readString(event, 'runtime') ? `(${readString(event, 'runtime')})` : undefined,
179
+ readString(event, 'provider') ? `provider=${readString(event, 'provider')}` : undefined,
180
+ readString(event, 'model') ? `model=${readString(event, 'model')}` : undefined,
181
+ ]), event, options);
182
+ case 'worker_error':
183
+ return formatLine(nowIso, 'Agent error', detail([
184
+ `${actorName(event)}`,
185
+ humanizeCode(readString(event, 'code') ?? 'worker_error'),
186
+ quotePreview(readString(event, 'message'), 120),
187
+ ]), event, options);
188
+ case 'agent_released':
189
+ return formatLine(nowIso, 'Agent released', actorName(event), event, options);
190
+ case 'agent_exit':
191
+ return formatLine(nowIso, 'Agent exit', detail([actorName(event), reasonSuffix(event)]), event, options);
192
+ case 'agent_exited':
193
+ return formatLine(nowIso, 'Agent exited', detail([
194
+ `${actorName(event)}`,
195
+ readCount(event, 'code') ? `code=${readCount(event, 'code')}` : undefined,
196
+ readString(event, 'signal') ? `signal=${readString(event, 'signal')}` : undefined,
197
+ reasonSuffix(event),
198
+ ]), event, options);
199
+ case 'agent_context_low':
200
+ return formatLine(nowIso, 'Context low', `${actorName(event)} ${readCount(event, 'pct') ?? '?'}% remaining`, event, options);
201
+ case 'agent_idle':
202
+ return formatLine(nowIso, 'Agent idle', `${actorName(event)} idle ${readCount(event, 'idle_secs') ?? '?'}s`, event, options);
203
+ case 'agent_blocked_on_send':
204
+ return formatLine(nowIso, 'Agent blocked', `${actorName(event)} blocked ${readCount(event, 'blocked_secs') ?? '?'}s (${readCount(event, 'pending_delivery_count') ?? '?'} pending)`, event, options);
205
+ case 'agent_restarting':
206
+ return formatLine(nowIso, 'Agent restarting', `${actorName(event)} restart ${readCount(event, 'restart_count') ?? '?'} in ${readCount(event, 'delay_ms') ?? '?'}ms`, event, options);
207
+ case 'agent_restarted':
208
+ return formatLine(nowIso, 'Agent restarted', `${actorName(event)} restart ${readCount(event, 'restart_count') ?? '?'}`, event, options);
209
+ case 'agent_permanently_dead':
210
+ return formatLine(nowIso, 'Agent dead', detail([actorName(event), reasonSuffix(event)]), event, options);
211
+ case 'channel_subscribed':
212
+ return formatLine(nowIso, 'Subscribed', `${actorName(event)} ${JSON.stringify(event.channels ?? [])}`, event, options);
213
+ case 'channel_unsubscribed':
214
+ return formatLine(nowIso, 'Unsubscribed', `${actorName(event)} ${JSON.stringify(event.channels ?? [])}`, event, options);
215
+ case 'agent_pending_drained':
216
+ return formatLine(nowIso, 'Pending drained', detail([
217
+ `${actorName(event)} drained ${readCount(event, 'count') ?? '?'} pending`,
218
+ reasonSuffix(event),
219
+ ]), event, options);
220
+ case 'agent_inbound_delivery_mode_changed':
221
+ return formatLine(nowIso, 'Delivery mode', `${actorName(event)} ${humanizeCode(readString(event, 'previous_mode')) ?? '?'} -> ${humanizeCode(readString(event, 'mode')) ?? '?'}`, event, options);
222
+ case 'acl_denied':
223
+ return formatLine(nowIso, 'ACL denied', `${actorName(event)} from ${readString(event, 'sender') ?? '?'}`, event, options);
224
+ case 'replay_gap':
225
+ return formatLine(nowIso, 'Replay gap', `requested ${readCount(event, 'requestedSinceSeq') ?? '?'} oldest available ${readCount(event, 'oldestAvailable') ?? '?'}`, event, options);
226
+ default:
227
+ return formatLine(nowIso, 'Broker event', `${kind ?? 'unknown'} ${quotePreview(JSON.stringify(event), 180)}`.trim(), event, options);
228
+ }
229
+ }
230
+ function parseSinceSeq(input) {
231
+ if (input === undefined)
232
+ return undefined;
233
+ const trimmed = input.trim();
234
+ if (!/^\d+$/.test(trimmed)) {
235
+ throw new Error(`Invalid --since-seq value: ${input}`);
236
+ }
237
+ const parsed = Number(trimmed);
238
+ if (!Number.isSafeInteger(parsed)) {
239
+ throw new Error(`Invalid --since-seq value: ${input}`);
240
+ }
241
+ return parsed;
242
+ }
243
+ function eventMatchesName(event, name) {
244
+ const candidates = [
245
+ readString(event, 'name'),
246
+ readString(event, 'agent'),
247
+ readString(event, 'worker_name'),
248
+ readString(event, 'from'),
249
+ readString(event, 'target'),
250
+ readString(event, 'to'),
251
+ ];
252
+ return candidates.some((candidate) => candidate === name);
253
+ }
254
+ function shouldEmit(event, options) {
255
+ const kind = readString(event, 'kind');
256
+ if (options.streams === false && kind === 'worker_stream')
257
+ return false;
258
+ if (options.kind && kind !== options.kind.trim())
259
+ return false;
260
+ if (options.name && !eventMatchesName(event, options.name.trim()))
261
+ return false;
262
+ return true;
263
+ }
264
+ function buildActivityWsUrl(baseUrl, sinceSeq) {
265
+ const separator = toWsUrl(baseUrl).includes('?') ? '&' : '?';
266
+ return `${toWsUrl(baseUrl)}${separator}sinceSeq=${sinceSeq}`;
267
+ }
268
+ export async function runActivitySession(options, deps) {
269
+ const connection = resolveBrokerConnection(options, deps);
270
+ if (!connection) {
271
+ deps.error('Error: could not locate broker connection. Pass --broker-url, set RELAY_BROKER_URL, ' +
272
+ 'or run from a directory containing .agent-relay/connection.json.');
273
+ return 1;
274
+ }
275
+ let sinceSeq = 0;
276
+ try {
277
+ sinceSeq = parseSinceSeq(options.sinceSeq) ?? 0;
278
+ }
279
+ catch (err) {
280
+ deps.error(err instanceof Error ? err.message : String(err));
281
+ return 1;
282
+ }
283
+ const headers = {};
284
+ if (connection.apiKey) {
285
+ headers['X-API-Key'] = connection.apiKey;
286
+ }
287
+ return new Promise((resolve) => {
288
+ let settled = false;
289
+ const socket = deps.createWebSocket(buildActivityWsUrl(connection.url, sinceSeq), headers);
290
+ const finish = (code) => {
291
+ if (settled)
292
+ return;
293
+ settled = true;
294
+ try {
295
+ socket.close(1000, 'activity client exiting');
296
+ }
297
+ catch {
298
+ // best effort
299
+ }
300
+ resolve(code);
301
+ };
302
+ deps.onSignal('SIGINT', () => finish(0));
303
+ deps.onSignal('SIGTERM', () => finish(0));
304
+ socket.on('open', () => {
305
+ deps.log(`[activity] streaming broker activity from ${connection.url} (Ctrl+C to exit)`);
306
+ });
307
+ socket.on('message', (data) => {
308
+ let event;
309
+ try {
310
+ const text = typeof data === 'string' ? data : Buffer.isBuffer(data) ? data.toString('utf-8') : String(data);
311
+ const parsed = JSON.parse(text);
312
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
313
+ return;
314
+ event = parsed;
315
+ }
316
+ catch {
317
+ return;
318
+ }
319
+ if (!shouldEmit(event, options))
320
+ return;
321
+ if (options.json) {
322
+ deps.writeLine(JSON.stringify(event));
323
+ return;
324
+ }
325
+ const line = formatActivityEvent(event, deps.nowIso(), { ids: options.ids === true });
326
+ if (line)
327
+ deps.writeLine(line);
328
+ });
329
+ socket.on('error', (err) => {
330
+ deps.error(`[activity] WebSocket error: ${err.message}`);
331
+ });
332
+ socket.on('close', (code, reason) => {
333
+ if (settled)
334
+ return;
335
+ const reasonText = reason && reason.length > 0 ? reason.toString('utf-8') : '';
336
+ if (code === 1000 || code === 1005) {
337
+ finish(0);
338
+ }
339
+ else {
340
+ deps.error(`[activity] connection closed (code: ${code}${reasonText ? `, reason: ${reasonText}` : ''})`);
341
+ finish(1);
342
+ }
343
+ });
344
+ });
345
+ }
346
+ export function registerActivityCommands(program, overrides = {}) {
347
+ const deps = withDefaults(overrides);
348
+ program
349
+ .command('activity')
350
+ .description('Tail broker activity events in a readable stream')
351
+ .option('--broker-url <url>', 'Broker base URL (overrides RELAY_BROKER_URL and connection.json)')
352
+ .option('--api-key <key>', 'Broker API key (overrides RELAY_BROKER_API_KEY and connection.json)')
353
+ .option('--state-dir <dir>', 'Directory containing connection.json (default: .agent-relay/)')
354
+ .option('--since-seq <seq>', 'Replay durable events after this broker sequence number', '0')
355
+ .option('--kind <kind>', 'Only show events with this kind')
356
+ .option('--name <name>', 'Only show events involving this agent/name')
357
+ .option('--no-streams', 'Hide worker_stream output previews')
358
+ .option('--ids', 'Show event, delivery, and replay sequence identifiers')
359
+ .option('--json', 'Emit matching events as JSON Lines')
360
+ .action(async (options) => {
361
+ const code = await runActivitySession(options, deps);
362
+ if (code !== 0) {
363
+ deps.exit(code);
364
+ }
365
+ });
366
+ }
367
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../../src/cli/commands/activity.ts"],"names":[],"mappings":"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"}
@@ -16,13 +16,14 @@
16
16
  * 4. `captureAndRenderSnapshot` → repaint the agent's current screen.
17
17
  * 5. `GET /api/spawned/{name}/pending` → seed the status-line counter.
18
18
  * 6. Open `/ws`, subscribe to events for this worker.
19
- * 7. Switch local stdin to raw mode; forward bytes to `POST /api/input/{name}`.
19
+ * 7. Open the SDK PTY input stream, then switch local stdin to raw
20
+ * mode and forward bytes through that stream.
20
21
  *
21
22
  * On detach (clean or abnormal), best-effort `PUT .../delivery-mode` restores the
22
23
  * previous mode so the queue doesn't fill up indefinitely.
23
24
  */
24
25
  import { Buffer } from 'node:buffer';
25
- import type { InboundDeliveryMode } from '@agent-relay/sdk';
26
+ import type { InboundDeliveryMode, PtyInputStreamOptions, PtyInputWriteResult } from '@agent-relay/sdk';
26
27
  import { Command } from 'commander';
27
28
  import WebSocket from 'ws';
28
29
  import { captureAndRenderSnapshot, type AttachSnapshotConnection, type AttachSnapshotDeps } from '../lib/attach.js';
@@ -69,6 +70,11 @@ export interface DriveTerminal {
69
70
  * function the client calls during teardown. */
70
71
  onResize(handler: () => void): () => void;
71
72
  }
73
+ export interface CliPtyInputStream {
74
+ waitUntilOpen(): Promise<void>;
75
+ send(data: string): Promise<PtyInputWriteResult>;
76
+ close(code?: number, reason?: string): void;
77
+ }
72
78
  export interface DriveDependencies {
73
79
  /** Reads `<state-dir>/connection.json` and returns parsed JSON, or null. */
74
80
  readConnectionFile: (stateDir: string) => unknown;
@@ -85,7 +91,7 @@ export interface DriveDependencies {
85
91
  log: (...args: unknown[]) => void;
86
92
  error: (...args: unknown[]) => void;
87
93
  exit: ExitFn;
88
- /** HTTP client used for mode/pending/flush/input calls. Defaults to global `fetch`. */
94
+ /** HTTP client used for mode/pending/flush/resize calls. Defaults to global `fetch`. */
89
95
  fetch: typeof globalThis.fetch;
90
96
  /** Override for the snapshot-on-attach helper (tests substitute a stub). */
91
97
  captureAndRenderSnapshot: (connection: AttachSnapshotConnection, name: string, deps: AttachSnapshotDeps) => ReturnType<typeof captureAndRenderSnapshot>;
@@ -93,6 +99,8 @@ export interface DriveDependencies {
93
99
  stdin: DriveStdin;
94
100
  /** Local terminal size source — defaults to `process.stdout`. */
95
101
  terminal: DriveTerminal;
102
+ /** Opens the SDK PTY input stream used for raw human keystrokes. */
103
+ openInputStream: (connection: BrokerConnection, name: string, options?: PtyInputStreamOptions) => CliPtyInputStream;
96
104
  }
97
105
  /** ----- HTTP helpers ----- */
98
106
  /** `GET /api/spawned/{name}/delivery-mode` → `'manual_flush' | 'auto_inject'` or `null` on failure. */
@@ -120,6 +128,8 @@ export declare function sendInput(connection: BrokerConnection, name: string, da
120
128
  ok: boolean;
121
129
  message?: string;
122
130
  }>;
131
+ /** Open the SDK-backed raw PTY input stream for interactive CLI sessions. */
132
+ export declare function openPtyInputStream(connection: BrokerConnection, name: string, fetchFn: typeof globalThis.fetch, options?: PtyInputStreamOptions): CliPtyInputStream;
123
133
  /**
124
134
  * `POST /api/resize/{name}` body `{ rows, cols }`. Forwards the
125
135
  * driver's local terminal dimensions so the agent's PTY (and any TUI
@@ -1 +1 @@
1
- {"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/drive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/drive.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,8 @@
16
16
  * 4. `captureAndRenderSnapshot` → repaint the agent's current screen.
17
17
  * 5. `GET /api/spawned/{name}/pending` → seed the status-line counter.
18
18
  * 6. Open `/ws`, subscribe to events for this worker.
19
- * 7. Switch local stdin to raw mode; forward bytes to `POST /api/input/{name}`.
19
+ * 7. Open the SDK PTY input stream, then switch local stdin to raw
20
+ * mode and forward bytes through that stream.
20
21
  *
21
22
  * On detach (clean or abnormal), best-effort `PUT .../delivery-mode` restores the
22
23
  * previous mode so the queue doesn't fill up indefinitely.
@@ -28,6 +29,7 @@ import { defaultStateDir, readConnectionFileFromDisk, toWsUrl, } from '../lib/br
28
29
  import { defaultExit, runSignalHandler } from '../lib/exit.js';
29
30
  import { createBrokerClient, mapBrokerSdkFailure } from '../lib/sdk-client.js';
30
31
  function withDefaults(overrides = {}) {
32
+ const fetchFn = overrides.fetch ?? ((input, init) => fetch(input, init));
31
33
  return {
32
34
  readConnectionFile: readConnectionFileFromDisk,
33
35
  getDefaultStateDir: defaultStateDir,
@@ -42,7 +44,7 @@ function withDefaults(overrides = {}) {
42
44
  log: (...args) => console.error(...args),
43
45
  error: (...args) => console.error(...args),
44
46
  exit: defaultExit,
45
- fetch: (input, init) => fetch(input, init),
47
+ fetch: fetchFn,
46
48
  captureAndRenderSnapshot,
47
49
  stdin: process.stdin,
48
50
  terminal: {
@@ -65,6 +67,7 @@ function withDefaults(overrides = {}) {
65
67
  return () => process.stdout.off('resize', handler);
66
68
  },
67
69
  },
70
+ openInputStream: (connection, name, options) => openPtyInputStream(connection, name, fetchFn, options),
68
71
  ...overrides,
69
72
  };
70
73
  }
@@ -120,6 +123,10 @@ export async function sendInput(connection, name, data, fetchFn) {
120
123
  return { ok: false, message: failure.message };
121
124
  }
122
125
  }
126
+ /** Open the SDK-backed raw PTY input stream for interactive CLI sessions. */
127
+ export function openPtyInputStream(connection, name, fetchFn, options) {
128
+ return createBrokerClient(connection, fetchFn).openInputStream(name, options);
129
+ }
123
130
  /**
124
131
  * `POST /api/resize/{name}` body `{ rows, cols }`. Forwards the
125
132
  * driver's local terminal dimensions so the agent's PTY (and any TUI
@@ -286,6 +293,7 @@ function runDriveSessionLoop(state, deps) {
286
293
  let showHelp = false;
287
294
  let terminalRows = state.initialTerminalRows;
288
295
  const parser = new KeybindParser();
296
+ let inputStream = null;
289
297
  const paintStatus = () => {
290
298
  deps.writeChunk(renderStatusLine({
291
299
  name,
@@ -320,17 +328,23 @@ function runDriveSessionLoop(state, deps) {
320
328
  const stdinDataHandler = (chunk) => {
321
329
  const outcome = parser.feed(chunk);
322
330
  if (outcome.forward.length > 0) {
331
+ const stream = inputStream;
332
+ if (!stream) {
333
+ deps.log('[drive] input stream is not ready');
334
+ return;
335
+ }
323
336
  // Fire-and-forget; surface errors via log but don't block the
324
337
  // event loop on every keystroke.
325
- // UTF-8, not latin1 — the broker deserializes /api/input's
326
- // `data` as a Rust `String` and forwards the bytes verbatim.
338
+ // UTF-8, not latin1 — the broker input stream forwards string
339
+ // payload bytes verbatim to the PTY.
327
340
  // 'binary' would map bytes ≥ 0x80 to Latin-1 code points,
328
341
  // which then get UTF-8 re-encoded on the wire, doubling
329
342
  // multi-byte characters (e.g. `é` → `é` on the agent's side).
330
- void sendInput(connection, name, outcome.forward.toString('utf-8'), deps.fetch).then((res) => {
331
- if (!res.ok) {
332
- deps.log(`[drive] input send failed: ${res.message ?? 'unknown error'}`);
333
- }
343
+ void stream.send(outcome.forward.toString('utf-8')).catch((err) => {
344
+ if (settled)
345
+ return;
346
+ const message = err instanceof Error ? err.message : String(err);
347
+ deps.log(`[drive] input stream send failed: ${message}`);
334
348
  });
335
349
  }
336
350
  for (const action of outcome.actions) {
@@ -389,11 +403,24 @@ function runDriveSessionLoop(state, deps) {
389
403
  }
390
404
  rawModeWasSet = false;
391
405
  };
406
+ const closeInputStream = () => {
407
+ const stream = inputStream;
408
+ inputStream = null;
409
+ if (!stream)
410
+ return;
411
+ try {
412
+ stream.close(1000, 'drive client exiting');
413
+ }
414
+ catch {
415
+ // best effort
416
+ }
417
+ };
392
418
  const finish = (code) => {
393
419
  if (settled)
394
420
  return;
395
421
  settled = true;
396
422
  teardownStdin();
423
+ closeInputStream();
397
424
  try {
398
425
  socket.close(1000, 'drive client exiting');
399
426
  }
@@ -407,14 +434,14 @@ function runDriveSessionLoop(state, deps) {
407
434
  });
408
435
  };
409
436
  const socket = deps.createWebSocket(wsUrl, headers);
410
- deps.onSignal('SIGINT', () => finish(0));
411
- deps.onSignal('SIGTERM', () => finish(0));
412
- socket.on('open', () => {
413
- deps.log(`[drive] driving ${name} via ${connection.url} (Ctrl+B D to detach)`);
414
- // Now that the WS is up, take over stdin. We do this on `open`
415
- // rather than synchronously so a failed connection doesn't leave
416
- // the user's terminal in raw mode with nothing to type into.
437
+ const openInputStreamAndTakeStdin = async () => {
417
438
  try {
439
+ inputStream = deps.openInputStream(connection, name);
440
+ await inputStream.waitUntilOpen();
441
+ if (settled) {
442
+ closeInputStream();
443
+ return;
444
+ }
418
445
  if (typeof deps.stdin.setRawMode === 'function' && deps.stdin.isTTY !== false) {
419
446
  deps.stdin.setRawMode(true);
420
447
  rawModeWasSet = true;
@@ -427,10 +454,21 @@ function runDriveSessionLoop(state, deps) {
427
454
  unsubscribeResize = deps.terminal.onResize(resizeHandler);
428
455
  }
429
456
  catch (err) {
457
+ if (settled)
458
+ return;
430
459
  const message = err instanceof Error ? err.message : String(err);
431
- deps.error(`[drive] could not enable raw input mode: ${message}`);
460
+ deps.error(`[drive] could not open PTY input stream: ${message}`);
432
461
  finish(1);
433
462
  }
463
+ };
464
+ deps.onSignal('SIGINT', () => finish(0));
465
+ deps.onSignal('SIGTERM', () => finish(0));
466
+ socket.on('open', () => {
467
+ deps.log(`[drive] driving ${name} via ${connection.url} (Ctrl+B D to detach)`);
468
+ // Now that the event WS is up, open the SDK input stream before
469
+ // taking over stdin. A failed stream should not leave the user's
470
+ // terminal in raw mode with nowhere to send bytes.
471
+ void openInputStreamAndTakeStdin();
434
472
  });
435
473
  socket.on('message', (data) => {
436
474
  const text = typeof data === 'string' ? data : Buffer.isBuffer(data) ? data.toString('utf-8') : String(data);