@sentropic/h2a-runtime 0.91.0 → 0.91.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +3 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/native-terminal/client.d.ts +23 -0
  6. package/dist/native-terminal/client.d.ts.map +1 -0
  7. package/dist/native-terminal/client.js +203 -0
  8. package/dist/native-terminal/client.js.map +1 -0
  9. package/dist/native-terminal/host.d.ts +78 -0
  10. package/dist/native-terminal/host.d.ts.map +1 -0
  11. package/dist/native-terminal/host.js +275 -0
  12. package/dist/native-terminal/host.js.map +1 -0
  13. package/dist/native-terminal/process.d.ts +11 -0
  14. package/dist/native-terminal/process.d.ts.map +1 -0
  15. package/dist/native-terminal/process.js +137 -0
  16. package/dist/native-terminal/process.js.map +1 -0
  17. package/dist/native-terminal/protocol.d.ts +57 -0
  18. package/dist/native-terminal/protocol.d.ts.map +1 -0
  19. package/dist/native-terminal/protocol.js +102 -0
  20. package/dist/native-terminal/protocol.js.map +1 -0
  21. package/dist/native-terminal/replay-buffer.d.ts +26 -0
  22. package/dist/native-terminal/replay-buffer.d.ts.map +1 -0
  23. package/dist/native-terminal/replay-buffer.js +84 -0
  24. package/dist/native-terminal/replay-buffer.js.map +1 -0
  25. package/dist/native-terminal/server.d.ts +13 -0
  26. package/dist/native-terminal/server.d.ts.map +1 -0
  27. package/dist/native-terminal/server.js +555 -0
  28. package/dist/native-terminal/server.js.map +1 -0
  29. package/dist/native-terminal/socket-path.d.ts +8 -0
  30. package/dist/native-terminal/socket-path.d.ts.map +1 -0
  31. package/dist/native-terminal/socket-path.js +41 -0
  32. package/dist/native-terminal/socket-path.js.map +1 -0
  33. package/dist/native-terminal/supervisor.d.ts +26 -0
  34. package/dist/native-terminal/supervisor.d.ts.map +1 -0
  35. package/dist/native-terminal/supervisor.js +273 -0
  36. package/dist/native-terminal/supervisor.js.map +1 -0
  37. package/dist/pty.d.ts +1 -0
  38. package/dist/pty.d.ts.map +1 -1
  39. package/dist/pty.js +78 -2
  40. package/dist/pty.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,23 @@
