@code-yeongyu/senpi-pty 2026.7.25-2
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 +5 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +56 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +130 -0
- package/dist/loader.js.map +1 -0
- package/dist/native-loader.d.ts +2 -0
- package/dist/native-loader.d.ts.map +1 -0
- package/dist/native-loader.js +2 -0
- package/dist/native-loader.js.map +1 -0
- package/dist/pipe-fallback.d.ts +58 -0
- package/dist/pipe-fallback.d.ts.map +1 -0
- package/dist/pipe-fallback.js +192 -0
- package/dist/pipe-fallback.js.map +1 -0
- package/dist/registry-detached.d.ts +5 -0
- package/dist/registry-detached.d.ts.map +1 -0
- package/dist/registry-detached.js +57 -0
- package/dist/registry-detached.js.map +1 -0
- package/dist/registry-session.d.ts +7 -0
- package/dist/registry-session.d.ts.map +1 -0
- package/dist/registry-session.js +73 -0
- package/dist/registry-session.js.map +1 -0
- package/dist/registry-types.d.ts +94 -0
- package/dist/registry-types.d.ts.map +1 -0
- package/dist/registry-types.js +9 -0
- package/dist/registry-types.js.map +1 -0
- package/dist/registry.d.ts +41 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +232 -0
- package/dist/registry.js.map +1 -0
- package/dist/screen.d.ts +33 -0
- package/dist/screen.d.ts.map +1 -0
- package/dist/screen.js +155 -0
- package/dist/screen.js.map +1 -0
- package/dist/session-exit.d.ts +8 -0
- package/dist/session-exit.d.ts.map +1 -0
- package/dist/session-exit.js +103 -0
- package/dist/session-exit.js.map +1 -0
- package/dist/session-native.d.ts +4 -0
- package/dist/session-native.d.ts.map +1 -0
- package/dist/session-native.js +94 -0
- package/dist/session-native.js.map +1 -0
- package/dist/session-options.d.ts +10 -0
- package/dist/session-options.d.ts.map +1 -0
- package/dist/session-options.js +38 -0
- package/dist/session-options.js.map +1 -0
- package/dist/session-types.d.ts +64 -0
- package/dist/session-types.d.ts.map +1 -0
- package/dist/session-types.js +2 -0
- package/dist/session-types.js.map +1 -0
- package/dist/session.d.ts +47 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +187 -0
- package/dist/session.js.map +1 -0
- package/native/check-prebuild-fresh.mjs +171 -0
- package/native/index.d.ts +25 -0
- package/native/index.js +30 -0
- package/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE;QAChB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACF;AAWD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,OAAO,GAAE,qBAA0B,EAM9C;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7C;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;IAED,QAAQ,IAAI,sBAAsB,CAwBjC;IAED,OAAO,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,WAAW;CAcnB"}
|
package/dist/screen.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import xterm from "@xterm/headless";
|
|
2
|
+
const XtermTerminal = xterm.Terminal;
|
|
3
|
+
const DEFAULT_COLS = 80;
|
|
4
|
+
const DEFAULT_ROWS = 24;
|
|
5
|
+
const DEFAULT_SCROLLBACK = 1000;
|
|
6
|
+
const MIN_SIZE = 1;
|
|
7
|
+
const MAX_SIZE = 10000;
|
|
8
|
+
const MIN_REPLAY_HISTORY_LENGTH = 4096;
|
|
9
|
+
const MAX_REPLAY_HISTORY_LENGTH = 1_000_000;
|
|
10
|
+
export class TerminalScreen {
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.history = [];
|
|
13
|
+
this.historyLength = 0;
|
|
14
|
+
const cols = normalizeDimension(options.cols, DEFAULT_COLS);
|
|
15
|
+
const rows = normalizeDimension(options.rows, DEFAULT_ROWS);
|
|
16
|
+
this.scrollback = normalizeScrollback(options.scrollback);
|
|
17
|
+
this.maxReplayHistoryLength = normalizeReplayHistoryLength(cols, rows, this.scrollback);
|
|
18
|
+
this.terminal = this.createTerminal(cols, rows);
|
|
19
|
+
}
|
|
20
|
+
feed(data) {
|
|
21
|
+
const payload = decodeInput(data);
|
|
22
|
+
const sanitizedPayload = sanitizeString(payload);
|
|
23
|
+
if (sanitizedPayload.length > 0)
|
|
24
|
+
this.appendHistory(sanitizedPayload);
|
|
25
|
+
return this.write(payload);
|
|
26
|
+
}
|
|
27
|
+
resize(cols, rows) {
|
|
28
|
+
const nextCols = normalizeDimension(cols, this.terminal.cols);
|
|
29
|
+
const nextRows = normalizeDimension(rows, this.terminal.rows);
|
|
30
|
+
this.terminal.dispose();
|
|
31
|
+
this.terminal = this.createTerminal(nextCols, nextRows);
|
|
32
|
+
return this.write(this.history.join(""));
|
|
33
|
+
}
|
|
34
|
+
flush() {
|
|
35
|
+
return this.write("");
|
|
36
|
+
}
|
|
37
|
+
snapshot() {
|
|
38
|
+
const buffer = this.terminal.buffer.active;
|
|
39
|
+
const viewportStart = buffer.viewportY;
|
|
40
|
+
const visibleGrid = [];
|
|
41
|
+
const scrollback = [];
|
|
42
|
+
const scrollbackStart = Math.max(0, viewportStart - this.scrollback);
|
|
43
|
+
for (let lineIndex = scrollbackStart; lineIndex < viewportStart; lineIndex += 1) {
|
|
44
|
+
scrollback.push(readLine(buffer, lineIndex));
|
|
45
|
+
}
|
|
46
|
+
for (let row = 0; row < this.terminal.rows; row += 1) {
|
|
47
|
+
visibleGrid.push(readLine(buffer, viewportStart + row));
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
cols: this.terminal.cols,
|
|
51
|
+
rows: this.terminal.rows,
|
|
52
|
+
visibleGrid,
|
|
53
|
+
scrollback,
|
|
54
|
+
cursor: {
|
|
55
|
+
x: buffer.cursorX,
|
|
56
|
+
y: buffer.cursorY,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
dispose() {
|
|
61
|
+
this.terminal.dispose();
|
|
62
|
+
}
|
|
63
|
+
createTerminal(cols, rows) {
|
|
64
|
+
return new XtermTerminal({
|
|
65
|
+
cols,
|
|
66
|
+
rows,
|
|
67
|
+
scrollback: this.scrollback,
|
|
68
|
+
disableStdin: true,
|
|
69
|
+
allowProposedApi: true,
|
|
70
|
+
logLevel: "off",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
write(payload) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
try {
|
|
76
|
+
this.terminal.write(payload, resolve);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const sanitizedPayload = sanitizeString(payload);
|
|
80
|
+
if (sanitizedPayload === payload) {
|
|
81
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.terminal.write(sanitizedPayload, resolve);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
appendHistory(payload) {
|
|
89
|
+
this.history.push(payload);
|
|
90
|
+
this.historyLength += payload.length;
|
|
91
|
+
this.trimHistory();
|
|
92
|
+
}
|
|
93
|
+
trimHistory() {
|
|
94
|
+
while (this.historyLength > this.maxReplayHistoryLength && this.history.length > 1) {
|
|
95
|
+
const removed = this.history.shift();
|
|
96
|
+
if (removed === undefined)
|
|
97
|
+
return;
|
|
98
|
+
this.historyLength -= removed.length;
|
|
99
|
+
}
|
|
100
|
+
if (this.historyLength <= this.maxReplayHistoryLength)
|
|
101
|
+
return;
|
|
102
|
+
const [onlyChunk] = this.history;
|
|
103
|
+
if (onlyChunk === undefined)
|
|
104
|
+
return;
|
|
105
|
+
const trimmed = sanitizeString(onlyChunk.slice(-this.maxReplayHistoryLength));
|
|
106
|
+
this.history[0] = trimmed;
|
|
107
|
+
this.historyLength = trimmed.length;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function readLine(buffer, lineIndex) {
|
|
111
|
+
return buffer.getLine(lineIndex)?.translateToString(true) ?? "";
|
|
112
|
+
}
|
|
113
|
+
function normalizeDimension(value, fallback) {
|
|
114
|
+
if (value === undefined || !Number.isFinite(value))
|
|
115
|
+
return fallback;
|
|
116
|
+
return Math.min(MAX_SIZE, Math.max(MIN_SIZE, Math.trunc(value)));
|
|
117
|
+
}
|
|
118
|
+
function normalizeScrollback(value) {
|
|
119
|
+
if (value === undefined || !Number.isFinite(value))
|
|
120
|
+
return DEFAULT_SCROLLBACK;
|
|
121
|
+
return Math.max(0, Math.trunc(value));
|
|
122
|
+
}
|
|
123
|
+
function normalizeReplayHistoryLength(cols, rows, scrollback) {
|
|
124
|
+
const visibleCells = Math.max(MIN_SIZE, cols) * Math.max(MIN_SIZE, rows + scrollback + 1);
|
|
125
|
+
return Math.min(MAX_REPLAY_HISTORY_LENGTH, Math.max(MIN_REPLAY_HISTORY_LENGTH, visibleCells * 4));
|
|
126
|
+
}
|
|
127
|
+
function decodeInput(value) {
|
|
128
|
+
if (typeof value === "string")
|
|
129
|
+
return value;
|
|
130
|
+
return new TextDecoder("utf-8", { fatal: false }).decode(value);
|
|
131
|
+
}
|
|
132
|
+
function sanitizeString(value) {
|
|
133
|
+
let output = "";
|
|
134
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
135
|
+
const code = value.charCodeAt(index);
|
|
136
|
+
if (code >= 0xd800 && code <= 0xdbff) {
|
|
137
|
+
const next = value.charCodeAt(index + 1);
|
|
138
|
+
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
139
|
+
output += value[index] + value[index + 1];
|
|
140
|
+
index += 1;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
output += "\uFFFD";
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else if (code >= 0xdc00 && code <= 0xdfff) {
|
|
147
|
+
output += "\uFFFD";
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
output += value[index];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return output;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Terminal as XtermTerminalType } from \"@xterm/headless\";\nimport xterm from \"@xterm/headless\";\n\nexport interface TerminalScreenOptions {\n\treadonly cols?: number;\n\treadonly rows?: number;\n\treadonly scrollback?: number;\n}\n\nexport interface TerminalScreenSnapshot {\n\treadonly cols: number;\n\treadonly rows: number;\n\treadonly visibleGrid: readonly string[];\n\treadonly scrollback: readonly string[];\n\treadonly cursor: {\n\t\treadonly x: number;\n\t\treadonly y: number;\n\t};\n}\n\nconst XtermTerminal = xterm.Terminal;\nconst DEFAULT_COLS = 80;\nconst DEFAULT_ROWS = 24;\nconst DEFAULT_SCROLLBACK = 1000;\nconst MIN_SIZE = 1;\nconst MAX_SIZE = 10000;\nconst MIN_REPLAY_HISTORY_LENGTH = 4096;\nconst MAX_REPLAY_HISTORY_LENGTH = 1_000_000;\n\nexport class TerminalScreen {\n\tprivate terminal: XtermTerminalType;\n\tprivate readonly history: string[] = [];\n\tprivate historyLength = 0;\n\tprivate readonly maxReplayHistoryLength: number;\n\tprivate readonly scrollback: number;\n\n\tconstructor(options: TerminalScreenOptions = {}) {\n\t\tconst cols = normalizeDimension(options.cols, DEFAULT_COLS);\n\t\tconst rows = normalizeDimension(options.rows, DEFAULT_ROWS);\n\t\tthis.scrollback = normalizeScrollback(options.scrollback);\n\t\tthis.maxReplayHistoryLength = normalizeReplayHistoryLength(cols, rows, this.scrollback);\n\t\tthis.terminal = this.createTerminal(cols, rows);\n\t}\n\n\tfeed(data: string | Uint8Array): Promise<void> {\n\t\tconst payload = decodeInput(data);\n\t\tconst sanitizedPayload = sanitizeString(payload);\n\t\tif (sanitizedPayload.length > 0) this.appendHistory(sanitizedPayload);\n\t\treturn this.write(payload);\n\t}\n\n\tresize(cols: number, rows: number): Promise<void> {\n\t\tconst nextCols = normalizeDimension(cols, this.terminal.cols);\n\t\tconst nextRows = normalizeDimension(rows, this.terminal.rows);\n\t\tthis.terminal.dispose();\n\t\tthis.terminal = this.createTerminal(nextCols, nextRows);\n\t\treturn this.write(this.history.join(\"\"));\n\t}\n\n\tflush(): Promise<void> {\n\t\treturn this.write(\"\");\n\t}\n\n\tsnapshot(): TerminalScreenSnapshot {\n\t\tconst buffer = this.terminal.buffer.active;\n\t\tconst viewportStart = buffer.viewportY;\n\t\tconst visibleGrid: string[] = [];\n\t\tconst scrollback: string[] = [];\n\t\tconst scrollbackStart = Math.max(0, viewportStart - this.scrollback);\n\n\t\tfor (let lineIndex = scrollbackStart; lineIndex < viewportStart; lineIndex += 1) {\n\t\t\tscrollback.push(readLine(buffer, lineIndex));\n\t\t}\n\t\tfor (let row = 0; row < this.terminal.rows; row += 1) {\n\t\t\tvisibleGrid.push(readLine(buffer, viewportStart + row));\n\t\t}\n\n\t\treturn {\n\t\t\tcols: this.terminal.cols,\n\t\t\trows: this.terminal.rows,\n\t\t\tvisibleGrid,\n\t\t\tscrollback,\n\t\t\tcursor: {\n\t\t\t\tx: buffer.cursorX,\n\t\t\t\ty: buffer.cursorY,\n\t\t\t},\n\t\t};\n\t}\n\n\tdispose(): void {\n\t\tthis.terminal.dispose();\n\t}\n\n\tprivate createTerminal(cols: number, rows: number): XtermTerminalType {\n\t\treturn new XtermTerminal({\n\t\t\tcols,\n\t\t\trows,\n\t\t\tscrollback: this.scrollback,\n\t\t\tdisableStdin: true,\n\t\t\tallowProposedApi: true,\n\t\t\tlogLevel: \"off\",\n\t\t});\n\t}\n\n\tprivate write(payload: string): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tthis.terminal.write(payload, resolve);\n\t\t\t} catch (error) {\n\t\t\t\tconst sanitizedPayload = sanitizeString(payload);\n\t\t\t\tif (sanitizedPayload === payload) {\n\t\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.terminal.write(sanitizedPayload, resolve);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate appendHistory(payload: string): void {\n\t\tthis.history.push(payload);\n\t\tthis.historyLength += payload.length;\n\t\tthis.trimHistory();\n\t}\n\n\tprivate trimHistory(): void {\n\t\twhile (this.historyLength > this.maxReplayHistoryLength && this.history.length > 1) {\n\t\t\tconst removed = this.history.shift();\n\t\t\tif (removed === undefined) return;\n\t\t\tthis.historyLength -= removed.length;\n\t\t}\n\n\t\tif (this.historyLength <= this.maxReplayHistoryLength) return;\n\t\tconst [onlyChunk] = this.history;\n\t\tif (onlyChunk === undefined) return;\n\t\tconst trimmed = sanitizeString(onlyChunk.slice(-this.maxReplayHistoryLength));\n\t\tthis.history[0] = trimmed;\n\t\tthis.historyLength = trimmed.length;\n\t}\n}\n\nfunction readLine(buffer: XtermTerminalType[\"buffer\"][\"active\"], lineIndex: number): string {\n\treturn buffer.getLine(lineIndex)?.translateToString(true) ?? \"\";\n}\n\nfunction normalizeDimension(value: number | undefined, fallback: number): number {\n\tif (value === undefined || !Number.isFinite(value)) return fallback;\n\treturn Math.min(MAX_SIZE, Math.max(MIN_SIZE, Math.trunc(value)));\n}\n\nfunction normalizeScrollback(value: number | undefined): number {\n\tif (value === undefined || !Number.isFinite(value)) return DEFAULT_SCROLLBACK;\n\treturn Math.max(0, Math.trunc(value));\n}\n\nfunction normalizeReplayHistoryLength(cols: number, rows: number, scrollback: number): number {\n\tconst visibleCells = Math.max(MIN_SIZE, cols) * Math.max(MIN_SIZE, rows + scrollback + 1);\n\treturn Math.min(MAX_REPLAY_HISTORY_LENGTH, Math.max(MIN_REPLAY_HISTORY_LENGTH, visibleCells * 4));\n}\n\nfunction decodeInput(value: string | Uint8Array): string {\n\tif (typeof value === \"string\") return value;\n\treturn new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n}\n\nfunction sanitizeString(value: string): string {\n\tlet output = \"\";\n\tfor (let index = 0; index < value.length; index += 1) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(index + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\toutput += value[index] + value[index + 1];\n\t\t\t\tindex += 1;\n\t\t\t} else {\n\t\t\t\toutput += \"\\uFFFD\";\n\t\t\t}\n\t\t} else if (code >= 0xdc00 && code <= 0xdfff) {\n\t\t\toutput += \"\\uFFFD\";\n\t\t} else {\n\t\t\toutput += value[index];\n\t\t}\n\t}\n\treturn output;\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PipeFallbackOperationResult } from "./pipe-fallback.ts";
|
|
2
|
+
import type { TerminalSessionBackend, TerminalSessionExit, TerminalSessionOperationResult } from "./session-types.ts";
|
|
3
|
+
export declare function normalizeTerminalExit(exit: unknown, backend: TerminalSessionBackend, killRequested: boolean): TerminalSessionExit;
|
|
4
|
+
export declare function normalizeOperationResult(result: TerminalSessionOperationResult | PipeFallbackOperationResult | undefined, defaultNote: string): TerminalSessionOperationResult;
|
|
5
|
+
export declare function normalizeUnknownOperationResult(result: unknown): TerminalSessionOperationResult | undefined;
|
|
6
|
+
export declare function notStartedOperation(operation: string): TerminalSessionOperationResult;
|
|
7
|
+
export declare function exitedOperation(operation: string): TerminalSessionOperationResult;
|
|
8
|
+
//# sourceMappingURL=session-exit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-exit.d.ts","sourceRoot":"","sources":["../src/session-exit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAA2B,MAAM,oBAAoB,CAAC;AAC/F,OAAO,KAAK,EACX,sBAAsB,EACtB,mBAAmB,EAEnB,8BAA8B,EAC9B,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,sBAAsB,EAC/B,aAAa,EAAE,OAAO,GACpB,mBAAmB,CAkBrB;AAED,wBAAgB,wBAAwB,CACvC,MAAM,EAAE,8BAA8B,GAAG,2BAA2B,GAAG,SAAS,EAChF,WAAW,EAAE,MAAM,GACjB,8BAA8B,CAIhC;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,OAAO,GAAG,8BAA8B,GAAG,SAAS,CAQ3G;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,8BAA8B,CAMrF;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,8BAA8B,CAMjF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export function normalizeTerminalExit(exit, backend, killRequested) {
|
|
2
|
+
if (backend === "pipe-fallback" && isPipeFallbackSessionExit(exit)) {
|
|
3
|
+
return normalizePipeFallbackExit(exit, killRequested);
|
|
4
|
+
}
|
|
5
|
+
const record = isRecord(exit) ? exit : {};
|
|
6
|
+
if (record.backend === "pipe-fallback" && isPipeFallbackSessionExit(exit)) {
|
|
7
|
+
return normalizePipeFallbackExit(exit, killRequested);
|
|
8
|
+
}
|
|
9
|
+
const timedOut = readBoolean(record, "timedOut") ?? readBoolean(record, "timed_out") ?? false;
|
|
10
|
+
return {
|
|
11
|
+
backend,
|
|
12
|
+
exitCode: readNullableNumber(record, "exitCode") ?? readNullableNumber(record, "exit_code") ?? null,
|
|
13
|
+
signal: readNullableString(record, "signal"),
|
|
14
|
+
cancelled: (readBoolean(record, "cancelled") ?? readBoolean(record, "canceled") ?? false) || killRequested || timedOut,
|
|
15
|
+
timedOut,
|
|
16
|
+
error: readTerminalExitError(record),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function normalizeOperationResult(result, defaultNote) {
|
|
20
|
+
if (result === undefined)
|
|
21
|
+
return { ok: true, note: defaultNote };
|
|
22
|
+
if ("ok" in result)
|
|
23
|
+
return result;
|
|
24
|
+
return { ok: true, note: defaultNote };
|
|
25
|
+
}
|
|
26
|
+
export function normalizeUnknownOperationResult(result) {
|
|
27
|
+
if (!isRecord(result))
|
|
28
|
+
return undefined;
|
|
29
|
+
const ok = result.ok;
|
|
30
|
+
const note = result.note;
|
|
31
|
+
if (typeof ok !== "boolean" || typeof note !== "string")
|
|
32
|
+
return undefined;
|
|
33
|
+
const code = typeof result.code === "string" ? result.code : undefined;
|
|
34
|
+
const idempotent = typeof result.idempotent === "boolean" ? result.idempotent : undefined;
|
|
35
|
+
return { ok, note, code, idempotent };
|
|
36
|
+
}
|
|
37
|
+
export function notStartedOperation(operation) {
|
|
38
|
+
return {
|
|
39
|
+
ok: false,
|
|
40
|
+
code: "not_started",
|
|
41
|
+
note: `Cannot ${operation} terminal session: session has not started.`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function exitedOperation(operation) {
|
|
45
|
+
return {
|
|
46
|
+
ok: false,
|
|
47
|
+
code: "exited",
|
|
48
|
+
note: `Cannot ${operation} terminal session: session has exited.`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function normalizePipeFallbackExit(exit, killRequested) {
|
|
52
|
+
return {
|
|
53
|
+
backend: "pipe-fallback",
|
|
54
|
+
exitCode: exit.exitCode,
|
|
55
|
+
signal: exit.signal,
|
|
56
|
+
cancelled: killRequested || exit.timedOut,
|
|
57
|
+
timedOut: exit.timedOut,
|
|
58
|
+
error: exit.error,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function isPipeFallbackSessionExit(value) {
|
|
62
|
+
if (!isRecord(value))
|
|
63
|
+
return false;
|
|
64
|
+
const exitCode = value.exitCode;
|
|
65
|
+
const signal = value.signal;
|
|
66
|
+
const timedOut = value.timedOut;
|
|
67
|
+
const error = value.error;
|
|
68
|
+
const exitCodeValid = exitCode === null || (typeof exitCode === "number" && Number.isFinite(exitCode));
|
|
69
|
+
const signalValid = signal === null || typeof signal === "string";
|
|
70
|
+
const errorValid = error === undefined || isTerminalExitError(error);
|
|
71
|
+
return exitCodeValid && signalValid && typeof timedOut === "boolean" && errorValid;
|
|
72
|
+
}
|
|
73
|
+
function isTerminalExitError(value) {
|
|
74
|
+
if (!isRecord(value))
|
|
75
|
+
return false;
|
|
76
|
+
return typeof value.code === "string" && typeof value.message === "string";
|
|
77
|
+
}
|
|
78
|
+
function isRecord(value) {
|
|
79
|
+
return typeof value === "object" && value !== null;
|
|
80
|
+
}
|
|
81
|
+
function readNullableNumber(record, key) {
|
|
82
|
+
const value = record[key];
|
|
83
|
+
if (value === null)
|
|
84
|
+
return null;
|
|
85
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
86
|
+
}
|
|
87
|
+
function readNullableString(record, key) {
|
|
88
|
+
const value = record[key];
|
|
89
|
+
if (value === null)
|
|
90
|
+
return null;
|
|
91
|
+
return typeof value === "string" ? value : null;
|
|
92
|
+
}
|
|
93
|
+
function readBoolean(record, key) {
|
|
94
|
+
const value = record[key];
|
|
95
|
+
return typeof value === "boolean" ? value : undefined;
|
|
96
|
+
}
|
|
97
|
+
function readTerminalExitError(record) {
|
|
98
|
+
const error = record.error;
|
|
99
|
+
if (!isTerminalExitError(error))
|
|
100
|
+
return undefined;
|
|
101
|
+
return error;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=session-exit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-exit.js","sourceRoot":"","sources":["../src/session-exit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PipeFallbackOperationResult, PipeFallbackSessionExit } from \"./pipe-fallback.ts\";\nimport type {\n\tTerminalSessionBackend,\n\tTerminalSessionExit,\n\tTerminalSessionExitError,\n\tTerminalSessionOperationResult,\n} from \"./session-types.ts\";\n\nexport function normalizeTerminalExit(\n\texit: unknown,\n\tbackend: TerminalSessionBackend,\n\tkillRequested: boolean,\n): TerminalSessionExit {\n\tif (backend === \"pipe-fallback\" && isPipeFallbackSessionExit(exit)) {\n\t\treturn normalizePipeFallbackExit(exit, killRequested);\n\t}\n\tconst record = isRecord(exit) ? exit : {};\n\tif (record.backend === \"pipe-fallback\" && isPipeFallbackSessionExit(exit)) {\n\t\treturn normalizePipeFallbackExit(exit, killRequested);\n\t}\n\tconst timedOut = readBoolean(record, \"timedOut\") ?? readBoolean(record, \"timed_out\") ?? false;\n\treturn {\n\t\tbackend,\n\t\texitCode: readNullableNumber(record, \"exitCode\") ?? readNullableNumber(record, \"exit_code\") ?? null,\n\t\tsignal: readNullableString(record, \"signal\"),\n\t\tcancelled:\n\t\t\t(readBoolean(record, \"cancelled\") ?? readBoolean(record, \"canceled\") ?? false) || killRequested || timedOut,\n\t\ttimedOut,\n\t\terror: readTerminalExitError(record),\n\t};\n}\n\nexport function normalizeOperationResult(\n\tresult: TerminalSessionOperationResult | PipeFallbackOperationResult | undefined,\n\tdefaultNote: string,\n): TerminalSessionOperationResult {\n\tif (result === undefined) return { ok: true, note: defaultNote };\n\tif (\"ok\" in result) return result;\n\treturn { ok: true, note: defaultNote };\n}\n\nexport function normalizeUnknownOperationResult(result: unknown): TerminalSessionOperationResult | undefined {\n\tif (!isRecord(result)) return undefined;\n\tconst ok = result.ok;\n\tconst note = result.note;\n\tif (typeof ok !== \"boolean\" || typeof note !== \"string\") return undefined;\n\tconst code = typeof result.code === \"string\" ? result.code : undefined;\n\tconst idempotent = typeof result.idempotent === \"boolean\" ? result.idempotent : undefined;\n\treturn { ok, note, code, idempotent };\n}\n\nexport function notStartedOperation(operation: string): TerminalSessionOperationResult {\n\treturn {\n\t\tok: false,\n\t\tcode: \"not_started\",\n\t\tnote: `Cannot ${operation} terminal session: session has not started.`,\n\t};\n}\n\nexport function exitedOperation(operation: string): TerminalSessionOperationResult {\n\treturn {\n\t\tok: false,\n\t\tcode: \"exited\",\n\t\tnote: `Cannot ${operation} terminal session: session has exited.`,\n\t};\n}\n\nfunction normalizePipeFallbackExit(exit: PipeFallbackSessionExit, killRequested: boolean): TerminalSessionExit {\n\treturn {\n\t\tbackend: \"pipe-fallback\",\n\t\texitCode: exit.exitCode,\n\t\tsignal: exit.signal,\n\t\tcancelled: killRequested || exit.timedOut,\n\t\ttimedOut: exit.timedOut,\n\t\terror: exit.error,\n\t};\n}\n\nfunction isPipeFallbackSessionExit(value: unknown): value is PipeFallbackSessionExit {\n\tif (!isRecord(value)) return false;\n\tconst exitCode = value.exitCode;\n\tconst signal = value.signal;\n\tconst timedOut = value.timedOut;\n\tconst error = value.error;\n\tconst exitCodeValid = exitCode === null || (typeof exitCode === \"number\" && Number.isFinite(exitCode));\n\tconst signalValid = signal === null || typeof signal === \"string\";\n\tconst errorValid = error === undefined || isTerminalExitError(error);\n\treturn exitCodeValid && signalValid && typeof timedOut === \"boolean\" && errorValid;\n}\n\nfunction isTerminalExitError(value: unknown): value is TerminalSessionExitError {\n\tif (!isRecord(value)) return false;\n\treturn typeof value.code === \"string\" && typeof value.message === \"string\";\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction readNullableNumber(record: Readonly<Record<string, unknown>>, key: string): number | null | undefined {\n\tconst value = record[key];\n\tif (value === null) return null;\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readNullableString(record: Readonly<Record<string, unknown>>, key: string): string | null {\n\tconst value = record[key];\n\tif (value === null) return null;\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction readBoolean(record: Readonly<Record<string, unknown>>, key: string): boolean | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction readTerminalExitError(record: Readonly<Record<string, unknown>>): TerminalSessionExitError | undefined {\n\tconst error = record.error;\n\tif (!isTerminalExitError(error)) return undefined;\n\treturn error;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { NativePtyLoadResult } from "./native-loader.ts";
|
|
2
|
+
import type { CreateNativeTerminalSession } from "./session-types.ts";
|
|
3
|
+
export declare function getNativeSessionFactory(loadResult: NativePtyLoadResult): CreateNativeTerminalSession | null;
|
|
4
|
+
//# sourceMappingURL=session-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-native.d.ts","sourceRoot":"","sources":["../src/session-native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EACX,2BAA2B,EAK3B,MAAM,oBAAoB,CAAC;AAa5B,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,mBAAmB,GAAG,2BAA2B,GAAG,IAAI,CAW3G"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { normalizeUnknownOperationResult } from "./session-exit.js";
|
|
2
|
+
export function getNativeSessionFactory(loadResult) {
|
|
3
|
+
if (loadResult.native === null)
|
|
4
|
+
return null;
|
|
5
|
+
const create = loadResult.native.createPtySession ?? loadResult.native.startPtySession;
|
|
6
|
+
if (isNativeSessionCreator(create)) {
|
|
7
|
+
return (options, onData) => normalizeTerminalSessionHandle(create(options, onData));
|
|
8
|
+
}
|
|
9
|
+
const PtySession = loadResult.native.PtySession;
|
|
10
|
+
if (isNativeSessionConstructor(PtySession)) {
|
|
11
|
+
return (options, onData) => normalizeTerminalSessionHandle(new PtySession(options, onData));
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
function normalizeTerminalSessionHandle(value) {
|
|
16
|
+
if (!isRecord(value))
|
|
17
|
+
throw new Error("Native PTY session factory did not return an object");
|
|
18
|
+
const write = value.write;
|
|
19
|
+
const resize = value.resize;
|
|
20
|
+
const kill = value.kill;
|
|
21
|
+
if (!isNativeWrite(write))
|
|
22
|
+
throw new Error("Native PTY session handle is missing write()");
|
|
23
|
+
if (!isNativeResize(resize))
|
|
24
|
+
throw new Error("Native PTY session handle is missing resize()");
|
|
25
|
+
if (!isNativeKill(kill))
|
|
26
|
+
throw new Error("Native PTY session handle is missing kill()");
|
|
27
|
+
const waitExit = value.waitExit;
|
|
28
|
+
const wait = value.wait;
|
|
29
|
+
if (!isNativeWait(waitExit) && !isNativeWait(wait)) {
|
|
30
|
+
throw new Error("Native PTY session handle is missing waitExit() or wait()");
|
|
31
|
+
}
|
|
32
|
+
const requiredHandle = {
|
|
33
|
+
write(data) {
|
|
34
|
+
return normalizeUnknownOperationResult(write.call(value, data));
|
|
35
|
+
},
|
|
36
|
+
resize(cols, rows) {
|
|
37
|
+
return normalizeUnknownOperationResult(resize.call(value, cols, rows));
|
|
38
|
+
},
|
|
39
|
+
kill(signal) {
|
|
40
|
+
return normalizeUnknownOperationResult(kill.call(value, signal));
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const onData = value.onData;
|
|
44
|
+
if (isNativeWait(waitExit) && isNativeOnData(onData)) {
|
|
45
|
+
return {
|
|
46
|
+
...requiredHandle,
|
|
47
|
+
onData: (handler) => normalizeUnsubscribe(onData.call(value, handler)),
|
|
48
|
+
waitExit: async () => waitExit.call(value),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (isNativeWait(waitExit))
|
|
52
|
+
return { ...requiredHandle, waitExit: async () => waitExit.call(value) };
|
|
53
|
+
if (isNativeOnData(onData) && isNativeWait(wait)) {
|
|
54
|
+
return {
|
|
55
|
+
...requiredHandle,
|
|
56
|
+
onData: (handler) => normalizeUnsubscribe(onData.call(value, handler)),
|
|
57
|
+
wait: async () => wait.call(value),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (isNativeWait(wait))
|
|
61
|
+
return { ...requiredHandle, wait: async () => wait.call(value) };
|
|
62
|
+
throw new Error("Native PTY session handle is missing waitExit() or wait()");
|
|
63
|
+
}
|
|
64
|
+
function normalizeUnsubscribe(value) {
|
|
65
|
+
return isUnsubscribe(value) ? value : () => { };
|
|
66
|
+
}
|
|
67
|
+
function isNativeSessionCreator(value) {
|
|
68
|
+
return typeof value === "function";
|
|
69
|
+
}
|
|
70
|
+
function isNativeSessionConstructor(value) {
|
|
71
|
+
return typeof value === "function";
|
|
72
|
+
}
|
|
73
|
+
function isNativeWrite(value) {
|
|
74
|
+
return typeof value === "function";
|
|
75
|
+
}
|
|
76
|
+
function isNativeResize(value) {
|
|
77
|
+
return typeof value === "function";
|
|
78
|
+
}
|
|
79
|
+
function isNativeKill(value) {
|
|
80
|
+
return typeof value === "function";
|
|
81
|
+
}
|
|
82
|
+
function isNativeWait(value) {
|
|
83
|
+
return typeof value === "function";
|
|
84
|
+
}
|
|
85
|
+
function isNativeOnData(value) {
|
|
86
|
+
return typeof value === "function";
|
|
87
|
+
}
|
|
88
|
+
function isUnsubscribe(value) {
|
|
89
|
+
return typeof value === "function";
|
|
90
|
+
}
|
|
91
|
+
function isRecord(value) {
|
|
92
|
+
return typeof value === "object" && value !== null;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=session-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-native.js","sourceRoot":"","sources":["../src/session-native.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NativePtyLoadResult } from \"./native-loader.ts\";\nimport { normalizeUnknownOperationResult } from \"./session-exit.ts\";\nimport type {\n\tCreateNativeTerminalSession,\n\tTerminalSessionDataHandler,\n\tTerminalSessionHandle,\n\tTerminalSessionNativeOptions,\n\tTerminalSessionSignal,\n} from \"./session-types.ts\";\n\ntype NativeSessionCreator = (options: TerminalSessionNativeOptions, onData: TerminalSessionDataHandler) => unknown;\ntype NativeSessionConstructor = new (\n\toptions: TerminalSessionNativeOptions,\n\tonData: TerminalSessionDataHandler,\n) => unknown;\ntype NativeWrite = (data: string | Uint8Array) => unknown;\ntype NativeResize = (cols: number, rows: number) => unknown;\ntype NativeKill = (signal?: TerminalSessionSignal) => unknown;\ntype NativeWait = () => Promise<unknown> | unknown;\ntype NativeOnData = (handler: TerminalSessionDataHandler) => (() => void) | unknown;\n\nexport function getNativeSessionFactory(loadResult: NativePtyLoadResult): CreateNativeTerminalSession | null {\n\tif (loadResult.native === null) return null;\n\tconst create = loadResult.native.createPtySession ?? loadResult.native.startPtySession;\n\tif (isNativeSessionCreator(create)) {\n\t\treturn (options, onData) => normalizeTerminalSessionHandle(create(options, onData));\n\t}\n\tconst PtySession = loadResult.native.PtySession;\n\tif (isNativeSessionConstructor(PtySession)) {\n\t\treturn (options, onData) => normalizeTerminalSessionHandle(new PtySession(options, onData));\n\t}\n\treturn null;\n}\n\nfunction normalizeTerminalSessionHandle(value: unknown): TerminalSessionHandle {\n\tif (!isRecord(value)) throw new Error(\"Native PTY session factory did not return an object\");\n\tconst write = value.write;\n\tconst resize = value.resize;\n\tconst kill = value.kill;\n\tif (!isNativeWrite(write)) throw new Error(\"Native PTY session handle is missing write()\");\n\tif (!isNativeResize(resize)) throw new Error(\"Native PTY session handle is missing resize()\");\n\tif (!isNativeKill(kill)) throw new Error(\"Native PTY session handle is missing kill()\");\n\n\tconst waitExit = value.waitExit;\n\tconst wait = value.wait;\n\tif (!isNativeWait(waitExit) && !isNativeWait(wait)) {\n\t\tthrow new Error(\"Native PTY session handle is missing waitExit() or wait()\");\n\t}\n\n\tconst requiredHandle = {\n\t\twrite(data: string | Uint8Array) {\n\t\t\treturn normalizeUnknownOperationResult(write.call(value, data));\n\t\t},\n\t\tresize(cols: number, rows: number) {\n\t\t\treturn normalizeUnknownOperationResult(resize.call(value, cols, rows));\n\t\t},\n\t\tkill(signal?: TerminalSessionSignal) {\n\t\t\treturn normalizeUnknownOperationResult(kill.call(value, signal));\n\t\t},\n\t};\n\tconst onData = value.onData;\n\tif (isNativeWait(waitExit) && isNativeOnData(onData)) {\n\t\treturn {\n\t\t\t...requiredHandle,\n\t\t\tonData: (handler) => normalizeUnsubscribe(onData.call(value, handler)),\n\t\t\twaitExit: async () => waitExit.call(value),\n\t\t};\n\t}\n\tif (isNativeWait(waitExit)) return { ...requiredHandle, waitExit: async () => waitExit.call(value) };\n\tif (isNativeOnData(onData) && isNativeWait(wait)) {\n\t\treturn {\n\t\t\t...requiredHandle,\n\t\t\tonData: (handler) => normalizeUnsubscribe(onData.call(value, handler)),\n\t\t\twait: async () => wait.call(value),\n\t\t};\n\t}\n\tif (isNativeWait(wait)) return { ...requiredHandle, wait: async () => wait.call(value) };\n\tthrow new Error(\"Native PTY session handle is missing waitExit() or wait()\");\n}\n\nfunction normalizeUnsubscribe(value: unknown): () => void {\n\treturn isUnsubscribe(value) ? value : () => {};\n}\n\nfunction isNativeSessionCreator(value: unknown): value is NativeSessionCreator {\n\treturn typeof value === \"function\";\n}\n\nfunction isNativeSessionConstructor(value: unknown): value is NativeSessionConstructor {\n\treturn typeof value === \"function\";\n}\n\nfunction isNativeWrite(value: unknown): value is NativeWrite {\n\treturn typeof value === \"function\";\n}\n\nfunction isNativeResize(value: unknown): value is NativeResize {\n\treturn typeof value === \"function\";\n}\n\nfunction isNativeKill(value: unknown): value is NativeKill {\n\treturn typeof value === \"function\";\n}\n\nfunction isNativeWait(value: unknown): value is NativeWait {\n\treturn typeof value === \"function\";\n}\n\nfunction isNativeOnData(value: unknown): value is NativeOnData {\n\treturn typeof value === \"function\";\n}\n\nfunction isUnsubscribe(value: unknown): value is () => void {\n\treturn typeof value === \"function\";\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === \"object\" && value !== null;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PipeFallbackSessionOptions } from "./pipe-fallback.ts";
|
|
2
|
+
import type { TerminalSessionNativeOptions, TerminalSessionOptions } from "./session-types.ts";
|
|
3
|
+
export declare const DEFAULT_COLS = 80;
|
|
4
|
+
export declare const DEFAULT_ROWS = 24;
|
|
5
|
+
export declare const DEFAULT_RAW_TAIL_BYTES: number;
|
|
6
|
+
export declare function normalizeRawTailBytes(value: number | undefined): number;
|
|
7
|
+
export declare function defaultCommand(): string;
|
|
8
|
+
export declare function toNativeOptions(options: TerminalSessionOptions): TerminalSessionNativeOptions;
|
|
9
|
+
export declare function toPipeFallbackOptions(options: TerminalSessionOptions): PipeFallbackSessionOptions;
|
|
10
|
+
//# sourceMappingURL=session-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-options.d.ts","sourceRoot":"","sources":["../src/session-options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE/F,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,sBAAsB,QAAY,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMvE;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,4BAA4B,CAU7F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,0BAA0B,CAQjG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
export const DEFAULT_COLS = 80;
|
|
3
|
+
export const DEFAULT_ROWS = 24;
|
|
4
|
+
export const DEFAULT_RAW_TAIL_BYTES = 64 * 1024;
|
|
5
|
+
export function normalizeRawTailBytes(value) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
return DEFAULT_RAW_TAIL_BYTES;
|
|
8
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
9
|
+
throw new Error("Invalid rawTailBytes: must be a non-negative safe integer");
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
export function defaultCommand() {
|
|
14
|
+
if (process.platform === "win32")
|
|
15
|
+
return process.env.ComSpec ?? "cmd.exe";
|
|
16
|
+
return process.env.SHELL ?? "sh";
|
|
17
|
+
}
|
|
18
|
+
export function toNativeOptions(options) {
|
|
19
|
+
return {
|
|
20
|
+
command: options.command ?? defaultCommand(),
|
|
21
|
+
args: [...(options.args ?? [])],
|
|
22
|
+
cwd: options.cwd,
|
|
23
|
+
env: options.env ? { ...options.env } : undefined,
|
|
24
|
+
cols: options.cols ?? DEFAULT_COLS,
|
|
25
|
+
rows: options.rows ?? DEFAULT_ROWS,
|
|
26
|
+
timeoutMs: options.timeoutMs,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function toPipeFallbackOptions(options) {
|
|
30
|
+
return {
|
|
31
|
+
command: options.command ?? defaultCommand(),
|
|
32
|
+
args: options.args ? [...options.args] : undefined,
|
|
33
|
+
cwd: options.cwd,
|
|
34
|
+
env: options.env ? { ...options.env } : undefined,
|
|
35
|
+
timeoutMs: options.timeoutMs,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=session-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-options.js","sourceRoot":"","sources":["../src/session-options.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhD,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC9D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1E,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC9D,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE;QAC5C,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC/B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QACjD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;QAClC,SAAS,EAAE,OAAO,CAAC,SAAS;KAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACpE,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,EAAE;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAClD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QACjD,SAAS,EAAE,OAAO,CAAC,SAAS;KAC5B,CAAC;AACH,CAAC","sourcesContent":["import process from \"node:process\";\nimport type { PipeFallbackSessionOptions } from \"./pipe-fallback.ts\";\nimport type { TerminalSessionNativeOptions, TerminalSessionOptions } from \"./session-types.ts\";\n\nexport const DEFAULT_COLS = 80;\nexport const DEFAULT_ROWS = 24;\nexport const DEFAULT_RAW_TAIL_BYTES = 64 * 1024;\n\nexport function normalizeRawTailBytes(value: number | undefined): number {\n\tif (value === undefined) return DEFAULT_RAW_TAIL_BYTES;\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new Error(\"Invalid rawTailBytes: must be a non-negative safe integer\");\n\t}\n\treturn value;\n}\n\nexport function defaultCommand(): string {\n\tif (process.platform === \"win32\") return process.env.ComSpec ?? \"cmd.exe\";\n\treturn process.env.SHELL ?? \"sh\";\n}\n\nexport function toNativeOptions(options: TerminalSessionOptions): TerminalSessionNativeOptions {\n\treturn {\n\t\tcommand: options.command ?? defaultCommand(),\n\t\targs: [...(options.args ?? [])],\n\t\tcwd: options.cwd,\n\t\tenv: options.env ? { ...options.env } : undefined,\n\t\tcols: options.cols ?? DEFAULT_COLS,\n\t\trows: options.rows ?? DEFAULT_ROWS,\n\t\ttimeoutMs: options.timeoutMs,\n\t};\n}\n\nexport function toPipeFallbackOptions(options: TerminalSessionOptions): PipeFallbackSessionOptions {\n\treturn {\n\t\tcommand: options.command ?? defaultCommand(),\n\t\targs: options.args ? [...options.args] : undefined,\n\t\tcwd: options.cwd,\n\t\tenv: options.env ? { ...options.env } : undefined,\n\t\ttimeoutMs: options.timeoutMs,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Buffer } from "node:buffer";
|
|
2
|
+
import type { NativePtyLoadResult } from "./native-loader.ts";
|
|
3
|
+
export type TerminalSessionBackend = "native" | "pipe-fallback";
|
|
4
|
+
export type TerminalSessionDataHandler = (chunk: Buffer) => void;
|
|
5
|
+
export type TerminalSessionSignal = NodeJS.Signals;
|
|
6
|
+
export interface TerminalSessionOptions {
|
|
7
|
+
readonly command?: string;
|
|
8
|
+
readonly args?: readonly string[];
|
|
9
|
+
readonly cwd?: string;
|
|
10
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
11
|
+
readonly cols?: number;
|
|
12
|
+
readonly rows?: number;
|
|
13
|
+
readonly timeoutMs?: number;
|
|
14
|
+
readonly rawTailBytes?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TerminalSessionNativeOptions {
|
|
17
|
+
readonly command: string;
|
|
18
|
+
readonly args: readonly string[];
|
|
19
|
+
readonly cwd?: string;
|
|
20
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
21
|
+
readonly cols: number;
|
|
22
|
+
readonly rows: number;
|
|
23
|
+
readonly timeoutMs?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface TerminalSessionOperationResult {
|
|
26
|
+
readonly ok: boolean;
|
|
27
|
+
readonly note: string;
|
|
28
|
+
readonly code?: string;
|
|
29
|
+
readonly idempotent?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface TerminalSessionExitError {
|
|
32
|
+
readonly code: string;
|
|
33
|
+
readonly message: string;
|
|
34
|
+
}
|
|
35
|
+
export interface TerminalSessionExit {
|
|
36
|
+
readonly backend: TerminalSessionBackend;
|
|
37
|
+
readonly exitCode: number | null;
|
|
38
|
+
readonly signal: string | null;
|
|
39
|
+
readonly cancelled: boolean;
|
|
40
|
+
readonly timedOut: boolean;
|
|
41
|
+
readonly error?: TerminalSessionExitError;
|
|
42
|
+
}
|
|
43
|
+
export type TerminalSessionExitState = {
|
|
44
|
+
readonly status: "not_started" | "running";
|
|
45
|
+
readonly exit: null;
|
|
46
|
+
} | {
|
|
47
|
+
readonly status: "exited";
|
|
48
|
+
readonly exit: TerminalSessionExit;
|
|
49
|
+
};
|
|
50
|
+
export interface TerminalSessionHandle {
|
|
51
|
+
readonly onData?: (handler: TerminalSessionDataHandler) => () => void;
|
|
52
|
+
readonly write: (data: string | Uint8Array) => TerminalSessionOperationResult | undefined;
|
|
53
|
+
readonly resize: (cols: number, rows: number) => TerminalSessionOperationResult | undefined;
|
|
54
|
+
readonly kill: (signal?: TerminalSessionSignal) => TerminalSessionOperationResult | undefined;
|
|
55
|
+
readonly waitExit?: () => Promise<unknown>;
|
|
56
|
+
readonly wait?: () => Promise<unknown>;
|
|
57
|
+
}
|
|
58
|
+
export type CreateNativeTerminalSession = (options: TerminalSessionNativeOptions, onData: TerminalSessionDataHandler) => TerminalSessionHandle;
|
|
59
|
+
export interface TerminalSessionDependencies {
|
|
60
|
+
readonly nativeLoadResult?: NativePtyLoadResult;
|
|
61
|
+
readonly createNativeSession?: CreateNativeTerminalSession;
|
|
62
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=session-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../src/session-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-types.js","sourceRoot":"","sources":["../src/session-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Buffer } from \"node:buffer\";\nimport type { NativePtyLoadResult } from \"./native-loader.ts\";\n\nexport type TerminalSessionBackend = \"native\" | \"pipe-fallback\";\nexport type TerminalSessionDataHandler = (chunk: Buffer) => void;\nexport type TerminalSessionSignal = NodeJS.Signals;\n\nexport interface TerminalSessionOptions {\n\treadonly command?: string;\n\treadonly args?: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols?: number;\n\treadonly rows?: number;\n\treadonly timeoutMs?: number;\n\treadonly rawTailBytes?: number;\n}\n\nexport interface TerminalSessionNativeOptions {\n\treadonly command: string;\n\treadonly args: readonly string[];\n\treadonly cwd?: string;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n\treadonly cols: number;\n\treadonly rows: number;\n\treadonly timeoutMs?: number;\n}\n\nexport interface TerminalSessionOperationResult {\n\treadonly ok: boolean;\n\treadonly note: string;\n\treadonly code?: string;\n\treadonly idempotent?: boolean;\n}\n\nexport interface TerminalSessionExitError {\n\treadonly code: string;\n\treadonly message: string;\n}\n\nexport interface TerminalSessionExit {\n\treadonly backend: TerminalSessionBackend;\n\treadonly exitCode: number | null;\n\treadonly signal: string | null;\n\treadonly cancelled: boolean;\n\treadonly timedOut: boolean;\n\treadonly error?: TerminalSessionExitError;\n}\n\nexport type TerminalSessionExitState =\n\t| {\n\t\t\treadonly status: \"not_started\" | \"running\";\n\t\t\treadonly exit: null;\n\t }\n\t| {\n\t\t\treadonly status: \"exited\";\n\t\t\treadonly exit: TerminalSessionExit;\n\t };\n\nexport interface TerminalSessionHandle {\n\treadonly onData?: (handler: TerminalSessionDataHandler) => () => void;\n\treadonly write: (data: string | Uint8Array) => TerminalSessionOperationResult | undefined;\n\treadonly resize: (cols: number, rows: number) => TerminalSessionOperationResult | undefined;\n\treadonly kill: (signal?: TerminalSessionSignal) => TerminalSessionOperationResult | undefined;\n\treadonly waitExit?: () => Promise<unknown>;\n\treadonly wait?: () => Promise<unknown>;\n}\n\nexport type CreateNativeTerminalSession = (\n\toptions: TerminalSessionNativeOptions,\n\tonData: TerminalSessionDataHandler,\n) => TerminalSessionHandle;\n\nexport interface TerminalSessionDependencies {\n\treadonly nativeLoadResult?: NativePtyLoadResult;\n\treadonly createNativeSession?: CreateNativeTerminalSession;\n\treadonly env?: Readonly<Record<string, string | undefined>>;\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { type NativePtyLoadResult, type NativePtyUnavailableDiagnostic } from "./native-loader.ts";
|
|
3
|
+
import type { TerminalSessionBackend, TerminalSessionDataHandler, TerminalSessionDependencies, TerminalSessionExit, TerminalSessionExitState, TerminalSessionOperationResult, TerminalSessionOptions, TerminalSessionSignal } from "./session-types.ts";
|
|
4
|
+
export type { CreateNativeTerminalSession, TerminalSessionBackend, TerminalSessionDataHandler, TerminalSessionDependencies, TerminalSessionExit, TerminalSessionExitError, TerminalSessionExitState, TerminalSessionHandle, TerminalSessionNativeOptions, TerminalSessionOperationResult, TerminalSessionOptions, TerminalSessionSignal, } from "./session-types.ts";
|
|
5
|
+
export declare class TerminalSession {
|
|
6
|
+
readonly options: TerminalSessionOptions;
|
|
7
|
+
private readonly nativeLoadResult;
|
|
8
|
+
private readonly createNativeSessionDependency?;
|
|
9
|
+
private readonly env;
|
|
10
|
+
private readonly rawTailLimit;
|
|
11
|
+
private readonly dataHandlers;
|
|
12
|
+
private readonly exitHandlers;
|
|
13
|
+
private backendHandle;
|
|
14
|
+
private backendValue;
|
|
15
|
+
private exitPromise;
|
|
16
|
+
private settledExit;
|
|
17
|
+
private rawTailBuffer;
|
|
18
|
+
private rawByteCount;
|
|
19
|
+
private killRequested;
|
|
20
|
+
private unsubscribeBackendData;
|
|
21
|
+
constructor(options?: TerminalSessionOptions, dependencies?: TerminalSessionDependencies);
|
|
22
|
+
get native(): NativePtyLoadResult;
|
|
23
|
+
get unavailableDiagnostic(): NativePtyUnavailableDiagnostic | null;
|
|
24
|
+
get backend(): TerminalSessionBackend | null;
|
|
25
|
+
get command(): string;
|
|
26
|
+
get status(): "not_started" | "running" | "exited";
|
|
27
|
+
get exited(): boolean;
|
|
28
|
+
get isExited(): boolean;
|
|
29
|
+
get exitResult(): TerminalSessionExit | null;
|
|
30
|
+
get rawTail(): Buffer;
|
|
31
|
+
get rawOutputBytes(): number;
|
|
32
|
+
get exitState(): TerminalSessionExitState;
|
|
33
|
+
start(): this;
|
|
34
|
+
onData(handler: TerminalSessionDataHandler): () => void;
|
|
35
|
+
onExit(handler: () => void): () => void;
|
|
36
|
+
write(data: string | Uint8Array): TerminalSessionOperationResult;
|
|
37
|
+
resize(cols: number, rows: number): TerminalSessionOperationResult;
|
|
38
|
+
kill(signal?: TerminalSessionSignal): TerminalSessionOperationResult;
|
|
39
|
+
stop(): TerminalSessionOperationResult;
|
|
40
|
+
waitExit(): Promise<TerminalSessionExit>;
|
|
41
|
+
private waitBackendExit;
|
|
42
|
+
private settleExit;
|
|
43
|
+
private emitData;
|
|
44
|
+
private appendRawTail;
|
|
45
|
+
}
|
|
46
|
+
export declare function createTerminalSession(options?: TerminalSessionOptions, dependencies?: TerminalSessionDependencies): TerminalSession;
|
|
47
|
+
//# sourceMappingURL=session.d.ts.map
|