agent-rooms 0.2.0 → 0.3.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.
- package/README.md +19 -32
- package/dist/cli.js +3 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/listener.js +2 -31
- package/dist/listener.js.map +1 -1
- package/dist/skill.js +1 -1
- package/dist/skill.js.map +1 -1
- package/package.json +4 -5
- package/dist/commands/dashboard.js +0 -38
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/dashboard/readiness.js +0 -464
- package/dist/dashboard/readiness.js.map +0 -1
- package/dist/dashboard/server.js +0 -475
- package/dist/dashboard/server.js.map +0 -1
- package/dist/dashboard/ui.js +0 -357
- package/dist/dashboard/ui.js.map +0 -1
package/dist/dashboard/server.js
DELETED
|
@@ -1,475 +0,0 @@
|
|
|
1
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
-
import { randomBytes } from "node:crypto";
|
|
3
|
-
import { createServer } from "node:http";
|
|
4
|
-
import { platform } from "node:os";
|
|
5
|
-
import { resolve } from "node:path";
|
|
6
|
-
import { pairPoll, pairStart } from "../api.js";
|
|
7
|
-
import { loadConfig, removeBinding, saveConfig, setAgentPaused, setHostToken, upsertBinding } from "../config.js";
|
|
8
|
-
import { getAdapter } from "../hosts.js";
|
|
9
|
-
import { ListenerRuntime } from "../listener.js";
|
|
10
|
-
import { installBundledSkill } from "../skill.js";
|
|
11
|
-
import { buildReadiness } from "./readiness.js";
|
|
12
|
-
import { dashboardHtml } from "./ui.js";
|
|
13
|
-
export class DashboardController {
|
|
14
|
-
apiBaseOverride;
|
|
15
|
-
runtime;
|
|
16
|
-
activity = [];
|
|
17
|
-
pendingPair = null;
|
|
18
|
-
subscribers = new Set();
|
|
19
|
-
constructor(apiBaseOverride) {
|
|
20
|
-
this.apiBaseOverride = apiBaseOverride;
|
|
21
|
-
this.runtime = new ListenerRuntime({
|
|
22
|
-
apiBase: apiBaseOverride,
|
|
23
|
-
onEvent: (event) => this.addActivity(event)
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
snapshot() {
|
|
27
|
-
return {
|
|
28
|
-
readiness: buildReadiness(this.runtime.snapshot(), this.apiBaseOverride),
|
|
29
|
-
activity: [...this.activity],
|
|
30
|
-
pendingPair: this.pendingPair
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
subscribe(fn) {
|
|
34
|
-
this.subscribers.add(fn);
|
|
35
|
-
return () => this.subscribers.delete(fn);
|
|
36
|
-
}
|
|
37
|
-
async close() {
|
|
38
|
-
await this.runtime.stop();
|
|
39
|
-
}
|
|
40
|
-
async action(input) {
|
|
41
|
-
let message = "Done.";
|
|
42
|
-
let command;
|
|
43
|
-
switch (input.action) {
|
|
44
|
-
case "pair.start": {
|
|
45
|
-
const apiBase = this.apiBase();
|
|
46
|
-
const start = await pairStart(apiBase, platform());
|
|
47
|
-
this.pendingPair = start;
|
|
48
|
-
openExternal(start.verification_url);
|
|
49
|
-
message = `Pairing started. Code: ${start.user_code}`;
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
case "pair.poll": {
|
|
53
|
-
message = await this.pollPair();
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
case "host.installMcp": {
|
|
57
|
-
const host = this.requireHost(input.host);
|
|
58
|
-
const spec = host.buildMcpAdd(this.apiBase());
|
|
59
|
-
command = `${spec.command} ${spec.args.join(" ")}`;
|
|
60
|
-
const result = runCommand(spec.command, spec.args);
|
|
61
|
-
message = result.ok || /already (exists|configured|registered)/i.test(result.output)
|
|
62
|
-
? `MCP install command finished for ${host.name}.`
|
|
63
|
-
: `MCP install exited ${result.status ?? "?"}: ${result.output || "no output"}`;
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
case "host.update": {
|
|
67
|
-
const host = this.requireHost(input.host);
|
|
68
|
-
const readiness = buildReadiness(this.runtime.snapshot(), this.apiBaseOverride);
|
|
69
|
-
const commandText = readiness.hosts[host.name]?.commands.update;
|
|
70
|
-
if (!commandText)
|
|
71
|
-
throw new Error(`No update command is configured for ${host.name}.`);
|
|
72
|
-
command = commandText;
|
|
73
|
-
const [cmd, ...args] = splitCommand(commandText);
|
|
74
|
-
if (!cmd)
|
|
75
|
-
throw new Error(`No update command is configured for ${host.name}.`);
|
|
76
|
-
const result = runCommand(cmd, args, 120_000);
|
|
77
|
-
message = result.ok ? `${host.name} update command finished.` : `${host.name} update exited ${result.status ?? "?"}: ${result.output || "no output"}`;
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
case "host.installSkill": {
|
|
81
|
-
const host = this.requireHost(input.host);
|
|
82
|
-
const result = installBundledSkill(host);
|
|
83
|
-
message = result.destination ? `${result.message} ${result.destination}` : result.message;
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
case "host.saveToken": {
|
|
87
|
-
const host = normalizeHost(requiredString(input.payload?.host ?? input.host, "host"));
|
|
88
|
-
if (host !== "codex")
|
|
89
|
-
throw new Error("Token storage is currently only wired for Codex.");
|
|
90
|
-
const token = requiredString(input.payload?.token, "token");
|
|
91
|
-
const config = loadConfig();
|
|
92
|
-
saveConfig(setHostToken({ ...config, apiBase: this.apiBase() }, host, token));
|
|
93
|
-
message = "Saved Codex Agent Rooms bearer token locally.";
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
case "host.clearToken": {
|
|
97
|
-
const host = normalizeHost(requiredString(input.payload?.host ?? input.host, "host"));
|
|
98
|
-
const config = loadConfig();
|
|
99
|
-
saveConfig(setHostToken({ ...config, apiBase: this.apiBase() }, host, null));
|
|
100
|
-
message = `Cleared stored token for ${host}.`;
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
case "listener.start": {
|
|
104
|
-
await this.runtime.start();
|
|
105
|
-
message = "Listener started.";
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
case "listener.stop": {
|
|
109
|
-
await this.runtime.stop();
|
|
110
|
-
message = "Listener stopped.";
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
113
|
-
case "listener.restart": {
|
|
114
|
-
await this.runtime.restart("Soft-reloading listener state.");
|
|
115
|
-
message = "Listener restarted.";
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
case "dashboard.update": {
|
|
119
|
-
// Spec3 §15.7 hot-handoff: drain in-flight runs FIRST (no hard kill), then
|
|
120
|
-
// pull the new package. A Node process can't hot-swap its own code, so the
|
|
121
|
-
// human restarts to load it — but no working agent was ever killed.
|
|
122
|
-
const drain = await this.runtime.drain();
|
|
123
|
-
command = "npm install -g agent-rooms@latest";
|
|
124
|
-
const result = runCommand("npm", ["install", "-g", "agent-rooms@latest"], 180_000);
|
|
125
|
-
if (!result.ok) {
|
|
126
|
-
this.runtime.resumeFromDrain();
|
|
127
|
-
message = `Update failed (exit ${result.status ?? "?"}); resumed serving without restarting. ${result.output.slice(0, 240)}`;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
message = drain.drained
|
|
131
|
-
? "Updated agent-rooms. In-flight runs finished cleanly — restart the dashboard (Ctrl-C, then re-run) to load the new version."
|
|
132
|
-
: `Updated, but ${drain.remaining} run(s) were still active at the drain timeout. Restart the dashboard to load the new version.`;
|
|
133
|
-
}
|
|
134
|
-
break;
|
|
135
|
-
}
|
|
136
|
-
case "config.binding.save": {
|
|
137
|
-
message = this.saveBinding(input.payload ?? {});
|
|
138
|
-
await this.reloadIfRunning("Soft-reloaded listener after binding change.");
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
case "config.binding.remove": {
|
|
142
|
-
message = this.removeBinding(input.payload ?? {});
|
|
143
|
-
await this.reloadIfRunning("Soft-reloaded listener after removing a binding.");
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
case "agent.pause": {
|
|
147
|
-
message = this.setPaused(input.payload ?? {}, true);
|
|
148
|
-
await this.reloadIfRunning("Soft-reloaded listener after pausing an agent.");
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
case "agent.resume": {
|
|
152
|
-
message = this.setPaused(input.payload ?? {}, false);
|
|
153
|
-
await this.reloadIfRunning("Soft-reloaded listener after resuming an agent.");
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
case "open.url": {
|
|
157
|
-
const url = String(input.payload?.url ?? "");
|
|
158
|
-
if (!/^https?:\/\//.test(url))
|
|
159
|
-
throw new Error("Invalid URL.");
|
|
160
|
-
openExternal(url);
|
|
161
|
-
message = `Opened ${url}`;
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
case "manual.command": {
|
|
165
|
-
command = String(input.payload?.command ?? "");
|
|
166
|
-
message = "Manual command shown.";
|
|
167
|
-
break;
|
|
168
|
-
}
|
|
169
|
-
default:
|
|
170
|
-
throw new Error(`Unknown action: ${input.action}`);
|
|
171
|
-
}
|
|
172
|
-
this.addActivity({ at: Date.now(), level: "info", message, type: input.action });
|
|
173
|
-
const snapshot = this.snapshot();
|
|
174
|
-
this.notify();
|
|
175
|
-
return { ok: true, message, snapshot, command };
|
|
176
|
-
}
|
|
177
|
-
apiBase() {
|
|
178
|
-
return this.apiBaseOverride || loadConfig().apiBase;
|
|
179
|
-
}
|
|
180
|
-
async pollPair() {
|
|
181
|
-
if (!this.pendingPair) {
|
|
182
|
-
return "No active pairing request.";
|
|
183
|
-
}
|
|
184
|
-
const poll = await pairPoll(this.apiBase(), this.pendingPair.device_code);
|
|
185
|
-
if ("device_id" in poll) {
|
|
186
|
-
const config = loadConfig();
|
|
187
|
-
saveConfig({ ...config, apiBase: this.apiBase(), device: { id: poll.device_id, token: poll.refresh_credential } });
|
|
188
|
-
this.pendingPair = null;
|
|
189
|
-
return "Device paired.";
|
|
190
|
-
}
|
|
191
|
-
if (poll.status === "expired") {
|
|
192
|
-
this.pendingPair = null;
|
|
193
|
-
return "Pairing code expired. Start pairing again.";
|
|
194
|
-
}
|
|
195
|
-
return `Still waiting for approval. Code: ${this.pendingPair.user_code}`;
|
|
196
|
-
}
|
|
197
|
-
saveBinding(payload) {
|
|
198
|
-
const agent = requiredString(payload.agent, "agent");
|
|
199
|
-
const workspace = resolve(requiredString(payload.workspace, "workspace"));
|
|
200
|
-
const host = normalizeHost(requiredString(payload.host, "host"));
|
|
201
|
-
if (!getAdapter(host)) {
|
|
202
|
-
throw new Error(`Unsupported host: ${host}`);
|
|
203
|
-
}
|
|
204
|
-
const rooms = parseRooms(requiredString(payload.rooms, "rooms"));
|
|
205
|
-
if (rooms.length === 0) {
|
|
206
|
-
throw new Error("At least one room id is required.");
|
|
207
|
-
}
|
|
208
|
-
const config = loadConfig();
|
|
209
|
-
const next = upsertBinding({ ...config, apiBase: this.apiBase() }, { agent, workspace, host, rooms });
|
|
210
|
-
saveConfig(next);
|
|
211
|
-
return `Bound ${agent} to ${workspace}.`;
|
|
212
|
-
}
|
|
213
|
-
removeBinding(payload) {
|
|
214
|
-
const agent = requiredString(payload.agent, "agent");
|
|
215
|
-
const workspace = resolve(requiredString(payload.workspace, "workspace"));
|
|
216
|
-
const config = loadConfig();
|
|
217
|
-
const next = removeBinding({ ...config, apiBase: this.apiBase() }, agent, workspace);
|
|
218
|
-
saveConfig(next);
|
|
219
|
-
return `Removed binding for ${agent}.`;
|
|
220
|
-
}
|
|
221
|
-
setPaused(payload, paused) {
|
|
222
|
-
const agent = requiredString(payload.agent, "agent");
|
|
223
|
-
const config = loadConfig();
|
|
224
|
-
saveConfig(setAgentPaused({ ...config, apiBase: this.apiBase() }, agent, paused));
|
|
225
|
-
return paused ? `Paused ${agent}.` : `Resumed ${agent}.`;
|
|
226
|
-
}
|
|
227
|
-
async reloadIfRunning(message) {
|
|
228
|
-
if (this.runtime.snapshot().running) {
|
|
229
|
-
await this.runtime.restart(message);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
requireHost(host) {
|
|
233
|
-
const adapter = getAdapter(host ?? "unknown");
|
|
234
|
-
if (!adapter) {
|
|
235
|
-
throw new Error(`Unsupported host: ${String(host)}`);
|
|
236
|
-
}
|
|
237
|
-
return adapter;
|
|
238
|
-
}
|
|
239
|
-
addActivity(event) {
|
|
240
|
-
this.activity.push(event);
|
|
241
|
-
if (this.activity.length > 200)
|
|
242
|
-
this.activity = this.activity.slice(-200);
|
|
243
|
-
this.notify();
|
|
244
|
-
}
|
|
245
|
-
notify() {
|
|
246
|
-
for (const fn of this.subscribers)
|
|
247
|
-
fn();
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
export async function serveDashboard(options = {}) {
|
|
251
|
-
const token = randomBytes(24).toString("base64url");
|
|
252
|
-
const controller = new DashboardController(options.apiBase);
|
|
253
|
-
const clients = new Set();
|
|
254
|
-
const host = options.host || "127.0.0.1";
|
|
255
|
-
const port = options.port ?? 0;
|
|
256
|
-
const server = createServer((req, res) => {
|
|
257
|
-
void routeRequest({ req, res, token, controller, clients });
|
|
258
|
-
});
|
|
259
|
-
server.headersTimeout = 60_000;
|
|
260
|
-
server.requestTimeout = 120_000;
|
|
261
|
-
controller.subscribe(() => {
|
|
262
|
-
const data = `data: ${JSON.stringify(controller.snapshot())}\n\n`;
|
|
263
|
-
for (const client of clients)
|
|
264
|
-
client.write(data);
|
|
265
|
-
});
|
|
266
|
-
await new Promise((resolveListen, reject) => {
|
|
267
|
-
server.once("error", reject);
|
|
268
|
-
server.listen(port, host, () => {
|
|
269
|
-
server.off("error", reject);
|
|
270
|
-
resolveListen();
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
const address = server.address();
|
|
274
|
-
const actualPort = typeof address === "object" && address ? address.port : port;
|
|
275
|
-
const url = `http://${host}:${actualPort}/?token=${encodeURIComponent(token)}`;
|
|
276
|
-
if (options.open !== false) {
|
|
277
|
-
openExternal(url);
|
|
278
|
-
}
|
|
279
|
-
return { server, controller, url, token };
|
|
280
|
-
}
|
|
281
|
-
async function routeRequest(input) {
|
|
282
|
-
const { req, res, token, controller, clients } = input;
|
|
283
|
-
const url = new URL(req.url || "/", "http://127.0.0.1");
|
|
284
|
-
if (!validHost(req)) {
|
|
285
|
-
sendText(res, 403, "Blocked a request from outside this machine.");
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
// §5.2: reject cross-origin requests. With the Host check above this closes the
|
|
289
|
-
// DNS-rebinding hole and stops any foreign web page from driving the dashboard
|
|
290
|
-
// (#33, #34) even if it somehow learned the token. Top-level navigations omit
|
|
291
|
-
// Origin and are allowed; the token still gates them.
|
|
292
|
-
if (!validOrigin(req)) {
|
|
293
|
-
sendText(res, 403, "Blocked a cross-origin request.");
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
if (url.pathname === "/" && req.method === "GET") {
|
|
297
|
-
// §4.1: the launch URL carries the token once to bootstrap; we set it as an
|
|
298
|
-
// HttpOnly cookie and serve the page. Every subsequent (incl. state-changing)
|
|
299
|
-
// request authenticates via the cookie/header — never the query string — so
|
|
300
|
-
// the token stops riding URLs, logs, and history.
|
|
301
|
-
if (!authorized(req, url, token, true))
|
|
302
|
-
return sendText(res, 403, "Missing or invalid dashboard token.");
|
|
303
|
-
sendHtml(res, dashboardHtml(), token);
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
if (url.pathname === "/api/readiness" && req.method === "GET") {
|
|
307
|
-
if (!authorized(req, url, token))
|
|
308
|
-
return sendJson(res, 403, { error: "Missing or invalid dashboard token." });
|
|
309
|
-
sendJson(res, 200, controller.snapshot());
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
if (url.pathname === "/api/events" && req.method === "GET") {
|
|
313
|
-
if (!authorized(req, url, token))
|
|
314
|
-
return sendText(res, 403, "Missing or invalid dashboard token.");
|
|
315
|
-
res.writeHead(200, {
|
|
316
|
-
"content-type": "text/event-stream",
|
|
317
|
-
"cache-control": "no-cache, no-transform",
|
|
318
|
-
connection: "keep-alive",
|
|
319
|
-
"x-accel-buffering": "no"
|
|
320
|
-
});
|
|
321
|
-
res.write(`data: ${JSON.stringify(controller.snapshot())}\n\n`);
|
|
322
|
-
clients.add(res);
|
|
323
|
-
req.on("close", () => clients.delete(res));
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
if (url.pathname === "/api/actions" && req.method === "POST") {
|
|
327
|
-
if (!authorized(req, url, token))
|
|
328
|
-
return sendJson(res, 403, { error: "Missing or invalid dashboard token." });
|
|
329
|
-
try {
|
|
330
|
-
const body = await readBody(req);
|
|
331
|
-
const result = await controller.action(JSON.parse(body || "{}"));
|
|
332
|
-
sendJson(res, 200, result);
|
|
333
|
-
}
|
|
334
|
-
catch (error) {
|
|
335
|
-
sendJson(res, 400, { error: error.message, snapshot: controller.snapshot() });
|
|
336
|
-
}
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
sendJson(res, 404, { error: "Not found." });
|
|
340
|
-
}
|
|
341
|
-
// §4.1: header or cookie are the ongoing auth. The query-string token is only
|
|
342
|
-
// honored on the bootstrap GET "/" (allowQuery) so it never authorizes an
|
|
343
|
-
// /api/* call — keeping the secret out of URLs for every state-changing request.
|
|
344
|
-
function authorized(req, url, token, allowQuery = false) {
|
|
345
|
-
if (req.headers["x-agent-rooms-token"] === token)
|
|
346
|
-
return true;
|
|
347
|
-
if (cookieToken(req) === token)
|
|
348
|
-
return true;
|
|
349
|
-
if (allowQuery && url.searchParams.get("token") === token)
|
|
350
|
-
return true;
|
|
351
|
-
return false;
|
|
352
|
-
}
|
|
353
|
-
function cookieToken(req) {
|
|
354
|
-
const raw = req.headers.cookie;
|
|
355
|
-
if (!raw)
|
|
356
|
-
return null;
|
|
357
|
-
for (const part of raw.split(";")) {
|
|
358
|
-
const [name, ...rest] = part.trim().split("=");
|
|
359
|
-
if (name === "ar_dash_token")
|
|
360
|
-
return decodeURIComponent(rest.join("="));
|
|
361
|
-
}
|
|
362
|
-
return null;
|
|
363
|
-
}
|
|
364
|
-
function validHost(req) {
|
|
365
|
-
const raw = req.headers.host;
|
|
366
|
-
if (!raw)
|
|
367
|
-
return false;
|
|
368
|
-
const host = raw.toLowerCase();
|
|
369
|
-
return host.startsWith("127.0.0.1:") || host === "127.0.0.1" || host.startsWith("localhost:") || host === "localhost";
|
|
370
|
-
}
|
|
371
|
-
function isLocalHostname(hostname) {
|
|
372
|
-
const h = hostname.toLowerCase();
|
|
373
|
-
return h === "127.0.0.1" || h === "localhost" || h === "[::1]" || h === "::1";
|
|
374
|
-
}
|
|
375
|
-
/** §5.2: same-origin only. Reject any request that a browser marks cross-site or
|
|
376
|
-
* whose Origin isn't localhost. Requests without an Origin (top-level GETs,
|
|
377
|
-
* curl) pass and remain gated by the launch token. */
|
|
378
|
-
function validOrigin(req) {
|
|
379
|
-
const site = req.headers["sec-fetch-site"];
|
|
380
|
-
if (typeof site === "string" && site !== "same-origin" && site !== "same-site" && site !== "none") {
|
|
381
|
-
return false;
|
|
382
|
-
}
|
|
383
|
-
const origin = req.headers.origin;
|
|
384
|
-
if (!origin)
|
|
385
|
-
return true;
|
|
386
|
-
try {
|
|
387
|
-
return isLocalHostname(new URL(origin).hostname);
|
|
388
|
-
}
|
|
389
|
-
catch {
|
|
390
|
-
return false;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
function sendHtml(res, html, cookieToken) {
|
|
394
|
-
const headers = {
|
|
395
|
-
"content-type": "text/html; charset=utf-8",
|
|
396
|
-
"cache-control": "no-store"
|
|
397
|
-
};
|
|
398
|
-
if (cookieToken) {
|
|
399
|
-
// HttpOnly so page scripts can't read it; SameSite=Strict + localhost-only
|
|
400
|
-
// binding means it never travels to another origin.
|
|
401
|
-
headers["set-cookie"] = `ar_dash_token=${encodeURIComponent(cookieToken)}; HttpOnly; SameSite=Strict; Path=/`;
|
|
402
|
-
}
|
|
403
|
-
res.writeHead(200, headers);
|
|
404
|
-
res.end(html);
|
|
405
|
-
}
|
|
406
|
-
function sendText(res, status, text) {
|
|
407
|
-
res.writeHead(status, {
|
|
408
|
-
"content-type": "text/plain; charset=utf-8",
|
|
409
|
-
"cache-control": "no-store"
|
|
410
|
-
});
|
|
411
|
-
res.end(text);
|
|
412
|
-
}
|
|
413
|
-
function sendJson(res, status, body) {
|
|
414
|
-
res.writeHead(status, {
|
|
415
|
-
"content-type": "application/json; charset=utf-8",
|
|
416
|
-
"cache-control": "no-store"
|
|
417
|
-
});
|
|
418
|
-
res.end(JSON.stringify(body));
|
|
419
|
-
}
|
|
420
|
-
function readBody(req) {
|
|
421
|
-
return new Promise((resolveBody, reject) => {
|
|
422
|
-
let body = "";
|
|
423
|
-
req.setEncoding("utf8");
|
|
424
|
-
req.on("data", (chunk) => {
|
|
425
|
-
body += chunk;
|
|
426
|
-
if (body.length > 1_000_000) {
|
|
427
|
-
reject(new Error("Request body too large."));
|
|
428
|
-
req.destroy();
|
|
429
|
-
}
|
|
430
|
-
});
|
|
431
|
-
req.on("end", () => resolveBody(body));
|
|
432
|
-
req.on("error", reject);
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
function runCommand(command, args, timeout = 30_000) {
|
|
436
|
-
const result = spawnSync(command, args, {
|
|
437
|
-
encoding: "utf8",
|
|
438
|
-
timeout,
|
|
439
|
-
shell: process.platform === "win32",
|
|
440
|
-
stdio: "pipe"
|
|
441
|
-
});
|
|
442
|
-
return {
|
|
443
|
-
ok: result.status === 0,
|
|
444
|
-
status: result.status,
|
|
445
|
-
output: `${result.stdout ?? ""}${result.stderr ?? ""}`.trim().slice(0, 4000)
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
function splitCommand(command) {
|
|
449
|
-
const parts = command.match(/"[^"]+"|'[^']+'|\S+/g) ?? [];
|
|
450
|
-
return parts.map((part) => part.replace(/^["']|["']$/g, ""));
|
|
451
|
-
}
|
|
452
|
-
function openExternal(target) {
|
|
453
|
-
const child = process.platform === "win32"
|
|
454
|
-
? spawn("cmd", ["/c", "start", "", target], { detached: true, stdio: "ignore", windowsHide: true })
|
|
455
|
-
: process.platform === "darwin"
|
|
456
|
-
? spawn("open", [target], { detached: true, stdio: "ignore" })
|
|
457
|
-
: spawn("xdg-open", [target], { detached: true, stdio: "ignore" });
|
|
458
|
-
child.unref();
|
|
459
|
-
}
|
|
460
|
-
function requiredString(value, field) {
|
|
461
|
-
if (typeof value !== "string" || !value.trim()) {
|
|
462
|
-
throw new Error(`${field} is required.`);
|
|
463
|
-
}
|
|
464
|
-
return value.trim();
|
|
465
|
-
}
|
|
466
|
-
function normalizeHost(value) {
|
|
467
|
-
const host = value.trim().toLowerCase();
|
|
468
|
-
if (host === "claude")
|
|
469
|
-
return "claude_code";
|
|
470
|
-
return host;
|
|
471
|
-
}
|
|
472
|
-
function parseRooms(value) {
|
|
473
|
-
return value.split(/[,\s]+/).map((item) => item.trim()).filter(Boolean);
|
|
474
|
-
}
|
|
475
|
-
//# sourceMappingURL=server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAA8B,MAAM,cAAc,CAAC;AAC9I,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAA6B,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAA2B,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAyBxC,MAAM,OAAO,mBAAmB;IAMV;IALZ,OAAO,CAAkB;IACzB,QAAQ,GAA2B,EAAE,CAAC;IACtC,WAAW,GAAuB,IAAI,CAAC;IACvC,WAAW,GAAG,IAAI,GAAG,EAAc,CAAC;IAE5C,YAAoB,eAAwB;QAAxB,oBAAe,GAAf,eAAe,CAAS;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC;YACjC,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO;YACL,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC;YACxE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,EAAc;QACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAA6E;QACxF,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,IAAI,OAA2B,CAAC;QAEhC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACrC,OAAO,GAAG,0BAA0B,KAAK,CAAC,SAAS,EAAE,CAAC;gBACtD,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9C,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,yCAAyC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;oBAClF,CAAC,CAAC,oCAAoC,IAAI,CAAC,IAAI,GAAG;oBAClD,CAAC,CAAC,sBAAsB,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBAClF,MAAM;YACR,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAChF,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;gBAChE,IAAI,CAAC,WAAW;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBACvF,OAAO,GAAG,WAAW,CAAC;gBACtB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC/E,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC9C,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,2BAA2B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,kBAAkB,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBACtJ,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC1F,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,IAAI,GAAG,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtF,IAAI,IAAI,KAAK,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBAC1F,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC9E,OAAO,GAAG,+CAA+C,CAAC;gBAC1D,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,IAAI,GAAG,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC7E,OAAO,GAAG,4BAA4B,IAAI,GAAG,CAAC;gBAC9C,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3B,OAAO,GAAG,mBAAmB,CAAC;gBAC9B,MAAM;YACR,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC1B,OAAO,GAAG,mBAAmB,CAAC;gBAC9B,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;gBAC7D,OAAO,GAAG,qBAAqB,CAAC;gBAChC,MAAM;YACR,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,2EAA2E;gBAC3E,2EAA2E;gBAC3E,oEAAoE;gBACpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzC,OAAO,GAAG,mCAAmC,CAAC;gBAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;oBAC/B,OAAO,GAAG,uBAAuB,MAAM,CAAC,MAAM,IAAI,GAAG,0CAA0C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/H,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,KAAK,CAAC,OAAO;wBACrB,CAAC,CAAC,6HAA6H;wBAC/H,CAAC,CAAC,gBAAgB,KAAK,CAAC,SAAS,gGAAgG,CAAC;gBACtI,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,IAAI,CAAC,eAAe,CAAC,8CAA8C,CAAC,CAAC;gBAC3E,MAAM;YACR,CAAC;YACD,KAAK,uBAAuB,CAAC,CAAC,CAAC;gBAC7B,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,IAAI,CAAC,eAAe,CAAC,kDAAkD,CAAC,CAAC;gBAC/E,MAAM;YACR,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;gBACpD,MAAM,IAAI,CAAC,eAAe,CAAC,gDAAgD,CAAC,CAAC;gBAC7E,MAAM;YACR,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,IAAI,CAAC,eAAe,CAAC,iDAAiD,CAAC,CAAC;gBAC9E,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC/D,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;gBAC1B,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC/C,OAAO,GAAG,uBAAuB,CAAC;gBAClC,MAAM;YACR,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;IAEO,OAAO;QACb,OAAO,IAAI,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO,4BAA4B,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1E,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACnH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO,4CAA4C,CAAC;QACtD,CAAC;QACD,OAAO,qCAAqC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;IAC3E,CAAC;IAEO,WAAW,CAAC,OAAgC;QAClD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAW,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9G,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,SAAS,KAAK,OAAO,SAAS,GAAG,CAAC;IAC3C,CAAC;IAEO,aAAa,CAAC,OAAgC;QACpD,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACrF,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,uBAAuB,KAAK,GAAG,CAAC;IACzC,CAAC;IAEO,SAAS,CAAC,OAAgC,EAAE,MAAe;QACjE,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,UAAU,CAAC,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,OAAe;QAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAA0B;QAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,WAAW,CAAC,KAA2B;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEO,MAAM;QACZ,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW;YAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAiC,EAAE;IACtE,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAa,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,KAAK,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC;IAC/B,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC;IAEhC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;QACxB,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,aAAa,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,UAAU,WAAW,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,YAAY,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAM3B;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAExD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,8CAA8C,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,gFAAgF;IAChF,+EAA+E;IAC/E,8EAA8E;IAC9E,sDAAsD;IACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACjD,4EAA4E;QAC5E,8EAA8E;QAC9E,4EAA4E;QAC5E,kDAAkD;QAClD,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,qCAAqC,CAAC,CAAC;QACzG,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;QAC9G,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,qCAAqC,CAAC,CAAC;QACnG,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,wBAAwB;YACzC,UAAU,EAAE,YAAY;YACxB,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAA2E,CAAC,CAAC;YAC3I,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,iFAAiF;AACjF,SAAS,UAAU,CAAC,GAAoB,EAAE,GAAQ,EAAE,KAAa,EAAE,UAAU,GAAG,KAAK;IACnF,IAAI,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,UAAU,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB;IACvC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,eAAe;YAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,GAAoB;IACrC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC;AACxH,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AAChF,CAAC;AAED;;uDAEuD;AACvD,SAAS,WAAW,CAAC,GAAoB;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,IAAY,EAAE,WAAoB;IACvE,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,0BAA0B;QAC1C,eAAe,EAAE,UAAU;KAC5B,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,2EAA2E;QAC3E,oDAAoD;QACpD,OAAO,CAAC,YAAY,CAAC,GAAG,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,qCAAqC,CAAC;IAChH,CAAC;IACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY;IACjE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,2BAA2B;QAC3C,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAClE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,iCAAiC;QACjD,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAoB;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE;QACzC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC;YACd,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBAC7C,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAAc,EAAE,OAAO,GAAG,MAAM;IACnE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACtC,QAAQ,EAAE,MAAM;QAChB,OAAO;QACP,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IAC1D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QACxC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACnG,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC7B,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YAC9D,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAC5C,OAAO,IAAgB,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC"}
|