agent-relay 10.1.0 → 10.2.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.
@@ -37,26 +37,146 @@ export interface AttachSnapshotResult {
37
37
  cols?: number;
38
38
  /** Cursor position `[row, col]`, 1-indexed, if the call succeeded. */
39
39
  cursor?: [number, number];
40
+ /**
41
+ * Cumulative per-worker byte offset the grid had consumed when the
42
+ * snapshot was captured. Used to reconcile the snapshot against buffered
43
+ * `worker_stream` chunks (drop `offset <= this`, apply the rest).
44
+ * `undefined` on brokers that predate stream-offset support.
45
+ */
46
+ offset?: number;
40
47
  /** Human-readable detail for error variants. */
41
48
  message?: string;
42
49
  }
43
50
  /**
44
51
  * Fetch a worker's current visible screen as ANSI reproduction bytes and
45
- * write them to the caller's output. Callers should invoke this BEFORE
46
- * subscribing to the WebSocket event stream so the user sees the agent's
47
- * current state before live deltas start arriving.
52
+ * write them to the caller's output.
48
53
  *
49
- * There is a tiny window between the snapshot capture and the live stream
50
- * starting in which the agent's output could be missed (≤10ms in practice).
51
- * Most TUI agents repaint heavily so the next update overwrites anything
52
- * lost; subscribe-first + buffer + drain would close the gap at the cost
53
- * of risking double-application of bytes that arrive in both the snapshot
54
- * and the buffered stream, which is the worse failure mode for TUIs.
54
+ * The attach clients open and subscribe to the WebSocket event stream
55
+ * *first*, buffer incoming `worker_stream` chunks, then call this to paint
56
+ * the snapshot, and finally reconcile the buffer against the snapshot's
57
+ * `offset` (see {@link StreamSyncBuffer}). That ordering closes the gap
58
+ * between the snapshot and the live stream: no output emitted around attach
59
+ * time is lost, and the per-worker byte offset lets the client drop exactly
60
+ * the chunks the snapshot already reflects so nothing is double-applied.
61
+ *
62
+ * On brokers that don't report an `offset`, the clients fall back to
63
+ * snapshot-authoritative behaviour (paint the snapshot, discard chunks that
64
+ * arrived before it), which trades a tiny gap for no duplication — the same
65
+ * bias the pre-offset code had.
55
66
  *
56
67
  * @returns A status describing the outcome. `ok` means the screen was
57
- * rendered; other variants carry a message the caller can surface.
68
+ * rendered; other variants carry a message the caller can surface. `offset`
69
+ * is populated on `ok` when the broker reports one.
58
70
  */
59
71
  export declare function captureAndRenderSnapshot(connection: AttachSnapshotConnection, agentName: string, deps: AttachSnapshotDeps): Promise<AttachSnapshotResult>;
