mcp-interactive-terminal 1.0.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.
- package/LICENSE +21 -0
- package/README.md +202 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +173 -0
- package/dist/index.js.map +1 -0
- package/dist/sandbox.d.ts +33 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +99 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/session-manager.d.ts +31 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +158 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/terminal.d.ts +24 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +342 -0
- package/dist/terminal.js.map +1 -0
- package/dist/tools/close-session.d.ts +16 -0
- package/dist/tools/close-session.d.ts.map +1 -0
- package/dist/tools/close-session.js +13 -0
- package/dist/tools/close-session.js.map +1 -0
- package/dist/tools/confirm-dangerous-command.d.ts +19 -0
- package/dist/tools/confirm-dangerous-command.d.ts.map +1 -0
- package/dist/tools/confirm-dangerous-command.js +48 -0
- package/dist/tools/confirm-dangerous-command.js.map +1 -0
- package/dist/tools/create-session.d.ts +31 -0
- package/dist/tools/create-session.d.ts.map +1 -0
- package/dist/tools/create-session.js +39 -0
- package/dist/tools/create-session.js.map +1 -0
- package/dist/tools/list-sessions.d.ts +4 -0
- package/dist/tools/list-sessions.d.ts.map +1 -0
- package/dist/tools/list-sessions.js +4 -0
- package/dist/tools/list-sessions.js.map +1 -0
- package/dist/tools/read-output.d.ts +16 -0
- package/dist/tools/read-output.d.ts.map +1 -0
- package/dist/tools/read-output.js +21 -0
- package/dist/tools/read-output.js.map +1 -0
- package/dist/tools/send-command.d.ts +22 -0
- package/dist/tools/send-command.d.ts.map +1 -0
- package/dist/tools/send-command.js +101 -0
- package/dist/tools/send-command.js.map +1 -0
- package/dist/tools/send-control.d.ts +16 -0
- package/dist/tools/send-control.d.ts.map +1 -0
- package/dist/tools/send-control.js +92 -0
- package/dist/tools/send-control.js.map +1 -0
- package/dist/types.d.ts +117 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/audit-logger.d.ts +23 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +37 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/danger-detector.d.ts +14 -0
- package/dist/utils/danger-detector.d.ts.map +1 -0
- package/dist/utils/danger-detector.js +59 -0
- package/dist/utils/danger-detector.js.map +1 -0
- package/dist/utils/output-detector.d.ts +19 -0
- package/dist/utils/output-detector.d.ts.map +1 -0
- package/dist/utils/output-detector.js +85 -0
- package/dist/utils/output-detector.js.map +1 -0
- package/dist/utils/sanitizer.d.ts +31 -0
- package/dist/utils/sanitizer.d.ts.map +1 -0
- package/dist/utils/sanitizer.js +82 -0
- package/dist/utils/sanitizer.js.map +1 -0
- package/dist/utils/secret-redactor.d.ts +10 -0
- package/dist/utils/secret-redactor.d.ts.map +1 -0
- package/dist/utils/secret-redactor.js +36 -0
- package/dist/utils/secret-redactor.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session lifecycle management.
|
|
3
|
+
* Handles creation, lookup, idle cleanup, and resource limits.
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { resolve as resolvePath } from "node:path";
|
|
7
|
+
import { createTerminal } from "./terminal.js";
|
|
8
|
+
import { audit } from "./utils/audit-logger.js";
|
|
9
|
+
export class SessionManager {
|
|
10
|
+
config;
|
|
11
|
+
sessions = new Map();
|
|
12
|
+
idleTimers = new Map();
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
get sessionCount() {
|
|
17
|
+
return this.sessions.size;
|
|
18
|
+
}
|
|
19
|
+
async createSession(options) {
|
|
20
|
+
// Check limits
|
|
21
|
+
if (this.sessions.size >= this.config.maxSessions) {
|
|
22
|
+
throw new Error(`Maximum sessions (${this.config.maxSessions}) reached. Close an existing session first.`);
|
|
23
|
+
}
|
|
24
|
+
// Validate command against allowlist/blocklist
|
|
25
|
+
this.validateCommand(options.command);
|
|
26
|
+
// Validate cwd against allowed paths
|
|
27
|
+
this.validatePath(options.cwd);
|
|
28
|
+
const terminal = await createTerminal(options);
|
|
29
|
+
const id = randomUUID().slice(0, 8);
|
|
30
|
+
const session = {
|
|
31
|
+
id,
|
|
32
|
+
name: options.name ?? `${options.command}-${id}`,
|
|
33
|
+
command: options.command,
|
|
34
|
+
args: options.args ?? [],
|
|
35
|
+
pid: terminal.pid,
|
|
36
|
+
createdAt: new Date(),
|
|
37
|
+
lastActivity: new Date(),
|
|
38
|
+
isAlive: true,
|
|
39
|
+
terminal,
|
|
40
|
+
pendingDangerousCommands: new Set(),
|
|
41
|
+
};
|
|
42
|
+
this.sessions.set(id, session);
|
|
43
|
+
// Set up idle timeout if configured
|
|
44
|
+
if (this.config.idleTimeout > 0) {
|
|
45
|
+
this.resetIdleTimer(id);
|
|
46
|
+
}
|
|
47
|
+
// Update isAlive on process exit
|
|
48
|
+
const checkAlive = setInterval(() => {
|
|
49
|
+
if (!terminal.isAlive) {
|
|
50
|
+
session.isAlive = false;
|
|
51
|
+
clearInterval(checkAlive);
|
|
52
|
+
}
|
|
53
|
+
}, 1000);
|
|
54
|
+
return session;
|
|
55
|
+
}
|
|
56
|
+
getSession(id) {
|
|
57
|
+
const session = this.sessions.get(id);
|
|
58
|
+
if (!session) {
|
|
59
|
+
throw new Error(`Session "${id}" not found`);
|
|
60
|
+
}
|
|
61
|
+
// Sync alive status
|
|
62
|
+
session.isAlive = session.terminal.isAlive;
|
|
63
|
+
return session;
|
|
64
|
+
}
|
|
65
|
+
listSessions() {
|
|
66
|
+
return Array.from(this.sessions.values()).map((s) => ({
|
|
67
|
+
session_id: s.id,
|
|
68
|
+
name: s.name,
|
|
69
|
+
command: s.command,
|
|
70
|
+
pid: s.pid,
|
|
71
|
+
is_alive: s.terminal.isAlive,
|
|
72
|
+
created_at: s.createdAt.toISOString(),
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
closeSession(id, signal) {
|
|
76
|
+
const session = this.getSession(id);
|
|
77
|
+
session.terminal.kill(signal);
|
|
78
|
+
session.terminal.dispose();
|
|
79
|
+
session.isAlive = false;
|
|
80
|
+
this.sessions.delete(id);
|
|
81
|
+
this.clearIdleTimer(id);
|
|
82
|
+
}
|
|
83
|
+
closeAll() {
|
|
84
|
+
for (const [id] of this.sessions) {
|
|
85
|
+
try {
|
|
86
|
+
this.closeSession(id);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore errors during cleanup
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
touchSession(id) {
|
|
94
|
+
const session = this.sessions.get(id);
|
|
95
|
+
if (session) {
|
|
96
|
+
session.lastActivity = new Date();
|
|
97
|
+
if (this.config.idleTimeout > 0) {
|
|
98
|
+
this.resetIdleTimer(id);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if an absolute path is within the allowed paths list.
|
|
104
|
+
* Returns true if no allowedPaths are configured (unrestricted).
|
|
105
|
+
*/
|
|
106
|
+
isPathAllowed(targetPath) {
|
|
107
|
+
if (this.config.allowedPaths.length === 0)
|
|
108
|
+
return true;
|
|
109
|
+
const resolved = resolvePath(targetPath);
|
|
110
|
+
return this.config.allowedPaths.some((allowed) => {
|
|
111
|
+
const resolvedAllowed = resolvePath(allowed);
|
|
112
|
+
return resolved === resolvedAllowed || resolved.startsWith(resolvedAllowed + "/");
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
validatePath(cwd) {
|
|
116
|
+
if (this.config.allowedPaths.length === 0)
|
|
117
|
+
return;
|
|
118
|
+
const target = resolvePath(cwd ?? process.cwd());
|
|
119
|
+
if (!this.isPathAllowed(target)) {
|
|
120
|
+
throw new Error(`Working directory "${target}" is not in the allowed paths: ${this.config.allowedPaths.join(", ")}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
validateCommand(command) {
|
|
124
|
+
const base = command.split("/").pop() ?? command;
|
|
125
|
+
if (this.config.allowedCommands.length > 0) {
|
|
126
|
+
if (!this.config.allowedCommands.includes(base)) {
|
|
127
|
+
throw new Error(`Command "${base}" is not in the allowed list: ${this.config.allowedCommands.join(", ")}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (this.config.blockedCommands.includes(base)) {
|
|
131
|
+
throw new Error(`Command "${base}" is blocked by configuration`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
resetIdleTimer(id) {
|
|
135
|
+
this.clearIdleTimer(id);
|
|
136
|
+
const timer = setTimeout(() => {
|
|
137
|
+
const session = this.sessions.get(id);
|
|
138
|
+
if (session) {
|
|
139
|
+
audit("session_idle_timeout", id, { name: session.name });
|
|
140
|
+
try {
|
|
141
|
+
this.closeSession(id);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Ignore
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}, this.config.idleTimeout);
|
|
148
|
+
this.idleTimers.set(id, timer);
|
|
149
|
+
}
|
|
150
|
+
clearIdleTimer(id) {
|
|
151
|
+
const timer = this.idleTimers.get(id);
|
|
152
|
+
if (timer) {
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
this.idleTimers.delete(id);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core terminal wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Strategy:
|
|
5
|
+
* 1. Try node-pty + xterm-headless (best: true PTY, clean rendered output)
|
|
6
|
+
* 2. Fallback to child_process.spawn with pipes (works in sandboxed environments)
|
|
7
|
+
*
|
|
8
|
+
* The fallback loses PTY features (no terminal emulation, no resize) but
|
|
9
|
+
* provides working interactive sessions in Claude Code's sandbox.
|
|
10
|
+
*/
|
|
11
|
+
import type { TerminalWrapper } from "./types.js";
|
|
12
|
+
export interface TerminalOptions {
|
|
13
|
+
command: string;
|
|
14
|
+
args?: string[];
|
|
15
|
+
cwd?: string;
|
|
16
|
+
env?: Record<string, string>;
|
|
17
|
+
cols?: number;
|
|
18
|
+
rows?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a terminal wrapper. Tries node-pty first, falls back to child_process.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createTerminal(options: TerminalOptions): Promise<TerminalWrapper>;
|
|
24
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAOvF"}
|
package/dist/terminal.js
ADDED
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core terminal wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Strategy:
|
|
5
|
+
* 1. Try node-pty + xterm-headless (best: true PTY, clean rendered output)
|
|
6
|
+
* 2. Fallback to child_process.spawn with pipes (works in sandboxed environments)
|
|
7
|
+
*
|
|
8
|
+
* The fallback loses PTY features (no terminal emulation, no resize) but
|
|
9
|
+
* provides working interactive sessions in Claude Code's sandbox.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
import { detectPromptPattern, endsWithPrompt } from "./utils/output-detector.js";
|
|
13
|
+
import { stripAnsi } from "./utils/sanitizer.js";
|
|
14
|
+
import { wrapCommand, isSandboxActive } from "./sandbox.js";
|
|
15
|
+
const OUTPUT_SETTLE_MS = 300;
|
|
16
|
+
/**
|
|
17
|
+
* Create a terminal wrapper. Tries node-pty first, falls back to child_process.
|
|
18
|
+
*/
|
|
19
|
+
export async function createTerminal(options) {
|
|
20
|
+
try {
|
|
21
|
+
return await createPtyTerminal(options);
|
|
22
|
+
}
|
|
23
|
+
catch (ptyErr) {
|
|
24
|
+
console.error(`[mcp-terminal] node-pty failed (${ptyErr}), falling back to pipe mode`);
|
|
25
|
+
return createPipeTerminal(options);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ─── PTY mode (node-pty + xterm-headless) ───────────────────────────
|
|
29
|
+
async function createPtyTerminal(options) {
|
|
30
|
+
// Dynamic imports — these are optional deps in pipe-fallback mode
|
|
31
|
+
const pty = await import("node-pty");
|
|
32
|
+
const xtermMod = await import("@xterm/headless");
|
|
33
|
+
const Terminal = xtermMod.Terminal ?? xtermMod.default?.Terminal;
|
|
34
|
+
const cols = options.cols ?? 120;
|
|
35
|
+
const rows = options.rows ?? 40;
|
|
36
|
+
const xterm = new Terminal({ cols, rows, scrollback: 1000 });
|
|
37
|
+
const ptyProcess = pty.spawn(options.command, options.args ?? [], {
|
|
38
|
+
name: "xterm-256color",
|
|
39
|
+
cols,
|
|
40
|
+
rows,
|
|
41
|
+
cwd: options.cwd ?? process.cwd(),
|
|
42
|
+
env: { ...process.env, ...options.env },
|
|
43
|
+
});
|
|
44
|
+
let isAlive = true;
|
|
45
|
+
let promptPattern = null;
|
|
46
|
+
let outputBuffer = "";
|
|
47
|
+
let lastOutputTime = Date.now();
|
|
48
|
+
ptyProcess.onData((data) => {
|
|
49
|
+
xterm.write(data);
|
|
50
|
+
outputBuffer += data;
|
|
51
|
+
lastOutputTime = Date.now();
|
|
52
|
+
});
|
|
53
|
+
ptyProcess.onExit(() => {
|
|
54
|
+
isAlive = false;
|
|
55
|
+
});
|
|
56
|
+
const wrapper = {
|
|
57
|
+
process: ptyProcess,
|
|
58
|
+
pid: ptyProcess.pid,
|
|
59
|
+
get isAlive() { return isAlive; },
|
|
60
|
+
promptPattern,
|
|
61
|
+
mode: "pty",
|
|
62
|
+
write(data) {
|
|
63
|
+
if (!isAlive)
|
|
64
|
+
throw new Error("Session is not alive");
|
|
65
|
+
outputBuffer = "";
|
|
66
|
+
ptyProcess.write(data);
|
|
67
|
+
},
|
|
68
|
+
readScreen(fullScreen = false) {
|
|
69
|
+
const buffer = xterm.buffer.active;
|
|
70
|
+
const lines = [];
|
|
71
|
+
if (fullScreen) {
|
|
72
|
+
const start = -buffer.viewportY;
|
|
73
|
+
for (let i = start; i < buffer.length; i++) {
|
|
74
|
+
const line = buffer.getLine(i);
|
|
75
|
+
if (line)
|
|
76
|
+
lines.push(line.translateToString(true));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
for (let i = 0; i < rows; i++) {
|
|
81
|
+
const line = buffer.getLine(buffer.baseY + i);
|
|
82
|
+
if (line)
|
|
83
|
+
lines.push(line.translateToString(true));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
while (lines.length > 0 && lines[lines.length - 1].trim() === "")
|
|
87
|
+
lines.pop();
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
},
|
|
90
|
+
async waitForOutput(timeoutMs) {
|
|
91
|
+
return waitForSettled(() => isAlive, () => outputBuffer, () => lastOutputTime, () => wrapper.readScreen(), timeoutMs, wrapper);
|
|
92
|
+
},
|
|
93
|
+
resize(newCols, newRows) {
|
|
94
|
+
ptyProcess.resize(newCols, newRows);
|
|
95
|
+
xterm.resize(newCols, newRows);
|
|
96
|
+
},
|
|
97
|
+
kill(signal) {
|
|
98
|
+
if (isAlive) {
|
|
99
|
+
ptyProcess.kill(signal);
|
|
100
|
+
isAlive = false;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
dispose() {
|
|
104
|
+
if (isAlive) {
|
|
105
|
+
ptyProcess.kill();
|
|
106
|
+
isAlive = false;
|
|
107
|
+
}
|
|
108
|
+
xterm.dispose();
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
// Wait for startup output to detect prompt
|
|
112
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
113
|
+
const startupScreen = wrapper.readScreen();
|
|
114
|
+
promptPattern = detectPromptPattern(startupScreen);
|
|
115
|
+
wrapper.promptPattern = promptPattern;
|
|
116
|
+
return wrapper;
|
|
117
|
+
}
|
|
118
|
+
// ─── Pipe mode (child_process fallback) ─────────────────────────────
|
|
119
|
+
/**
|
|
120
|
+
* In pipe mode, some programs need extra flags to behave interactively.
|
|
121
|
+
* Returns modified args array with interactive flags prepended if needed.
|
|
122
|
+
*/
|
|
123
|
+
function pipeInteractiveArgs(command, args) {
|
|
124
|
+
const base = command.split("/").pop() ?? command;
|
|
125
|
+
// Python: needs -i for interactive mode, -u for unbuffered
|
|
126
|
+
if (/^python[23]?$/.test(base)) {
|
|
127
|
+
const hasI = args.includes("-i") || args.includes("-u");
|
|
128
|
+
if (!hasI)
|
|
129
|
+
return ["-u", "-i", ...args];
|
|
130
|
+
if (!args.includes("-u"))
|
|
131
|
+
return ["-u", ...args];
|
|
132
|
+
return args;
|
|
133
|
+
}
|
|
134
|
+
// Node: needs --interactive (or -i) for REPL when stdin is piped
|
|
135
|
+
if (base === "node" || base === "nodejs") {
|
|
136
|
+
const hasI = args.includes("-i") || args.includes("--interactive");
|
|
137
|
+
if (!hasI)
|
|
138
|
+
return ["--interactive", ...args];
|
|
139
|
+
return args;
|
|
140
|
+
}
|
|
141
|
+
// Bash/zsh/sh: add -i for interactive mode, but NOT when using -c (command string)
|
|
142
|
+
if (/^(ba)?sh$|^zsh$/.test(base)) {
|
|
143
|
+
if (args.includes("-c"))
|
|
144
|
+
return args; // -c means non-interactive command wrapper
|
|
145
|
+
const hasI = args.includes("-i");
|
|
146
|
+
if (!hasI)
|
|
147
|
+
return ["-i", ...args];
|
|
148
|
+
return args;
|
|
149
|
+
}
|
|
150
|
+
return args;
|
|
151
|
+
}
|
|
152
|
+
async function createPipeTerminal(options) {
|
|
153
|
+
const args = pipeInteractiveArgs(options.command, options.args ?? []);
|
|
154
|
+
const envVars = {
|
|
155
|
+
...process.env,
|
|
156
|
+
TERM: "dumb",
|
|
157
|
+
PYTHONUNBUFFERED: "1",
|
|
158
|
+
PYTHONDONTWRITEBYTECODE: "1",
|
|
159
|
+
NODE_NO_READLINE: "1",
|
|
160
|
+
...options.env,
|
|
161
|
+
};
|
|
162
|
+
// If sandbox is active, wrap the command
|
|
163
|
+
let proc;
|
|
164
|
+
if (isSandboxActive()) {
|
|
165
|
+
const fullCmd = [options.command, ...args].map((a) => a.includes(" ") ? `"${a}"` : a).join(" ");
|
|
166
|
+
const { command: wrappedCmd } = await wrapCommand(fullCmd);
|
|
167
|
+
try {
|
|
168
|
+
proc = spawn(wrappedCmd, {
|
|
169
|
+
cwd: options.cwd ?? process.cwd(),
|
|
170
|
+
env: envVars,
|
|
171
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
172
|
+
shell: true,
|
|
173
|
+
detached: true,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
throw new Error(`Failed to spawn sandboxed "${options.command}": ${err}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
try {
|
|
182
|
+
proc = spawn(options.command, args, {
|
|
183
|
+
cwd: options.cwd ?? process.cwd(),
|
|
184
|
+
env: envVars,
|
|
185
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
186
|
+
detached: true,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
throw new Error(`Failed to spawn "${options.command}": ${err}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
if (!proc.pid) {
|
|
195
|
+
// Handle spawn errors that come async
|
|
196
|
+
proc.once("error", (err) => {
|
|
197
|
+
reject(new Error(`Failed to spawn "${options.command}": ${err.message}`));
|
|
198
|
+
});
|
|
199
|
+
// Give it a moment to either get a pid or error
|
|
200
|
+
setTimeout(() => {
|
|
201
|
+
if (!proc.pid) {
|
|
202
|
+
reject(new Error(`Failed to spawn "${options.command}": no pid assigned`));
|
|
203
|
+
}
|
|
204
|
+
}, 500);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
let isAlive = true;
|
|
208
|
+
let promptPattern = null;
|
|
209
|
+
let outputLines = [];
|
|
210
|
+
let lastOutputTime = Date.now();
|
|
211
|
+
let outputGeneration = 0;
|
|
212
|
+
// Separate buffer for output since last write()
|
|
213
|
+
let newOutputBuffer = "";
|
|
214
|
+
const appendOutput = (data) => {
|
|
215
|
+
const text = data.toString();
|
|
216
|
+
newOutputBuffer += text;
|
|
217
|
+
// Also maintain full output lines for full_screen reads
|
|
218
|
+
const parts = text.split("\n");
|
|
219
|
+
if (parts.length === 1) {
|
|
220
|
+
if (outputLines.length === 0)
|
|
221
|
+
outputLines.push("");
|
|
222
|
+
outputLines[outputLines.length - 1] += parts[0];
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
if (outputLines.length > 0) {
|
|
226
|
+
outputLines[outputLines.length - 1] += parts[0];
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
outputLines.push(parts[0]);
|
|
230
|
+
}
|
|
231
|
+
for (let i = 1; i < parts.length; i++) {
|
|
232
|
+
outputLines.push(parts[i]);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
lastOutputTime = Date.now();
|
|
236
|
+
outputGeneration++;
|
|
237
|
+
// Cap scrollback at 2000 lines
|
|
238
|
+
if (outputLines.length > 2000) {
|
|
239
|
+
outputLines = outputLines.slice(-1000);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
proc.stdout.on("data", appendOutput);
|
|
243
|
+
proc.stderr.on("data", appendOutput);
|
|
244
|
+
proc.on("exit", () => { isAlive = false; });
|
|
245
|
+
proc.on("error", () => { isAlive = false; });
|
|
246
|
+
const wrapper = {
|
|
247
|
+
process: proc,
|
|
248
|
+
pid: proc.pid,
|
|
249
|
+
get isAlive() { return isAlive; },
|
|
250
|
+
promptPattern,
|
|
251
|
+
mode: "pipe",
|
|
252
|
+
write(data) {
|
|
253
|
+
if (!isAlive)
|
|
254
|
+
throw new Error("Session is not alive");
|
|
255
|
+
// Clear new output buffer so readScreen returns only new output
|
|
256
|
+
newOutputBuffer = "";
|
|
257
|
+
proc.stdin.write(data);
|
|
258
|
+
},
|
|
259
|
+
readScreen(fullScreen = false) {
|
|
260
|
+
if (fullScreen) {
|
|
261
|
+
return stripAnsi(outputLines.join("\n"));
|
|
262
|
+
}
|
|
263
|
+
// Return only output received since the last write()
|
|
264
|
+
return stripAnsi(newOutputBuffer);
|
|
265
|
+
},
|
|
266
|
+
async waitForOutput(timeoutMs) {
|
|
267
|
+
const startGen = outputGeneration;
|
|
268
|
+
return waitForSettled(() => isAlive, () => String(outputGeneration), () => lastOutputTime, () => wrapper.readScreen(), timeoutMs, wrapper);
|
|
269
|
+
},
|
|
270
|
+
resize(_cols, _rows) {
|
|
271
|
+
// No-op in pipe mode — no PTY to resize
|
|
272
|
+
},
|
|
273
|
+
kill(signal) {
|
|
274
|
+
if (isAlive) {
|
|
275
|
+
const sig = signal ?? "SIGTERM";
|
|
276
|
+
try {
|
|
277
|
+
process.kill(-proc.pid, sig);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
proc.kill(sig);
|
|
281
|
+
}
|
|
282
|
+
isAlive = false;
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
dispose() {
|
|
286
|
+
if (isAlive) {
|
|
287
|
+
try {
|
|
288
|
+
process.kill(-proc.pid, "SIGTERM");
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
proc.kill("SIGTERM");
|
|
292
|
+
}
|
|
293
|
+
isAlive = false;
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
// Wait for startup output to detect prompt
|
|
298
|
+
setTimeout(() => {
|
|
299
|
+
const startupScreen = wrapper.readScreen();
|
|
300
|
+
promptPattern = detectPromptPattern(startupScreen);
|
|
301
|
+
wrapper.promptPattern = promptPattern;
|
|
302
|
+
resolve(wrapper);
|
|
303
|
+
}, 1000);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
// ─── Shared wait logic ──────────────────────────────────────────────
|
|
307
|
+
function waitForSettled(getAlive, getOutputMarker, getLastOutputTime, getScreen, timeoutMs, wrapper) {
|
|
308
|
+
const startMarker = getOutputMarker();
|
|
309
|
+
const startTime = Date.now();
|
|
310
|
+
return new Promise((res) => {
|
|
311
|
+
let settled = false;
|
|
312
|
+
const check = () => {
|
|
313
|
+
const elapsed = Date.now() - startTime;
|
|
314
|
+
if (!getAlive()) {
|
|
315
|
+
res({ output: getScreen(), isComplete: true });
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (elapsed >= timeoutMs) {
|
|
319
|
+
res({ output: getScreen(), isComplete: false });
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const timeSinceOutput = Date.now() - getLastOutputTime();
|
|
323
|
+
if (timeSinceOutput >= OUTPUT_SETTLE_MS && getOutputMarker() !== startMarker) {
|
|
324
|
+
const screen = getScreen();
|
|
325
|
+
if (wrapper.promptPattern && endsWithPrompt(screen, wrapper.promptPattern)) {
|
|
326
|
+
res({ output: screen, isComplete: true });
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (!settled) {
|
|
330
|
+
settled = true;
|
|
331
|
+
setTimeout(check, OUTPUT_SETTLE_MS);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
res({ output: screen, isComplete: true });
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
setTimeout(check, 50);
|
|
338
|
+
};
|
|
339
|
+
setTimeout(check, 50);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAW7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAwB;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,mCAAmC,MAAM,8BAA8B,CAAC,CAAC;QACvF,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,KAAK,UAAU,iBAAiB,CAAC,OAAwB;IACvD,kEAAkE;IAClE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAK,QAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAE1E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE;QAChE,IAAI,EAAE,gBAAgB;QACtB,IAAI;QACJ,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAA4B;KAClE,CAAC,CAAC;IAEH,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEhC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;QACjC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,YAAY,IAAI,IAAI,CAAC;QACrB,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE;QACrB,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAoB;QAC/B,OAAO,EAAE,UAAiB;QAC1B,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;QACjC,aAAa;QACb,IAAI,EAAE,KAAK;QAEX,KAAK,CAAC,IAAY;YAChB,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtD,YAAY,GAAG,EAAE,CAAC;YAClB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAED,UAAU,CAAC,UAAU,GAAG,KAAK;YAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACnC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;gBAChC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAI,IAAI;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBAC9C,IAAI,IAAI;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAC;YAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAiB;YACnC,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjI,CAAC;QAED,MAAM,CAAC,OAAe,EAAE,OAAe;YACrC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,MAAe;YAClB,IAAI,OAAO,EAAE,CAAC;gBAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAAC,OAAO,GAAG,KAAK,CAAC;YAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACL,IAAI,OAAO,EAAE,CAAC;gBAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAAC,OAAO,GAAG,KAAK,CAAC;YAAC,CAAC;YACpD,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;IAEF,2CAA2C;IAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3C,aAAa,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACnD,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uEAAuE;AAEvE;;;GAGG;AACH,SAAS,mBAAmB,CAAC,OAAe,EAAE,IAAc;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;IAEjD,2DAA2D;IAC3D,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mFAAmF;IACnF,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,2CAA2C;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IACxD,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG;QACd,GAAG,OAAO,CAAC,GAAG;QACd,IAAI,EAAE,MAAM;QACZ,gBAAgB,EAAE,GAAG;QACrB,uBAAuB,EAAE,GAAG;QAC5B,gBAAgB,EAAE,GAAG;QACrB,GAAG,OAAO,CAAC,GAAG;KACf,CAAC;IAEF,yCAAyC;IACzC,IAAI,IAAkB,CAAC;IACvB,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE;gBACvB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBACjC,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE;gBAClC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBACjC,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAErC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,sCAAsC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YACH,gDAAgD;YAChD,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC;YACR,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,aAAa,GAAkB,IAAI,CAAC;QACxC,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,gDAAgD;QAChD,IAAI,eAAe,GAAG,EAAE,CAAC;QAEzB,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,eAAe,IAAI,IAAI,CAAC;YAExB,wDAAwD;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnD,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,gBAAgB,EAAE,CAAC;YAEnB,+BAA+B;YAC/B,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBAC9B,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACtC,IAAI,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAEtC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAoB;YAC/B,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,IAAI,CAAC,GAAI;YACd,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;YACjC,aAAa;YACb,IAAI,EAAE,MAAM;YAEZ,KAAK,CAAC,IAAY;gBAChB,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACtD,gEAAgE;gBAChE,eAAe,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAED,UAAU,CAAC,UAAU,GAAG,KAAK;gBAC3B,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3C,CAAC;gBACD,qDAAqD;gBACrD,OAAO,SAAS,CAAC,eAAe,CAAC,CAAC;YACpC,CAAC;YAED,KAAK,CAAC,aAAa,CAAC,SAAiB;gBACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;gBAClC,OAAO,cAAc,CACnB,GAAG,EAAE,CAAC,OAAO,EACb,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAC9B,GAAG,EAAE,CAAC,cAAc,EACpB,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAC1B,SAAS,EACT,OAAO,CACR,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,KAAa,EAAE,KAAa;gBACjC,wCAAwC;YAC1C,CAAC;YAED,IAAI,CAAC,MAAe;gBAClB,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,GAAI,MAAyB,IAAI,SAAS,CAAC;oBACpD,IAAI,CAAC;wBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAI,EAAE,GAAG,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC;wBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAAC,CAAC;oBAChE,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC;wBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAI,EAAE,SAAS,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC;wBAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAAC,CAAC;oBAC5E,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;YACH,CAAC;SACF,CAAC;QAEF,2CAA2C;QAC3C,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3C,aAAa,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACnD,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;YACtC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uEAAuE;AAEvE,SAAS,cAAc,CACrB,QAAuB,EACvB,eAA6B,EAC7B,iBAA+B,EAC/B,SAAuB,EACvB,SAAiB,EACjB,OAAwB;IAExB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACzB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEvC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAChB,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBACzB,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAEzD,IAAI,eAAe,IAAI,gBAAgB,IAAI,eAAe,EAAE,KAAK,WAAW,EAAE,CAAC;gBAC7E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,IAAI,OAAO,CAAC,aAAa,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC3E,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1C,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,GAAG,IAAI,CAAC;oBACf,UAAU,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { SessionManager } from "../session-manager.js";
|
|
3
|
+
import type { CloseSessionOutput } from "../types.js";
|
|
4
|
+
export declare const closeSessionSchema: z.ZodObject<{
|
|
5
|
+
session_id: z.ZodString;
|
|
6
|
+
signal: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
session_id: string;
|
|
9
|
+
signal: string;
|
|
10
|
+
}, {
|
|
11
|
+
session_id: string;
|
|
12
|
+
signal?: string | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
export type CloseSessionArgs = z.infer<typeof closeSessionSchema>;
|
|
15
|
+
export declare function handleCloseSession(args: CloseSessionArgs, sessionManager: SessionManager): Promise<CloseSessionOutput>;
|
|
16
|
+
//# sourceMappingURL=close-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-session.d.ts","sourceRoot":"","sources":["../../src/tools/close-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,eAAO,MAAM,kBAAkB;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { audit } from "../utils/audit-logger.js";
|
|
3
|
+
export const closeSessionSchema = z.object({
|
|
4
|
+
session_id: z.string().describe("The session ID to close"),
|
|
5
|
+
signal: z.string().optional().default("SIGTERM")
|
|
6
|
+
.describe("Signal to send (e.g., SIGTERM, SIGKILL)"),
|
|
7
|
+
});
|
|
8
|
+
export async function handleCloseSession(args, sessionManager) {
|
|
9
|
+
audit("session_close", args.session_id, { signal: args.signal });
|
|
10
|
+
sessionManager.closeSession(args.session_id, args.signal);
|
|
11
|
+
return { success: true };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=close-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-session.js","sourceRoot":"","sources":["../../src/tools/close-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;SAC7C,QAAQ,CAAC,yCAAyC,CAAC;CACvD,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAsB,EACtB,cAA8B;IAE9B,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { SessionManager } from "../session-manager.js";
|
|
3
|
+
import type { ServerConfig, ConfirmDangerousCommandOutput } from "../types.js";
|
|
4
|
+
export declare const confirmDangerousCommandSchema: z.ZodObject<{
|
|
5
|
+
session_id: z.ZodString;
|
|
6
|
+
input: z.ZodString;
|
|
7
|
+
justification: z.ZodString;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
session_id: string;
|
|
10
|
+
input: string;
|
|
11
|
+
justification: string;
|
|
12
|
+
}, {
|
|
13
|
+
session_id: string;
|
|
14
|
+
input: string;
|
|
15
|
+
justification: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type ConfirmDangerousCommandArgs = z.infer<typeof confirmDangerousCommandSchema>;
|
|
18
|
+
export declare function handleConfirmDangerousCommand(args: ConfirmDangerousCommandArgs, sessionManager: SessionManager, config: ServerConfig): Promise<ConfirmDangerousCommandOutput>;
|
|
19
|
+
//# sourceMappingURL=confirm-dangerous-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-dangerous-command.d.ts","sourceRoot":"","sources":["../../src/tools/confirm-dangerous-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAM/E,eAAO,MAAM,6BAA6B;;;;;;;;;;;;EAMxC,CAAC;AAEH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAExF,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,2BAA2B,EACjC,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,6BAA6B,CAAC,CAoDxC"}
|