@myrialabs/ptykit 0.0.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.
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/dist/client/fit.d.ts +29 -0
- package/dist/client/fit.d.ts.map +1 -0
- package/dist/client/fit.js +45 -0
- package/dist/client/fit.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/persistence.d.ts +15 -0
- package/dist/client/persistence.d.ts.map +1 -0
- package/dist/client/persistence.js +47 -0
- package/dist/client/persistence.js.map +1 -0
- package/dist/client/pty-kit-client.d.ts +122 -0
- package/dist/client/pty-kit-client.d.ts.map +1 -0
- package/dist/client/pty-kit-client.js +245 -0
- package/dist/client/pty-kit-client.js.map +1 -0
- package/dist/client/terminal.d.ts +77 -0
- package/dist/client/terminal.d.ts.map +1 -0
- package/dist/client/terminal.js +112 -0
- package/dist/client/terminal.js.map +1 -0
- package/dist/client/ws-core.d.ts +88 -0
- package/dist/client/ws-core.d.ts.map +1 -0
- package/dist/client/ws-core.js +324 -0
- package/dist/client/ws-core.js.map +1 -0
- package/dist/core/backend.d.ts +52 -0
- package/dist/core/backend.d.ts.map +1 -0
- package/dist/core/backend.js +11 -0
- package/dist/core/backend.js.map +1 -0
- package/dist/core/detect.d.ts +21 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +82 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/env.d.ts +30 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +68 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pty-kit.d.ts +90 -0
- package/dist/core/pty-kit.d.ts.map +1 -0
- package/dist/core/pty-kit.js +187 -0
- package/dist/core/pty-kit.js.map +1 -0
- package/dist/core/scrollback.d.ts +43 -0
- package/dist/core/scrollback.d.ts.map +1 -0
- package/dist/core/scrollback.js +79 -0
- package/dist/core/scrollback.js.map +1 -0
- package/dist/core/session.d.ts +100 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +264 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/shell.d.ts +24 -0
- package/dist/core/shell.d.ts.map +1 -0
- package/dist/core/shell.js +55 -0
- package/dist/core/shell.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/server/connection.d.ts +38 -0
- package/dist/server/connection.d.ts.map +1 -0
- package/dist/server/connection.js +67 -0
- package/dist/server/connection.js.map +1 -0
- package/dist/server/ids.d.ts +2 -0
- package/dist/server/ids.d.ts.map +1 -0
- package/dist/server/ids.js +7 -0
- package/dist/server/ids.js.map +1 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/pty-kit-server.d.ts +101 -0
- package/dist/server/pty-kit-server.d.ts.map +1 -0
- package/dist/server/pty-kit-server.js +361 -0
- package/dist/server/pty-kit-server.js.map +1 -0
- package/dist/server/transport-bun.d.ts +26 -0
- package/dist/server/transport-bun.d.ts.map +1 -0
- package/dist/server/transport-bun.js +79 -0
- package/dist/server/transport-bun.js.map +1 -0
- package/dist/server/transport-node.d.ts +20 -0
- package/dist/server/transport-node.d.ts.map +1 -0
- package/dist/server/transport-node.js +77 -0
- package/dist/server/transport-node.js.map +1 -0
- package/dist/shared/index.d.ts +260 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +85 -0
- package/dist/shared/index.js.map +1 -0
- package/package.json +108 -0
- package/src/client/svelte/PtyTerminal.svelte +146 -0
- package/src/client/svelte/index.d.ts +84 -0
- package/src/client/svelte/index.js +4 -0
- package/src/client/svelte/svelte-compile.test.ts +11 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient WebSocket client core — the battle-tested pieces of a production
|
|
3
|
+
* WebSocket client:
|
|
4
|
+
* - exponential backoff reconnect (default 1s→30s, max 5 attempts),
|
|
5
|
+
* - **heal-reconnect** for "open but dead" sockets (a stalled read forces one
|
|
6
|
+
* reconnect + retry before failing),
|
|
7
|
+
* - **idempotency-aware resend**: reads resend freely; mutations resend only if
|
|
8
|
+
* never actually delivered,
|
|
9
|
+
* - `onReconnect` fires BEFORE the queue flush so room re-subscription happens
|
|
10
|
+
* first,
|
|
11
|
+
* - connection status surfaced via `onStatus`.
|
|
12
|
+
*
|
|
13
|
+
* Text/JSON frames only (terminal I/O is text). The WebSocket implementation is
|
|
14
|
+
* injectable for testing.
|
|
15
|
+
*/
|
|
16
|
+
import { RPC_ACTIONS, } from '../shared/index.js';
|
|
17
|
+
const WS_OPEN = 1;
|
|
18
|
+
/** RPC actions that are safe to transparently re-send after a reconnect. */
|
|
19
|
+
const IDEMPOTENT_ACTIONS = new Set([
|
|
20
|
+
'create-session', // idempotent server-side (reuse by id)
|
|
21
|
+
'resize',
|
|
22
|
+
'reconnect',
|
|
23
|
+
'list-sessions',
|
|
24
|
+
'pty-status',
|
|
25
|
+
'stream-status',
|
|
26
|
+
'missed-output',
|
|
27
|
+
'check-shell',
|
|
28
|
+
]);
|
|
29
|
+
function isIdempotent(action) {
|
|
30
|
+
return IDEMPOTENT_ACTIONS.has(action);
|
|
31
|
+
}
|
|
32
|
+
export class WsCore {
|
|
33
|
+
ws = null;
|
|
34
|
+
url;
|
|
35
|
+
factory;
|
|
36
|
+
reconnectOpts;
|
|
37
|
+
requestTimeoutMs;
|
|
38
|
+
onStatus;
|
|
39
|
+
onReconnect;
|
|
40
|
+
reconnectAttempts = 0;
|
|
41
|
+
reconnectTimer = null;
|
|
42
|
+
isConnected = false;
|
|
43
|
+
shouldReconnect = true;
|
|
44
|
+
hasConnectedBefore = false;
|
|
45
|
+
healing = false;
|
|
46
|
+
listeners = new Map();
|
|
47
|
+
messageQueue = [];
|
|
48
|
+
pending = new Map();
|
|
49
|
+
constructor(options) {
|
|
50
|
+
this.url = options.url;
|
|
51
|
+
this.factory =
|
|
52
|
+
options.WebSocketImpl ?? ((url) => new WebSocket(url));
|
|
53
|
+
this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
|
|
54
|
+
this.onStatus = options.onStatus;
|
|
55
|
+
this.onReconnect = options.onReconnect;
|
|
56
|
+
this.reconnectOpts = {
|
|
57
|
+
enabled: options.reconnect?.enabled ?? true,
|
|
58
|
+
baseDelayMs: options.reconnect?.baseDelayMs ?? 1000,
|
|
59
|
+
maxDelayMs: options.reconnect?.maxDelayMs ?? 30_000,
|
|
60
|
+
maxAttempts: options.reconnect?.maxAttempts ?? 5,
|
|
61
|
+
};
|
|
62
|
+
this.connect();
|
|
63
|
+
}
|
|
64
|
+
connect() {
|
|
65
|
+
if (this.ws) {
|
|
66
|
+
try {
|
|
67
|
+
this.ws.onclose = null;
|
|
68
|
+
this.ws.onerror = null;
|
|
69
|
+
this.ws.onmessage = null;
|
|
70
|
+
this.ws.close();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
/* ignore stale socket */
|
|
74
|
+
}
|
|
75
|
+
this.ws = null;
|
|
76
|
+
}
|
|
77
|
+
const socket = this.factory(this.url);
|
|
78
|
+
this.ws = socket;
|
|
79
|
+
socket.onopen = () => {
|
|
80
|
+
this.isConnected = true;
|
|
81
|
+
this.reconnectAttempts = 0;
|
|
82
|
+
this.onStatus?.('connected', 0);
|
|
83
|
+
const isReconnect = this.hasConnectedBefore;
|
|
84
|
+
this.hasConnectedBefore = true;
|
|
85
|
+
if (isReconnect) {
|
|
86
|
+
try {
|
|
87
|
+
this.onReconnect?.();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* swallow consumer error */
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
this.healing = false;
|
|
94
|
+
// Flush fire-and-forget queue (drain locally so a re-queue can't spin).
|
|
95
|
+
const queued = this.messageQueue;
|
|
96
|
+
this.messageQueue = [];
|
|
97
|
+
for (const frame of queued)
|
|
98
|
+
this.sendRaw(frame);
|
|
99
|
+
// Resend in-flight RPCs the previous socket may have swallowed.
|
|
100
|
+
for (const entry of this.pending.values()) {
|
|
101
|
+
if (entry.sent && !isIdempotent(entry.action))
|
|
102
|
+
continue;
|
|
103
|
+
entry.sent = true;
|
|
104
|
+
this.sendRaw({ action: entry.action, payload: entry.payload });
|
|
105
|
+
entry.arm();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
socket.onmessage = (event) => {
|
|
109
|
+
let frame;
|
|
110
|
+
try {
|
|
111
|
+
frame = JSON.parse(String(event.data));
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (frame && typeof frame.action === 'string') {
|
|
117
|
+
this.dispatch(frame.action, frame.payload);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
socket.onerror = () => {
|
|
121
|
+
/* errors surface via onclose */
|
|
122
|
+
};
|
|
123
|
+
socket.onclose = () => {
|
|
124
|
+
this.isConnected = false;
|
|
125
|
+
this.ws = null;
|
|
126
|
+
if (this.shouldReconnect && this.reconnectOpts.enabled) {
|
|
127
|
+
this.onStatus?.('reconnecting', this.reconnectAttempts);
|
|
128
|
+
this.scheduleReconnect();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.onStatus?.('disconnected', this.reconnectAttempts);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
scheduleReconnect() {
|
|
136
|
+
if (this.reconnectOpts.maxAttempts > 0 &&
|
|
137
|
+
this.reconnectAttempts >= this.reconnectOpts.maxAttempts) {
|
|
138
|
+
this.onStatus?.('disconnected', this.reconnectAttempts);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.reconnectAttempts++;
|
|
142
|
+
const delay = Math.min(this.reconnectOpts.baseDelayMs * Math.pow(2, this.reconnectAttempts - 1), this.reconnectOpts.maxDelayMs);
|
|
143
|
+
this.onStatus?.('reconnecting', this.reconnectAttempts);
|
|
144
|
+
this.reconnectTimer = setTimeout(() => this.connect(), delay);
|
|
145
|
+
}
|
|
146
|
+
dispatch(action, payload) {
|
|
147
|
+
const callbacks = this.listeners.get(action);
|
|
148
|
+
if (!callbacks)
|
|
149
|
+
return;
|
|
150
|
+
for (const cb of callbacks) {
|
|
151
|
+
try {
|
|
152
|
+
cb(payload);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
/* swallow listener error */
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
isSocketOpen() {
|
|
160
|
+
return !!this.ws && this.ws.readyState === WS_OPEN;
|
|
161
|
+
}
|
|
162
|
+
sendRaw(frame) {
|
|
163
|
+
if (!this.isSocketOpen()) {
|
|
164
|
+
this.messageQueue.push(frame);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
this.ws.send(JSON.stringify(frame));
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
this.messageQueue.push(frame);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Fire-and-forget event to the server (queued if not connected). */
|
|
175
|
+
emit(action, payload) {
|
|
176
|
+
const frame = { action, payload };
|
|
177
|
+
if (this.isSocketOpen())
|
|
178
|
+
this.sendRaw(frame);
|
|
179
|
+
else
|
|
180
|
+
this.messageQueue.push(frame);
|
|
181
|
+
}
|
|
182
|
+
/** Subscribe to a server event. Returns an unsubscribe function. */
|
|
183
|
+
on(action, callback) {
|
|
184
|
+
let set = this.listeners.get(action);
|
|
185
|
+
if (!set) {
|
|
186
|
+
set = new Set();
|
|
187
|
+
this.listeners.set(action, set);
|
|
188
|
+
}
|
|
189
|
+
set.add(callback);
|
|
190
|
+
return () => {
|
|
191
|
+
const s = this.listeners.get(action);
|
|
192
|
+
if (s) {
|
|
193
|
+
s.delete(callback);
|
|
194
|
+
if (s.size === 0)
|
|
195
|
+
this.listeners.delete(action);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* RPC request/response. Resolves with the unwrapped `data` on success,
|
|
201
|
+
* rejects on error/timeout. Survives a transport hiccup (resend + heal).
|
|
202
|
+
*/
|
|
203
|
+
http(action, data = {}, timeout = this.requestTimeoutMs) {
|
|
204
|
+
if (!RPC_ACTIONS.includes(action)) {
|
|
205
|
+
return Promise.reject(new Error(`Unknown RPC action: ${action}`));
|
|
206
|
+
}
|
|
207
|
+
const requestId = `${action}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
208
|
+
const payload = { requestId, data };
|
|
209
|
+
const responseAction = `${action}:response`;
|
|
210
|
+
const idempotent = isIdempotent(action);
|
|
211
|
+
const MAX_HEAL = 2;
|
|
212
|
+
return new Promise((resolve, reject) => {
|
|
213
|
+
let unsub = null;
|
|
214
|
+
let timer = null;
|
|
215
|
+
const entry = {
|
|
216
|
+
action,
|
|
217
|
+
payload,
|
|
218
|
+
sent: false,
|
|
219
|
+
attempts: 0,
|
|
220
|
+
arm: () => {
|
|
221
|
+
if (timeout <= 0)
|
|
222
|
+
return;
|
|
223
|
+
if (timer)
|
|
224
|
+
clearTimeout(timer);
|
|
225
|
+
timer = setTimeout(onTimeout, timeout);
|
|
226
|
+
},
|
|
227
|
+
cleanup: () => {
|
|
228
|
+
unsub?.();
|
|
229
|
+
if (timer)
|
|
230
|
+
clearTimeout(timer);
|
|
231
|
+
timer = null;
|
|
232
|
+
this.pending.delete(requestId);
|
|
233
|
+
},
|
|
234
|
+
fail: (err) => {
|
|
235
|
+
entry.cleanup();
|
|
236
|
+
reject(err);
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
const onTimeout = () => {
|
|
240
|
+
if (idempotent && entry.attempts < MAX_HEAL) {
|
|
241
|
+
entry.attempts++;
|
|
242
|
+
entry.arm();
|
|
243
|
+
// Socket claims open but stalled → likely black-holed; force a
|
|
244
|
+
// reconnect (guarded). The onopen resend loop re-delivers this.
|
|
245
|
+
if (this.isSocketOpen() && !this.healing) {
|
|
246
|
+
this.healing = true;
|
|
247
|
+
this.reconnect();
|
|
248
|
+
}
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
entry.cleanup();
|
|
252
|
+
reject(new Error(`Request timeout: ${action} (${timeout}ms)`));
|
|
253
|
+
};
|
|
254
|
+
const handleResponse = (response) => {
|
|
255
|
+
if (response?.requestId !== requestId)
|
|
256
|
+
return;
|
|
257
|
+
entry.cleanup();
|
|
258
|
+
if (response.success)
|
|
259
|
+
resolve(response.data);
|
|
260
|
+
else
|
|
261
|
+
reject(new Error(response.error || 'Unknown error'));
|
|
262
|
+
};
|
|
263
|
+
unsub = this.on(responseAction, handleResponse);
|
|
264
|
+
this.pending.set(requestId, entry);
|
|
265
|
+
entry.arm();
|
|
266
|
+
if (this.isSocketOpen()) {
|
|
267
|
+
entry.sent = true;
|
|
268
|
+
this.sendRaw({ action, payload });
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
connected() {
|
|
273
|
+
return this.isConnected;
|
|
274
|
+
}
|
|
275
|
+
/** Force a reconnect, preserving listeners and the pending/queue state. */
|
|
276
|
+
reconnect() {
|
|
277
|
+
if (this.reconnectTimer) {
|
|
278
|
+
clearTimeout(this.reconnectTimer);
|
|
279
|
+
this.reconnectTimer = null;
|
|
280
|
+
}
|
|
281
|
+
if (this.ws) {
|
|
282
|
+
try {
|
|
283
|
+
this.ws.onclose = null;
|
|
284
|
+
this.ws.onerror = null;
|
|
285
|
+
this.ws.onmessage = null;
|
|
286
|
+
this.ws.close();
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
/* ignore */
|
|
290
|
+
}
|
|
291
|
+
this.ws = null;
|
|
292
|
+
}
|
|
293
|
+
this.isConnected = false;
|
|
294
|
+
this.shouldReconnect = true;
|
|
295
|
+
this.reconnectAttempts = 0;
|
|
296
|
+
this.connect();
|
|
297
|
+
}
|
|
298
|
+
/** Permanently disconnect and fail any in-flight requests. */
|
|
299
|
+
disconnect() {
|
|
300
|
+
this.shouldReconnect = false;
|
|
301
|
+
if (this.reconnectTimer) {
|
|
302
|
+
clearTimeout(this.reconnectTimer);
|
|
303
|
+
this.reconnectTimer = null;
|
|
304
|
+
}
|
|
305
|
+
if (this.ws) {
|
|
306
|
+
try {
|
|
307
|
+
this.ws.close();
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
/* ignore */
|
|
311
|
+
}
|
|
312
|
+
this.ws = null;
|
|
313
|
+
}
|
|
314
|
+
this.listeners.clear();
|
|
315
|
+
this.messageQueue = [];
|
|
316
|
+
this.isConnected = false;
|
|
317
|
+
for (const entry of [...this.pending.values()]) {
|
|
318
|
+
entry.fail(new Error('WebSocket disconnected'));
|
|
319
|
+
}
|
|
320
|
+
this.pending.clear();
|
|
321
|
+
this.onStatus?.('disconnected', this.reconnectAttempts);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=ws-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-core.js","sourceRoot":"","sources":["../../src/client/ws-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PTY backend abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Both supported backends — `bun-pty` (tested) and `node-pty` (experimental) —
|
|
5
|
+
* expose a near-identical `IPty` surface (`spawn(file, args, opts) → handle`
|
|
6
|
+
* with `onData`/`onExit`/`write`/`resize`/`kill`/`pid`/`cols`/`rows`). This
|
|
7
|
+
* interface is the thin common shape the rest of the core depends on, so the
|
|
8
|
+
* session engine never imports a backend directly.
|
|
9
|
+
*/
|
|
10
|
+
/** A disposable event subscription. */
|
|
11
|
+
export interface PtyDisposable {
|
|
12
|
+
dispose(): void;
|
|
13
|
+
}
|
|
14
|
+
/** PTY process exit event. */
|
|
15
|
+
export interface PtyExitEvent {
|
|
16
|
+
exitCode: number;
|
|
17
|
+
signal?: number | string;
|
|
18
|
+
}
|
|
19
|
+
/** Options for spawning a PTY. */
|
|
20
|
+
export interface PtySpawnOptions {
|
|
21
|
+
/** Terminal name set in the child env. Defaults to `xterm-256color`. */
|
|
22
|
+
name?: string;
|
|
23
|
+
cols: number;
|
|
24
|
+
rows: number;
|
|
25
|
+
cwd: string;
|
|
26
|
+
env: Record<string, string>;
|
|
27
|
+
}
|
|
28
|
+
/** A live PTY process handle, normalized across backends. */
|
|
29
|
+
export interface PtyProcessHandle {
|
|
30
|
+
readonly pid: number;
|
|
31
|
+
readonly cols: number;
|
|
32
|
+
readonly rows: number;
|
|
33
|
+
write(data: string): void;
|
|
34
|
+
resize(cols: number, rows: number): void;
|
|
35
|
+
kill(signal?: string): void;
|
|
36
|
+
onData(listener: (data: string) => void): PtyDisposable;
|
|
37
|
+
onExit(listener: (event: PtyExitEvent) => void): PtyDisposable;
|
|
38
|
+
}
|
|
39
|
+
/** Backend identifier. */
|
|
40
|
+
export type PtyBackendName = 'bun-pty' | 'node-pty';
|
|
41
|
+
/** A PTY backend: spawns processes and reports its support status. */
|
|
42
|
+
export interface PtyBackend {
|
|
43
|
+
readonly name: PtyBackendName;
|
|
44
|
+
/**
|
|
45
|
+
* `true` while the backend has not yet been gated to "supported" by the
|
|
46
|
+
* scale and auto-detect benchmarks. `node-pty` is experimental; `bun-pty` is
|
|
47
|
+
* the tested path.
|
|
48
|
+
*/
|
|
49
|
+
readonly experimental: boolean;
|
|
50
|
+
spawn(file: string, args: string[], options: PtySpawnOptions): PtyProcessHandle;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/core/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC7B,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC/B,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B;AAED,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,aAAa,CAAC;IACxD,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,aAAa,CAAC;CAC/D;AAED,0BAA0B;AAC1B,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpD,sEAAsE;AACtE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,gBAAgB,CAAC;CAChF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PTY backend abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Both supported backends — `bun-pty` (tested) and `node-pty` (experimental) —
|
|
5
|
+
* expose a near-identical `IPty` surface (`spawn(file, args, opts) → handle`
|
|
6
|
+
* with `onData`/`onExit`/`write`/`resize`/`kill`/`pid`/`cols`/`rows`). This
|
|
7
|
+
* interface is the thin common shape the rest of the core depends on, so the
|
|
8
|
+
* session engine never imports a backend directly.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/core/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection + lazy backend loading.
|
|
3
|
+
*
|
|
4
|
+
* The PTY backend is an OPTIONAL dependency resolved at runtime via dynamic
|
|
5
|
+
* `import()`: `bun-pty` under Bun (tested), `node-pty` under Node (experimental).
|
|
6
|
+
* Importing lazily means a Node consumer never builds `bun-pty` (rust/ffi) and a
|
|
7
|
+
* Bun consumer never builds `node-pty`.
|
|
8
|
+
*/
|
|
9
|
+
import type { PtyBackend, PtyBackendName } from './backend.js';
|
|
10
|
+
/** True when running under Bun. */
|
|
11
|
+
export declare function isBun(): boolean;
|
|
12
|
+
/** The backend that auto-detect will pick for the current runtime. */
|
|
13
|
+
export declare function detectBackendName(): PtyBackendName;
|
|
14
|
+
/**
|
|
15
|
+
* Load the PTY backend for the current runtime (or a forced one).
|
|
16
|
+
* The result is cached process-wide.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadBackend(prefer?: PtyBackendName): Promise<PtyBackend>;
|
|
19
|
+
/** Reset the cached backend (used by tests). */
|
|
20
|
+
export declare function resetBackendCache(): void;
|
|
21
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACX,UAAU,EACV,cAAc,EAGd,MAAM,cAAc,CAAC;AAkBtB,mCAAmC;AACnC,wBAAgB,KAAK,IAAI,OAAO,CAK/B;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAyCD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAyB9E;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection + lazy backend loading.
|
|
3
|
+
*
|
|
4
|
+
* The PTY backend is an OPTIONAL dependency resolved at runtime via dynamic
|
|
5
|
+
* `import()`: `bun-pty` under Bun (tested), `node-pty` under Node (experimental).
|
|
6
|
+
* Importing lazily means a Node consumer never builds `bun-pty` (rust/ffi) and a
|
|
7
|
+
* Bun consumer never builds `node-pty`.
|
|
8
|
+
*/
|
|
9
|
+
/** True when running under Bun. */
|
|
10
|
+
export function isBun() {
|
|
11
|
+
return (typeof globalThis.Bun !== 'undefined' ||
|
|
12
|
+
typeof process?.versions?.bun === 'string');
|
|
13
|
+
}
|
|
14
|
+
/** The backend that auto-detect will pick for the current runtime. */
|
|
15
|
+
export function detectBackendName() {
|
|
16
|
+
return isBun() ? 'bun-pty' : 'node-pty';
|
|
17
|
+
}
|
|
18
|
+
/** Wrap a backend's raw PTY into the normalized handle. */
|
|
19
|
+
function wrapPty(raw) {
|
|
20
|
+
return {
|
|
21
|
+
get pid() {
|
|
22
|
+
return raw.pid;
|
|
23
|
+
},
|
|
24
|
+
get cols() {
|
|
25
|
+
return raw.cols;
|
|
26
|
+
},
|
|
27
|
+
get rows() {
|
|
28
|
+
return raw.rows;
|
|
29
|
+
},
|
|
30
|
+
write: (data) => raw.write(data),
|
|
31
|
+
resize: (cols, rows) => raw.resize(cols, rows),
|
|
32
|
+
kill: (signal) => raw.kill(signal),
|
|
33
|
+
onData: (listener) => raw.onData(listener),
|
|
34
|
+
onExit: (listener) => raw.onExit(listener),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function makeBackend(name, spawn) {
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
experimental: name === 'node-pty',
|
|
41
|
+
spawn(file, args, options) {
|
|
42
|
+
const raw = spawn(file, args, {
|
|
43
|
+
name: options.name ?? 'xterm-256color',
|
|
44
|
+
cols: options.cols,
|
|
45
|
+
rows: options.rows,
|
|
46
|
+
cwd: options.cwd,
|
|
47
|
+
env: options.env,
|
|
48
|
+
});
|
|
49
|
+
return wrapPty(raw);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
let cached = null;
|
|
54
|
+
/**
|
|
55
|
+
* Load the PTY backend for the current runtime (or a forced one).
|
|
56
|
+
* The result is cached process-wide.
|
|
57
|
+
*/
|
|
58
|
+
export async function loadBackend(prefer) {
|
|
59
|
+
if (cached && (!prefer || cached.name === prefer))
|
|
60
|
+
return cached;
|
|
61
|
+
const name = prefer ?? detectBackendName();
|
|
62
|
+
const moduleName = name; // 'bun-pty' | 'node-pty'
|
|
63
|
+
let mod;
|
|
64
|
+
try {
|
|
65
|
+
mod = await import(/* @vite-ignore */ moduleName);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
throw new Error(`ptykit: failed to load the "${moduleName}" PTY backend. Install it for this runtime ` +
|
|
69
|
+
`(\`${isBun() ? 'bun add' : 'npm install'} ${moduleName}\`). Underlying error: ${err instanceof Error ? err.message : String(err)}`);
|
|
70
|
+
}
|
|
71
|
+
const spawn = mod?.spawn ?? mod?.default?.spawn;
|
|
72
|
+
if (typeof spawn !== 'function') {
|
|
73
|
+
throw new Error(`ptykit: "${moduleName}" did not export a spawn() function.`);
|
|
74
|
+
}
|
|
75
|
+
cached = makeBackend(name, spawn);
|
|
76
|
+
return cached;
|
|
77
|
+
}
|
|
78
|
+
/** Reset the cached backend (used by tests). */
|
|
79
|
+
export function resetBackendCache() {
|
|
80
|
+
cached = null;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment hygiene (R2).
|
|
3
|
+
*
|
|
4
|
+
* Spawning a shell from inside a Bun/npm/Vite process leaks the runtime's own
|
|
5
|
+
* pollution into the child (npm_*, VITE_*, a `node_modules/.bin` PATH, etc.),
|
|
6
|
+
* which breaks version managers and confuses interactive shells. We strip that
|
|
7
|
+
* pollution, then inject the terminal-friendly variables xterm.js expects.
|
|
8
|
+
*/
|
|
9
|
+
/** Env hygiene configuration. */
|
|
10
|
+
export interface EnvOptions {
|
|
11
|
+
/** Strip Bun/npm/Vite runtime pollution from `process.env`. Default `true`. */
|
|
12
|
+
sanitize?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Variables injected/overridden after sanitizing. Merged over the terminal
|
|
15
|
+
* defaults (`FORCE_COLOR`, `COLORTERM`, `TERM`, `TERM_PROGRAM`, `CLICOLOR`,
|
|
16
|
+
* `LC_ALL`, `LANG`). `COLUMNS`/`LINES` are always set from the PTY size.
|
|
17
|
+
*/
|
|
18
|
+
inject?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/** Build a clean copy of `process.env` for spawning a child shell. */
|
|
21
|
+
export declare function getCleanSpawnEnv(): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* Produce the environment for a PTY: sanitized base (optional) plus the
|
|
24
|
+
* terminal-specific variables xterm.js relies on, with caller overrides last.
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildPtyEnv(options: EnvOptions | undefined, size: {
|
|
27
|
+
cols: number;
|
|
28
|
+
rows: number;
|
|
29
|
+
}): Record<string, string>;
|
|
30
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iCAAiC;AACjC,MAAM,WAAW,UAAU;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAsBD,sEAAsE;AACtE,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAC1B,OAAO,EAAE,UAAU,GAAG,SAAS,EAC/B,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB"}
|
package/dist/core/env.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment hygiene (R2).
|
|
3
|
+
*
|
|
4
|
+
* Spawning a shell from inside a Bun/npm/Vite process leaks the runtime's own
|
|
5
|
+
* pollution into the child (npm_*, VITE_*, a `node_modules/.bin` PATH, etc.),
|
|
6
|
+
* which breaks version managers and confuses interactive shells. We strip that
|
|
7
|
+
* pollution, then inject the terminal-friendly variables xterm.js expects.
|
|
8
|
+
*/
|
|
9
|
+
/** Env-var name prefixes always injected by Bun/npm/Vite. */
|
|
10
|
+
const FILTERED_PREFIXES = ['npm_', 'VITE_'];
|
|
11
|
+
/** Specific var names injected by the runtime. */
|
|
12
|
+
const FILTERED_NAMES = new Set(['_BUN_WATCHER_CHILD']);
|
|
13
|
+
/** Remove `node_modules/.bin`-style entries from PATH. */
|
|
14
|
+
function cleanPath(env) {
|
|
15
|
+
const isWindows = process.platform === 'win32';
|
|
16
|
+
const pathKey = isWindows ? (env.Path !== undefined ? 'Path' : 'PATH') : 'PATH';
|
|
17
|
+
const value = env[pathKey];
|
|
18
|
+
if (value) {
|
|
19
|
+
const sep = isWindows ? ';' : ':';
|
|
20
|
+
env[pathKey] = value
|
|
21
|
+
.split(sep)
|
|
22
|
+
.filter((p) => !p.includes('node_modules'))
|
|
23
|
+
.join(sep);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Build a clean copy of `process.env` for spawning a child shell. */
|
|
27
|
+
export function getCleanSpawnEnv() {
|
|
28
|
+
const env = {};
|
|
29
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
30
|
+
if (value === undefined)
|
|
31
|
+
continue;
|
|
32
|
+
if (FILTERED_NAMES.has(key))
|
|
33
|
+
continue;
|
|
34
|
+
if (FILTERED_PREFIXES.some((p) => key.startsWith(p)))
|
|
35
|
+
continue;
|
|
36
|
+
env[key] = value;
|
|
37
|
+
}
|
|
38
|
+
cleanPath(env);
|
|
39
|
+
return env;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Produce the environment for a PTY: sanitized base (optional) plus the
|
|
43
|
+
* terminal-specific variables xterm.js relies on, with caller overrides last.
|
|
44
|
+
*/
|
|
45
|
+
export function buildPtyEnv(options, size) {
|
|
46
|
+
const sanitize = options?.sanitize ?? true;
|
|
47
|
+
const base = sanitize
|
|
48
|
+
? getCleanSpawnEnv()
|
|
49
|
+
: { ...process.env };
|
|
50
|
+
const terminalDefaults = {
|
|
51
|
+
FORCE_COLOR: '1',
|
|
52
|
+
COLORTERM: 'truecolor',
|
|
53
|
+
TERM: 'xterm-256color',
|
|
54
|
+
TERM_PROGRAM: 'xterm.js',
|
|
55
|
+
CLICOLOR: '1',
|
|
56
|
+
LC_ALL: 'en_US.UTF-8',
|
|
57
|
+
LANG: 'en_US.UTF-8',
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
...base,
|
|
61
|
+
...terminalDefaults,
|
|
62
|
+
...(options?.inject ?? {}),
|
|
63
|
+
// Size always reflects the actual PTY dimensions, regardless of injects.
|
|
64
|
+
COLUMNS: String(size.cols),
|
|
65
|
+
LINES: String(size.rows),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,6DAA6D;AAC7D,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,kDAAkD;AAClD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAEvD,0DAA0D;AAC1D,SAAS,SAAS,CAAC,GAA2B;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK;aAClB,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;aAC1C,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;AACF,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB;IAC/B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACtC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/D,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClB,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAC1B,OAA+B,EAC/B,IAAoC;IAEpC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ;QACpB,CAAC,CAAC,gBAAgB,EAAE;QACpB,CAAC,CAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAA6B,CAAC;IAElD,MAAM,gBAAgB,GAA2B;QAChD,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,WAAW;QACtB,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,UAAU;QACxB,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,aAAa;KACnB,CAAC;IAEF,OAAO;QACN,GAAG,IAAI;QACP,GAAG,gBAAgB;QACnB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QAC1B,yEAAyE;QACzE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;KACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core PTY session engine — barrel.
|
|
3
|
+
*/
|
|
4
|
+
export type { PtyBackend, PtyBackendName, PtyProcessHandle, PtySpawnOptions, PtyExitEvent, PtyDisposable, } from './backend.js';
|
|
5
|
+
export { detectBackendName, isBun, loadBackend, resetBackendCache } from './detect.js';
|
|
6
|
+
export { buildPtyEnv, getCleanSpawnEnv, type EnvOptions } from './env.js';
|
|
7
|
+
export { checkShell, isWindows, resolveCwd, resolveShell, type ShellInvocation } from './shell.js';
|
|
8
|
+
export { MemoryBufferStore, type BufferStore } from './scrollback.js';
|
|
9
|
+
export { Session, type SessionConfig, type SessionInfo, type SessionDataListener, type SessionExitListener, } from './session.js';
|
|
10
|
+
export { PtyKit, type PtyKitOptions, type CreateSessionOptions, } from './pty-kit.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACX,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,aAAa,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EACN,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,MAAM,EACN,KAAK,aAAa,EAClB,KAAK,oBAAoB,GACzB,MAAM,cAAc,CAAC"}
|