72
+ /**
73
+ * Reconciles a visible-screen snapshot with the live `worker_stream` byte
74
+ * stream so an attaching client neither loses nor double-applies output
75
+ * around attach time.
76
+ *
77
+ * Usage (subscribe-first):
78
+ *
79
+ * 1. Open + subscribe the event WS. Feed every `worker_stream` chunk to
80
+ * {@link push} as it arrives, applying the chunk only when `push`
81
+ * returns `true`.
82
+ * 2. Fetch and paint the snapshot.
83
+ * 3. Call {@link reconcile} with the snapshot's `offset`. Apply the
84
+ * returned chunks in order. From then on, `push` returns `true` for
85
+ * every chunk (live pass-through).
86
+ *
87
+ * Correlation rule: the snapshot reflects every byte with offset `<=`
88
+ * `snapshotOffset`. A buffered chunk carries the cumulative byte offset at
89
+ * its *end*; if that end offset is `<=` the snapshot offset the chunk is
90
+ * already on screen and is dropped, otherwise it is applied.
91
+ *
92
+ * The snapshot offset is retained as a post-reconcile *watermark*: once
93
+ * buffering ends, {@link push} keeps suppressing any live frame whose end
94
+ * offset is `<=` the watermark. This closes a broker-side race — the PTY
95
+ * reader advances `consumed_offset` and the grid *before* the decoded chunk
96
+ * reaches the broadcast queue, so a chunk with `offset <= snapshotOffset`
97
+ * can still arrive *after* the client reconciles. Offsets are cumulative and
98
+ * monotonic, so the watermark drops exactly those already-painted stragglers
99
+ * without touching genuinely new output.
100
+ */
101
+ export declare class StreamSyncBuffer {
102
+ private buffering;
103
+ private readonly buffered;
104
+ /**
105
+ * Post-reconcile suppression watermark: the snapshot offset the grid had
106
+ * already painted. `undefined` until {@link reconcile} runs with a defined
107
+ * offset (or forever, on brokers without offset support / after
108
+ * {@link flushAll}), in which case no post-reconcile suppression happens.
109
+ */
110
+ private watermark;
111
+ /**
112
+ * Record a live `worker_stream` chunk. Returns `true` when the caller
113
+ * should apply the chunk immediately, `false` when the chunk must be held
114
+ * or dropped. While buffering, the chunk is retained for {@link reconcile}.
115
+ * After reconcile, a chunk whose end offset is `<=` the snapshot watermark
116
+ * is a late-arriving straggler the snapshot already painted and is
117
+ * suppressed (see the class docstring's race note); everything else passes
118
+ * through live.
119
+ */
120
+ push(chunk: string, offset: number | undefined): boolean;
121
+ /**
122
+ * Reconcile the buffered chunks against the painted snapshot's offset and
123
+ * return the chunks to apply, in order. Switches to live pass-through and
124
+ * arms the post-reconcile watermark (see {@link push}).
125
+ *
126
+ * When `snapshotOffset` is `undefined` (broker without offset support) all
127
+ * buffered chunks are discarded: they arrived before the snapshot was
128
+ * painted, so dropping them matches the snapshot-authoritative fallback
129
+ * and avoids double-painting what the snapshot already shows. No watermark
130
+ * is armed in that case — there is no offset to compare live frames to.
131
+ */
132
+ reconcile(snapshotOffset: number | undefined): string[];
133
+ /**
134
+ * Return every buffered chunk unchanged and switch to live pass-through.
135
+ * Used when no snapshot was painted (transient snapshot failure): there is
136
+ * nothing to reconcile against, so applying everything preserves output
137
+ * rather than dropping the buffered live stream.
138
+ */
139
+ flushAll(): string[];
140
+ /** True while chunks are still being buffered (before reconcile). */
141
+ get isBuffering(): boolean;
142
+ }
143
+ /**
144
+ * Conservative terminal-reset control sequence emitted on detach (see #1247).
145
+ *
146
+ * A drive/view/passthrough session paints the agent's snapshot (which now
147
+ * re-emits terminal modes) and then relays the live stream, either of which can
148
+ * leave the *local* terminal in application-cursor-keys, mouse-reporting,
149
+ * bracketed-paste, or alt-screen mode. Without a reset on detach the user is
150
+ * dropped back to their shell with arrows emitting escape codes, mouse clicks
151
+ * spewing coordinates, or a blank alt screen.
152
+ *
153
+ * The sequence is intentionally direction-explicit and idempotent. Ordering is
154
+ * load-bearing (see #1251): a few of these controls move the cursor, and
155
+ * `\x1b[?1049l` (leave alt screen) *restores* the main-buffer cursor that was
156
+ * saved on alt-screen entry. Anything that homes the cursor must therefore run
157
+ * *before* the alt-screen leave, or it clobbers that restored position and the
158
+ * next shell prompt lands at top-left. Two controls home the cursor:
159
+ *
160
+ * - `\x1b[r` (DECSTBM scroll-region reset) homes the cursor on xterm/DEC-style
161
+ * terminals. The scroll-region margins are shared terminal state, so
162
+ * resetting them while still in the alt buffer heals a stale region and the
163
+ * homing is harmless (the pending `?1049l` restore supersedes it).
164
+ * - `\x1b[?6l` (DECOM origin-mode reset) also moves the cursor to home per the
165
+ * DEC spec, so it belongs in the same pre-leave group.
166
+ *
167
+ * Everything after the alt-screen leave is position-independent (mode flags
168
+ * that never move the cursor): show cursor, application cursor keys off,
169
+ * autowrap on, every mouse-reporting mode off, bracketed paste off, numeric
170
+ * keypad, and a final SGR reset. Only written when stdout is a TTY, consistent
171
+ * with how the sessions gate raw-mode restore and the status line.
172
+ */
173
+ export declare const LOCAL_TERMINAL_RESET_SEQUENCE: string;
174
+ /**
175
+ * Emit {@link LOCAL_TERMINAL_RESET_SEQUENCE} to the local terminal on detach,
176
+ * but only when stdout is a TTY. A no-op for piped/redirected stdout so the
177
+ * reset never corrupts a captured log.
178
+ */
179
+ export declare function resetLocalTerminalOnDetach(write: (chunk: string) => void, isTty: boolean): void;
60
180
  /** ----- Interactive attach prep helpers ----- */
61
181
  /** Validated attach target: trimmed agent name + resolved broker connection. */
62
182
  export interface AttachTarget {
@@ -97,6 +217,8 @@ export declare function syncInitialPtySize(connection: BrokerConnection, name: s
97
217
  } | null, verb: string, deps: {
98
218
  fetch: typeof globalThis.fetch;
99
219
  log: (...args: unknown[]) => void;
220
+ }, options?: {
221
+ sessionId?: string;
100
222
  }): Promise<void>;