1
+ import type { NativeTerminalControllerLease, NativeTerminalControllerState, NativeTerminalCreateOptions, NativeTerminalObserverAttachment, NativeTerminalReplay, NativeTerminalSessionState } from "./host.js";
2
+ import { type NativeTerminalPing, type NativeTerminalStopSignal } from "./protocol.js";
3
+ export declare class NativeTerminalClient {
4
+ #private;
5
+ private constructor();
6
+ static connect(socketPath: string, options?: {
7
+ connectTimeoutMs?: number;
8
+ requestTimeoutMs?: number;
9
+ }): Promise<NativeTerminalClient>;
10
+ ping(timeoutMs?: number): Promise<NativeTerminalPing>;
11
+ create(options: NativeTerminalCreateOptions): Promise<NativeTerminalSessionState>;
12
+ list(): Promise<ReadonlyArray<NativeTerminalSessionState>>;
13
+ state(id: string): Promise<NativeTerminalSessionState>;
14
+ readOutput(id: string, afterSeq: number): Promise<NativeTerminalReplay>;
15
+ attachObserver(id: string): Promise<NativeTerminalObserverAttachment>;
16
+ acquireController(id: string, controllerId: string): Promise<NativeTerminalControllerLease>;
17
+ releaseController(lease: NativeTerminalControllerLease): Promise<NativeTerminalControllerState>;
18
+ write(lease: NativeTerminalControllerLease, data: string): Promise<void>;
19
+ resize(lease: NativeTerminalControllerLease, cols: number, rows: number): Promise<void>;
20
+ stop(lease: NativeTerminalControllerLease, signal?: NativeTerminalStopSignal): Promise<NativeTerminalSessionState>;
21
+ close(): void;
22
+ }
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/native-terminal/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,gCAAgC,EAChC,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,WAAW,CAAC;AACnB,OAAO,EAML,KAAK,kBAAkB,EAEvB,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AAYvB,qBAAa,oBAAoB;;IAO/B,OAAO;WAUM,OAAO,CAClB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QACP,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACtB,GACL,OAAO,CAAC,oBAAoB,CAAC;IAyDhC,IAAI,CAAC,SAAS,SAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIrE,MAAM,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAIjF,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAC;IAI1D,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAItD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIvE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,CAAC;IAIrE,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAI3F,iBAAiB,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAIzF,KAAK,CAAC,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxE,MAAM,CAAC,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7F,IAAI,CACF,KAAK,EAAE,6BAA6B,EACpC,MAAM,CAAC,EAAE,wBAAwB,GAChC,OAAO,CAAC,0BAA0B,CAAC;IAOtC,KAAK,IAAI,IAAI;CAkGd"}
@@ -0,0 +1,203 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createConnection } from "node:net";
3
+ import { NATIVE_TERMINAL_DEFAULT_REQUEST_TIMEOUT_MS, NATIVE_TERMINAL_MAX_FRAME_BYTES, NATIVE_TERMINAL_PROTOCOL_VERSION, NativeTerminalRemoteError, parseNativeTerminalResponse, } from "./protocol.js";
4
+ import { inspectPrivateNativeTerminalSocket, sameNativeTerminalSocket, } from "./socket-path.js";
5
+ export class NativeTerminalClient {
6
+ #socket;
7
+ #requestTimeoutMs;
8
+ #pending = new Map();
9
+ #buffer = "";
10
+ #closed = false;
11
+ constructor(socket, requestTimeoutMs) {
12
+ this.#socket = socket;
13
+ this.#requestTimeoutMs = requestTimeoutMs;
14
+ socket.setNoDelay(true);
15
+ socket.setEncoding("utf8");
16
+ socket.on("data", (chunk) => this.#onData(chunk));
17
+ socket.on("error", (error) => this.#fail(error));
18
+ socket.on("close", () => this.#fail(new Error("terminal host connection closed")));
19
+ }
20
+ static async connect(socketPath, options = {}) {
21
+ const expected = await inspectPrivateNativeTerminalSocket(socketPath);
22
+ const connectTimeoutMs = options.connectTimeoutMs ?? 1_000;
23
+ const requestTimeoutMs = options.requestTimeoutMs ?? NATIVE_TERMINAL_DEFAULT_REQUEST_TIMEOUT_MS;
24
+ for (const [label, value] of [
25
+ ["connectTimeoutMs", connectTimeoutMs],
26
+ ["requestTimeoutMs", requestTimeoutMs],
27
+ ]) {
28
+ if (!Number.isSafeInteger(value) || value <= 0) {
29
+ throw new RangeError(`${label} must be a positive safe integer`);
30
+ }
31
+ }
32
+ return new Promise((resolve, reject) => {
33
+ const socket = createConnection(socketPath);
34
+ let settled = false;
35
+ const timeout = setTimeout(() => {
36
+ if (settled)
37
+ return;
38
+ settled = true;
39
+ socket.destroy();
40
+ reject(new Error("terminal host connection timed out"));
41
+ }, connectTimeoutMs);
42
+ timeout.unref();
43
+ const onError = (error) => {
44
+ if (settled)
45
+ return;
46
+ settled = true;
47
+ clearTimeout(timeout);
48
+ socket.removeListener("connect", onConnect);
49
+ socket.destroy();
50
+ reject(error);
51
+ };
52
+ const onConnect = () => {
53
+ void inspectPrivateNativeTerminalSocket(socketPath).then((connected) => {
54
+ if (settled)
55
+ return;
56
+ if (!sameNativeTerminalSocket(expected, connected)) {
57
+ settled = true;
58
+ clearTimeout(timeout);
59
+ socket.destroy();
60
+ reject(new Error("terminal host socket changed while connecting"));
61
+ return;
62
+ }
63
+ settled = true;
64
+ clearTimeout(timeout);
65
+ socket.removeListener("error", onError);
66
+ resolve(new NativeTerminalClient(socket, requestTimeoutMs));
67
+ }, onError);
68
+ };
69
+ socket.once("error", onError);
70
+ socket.once("connect", onConnect);
71
+ });
72
+ }
73
+ ping(timeoutMs = this.#requestTimeoutMs) {
74
+ return this.#request("ping", undefined, timeoutMs);
75
+ }
76
+ create(options) {
77
+ return this.#request("create", options);
78
+ }
79
+ list() {
80
+ return this.#request("list");
81
+ }
82
+ state(id) {
83
+ return this.#request("state", { id });
84
+ }
85
+ readOutput(id, afterSeq) {
86
+ return this.#request("read-output", { id, afterSeq });
87
+ }
88
+ attachObserver(id) {
89
+ return this.#request("attach-observer", { id });
90
+ }
91
+ acquireController(id, controllerId) {
92
+ return this.#request("acquire-controller", { id, controllerId });
93
+ }
94
+ releaseController(lease) {
95
+ return this.#request("release-controller", { lease });
96
+ }
97
+ async write(lease, data) {
98
+ await this.#request("write", { lease, data });
99
+ }
100
+ async resize(lease, cols, rows) {
101
+ await this.#request("resize", { lease, cols, rows });
102
+ }
103
+ stop(lease, signal) {
104
+ return this.#request("stop", signal === undefined ? { lease } : { lease, signal });
105
+ }
106
+ close() {
107
+ if (this.#closed)
108
+ return;
109
+ this.#closed = true;
110
+ this.#socket.destroy();
111
+ this.#fail(new Error("terminal host client closed"));
112
+ }
113
+ #request(operation, params, timeoutMs = this.#requestTimeoutMs) {
114
+ if (this.#closed)
115
+ return Promise.reject(new Error("terminal host client is closed"));
116
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
117
+ return Promise.reject(new RangeError("terminal host request timeout must be a positive safe integer"));
118
+ }
119
+ const id = randomUUID();
120
+ const request = params === undefined
121
+ ? { version: NATIVE_TERMINAL_PROTOCOL_VERSION, id, operation }
122
+ : { version: NATIVE_TERMINAL_PROTOCOL_VERSION, id, operation, params };
123
+ const frame = `${JSON.stringify(request)}\n`;
124
+ if (Buffer.byteLength(frame) > NATIVE_TERMINAL_MAX_FRAME_BYTES) {
125
+ return Promise.reject(new RangeError("terminal host request exceeds the frame limit"));
126
+ }
127
+ return new Promise((resolve, reject) => {
128
+ const timeout = setTimeout(() => {
129
+ if (!this.#pending.delete(id))
130
+ return;
131
+ reject(new Error(`terminal host ${operation} request timed out after ${timeoutMs}ms`));
132
+ }, timeoutMs);
133
+ timeout.unref();
134
+ this.#pending.set(id, { resolve, reject, timeout });
135
+ this.#socket.write(frame, (error) => {
136
+ if (!error)
137
+ return;
138
+ const pending = this.#pending.get(id);
139
+ if (!pending)
140
+ return;
141
+ this.#pending.delete(id);
142
+ clearTimeout(pending.timeout);
143
+ reject(error);
144
+ });
145
+ });
146
+ }
147
+ #onData(chunk) {
148
+ this.#buffer += chunk;
149
+ for (;;) {
150
+ const newline = this.#buffer.indexOf("\n");
151
+ if (newline < 0)
152
+ break;
153
+ const line = this.#buffer.slice(0, newline);
154
+ this.#buffer = this.#buffer.slice(newline + 1);
155
+ if (line.length === 0)
156
+ continue;
157
+ if (Buffer.byteLength(line) > NATIVE_TERMINAL_MAX_FRAME_BYTES) {
158
+ this.#socket.destroy(new Error("terminal host response exceeds the frame limit"));
159
+ return;
160
+ }
161
+ let parsed;
162
+ try {
163
+ parsed = JSON.parse(line);
164
+ }
165
+ catch {
166
+ this.#socket.destroy(new Error("terminal host returned invalid JSON"));
167
+ return;
168
+ }
169
+ let response;
170
+ try {
171
+ response = parseNativeTerminalResponse(parsed);
172
+ }
173
+ catch (error) {
174
+ const detail = error instanceof Error ? error.message : String(error);
175
+ this.#fail(new Error(`terminal host returned an invalid response: ${detail}`));
176
+ this.#socket.destroy();
177
+ return;
178
+ }
179
+ const pending = this.#pending.get(response.id);
180
+ if (!pending)
181
+ continue;
182
+ this.#pending.delete(response.id);
183
+ clearTimeout(pending.timeout);
184
+ if (response.ok)
185
+ pending.resolve(response.result);
186
+ else
187
+ pending.reject(new NativeTerminalRemoteError(response.error));
188
+ }
189
+ if (Buffer.byteLength(this.#buffer) > NATIVE_TERMINAL_MAX_FRAME_BYTES) {
190
+ this.#socket.destroy(new Error("terminal host response exceeds the frame limit"));
191
+ }
192
+ }
193
+ #fail(error) {
194
+ if (!this.#closed)
195
+ this.#closed = true;
196
+ for (const pending of this.#pending.values()) {
197
+ clearTimeout(pending.timeout);
198
+ pending.reject(error);
199
+ }
200
+ this.#pending.clear();
201
+ }
202
+ }
203
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/native-terminal/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AAUzD,OAAO,EACL,0CAA0C,EAC1C,+BAA+B,EAC/B,gCAAgC,EAChC,yBAAyB,EACzB,2BAA2B,GAI5B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kCAAkC,EAClC,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAQ1B,MAAM,OAAO,oBAAoB;IACtB,OAAO,CAAS;IAChB,iBAAiB,CAAS;IAC1B,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAoB,MAAc,EAAE,gBAAwB;QAC1D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAClB,UAAkB,EAClB,UAGI,EAAE;QAEN,MAAM,QAAQ,GAAG,MAAM,kCAAkC,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC3D,MAAM,gBAAgB,GACpB,OAAO,CAAC,gBAAgB,IAAI,0CAA0C,CAAC;QACzE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;YAC3B,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;YACtC,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC9B,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC1D,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;gBACrC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC5C,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YACF,MAAM,SAAS,GAAG,GAAS,EAAE;gBAC3B,KAAK,kCAAkC,CAAC,UAAU,CAAC,CAAC,IAAI,CACtD,CAAC,SAAS,EAAE,EAAE;oBACZ,IAAI,OAAO;wBAAE,OAAO;oBACpB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;wBACnD,OAAO,GAAG,IAAI,CAAC;wBACf,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,CACJ,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAC3D,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACxC,OAAO,CAAC,IAAI,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBAC9D,CAAC,EACD,OAAO,CACR,CAAC;YACJ,CAAC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAgC,CAAC;IACpF,CAAC;IAED,MAAM,CAAC,OAAoC;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAwC,CAAC;IACjF,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAuD,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,EAAU;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAwC,CAAC;IAC/E,CAAC;IAED,UAAU,CAAC,EAAU,EAAE,QAAgB;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAkC,CAAC;IACzF,CAAC;IAED,cAAc,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,CAA8C,CAAC;IAC/F,CAAC;IAED,iBAAiB,CAAC,EAAU,EAAE,YAAoB;QAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,CAA2C,CAAC;IAC7G,CAAC;IAED,iBAAiB,CAAC,KAAoC;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAA2C,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAoC,EAAE,IAAY;QAC5D,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAoC,EAAE,IAAY,EAAE,IAAY;QAC3E,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,CACF,KAAoC,EACpC,MAAiC;QAEjC,OAAO,IAAI,CAAC,QAAQ,CAClB,MAAM,EACN,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CACd,CAAC;IAC3C,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,QAAQ,CACN,SAA6C,EAC7C,MAA0C,EAC1C,SAAS,GAAG,IAAI,CAAC,iBAAiB;QAElC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,UAAU,CAAC,+DAA+D,CAAC,CAChF,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,OAAO,GAA0B,MAAM,KAAK,SAAS;YACzD,CAAC,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,EAAE,EAAE,SAAS,EAAE;YAC9D,CAAC,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,+BAA+B,EAAE,CAAC;YAC/D,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAAE,OAAO;gBACtC,MAAM,CACJ,IAAI,KAAK,CACP,iBAAiB,SAAS,4BAA4B,SAAS,IAAI,CACpE,CACF,CAAC;YACJ,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClC,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACzB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;QACtB,SAAS,CAAC;YACR,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,+BAA+B,EAAE,CAAC;gBAC9D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YACD,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,IAAI,CAAC,KAAK,CACR,IAAI,KAAK,CAAC,+CAA+C,MAAM,EAAE,CAAC,CACnE,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,QAAQ,CAAC,EAAE;gBAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;gBAC7C,OAAO,CAAC,MAAM,CAAC,IAAI,yBAAyB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,+BAA+B,EAAE,CAAC;YACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAY;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,78 @@
1
+ import type { PtySpawner } from "../pty.js";
2
+ import { type TerminalOutputChunk, type TerminalReplayGap } from "./replay-buffer.js";
3
+ import { type NativeTerminalStopSignal } from "./protocol.js";
4
+ export type NativeTerminalExit = Readonly<{
5
+ exitCode: number;
6
+ signal?: number;
7
+ }>;
8
+ export type NativeTerminalSessionStatus = "running" | "stopping" | "exited";
9
+ export type NativeTerminalSessionState = Readonly<{
10
+ id: string;
11
+ generation: string;
12
+ incarnation: string;
13
+ pid: number;
14
+ status: NativeTerminalSessionStatus;
15
+ latestSeq: number;
16
+ exit: NativeTerminalExit | null;
17
+ stopSignal: string | null;
18
+ }>;
19
+ export type NativeTerminalReplay = Readonly<{
20
+ generation: string;
21
+ incarnation: string;
22
+ chunks: ReadonlyArray<TerminalOutputChunk>;
23
+ gap: TerminalReplayGap | null;
24
+ latestSeq: number;
25
+ }>;
26
+ export type NativeTerminalObserverAttachment = Readonly<{
27
+ role: "observer";
28
+ id: string;
29
+ generation: string;
30
+ incarnation: string;
31
+ controllerEpoch: number;
32
+ }>;
33
+ export type NativeTerminalControllerLease = Readonly<{
34
+ role: "controller";
35
+ id: string;
36
+ generation: string;
37
+ incarnation: string;
38
+ controllerId: string;
39
+ epoch: number;
40
+ }>;
41
+ export type NativeTerminalControllerState = Readonly<{
42
+ id: string;
43
+ generation: string;
44
+ incarnation: string;
45
+ controllerEpoch: number;
46
+ }>;
47
+ export type NativeTerminalCreateOptions = Readonly<{
48
+ id: string;
49
+ command: string;
50
+ args: ReadonlyArray<string>;
51
+ cwd: string;
52
+ env: Readonly<Record<string, string>>;
53
+ cols: number;
54
+ rows: number;
55
+ }>;
56
+ export declare class NativeTerminalHost {
57
+ #private;
58
+ constructor(options: {
59
+ generation: string;
60
+ replayBytesPerSession: number;
61
+ maxSessions?: number;
62
+ spawner: PtySpawner;
63
+ });
64
+ get generation(): string;
65
+ create(options: NativeTerminalCreateOptions): NativeTerminalSessionState;
66
+ list(): ReadonlyArray<NativeTerminalSessionState>;
67
+ state(id: string): NativeTerminalSessionState;
68
+ readOutput(id: string, afterSeq: number): NativeTerminalReplay;
69
+ attachObserver(id: string): NativeTerminalObserverAttachment;
70
+ acquireController(id: string, controllerId: string): NativeTerminalControllerLease;
71
+ releaseController(lease: NativeTerminalControllerLease): NativeTerminalControllerState;
72
+ write(lease: NativeTerminalControllerLease, data: string): void;
73
+ resize(lease: NativeTerminalControllerLease, cols: number, rows: number): void;
74
+ stop(lease: NativeTerminalControllerLease, signal?: NativeTerminalStopSignal): NativeTerminalSessionState;
75
+ stopAll(signal?: NativeTerminalStopSignal): ReadonlyArray<NativeTerminalSessionState>;
76
+ forceStopAll(signal?: NativeTerminalStopSignal): ReadonlyArray<NativeTerminalSessionState>;
77
+ }
78
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/native-terminal/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { TerminalReplayBuffer, } from "./replay-buffer.js";
3
+ import { NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS, NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS, NATIVE_TERMINAL_MAX_SESSIONS, } from "./protocol.js";
4
+ export class NativeTerminalHost {
5
+ #generation;
6
+ #replayBytesPerSession;
7
+ #maxSessions;
8
+ #spawner;
9
+ #sessions = new Map();
10
+ constructor(options) {
11
+ if (options.generation.trim().length === 0 ||
12
+ options.generation.length > NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS) {
13
+ throw new RangeError(`terminal host generation must contain 1-${NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS} characters`);
14
+ }
15
+ // Validate the budget once, before the first process is spawned.
16
+ new TerminalReplayBuffer(options.replayBytesPerSession);
17
+ const maxSessions = options.maxSessions ?? NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS;
18
+ if (!Number.isSafeInteger(maxSessions) ||
19
+ maxSessions <= 0 ||
20
+ maxSessions > NATIVE_TERMINAL_MAX_SESSIONS) {
21
+ throw new RangeError(`maxSessions must be between 1 and ${NATIVE_TERMINAL_MAX_SESSIONS}`);
22
+ }
23
+ this.#generation = options.generation;
24
+ this.#replayBytesPerSession = options.replayBytesPerSession;
25
+ this.#maxSessions = maxSessions;
26
+ this.#spawner = options.spawner;
27
+ }
28
+ get generation() {
29
+ return this.#generation;
30
+ }
31
+ create(options) {
32
+ if (options.id.trim().length === 0 ||
33
+ options.id.length > NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS) {
34
+ throw new RangeError(`terminal session id must contain 1-${NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS} characters`);
35
+ }
36
+ const existing = this.#sessions.get(options.id);
37
+ if (existing?.status === "exited") {
38
+ this.#forget(existing);
39
+ }
40
+ else if (existing) {
41
+ throw new Error(`terminal session already exists: ${options.id}`);
42
+ }
43
+ this.#reapExitedUntilBelowLimit();
44
+ if (this.#sessions.size >= this.#maxSessions) {
45
+ throw new Error(`terminal host session limit reached: ${this.#maxSessions}`);
46
+ }
47
+ const record = {
48
+ id: options.id,
49
+ incarnation: randomUUID(),
50
+ pty: this.#spawner(options),
51
+ replay: new TerminalReplayBuffer(this.#replayBytesPerSession),
52
+ status: "running",
53
+ exit: null,
54
+ stopSignal: null,
55
+ controllerId: null,
56
+ controllerEpoch: 0,
57
+ };
58
+ this.#sessions.set(record.id, record);
59
+ record.dataSubscription = record.pty.onData((data) => {
60
+ if (record.exit !== null || data.length === 0)
61
+ return;
62
+ record.replay.append(data);
63
+ });
64
+ record.exitSubscription = record.pty.onExit((event) => {
65
+ if (record.exit !== null)
66
+ return;
67
+ const exit = {
68
+ exitCode: event.exitCode,
69
+ };
70
+ if (event.signal !== undefined)
71
+ exit.signal = event.signal;
72
+ record.exit = Object.freeze(exit);
73
+ record.status = "exited";
74
+ this.#invalidateController(record);
75
+ record.dataSubscription?.dispose();
76
+ record.exitSubscription?.dispose();
77
+ });
78
+ return this.#snapshot(record);
79
+ }
80
+ list() {
81
+ return Object.freeze([...this.#sessions.values()].map((record) => this.#snapshot(record)));
82
+ }
83
+ state(id) {
84
+ return this.#snapshot(this.#requireSession(id));
85
+ }
86
+ readOutput(id, afterSeq) {
87
+ const record = this.#requireSession(id);
88
+ const replay = record.replay.readAfter(afterSeq);
89
+ return Object.freeze({
90
+ generation: this.#generation,
91
+ incarnation: record.incarnation,
92
+ ...replay,
93
+ });
94
+ }
95
+ attachObserver(id) {
96
+ const record = this.#requireSession(id);
97
+ return Object.freeze({
98
+ role: "observer",
99
+ id,
100
+ generation: this.#generation,
101
+ incarnation: record.incarnation,
102
+ controllerEpoch: record.controllerEpoch,
103
+ });
104
+ }
105
+ acquireController(id, controllerId) {
106
+ const record = this.#requireControllableSession(id);
107
+ if (controllerId.trim().length === 0 ||
108
+ controllerId.length > NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS) {
109
+ throw new RangeError(`terminal controller id must contain 1-${NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS} characters`);
110
+ }
111
+ if (record.controllerId !== null) {
112
+ throw new Error(`terminal session already has a controller: ${id}`);
113
+ }
114
+ record.controllerEpoch += 1;
115
+ record.controllerId = controllerId;
116
+ return Object.freeze({
117
+ role: "controller",
118
+ id,
119
+ generation: this.#generation,
120
+ incarnation: record.incarnation,
121
+ controllerId,
122
+ epoch: record.controllerEpoch,
123
+ });
124
+ }
125
+ releaseController(lease) {
126
+ const record = this.#requireMatchingController(lease);
127
+ this.#invalidateController(record);
128
+ return Object.freeze({
129
+ id: record.id,
130
+ generation: this.#generation,
131
+ incarnation: record.incarnation,
132
+ controllerEpoch: record.controllerEpoch,
133
+ });
134
+ }
135
+ write(lease, data) {
136
+ if (data.length === 0) {
137
+ throw new RangeError("terminal input must not be empty");
138
+ }
139
+ this.#requireController(lease).pty.write(data);
140
+ }
141
+ resize(lease, cols, rows) {
142
+ if (!Number.isSafeInteger(cols) ||
143
+ cols <= 0 ||
144
+ !Number.isSafeInteger(rows) ||
145
+ rows <= 0) {
146
+ throw new RangeError("terminal dimensions must be positive safe integers");
147
+ }
148
+ this.#requireController(lease).pty.resize(cols, rows);
149
+ }
150
+ stop(lease, signal = "SIGTERM") {
151
+ const record = this.#requireMatchingController(lease);
152
+ const previousStatus = record.status;
153
+ const previousSignal = record.stopSignal;
154
+ record.status = "stopping";
155
+ record.stopSignal = signal;
156
+ try {
157
+ record.pty.kill(signal);
158
+ }
159
+ catch (error) {
160
+ record.status = previousStatus;
161
+ record.stopSignal = previousSignal;
162
+ throw error;
163
+ }
164
+ return this.#snapshot(record);
165
+ }
166
+ stopAll(signal = "SIGTERM") {
167
+ for (const record of this.#sessions.values()) {
168
+ if (record.status !== "running")
169
+ continue;
170
+ record.status = "stopping";
171
+ record.stopSignal = signal;
172
+ this.#invalidateController(record);
173
+ try {
174
+ record.pty.kill(signal);
175
+ }
176
+ catch (error) {
177
+ record.status = "running";
178
+ record.stopSignal = null;
179
+ throw error;
180
+ }
181
+ }
182
+ return this.list();
183
+ }
184
+ forceStopAll(signal = "SIGKILL") {
185
+ const errors = [];
186
+ for (const record of this.#sessions.values()) {
187
+ if (record.status === "exited")
188
+ continue;
189
+ if (record.status === "running") {
190
+ record.status = "stopping";
191
+ this.#invalidateController(record);
192
+ }
193
+ record.stopSignal = signal;
194
+ try {
195
+ record.pty.kill(signal);
196
+ }
197
+ catch (error) {
198
+ errors.push(error);
199
+ }
200
+ }
201
+ if (errors.length > 0) {
202
+ throw new AggregateError(errors, "failed to force-stop one or more terminal sessions");
203
+ }
204
+ return this.list();
205
+ }
206
+ #requireSession(id) {
207
+ const record = this.#sessions.get(id);
208
+ if (!record)
209
+ throw new Error(`unknown terminal session: ${id}`);
210
+ return record;
211
+ }
212
+ #requireControllableSession(id) {
213
+ const record = this.#requireSession(id);
214
+ if (record.status === "exited") {
215
+ throw new Error(`terminal session is already exited: ${id}`);
216
+ }
217
+ return record;
218
+ }
219
+ #requireController(lease) {
220
+ const record = this.#requireMatchingController(lease);
221
+ if (record.status !== "running") {
222
+ throw new Error("stale terminal controller lease");
223
+ }
224
+ return record;
225
+ }
226
+ #requireMatchingController(lease) {
227
+ const record = this.#sessions.get(lease.id);
228
+ if (lease.generation !== this.#generation ||
229
+ !record ||
230
+ lease.incarnation !== record.incarnation ||
231
+ record.status === "exited" ||
232
+ record.controllerId !== lease.controllerId ||
233
+ record.controllerEpoch !== lease.epoch) {
234
+ throw new Error("stale terminal controller lease");
235
+ }
236
+ return record;
237
+ }
238
+ #reapExitedUntilBelowLimit() {
239
+ if (this.#sessions.size < this.#maxSessions)
240
+ return;
241
+ for (const record of this.#sessions.values()) {
242
+ if (record.status !== "exited")
243
+ continue;
244
+ this.#forget(record);
245
+ if (this.#sessions.size < this.#maxSessions)
246
+ return;
247
+ }
248
+ }
249
+ #forget(record) {
250
+ record.dataSubscription?.dispose();
251
+ record.exitSubscription?.dispose();
252
+ delete record.dataSubscription;
253
+ delete record.exitSubscription;
254
+ this.#sessions.delete(record.id);
255
+ }
256
+ #invalidateController(record) {
257
+ if (record.controllerId === null)
258
+ return;
259
+ record.controllerId = null;
260
+ record.controllerEpoch += 1;
261
+ }
262
+ #snapshot(record) {
263
+ return Object.freeze({
264
+ id: record.id,
265
+ generation: this.#generation,
266
+ incarnation: record.incarnation,
267
+ pid: record.pty.pid,
268
+ status: record.status,
269
+ latestSeq: record.replay.latestSeq,
270
+ exit: record.exit,
271
+ stopSignal: record.stopSignal,
272
+ });
273
+ }
274
+ }
275
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/native-terminal/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ type ProcessOptions = {
3
+ socketPath: string;
4
+ generation: string;
5
+ replayBytesPerSession: number;
6
+ maxSessions: number;
7
+ };
8
+ export declare function parseNativeTerminalHostArgs(argv: ReadonlyArray<string>): ProcessOptions;
9
+ export declare function runNativeTerminalHostProcess(argv: ReadonlyArray<string>): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/native-terminal/process.ts"],"names":[],"mappings":";AAYA,KAAK,cAAc,GAAG;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AA2CF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,cAAc,CAiCvF;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD7F"}