@sentropic/h2a-runtime 0.91.0 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/config.d.ts +2 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +16 -3
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +79 -58
  8. package/dist/index.js.map +1 -1
  9. package/dist/llm-gateway-runtime/index.d.ts +6 -0
  10. package/dist/llm-gateway-runtime/index.d.ts.map +1 -1
  11. package/dist/llm-gateway-runtime/index.js +134 -60
  12. package/dist/llm-gateway-runtime/index.js.map +1 -1
  13. package/dist/llm-gateway-runtime/session-ledger.d.ts +38 -55
  14. package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -1
  15. package/dist/llm-gateway-runtime/session-ledger.js +102 -250
  16. package/dist/llm-gateway-runtime/session-ledger.js.map +1 -1
  17. package/dist/llm-gateway-runtime/sticky.d.ts +25 -52
  18. package/dist/llm-gateway-runtime/sticky.d.ts.map +1 -1
  19. package/dist/llm-gateway-runtime/sticky.js +36 -605
  20. package/dist/llm-gateway-runtime/sticky.js.map +1 -1
  21. package/dist/llm-mesh.d.ts +19 -72
  22. package/dist/llm-mesh.d.ts.map +1 -1
  23. package/dist/llm-mesh.js +42 -399
  24. package/dist/llm-mesh.js.map +1 -1
  25. package/dist/llm-routing-config.d.ts +28 -0
  26. package/dist/llm-routing-config.d.ts.map +1 -0
  27. package/dist/llm-routing-config.js +100 -0
  28. package/dist/llm-routing-config.js.map +1 -0
  29. package/dist/native-terminal/client.d.ts +23 -0
  30. package/dist/native-terminal/client.d.ts.map +1 -0
  31. package/dist/native-terminal/client.js +203 -0
  32. package/dist/native-terminal/client.js.map +1 -0
  33. package/dist/native-terminal/host.d.ts +78 -0
  34. package/dist/native-terminal/host.d.ts.map +1 -0
  35. package/dist/native-terminal/host.js +275 -0
  36. package/dist/native-terminal/host.js.map +1 -0
  37. package/dist/native-terminal/process.d.ts +11 -0
  38. package/dist/native-terminal/process.d.ts.map +1 -0
  39. package/dist/native-terminal/process.js +137 -0
  40. package/dist/native-terminal/process.js.map +1 -0
  41. package/dist/native-terminal/protocol.d.ts +57 -0
  42. package/dist/native-terminal/protocol.d.ts.map +1 -0
  43. package/dist/native-terminal/protocol.js +102 -0
  44. package/dist/native-terminal/protocol.js.map +1 -0
  45. package/dist/native-terminal/replay-buffer.d.ts +26 -0
  46. package/dist/native-terminal/replay-buffer.d.ts.map +1 -0
  47. package/dist/native-terminal/replay-buffer.js +84 -0
  48. package/dist/native-terminal/replay-buffer.js.map +1 -0
  49. package/dist/native-terminal/server.d.ts +13 -0
  50. package/dist/native-terminal/server.d.ts.map +1 -0
  51. package/dist/native-terminal/server.js +555 -0
  52. package/dist/native-terminal/server.js.map +1 -0
  53. package/dist/native-terminal/socket-path.d.ts +8 -0
  54. package/dist/native-terminal/socket-path.d.ts.map +1 -0
  55. package/dist/native-terminal/socket-path.js +41 -0
  56. package/dist/native-terminal/socket-path.js.map +1 -0
  57. package/dist/native-terminal/supervisor.d.ts +26 -0
  58. package/dist/native-terminal/supervisor.d.ts.map +1 -0
  59. package/dist/native-terminal/supervisor.js +273 -0
  60. package/dist/native-terminal/supervisor.js.map +1 -0
  61. package/dist/pty.d.ts +1 -0
  62. package/dist/pty.d.ts.map +1 -1
  63. package/dist/pty.js +78 -2
  64. package/dist/pty.js.map +1 -1
  65. package/dist/registry.d.ts +7 -0
  66. package/dist/registry.d.ts.map +1 -1
  67. package/dist/registry.js +37 -1
  68. package/dist/registry.js.map +1 -1
  69. package/dist/status-projection.d.ts.map +1 -1
  70. package/dist/tmux.d.ts +7 -5
  71. package/dist/tmux.d.ts.map +1 -1
  72. package/dist/tmux.js +33 -7
  73. package/dist/tmux.js.map +1 -1
  74. package/package.json +3 -3
  75. package/dist/llm-gateway-runtime/accounts.d.ts +0 -62
  76. package/dist/llm-gateway-runtime/accounts.d.ts.map +0 -1
  77. package/dist/llm-gateway-runtime/accounts.js +0 -323
  78. package/dist/llm-gateway-runtime/accounts.js.map +0 -1
  79. package/dist/llm-gateway-runtime/model-catalog.d.ts +0 -44
  80. package/dist/llm-gateway-runtime/model-catalog.d.ts.map +0 -1
  81. package/dist/llm-gateway-runtime/model-catalog.js +0 -191
  82. package/dist/llm-gateway-runtime/model-catalog.js.map +0 -1
  83. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts +0 -3
  84. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +0 -1
  85. package/dist/llm-gateway-runtime/proxy-anthropic.js +0 -318
  86. package/dist/llm-gateway-runtime/proxy-anthropic.js.map +0 -1
  87. package/dist/llm-gateway-runtime/proxy-cloud-code.d.ts +0 -11
  88. package/dist/llm-gateway-runtime/proxy-cloud-code.d.ts.map +0 -1
  89. package/dist/llm-gateway-runtime/proxy-cloud-code.js +0 -215
  90. package/dist/llm-gateway-runtime/proxy-cloud-code.js.map +0 -1
  91. package/dist/llm-gateway-runtime/proxy-openai.d.ts +0 -118
  92. package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +0 -1
  93. package/dist/llm-gateway-runtime/proxy-openai.js +0 -1305
  94. package/dist/llm-gateway-runtime/proxy-openai.js.map +0 -1
