echo-cli-agent 0.1.7 → 0.1.9

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 (53) hide show
  1. package/README.md +11 -2
  2. package/dist/src/dispatch/dispatcher.d.ts +19 -3
  3. package/dist/src/dispatch/dispatcher.js +98 -4
  4. package/dist/src/dispatch/dispatcher.js.map +1 -1
  5. package/dist/src/health/server.d.ts +5 -1
  6. package/dist/src/health/server.js +8 -1
  7. package/dist/src/health/server.js.map +1 -1
  8. package/dist/src/index.js +8 -3
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/providers/codex.js +25 -0
  11. package/dist/src/providers/codex.js.map +1 -1
  12. package/dist/src/providers/detection.d.ts +11 -0
  13. package/dist/src/providers/detection.js +96 -0
  14. package/dist/src/providers/detection.js.map +1 -0
  15. package/dist/src/providers/registry.d.ts +23 -0
  16. package/dist/src/providers/registry.js +59 -29
  17. package/dist/src/providers/registry.js.map +1 -1
  18. package/dist/src/runtime/agent-runtime.js +22 -10
  19. package/dist/src/runtime/agent-runtime.js.map +1 -1
  20. package/dist/src/session/session-manager.d.ts +41 -2
  21. package/dist/src/session/session-manager.js +178 -34
  22. package/dist/src/session/session-manager.js.map +1 -1
  23. package/dist/src/session/terminal-line-sanitizer.d.ts +7 -0
  24. package/dist/src/session/terminal-line-sanitizer.js +21 -0
  25. package/dist/src/session/terminal-line-sanitizer.js.map +1 -0
  26. package/dist/src/session/terminal-tail-buffer.d.ts +70 -0
  27. package/dist/src/session/terminal-tail-buffer.js +149 -0
  28. package/dist/src/session/terminal-tail-buffer.js.map +1 -0
  29. package/dist/src/shared/cli-detection-types.d.ts +19 -0
  30. package/dist/src/shared/cli-detection-types.js +2 -0
  31. package/dist/src/shared/cli-detection-types.js.map +1 -0
  32. package/dist/src/shared/node-cli-command-resolution.d.ts +8 -0
  33. package/dist/src/shared/node-cli-command-resolution.js +11 -1
  34. package/dist/src/shared/node-cli-command-resolution.js.map +1 -1
  35. package/dist/src/transport/taskmcp-client.d.ts +3 -1
  36. package/dist/src/transport/taskmcp-client.js +4 -0
  37. package/dist/src/transport/taskmcp-client.js.map +1 -1
  38. package/dist/src/types/protocol.d.ts +53 -1
  39. package/dist/src/types/protocol.js +33 -1
  40. package/dist/src/types/protocol.js.map +1 -1
  41. package/dist/tests/cli-detection.test.d.ts +1 -0
  42. package/dist/tests/cli-detection.test.js +62 -0
  43. package/dist/tests/cli-detection.test.js.map +1 -0
  44. package/dist/tests/providers.test.js +1 -0
  45. package/dist/tests/providers.test.js.map +1 -1
  46. package/dist/tests/session-manager.test.d.ts +1 -0
  47. package/dist/tests/session-manager.test.js +115 -0
  48. package/dist/tests/session-manager.test.js.map +1 -0
  49. package/dist/tests/terminal-tail-buffer.test.d.ts +1 -0
  50. package/dist/tests/terminal-tail-buffer.test.js +68 -0
  51. package/dist/tests/terminal-tail-buffer.test.js.map +1 -0
  52. package/package.json +1 -1
  53. package/scripts/service.mjs +25 -0
@@ -4,7 +4,10 @@ import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
4
4
  import { randomUUID } from 'node:crypto';
5
5
  import * as pty from 'node-pty';
6
6
  import { resolveProvider } from '../providers/registry.js';
7
+ import { MAX_TAIL_READ_LIMIT, TerminalTailBuffer } from './terminal-tail-buffer.js';
7
8
  const require = createRequire(import.meta.url);
