terminal-tool-for-agents 0.1.3

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/dist/server.js ADDED
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SERVER_URL = exports.SERVER_PORT = exports.SERVER_HOST = void 0;
40
+ /**
41
+ * tta server — Fastify HTTP/WebSocket, watch UI static files, lifecycle, and entry point.
42
+ */
43
+ const path = __importStar(require("path"));
44
+ const fastify_1 = __importDefault(require("fastify"));
45
+ const static_1 = __importDefault(require("@fastify/static"));
46
+ const websocket_1 = __importDefault(require("@fastify/websocket"));
47
+ const session_1 = require("./session");
48
+ const handlers_1 = require("./handlers");
49
+ const WS_OPEN = 1;
50
+ exports.SERVER_HOST = "127.0.0.1";
51
+ exports.SERVER_PORT = 7654;
52
+ exports.SERVER_URL = `http://${exports.SERVER_HOST}:${exports.SERVER_PORT}`;
53
+ const UI_DIR = process.env.TTA_DEV === "1"
54
+ ? path.join(__dirname, "..", "src", "watch-ui")
55
+ : path.join(__dirname, "watch-ui");
56
+ const relays = new Map();
57
+ function wsSend(ws, payload) {
58
+ if (ws.readyState === WS_OPEN) {
59
+ ws.send(JSON.stringify(payload));
60
+ }
61
+ }
62
+ function getRelay(sessionName) {
63
+ let relay = relays.get(sessionName);
64
+ if (!relay) {
65
+ relay = { clients: new Set(), unsubData: null, unsubExit: null, init: null };
66
+ relays.set(sessionName, relay);
67
+ }
68
+ return relay;
69
+ }
70
+ function stopRelay(sessionName, relay) {
71
+ relay.unsubData?.();
72
+ relay.unsubExit?.();
73
+ relay.unsubData = null;
74
+ relay.unsubExit = null;
75
+ relays.delete(sessionName);
76
+ }
77
+ function ensureSessionStream(sessionName, relay) {
78
+ if (relay.unsubData)
79
+ return;
80
+ const sessionOrError = (0, handlers_1.resolveSession)(sessionName);
81
+ if ("type" in sessionOrError) {
82
+ for (const client of relay.clients) {
83
+ wsSend(client, { type: "error", message: sessionOrError.message });
84
+ }
85
+ return;
86
+ }
87
+ const session = sessionOrError;
88
+ relay.init = {
89
+ session_name: sessionName,
90
+ replay: session.getStreamReplay(),
91
+ cols: session.cols,
92
+ rows: session.rows,
93
+ };
94
+ for (const client of relay.clients) {
95
+ wsSend(client, { type: "init", ...relay.init });
96
+ }
97
+ relay.unsubData = session.onStream((data) => {
98
+ for (const client of relay.clients) {
99
+ wsSend(client, { type: "data", data });
100
+ }
101
+ });
102
+ relay.unsubExit = session.onExit(() => {
103
+ for (const client of relay.clients) {
104
+ wsSend(client, { type: "end" });
105
+ }
106
+ stopRelay(sessionName, relay);
107
+ });
108
+ if (session.status === "exited") {
109
+ for (const client of relay.clients) {
110
+ wsSend(client, { type: "end" });
111
+ }
112
+ stopRelay(sessionName, relay);
113
+ }
114
+ }
115
+ function attachWebSocketClient(sessionName, ws) {
116
+ const relay = getRelay(sessionName);
117
+ relay.clients.add(ws);
118
+ ensureSessionStream(sessionName, relay);
119
+ if (relay.init) {
120
+ wsSend(ws, { type: "init", ...relay.init });
121
+ }
122
+ ws.on("close", () => {
123
+ relay.clients.delete(ws);
124
+ if (relay.clients.size === 0) {
125
+ stopRelay(sessionName, relay);
126
+ }
127
+ });
128
+ }
129
+ async function buildApp() {
130
+ const app = (0, fastify_1.default)({ logger: false });
131
+ app.get("/health", async () => ({ ok: true }));
132
+ app.post("/rpc", async (request, reply) => {
133
+ try {
134
+ return await (0, handlers_1.handleRequest)(request.body);
135
+ }
136
+ catch (err) {
137
+ reply.code(400);
138
+ return {
139
+ type: "error",
140
+ message: err instanceof Error ? err.message : String(err),
141
+ };
142
+ }
143
+ });
144
+ await app.register(websocket_1.default);
145
+ app.get("/ws/:sessionName", { websocket: true }, (socket, request) => {
146
+ const { sessionName } = request.params;
147
+ if (!session_1.SESSION_NAME_PATTERN.test(sessionName)) {
148
+ socket.close();
149
+ return;
150
+ }
151
+ attachWebSocketClient(sessionName, socket);
152
+ });
153
+ await app.register(static_1.default, {
154
+ root: UI_DIR,
155
+ prefix: "/",
156
+ index: ["index.html"],
157
+ });
158
+ return app;
159
+ }
160
+ function formatListenError(err) {
161
+ let message = `server error: ${err.message}`;
162
+ if (err.code === "EADDRINUSE") {
163
+ message += `\n Port ${exports.SERVER_PORT} is already in use.`;
164
+ }
165
+ else if (err.code === "EACCES") {
166
+ message += `\n Permission denied on port ${exports.SERVER_PORT}.`;
167
+ }
168
+ return message;
169
+ }
170
+ async function startServer() {
171
+ const app = await buildApp();
172
+ let shuttingDown = false;
173
+ function shutdown() {
174
+ if (shuttingDown)
175
+ return;
176
+ shuttingDown = true;
177
+ (0, handlers_1.killAllSessions)({ fromShutdown: true });
178
+ void app.close().finally(() => process.exit(0));
179
+ }
180
+ (0, handlers_1.setShutdownIfEmpty)(() => {
181
+ setImmediate(() => shutdown());
182
+ });
183
+ for (const sig of ["SIGTERM", "SIGINT"]) {
184
+ process.on(sig, shutdown);
185
+ }
186
+ process.on("uncaughtException", (err) => {
187
+ process.stderr.write(`[server] uncaught exception: ${err.message}\n`);
188
+ shutdown();
189
+ });
190
+ try {
191
+ await app.listen({ host: exports.SERVER_HOST, port: exports.SERVER_PORT });
192
+ process.stderr.write(`tta server started (${exports.SERVER_URL})\n`);
193
+ }
194
+ catch (err) {
195
+ process.stderr.write(`${formatListenError(err)}\n`);
196
+ process.exit(1);
197
+ }
198
+ (0, handlers_1.armIdleTimer)();
199
+ }
200
+ if (require.main === module) {
201
+ startServer().catch((err) => {
202
+ process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
203
+ process.exit(1);
204
+ });
205
+ }
206
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { SessionInfo } from "./protocol";
2
+ /** One word, or 2–3 words joined by hyphens: dev, vite-once, npm-run-dev */
3
+ export declare const SESSION_NAME_PATTERN: RegExp;
4
+ export declare function validateSessionName(name: string): string | null;
5
+ export declare function validateCwd(cwd: string): string | null;
6
+ export declare class Session {
7
+ readonly name: string;
8
+ private ptyProcess;
9
+ private terminal;
10
+ private _status;
11
+ private _exitCode;
12
+ private outputLog;
13
+ private streamListeners;
14
+ private exitListeners;
15
+ constructor(name: string, command: string, options: {
16
+ cwd: string;
17
+ });
18
+ get status(): "running" | "exited";
19
+ get exitCode(): number | null;
20
+ get cols(): number;
21
+ get rows(): number;
22
+ getStreamReplay(): string;
23
+ onStream(listener: (data: string) => void): () => void;
24
+ onExit(listener: (exitCode: number) => void): () => void;
25
+ send(text: string): void;
26
+ press(key: string): void;
27
+ /** Read visible viewport as a fixed cols×rows cell grid. */
28
+ private readViewportGrid;
29
+ /** Plain text for agents (trim padding; semantic content over pixel fidelity). */
30
+ private readPlainScreen;
31
+ snapshot(): string;
32
+ /** Poll every 100ms; 10 consecutive identical cell grids → stable. */
33
+ waitForStable(): Promise<string>;
34
+ scroll(direction: "up" | "down" | "top" | "bottom"): void;
35
+ kill(): void;
36
+ toInfo(): SessionInfo;
37
+ private appendOutput;
38
+ private notifyExitListeners;
39
+ }
40
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA+DzC,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,QAA2B,CAAC;AAE7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW/D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAatD;AAcD,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,aAAa,CAAyC;gBAElD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE;IA6BnE,IAAI,MAAM,IAAI,SAAS,GAAG,QAAQ,CAEjC;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,eAAe,IAAI,MAAM;IAIzB,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAOtD,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAWxD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOxB,4DAA4D;IAC5D,OAAO,CAAC,gBAAgB;IAsBxB,kFAAkF;IAClF,OAAO,CAAC,eAAe;IAYvB,QAAQ,IAAI,MAAM;IAIlB,sEAAsE;IAChE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAwBtC,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI;IAsBzD,IAAI,IAAI,IAAI;IAMZ,MAAM,IAAI,WAAW;IAMrB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,mBAAmB;CAO5B"}
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Session = exports.SESSION_NAME_PATTERN = void 0;
37
+ exports.validateSessionName = validateSessionName;
38
+ exports.validateCwd = validateCwd;
39
+ /**
40
+ * Wraps a PTY process (node-pty).
41
+ * Uses @xterm/headless as a VT renderer for watch UI streaming.
42
+ */
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const pty = __importStar(require("node-pty"));
46
+ const headless_1 = require("@xterm/headless");
47
+ const POLL_MS = 100;
48
+ const STABLE_POLLS = 10;
49
+ function packAttr(cell) {
50
+ return ((cell.isBold() ? 1 : 0) |
51
+ (cell.isDim() ? 2 : 0) |
52
+ (cell.isUnderline() ? 4 : 0) |
53
+ (cell.isInverse() ? 8 : 0));
54
+ }
55
+ function snapCell(cell, fallback) {
56
+ const c = cell ?? fallback;
57
+ return {
58
+ ch: c.getChars(),
59
+ fg: c.getFgColor(),
60
+ bg: c.getBgColor(),
61
+ fgMode: c.getFgColorMode(),
62
+ bgMode: c.getBgColorMode(),
63
+ attr: packAttr(c),
64
+ };
65
+ }
66
+ function cellsEqual(a, b) {
67
+ return (a.ch === b.ch &&
68
+ a.fg === b.fg &&
69
+ a.bg === b.bg &&
70
+ a.fgMode === b.fgMode &&
71
+ a.bgMode === b.bgMode &&
72
+ a.attr === b.attr);
73
+ }
74
+ function gridsEqual(a, b) {
75
+ if (a.cols !== b.cols || a.rows !== b.rows)
76
+ return false;
77
+ for (let y = 0; y < a.rows; y++) {
78
+ for (let x = 0; x < a.cols; x++) {
79
+ if (!cellsEqual(a.cells[y][x], b.cells[y][x]))
80
+ return false;
81
+ }
82
+ }
83
+ return true;
84
+ }
85
+ /** One word, or 2–3 words joined by hyphens: dev, vite-once, npm-run-dev */
86
+ exports.SESSION_NAME_PATTERN = /^[a-z]+(-[a-z]+){0,2}$/;
87
+ function validateSessionName(name) {
88
+ if (!name?.trim()) {
89
+ return "session name is required (e.g. dev, vite-once, npm-run-dev)";
90
+ }
91
+ if (!exports.SESSION_NAME_PATTERN.test(name)) {
92
+ return (`invalid session name "${name}": use one lowercase word, or 2–3 words joined by hyphens ` +
93
+ "(e.g. dev, vite-once, npm-run-dev)");
94
+ }
95
+ return null;
96
+ }
97
+ function validateCwd(cwd) {
98
+ if (!cwd?.trim()) {
99
+ return "cwd is required";
100
+ }
101
+ const resolved = path.resolve(cwd);
102
+ try {
103
+ if (!fs.statSync(resolved).isDirectory()) {
104
+ return `not a directory: ${cwd}`;
105
+ }
106
+ }
107
+ catch {
108
+ return `directory not found: ${cwd}`;
109
+ }
110
+ return null;
111
+ }
112
+ function shellSpawnArgs(command) {
113
+ if (process.platform === "win32") {
114
+ const comspec = process.env.COMSPEC || "cmd.exe";
115
+ return { file: comspec, args: ["/d", "/s", "/c", command] };
116
+ }
117
+ if (process.env.SHELL) {
118
+ return { file: process.env.SHELL, args: ["-lc", command] };
119
+ }
120
+ return { file: "/bin/sh", args: ["-c", command] };
121
+ }
122
+ class Session {
123
+ name;
124
+ ptyProcess;
125
+ terminal;
126
+ _status = "running";
127
+ _exitCode = null;
128
+ outputLog = "";
129
+ streamListeners = [];
130
+ exitListeners = [];
131
+ constructor(name, command, options) {
132
+ this.name = name;
133
+ const cols = 120;
134
+ const rows = 30;
135
+ const { file, args } = shellSpawnArgs(command);
136
+ this.terminal = new headless_1.Terminal({ cols, rows, scrollback: 10000, allowProposedApi: true });
137
+ this.ptyProcess = pty.spawn(file, args, {
138
+ name: "xterm-256color",
139
+ cols,
140
+ rows,
141
+ cwd: options.cwd,
142
+ env: process.env,
143
+ });
144
+ this.ptyProcess.onData((data) => {
145
+ this.terminal.write(data);
146
+ this.appendOutput(data);
147
+ });
148
+ this.ptyProcess.onExit((e) => {
149
+ this._status = "exited";
150
+ this._exitCode = e.exitCode ?? 1;
151
+ this.notifyExitListeners(this._exitCode);
152
+ });
153
+ }
154
+ get status() {
155
+ return this._status;
156
+ }
157
+ get exitCode() {
158
+ return this._exitCode;
159
+ }
160
+ get cols() {
161
+ return this.terminal.cols;
162
+ }
163
+ get rows() {
164
+ return this.terminal.rows;
165
+ }
166
+ getStreamReplay() {
167
+ return this.outputLog;
168
+ }
169
+ onStream(listener) {
170
+ this.streamListeners.push(listener);
171
+ return () => {
172
+ this.streamListeners = this.streamListeners.filter((l) => l !== listener);
173
+ };
174
+ }
175
+ onExit(listener) {
176
+ if (this._status === "exited" && this._exitCode !== null) {
177
+ listener(this._exitCode);
178
+ return () => { };
179
+ }
180
+ this.exitListeners.push(listener);
181
+ return () => {
182
+ this.exitListeners = this.exitListeners.filter((l) => l !== listener);
183
+ };
184
+ }
185
+ send(text) {
186
+ if (this._status === "exited") {
187
+ throw new Error(`Session ${this.name} has already exited`);
188
+ }
189
+ const interpreted = text
190
+ .replace(/\\n/g, "\n")
191
+ .replace(/\\r/g, "\r")
192
+ .replace(/\\t/g, "\t");
193
+ this.ptyProcess.write(interpreted);
194
+ }
195
+ press(key) {
196
+ if (this._status === "exited") {
197
+ throw new Error(`Session ${this.name} has already exited`);
198
+ }
199
+ this.ptyProcess.write(key);
200
+ }
201
+ /** Read visible viewport as a fixed cols×rows cell grid. */
202
+ readViewportGrid() {
203
+ const cols = this.terminal.cols;
204
+ const rows = this.terminal.rows;
205
+ const buf = this.terminal.buffer.active;
206
+ const startY = buf.viewportY;
207
+ const nullCell = buf.getNullCell();
208
+ const scratch = buf.getNullCell();
209
+ const cells = [];
210
+ for (let y = 0; y < rows; y++) {
211
+ const line = buf.getLine(startY + y);
212
+ const row = [];
213
+ for (let x = 0; x < cols; x++) {
214
+ const cell = line?.getCell(x, scratch);
215
+ row.push(snapCell(cell, nullCell));
216
+ }
217
+ cells.push(row);
218
+ }
219
+ return { cols, rows, cells };
220
+ }
221
+ /** Plain text for agents (trim padding; semantic content over pixel fidelity). */
222
+ readPlainScreen() {
223
+ const buf = this.terminal.buffer.active;
224
+ const lines = [];
225
+ const startY = buf.viewportY;
226
+ for (let i = 0; i < this.terminal.rows; i++) {
227
+ lines.push((buf.getLine(startY + i)?.translateToString(true) ?? "").trimEnd());
228
+ }
229
+ while (lines.length > 0 && lines[lines.length - 1] === "")
230
+ lines.pop();
231
+ while (lines.length > 0 && lines[0] === "")
232
+ lines.shift();
233
+ return lines.join("\n");
234
+ }
235
+ snapshot() {
236
+ return this.readPlainScreen();
237
+ }
238
+ /** Poll every 100ms; 10 consecutive identical cell grids → stable. */
239
+ async waitForStable() {
240
+ if (this._status === "exited") {
241
+ return this.snapshot();
242
+ }
243
+ let lastGrid = this.readViewportGrid();
244
+ let stableCount = 0;
245
+ while (stableCount < STABLE_POLLS) {
246
+ await new Promise((resolve) => setTimeout(resolve, POLL_MS));
247
+ if (this._status !== "running")
248
+ break;
249
+ const current = this.readViewportGrid();
250
+ if (gridsEqual(lastGrid, current)) {
251
+ stableCount++;
252
+ }
253
+ else {
254
+ stableCount = 0;
255
+ lastGrid = current;
256
+ }
257
+ }
258
+ return this.readPlainScreen();
259
+ }
260
+ scroll(direction) {
261
+ switch (direction) {
262
+ case "up":
263
+ this.terminal.scrollLines(-this.terminal.rows);
264
+ break;
265
+ case "down":
266
+ this.terminal.scrollLines(this.terminal.rows);
267
+ break;
268
+ case "top": {
269
+ const buf = this.terminal.buffer.active;
270
+ this.terminal.scrollLines(-buf.viewportY);
271
+ break;
272
+ }
273
+ case "bottom": {
274
+ const buf = this.terminal.buffer.active;
275
+ const target = Math.max(0, buf.length - this.terminal.rows);
276
+ this.terminal.scrollLines(target - buf.viewportY);
277
+ break;
278
+ }
279
+ }
280
+ }
281
+ kill() {
282
+ if (this._status === "running") {
283
+ this.ptyProcess.kill();
284
+ }
285
+ }
286
+ toInfo() {
287
+ const info = { session_name: this.name, status: this._status };
288
+ if (this._exitCode !== null)
289
+ info.exit_code = this._exitCode;
290
+ return info;
291
+ }
292
+ appendOutput(data) {
293
+ const maxBytes = 512 * 1024;
294
+ this.outputLog += data;
295
+ if (this.outputLog.length > maxBytes) {
296
+ this.outputLog = this.outputLog.slice(-maxBytes);
297
+ }
298
+ const listeners = [...this.streamListeners];
299
+ for (const listener of listeners) {
300
+ listener(data);
301
+ }
302
+ }
303
+ notifyExitListeners(exitCode) {
304
+ const listeners = [...this.exitListeners];
305
+ this.exitListeners = [];
306
+ for (const listener of listeners) {
307
+ listener(exitCode);
308
+ }
309
+ }
310
+ }
311
+ exports.Session = Session;
312
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}