@@ -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"}
@@ -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":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,oCAAoC,EACpC,4CAA4C,EAC5C,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAS5D,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAwB,EAAE,SAAiB;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC;QACzC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAuB,EAAE,KAAa;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,KAAK,GAAG,4CAA4C,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,4CAA4C,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAC5B,KAAK,IAAI,CAAC;QACV,KAAK,GAAG,4BAA4B,EACpC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wCAAwC,4BAA4B,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAA2B;IACrE,IAAI,UAA8B,CAAC;IACnC,IAAI,UAAU,GAAW,UAAU,EAAE,CAAC;IACtC,IAAI,qBAAqB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5C,IAAI,WAAW,GAAG,oCAAoC,CAAC;IACvD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU;gBACb,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBACxD,UAAU,GAAG,KAAK,CAAC;gBACnB,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC7D,UAAU,GAAG,KAAK,CAAC;gBACnB,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,gBAAgB;gBACnB,qBAAqB,GAAG,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;gBACtE,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR,KAAK,gBAAgB;gBACnB,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACtC,KAAK,IAAI,CAAC,CAAC;gBACX,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAA2B;IAC5E,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;QACpD,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACrC,IAAI,EAAE,2BAA2B;QACjC,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,IAAI,CAAC,CAAC;IAER,IAAI,QAAmC,CAAC;IACxC,MAAM,IAAI,GAAG,CAAC,MAAc,EAAQ,EAAE;QACpC,QAAQ,KAAK,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,aAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAChE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,GAAG,KAAK,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC;oBACH,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,qEAAqE;oBACrE,iEAAiE;gBACnE,CAAC;gBACD,IAAI,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;oBACvD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YACD,IAAI,aAAa,KAAK,SAAS;gBAAE,MAAM,aAAa,CAAC;QACvD,CAAC,CAAC,EAAE,CAAC;QACL,KAAK,QAAQ,CAAC,IAAI,CAChB,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAC/B,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,4BAA4B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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"}