9
+ /** Bytes retained for session-id discovery; the ids Orca-style CLIs print are far shorter. */
10
+ const SESSION_DISCOVERY_WINDOW_CHARS = 16 * 1024;
8
11
  export class SessionManager {
9
12
  config;
10
13
  state;
@@ -19,8 +22,9 @@ export class SessionManager {
19
22
  return this.sessions.size;
20
23
  }
21
24
  /**
22
- * Register a named local window before its first prompt. The server task id is
23
- * the only routing key; a provider-native session id remains optional.
25
+ * Register a stable local window before its first prompt. This mirrors Orca's
26
+ * host-owned terminal identity: the provider-native session id is learned only
27
+ * after the CLI has actually started and emitted it.
24
28
  */
25
29
  async createWindow(request) {
26
30
  const provider = resolveProvider(request.agent_type);
@@ -54,33 +58,45 @@ export class SessionManager {
54
58
  if (this.config.capabilities.length > 0 && !this.config.capabilities.includes(provider.id)) {
55
59
  throw new Error(`CLI 不可用:本机 Agent 未检测到 ${provider.id} CLI`);
56
60
  }
57
- const providerSessionId = request.session_id?.trim();
58
- if (!providerSessionId) {
61
+ const requestedSessionId = request.session_id?.trim();
62
+ const savedWindow = this.state.getCliWindow(request.task_id, provider.id);
63
+ const isWindowSession = Boolean(savedWindow && requestedSessionId === savedWindow.sessionId);
64
+ const providerSessionId = isWindowSession
65
+ ? savedWindow?.providerSessionId
66
+ : requestedSessionId;
67
+ if (!providerSessionId && !isWindowSession) {
59
68
  throw new Error('派发缺少原生会话标识,已拒绝发送以避免新建会话');
60
69
  }
61
70
  const existing = this.sessions.get(sessionKey);
62
71
  if (existing && provider.reuseSession !== false) {
63
- if (existing.sessionId !== providerSessionId) {
72
+ const existingProviderSessionId = existing.providerSessionId ?? existing.sessionId;
73
+ if (providerSessionId && existingProviderSessionId !== providerSessionId) {
64
74
  throw new Error('本地活动会话与指定原生会话不一致,已拒绝发送');
65
75
  }
66
- await hooks.onSessionInitialized(existing.sessionId, false);
76
+ await hooks.onSessionInitialized(existingProviderSessionId, false);
67
77
  await this.writePrompt(existing, request.prompt ?? '');
68
78
  return {
69
79
  runId: request.run_id,
70
- sessionId: existing.sessionId,
80
+ sessionId: existingProviderSessionId,
71
81
  sessionKey,
72
82
  created: false,
73
83
  duplicate: false
74
84
  };
75
85
  }
76
- const savedWindow = this.state.getCliWindow(request.task_id, provider.id);
77
86
  const workdir = await this.validateWorkdir(request.workdir ?? savedWindow?.workdir ?? this.config.allowedRoots[0]);
78
- // Only the control-plane session id is authoritative. Local state may be
79
- // stale after an app restart and must never silently create another chat.
80
- const plan = provider.buildLaunchPlan(request, {
87
+ // A newly-created local window has no provider session yet. Do not pass its
88
+ // host id to Codex as `resume`; the first prompt must create the provider
89
+ // session and only then can its native id be used for continuation.
90
+ const launchRequest = providerSessionId
91
+ ? { ...request, session_id: providerSessionId }
92
+ : { ...request, session_id: undefined };
93
+ const plan = provider.buildLaunchPlan(launchRequest, {
81
94
  allowExecutableOverride: this.config.allowExecutableOverride
82
95
  });
83
- const sessionId = providerSessionId;
96
+ const sessionId = savedWindow?.sessionId ?? requestedSessionId ?? providerSessionId;
97
+ if (!sessionId)
98
+ throw new Error('无法确定本地 CLI 会话标识');
99
+ const mustDiscoverProviderSession = provider.id === 'codex' && !providerSessionId;
84
100
  let terminal;
85
101
  try {
86
102
  await this.ensurePtyHelperExecutable();
@@ -102,23 +118,40 @@ export class SessionManager {
102
118
  ? this.autoApproveTrustPrompt(terminal, request.run_id)
103
119
  : Promise.resolve();
104
120
  const ready = this.waitForStartupOutput(terminal);
121
+ let discoveredProviderSessionId = providerSessionId;
122
+ let resolveProviderSession = () => undefined;
123
+ let providerSessionSettled = false;
124
+ const providerSessionReady = new Promise((resolve) => {
125
+ resolveProviderSession = (value) => {
126
+ if (providerSessionSettled)
127
+ return;
128
+ providerSessionSettled = true;
129
+ resolve(value);
130
+ };
131
+ });
105
132
  const managed = {
106
133
  sessionKey,
107
134
  sessionId,
135
+ ...(providerSessionId ? { providerSessionId } : {}),
108
136
  runId: request.run_id,
137
+ agentType: provider.id,
138
+ taskId: request.task_id,
109
139
  process: terminal,
110
140
  ready,
111
- output: '',
141
+ tail: new TerminalTailBuffer(),
142
+ discoveryWindow: '',
143
+ sessionIdDiscovered: false,
112
144
  startedAt: Date.now(),
113
145
  cancelRequested: false
114
146
  };
115
147
  this.sessions.set(sessionKey, managed);
116
- let discoveredProviderSessionId = providerSessionId;
117
148
  terminal.onData((output) => {
118
- managed.output = `${managed.output}${output}`.slice(-128 * 1024);
119
- const discovered = provider.extractSessionId(output);
149
+ managed.tail.append(output);
150
+ const discovered = this.discoverProviderSession(managed, provider, output);
120
151
  if (discovered && discovered !== discoveredProviderSessionId) {
121
152
  discoveredProviderSessionId = discovered;
153
+ managed.providerSessionId = discovered;
154
+ resolveProviderSession(discovered);
122
155
  void this.state.upsertSession({
123
156
  sessionKey,
124
157
  sessionId,
@@ -149,7 +182,10 @@ export class SessionManager {
149
182
  terminal.onExit(({ exitCode, signal }) => {
150
183
  if (this.sessions.get(sessionKey)?.process === terminal)
151
184
  this.sessions.delete(sessionKey);
152
- const finalText = exitCode !== 0 ? failureSummary(managed.output) : undefined;
185
+ resolveProviderSession(discoveredProviderSessionId);
186
+ const finalText = exitCode !== 0
187
+ ? failureSummary(managed.tail.read({ limit: MAX_TAIL_READ_LIMIT }).lines)
188
+ : undefined;
153
189
  // Keep the provider session metadata after the PTY exits. Orca-style
154
190
  // windows are durable logical sessions; Codex/Claude can resume from the
155
191
  // provider-native id on the next prompt instead of starting over.
@@ -183,15 +219,40 @@ export class SessionManager {
183
219
  updatedAt: new Date().toISOString()
184
220
  });
185
221
  await hooks.onProcessStarted(sessionId, terminal.pid);
186
- await hooks.onSessionInitialized(sessionId, true);
187
222
  await trustApproval;
223
+ if (mustDiscoverProviderSession) {
224
+ const discovered = await this.waitForProviderSession(providerSessionReady, terminal, sessionId);
225
+ if (!discovered) {
226
+ throw new Error('Codex 启动后未发现原生 session id,已拒绝继续复用该会话');
227
+ }
228
+ discoveredProviderSessionId = discovered;
229
+ managed.providerSessionId = discovered;
230
+ const namedWindow = this.state.getCliWindow(request.task_id, provider.id);
231
+ if (namedWindow) {
232
+ await this.state.upsertCliWindow({
233
+ ...namedWindow,
234
+ providerSessionId: discovered,
235
+ updatedAt: new Date().toISOString()
236
+ });
237
+ }
238
+ await this.state.upsertSession({
239
+ sessionKey,
240
+ sessionId,
241
+ agentType: provider.id,
242
+ workdir,
243
+ providerSessionId: discovered,
244
+ updatedAt: new Date().toISOString()
245
+ });
246
+ }
247
+ const publicSessionId = discoveredProviderSessionId ?? sessionId;
248
+ await hooks.onSessionInitialized(publicSessionId, true);
188
249
  if (plan.promptDelivery !== 'startup') {
189
250
  await this.writePrompt(managed, request.prompt ?? '');
190
251
  }
191
- this.logger.info('prompt-delivered', { sessionKey, sessionId, runId: request.run_id });
252
+ this.logger.info('prompt-delivered', { sessionKey, sessionId: publicSessionId, runId: request.run_id });
192
253
  return {
193
254
  runId: request.run_id,
194
- sessionId,
255
+ sessionId: publicSessionId,
195
256
  sessionKey,
196
257
  created: true,
197
258
  duplicate: false
@@ -208,6 +269,68 @@ export class SessionManager {
208
269
  }
209
270
  this.sessions.clear();
210
271
  }
272
+ /**
273
+ * Read the newest terminal rows of a live session, or page backwards from a
274
+ * cursor a previous read returned. Nothing is persisted and nothing is logged:
275
+ * the rows are sanitized, handed to the caller, and forgotten.
276
+ *
277
+ * A run id is matched first. Sessions outlive a single run, so a task plus
278
+ * agent type still resolves after a later prompt has taken over the session.
279
+ */
280
+ peekOutput(query, options = {}) {
281
+ const session = this.findSession(query);
282
+ if (!session)
283
+ return undefined;
284
+ const read = session.tail.read(options);
285
+ return {
286
+ runId: session.runId,
287
+ sessionId: session.providerSessionId ?? session.sessionId,
288
+ agentType: session.agentType,
289
+ lines: read.lines,
290
+ startCursor: read.startCursor,
291
+ nextCursor: read.nextCursor,
292
+ oldestCursor: read.oldestCursor,
293
+ latestCursor: read.latestCursor,
294
+ hasMore: read.hasMore,
295
+ truncated: read.truncated,
296
+ limited: read.limited,
297
+ idleMs: read.idleMs,
298
+ markers: this.outputMarkers(read.lines.join('\n'))
299
+ };
300
+ }
301
+ findSession(query) {
302
+ if (query.runId) {
303
+ const byRun = [...this.sessions.values()].find((item) => item.runId === query.runId);
304
+ if (byRun)
305
+ return byRun;
306
+ }
307
+ if (!query.taskId)
308
+ return undefined;
309
+ const agentType = query.agentType?.toLowerCase();
310
+ if (agentType)
311
+ return this.sessions.get(`${query.taskId}:${agentType}`);
312
+ return [...this.sessions.values()].find((item) => item.taskId === query.taskId);
313
+ }
314
+ /**
315
+ * Look for the provider-native session id in a bounded rolling window instead
316
+ * of the retained tail. CLIs print the id during startup, so the window is
317
+ * released after the first hit rather than re-scanned for the whole session.
318
+ */
319
+ discoverProviderSession(session, provider, chunk) {
320
+ if (session.sessionIdDiscovered)
321
+ return undefined;
322
+ const window = `${session.discoveryWindow}${chunk}`;
323
+ session.discoveryWindow =
324
+ window.length > SESSION_DISCOVERY_WINDOW_CHARS
325
+ ? window.slice(-SESSION_DISCOVERY_WINDOW_CHARS)
326
+ : window;
327
+ const discovered = provider.extractSessionId(session.discoveryWindow);
328
+ if (!discovered)
329
+ return undefined;
330
+ session.sessionIdDiscovered = true;
331
+ session.discoveryWindow = '';
332
+ return discovered;
333
+ }
211
334
  /** Stop the PTY that owns the requested remote run. */
212
335
  cancelRun(runId) {
213
336
  const session = [...this.sessions.values()].find((item) => item.runId === runId);
@@ -229,6 +352,32 @@ export class SessionManager {
229
352
  const safePrompt = prompt.replaceAll('\u0000', '').replaceAll('\u001b', '');
230
353
  session.process.write(`\u001b[200~${safePrompt}\u001b[201~\r`);
231
354
  }
355
+ async waitForProviderSession(ready, terminal, sessionId) {
356
+ let timer;
357
+ let discovered;
358
+ try {
359
+ discovered = await Promise.race([
360
+ ready,
361
+ new Promise((resolve) => {
362
+ timer = setTimeout(() => resolve(undefined), 15_000);
363
+ })
364
+ ]);
365
+ return discovered;
366
+ }
367
+ finally {
368
+ if (timer)
369
+ clearTimeout(timer);
370
+ if (!discovered) {
371
+ try {
372
+ terminal.kill();
373
+ }
374
+ catch {
375
+ // The process may have exited while the timeout was settling.
376
+ }
377
+ this.logger.warn('cli-provider-session-discovery-timeout', { sessionId });
378
+ }
379
+ }
380
+ }
232
381
  waitForStartupOutput(terminal) {
233
382
  return new Promise((resolveReady) => {
234
383
  let settled = false;
@@ -319,21 +468,16 @@ export class SessionManager {
319
468
  return error instanceof Error ? error.message : String(error);
320
469
  }
321
470
  }
322
- const ANSI_ESCAPE = /\u001b\[[0-?]*[ -/]*[@-~]/g;
323
- const SENSITIVE_VALUE = /\b(?:sk|rk|pk|ghp|github_pat)_[A-Za-z0-9._-]+\b|\bBearer\s+[^\s]+|\b(?:api[_-]?key|token|authorization|x-mcp-token)\s*[:=]\s*[^\s]+/gi;
324
471
  const FAILURE_LINE = /\b(?:error|failed|failure|fatal|forbidden|unauthorized|denied|invalid|unable|not found)\b|失败|错误|额度|拒绝|无权限|未授权/i;
325
472
  const MAX_FAILURE_SUMMARY_LENGTH = 500;
326
- function failureSummary(output) {
327
- const cleaned = output
328
- .replace(ANSI_ESCAPE, '')
329
- .replace(/\r/g, '\n')
330
- .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, '')
331
- .replace(SENSITIVE_VALUE, '[redacted]');
332
- const matchingLines = cleaned
333
- .split('\n')
334
- .map((line) => line.trim().replace(/\s+/g, ' '))
335
- .filter((line) => line.length > 0 && FAILURE_LINE.test(line));
336
- const detail = matchingLines.at(-1);
337
- return detail ? detail.slice(-MAX_FAILURE_SUMMARY_LENGTH) : undefined;
473
+ /** Rows arrive already stripped and redacted by the tail buffer. */
474
+ function failureSummary(lines) {
475
+ for (let index = lines.length - 1; index >= 0; index -= 1) {
476
+ const line = lines[index].trim().replace(/\s+/g, ' ');
477
+ if (line.length > 0 && FAILURE_LINE.test(line)) {
478
+ return line.slice(-MAX_FAILURE_SUMMARY_LENGTH);
479
+ }
480
+ }
481
+ return undefined;
338
482
  }
339
483
  //# sourceMappingURL=session-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Terminal row sanitization. The escape, control-byte and credential patterns
3
+ * live here so there is a single place to audit what can leave the device when
4
+ * terminal text is read on demand.
5
+ */
6
+ /** Strip escapes and control bytes, redact credential-shaped values, drop cell padding. */
7
+ export declare function sanitizeTerminalLine(line: string): string;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Terminal row sanitization. The escape, control-byte and credential patterns
3
+ * live here so there is a single place to audit what can leave the device when
4
+ * terminal text is read on demand.
5
+ */
6
+ // CSI (`ESC [ … final`), terminated OSC (`ESC ] … BEL/ST`) and two-character escapes.
7
+ const TERMINAL_ESCAPE = /\u001b(?:\][^\u0007]*?(?:\u0007|\u001b\\)|\[[0-?]*[ -/]*[@-~]|[@-Z\\-_])/g;
8
+ // Everything unprintable except tab.
9
+ const CONTROL_CHARACTER = /[\u0000-\u0008\u000b-\u001f\u007f]/g;
10
+ // A labeled key redacts to end of line: `Authorization: Bearer <token>` would
11
+ // otherwise stop at the scheme and leave the token itself in the output.
12
+ const SENSITIVE_VALUE = /\b(?:sk|rk|pk|ghp|github_pat)_[A-Za-z0-9._-]+|\bBearer\s+\S+|\b(?:api[_-]?key|token|authorization|x-mcp-token)\s*[:=]\s*\S[^\r\n]*/gi;
13
+ /** Strip escapes and control bytes, redact credential-shaped values, drop cell padding. */
14
+ export function sanitizeTerminalLine(line) {
15
+ return line
16
+ .replace(TERMINAL_ESCAPE, '')
17
+ .replace(CONTROL_CHARACTER, '')
18
+ .replace(SENSITIVE_VALUE, '[redacted]')
19
+ .replace(/\s+$/, '');
20
+ }
21
+ //# sourceMappingURL=terminal-line-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-line-sanitizer.js","sourceRoot":"","sources":["../../../src/session/terminal-line-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sFAAsF;AACtF,MAAM,eAAe,GAAG,2EAA2E,CAAA;AACnG,qCAAqC;AACrC,MAAM,iBAAiB,GAAG,qCAAqC,CAAA;AAC/D,8EAA8E;AAC9E,yEAAyE;AACzE,MAAM,eAAe,GACnB,sIAAsI,CAAA;AAExI,2FAA2F;AAC3F,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI;SACR,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC;SACtC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACxB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Bounded terminal tail with absolute line cursors, so a client can read the
3
+ * newest rows and then page backwards without re-reading what it already has.
4
+ *
5
+ * Mirrors Orca's split between a line-oriented tail and the still-unterminated
6
+ * partial line. Two properties matter for cost:
7
+ *
8
+ * - Appends are O(chunk). The naive `output = (output + chunk).slice(-N)` form
9
+ * re-materializes the whole retained tail on every PTY chunk, which is O(N)
10
+ * per write; a busy CLI turns that into a per-keystroke copy of 128 KiB.
11
+ * - Reads are O(requested lines). Escape stripping and redaction run on the
12
+ * returned rows only, never on the whole buffer.
13
+ *
14
+ * Retained rows are raw. Sanitizing on read keeps escape sequences that straddle
15
+ * a chunk boundary intact until the full sequence has arrived.
16
+ */
17
+ /** Retained completed rows. Matches Orca's `MAX_TAIL_LINES`. */
18
+ export declare const MAX_TAIL_LINES = 2000;
19
+ /** Retained characters across completed rows. Matches Orca's `MAX_TAIL_CHARS`. */
20
+ export declare const MAX_TAIL_CHARS: number;
21
+ /** A CLI that redraws a spinner without ever emitting a newline cannot grow past this. */
22
+ export declare const MAX_TAIL_PARTIAL_CHARS = 4000;
23
+ /** Rows returned when the caller does not ask for a specific count. */
24
+ export declare const DEFAULT_TAIL_READ_LIMIT = 120;
25
+ export declare const MAX_TAIL_READ_LIMIT = 2000;
26
+ /** Character budget applied after the row limit, so wide rows cannot blow up a response. */
27
+ export declare const MAX_TAIL_READ_CHARS: number;
28
+ export type TerminalTailReadOptions = {
29
+ /** Rows to return, clamped to `MAX_TAIL_READ_LIMIT`. */
30
+ limit?: number;
31
+ /** Absolute cursor to read backwards from. Omit for the newest rows. */
32
+ beforeCursor?: number;
33
+ };
34
+ export type TerminalTailRead = {
35
+ lines: string[];
36
+ /** Absolute index of `lines[0]`. Pass it back as `beforeCursor` to page further up. */
37
+ startCursor: number;
38
+ /** Absolute index just past the last completed row returned. */
39
+ nextCursor: number;
40
+ /** Oldest absolute index still retained. `startCursor` cannot go below it. */
41
+ oldestCursor: number;
42
+ /** Absolute count of rows completed so far. */
43
+ latestCursor: number;
44
+ /** More retained rows exist above `startCursor`. */
45
+ hasMore: boolean;
46
+ /** Rows older than `oldestCursor` were dropped to stay within the caps. */
47
+ truncated: boolean;
48
+ /** The character budget clipped the response. */
49
+ limited: boolean;
50
+ /** Milliseconds since the CLI last wrote anything, or undefined if it never did. */
51
+ idleMs: number | undefined;
52
+ };
53
+ export declare class TerminalTailBuffer {
54
+ /** Completed rows, raw. Dropped head slots are blanked, then compacted in batches. */
55
+ private lines;
56
+ private head;
57
+ private chars;
58
+ /** Absolute count of completed rows, including dropped ones. Defines cursor space. */
59
+ private completedCount;
60
+ private partial;
61
+ private droppedRows;
62
+ private lastOutputAt;
63
+ get lastWriteAt(): number | undefined;
64
+ append(chunk: string, at?: number): void;
65
+ read(options?: TerminalTailReadOptions, now?: number): TerminalTailRead;
66
+ private appendPartial;
67
+ private commitPartial;
68
+ private trim;
69
+ private dropHead;
70
+ }
@@ -0,0 +1,149 @@
1
+ import { sanitizeTerminalLine } from './terminal-line-sanitizer.js';
2
+ /**
3
+ * Bounded terminal tail with absolute line cursors, so a client can read the
4
+ * newest rows and then page backwards without re-reading what it already has.
5
+ *
6
+ * Mirrors Orca's split between a line-oriented tail and the still-unterminated
7
+ * partial line. Two properties matter for cost:
8
+ *
9
+ * - Appends are O(chunk). The naive `output = (output + chunk).slice(-N)` form
10
+ * re-materializes the whole retained tail on every PTY chunk, which is O(N)
11
+ * per write; a busy CLI turns that into a per-keystroke copy of 128 KiB.
12
+ * - Reads are O(requested lines). Escape stripping and redaction run on the
13
+ * returned rows only, never on the whole buffer.
14
+ *
15
+ * Retained rows are raw. Sanitizing on read keeps escape sequences that straddle
16
+ * a chunk boundary intact until the full sequence has arrived.
17
+ */
18
+ /** Retained completed rows. Matches Orca's `MAX_TAIL_LINES`. */
19
+ export const MAX_TAIL_LINES = 2_000;
20
+ /** Retained characters across completed rows. Matches Orca's `MAX_TAIL_CHARS`. */
21
+ export const MAX_TAIL_CHARS = 256 * 1024;
22
+ /** A CLI that redraws a spinner without ever emitting a newline cannot grow past this. */
23
+ export const MAX_TAIL_PARTIAL_CHARS = 4_000;
24
+ /** Rows returned when the caller does not ask for a specific count. */
25
+ export const DEFAULT_TAIL_READ_LIMIT = 120;
26
+ export const MAX_TAIL_READ_LIMIT = MAX_TAIL_LINES;
27
+ /** Character budget applied after the row limit, so wide rows cannot blow up a response. */
28
+ export const MAX_TAIL_READ_CHARS = 32 * 1024;
29
+ /** Empty head slots tolerated before the backing array is compacted. */
30
+ const HEAD_COMPACT_THRESHOLD = 1_024;
31
+ export class TerminalTailBuffer {
32
+ /** Completed rows, raw. Dropped head slots are blanked, then compacted in batches. */
33
+ lines = [];
34
+ head = 0;
35
+ chars = 0;
36
+ /** Absolute count of completed rows, including dropped ones. Defines cursor space. */
37
+ completedCount = 0;
38
+ partial = '';
39
+ droppedRows = false;
40
+ lastOutputAt;
41
+ get lastWriteAt() {
42
+ return this.lastOutputAt;
43
+ }
44
+ append(chunk, at = Date.now()) {
45
+ if (!chunk)
46
+ return;
47
+ this.lastOutputAt = at;
48
+ let index = 0;
49
+ for (;;) {
50
+ const newline = chunk.indexOf('\n', index);
51
+ if (newline === -1) {
52
+ this.appendPartial(chunk.slice(index));
53
+ return;
54
+ }
55
+ // Trim the CR of a CRLF pair so it does not survive as a row rewrite.
56
+ const end = newline > index && chunk.charCodeAt(newline - 1) === 13 ? newline - 1 : newline;
57
+ this.appendPartial(chunk.slice(index, end));
58
+ this.commitPartial();
59
+ index = newline + 1;
60
+ }
61
+ }
62
+ read(options = {}, now = Date.now()) {
63
+ const limit = clampLimit(options.limit);
64
+ const retained = this.lines.length - this.head;
65
+ const oldestCursor = this.completedCount - retained;
66
+ const latestCursor = this.completedCount;
67
+ // A preview read shows what the screen shows, including the row being written.
68
+ const includePartial = options.beforeCursor === undefined && this.partial.length > 0;
69
+ const endCursor = options.beforeCursor === undefined
70
+ ? latestCursor
71
+ : Math.min(Math.max(options.beforeCursor, oldestCursor), latestCursor);
72
+ const rowBudget = Math.max(0, limit - (includePartial ? 1 : 0));
73
+ const startCursor = Math.max(oldestCursor, endCursor - rowBudget);
74
+ const rows = [];
75
+ for (let cursor = startCursor; cursor < endCursor; cursor += 1) {
76
+ rows.push(sanitizeTerminalLine(this.lines[this.head + (cursor - oldestCursor)] ?? ''));
77
+ }
78
+ if (includePartial)
79
+ rows.push(sanitizeTerminalLine(this.partial));
80
+ const clipped = clipToCharacterBudget(rows, MAX_TAIL_READ_CHARS);
81
+ return {
82
+ lines: clipped.lines,
83
+ startCursor,
84
+ nextCursor: endCursor,
85
+ oldestCursor,
86
+ latestCursor,
87
+ hasMore: startCursor > oldestCursor,
88
+ truncated: this.droppedRows,
89
+ limited: clipped.limited,
90
+ idleMs: this.lastOutputAt === undefined ? undefined : Math.max(0, now - this.lastOutputAt)
91
+ };
92
+ }
93
+ appendPartial(text) {
94
+ if (!text)
95
+ return;
96
+ const carriage = text.lastIndexOf('\r');
97
+ // A bare CR rewrites the current row on a real terminal; keep only what would stay visible.
98
+ const next = carriage === -1 ? `${this.partial}${text}` : text.slice(carriage + 1);
99
+ this.partial =
100
+ next.length > MAX_TAIL_PARTIAL_CHARS ? next.slice(-MAX_TAIL_PARTIAL_CHARS) : next;
101
+ }
102
+ commitPartial() {
103
+ const line = this.partial;
104
+ this.partial = '';
105
+ this.lines.push(line);
106
+ this.chars += line.length;
107
+ this.completedCount += 1;
108
+ this.trim();
109
+ }
110
+ trim() {
111
+ while (this.lines.length - this.head > MAX_TAIL_LINES)
112
+ this.dropHead();
113
+ while (this.head < this.lines.length && this.chars > MAX_TAIL_CHARS)
114
+ this.dropHead();
115
+ if (this.head >= HEAD_COMPACT_THRESHOLD) {
116
+ this.lines = this.lines.slice(this.head);
117
+ this.head = 0;
118
+ }
119
+ }
120
+ dropHead() {
121
+ const line = this.lines[this.head];
122
+ if (line === undefined)
123
+ return;
124
+ this.chars -= line.length;
125
+ // Release the row before compaction so a large tail is not pinned by an empty slot.
126
+ this.lines[this.head] = '';
127
+ this.head += 1;
128
+ this.droppedRows = true;
129
+ }
130
+ }
131
+ function clampLimit(limit) {
132
+ if (limit === undefined || !Number.isFinite(limit))
133
+ return DEFAULT_TAIL_READ_LIMIT;
134
+ return Math.max(1, Math.min(Math.floor(limit), MAX_TAIL_READ_LIMIT));
135
+ }
136
+ /**
137
+ * Apply the character budget from the newest row backwards, so the rows closest
138
+ * to what the CLI is doing now are the ones that survive.
139
+ */
140
+ function clipToCharacterBudget(rows, budget) {
141
+ let total = 0;
142
+ for (let index = rows.length - 1; index >= 0; index -= 1) {
143
+ total += rows[index].length + 1;
144
+ if (total > budget)
145
+ return { lines: rows.slice(index + 1), limited: true };
146
+ }
147
+ return { lines: rows, limited: false };
148
+ }
149
+ //# sourceMappingURL=terminal-tail-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-tail-buffer.js","sourceRoot":"","sources":["../../../src/session/terminal-tail-buffer.ts"],"names":[],"mappings":"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"}