101
223
  /**
102
224
  * Read the worker's prior inbound delivery mode and flip it to
@@ -114,7 +236,167 @@ export declare function switchInboundDeliveryModeOrAbort(connection: BrokerConne
114
236
  error: (...args: unknown[]) => void;
115
237
  }): Promise<{
116
238
  previousMode: InboundDeliveryMode | null;
239
+ sessionRevision: string | null;
117
240
  } | null>;
241
+ /**
242
+ * Upper bound (ms) on the best-effort detach teardown — resize-ownership
243
+ * release and inbound-delivery-mode restore. Both are HTTP round-trips to the
244
+ * broker that can stall if the broker is down; the terminal must still exit
245
+ * promptly, so `finish()` resolves the exit code once these settle *or* this
246
+ * deadline elapses, whichever comes first. The broker's idle-takeover net
247
+ * still frees any ownership left behind.
248
+ */
249
+ export declare const DETACH_CLEANUP_DEADLINE_MS = 2000;
250
+ /**
251
+ * Best-effort restore of a worker's inbound delivery mode on detach.
252
+ *
253
+ * Two hazards this guards against (see #1247):
254
+ *
255
+ * 1. Concurrent-change race — a second session attaching while this one is
256
+ * active would read *this* session's mode as the "previous" one, so blindly
257
+ * writing `previousMode` back on detach can clobber a change another
258
+ * session/CLI made in the meantime. We restore via the broker's atomic
259
+ * compare-and-set (`expectedMode: sessionMode`): the broker applies
260
+ * `previousMode` only if the worker's current mode still equals what *this*
261
+ * session set, and no-ops (`matched: false`) otherwise. This removes the
262
+ * read-then-set TOCTOU a client-side re-read still had (a change landing
263
+ * between the read and the restore PUT).
264
+ * 2. Failed initial read — when the pre-attach mode was never learned
265
+ * (`previousMode === null`), forcing a default (`auto_inject`) would
266
+ * silently cancel an explicit `agent message hold`. In that case we leave
267
+ * the mode untouched and warn.
268
+ *
269
+ * The broker's monotonic mode revision closes ABA races where another session
270
+ * changes the mode away and back to `sessionMode` before this restore.
271
+ */
272
+ export declare function restoreInboundDeliveryModeOnDetach(connection: BrokerConnection, name: string, previousMode: InboundDeliveryMode | null, sessionMode: InboundDeliveryMode, sessionRevision: string | null, verb: string, deps: {
273
+ fetch: typeof globalThis.fetch;
274
+ log: (...args: unknown[]) => void;
275
+ }): Promise<void>;
276
+ /**
277
+ * Streaming scanner that tracks whether a byte stream currently *ends* inside
278
+ * an incomplete ANSI escape sequence (ESC, CSI, OSC, or DCS/SOS/PM/APC string).
279
+ *
280
+ * The attach status line wraps its repaint in cursor save/restore controls;
281
+ * splicing that in while the agent is mid-transmission of its own CSI sequence
282
+ * corrupts the agent's output. Feeding every server chunk through this scanner
283
+ * lets the status painter hold its repaint until the stream is back at a
284
+ * sequence boundary. State persists across chunks (a sequence may span several
285
+ * `worker_stream` frames).
286
+ *
287
+ * Only ASCII control bytes drive the state machine; multi-byte UTF-8 payload
288
+ * bytes are printable in the ground state and never appear inside a CSI/escape
289
+ * sequence, so scanning UTF-16 code units is safe here.
290
+ */
291
+ export declare class AnsiBoundaryScanner {
292
+ private state;
293
+ push(chunk: string): void;
294
+ reset(): void;
295
+ /** True when the stream ends at a safe boundary (not mid-sequence). */
296
+ get atBoundary(): boolean;
297
+ private step;
298
+ }
299
+ /** Options for {@link StatusLineController}. Timers are injectable for tests. */
300
+ export interface StatusLineControllerOptions {
301
+ /** Produce the current status-line ANSI string. */
302
+ render: () => string;
303
+ /** Write to stdout. */
304
+ write: (chunk: string) => void;
305
+ /** When false (stdout is not a TTY) the status line is never painted. */
306
+ enabled: boolean;
307
+ /**
308
+ * Minimum ms between repaints. `0` paints on every request (no coalescing);
309
+ * a positive value coalesces bursts of per-chunk repaints into at most one
310
+ * paint per window, shrinking the splice/DECSC-clobber window.
311
+ */
312
+ coalesceMs: number;
313
+ /**
314
+ * Max ms to hold a repaint while output keeps ending mid escape-sequence
315
+ * before painting anyway (bounded residual splice risk). Default 100.
316
+ */
317
+ boundaryHoldMs?: number;
318
+ setTimer?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
319
+ clearTimer?: (t: ReturnType<typeof setTimeout>) => void;
320
+ now?: () => number;
321
+ }
322
+ /**
323
+ * Coordinates status-line repaints for the interactive attach clients.
324
+ *
325
+ * Correctness properties (see #1247):
326
+ * - **Non-TTY skip** — when `enabled` is false, nothing is ever written.
327
+ * - **Boundary-hold** — a repaint is deferred while the observed output ends
328
+ * mid ANSI escape sequence, so the status line never splices into a
329
+ * half-transmitted CSI. It paints as soon as the next chunk lands at a
330
+ * boundary (or after `boundaryHoldMs` as a bounded fallback).
331
+ * - **Coalescing** — repaints are rate-limited to at most one per
332
+ * `coalesceMs`, shrinking the window in which our save/restore-cursor wrap
333
+ * can clobber the agent's own pending DECSC.
334
+ * - **Teardown-safe** — after {@link dispose} no further writes happen.
335
+ *
336
+ * Residual risk (documented): ESC 7/ESC 8 (and CSI s/u) share a single
337
+ * saved-cursor slot on many terminals, so a repaint landing between the
338
+ * agent's DECSC and DECRC can still restore to the wrong spot. Boundary-hold +
339
+ * coalescing shrink but do not eliminate that window.
340
+ */
341
+ export declare class StatusLineController {
342
+ private readonly opts;
343
+ private readonly scanner;
344
+ private timer;
345
+ private timerForce;
346
+ private wantPaint;
347
+ private lastPaintAt;
348
+ private disposed;
349
+ constructor(opts: StatusLineControllerOptions);
350
+ /** Record server output for boundary tracking; flush a held repaint if the
351
+ * stream is now back at a sequence boundary. */
352
+ observeOutput(chunk: string): void;
353
+ /** Request a repaint (coalesced + boundary-held). */
354
+ request(): void;
355
+ /** Stop all painting and cancel any pending timer. */
356
+ dispose(): void;
357
+ private now;
358
+ private flush;
359
+ private paintNow;
360
+ private arm;
361
+ private clearTimer;
362
+ }
363
+ /** Minimal writable surface {@link createBackpressureAwareWriter} needs. */
364
+ export interface BackpressureWritable {
365
+ write(chunk: string): boolean;
366
+ once(event: 'drain', listener: () => void): unknown;
367
+ off?(event: 'drain', listener: () => void): unknown;
368
+ removeListener?(event: 'drain', listener: () => void): unknown;
369
+ }
370
+ /**
371
+ * A backpressure-aware writer plus a teardown hook. Call the writer with each
372
+ * chunk; call {@link BackpressureAwareWriter.dispose} on detach to drop any
373
+ * still-queued chunks and unhook the pending `'drain'` listener so nothing
374
+ * flushes to stdout after the session tears down.
375
+ */
376
+ export interface BackpressureAwareWriter {
377
+ /** Write a chunk, respecting backpressure. No-op after {@link dispose}. */
378
+ write: (chunk: string) => void;
379
+ /** Drop the pending queue and unhook the `'drain'` listener. Idempotent. */
380
+ dispose: () => void;
381
+ }
382
+ /**
383
+ * Default stdout writer that respects backpressure (see #1247, item 7).
384
+ *
385
+ * When the underlying stream reports saturation (`write()` returns false) we
386
+ * hold subsequent chunks in a bounded in-memory queue and flush them on
387
+ * `'drain'`, rather than letting Node's stdout buffer grow without limit under
388
+ * a fast agent + slow terminal.
389
+ *
390
+ * FIFO is preserved even when our own queue reaches `maxQueuedBytes`: rather
391
+ * than writing the overflow chunk straight through (which would jump it ahead
392
+ * of older queued chunks and reorder/split the PTY byte stream), we first flush
393
+ * the entire local queue into stdout's internal buffer — `stdout.write` buffers
394
+ * internally when saturated, so ignoring its return value here is safe — then
395
+ * write the new chunk last. Bounded extra buffering, never dropped or reordered
396
+ * output. Documented residual risk: under sustained overload Node's internal
397
+ * stdout buffer can still grow.
398
+ */
399
+ export declare function createBackpressureAwareWriter(stdout: BackpressureWritable, maxQueuedBytes?: number): BackpressureAwareWriter;
118
400
  /** Dependencies for `captureInitialSnapshot`. `captureAndRenderSnapshot`
119
401
  * is injectable so tests can substitute a stub. */
120
402
  export interface CaptureInitialSnapshotDeps extends AttachSnapshotDeps {
@@ -1 +1 @@
1
- {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/attach.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/attach.ts"],"names":[],"mappings":"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"}