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.
- package/README.md +11 -2
- package/dist/src/dispatch/dispatcher.d.ts +19 -3
- package/dist/src/dispatch/dispatcher.js +98 -4
- package/dist/src/dispatch/dispatcher.js.map +1 -1
- package/dist/src/health/server.d.ts +5 -1
- package/dist/src/health/server.js +8 -1
- package/dist/src/health/server.js.map +1 -1
- package/dist/src/index.js +8 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/providers/codex.js +25 -0
- package/dist/src/providers/codex.js.map +1 -1
- package/dist/src/providers/detection.d.ts +11 -0
- package/dist/src/providers/detection.js +96 -0
- package/dist/src/providers/detection.js.map +1 -0
- package/dist/src/providers/registry.d.ts +23 -0
- package/dist/src/providers/registry.js +59 -29
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/runtime/agent-runtime.js +22 -10
- package/dist/src/runtime/agent-runtime.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +41 -2
- package/dist/src/session/session-manager.js +178 -34
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session/terminal-line-sanitizer.d.ts +7 -0
- package/dist/src/session/terminal-line-sanitizer.js +21 -0
- package/dist/src/session/terminal-line-sanitizer.js.map +1 -0
- package/dist/src/session/terminal-tail-buffer.d.ts +70 -0
- package/dist/src/session/terminal-tail-buffer.js +149 -0
- package/dist/src/session/terminal-tail-buffer.js.map +1 -0
- package/dist/src/shared/cli-detection-types.d.ts +19 -0
- package/dist/src/shared/cli-detection-types.js +2 -0
- package/dist/src/shared/cli-detection-types.js.map +1 -0
- package/dist/src/shared/node-cli-command-resolution.d.ts +8 -0
- package/dist/src/shared/node-cli-command-resolution.js +11 -1
- package/dist/src/shared/node-cli-command-resolution.js.map +1 -1
- package/dist/src/transport/taskmcp-client.d.ts +3 -1
- package/dist/src/transport/taskmcp-client.js +4 -0
- package/dist/src/transport/taskmcp-client.js.map +1 -1
- package/dist/src/types/protocol.d.ts +53 -1
- package/dist/src/types/protocol.js +33 -1
- package/dist/src/types/protocol.js.map +1 -1
- package/dist/tests/cli-detection.test.d.ts +1 -0
- package/dist/tests/cli-detection.test.js +62 -0
- package/dist/tests/cli-detection.test.js.map +1 -0
- package/dist/tests/providers.test.js +1 -0
- package/dist/tests/providers.test.js.map +1 -1
- package/dist/tests/session-manager.test.d.ts +1 -0
- package/dist/tests/session-manager.test.js +115 -0
- package/dist/tests/session-manager.test.js.map +1 -0
- package/dist/tests/terminal-tail-buffer.test.d.ts +1 -0
- package/dist/tests/terminal-tail-buffer.test.js +68 -0
- package/dist/tests/terminal-tail-buffer.test.js.map +1 -0
- package/package.json +1 -1
- 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
|
|
23
|
-
*
|
|
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
|
|
58
|
-
|
|
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
|
-
|
|
72
|
+
const existingProviderSessionId = existing.providerSessionId ?? existing.sessionId;
|
|
73
|
+
if (providerSessionId && existingProviderSessionId !== providerSessionId) {
|
|
64
74
|
throw new Error('本地活动会话与指定原生会话不一致,已拒绝发送');
|
|
65
75
|
}
|
|
66
|
-
await hooks.onSessionInitialized(
|
|
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:
|
|
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
|
-
//
|
|
79
|
-
//
|
|
80
|
-
|
|
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
|
-
|
|
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.
|
|
119
|
-
const discovered =
|
|
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
|
-
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
.replace(/\
|
|
330
|
-
.
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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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"}
|