@0xmaxma/claude-gateway 1.4.5 → 1.4.7
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 +18 -2
- package/dist/api/gateway-router.d.ts +56 -7
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +287 -53
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/ui/web-ui.d.ts +8 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +117 -14
- package/dist/ui/web-ui.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -320,6 +320,22 @@ Recovery actions are clamped to a per-stage whitelist and a per-turn budget, and
|
|
|
320
320
|
|
|
321
321
|
Network interface the HTTP/WebSocket server binds to. Defaults to `127.0.0.1` (localhost-only), so the dashboard and API are **not** exposed to the local network out of the box. Set to `0.0.0.0` to listen on all interfaces (for example when a containerized reverse proxy needs to reach the gateway). The `GATEWAY_BIND` environment variable, when set, takes precedence over this field.
|
|
322
322
|
|
|
323
|
+
> **⚠️ Binding to `0.0.0.0`? Configure an admin key in `gateway.api.keys`.** The
|
|
324
|
+
> monitoring surface (`/status`, `/processes`) and the dashboard require an
|
|
325
|
+
> **admin** API key (`admin: true`) or a dashboard session when keys are
|
|
326
|
+
> configured — a scoped or write-only key is rejected (`401`), because the
|
|
327
|
+
> dashboard grants cross-agent, host-wide power (including PTY keystroke injection
|
|
328
|
+
> into any session). The dashboard prompts for an admin key at `/dashboard` and
|
|
329
|
+
> stores an `HttpOnly` session cookie (issued only to an admin key). `/health`
|
|
330
|
+
> stays public but returns only `{"status":"ok"}` (no agent ids). With **no** keys
|
|
331
|
+
> configured the gateway **fails closed on a non-loopback bind**: `/status`,
|
|
332
|
+
> `/processes`, and `/dashboard` return `503` until you set `gateway.api.keys`
|
|
333
|
+
> (a startup warning is logged); if keys are set but **none is admin**, the
|
|
334
|
+
> dashboard is inaccessible and a startup warning is logged. On a loopback bind
|
|
335
|
+
> they stay open, so local keyless installs are unaffected. The gateway serves
|
|
336
|
+
> plain HTTP; put TLS in
|
|
337
|
+
> front (reverse proxy) so credentials are not sent in the clear.
|
|
338
|
+
|
|
323
339
|
```json
|
|
324
340
|
{
|
|
325
341
|
"gateway": {
|
|
@@ -336,8 +352,8 @@ The dashboard's **Terminal Viewer** opens read-only (a live mirror of the PTY).
|
|
|
336
352
|
|
|
337
353
|
Because interactive mode turns a read-only view into a remote-write surface, access is protected upstream rather than by a feature flag:
|
|
338
354
|
|
|
339
|
-
- **Authentication** — the WebSocket requires a valid dashboard ticket or API key.
|
|
340
|
-
- **`gateway.bind`** — the gateway binds to `127.0.0.1` (localhost) by default, so the dashboard is not reachable from the network out of the box.
|
|
355
|
+
- **Authentication** — the WebSocket requires a valid dashboard ticket or **admin** API key. The ticket is minted at `POST /api/v1/pty-stream-ticket`, which itself requires an admin API key or a valid dashboard session cookie — so an unauthenticated (or non-admin) caller cannot obtain one. The dashboard gets its session by logging in with an admin key at `/dashboard` (`HttpOnly` cookie); no token is embedded in the page.
|
|
356
|
+
- **`gateway.bind`** — the gateway binds to `127.0.0.1` (localhost) by default, so the dashboard is not reachable from the network out of the box. On a non-loopback bind (`0.0.0.0`), configure an admin key in `gateway.api.keys` so the dashboard and monitoring endpoints require an admin credential, and prefer a TLS-terminating reverse proxy so credentials are not sent in the clear.
|
|
341
357
|
|
|
342
358
|
Inbound frames are always bounded (text-only, size-capped) and are dropped for headless sessions (no PTY).
|
|
343
359
|
|
|
@@ -33,9 +33,15 @@ export declare class GatewayRouter {
|
|
|
33
33
|
/** Short-lived WS auth tickets: ticket → { agentId, sessionId, expiresAt }. One-time use. */
|
|
34
34
|
private readonly ptyStreamTickets;
|
|
35
35
|
private ticketPruner;
|
|
36
|
-
/**
|
|
37
|
-
*
|
|
36
|
+
/** Dashboard session tokens (DASH_SESSION_TTL_MS). Issued at POST /dashboard/login
|
|
37
|
+
* and carried by the HttpOnly `dash_session` cookie — never embedded in the HTML,
|
|
38
|
+
* so no token is exposed to view-source/XSS. token → expiresAt. */
|
|
38
39
|
private readonly dashboardTokens;
|
|
40
|
+
/** Failed-login throttle for /dashboard/login, keyed by client IP.
|
|
41
|
+
* ip → { count, resetAt }. Blocks brute-forcing configured API keys. */
|
|
42
|
+
private readonly loginAttempts;
|
|
43
|
+
private static readonly LOGIN_MAX_ATTEMPTS;
|
|
44
|
+
private static readonly LOGIN_WINDOW_MS;
|
|
39
45
|
/** Per-agent message counters (output lines from subprocess) */
|
|
40
46
|
private readonly messagesReceived;
|
|
41
47
|
private readonly messagesSent;
|
|
@@ -58,6 +64,48 @@ export declare class GatewayRouter {
|
|
|
58
64
|
private readonly appInstaller?;
|
|
59
65
|
private readonly appRegistryClient?;
|
|
60
66
|
constructor(agents: Map<string, AgentRunner>, configs: Map<string, AgentConfig>, schedulers?: Map<string, CronScheduler>, gatewayConfig?: GatewayConfig, cronManager?: CronManager, configPath?: string, appsRegistry?: AppsRegistry, appInstaller?: AppInstaller, appRegistryClient?: RegistryClient);
|
|
67
|
+
/** Configured API keys ([] when none set — auth is then disabled/open). */
|
|
68
|
+
private get apiKeys();
|
|
69
|
+
/** Extract a Bearer / X-Api-Key token from request headers. */
|
|
70
|
+
private extractApiToken;
|
|
71
|
+
/**
|
|
72
|
+
* True when the resolved bind interface is NOT loopback — i.e. the gateway is
|
|
73
|
+
* reachable from beyond the local host. Used to fail closed: a keyless install
|
|
74
|
+
* is safe on localhost but must not expose the dashboard/monitoring surface
|
|
75
|
+
* unauthenticated on a non-loopback bind. Normalizes IPv6 brackets/zone,
|
|
76
|
+
* v4-mapped addresses, and the fully-expanded IPv6 loopback so an unusual but
|
|
77
|
+
* legitimate loopback bind is not mistaken for an exposed one.
|
|
78
|
+
*/
|
|
79
|
+
private isNonLoopbackBind;
|
|
80
|
+
/** True when the request carries a live (unexpired) dashboard session cookie. */
|
|
81
|
+
private hasValidDashSession;
|
|
82
|
+
/**
|
|
83
|
+
* Gate a dashboard-adjacent endpoint: accept an admin API key OR a live
|
|
84
|
+
* dashboard session cookie (which is itself only issued to an admin key). The
|
|
85
|
+
* dashboard grants cross-agent, host-wide power, so a non-admin (scoped or
|
|
86
|
+
* write-only) key is rejected. When no API keys are configured, auth is
|
|
87
|
+
* disabled (open) — a keyless install has no credential to check and must not
|
|
88
|
+
* lock itself out. Writes 401 and returns false when unauthorized.
|
|
89
|
+
*/
|
|
90
|
+
private requireDashOrApiKey;
|
|
91
|
+
/** Client IP for throttling. Uses req.ip (Express; the socket peer unless
|
|
92
|
+
* `trust proxy` is set) with a socket fallback. Behind an untrusted proxy all
|
|
93
|
+
* clients share the proxy IP → a shared throttle, which fails safe. */
|
|
94
|
+
private clientIp;
|
|
95
|
+
/** True when this IP has exceeded the failed-login budget for the window. */
|
|
96
|
+
private isLoginThrottled;
|
|
97
|
+
/** Record a failed login for this IP (starts/extends the current window). */
|
|
98
|
+
private recordLoginFailure;
|
|
99
|
+
/**
|
|
100
|
+
* Build the Set-Cookie value for the dashboard session (Secure when TLS).
|
|
101
|
+
* SameSite=Lax: the cookie is not sent on cross-site subresource requests
|
|
102
|
+
* (fetch/XHR/img) or cross-site POST — so it stays CSRF-safe for the
|
|
103
|
+
* state-changing POST routes (login/logout/pty-ticket) and the read endpoints'
|
|
104
|
+
* cross-site fetches — while still being sent on a top-level navigation to
|
|
105
|
+
* /dashboard, so opening the dashboard from a bookmark or link does not force
|
|
106
|
+
* a re-login (Strict would drop the cookie there).
|
|
107
|
+
*/
|
|
108
|
+
private buildSessionCookie;
|
|
61
109
|
private setupRoutes;
|
|
62
110
|
start(port: number): Promise<void>;
|
|
63
111
|
/**
|
|
@@ -66,11 +114,12 @@ export declare class GatewayRouter {
|
|
|
66
114
|
* (server → browser); inbound keystrokes are opt-in per browser via the Shell
|
|
67
115
|
* Process Viewer's mode toggle (client-side UX), so a viewer only sends bytes
|
|
68
116
|
* while in input mode. Access to this socket is protected upstream: the caller
|
|
69
|
-
* has already authenticated (ticket or API key) and the
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* (
|
|
117
|
+
* has already authenticated (one-time ticket or API key), and the ticket itself
|
|
118
|
+
* is only mintable with an API key or a valid dashboard session — so on a
|
|
119
|
+
* non-loopback `gateway.bind` an unauthenticated caller cannot reach this stream
|
|
120
|
+
* (provided `gateway.api.keys` is configured). Bytes are bounded (text-only,
|
|
121
|
+
* size-capped) and routed to the owning session; a headless session (no PTY)
|
|
122
|
+
* silently drops them (sendInputToSession → false).
|
|
74
123
|
*/
|
|
75
124
|
private attachPtyStreamSocket;
|
|
76
125
|
/** Register a proxy route for an installed app port. Hot-takes effect immediately. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-router.d.ts","sourceRoot":"","sources":["../../src/api/gateway-router.ts"],"names":[],"mappings":"AAAA,OAAO,OAA8B,MAAM,SAAS,CAAC;AASrD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAmB,MAAM,UAAU,CAAC;AAI3F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAQ9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-router.d.ts","sourceRoot":"","sources":["../../src/api/gateway-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,67 @@ const packages_1 = require("./packages");
|
|
|
58
58
|
const webhooks_router_1 = require("./webhooks-router");
|
|
59
59
|
const apps_router_1 = require("./apps-router");
|
|
60
60
|
const APP_NAME_RE = /^[a-z0-9][a-z0-9-]{1,63}$/;
|
|
61
|
+
/** Name of the HttpOnly cookie carrying a dashboard session token. */
|
|
62
|
+
const DASH_SESSION_COOKIE = 'dash_session';
|
|
63
|
+
/** Dashboard session lifetime — long enough to avoid re-login mid-work. */
|
|
64
|
+
const DASH_SESSION_TTL_MS = 8 * 60 * 60 * 1000;
|
|
65
|
+
/**
|
|
66
|
+
* Parse a Cookie request header into a name→value map. Manual parser so we take
|
|
67
|
+
* no new dependency (cookie-parser) just for a single cookie. Values are
|
|
68
|
+
* URL-decoded; malformed segments are skipped.
|
|
69
|
+
*/
|
|
70
|
+
function parseCookies(header) {
|
|
71
|
+
const out = {};
|
|
72
|
+
if (!header)
|
|
73
|
+
return out;
|
|
74
|
+
for (const part of header.split(';')) {
|
|
75
|
+
const eq = part.indexOf('=');
|
|
76
|
+
if (eq < 0)
|
|
77
|
+
continue;
|
|
78
|
+
const name = part.slice(0, eq).trim();
|
|
79
|
+
if (!name)
|
|
80
|
+
continue;
|
|
81
|
+
try {
|
|
82
|
+
out[name] = decodeURIComponent(part.slice(eq + 1).trim());
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
out[name] = part.slice(eq + 1).trim();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Timing-safe comparison of a presented token against the configured API keys.
|
|
92
|
+
* Mirrors createApiAuthMiddleware (auth.ts) so the inline auth on the
|
|
93
|
+
* dashboard-adjacent endpoints is not weaker than the /api middleware.
|
|
94
|
+
*/
|
|
95
|
+
function timingSafeKeyMatch(apiKeys, token) {
|
|
96
|
+
if (!token)
|
|
97
|
+
return false;
|
|
98
|
+
const tokenBuf = Buffer.from(token);
|
|
99
|
+
return apiKeys.some((k) => {
|
|
100
|
+
try {
|
|
101
|
+
const keyBuf = Buffer.from(k.key);
|
|
102
|
+
if (keyBuf.length !== tokenBuf.length)
|
|
103
|
+
return false;
|
|
104
|
+
return crypto.timingSafeEqual(keyBuf, tokenBuf);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Timing-safe match restricted to admin keys (`admin: true`). The dashboard and
|
|
113
|
+
* monitoring surface (session list, process tree, screen, and PTY keystroke
|
|
114
|
+
* injection) grants cross-agent, host-wide power that intentionally transcends a
|
|
115
|
+
* key's `agents` scope — so it requires an admin key, not merely any configured
|
|
116
|
+
* key. A scoped or write-only key must not reach it. Pre-filters to admin keys,
|
|
117
|
+
* then reuses the same timing-safe comparison.
|
|
118
|
+
*/
|
|
119
|
+
function timingSafeAdminKeyMatch(apiKeys, token) {
|
|
120
|
+
return timingSafeKeyMatch(apiKeys.filter((k) => k.admin === true), token);
|
|
121
|
+
}
|
|
61
122
|
function getGatewayVersion() {
|
|
62
123
|
try {
|
|
63
124
|
const pkgPath = path.join(__dirname, '..', '..', 'package.json');
|
|
@@ -81,6 +142,29 @@ function resolveBindHost(envBind, configuredBind) {
|
|
|
81
142
|
const configured = configuredBind?.trim();
|
|
82
143
|
return env || configured || '127.0.0.1';
|
|
83
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* True when a bind host refers to the local loopback interface only. Handles the
|
|
147
|
+
* common spellings: `localhost`, IPv4 loopback (`127.0.0.0/8`), IPv6 loopback
|
|
148
|
+
* (`::1`, its fully-expanded `0:0:...:1`), IPv4-mapped loopback (`::ffff:127.x`),
|
|
149
|
+
* and bracketed / zone-suffixed IPv6 forms. Anything else (`0.0.0.0`, `::`, a
|
|
150
|
+
* real IP, a hostname) is treated as non-loopback = potentially exposed.
|
|
151
|
+
*/
|
|
152
|
+
function isLoopbackHost(bind) {
|
|
153
|
+
let host = (bind ?? '').trim().toLowerCase();
|
|
154
|
+
if (!host)
|
|
155
|
+
return true; // empty resolves to the 127.0.0.1 default upstream
|
|
156
|
+
host = host.replace(/^\[/, '').replace(/\]$/, ''); // strip IPv6 brackets
|
|
157
|
+
host = host.split('%')[0]; // strip IPv6 zone id (fe80::1%eth0)
|
|
158
|
+
if (host.startsWith('::ffff:'))
|
|
159
|
+
host = host.slice(7); // IPv4-mapped IPv6
|
|
160
|
+
if (host === 'localhost')
|
|
161
|
+
return true;
|
|
162
|
+
if (host === '::1' || host === '0:0:0:0:0:0:0:1')
|
|
163
|
+
return true;
|
|
164
|
+
if (/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host))
|
|
165
|
+
return true; // 127.0.0.0/8
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
84
168
|
/** Extract hostname from DOCKER_HOST (tcp://host:port) for app container proxy. */
|
|
85
169
|
function resolveAppProxyHost() {
|
|
86
170
|
const dockerHost = process.env.DOCKER_HOST;
|
|
@@ -130,9 +214,13 @@ class GatewayRouter {
|
|
|
130
214
|
/** Short-lived WS auth tickets: ticket → { agentId, sessionId, expiresAt }. One-time use. */
|
|
131
215
|
this.ptyStreamTickets = new Map();
|
|
132
216
|
this.ticketPruner = null;
|
|
133
|
-
/**
|
|
134
|
-
*
|
|
135
|
-
|
|
217
|
+
/** Dashboard session tokens (DASH_SESSION_TTL_MS). Issued at POST /dashboard/login
|
|
218
|
+
* and carried by the HttpOnly `dash_session` cookie — never embedded in the HTML,
|
|
219
|
+
* so no token is exposed to view-source/XSS. token → expiresAt. */
|
|
220
|
+
this.dashboardTokens = new Map();
|
|
221
|
+
/** Failed-login throttle for /dashboard/login, keyed by client IP.
|
|
222
|
+
* ip → { count, resetAt }. Blocks brute-forcing configured API keys. */
|
|
223
|
+
this.loginAttempts = new Map();
|
|
136
224
|
/** Per-agent message counters (output lines from subprocess) */
|
|
137
225
|
this.messagesReceived = new Map();
|
|
138
226
|
this.messagesSent = new Map();
|
|
@@ -173,6 +261,102 @@ class GatewayRouter {
|
|
|
173
261
|
}
|
|
174
262
|
this.setupRoutes();
|
|
175
263
|
}
|
|
264
|
+
/** Configured API keys ([] when none set — auth is then disabled/open). */
|
|
265
|
+
get apiKeys() {
|
|
266
|
+
return this.gatewayConfig?.gateway?.api?.keys ?? [];
|
|
267
|
+
}
|
|
268
|
+
/** Extract a Bearer / X-Api-Key token from request headers. */
|
|
269
|
+
extractApiToken(req) {
|
|
270
|
+
const authHeader = req.headers['authorization'] ?? '';
|
|
271
|
+
const xApiKey = req.headers['x-api-key'] ?? '';
|
|
272
|
+
return authHeader.startsWith('Bearer ') ? authHeader.slice(7).trim() : xApiKey.trim();
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* True when the resolved bind interface is NOT loopback — i.e. the gateway is
|
|
276
|
+
* reachable from beyond the local host. Used to fail closed: a keyless install
|
|
277
|
+
* is safe on localhost but must not expose the dashboard/monitoring surface
|
|
278
|
+
* unauthenticated on a non-loopback bind. Normalizes IPv6 brackets/zone,
|
|
279
|
+
* v4-mapped addresses, and the fully-expanded IPv6 loopback so an unusual but
|
|
280
|
+
* legitimate loopback bind is not mistaken for an exposed one.
|
|
281
|
+
*/
|
|
282
|
+
isNonLoopbackBind() {
|
|
283
|
+
return !isLoopbackHost(resolveBindHost(process.env.GATEWAY_BIND, this.gatewayConfig?.gateway?.bind));
|
|
284
|
+
}
|
|
285
|
+
/** True when the request carries a live (unexpired) dashboard session cookie. */
|
|
286
|
+
hasValidDashSession(req) {
|
|
287
|
+
const token = parseCookies(req.headers['cookie'])[DASH_SESSION_COOKIE];
|
|
288
|
+
if (!token)
|
|
289
|
+
return false;
|
|
290
|
+
const exp = this.dashboardTokens.get(token) ?? 0;
|
|
291
|
+
return exp > Date.now();
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Gate a dashboard-adjacent endpoint: accept an admin API key OR a live
|
|
295
|
+
* dashboard session cookie (which is itself only issued to an admin key). The
|
|
296
|
+
* dashboard grants cross-agent, host-wide power, so a non-admin (scoped or
|
|
297
|
+
* write-only) key is rejected. When no API keys are configured, auth is
|
|
298
|
+
* disabled (open) — a keyless install has no credential to check and must not
|
|
299
|
+
* lock itself out. Writes 401 and returns false when unauthorized.
|
|
300
|
+
*/
|
|
301
|
+
requireDashOrApiKey(req, res) {
|
|
302
|
+
const keys = this.apiKeys;
|
|
303
|
+
if (keys.length === 0) {
|
|
304
|
+
// No auth configured. Safe on loopback; on a non-loopback bind, refuse
|
|
305
|
+
// rather than expose the monitoring surface unauthenticated (fail closed).
|
|
306
|
+
if (this.isNonLoopbackBind()) {
|
|
307
|
+
res.status(503).json({
|
|
308
|
+
error: 'Dashboard/monitoring disabled: configure gateway.api.keys to expose it on a non-loopback bind (gateway.bind)',
|
|
309
|
+
});
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
return true; // keyless + loopback → open, as before
|
|
313
|
+
}
|
|
314
|
+
if (timingSafeAdminKeyMatch(keys, this.extractApiToken(req)))
|
|
315
|
+
return true;
|
|
316
|
+
if (this.hasValidDashSession(req))
|
|
317
|
+
return true;
|
|
318
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
/** Client IP for throttling. Uses req.ip (Express; the socket peer unless
|
|
322
|
+
* `trust proxy` is set) with a socket fallback. Behind an untrusted proxy all
|
|
323
|
+
* clients share the proxy IP → a shared throttle, which fails safe. */
|
|
324
|
+
clientIp(req) {
|
|
325
|
+
return req.ip || req.socket?.remoteAddress || 'unknown';
|
|
326
|
+
}
|
|
327
|
+
/** True when this IP has exceeded the failed-login budget for the window. */
|
|
328
|
+
isLoginThrottled(req) {
|
|
329
|
+
const rec = this.loginAttempts.get(this.clientIp(req));
|
|
330
|
+
if (!rec || rec.resetAt < Date.now())
|
|
331
|
+
return false;
|
|
332
|
+
return rec.count >= GatewayRouter.LOGIN_MAX_ATTEMPTS;
|
|
333
|
+
}
|
|
334
|
+
/** Record a failed login for this IP (starts/extends the current window). */
|
|
335
|
+
recordLoginFailure(req) {
|
|
336
|
+
const ip = this.clientIp(req);
|
|
337
|
+
const now = Date.now();
|
|
338
|
+
const rec = this.loginAttempts.get(ip);
|
|
339
|
+
if (!rec || rec.resetAt < now) {
|
|
340
|
+
this.loginAttempts.set(ip, { count: 1, resetAt: now + GatewayRouter.LOGIN_WINDOW_MS });
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
rec.count += 1;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Build the Set-Cookie value for the dashboard session (Secure when TLS).
|
|
348
|
+
* SameSite=Lax: the cookie is not sent on cross-site subresource requests
|
|
349
|
+
* (fetch/XHR/img) or cross-site POST — so it stays CSRF-safe for the
|
|
350
|
+
* state-changing POST routes (login/logout/pty-ticket) and the read endpoints'
|
|
351
|
+
* cross-site fetches — while still being sent on a top-level navigation to
|
|
352
|
+
* /dashboard, so opening the dashboard from a bookmark or link does not force
|
|
353
|
+
* a re-login (Strict would drop the cookie there).
|
|
354
|
+
*/
|
|
355
|
+
buildSessionCookie(req, token, ttlMs) {
|
|
356
|
+
const secure = req.secure || req.headers['x-forwarded-proto'] === 'https' ? '; Secure' : '';
|
|
357
|
+
const maxAge = Math.max(0, Math.floor(ttlMs / 1000));
|
|
358
|
+
return `${DASH_SESSION_COOKIE}=${token}; HttpOnly; SameSite=Lax; Path=/; Max-Age=${maxAge}${secure}`;
|
|
359
|
+
}
|
|
176
360
|
setupRoutes() {
|
|
177
361
|
if (process.env.DEV_MODE) {
|
|
178
362
|
process.stderr.write('[gateway] DEV_MODE=1 active — module cache busted on every /dashboard request. Never enable in production.\n');
|
|
@@ -185,31 +369,15 @@ class GatewayRouter {
|
|
|
185
369
|
this.app.use(express_1.default.json());
|
|
186
370
|
// Ephemeral WS ticket — exchange a short-lived token for PTY stream access.
|
|
187
371
|
// MUST be registered before the apiRouter middleware so it handles its own auth
|
|
188
|
-
//
|
|
372
|
+
// without the apiRouter's auth gate intercepting first.
|
|
189
373
|
// The ticket is one-time-use with a 30s TTL so neither the API key nor the
|
|
190
|
-
// dashboard
|
|
191
|
-
// Accepts two credential types:
|
|
374
|
+
// dashboard session appears in WS URLs (server access logs / browser history).
|
|
375
|
+
// Accepts two credential types (via requireDashOrApiKey):
|
|
192
376
|
// • X-Api-Key / Bearer — full API key (programmatic clients)
|
|
193
|
-
// •
|
|
377
|
+
// • dash_session cookie — dashboard session (browser, issued at /dashboard/login)
|
|
194
378
|
this.app.post('/api/v1/pty-stream-ticket', (req, res) => {
|
|
195
|
-
|
|
196
|
-
const authHeader = req.headers['authorization'] ?? '';
|
|
197
|
-
const xApiKey = req.headers['x-api-key'] ?? '';
|
|
198
|
-
const xDashToken = req.headers['x-dash-token'] ?? '';
|
|
199
|
-
const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7).trim() : xApiKey.trim();
|
|
200
|
-
// Validate: API key OR a live dashboard token.
|
|
201
|
-
const now = Date.now();
|
|
202
|
-
const dashExpiry = xDashToken ? (this.dashboardTokens.get(xDashToken) ?? 0) : 0;
|
|
203
|
-
const dashValid = dashExpiry > now;
|
|
204
|
-
if (dashValid) {
|
|
205
|
-
// Dashboard tokens are one-time-use: revoke immediately after auth so a
|
|
206
|
-
// leaked page source can't be replayed (each /dashboard visit gets a fresh one).
|
|
207
|
-
this.dashboardTokens.delete(xDashToken);
|
|
208
|
-
}
|
|
209
|
-
if (!dashValid && (!token || !apiKeys.some((k) => k.key === token))) {
|
|
210
|
-
res.status(401).json({ error: 'Unauthorized' });
|
|
379
|
+
if (!this.requireDashOrApiKey(req, res))
|
|
211
380
|
return;
|
|
212
|
-
}
|
|
213
381
|
const body = req.body ?? {};
|
|
214
382
|
const agentId = body.agentId ?? '';
|
|
215
383
|
const sessionId = body.sessionId ?? '';
|
|
@@ -320,33 +488,84 @@ class GatewayRouter {
|
|
|
320
488
|
proxy.end();
|
|
321
489
|
}
|
|
322
490
|
});
|
|
323
|
-
// Health check
|
|
491
|
+
// Health check — intentionally minimal. Public (no auth) so external liveness
|
|
492
|
+
// probes work when bound to a non-loopback interface, but it leaks nothing:
|
|
493
|
+
// no agent ids, no version, just liveness.
|
|
324
494
|
this.app.get('/health', (_req, res) => {
|
|
325
|
-
res.json({ status: 'ok'
|
|
495
|
+
res.json({ status: 'ok' });
|
|
326
496
|
});
|
|
327
|
-
// Web dashboard
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const dashToken = crypto.randomBytes(16).toString('hex');
|
|
333
|
-
this.dashboardTokens.set(dashToken, Date.now() + 10 * 60 * 1000);
|
|
497
|
+
// Web dashboard. When API keys are configured, require a live dashboard
|
|
498
|
+
// session cookie; otherwise serve the login page (API-key form). Keyless
|
|
499
|
+
// installs have no credential to check, so the dashboard stays open there —
|
|
500
|
+
// matching how the /api routers are only mounted when keys exist.
|
|
501
|
+
this.app.get('/dashboard', (req, res) => {
|
|
334
502
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
503
|
+
if (this.apiKeys.length === 0) {
|
|
504
|
+
// Keyless: open on loopback, but fail closed on a non-loopback bind.
|
|
505
|
+
if (this.isNonLoopbackBind()) {
|
|
506
|
+
res.status(503).send((0, web_ui_1.generateLoginHtml)('Dashboard disabled. Configure gateway.api.keys to enable access on a non-loopback bind (gateway.bind).'));
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
else if (!this.hasValidDashSession(req)) {
|
|
511
|
+
res.send((0, web_ui_1.generateLoginHtml)());
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
335
514
|
if (process.env.DEV_MODE) {
|
|
336
515
|
// Hot-reload: bust module cache so each browser refresh picks up the latest compiled web-ui.js
|
|
337
516
|
const webUiPath = require.resolve('../ui/web-ui');
|
|
338
517
|
delete require.cache[webUiPath];
|
|
339
518
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
340
519
|
const { generateDashboardHtml: fresh } = require('../ui/web-ui');
|
|
341
|
-
res.send(fresh(
|
|
520
|
+
res.send(fresh());
|
|
342
521
|
}
|
|
343
522
|
else {
|
|
344
|
-
res.send((0, web_ui_1.generateDashboardHtml)(
|
|
523
|
+
res.send((0, web_ui_1.generateDashboardHtml)());
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
// Dashboard login — exchange a configured API key for an HttpOnly session
|
|
527
|
+
// cookie (multi-use, 8h). The cookie is never readable by page JS / view-source,
|
|
528
|
+
// so it can safely gate the dashboard reads and the PTY-ticket exchange.
|
|
529
|
+
this.app.post('/dashboard/login', (req, res) => {
|
|
530
|
+
const keys = this.apiKeys;
|
|
531
|
+
if (keys.length === 0) {
|
|
532
|
+
res.status(404).json({ error: 'Auth not configured' });
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
// Throttle brute-force attempts per client IP.
|
|
536
|
+
if (this.isLoginThrottled(req)) {
|
|
537
|
+
res.status(429).json({ error: 'Too many login attempts. Try again later.' });
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
const key = (req.body?.key ?? '').toString();
|
|
541
|
+
// Admin only: the session cookie this issues unlocks cross-agent, host-wide
|
|
542
|
+
// dashboard power, so a valid-but-non-admin key must not obtain one. The 401
|
|
543
|
+
// body stays generic (does not confirm the key exists but lacks admin).
|
|
544
|
+
if (!timingSafeAdminKeyMatch(keys, key)) {
|
|
545
|
+
this.recordLoginFailure(req);
|
|
546
|
+
res.status(401).json({ error: 'Invalid API key' });
|
|
547
|
+
return;
|
|
345
548
|
}
|
|
549
|
+
// Success: clear this IP's failure window.
|
|
550
|
+
this.loginAttempts.delete(this.clientIp(req));
|
|
551
|
+
const token = crypto.randomBytes(32).toString('hex');
|
|
552
|
+
this.dashboardTokens.set(token, Date.now() + DASH_SESSION_TTL_MS);
|
|
553
|
+
res.setHeader('Set-Cookie', this.buildSessionCookie(req, token, DASH_SESSION_TTL_MS));
|
|
554
|
+
res.json({ ok: true });
|
|
555
|
+
});
|
|
556
|
+
// Dashboard logout — revoke the session token and clear the cookie.
|
|
557
|
+
this.app.post('/dashboard/logout', (req, res) => {
|
|
558
|
+
const token = parseCookies(req.headers['cookie'])[DASH_SESSION_COOKIE];
|
|
559
|
+
if (token)
|
|
560
|
+
this.dashboardTokens.delete(token);
|
|
561
|
+
res.setHeader('Set-Cookie', this.buildSessionCookie(req, '', 0));
|
|
562
|
+
res.json({ ok: true });
|
|
346
563
|
});
|
|
347
564
|
// Process tree endpoint — returns raw ps data for dashboard.
|
|
348
565
|
// Async exec + 3s cache: avoids blocking the event loop on every dashboard poll.
|
|
349
|
-
this.app.get('/processes', (
|
|
566
|
+
this.app.get('/processes', (req, res) => {
|
|
567
|
+
if (!this.requireDashOrApiKey(req, res))
|
|
568
|
+
return;
|
|
350
569
|
const now = Date.now();
|
|
351
570
|
if (this.processesCache && now - this.processesCache.ts < GatewayRouter.PROCESSES_CACHE_TTL_MS) {
|
|
352
571
|
res.json({ processes: this.processesCache.data, numCpus: GatewayRouter.NUM_CPUS });
|
|
@@ -376,17 +595,10 @@ class GatewayRouter {
|
|
|
376
595
|
// PTY screen snapshot — plain text, ANSI stripped. For agents that need to
|
|
377
596
|
// observe what is currently displayed in the PTY shell to detect hangs, menu
|
|
378
597
|
// states, or unexpected output without parsing escape codes.
|
|
379
|
-
// Auth: X-Api-Key
|
|
380
|
-
// as this endpoint is intended for programmatic/agent access, not the browser).
|
|
598
|
+
// Auth: X-Api-Key / Bearer (programmatic) OR dashboard session cookie (browser).
|
|
381
599
|
this.app.get('/api/v1/sessions/:sessionId/screen', (req, res) => {
|
|
382
|
-
|
|
383
|
-
const authHeader = req.headers['authorization'] ?? '';
|
|
384
|
-
const xApiKey = req.headers['x-api-key'] ?? '';
|
|
385
|
-
const token = authHeader.startsWith('Bearer ') ? authHeader.slice(7).trim() : xApiKey.trim();
|
|
386
|
-
if (!token || !apiKeys.some((k) => k.key === token)) {
|
|
387
|
-
res.status(401).json({ error: 'Unauthorized' });
|
|
600
|
+
if (!this.requireDashOrApiKey(req, res))
|
|
388
601
|
return;
|
|
389
|
-
}
|
|
390
602
|
const sessionId = req.params['sessionId'] ?? '';
|
|
391
603
|
if (!sessionId) {
|
|
392
604
|
res.status(400).json({ error: 'sessionId is required' });
|
|
@@ -407,7 +619,9 @@ class GatewayRouter {
|
|
|
407
619
|
});
|
|
408
620
|
});
|
|
409
621
|
// Status endpoint — per-agent stats + heartbeat history
|
|
410
|
-
this.app.get('/status', (
|
|
622
|
+
this.app.get('/status', (req, res) => {
|
|
623
|
+
if (!this.requireDashOrApiKey(req, res))
|
|
624
|
+
return;
|
|
411
625
|
const uptimeMs = Date.now() - this.startedAt.getTime();
|
|
412
626
|
const agentsStatus = [...this.agents.entries()].map(([id, runner]) => {
|
|
413
627
|
const scheduler = this.schedulers.get(id);
|
|
@@ -473,6 +687,17 @@ class GatewayRouter {
|
|
|
473
687
|
// are not exposed to the local network out of the box; operators opt into
|
|
474
688
|
// wider exposure via config or the env var (e.g. "0.0.0.0" behind a proxy).
|
|
475
689
|
const host = resolveBindHost(process.env.GATEWAY_BIND, this.gatewayConfig?.gateway?.bind);
|
|
690
|
+
// Fail-closed heads-up: a non-loopback bind with no API keys means the
|
|
691
|
+
// dashboard/monitoring endpoints refuse access (503) until keys are set.
|
|
692
|
+
if (this.isNonLoopbackBind() && this.apiKeys.length === 0) {
|
|
693
|
+
process.stderr.write(`[gateway] WARNING: bound to ${host} with no gateway.api.keys — dashboard/status/processes are DISABLED (503) until you configure API keys. Set gateway.api.keys to enable access.\n`);
|
|
694
|
+
}
|
|
695
|
+
else if (this.isNonLoopbackBind() && !this.apiKeys.some((k) => k.admin === true)) {
|
|
696
|
+
// Keys exist but none is admin: the dashboard requires an admin key, so
|
|
697
|
+
// login/status/processes will reject every configured key (401). Warn so
|
|
698
|
+
// the operator knows why access is refused and marks a key `admin: true`.
|
|
699
|
+
process.stderr.write(`[gateway] WARNING: bound to ${host} with API keys but none is admin — dashboard/status/processes require an admin key, so login will be refused (401). Mark a key "admin": true in gateway.api.keys to enable dashboard access.\n`);
|
|
700
|
+
}
|
|
476
701
|
return new Promise((resolve, reject) => {
|
|
477
702
|
this.server = this.app.listen(port, host, () => {
|
|
478
703
|
resolve();
|
|
@@ -493,7 +718,7 @@ class GatewayRouter {
|
|
|
493
718
|
// *receives* — server → client PTY output is unaffected.
|
|
494
719
|
this.wss = new ws_1.WebSocketServer({ noServer: true, maxPayload: control_channel_1.MAX_PTY_INPUT_BYTES * 8 });
|
|
495
720
|
const apiKeys = this.gatewayConfig?.gateway?.api?.keys ?? [];
|
|
496
|
-
// Prune expired tickets
|
|
721
|
+
// Prune expired tickets, dashboard tokens, and login-throttle windows every 60s.
|
|
497
722
|
this.ticketPruner = setInterval(() => {
|
|
498
723
|
const now = Date.now();
|
|
499
724
|
for (const [k, v] of this.ptyStreamTickets) {
|
|
@@ -504,6 +729,10 @@ class GatewayRouter {
|
|
|
504
729
|
if (exp < now)
|
|
505
730
|
this.dashboardTokens.delete(k);
|
|
506
731
|
}
|
|
732
|
+
for (const [ip, rec] of this.loginAttempts) {
|
|
733
|
+
if (rec.resetAt < now)
|
|
734
|
+
this.loginAttempts.delete(ip);
|
|
735
|
+
}
|
|
507
736
|
}, 60000);
|
|
508
737
|
this.ticketPruner.unref();
|
|
509
738
|
this.server.on('upgrade', (req, socket, head) => {
|
|
@@ -539,12 +768,14 @@ class GatewayRouter {
|
|
|
539
768
|
return;
|
|
540
769
|
}
|
|
541
770
|
// Auth path 2: Bearer token or X-Api-Key header (for non-browser clients).
|
|
771
|
+
// Admin only — this path grants direct PTY keystroke injection into the
|
|
772
|
+
// agent's session, so a non-admin key must not pass.
|
|
542
773
|
const authHeader = req.headers['authorization'] ?? '';
|
|
543
774
|
const xApiKey = req.headers['x-api-key'] ?? '';
|
|
544
775
|
const token = authHeader.startsWith('Bearer ')
|
|
545
776
|
? authHeader.slice(7).trim()
|
|
546
777
|
: xApiKey.trim();
|
|
547
|
-
if (!
|
|
778
|
+
if (!timingSafeAdminKeyMatch(apiKeys, token)) {
|
|
548
779
|
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
|
|
549
780
|
socket.destroy();
|
|
550
781
|
return;
|
|
@@ -574,11 +805,12 @@ class GatewayRouter {
|
|
|
574
805
|
* (server → browser); inbound keystrokes are opt-in per browser via the Shell
|
|
575
806
|
* Process Viewer's mode toggle (client-side UX), so a viewer only sends bytes
|
|
576
807
|
* while in input mode. Access to this socket is protected upstream: the caller
|
|
577
|
-
* has already authenticated (ticket or API key) and the
|
|
578
|
-
*
|
|
579
|
-
*
|
|
580
|
-
*
|
|
581
|
-
* (
|
|
808
|
+
* has already authenticated (one-time ticket or API key), and the ticket itself
|
|
809
|
+
* is only mintable with an API key or a valid dashboard session — so on a
|
|
810
|
+
* non-loopback `gateway.bind` an unauthenticated caller cannot reach this stream
|
|
811
|
+
* (provided `gateway.api.keys` is configured). Bytes are bounded (text-only,
|
|
812
|
+
* size-capped) and routed to the owning session; a headless session (no PTY)
|
|
813
|
+
* silently drops them (sendInputToSession → false).
|
|
582
814
|
*/
|
|
583
815
|
attachPtyStreamSocket(ws, agentId, sessionId) {
|
|
584
816
|
if (!pty_stream_registry_1.ptyStreamRegistry.hasSockets(sessionId)) {
|
|
@@ -709,4 +941,6 @@ GatewayRouter.PROCESSES_CACHE_TTL_MS = 3000;
|
|
|
709
941
|
* calling os.cpus() (a syscall) on every /processes poll. Used to normalize
|
|
710
942
|
* ps per-core %CPU into a 0–100% figure on the dashboard. */
|
|
711
943
|
GatewayRouter.NUM_CPUS = Math.max(1, os.cpus().length);
|
|
944
|
+
GatewayRouter.LOGIN_MAX_ATTEMPTS = 10;
|
|
945
|
+
GatewayRouter.LOGIN_WINDOW_MS = 5 * 60 * 1000;
|
|
712
946
|
//# sourceMappingURL=gateway-router.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-router.js","sourceRoot":"","sources":["../../src/api/gateway-router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gateway-router.js","sourceRoot":"","sources":["../../src/api/gateway-router.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+GA,0CAOC;AAtHD,sDAAqD;AACrD,gDAAkC;AAClC,iDAAqC;AACrC,+CAAiC;AACjC,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,2BAA8D;AAG9D,sEAAiE;AACjE,8DAAoF;AACpF,8CAAoD;AAGpD,yCAAwE;AACxE,qCAA2C;AAC3C,+CAAiD;AACjD,yDAA2D;AAC3D,mDAAqD;AACrD,yCAAkD;AAClD,uDAAyD;AAIzD,+CAAiD;AAGjD,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAEhD,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAC3C,2EAA2E;AAC3E,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/C;;;;GAIG;AACH,SAAS,YAAY,CAAC,MAA0B;IAC9C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,OAAiB,EAAE,KAAa;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YACpD,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,uBAAuB,CAAC,OAAiB,EAAE,KAAa;IAC/D,OAAO,kBAAkB,CACvB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,EACvC,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;QACjF,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,iBAAiB,EAAE,CAAC;AAE5C;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,OAA2B,EAC3B,cAAkC;IAElC,MAAM,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IAC1C,OAAO,GAAG,IAAI,UAAU,IAAI,WAAW,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,IAAwB;IAC9C,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,mDAAmD;IAC3E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;IACzE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oCAAoC;IAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;IACzE,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC9D,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,cAAc;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,mFAAmF;AACnF,SAAS,mBAAmB;IAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC3C,IAAI,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAChC,OAAO,GAAG,CAAC,QAAQ,CAAC;IACtB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAC;AAO7C,oEAAoE;AACpE,MAAM,WAAW;IAAjB;QACmB,YAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAuB3D,CAAC;IArBC,KAAK,CAAC,GAAW,EAAE,YAAoB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;QACrD,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC;QAC/E,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;QACxB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF;AAED,MAAa,aAAa;IAkExB,YACE,MAAgC,EAChC,OAAiC,EACjC,UAAuC,EACvC,aAA6B,EAC7B,WAAyB,EACzB,UAAmB,EACnB,YAA2B,EAC3B,YAA2B,EAC3B,iBAAkC;QAxEpC,2EAA2E;QAC3E,sCAAsC;QACrB,aAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;QACzC,gBAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QAGzC,WAAM,GAAkB,IAAI,CAAC;QAC7B,QAAG,GAA2B,IAAI,CAAC;QAE3C,iFAAiF;QACzE,mBAAc,GAA2C,IAAI,CAAC;QAQtE,6FAA6F;QAC5E,qBAAgB,GAAG,IAAI,GAAG,EAAqE,CAAC;QACzG,iBAAY,GAA0C,IAAI,CAAC;QAEnE;;4EAEoE;QACnD,oBAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE7D;iFACyE;QACxD,kBAAa,GAAG,IAAI,GAAG,EAA8C,CAAC;QAIvF,gEAAgE;QAC/C,qBAAgB,GAAwB,IAAI,GAAG,EAAE,CAAC;QAClD,iBAAY,GAAwB,IAAI,GAAG,EAAE,CAAC;QAE/D,yCAAyC;QACxB,mBAAc,GAAsB,IAAI,GAAG,EAAE,CAAC;QAE/D,2EAA2E;QAC1D,mBAAc,GAAqF,IAAI,GAAG,EAAE,CAAC;QAE9H,gEAAgE;QAC/C,eAAU,GAA+B,IAAI,GAAG,EAAE,CAAC;QAEpE,yBAAyB;QACR,cAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QA2BtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QAErB,2CAA2C;QAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEhC,4EAA4E;YAC5E,IAAI,OAAQ,MAAsC,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;gBACrE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAChE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC1C,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;gBACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,2EAA2E;IAC3E,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;IACtD,CAAC;IAED,+DAA+D;IACvD,eAAe,CAAC,GAAY;QAClC,MAAM,UAAU,GAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAwB,IAAI,EAAE,CAAC;QAC9E,MAAM,OAAO,GAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAwB,IAAI,EAAE,CAAC;QACvE,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACxF,CAAC;IAED;;;;;;;OAOG;IACK,iBAAiB;QACvB,OAAO,CAAC,cAAc,CACpB,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAC7E,CAAC;IACJ,CAAC;IAED,iFAAiF;IACzE,mBAAmB,CAAC,GAAY;QACtC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACK,mBAAmB,CAAC,GAAY,EAAE,GAAa;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,uEAAuE;YACvE,2EAA2E;YAC3E,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,8GAA8G;iBACtH,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,uCAAuC;QACtD,CAAC;QACD,IAAI,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;4EAEwE;IAChE,QAAQ,CAAC,GAAY;QAC3B,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,IAAI,SAAS,CAAC;IAC1D,CAAC;IAED,6EAA6E;IACrE,gBAAgB,CAAC,GAAY;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QACnD,OAAO,GAAG,CAAC,KAAK,IAAI,aAAa,CAAC,kBAAkB,CAAC;IACvD,CAAC;IAED,6EAA6E;IACrE,kBAAkB,CAAC,GAAY;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;QACzF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,kBAAkB,CAAC,GAAY,EAAE,KAAa,EAAE,KAAa;QACnE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,OAAO,GAAG,mBAAmB,IAAI,KAAK,6CAA6C,MAAM,GAAG,MAAM,EAAE,CAAC;IACvG,CAAC;IAEO,WAAW;QACjB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8GAA8G,CAAC,CAAC;QACvI,CAAC;QACD,qEAAqE;QACrE,4EAA4E;QAC5E,yEAAyE;QACzE,2DAA2D;QAC3D,IAAI,CAAC,GAAG,CAAC,GAAG,CACV,WAAW,EACX,IAAA,sCAAoB,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM,CAAC,CACjF,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE7B,4EAA4E;QAC5E,gFAAgF;QAChF,wDAAwD;QACxD,2EAA2E;QAC3E,+EAA+E;QAC/E,0DAA0D;QAC1D,+DAA+D;QAC/D,oFAAoF;QACpF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACzE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAChD,MAAM,IAAI,GAAI,GAAG,CAAC,IAAiD,IAAI,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,uEAAuE;YACvE,qEAAqE;YACrE,qEAAqE;YACrE,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;iBACzE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAM,CAAC;YACtC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,8DAA8D;QAC9D,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,IAAA,wBAAe,EAC/B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EACnC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAClC,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnD,MAAM,eAAe,GAAG,IAAA,wCAAqB,EAC3C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CACpC,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACxC,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,IAAA,kCAAkB,EACrC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EACnC,IAAI,CAAC,MAAM,CACZ,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACnD,MAAM,cAAc,GAAG,IAAA,+BAAoB,EAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACvC,CAAC;QAED,mEAAmE;QACnE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,IAAA,8BAAgB,EACjC,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EACtC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAC7B,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACnC,CAAC;QAED,gEAAgE;QAChE,IACE,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,iBAAiB;YACtB,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAC9C,CAAC;YACD,MAAM,UAAU,GAAG,IAAA,8BAAgB,EACjC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CACpC,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACnC,CAAC;QAED,oEAAoE;QACpE,+DAA+D;QAC/D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACnE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YAED,gBAAgB;YAChB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED,+EAA+E;YAC/E,0FAA0F;YAC1F,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK;gBACrC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;gBACnB,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;YAE7B,MAAM,OAAO,GAAwB;gBACnC,QAAQ,EAAE,cAAc;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;aACrE,CAAC;YAEF,0FAA0F;YAC1F,IAAI,SAA6B,CAAC;YAClC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5E,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3D,OAAO,CAAC,OAAO,GAAG;oBAChB,GAAG,OAAO,CAAC,OAAO;oBAClB,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE;iBAC9C,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC/C,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAC/B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,8EAA8E;QAC9E,4EAA4E;QAC5E,2CAA2C;QAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YACvD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,wEAAwE;QACxE,yEAAyE;QACzE,4EAA4E;QAC5E,kEAAkE;QAClE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACzD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,qEAAqE;gBACrE,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;oBAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAA,0BAAiB,EACpC,wGAAwG,CACzG,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,IAAI,CAAC,IAAA,0BAAiB,GAAE,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACzB,+FAA+F;gBAC/F,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAClD,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAChC,iEAAiE;gBACjE,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,cAAc,CAAkC,CAAC;gBAClG,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,IAAA,8BAAqB,GAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,0EAA0E;QAC1E,iFAAiF;QACjF,yEAAyE;QACzE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YACD,+CAA+C;YAC/C,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,CAAE,GAAG,CAAC,IAAyB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;YACnE,4EAA4E;YAC5E,6EAA6E;YAC7E,wEAAwE;YACxE,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;gBAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,2CAA2C;YAC3C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC,CAAC;YAClE,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACtF,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,oEAAoE;QACpE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACjE,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACvE,IAAI,KAAK;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,6DAA6D;QAC7D,iFAAiF;QACjF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACzD,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBAC/F,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnF,OAAO;YACT,CAAC;YACD,IAAA,oBAAI,EACF,qKAAqK,EACrK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EACnC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBACd,IAAI,GAAG;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;gBACxE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC/E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;oBAC5F,IAAI,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACpB,OAAO;wBACL,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACnB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACpB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;wBACV,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;qBAClB,CAAC;gBACJ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,IAAI,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,2EAA2E;QAC3E,6EAA6E;QAC7E,6DAA6D;QAC7D,iFAAiF;QACjF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,oCAAoC,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACjF,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAEhD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,uCAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8CAA8C,EAAE,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YAED,uCAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,CAAC;oBAC7E,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,wDAAwD;QACxD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACtD,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAEvD,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;gBACnE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM,OAAO,GAAG,SAAS,EAAE,UAAU,EAAE,CAAC;gBACxC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAI,WAAW,EAAE,SAAkC,IAAI,SAAS,CAAC;gBAC/E,KAAK,QAAQ,CAAC,CAAC,kDAAkD;gBAEjE,yCAAyC;gBACzC,MAAM,UAAU,GAAsB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAElE,iDAAiD;gBACjD,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC7C,MAAM,IAAI,GAAG,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;oBAClD,IAAI,CAAC,IAAI;wBAAE,OAAO,IAAI,CAAC;oBACvB,OAAO;wBACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;qBACZ,CAAC;gBACJ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEnB,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjD,qEAAqE;gBACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvD,GAAG,CAAC;oBACJ,YAAY,EAAE,uCAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;iBACxD,CAAC,CAAC,CAAC;gBACJ,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAE1D,uEAAuE;gBACvE,4EAA4E;gBAC5E,+DAA+D;gBAC/D,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAEzF,OAAO;oBACL,EAAE;oBACF,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;oBAC7B,UAAU;oBACV,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;oBACpD,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;oBAC5C,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;oBAChE,YAAY;oBACZ,SAAS,EAAE;wBACT,KAAK,EAAE,SAAS;wBAChB,WAAW;qBACZ;oBACD,QAAQ;iBACT,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACnC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBACvC,OAAO,EAAE,eAAe;gBACxB,0EAA0E;gBAC1E,QAAQ,EAAE,IAAA,0BAAgB,GAAE;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,uEAAuE;QACvE,0EAA0E;QAC1E,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1F,uEAAuE;QACvE,yEAAyE;QACzE,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+BAA+B,IAAI,kJAAkJ,CACtL,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YACnF,wEAAwE;YACxE,yEAAyE;YACzE,0EAA0E;YAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+BAA+B,IAAI,gMAAgM,CACpO,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC7C,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;gBACrD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,gFAAgF,CAAC,CAAC,CAAC;gBAClH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,0EAA0E;YAC1E,4EAA4E;YAC5E,uEAAuE;YACvE,4EAA4E;YAC5E,sEAAsE;YACtE,yDAAyD;YACzD,IAAI,CAAC,GAAG,GAAG,IAAI,oBAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,qCAAmB,GAAG,CAAC,EAAE,CAAC,CAAC;YACxF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;YAE7D,iFAAiF;YACjF,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC3C,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;wBAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzD,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC5C,IAAI,GAAG,GAAG,GAAG;wBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC3C,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG;wBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC,EAAE,KAAM,CAAC,CAAC;YACX,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAE1B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAyB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;gBACpE,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAAC;gBAE7D,yEAAyE;gBACzE,2EAA2E;gBAC3E,oEAAoE;gBACpE,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/C,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;wBAC3C,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;wBAClD,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe;oBAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;oBAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;oBAClC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9B,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;wBAC/C,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,GAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAa,EAAE,EAAE;wBAC3D,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;oBACrD,CAAC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,2EAA2E;gBAC3E,wEAAwE;gBACxE,qDAAqD;gBACrD,MAAM,UAAU,GAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAwB,IAAI,EAAE,CAAC;gBAC9E,MAAM,OAAO,GAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAwB,IAAI,EAAE,CAAC;gBACvE,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC;oBAC5C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC5B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC7C,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;oBAClD,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;oBAC/C,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,2EAA2E;gBAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;oBACjD,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,GAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAa,EAAE,EAAE;oBAC3D,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,qBAAqB,CAAC,EAAa,EAAE,OAAe,EAAE,SAAiB;QAC7E,IAAI,CAAC,uCAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,uCAAiB,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,uCAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,uCAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;QAEnE,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,QAAiB,EAAE,EAAE;YACpD,2EAA2E;YAC3E,2EAA2E;YAC3E,kCAAkC;YAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,IAAA,qCAAmB,EAAC,QAAQ,EAAE,IAAI,CAAC;gBAAE,OAAO;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAE5E,sFAAsF;IACtF,kBAAkB,CAChB,OAAe,EACf,QAAgB,EAChB,IAAY,EACZ,IAAmB,EACnB,SAAiB;QAEjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,gEAAgE;IAChE,qBAAqB,CAAC,OAAe;QACnC,mFAAmF;QACnF,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;QACtF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,eAAe,CAAC,QAAsB;QAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YACvC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,YAAY;YAAE,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,+EAA+E;QAC/E,+EAA+E;QAC/E,4DAA4D;QAC5D,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACtC,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,2EAA2E;YAC3E,8EAA8E;YAC9E,gFAAgF;YAChF,oDAAoD;YACpD,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,2EAA2E;IAE3E;;OAEG;IACH,eAAe,CAAC,KAAa;QAC3B,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACxC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,OAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI;YAAE,OAAO;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE;gBACF,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;gBAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;gBACpD,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC5C,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;aACjE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;;AA/1BH,sCAi2BC;AAn1ByB,oCAAsB,GAAG,IAAK,AAAR,CAAS;AAEvD;;8DAE8D;AACtC,sBAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,AAAhC,CAAiC;AAczC,gCAAkB,GAAG,EAAE,AAAL,CAAM;AACxB,6BAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,AAAhB,CAAiB"}
|
package/dist/ui/web-ui.d.ts
CHANGED
|
@@ -2,5 +2,12 @@
|
|
|
2
2
|
* Generates a self-contained HTML dashboard page for the gateway status UI.
|
|
3
3
|
* No external dependencies except xterm.js CDN for PTY viewer.
|
|
4
4
|
*/
|
|
5
|
-
export declare function generateDashboardHtml(
|
|
5
|
+
export declare function generateDashboardHtml(): string;
|
|
6
|
+
/**
|
|
7
|
+
* Minimal, self-contained login page served at GET /dashboard when API keys are
|
|
8
|
+
* configured and the request has no valid dashboard session cookie. Posts the
|
|
9
|
+
* entered API key to POST /dashboard/login (JSON); on success the server sets the
|
|
10
|
+
* HttpOnly session cookie and we reload into the dashboard. No external deps.
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateLoginHtml(disabledReason?: string): string;
|
|
6
13
|
//# sourceMappingURL=web-ui.d.ts.map
|
package/dist/ui/web-ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-ui.d.ts","sourceRoot":"","sources":["../../src/ui/web-ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"web-ui.d.ts","sourceRoot":"","sources":["../../src/ui/web-ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAq4B9C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,SAAK,GAAG,MAAM,CAiF7D"}
|
package/dist/ui/web-ui.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateDashboardHtml = generateDashboardHtml;
|
|
4
|
+
exports.generateLoginHtml = generateLoginHtml;
|
|
4
5
|
/**
|
|
5
6
|
* Generates a self-contained HTML dashboard page for the gateway status UI.
|
|
6
7
|
* No external dependencies except xterm.js CDN for PTY viewer.
|
|
7
8
|
*/
|
|
8
|
-
function generateDashboardHtml(
|
|
9
|
-
const safeToken = dashToken.replace(/&/g, '&').replace(/"/g, '"');
|
|
9
|
+
function generateDashboardHtml() {
|
|
10
10
|
return `<!DOCTYPE html>
|
|
11
11
|
<html lang="en">
|
|
12
12
|
<head>
|
|
13
13
|
<meta charset="UTF-8">
|
|
14
14
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
15
|
-
<meta name="dash-token" content="${safeToken}">
|
|
16
15
|
<title>Claude Gateway</title>
|
|
17
16
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@6.0.0/css/xterm.min.css"
|
|
18
17
|
integrity="sha384-eDYu/eBZQNhtqTaA7Wl3XighXKxm/9VYF+Chh3hQS+UUlKQIJ14hK2imKu4n99aR" crossorigin="anonymous"/>
|
|
@@ -225,7 +224,7 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
225
224
|
</style>
|
|
226
225
|
</head>
|
|
227
226
|
<body>
|
|
228
|
-
<h1><span class="rainbow">Claude Gateway</span> <span id="gateway-version" style="font-size:0.75rem;color:#718096;"></span> <span id="refresh-indicator">refreshing...</span></h1>
|
|
227
|
+
<h1><span class="rainbow">Claude Gateway</span> <span id="gateway-version" style="font-size:0.75rem;color:#718096;"></span> <span id="refresh-indicator">refreshing...</span> <button id="logout-btn" style="float:right;font-size:0.7rem;background:#2d3748;color:#a0aec0;border:1px solid #4a5568;border-radius:4px;padding:2px 8px;cursor:pointer;">Logout</button></h1>
|
|
229
228
|
<div class="meta">
|
|
230
229
|
Uptime: <span id="uptime">—</span> |
|
|
231
230
|
Started: <span id="started-at">—</span> |
|
|
@@ -291,9 +290,13 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
291
290
|
<script src="https://cdn.jsdelivr.net/npm/@xterm/xterm@6.0.0/lib/xterm.min.js"
|
|
292
291
|
integrity="sha384-pELe6ZHtFxFcuYBq3gMkqvmnNIqUWnAYjBG5gThqQQCjWp8PJ/65MLK4lMIfEK1e" crossorigin="anonymous"></script>
|
|
293
292
|
<script>
|
|
294
|
-
//
|
|
295
|
-
//
|
|
296
|
-
|
|
293
|
+
// Auth is carried by the HttpOnly 'dash_session' cookie the browser sends
|
|
294
|
+
// automatically on every same-origin request — no token is embedded in the
|
|
295
|
+
// page (nothing for view-source/XSS to steal). If any read returns 401 the
|
|
296
|
+
// session has expired or is missing, so bounce to /dashboard (login page).
|
|
297
|
+
function onUnauthorized() {
|
|
298
|
+
window.location.href = apiUrl('/dashboard');
|
|
299
|
+
}
|
|
297
300
|
|
|
298
301
|
// Must match the server PTY size (src/shell/screen.ts ScreenModel defaults).
|
|
299
302
|
const PTY_COLS = 200;
|
|
@@ -332,19 +335,19 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
332
335
|
}
|
|
333
336
|
|
|
334
337
|
async function wsPtyUrl(agentId, sessionId) {
|
|
335
|
-
// Exchange the
|
|
336
|
-
//
|
|
337
|
-
//
|
|
338
|
+
// Exchange the dashboard session (HttpOnly cookie, sent automatically) for a
|
|
339
|
+
// short-lived ticket so no credential ever appears in the WS URL (which would
|
|
340
|
+
// expose it in server logs and browser history). Per-session, so the session
|
|
341
|
+
// id is always part of the request.
|
|
338
342
|
const base = basePath() + '/api/v1/agents/' + encodeURIComponent(agentId) + '/pty-stream';
|
|
339
343
|
const proto = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
340
|
-
if (!DASHBOARD_API_KEY) {
|
|
341
|
-
return proto + '//' + window.location.host + base + '?session=' + encodeURIComponent(sessionId);
|
|
342
|
-
}
|
|
343
344
|
const r = await fetch(apiUrl('/api/v1/pty-stream-ticket'), {
|
|
344
345
|
method: 'POST',
|
|
345
|
-
headers: { 'Content-Type': 'application/json'
|
|
346
|
+
headers: { 'Content-Type': 'application/json' },
|
|
346
347
|
body: JSON.stringify({ agentId, sessionId }),
|
|
347
348
|
});
|
|
349
|
+
if (r.status === 401) { onUnauthorized(); return null; }
|
|
350
|
+
if (!r.ok) throw new Error('ticket HTTP ' + r.status);
|
|
348
351
|
const { ticket } = await r.json();
|
|
349
352
|
return proto + '//' + window.location.host + base + '?ticket=' + ticket;
|
|
350
353
|
}
|
|
@@ -460,6 +463,8 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
460
463
|
schedulePtyReconnect(agentId, sessionId);
|
|
461
464
|
return;
|
|
462
465
|
}
|
|
466
|
+
// 401 → wsPtyUrl already bounced to the login page; stop here.
|
|
467
|
+
if (!url) return;
|
|
463
468
|
// The session may have been closed/switched while awaiting the ticket.
|
|
464
469
|
if (currentPtySession !== sessionId) return;
|
|
465
470
|
|
|
@@ -668,6 +673,7 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
668
673
|
document.getElementById('refresh-indicator').textContent = 'refreshing...';
|
|
669
674
|
try {
|
|
670
675
|
const res = await fetch(apiUrl('/status'));
|
|
676
|
+
if (res.status === 401) { onUnauthorized(); return; }
|
|
671
677
|
if (!res.ok) throw new Error('HTTP ' + res.status);
|
|
672
678
|
const data = await res.json();
|
|
673
679
|
|
|
@@ -743,6 +749,7 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
743
749
|
async function refreshProcesses() {
|
|
744
750
|
try {
|
|
745
751
|
const res = await fetch(apiUrl('/processes'));
|
|
752
|
+
if (res.status === 401) { onUnauthorized(); return; }
|
|
746
753
|
if (!res.ok) return;
|
|
747
754
|
const data = await res.json();
|
|
748
755
|
renderProcessTree(data.processes || [], data.numCpus || 1);
|
|
@@ -884,6 +891,14 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
884
891
|
document.getElementById('proc-tree').innerHTML = lines.join('\\n');
|
|
885
892
|
}
|
|
886
893
|
|
|
894
|
+
// Logout — revoke the session cookie server-side, then land on the login page.
|
|
895
|
+
document.getElementById('logout-btn').addEventListener('click', async function() {
|
|
896
|
+
try {
|
|
897
|
+
await fetch(apiUrl('/dashboard/logout'), { method: 'POST' });
|
|
898
|
+
} catch (e) { /* best-effort; navigate regardless */ }
|
|
899
|
+
window.location.href = apiUrl('/dashboard');
|
|
900
|
+
});
|
|
901
|
+
|
|
887
902
|
refresh();
|
|
888
903
|
refreshProcesses();
|
|
889
904
|
setInterval(refresh, 3000);
|
|
@@ -893,4 +908,92 @@ function generateDashboardHtml(dashToken = '') {
|
|
|
893
908
|
</body>
|
|
894
909
|
</html>`;
|
|
895
910
|
}
|
|
911
|
+
/**
|
|
912
|
+
* Minimal, self-contained login page served at GET /dashboard when API keys are
|
|
913
|
+
* configured and the request has no valid dashboard session cookie. Posts the
|
|
914
|
+
* entered API key to POST /dashboard/login (JSON); on success the server sets the
|
|
915
|
+
* HttpOnly session cookie and we reload into the dashboard. No external deps.
|
|
916
|
+
*/
|
|
917
|
+
function generateLoginHtml(disabledReason = '') {
|
|
918
|
+
const safeReason = disabledReason
|
|
919
|
+
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
920
|
+
// When a disabled reason is supplied (keyless install on a non-loopback bind),
|
|
921
|
+
// render a notice instead of the login form — there is no key to log in with.
|
|
922
|
+
const bodyInner = safeReason
|
|
923
|
+
? ` <h1>Claude Gateway</h1>
|
|
924
|
+
<div class="sub">${safeReason}</div>`
|
|
925
|
+
: ` <h1>Claude Gateway</h1>
|
|
926
|
+
<div class="sub">Enter an API key to access the dashboard.</div>
|
|
927
|
+
<form id="login-form" autocomplete="off">
|
|
928
|
+
<label for="key">API key</label>
|
|
929
|
+
<input id="key" type="password" placeholder="sk-gateway-..." autofocus>
|
|
930
|
+
<button type="submit">Sign in</button>
|
|
931
|
+
<div id="err"></div>
|
|
932
|
+
</form>`;
|
|
933
|
+
return `<!DOCTYPE html>
|
|
934
|
+
<html lang="en">
|
|
935
|
+
<head>
|
|
936
|
+
<meta charset="UTF-8">
|
|
937
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
938
|
+
<title>Claude Gateway — Login</title>
|
|
939
|
+
<style>
|
|
940
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
941
|
+
body {
|
|
942
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, monospace;
|
|
943
|
+
background: #0f1117; color: #e2e8f0;
|
|
944
|
+
min-height: 100vh; display: flex; align-items: center; justify-content: center;
|
|
945
|
+
}
|
|
946
|
+
.card {
|
|
947
|
+
background: #1a202c; border: 1px solid #2d3748; border-radius: 10px;
|
|
948
|
+
padding: 32px; width: 100%; max-width: 360px;
|
|
949
|
+
}
|
|
950
|
+
h1 { font-size: 1.25rem; margin-bottom: 4px; }
|
|
951
|
+
.sub { font-size: 0.8rem; color: #718096; margin-bottom: 20px; }
|
|
952
|
+
label { display: block; font-size: 0.75rem; color: #a0aec0; margin-bottom: 6px; }
|
|
953
|
+
input {
|
|
954
|
+
width: 100%; padding: 10px 12px; border-radius: 6px;
|
|
955
|
+
border: 1px solid #2d3748; background: #0f1117; color: #e2e8f0;
|
|
956
|
+
font-family: inherit; font-size: 0.9rem;
|
|
957
|
+
}
|
|
958
|
+
button {
|
|
959
|
+
width: 100%; margin-top: 16px; padding: 10px; border: none; border-radius: 6px;
|
|
960
|
+
background: #3182ce; color: #fff; font-weight: 600; font-size: 0.9rem; cursor: pointer;
|
|
961
|
+
}
|
|
962
|
+
button:hover { background: #2b6cb0; }
|
|
963
|
+
#err { color: #fc8181; font-size: 0.8rem; margin-top: 12px; min-height: 1em; }
|
|
964
|
+
</style>
|
|
965
|
+
</head>
|
|
966
|
+
<body>
|
|
967
|
+
<div class="card">
|
|
968
|
+
${bodyInner}
|
|
969
|
+
</div>
|
|
970
|
+
<script>
|
|
971
|
+
function basePath() {
|
|
972
|
+
var p = window.location.pathname;
|
|
973
|
+
if (p.endsWith('/dashboard')) return p.slice(0, -10);
|
|
974
|
+
if (p.endsWith('/dashboard/')) return p.slice(0, -11);
|
|
975
|
+
return p.endsWith('/') ? p.slice(0, -1) : p;
|
|
976
|
+
}
|
|
977
|
+
var loginForm = document.getElementById('login-form');
|
|
978
|
+
if (loginForm) loginForm.addEventListener('submit', async function(e) {
|
|
979
|
+
e.preventDefault();
|
|
980
|
+
var err = document.getElementById('err');
|
|
981
|
+
err.textContent = '';
|
|
982
|
+
var key = document.getElementById('key').value;
|
|
983
|
+
try {
|
|
984
|
+
var res = await fetch(basePath() + '/dashboard/login', {
|
|
985
|
+
method: 'POST',
|
|
986
|
+
headers: { 'Content-Type': 'application/json' },
|
|
987
|
+
body: JSON.stringify({ key: key }),
|
|
988
|
+
});
|
|
989
|
+
if (res.ok) { window.location.href = basePath() + '/dashboard'; return; }
|
|
990
|
+
err.textContent = res.status === 401 ? 'Invalid API key.' : ('Login failed (HTTP ' + res.status + ').');
|
|
991
|
+
} catch (e2) {
|
|
992
|
+
err.textContent = 'Network error.';
|
|
993
|
+
}
|
|
994
|
+
});
|
|
995
|
+
</script>
|
|
996
|
+
</body>
|
|
997
|
+
</html>`;
|
|
998
|
+
}
|
|
896
999
|
//# sourceMappingURL=web-ui.js.map
|
package/dist/ui/web-ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-ui.js","sourceRoot":"","sources":["../../src/ui/web-ui.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"web-ui.js","sourceRoot":"","sources":["../../src/ui/web-ui.ts"],"names":[],"mappings":";;AAIA,sDAq4BC;AAQD,8CAiFC;AAl+BD;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAm4BD,CAAC;AACT,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,cAAc,GAAG,EAAE;IACnD,MAAM,UAAU,GAAG,cAAc;SAC9B,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9F,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,SAAS,GAAG,UAAU;QAC1B,CAAC,CAAC;uBACiB,UAAU,QAAQ;QACrC,CAAC,CAAC;;;;;;;YAOM,CAAC;IACX,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCP,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6BH,CAAC;AACT,CAAC"}
|