@acpus/tui 0.1.0 → 0.2.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 (49) hide show
  1. package/dist/components/App.d.ts +17 -11
  2. package/dist/components/App.d.ts.map +1 -1
  3. package/dist/components/App.js +96 -182
  4. package/dist/components/App.js.map +1 -1
  5. package/dist/components/DetailsPane.d.ts +4 -3
  6. package/dist/components/DetailsPane.d.ts.map +1 -1
  7. package/dist/components/DetailsPane.js +34 -16
  8. package/dist/components/DetailsPane.js.map +1 -1
  9. package/dist/components/Footer.d.ts +3 -2
  10. package/dist/components/Footer.d.ts.map +1 -1
  11. package/dist/components/Footer.js +23 -12
  12. package/dist/components/Footer.js.map +1 -1
  13. package/dist/controls.d.ts +3 -0
  14. package/dist/controls.d.ts.map +1 -1
  15. package/dist/controls.js +12 -0
  16. package/dist/controls.js.map +1 -1
  17. package/dist/index.d.ts +5 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/poller.d.ts +1 -0
  22. package/dist/poller.d.ts.map +1 -1
  23. package/dist/poller.js +33 -1
  24. package/dist/poller.js.map +1 -1
  25. package/dist/serve.d.ts +32 -0
  26. package/dist/serve.d.ts.map +1 -0
  27. package/dist/serve.js +476 -0
  28. package/dist/serve.js.map +1 -0
  29. package/dist/served-entry.d.ts +2 -0
  30. package/dist/served-entry.d.ts.map +1 -0
  31. package/dist/served-entry.js +12 -0
  32. package/dist/served-entry.js.map +1 -0
  33. package/dist/theme.js +1 -1
  34. package/dist/ui/inkui/Confirm.d.ts +11 -0
  35. package/dist/ui/inkui/Confirm.d.ts.map +1 -0
  36. package/dist/ui/inkui/Confirm.js +36 -0
  37. package/dist/ui/inkui/Confirm.js.map +1 -0
  38. package/dist/ui/inkui/JSONViewer.d.ts.map +1 -1
  39. package/dist/ui/inkui/JSONViewer.js +5 -5
  40. package/dist/ui/inkui/JSONViewer.js.map +1 -1
  41. package/dist/ui/inkui/index.d.ts +1 -0
  42. package/dist/ui/inkui/index.d.ts.map +1 -1
  43. package/dist/ui/inkui/index.js +1 -0
  44. package/dist/ui/inkui/index.js.map +1 -1
  45. package/package.json +12 -9
  46. package/dist/agentTranscript.d.ts +0 -33
  47. package/dist/agentTranscript.d.ts.map +0 -1
  48. package/dist/agentTranscript.js +0 -238
  49. package/dist/agentTranscript.js.map +0 -1
