@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,137 @@
1
+ #!/usr/bin/env node
2
+ import { randomUUID } from "node:crypto";
3
+ import { NativeTerminalHost } from "./host.js";
4
+ import { nodePtySpawner } from "../pty.js";
5
+ import { NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS, NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION, NATIVE_TERMINAL_MAX_SESSIONS, } from "./protocol.js";
6
+ import { startNativeTerminalHostServer } from "./server.js";
7
+ const GRACEFUL_DRAIN_MS = 500;
8
+ const FORCED_DRAIN_MS = 500;
9
+ function delay(milliseconds) {
10
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
11
+ }
12
+ async function waitForTerminalDrain(host, timeoutMs) {
13
+ const deadline = Date.now() + timeoutMs;
14
+ while (host.list().some((session) => session.status !== "exited")) {
15
+ if (Date.now() >= deadline)
16
+ return false;
17
+ await delay(25);
18
+ }
19
+ return true;
20
+ }
21
+ function parsePositiveInteger(raw, label) {
22
+ const value = Number(raw);
23
+ if (!Number.isSafeInteger(value) || value <= 0) {
24
+ throw new Error(`${label} must be a positive safe integer`);
25
+ }
26
+ if (value > NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION) {
27
+ throw new Error(`${label} must not exceed ${NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION}`);
28
+ }
29
+ return value;
30
+ }
31
+ function parseMaxSessions(raw) {
32
+ const value = Number(raw);
33
+ if (!Number.isSafeInteger(value) ||
34
+ value <= 0 ||
35
+ value > NATIVE_TERMINAL_MAX_SESSIONS) {
36
+ throw new Error(`--max-sessions must be between 1 and ${NATIVE_TERMINAL_MAX_SESSIONS}`);
37
+ }
38
+ return value;
39
+ }
40
+ export function parseNativeTerminalHostArgs(argv) {
41
+ let socketPath;
42
+ let generation = randomUUID();
43
+ let replayBytesPerSession = 4 * 1024 * 1024;
44
+ let maxSessions = NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS;
45
+ for (let index = 2; index < argv.length; index += 1) {
46
+ const flag = argv[index];
47
+ const value = argv[index + 1];
48
+ switch (flag) {
49
+ case "--socket":
50
+ if (!value)
51
+ throw new Error("--socket requires a path");
52
+ socketPath = value;
53
+ index += 1;
54
+ break;
55
+ case "--generation":
56
+ if (!value)
57
+ throw new Error("--generation requires a value");
58
+ generation = value;
59
+ index += 1;
60
+ break;
61
+ case "--replay-bytes":
62
+ replayBytesPerSession = parsePositiveInteger(value, "--replay-bytes");
63
+ index += 1;
64
+ break;
65
+ case "--max-sessions":
66
+ maxSessions = parseMaxSessions(value);
67
+ index += 1;
68
+ break;
69
+ default:
70
+ throw new Error(`unknown native terminal host argument: ${flag ?? "<missing>"}`);
71
+ }
72
+ }
73
+ if (!socketPath)
74
+ throw new Error("--socket is required");
75
+ return { socketPath, generation, replayBytesPerSession, maxSessions };
76
+ }
77
+ export async function runNativeTerminalHostProcess(argv) {
78
+ const options = parseNativeTerminalHostArgs(argv);
79
+ const host = new NativeTerminalHost({
80
+ generation: options.generation,
81
+ replayBytesPerSession: options.replayBytesPerSession,
82
+ maxSessions: options.maxSessions,
83
+ spawner: nodePtySpawner,
84
+ });
85
+ const server = await startNativeTerminalHostServer({ socketPath: options.socketPath, host });
86
+ process.stdout.write(`${JSON.stringify({
87
+ kind: "h2a.native-terminal.ready",
88
+ version: 1,
89
+ generation: host.generation,
90
+ pid: process.pid,
91
+ socketPath: server.socketPath,
92
+ })}\n`);
93
+ let shutdown;
94
+ const stop = (signal) => {
95
+ shutdown ??= (async () => {
96
+ let gracefulError;
97
+ try {
98
+ await server.close({ stopSessions: true, signal: "SIGTERM" });
99
+ }
100
+ catch (error) {
101
+ gracefulError = error;
102
+ }
103
+ if (!await waitForTerminalDrain(host, GRACEFUL_DRAIN_MS)) {
104
+ try {
105
+ host.forceStopAll("SIGKILL");
106
+ }
107
+ catch {
108
+ // The post-kill drain check below is authoritative: a raced exit may
109
+ // make node-pty report an error even though no terminal remains.
110
+ }
111
+ if (!await waitForTerminalDrain(host, FORCED_DRAIN_MS)) {
112
+ throw new Error("terminal sessions did not exit after forced shutdown");
113
+ }
114
+ }
115
+ if (gracefulError !== undefined)
116
+ throw gracefulError;
117
+ })();
118
+ void shutdown.then(() => { process.exitCode = 0; }, (error) => {
119
+ process.stderr.write(`[h2a-pty-host] shutdown failed after ${signal}: ${String(error)}\n`);
120
+ process.exitCode = 1;
121
+ });
122
+ };
123
+ process.once("SIGINT", () => stop("SIGINT"));
124
+ process.once("SIGTERM", () => stop("SIGTERM"));
125
+ process.once("SIGHUP", () => stop("SIGHUP"));
126
+ }
127
+ function isEntryPoint() {
128
+ const argv1 = process.argv[1];
129
+ return argv1 !== undefined && import.meta.url === new URL(`file://${argv1}`).href;
130
+ }
131
+ if (isEntryPoint()) {
132
+ runNativeTerminalHostProcess(process.argv).catch((error) => {
133
+ process.stderr.write(`[h2a-pty-host] fatal: ${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
134
+ process.exitCode = 1;
135
+ });
136
+ }
137
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/native-terminal/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { NativeTerminalControllerLease, NativeTerminalCreateOptions } from "./host.js";
2
+ export declare const NATIVE_TERMINAL_PROTOCOL_VERSION: 1;
3
+ export declare const NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION: number;
4
+ export declare const NATIVE_TERMINAL_MAX_FRAME_BYTES: number;
5
+ export declare const NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS = 32;
6
+ export declare const NATIVE_TERMINAL_MAX_SESSIONS = 256;
7
+ export declare const NATIVE_TERMINAL_DEFAULT_REQUEST_TIMEOUT_MS = 5000;
8
+ export declare const NATIVE_TERMINAL_HEALTH_TIMEOUT_MS = 1000;
9
+ export declare const NATIVE_TERMINAL_MAX_ERROR_MESSAGE_CHARS = 1024;
10
+ export declare const NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS = 128;
11
+ export declare const NATIVE_TERMINAL_MAX_CONNECTIONS = 64;
12
+ export declare const NATIVE_TERMINAL_MAX_PENDING_RESPONSES_PER_CONNECTION = 64;
13
+ export declare const NATIVE_TERMINAL_MAX_PENDING_RESPONSE_BYTES_PER_CONNECTION: number;
14
+ export declare const NATIVE_TERMINAL_MAX_PENDING_RESPONSE_BYTES_TOTAL: number;
15
+ export declare const NATIVE_TERMINAL_STOP_SIGNALS: readonly ["SIGHUP", "SIGINT", "SIGTERM", "SIGKILL"];
16
+ export type NativeTerminalStopSignal = (typeof NATIVE_TERMINAL_STOP_SIGNALS)[number];
17
+ export declare function isNativeTerminalStopSignal(value: unknown): value is NativeTerminalStopSignal;
18
+ export type NativeTerminalOperation = "ping" | "create" | "list" | "state" | "read-output" | "attach-observer" | "acquire-controller" | "release-controller" | "write" | "resize" | "stop";
19
+ export type NativeTerminalRequest = Readonly<{
20
+ version: typeof NATIVE_TERMINAL_PROTOCOL_VERSION;
21
+ id: string;
22
+ operation: NativeTerminalOperation;
23
+ params?: Readonly<Record<string, unknown>>;
24
+ }>;
25
+ export type NativeTerminalSuccessResponse = Readonly<{
26
+ version: typeof NATIVE_TERMINAL_PROTOCOL_VERSION;
27
+ id: string;
28
+ ok: true;
29
+ result: unknown;
30
+ }>;
31
+ export type NativeTerminalErrorResponse = Readonly<{
32
+ version: typeof NATIVE_TERMINAL_PROTOCOL_VERSION;
33
+ id: string;
34
+ ok: false;
35
+ error: Readonly<{
36
+ code: "invalid-request" | "operation-failed";
37
+ message: string;
38
+ }>;
39
+ }>;
40
+ export type NativeTerminalResponse = NativeTerminalSuccessResponse | NativeTerminalErrorResponse;
41
+ export type NativeTerminalPing = Readonly<{
42
+ generation: string;
43
+ hostPid: number;
44
+ protocolVersion: typeof NATIVE_TERMINAL_PROTOCOL_VERSION;
45
+ }>;
46
+ export type NativeTerminalCreateParams = NativeTerminalCreateOptions;
47
+ export type NativeTerminalLeaseParams = Readonly<{
48
+ lease: NativeTerminalControllerLease;
49
+ }>;
50
+ export declare class NativeTerminalRemoteError extends Error {
51
+ readonly code: NativeTerminalErrorResponse["error"]["code"];
52
+ constructor(error: NativeTerminalErrorResponse["error"]);
53
+ }
54
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
55
+ export declare function parseNativeTerminalResponse(value: unknown): NativeTerminalResponse;
56
+ export declare function parseNativeTerminalRequest(value: unknown): NativeTerminalRequest;
57
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/native-terminal/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ export const NATIVE_TERMINAL_PROTOCOL_VERSION = 1;
2
+ export const NATIVE_TERMINAL_MAX_REPLAY_BYTES_PER_SESSION = 4 * 1024 * 1024;
3
+ // JSON escaping can expand one replay byte to six wire bytes (for example NUL).
4
+ export const NATIVE_TERMINAL_MAX_FRAME_BYTES = 32 * 1024 * 1024;
5
+ export const NATIVE_TERMINAL_DEFAULT_MAX_SESSIONS = 32;
6
+ export const NATIVE_TERMINAL_MAX_SESSIONS = 256;
7
+ export const NATIVE_TERMINAL_DEFAULT_REQUEST_TIMEOUT_MS = 5_000;
8
+ export const NATIVE_TERMINAL_HEALTH_TIMEOUT_MS = 1_000;
9
+ export const NATIVE_TERMINAL_MAX_ERROR_MESSAGE_CHARS = 1_024;
10
+ export const NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS = 128;
11
+ export const NATIVE_TERMINAL_MAX_CONNECTIONS = 64;
12
+ export const NATIVE_TERMINAL_MAX_PENDING_RESPONSES_PER_CONNECTION = 64;
13
+ export const NATIVE_TERMINAL_MAX_PENDING_RESPONSE_BYTES_PER_CONNECTION = NATIVE_TERMINAL_MAX_FRAME_BYTES;
14
+ export const NATIVE_TERMINAL_MAX_PENDING_RESPONSE_BYTES_TOTAL = 2 * NATIVE_TERMINAL_MAX_FRAME_BYTES;
15
+ export const NATIVE_TERMINAL_STOP_SIGNALS = [
16
+ "SIGHUP",
17
+ "SIGINT",
18
+ "SIGTERM",
19
+ "SIGKILL",
20
+ ];
21
+ export function isNativeTerminalStopSignal(value) {
22
+ return (typeof value === "string" &&
23
+ NATIVE_TERMINAL_STOP_SIGNALS.includes(value));
24
+ }
25
+ export class NativeTerminalRemoteError extends Error {
26
+ code;
27
+ constructor(error) {
28
+ super(error.message);
29
+ this.name = "NativeTerminalRemoteError";
30
+ this.code = error.code;
31
+ }
32
+ }
33
+ export function isRecord(value) {
34
+ return typeof value === "object" && value !== null && !Array.isArray(value);
35
+ }
36
+ export function parseNativeTerminalResponse(value) {
37
+ if (!isRecord(value))
38
+ throw new TypeError("response must be an object");
39
+ if (value.version !== NATIVE_TERMINAL_PROTOCOL_VERSION) {
40
+ throw new TypeError("unsupported terminal protocol version");
41
+ }
42
+ if (typeof value.id !== "string" ||
43
+ value.id.length === 0 ||
44
+ value.id.length > NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS) {
45
+ throw new TypeError(`response id must be a non-empty string of at most ${NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS} characters`);
46
+ }
47
+ if (value.ok === true) {
48
+ if (!Object.prototype.hasOwnProperty.call(value, "result")) {
49
+ throw new TypeError("successful response must include a result");
50
+ }
51
+ return value;
52
+ }
53
+ if (value.ok !== false) {
54
+ throw new TypeError("response ok must be a boolean");
55
+ }
56
+ if (!isRecord(value.error)) {
57
+ throw new TypeError("error response must include an error object");
58
+ }
59
+ if (value.error.code !== "invalid-request" &&
60
+ value.error.code !== "operation-failed") {
61
+ throw new TypeError("terminal response error code is invalid");
62
+ }
63
+ if (typeof value.error.message !== "string" ||
64
+ value.error.message.length === 0 ||
65
+ value.error.message.length > NATIVE_TERMINAL_MAX_ERROR_MESSAGE_CHARS) {
66
+ throw new TypeError(`terminal response error message must contain 1-${NATIVE_TERMINAL_MAX_ERROR_MESSAGE_CHARS} characters`);
67
+ }
68
+ return value;
69
+ }
70
+ export function parseNativeTerminalRequest(value) {
71
+ if (!isRecord(value))
72
+ throw new TypeError("request must be an object");
73
+ if (value.version !== NATIVE_TERMINAL_PROTOCOL_VERSION) {
74
+ throw new TypeError("unsupported terminal protocol version");
75
+ }
76
+ if (typeof value.id !== "string" ||
77
+ value.id.length === 0 ||
78
+ value.id.length > NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS) {
79
+ throw new TypeError(`request id must be a non-empty string of at most ${NATIVE_TERMINAL_MAX_IDENTIFIER_CHARS} characters`);
80
+ }
81
+ const operations = new Set([
82
+ "ping",
83
+ "create",
84
+ "list",
85
+ "state",
86
+ "read-output",
87
+ "attach-observer",
88
+ "acquire-controller",
89
+ "release-controller",
90
+ "write",
91
+ "resize",
92
+ "stop",
93
+ ]);
94
+ if (typeof value.operation !== "string" || !operations.has(value.operation)) {
95
+ throw new TypeError("unknown terminal operation");
96
+ }
97
+ if (value.params !== undefined && !isRecord(value.params)) {
98
+ throw new TypeError("request params must be an object");
99
+ }
100
+ return value;
101
+ }
102
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/native-terminal/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type TerminalOutputChunk = Readonly<{
2
+ seq: number;
3
+ data: string;
4
+ }>;
5
+ export type TerminalReplayGap = Readonly<{
6
+ fromSeq: number;
7
+ toSeq: number;
8
+ }>;
9
+ export type TerminalReplay = Readonly<{
10
+ chunks: ReadonlyArray<TerminalOutputChunk>;
11
+ gap: TerminalReplayGap | null;
12
+ latestSeq: number;
13
+ }>;
14
+ export declare const NATIVE_TERMINAL_MAX_REPLAY_CHUNKS_PER_SESSION = 65536;
15
+ export declare const NATIVE_TERMINAL_MAX_REPLAY_WIRE_BYTES_PER_SESSION: number;
16
+ export declare class TerminalReplayBuffer {
17
+ #private;
18
+ constructor(maxBytes: number, limits?: {
19
+ maxChunks?: number;
20
+ maxWireBytes?: number;
21
+ });
22
+ get latestSeq(): number;
23
+ append(data: string): TerminalOutputChunk;
24
+ readAfter(afterSeq: number): TerminalReplay;
25
+ }
26
+ //# sourceMappingURL=replay-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-buffer.d.ts","sourceRoot":"","sources":["../../src/native-terminal/replay-buffer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3C,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAQH,eAAO,MAAM,6CAA6C,QAAS,CAAC;AAGpE,eAAO,MAAM,iDAAiD,QAC5C,CAAC;AAEnB,qBAAa,oBAAoB;;gBAW7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO;IAqB5D,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAkCzC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;CAuB5C"}
@@ -0,0 +1,84 @@
1
+ export const NATIVE_TERMINAL_MAX_REPLAY_CHUNKS_PER_SESSION = 65_536;
2
+ // Leaves 8 MiB of the 32 MiB protocol frame for the response envelope and
3
+ // bounded identities, while charging the actual JSON-escaped chunk encoding.
4
+ export const NATIVE_TERMINAL_MAX_REPLAY_WIRE_BYTES_PER_SESSION = 24 * 1024 * 1024;
5
+ export class TerminalReplayBuffer {
6
+ #maxBytes;
7
+ #maxChunks;
8
+ #maxWireBytes;
9
+ #chunks = [];
10
+ #head = 0;
11
+ #bytes = 0;
12
+ #wireBytes = 0;
13
+ #latestSeq = 0;
14
+ constructor(maxBytes, limits = {}) {
15
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
16
+ throw new RangeError("maxBytes must be a positive safe integer");
17
+ }
18
+ const maxChunks = limits.maxChunks ?? NATIVE_TERMINAL_MAX_REPLAY_CHUNKS_PER_SESSION;
19
+ const maxWireBytes = limits.maxWireBytes ??
20
+ NATIVE_TERMINAL_MAX_REPLAY_WIRE_BYTES_PER_SESSION;
21
+ if (!Number.isSafeInteger(maxChunks) || maxChunks <= 0) {
22
+ throw new RangeError("maxChunks must be a positive safe integer");
23
+ }
24
+ if (!Number.isSafeInteger(maxWireBytes) || maxWireBytes <= 0) {
25
+ throw new RangeError("maxWireBytes must be a positive safe integer");
26
+ }
27
+ this.#maxBytes = maxBytes;
28
+ this.#maxChunks = maxChunks;
29
+ this.#maxWireBytes = maxWireBytes;
30
+ }
31
+ get latestSeq() {
32
+ return this.#latestSeq;
33
+ }
34
+ append(data) {
35
+ if (data.length === 0) {
36
+ throw new RangeError("terminal output chunks must not be empty");
37
+ }
38
+ const chunk = Object.freeze({ seq: ++this.#latestSeq, data });
39
+ const entry = Object.freeze({
40
+ chunk,
41
+ bytes: Buffer.byteLength(data, "utf8"),
42
+ // One byte reserves either the array comma or a conservative bracket.
43
+ wireBytes: Buffer.byteLength(JSON.stringify(chunk), "utf8") + 1,
44
+ });
45
+ this.#chunks.push(entry);
46
+ this.#bytes += entry.bytes;
47
+ this.#wireBytes += entry.wireBytes;
48
+ while ((this.#bytes > this.#maxBytes ||
49
+ this.#wireBytes > this.#maxWireBytes ||
50
+ this.#chunks.length - this.#head > this.#maxChunks) &&
51
+ this.#head < this.#chunks.length) {
52
+ const evicted = this.#chunks[this.#head++];
53
+ if (evicted) {
54
+ this.#bytes -= evicted.bytes;
55
+ this.#wireBytes -= evicted.wireBytes;
56
+ }
57
+ }
58
+ if (this.#head >= 1_024 && this.#head * 2 >= this.#chunks.length) {
59
+ this.#chunks.splice(0, this.#head);
60
+ this.#head = 0;
61
+ }
62
+ return chunk;
63
+ }
64
+ readAfter(afterSeq) {
65
+ if (!Number.isSafeInteger(afterSeq) ||
66
+ afterSeq < 0 ||
67
+ afterSeq > this.#latestSeq) {
68
+ throw new RangeError("afterSeq must identify this buffer's history");
69
+ }
70
+ const oldestAvailable = this.#chunks[this.#head]?.chunk.seq ?? this.#latestSeq + 1;
71
+ const gap = afterSeq < oldestAvailable - 1
72
+ ? Object.freeze({ fromSeq: afterSeq + 1, toSeq: oldestAvailable - 1 })
73
+ : null;
74
+ return Object.freeze({
75
+ chunks: this.#chunks
76
+ .slice(this.#head)
77
+ .filter(({ chunk }) => chunk.seq > afterSeq)
78
+ .map(({ chunk }) => chunk),
79
+ gap,
80
+ latestSeq: this.#latestSeq,
81
+ });
82
+ }
83
+ }
84
+ //# sourceMappingURL=replay-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-buffer.js","sourceRoot":"","sources":["../../src/native-terminal/replay-buffer.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,6CAA6C,GAAG,MAAM,CAAC;AACpE,0EAA0E;AAC1E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iDAAiD,GAC5D,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnB,MAAM,OAAO,oBAAoB;IACtB,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,aAAa,CAAS;IACtB,OAAO,GAAoB,EAAE,CAAC;IACvC,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,CAAC,CAAC;IACX,UAAU,GAAG,CAAC,CAAC;IACf,UAAU,GAAG,CAAC,CAAC;IAEf,YACE,QAAgB,EAChB,SAAwD,EAAE;QAE1D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,IAAI,6CAA6C,CAAC;QACpE,MAAM,YAAY,GAChB,MAAM,CAAC,YAAY;YACnB,iDAAiD,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACpC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAAC,0CAA0C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1B,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;YACtC,sEAAsE;YACtE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;SAChE,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC;QAEnC,OACE,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa;YACpC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;YACrD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAChC,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;gBAC7B,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/B,QAAQ,GAAG,CAAC;YACZ,QAAQ,GAAG,IAAI,CAAC,UAAU,EAC1B,CAAC;YACD,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,eAAe,GACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC7D,MAAM,GAAG,GACP,QAAQ,GAAG,eAAe,GAAG,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC;YACtE,CAAC,CAAC,IAAI,CAAC;QACX,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,OAAO;iBACjB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;iBACjB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC;iBAC3C,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;YAC5B,GAAG;YACH,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { NativeTerminalHost } from "./host.js";
2
+ export type NativeTerminalHostServer = Readonly<{
3
+ socketPath: string;
4
+ close(options?: {
5
+ stopSessions?: boolean;
6
+ signal?: string;
7
+ }): Promise<void>;
8
+ }>;
9
+ export declare function startNativeTerminalHostServer(options: {
10
+ socketPath: string;
11
+ host: NativeTerminalHost;
12
+ }): Promise<NativeTerminalHostServer>;
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/native-terminal/server.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAGnB,MAAM,WAAW,CAAC;AAwhBnB,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E,CAAC,CAAC;AAEH,wBAAsB,6BAA6B,CAAC,OAAO,EAAE;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,kBAAkB,CAAC;CAC1B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAuGpC"}