package/dist/serve.js ADDED
@@ -0,0 +1,476 @@
1
+ import { createServer } from "node:http";
2
+ import { randomBytes } from "node:crypto";
3
+ import { readFile } from "node:fs/promises";
4
+ import { existsSync } from "node:fs";
5
+ import { dirname, join, normalize, relative } from "node:path";
6
+ import { createRequire } from "node:module";
7
+ import { fileURLToPath } from "node:url";
8
+ import { WebSocketServer } from "ws";
9
+ import { spawn } from "node-pty";
10
+ const DEFAULT_LISTEN = { host: "127.0.0.1", port: 0 };
11
+ const DEFAULT_COLS = 120;
12
+ const DEFAULT_ROWS = 40;
13
+ const DEFAULT_MAX_CLIENTS = 8;
14
+ const MAX_COLS = 500;
15
+ const MAX_ROWS = 200;
16
+ const WEBSOCKET_MAX_PAYLOAD_BYTES = 1024 * 1024;
17
+ const SECURITY_HEADERS = {
18
+ "content-security-policy": "default-src 'self'; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; connect-src 'self' ws: wss:",
19
+ "x-content-type-options": "nosniff"
20
+ };
21
+ export async function serveTui(options) {
22
+ const bridge = await startServedVisualizerBridge(options);
23
+ const url = servedVisualizerUrl(bridge.host, bridge.port, bridge.token);
24
+ const stdout = options.stdout ?? process.stdout;
25
+ stdout.write(`Served visualizer: ${url}\n`);
26
+ stdout.write("Press Ctrl-C to stop the served visualizer. Runs continue in the Run Supervisor.\n");
27
+ await bridge.closed;
28
+ }
29
+ export async function startServedVisualizerBridge(options) {
30
+ const listen = parseListen(options.listen);
31
+ const assets = resolveWTermAssets();
32
+ const token = createBridgeToken();
33
+ const maxClients = options.maxClients ?? DEFAULT_MAX_CLIENTS;
34
+ const clients = new Set();
35
+ const sockets = new Set();
36
+ const spawnPty = options.spawnPty ?? ((ptyOptions) => spawnServedTuiPty(options, ptyOptions));
37
+ const server = createServer((req, res) => {
38
+ void handleHttpRequest(req, res, assets, token);
39
+ });
40
+ const wss = new WebSocketServer({ noServer: true, maxPayload: WEBSOCKET_MAX_PAYLOAD_BYTES });
41
+ server.on("upgrade", (req, socket, head) => {
42
+ const url = parseRequestUrl(req.url);
43
+ if (!url) {
44
+ socket.end("HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n");
45
+ return;
46
+ }
47
+ if (url.pathname !== "/ws" || !isAuthorizedBridgeRequest(req, url, token)) {
48
+ socket.destroy();
49
+ return;
50
+ }
51
+ wss.handleUpgrade(req, socket, head, (ws) => {
52
+ wss.emit("connection", ws, req);
53
+ });
54
+ });
55
+ server.on("clientError", (_error, socket) => {
56
+ socket.end("HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n");
57
+ });
58
+ wss.on("connection", (ws) => {
59
+ sockets.add(ws);
60
+ if (clients.size >= maxClients) {
61
+ sendJson(ws, { type: "error", message: "served visualizer client limit reached" });
62
+ sockets.delete(ws);
63
+ ws.close(1013, "client limit reached");
64
+ return;
65
+ }
66
+ let pty;
67
+ try {
68
+ pty = spawnPty({ cols: DEFAULT_COLS, rows: DEFAULT_ROWS });
69
+ }
70
+ catch (error) {
71
+ sockets.delete(ws);
72
+ sendJson(ws, { type: "error", message: `Failed to start visualizer PTY: ${errorMessage(error)}` });
73
+ ws.close();
74
+ return;
75
+ }
76
+ clients.add(pty);
77
+ let ptyExited = false;
78
+ const disposePty = () => {
79
+ sockets.delete(ws);
80
+ clients.delete(pty);
81
+ if (ptyExited)
82
+ return;
83
+ try {
84
+ pty.kill();
85
+ }
86
+ catch {
87
+ // The PTY may already be gone after an exit event.
88
+ }
89
+ };
90
+ pty.onData((data) => {
91
+ sendJson(ws, { type: "output", data });
92
+ });
93
+ pty.onExit(({ exitCode }) => {
94
+ ptyExited = true;
95
+ sendJson(ws, { type: "exit", exitCode });
96
+ sockets.delete(ws);
97
+ clients.delete(pty);
98
+ ws.close();
99
+ });
100
+ ws.on("message", (raw) => {
101
+ handleWebSocketMessage(raw, pty, ws);
102
+ });
103
+ ws.on("close", disposePty);
104
+ ws.on("error", disposePty);
105
+ });
106
+ const closed = new Promise((resolve) => {
107
+ server.on("close", resolve);
108
+ });
109
+ await new Promise((resolve, reject) => {
110
+ const onError = (error) => {
111
+ server.off("listening", onListening);
112
+ reject(error);
113
+ };
114
+ const onListening = () => {
115
+ server.off("error", onError);
116
+ resolve();
117
+ };
118
+ server.once("error", onError);
119
+ server.once("listening", onListening);
120
+ server.listen(listen.port, listen.host);
121
+ });
122
+ const address = server.address();
123
+ const boundPort = typeof address === "object" && address ? address.port : listen.port;
124
+ let closing = false;
125
+ let signalHandler;
126
+ const close = async () => {
127
+ if (closing)
128
+ return;
129
+ closing = true;
130
+ if (signalHandler) {
131
+ process.off("SIGINT", signalHandler);
132
+ process.off("SIGTERM", signalHandler);
133
+ }
134
+ for (const client of clients) {
135
+ try {
136
+ client.kill();
137
+ }
138
+ catch {
139
+ // Ignore teardown races.
140
+ }
141
+ }
142
+ clients.clear();
143
+ for (const socket of sockets) {
144
+ socket.terminate();
145
+ }
146
+ sockets.clear();
147
+ await new Promise((resolve) => {
148
+ wss.close(() => {
149
+ server.close(() => resolve());
150
+ });
151
+ });
152
+ };
153
+ signalHandler = () => {
154
+ void close().then(() => {
155
+ process.exitCode = 0;
156
+ });
157
+ };
158
+ process.on("SIGINT", signalHandler);
159
+ process.on("SIGTERM", signalHandler);
160
+ return {
161
+ host: listen.host,
162
+ port: boundPort,
163
+ token,
164
+ closed,
165
+ close,
166
+ activeClientCount: () => clients.size
167
+ };
168
+ }
169
+ export function parseListen(value) {
170
+ if (value === undefined || value === true || value === "")
171
+ return { ...DEFAULT_LISTEN };
172
+ const raw = String(value).trim();
173
+ if (/^\d+$/.test(raw)) {
174
+ return { host: DEFAULT_LISTEN.host, port: parsePort(raw, raw) };
175
+ }
176
+ const match = /^([^:]+):(\d+)$/.exec(raw);
177
+ if (!match) {
178
+ throw new Error(`Invalid listen value '${raw}'. Use '--serve <port>' or put the run id before --serve.`);
179
+ }
180
+ const [, host, port] = match;
181
+ return { host, port: parsePort(port, raw) };
182
+ }
183
+ function resolveWTermAssets() {
184
+ const require = createRequire(import.meta.url);
185
+ const domDistDir = dirname(require.resolve("@wterm/dom"));
186
+ const domPackageDir = dirname(domDistDir);
187
+ return {
188
+ domDistDir,
189
+ domCssPath: require.resolve("@wterm/dom/css"),
190
+ coreDistDir: dirname(require.resolve("@wterm/core", { paths: [domPackageDir] })),
191
+ coreWasmPath: require.resolve("@wterm/core/wasm", { paths: [domPackageDir] })
192
+ };
193
+ }
194
+ function parsePort(port, source) {
195
+ const parsed = Number(port);
196
+ if (!Number.isInteger(parsed) || parsed < 0 || parsed > 65535) {
197
+ throw new Error(`Invalid listen port in '${source}'. Port must be an integer from 0 to 65535.`);
198
+ }
199
+ return parsed;
200
+ }
201
+ function createBridgeToken() {
202
+ return randomBytes(24).toString("base64url");
203
+ }
204
+ function servedVisualizerUrl(host, port, token) {
205
+ const url = new URL(`http://${host}:${port}/`);
206
+ url.searchParams.set("token", token);
207
+ return url.toString();
208
+ }
209
+ function parseRequestUrl(raw) {
210
+ try {
211
+ return new URL(raw ?? "/", "http://localhost");
212
+ }
213
+ catch {
214
+ return undefined;
215
+ }
216
+ }
217
+ function isAuthorizedBridgeRequest(req, url, token) {
218
+ if (url.searchParams.get("token") !== token)
219
+ return false;
220
+ const origin = req.headers.origin;
221
+ if (origin === undefined)
222
+ return true;
223
+ const host = req.headers.host;
224
+ if (!host)
225
+ return false;
226
+ try {
227
+ const originUrl = new URL(origin);
228
+ return (originUrl.protocol === "http:" || originUrl.protocol === "https:") && originUrl.host === host;
229
+ }
230
+ catch {
231
+ return false;
232
+ }
233
+ }
234
+ function spawnServedTuiPty(options, ptyOptions) {
235
+ const entry = resolveServedEntry();
236
+ const args = entry.kind === "source"
237
+ ? ["--import", "tsx", entry.path]
238
+ : [entry.path];
239
+ return spawn(process.execPath, args, {
240
+ name: "xterm-256color",
241
+ cols: ptyOptions.cols,
242
+ rows: ptyOptions.rows,
243
+ cwd: process.cwd(),
244
+ env: buildChildEnv(options)
245
+ });
246
+ }
247
+ function resolveServedEntry() {
248
+ const dir = fileURLToPath(new URL(".", import.meta.url));
249
+ const source = join(dir, "served-entry.ts");
250
+ if (existsSync(source))
251
+ return { kind: "source", path: source };
252
+ return { kind: "dist", path: join(dir, "served-entry.js") };
253
+ }
254
+ function buildChildEnv(options) {
255
+ const env = {};
256
+ for (const [key, value] of Object.entries(process.env)) {
257
+ if (value !== undefined)
258
+ env[key] = value;
259
+ }
260
+ env.ACPUS_TUI_ENDPOINT = options.endpoint;
261
+ env.ACPUS_TUI_READ_ONLY = "1";
262
+ env.ACPUS_TUI_REFRESH_MODE = "low";
263
+ if (options.runId)
264
+ env.ACPUS_TUI_RUN_ID = options.runId;
265
+ return env;
266
+ }
267
+ async function handleHttpRequest(req, res, assets, token) {
268
+ try {
269
+ const url = parseRequestUrl(req.url);
270
+ if (!url) {
271
+ sendText(res, 400, "text/plain; charset=utf-8", "bad request");
272
+ return;
273
+ }
274
+ if (req.method !== "GET") {
275
+ sendText(res, 405, "text/plain; charset=utf-8", "method not allowed");
276
+ return;
277
+ }
278
+ if (url.pathname === "/") {
279
+ if (!isAuthorizedBridgeRequest(req, url, token)) {
280
+ sendText(res, 403, "text/plain; charset=utf-8", "forbidden");
281
+ return;
282
+ }
283
+ sendText(res, 200, "text/html; charset=utf-8", servedVisualizerHtml());
284
+ return;
285
+ }
286
+ if (url.pathname === "/vendor/@wterm/dom/src/terminal.css") {
287
+ await sendFile(res, assets.domCssPath, "text/css; charset=utf-8");
288
+ return;
289
+ }
290
+ if (url.pathname === "/vendor/@wterm/core/wasm/wterm.wasm") {
291
+ await sendFile(res, assets.coreWasmPath, "application/wasm");
292
+ return;
293
+ }
294
+ if (url.pathname.startsWith("/vendor/@wterm/dom/dist/")) {
295
+ await sendVendorFile(res, url.pathname, "/vendor/@wterm/dom/dist/", assets.domDistDir);
296
+ return;
297
+ }
298
+ if (url.pathname.startsWith("/vendor/@wterm/core/dist/")) {
299
+ await sendVendorFile(res, url.pathname, "/vendor/@wterm/core/dist/", assets.coreDistDir);
300
+ return;
301
+ }
302
+ sendText(res, 404, "text/plain; charset=utf-8", "not found");
303
+ }
304
+ catch (error) {
305
+ if (isFileNotFoundError(error)) {
306
+ sendText(res, 404, "text/plain; charset=utf-8", "not found");
307
+ return;
308
+ }
309
+ sendText(res, 500, "text/plain; charset=utf-8", "internal server error");
310
+ }
311
+ }
312
+ async function sendVendorFile(res, pathname, prefix, baseDir) {
313
+ const rel = pathname.slice(prefix.length);
314
+ const filePath = normalize(join(baseDir, rel));
315
+ if (relative(baseDir, filePath).startsWith("..")) {
316
+ sendText(res, 403, "text/plain; charset=utf-8", "forbidden");
317
+ return;
318
+ }
319
+ if (filePath.endsWith(".map")) {
320
+ sendText(res, 404, "text/plain; charset=utf-8", "not found");
321
+ return;
322
+ }
323
+ await sendFile(res, filePath, mimeFor(filePath));
324
+ }
325
+ async function sendFile(res, filePath, contentType) {
326
+ const data = await readFile(filePath);
327
+ res.writeHead(200, { ...SECURITY_HEADERS, "content-type": contentType });
328
+ res.end(data);
329
+ }
330
+ function sendText(res, status, contentType, text) {
331
+ res.writeHead(status, { ...SECURITY_HEADERS, "content-type": contentType });
332
+ res.end(text);
333
+ }
334
+ function mimeFor(filePath) {
335
+ if (filePath.endsWith(".js"))
336
+ return "text/javascript; charset=utf-8";
337
+ if (filePath.endsWith(".wasm"))
338
+ return "application/wasm";
339
+ return "application/octet-stream";
340
+ }
341
+ function isFileNotFoundError(error) {
342
+ if (!(error instanceof Error) || !("code" in error))
343
+ return false;
344
+ return error.code === "ENOENT" || error.code === "ENOTDIR" || error.code === "EISDIR";
345
+ }
346
+ function handleWebSocketMessage(raw, pty, ws) {
347
+ try {
348
+ const payload = JSON.parse(raw.toString());
349
+ if (payload.type === "input" && typeof payload.data === "string") {
350
+ pty.write(payload.data);
351
+ return;
352
+ }
353
+ if (payload.type === "resize" && Number.isInteger(payload.cols) && Number.isInteger(payload.rows)) {
354
+ pty.resize(clampDimension(payload.cols ?? DEFAULT_COLS, MAX_COLS), clampDimension(payload.rows ?? DEFAULT_ROWS, MAX_ROWS));
355
+ return;
356
+ }
357
+ }
358
+ catch (error) {
359
+ sendJson(ws, { type: "error", message: error instanceof Error ? error.message : String(error) });
360
+ }
361
+ }
362
+ function clampDimension(value, max) {
363
+ return Math.min(max, Math.max(1, value));
364
+ }
365
+ function sendJson(ws, value) {
366
+ if (ws.readyState === ws.OPEN) {
367
+ ws.send(JSON.stringify(value));
368
+ }
369
+ }
370
+ function servedVisualizerHtml() {
371
+ return `<!doctype html>
372
+ <html lang="en">
373
+ <head>
374
+ <meta charset="utf-8" />
375
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
376
+ <title>Acpus Served Visualizer</title>
377
+ <link rel="stylesheet" href="/vendor/@wterm/dom/src/terminal.css" />
378
+ <style>
379
+ html, body, #terminal {
380
+ margin: 0;
381
+ width: 100%;
382
+ height: 100%;
383
+ background: #1d2021;
384
+ }
385
+
386
+ #terminal {
387
+ box-sizing: border-box;
388
+ }
389
+
390
+ #terminal.wterm {
391
+ --term-font-family: "SFMono-Regular", "Menlo", "Consolas", "DejaVu Sans Mono", monospace;
392
+ height: 100%;
393
+ padding: 14px 16px;
394
+ border-radius: 0;
395
+ box-shadow: none;
396
+ }
397
+
398
+ #terminal.wterm.theme-gruvbox-dark-hard {
399
+ --term-bg: #1d2021;
400
+ --term-fg: #ebdbb2;
401
+ --term-cursor: #fe8019;
402
+ --term-color-0: #1d2021;
403
+ --term-color-1: #cc241d;
404
+ --term-color-2: #98971a;
405
+ --term-color-3: #d79921;
406
+ --term-color-4: #458588;
407
+ --term-color-5: #b16286;
408
+ --term-color-6: #689d6a;
409
+ --term-color-7: #a89984;
410
+ --term-color-8: #928374;
411
+ --term-color-9: #fb4934;
412
+ --term-color-10: #b8bb26;
413
+ --term-color-11: #fabd2f;
414
+ --term-color-12: #83a598;
415
+ --term-color-13: #d3869b;
416
+ --term-color-14: #8ec07c;
417
+ --term-color-15: #fbf1c7;
418
+ }
419
+
420
+ #terminal.wterm.theme-gruvbox-dark-hard ::selection {
421
+ background: #504945;
422
+ }
423
+ </style>
424
+ <script type="importmap">
425
+ {
426
+ "imports": {
427
+ "@wterm/dom": "/vendor/@wterm/dom/dist/index.js",
428
+ "@wterm/core": "/vendor/@wterm/core/dist/index.js"
429
+ }
430
+ }
431
+ </script>
432
+ </head>
433
+ <body>
434
+ <div id="terminal"></div>
435
+ <script type="module">
436
+ import { WTerm } from "@wterm/dom";
437
+
438
+ const el = document.getElementById("terminal");
439
+ el.classList.add("theme-gruvbox-dark-hard");
440
+ const token = new URLSearchParams(window.location.search).get("token");
441
+
442
+ const wsUrl = new URL("/ws", window.location.href);
443
+ wsUrl.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
444
+ if (token) wsUrl.searchParams.set("token", token);
445
+ const ws = new WebSocket(wsUrl);
446
+ const send = (payload) => {
447
+ if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify(payload));
448
+ };
449
+
450
+ const terminal = new WTerm(el, {
451
+ wasmUrl: "/vendor/@wterm/core/wasm/wterm.wasm",
452
+ cursorBlink: true,
453
+ onData: (data) => send({ type: "input", data }),
454
+ onResize: (cols, rows) => send({ type: "resize", cols, rows })
455
+ });
456
+
457
+ ws.addEventListener("message", (event) => {
458
+ const payload = JSON.parse(event.data);
459
+ if (payload.type === "output") terminal.write(payload.data);
460
+ if (payload.type === "exit") terminal.write("\\r\\n[served visualizer session ended]\\r\\n");
461
+ if (payload.type === "error") terminal.write("\\r\\n[served visualizer error] " + payload.message + "\\r\\n");
462
+ });
463
+ ws.addEventListener("close", () => {
464
+ terminal.write("\\r\\n[served visualizer disconnected]\\r\\n");
465
+ });
466
+
467
+ await terminal.init();
468
+ terminal.focus();
469
+ </script>
470
+ </body>
471
+ </html>`;
472
+ }
473
+ function errorMessage(error) {
474
+ return error instanceof Error ? error.message : String(error);
475
+ }
476
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAkB,MAAM,IAAI,CAAC;AACrD,OAAO,EAAE,KAAK,EAAa,MAAM,UAAU,CAAC;AA0B5C,MAAM,cAAc,GAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACpE,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,2BAA2B,GAAG,IAAI,GAAG,IAAI,CAAC;AAChD,MAAM,gBAAgB,GAAG;IACvB,yBAAyB,EAAE,yIAAyI;IACpK,wBAAwB,EAAE,SAAS;CAC3B,CAAC;AASX,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACnG,MAAM,MAAM,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAsC;IACtF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAa,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,KAAK,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,2BAA2B,EAAE,CAAC,CAAC;IAE7F,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACzC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;YAC1C,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,OAAO,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC;YAC/B,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;YACnF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QACD,IAAI,GAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACnG,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC,CAAC;QAEF,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC1B,SAAS,GAAG,IAAI,CAAC;YACjB,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3B,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC3C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAEtF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,aAAuC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;gBACb,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,aAAa,GAAG,GAAG,EAAE;QACnB,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,SAAS;QACf,KAAK;QACL,MAAM;QACN,KAAK;QACL,iBAAiB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAmC;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAExF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,2DAA2D,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO;QACL,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC7C,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChF,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,6CAA6C,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IACpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;IAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,GAAuB;IAC9C,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAoB,EAAE,GAAQ,EAAE,KAAa;IAC9E,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC;IACxG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAwB,EAAE,UAA2B;IAC9E,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ;QAClC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;QACnC,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,OAAwB;IAC7C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC;IACD,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC1C,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;IAC9B,GAAG,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACnC,IAAI,OAAO,CAAC,KAAK;QAAE,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAoB,EAAE,GAAmB,EAAE,MAAmB,EAAE,KAAa;IAC5G,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,aAAa,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,WAAW,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,qCAAqC,EAAE,CAAC;YAC3D,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,qCAAqC,EAAE,CAAC;YAC3D,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;YACxD,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,0BAA0B,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACzD,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,2BAA2B,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,WAAW,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAmB,EAAE,QAAgB,EAAE,MAAc,EAAE,OAAe;IAClG,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,WAAW,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,WAAW,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAmB,EAAE,QAAgB,EAAE,WAAmB;IAChF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACzE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,WAAmB,EAAE,IAAY;IACtF,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,GAAG,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB;IAC/B,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,gCAAgC,CAAC;IACtE,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,kBAAkB,CAAC;IAC1D,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxF,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAsB,EAAE,GAAyB,EAAE,EAAa;IAC9F,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAmE,CAAC;QAC7G,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,EAAE,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC3H,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,GAAW;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,EAAa,EAAE,KAAc;IAC7C,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QAC9B,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAoGD,CAAC;AACT,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=served-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"served-entry.d.ts","sourceRoot":"","sources":["../src/served-entry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { runTui } from "./index.js";
2
+ const endpoint = process.env.ACPUS_TUI_ENDPOINT;
3
+ if (!endpoint) {
4
+ throw new Error("ACPUS_TUI_ENDPOINT is required");
5
+ }
6
+ await runTui({
7
+ endpoint,
8
+ runId: process.env.ACPUS_TUI_RUN_ID || undefined,
9
+ readOnly: process.env.ACPUS_TUI_READ_ONLY === "1",
10
+ refreshMode: process.env.ACPUS_TUI_REFRESH_MODE === "low" ? "low" : "normal"
11
+ });
12
+ //# sourceMappingURL=served-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"served-entry.js","sourceRoot":"","sources":["../src/served-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,MAAM,CAAC;IACX,QAAQ;IACR,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,SAAS;IAChD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG;IACjD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;CAC7E,CAAC,CAAC"}
package/dist/theme.js CHANGED
@@ -18,7 +18,7 @@ export const STATE_STYLES = {
18
18
  awaiting: { glyph: "◷", color: "blue", label: "Awaiting" },
19
19
  completed: { glyph: "✓", color: "green", label: "Completed" },
20
20
  failed: { glyph: "✗", color: "red", label: "Failed" },
21
- paused: { glyph: "", color: "cyan", label: "Paused" },
21
+ paused: { glyph: "=", color: "cyan", label: "Paused" },
22
22
  cancelled: { glyph: "⊘", color: "magenta", label: "Cancelled" }
23
23
  };
24
24
  /** Short uppercase label for a composite container header. */
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { type InkUiTheme } from "./theme.js";
3
+ export declare function Confirm({ message, defaultValue, onConfirm, onCancel, theme }: {
4
+ message: string;
5
+ defaultValue?: boolean;
6
+ onConfirm: () => void;
7
+ onCancel?: () => void;
8
+ theme?: InkUiTheme;
9
+ }): React.ReactElement;
10
+ export declare function confirmSuffix(defaultValue: boolean): string;
11
+ //# sourceMappingURL=Confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Confirm.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/Confirm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,YAAoB,EACpB,SAAS,EACT,QAAQ,EACR,KAAuB,EACxB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAoCrB;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Text, useInput } from "ink";
4
+ import { acpusInkUiTheme } from "./theme.js";
5
+ export function Confirm({ message, defaultValue = false, onConfirm, onCancel, theme = acpusInkUiTheme }) {
6
+ const [resolved, setResolved] = useState(undefined);
7
+ useInput((input, key) => {
8
+ if (resolved)
9
+ return;
10
+ if (input === "y" || input === "Y") {
11
+ setResolved("confirmed");
12
+ onConfirm();
13
+ return;
14
+ }
15
+ if (input === "n" || input === "N" || key.escape) {
16
+ setResolved("cancelled");
17
+ onCancel?.();
18
+ return;
19
+ }
20
+ if (key.return) {
21
+ const next = defaultValue ? "confirmed" : "cancelled";
22
+ setResolved(next);
23
+ if (defaultValue)
24
+ onConfirm();
25
+ else
26
+ onCancel?.();
27
+ }
28
+ });
29
+ const suffix = confirmSuffix(defaultValue);
30
+ const answer = resolved === "confirmed" ? " yes" : resolved === "cancelled" ? " no" : " █";
31
+ return (_jsxs(Text, { children: [_jsx(Text, { color: theme.colors.primary, children: "?" }), _jsxs(Text, { children: [" ", message, " "] }), _jsx(Text, { color: theme.colors.muted, children: suffix }), _jsx(Text, { color: resolved === "confirmed" ? theme.colors.success : resolved === "cancelled" ? theme.colors.muted : theme.colors.primary, children: answer })] }));
32
+ }
33
+ export function confirmSuffix(defaultValue) {
34
+ return defaultValue ? "(Y/n)" : "(y/N)";
35
+ }
36
+ //# sourceMappingURL=Confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Confirm.js","sourceRoot":"","sources":["../../../src/ui/inkui/Confirm.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,EAAE,eAAe,EAAmB,MAAM,YAAY,CAAC;AAE9D,MAAM,UAAU,OAAO,CAAC,EACtB,OAAO,EACP,YAAY,GAAG,KAAK,EACpB,SAAS,EACT,QAAQ,EACR,KAAK,GAAG,eAAe,EAOxB;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAwC,SAAS,CAAC,CAAC;IAE3F,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,WAAW,CAAC,WAAW,CAAC,CAAC;YACzB,SAAS,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACjD,WAAW,CAAC,WAAW,CAAC,CAAC;YACzB,QAAQ,EAAE,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;YACtD,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,YAAY;gBAAE,SAAS,EAAE,CAAC;;gBACzB,QAAQ,EAAE,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3F,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,kBAAU,EAC3C,MAAC,IAAI,oBAAG,OAAO,SAAS,EACxB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,YAAG,MAAM,GAAQ,EAChD,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,YAChI,MAAM,GACF,IACF,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAAqB;IACjD,OAAO,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"JSONViewer.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/JSONViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,SAAoB,EACpB,YAAgB,EAChB,WAAW,EACX,aAAa,EACb,KAAuB,EACxB,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAErB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,EACE,SAAoB,EACpB,YAAgB,EAChB,WAAW,EACX,aAAa,EACb,KAAuB,EACxB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;CACf,GACL,KAAK,CAAC,YAAY,EAAE,CAStB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAAW,EAAE,YAAY,SAA2B,GAAG,MAAM,CAElH;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,EACE,SAAoB,EACpB,YAAgB,EAChB,WAAW,EACX,KAAuB,EACxB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,UAAU,CAAC;CACf,GACL,iBAAiB,EAAE,CAwCrB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,EACb,EACE,SAAoB,EACpB,YAAgB,EACjB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,GAAG,CAAC,MAAM,CAAC,CAsBb;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAK9F"}
1
+ {"version":3,"file":"JSONViewer.d.ts","sourceRoot":"","sources":["../../../src/ui/inkui/JSONViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,SAAkB,EAClB,YAAgB,EAChB,WAAW,EACX,aAAa,EACb,KAAuB,EACxB,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GAAG,KAAK,CAAC,YAAY,CAErB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,EACE,SAAkB,EAClB,YAAgB,EAChB,WAAW,EACX,aAAa,EACb,KAAuB,EACxB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;CACf,GACL,KAAK,CAAC,YAAY,EAAE,CAStB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAAS,EAAE,YAAY,SAA2B,GAAG,MAAM,CAEhH;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,EACE,SAAkB,EAClB,YAAgB,EAChB,WAAW,EACX,KAAuB,EACxB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,UAAU,CAAC;CACf,GACL,iBAAiB,EAAE,CAwCrB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,OAAO,EACb,EACE,SAAkB,EAClB,YAAgB,EACjB,GAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,GAAG,CAAC,MAAM,CAAC,CAsBb;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAK9F"}
@@ -1,17 +1,17 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Text } from "ink";
3
3
  import { acpusInkUiTheme, wrapText } from "./theme.js";
4
- export function JSONViewer({ data, width, rootLabel = "output", initialDepth = 2, expandedIds, selectedIndex, theme = acpusInkUiTheme }) {
4
+ export function JSONViewer({ data, width, rootLabel = "root", initialDepth = 2, expandedIds, selectedIndex, theme = acpusInkUiTheme }) {
5
5
  return _jsx(_Fragment, { children: jsonViewerRows(data, width, { rootLabel, initialDepth, expandedIds, selectedIndex, theme }) });
6
6
  }
7
- export function jsonViewerRows(data, width, { rootLabel = "output", initialDepth = 2, expandedIds, selectedIndex, theme = acpusInkUiTheme } = {}) {
7
+ export function jsonViewerRows(data, width, { rootLabel = "root", initialDepth = 2, expandedIds, selectedIndex, theme = acpusInkUiTheme } = {}) {
8
8
  return jsonRowDescriptors(data, { rootLabel, initialDepth, expandedIds, theme })
9
9
  .flatMap((row, rowIndex) => wrapText(row.text, width).map((chunk, index) => (_jsx(Text, { color: row.color, inverse: selectedIndex === rowIndex, children: index === 0 ? chunk : ` ${chunk}` }, `${row.id}:${index}`))));
10
10
  }
11
- export function jsonPlainText(data, rootLabel = "output", initialDepth = Number.POSITIVE_INFINITY) {
11
+ export function jsonPlainText(data, rootLabel = "root", initialDepth = Number.POSITIVE_INFINITY) {
12
12
  return jsonRowDescriptors(data, { rootLabel, initialDepth }).map((row) => row.text).join("\n");
13
13
  }
14
- export function jsonRowDescriptors(data, { rootLabel = "output", initialDepth = 2, expandedIds, theme = acpusInkUiTheme } = {}) {
14
+ export function jsonRowDescriptors(data, { rootLabel = "root", initialDepth = 2, expandedIds, theme = acpusInkUiTheme } = {}) {
15
15
  const rows = [];
16
16
  const visited = new WeakSet();
17
17
  visit(data, rootLabel, 0, "root", []);
@@ -51,7 +51,7 @@ export function jsonRowDescriptors(data, { rootLabel = "output", initialDepth =
51
51
  });
52
52
  }
53
53
  }
54
- export function jsonExpandedIdsForInitialDepth(data, { rootLabel = "output", initialDepth = 2 } = {}) {
54
+ export function jsonExpandedIdsForInitialDepth(data, { rootLabel = "root", initialDepth = 2 } = {}) {
55
55
  const expanded = new Set();
56
56
  const visited = new WeakSet();
57
57
  visit(data, rootLabel, 0, "root");