@songsid/agend 2.1.4 → 2.1.5-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/channel/adapters/discord.d.ts +2 -0
  2. package/dist/channel/adapters/discord.js +7 -0
  3. package/dist/channel/adapters/discord.js.map +1 -1
  4. package/dist/channel/adapters/telegram.d.ts +5 -0
  5. package/dist/channel/adapters/telegram.js +11 -0
  6. package/dist/channel/adapters/telegram.js.map +1 -1
  7. package/dist/channel/types.d.ts +7 -0
  8. package/dist/config.js +38 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/fleet-context.d.ts +3 -0
  11. package/dist/fleet-manager.d.ts +19 -0
  12. package/dist/fleet-manager.js +209 -29
  13. package/dist/fleet-manager.js.map +1 -1
  14. package/dist/locale.js +46 -0
  15. package/dist/locale.js.map +1 -1
  16. package/dist/login-controller.d.ts +127 -0
  17. package/dist/login-controller.js +450 -0
  18. package/dist/login-controller.js.map +1 -0
  19. package/dist/login-flows.d.ts +41 -3
  20. package/dist/login-flows.js +37 -5
  21. package/dist/login-flows.js.map +1 -1
  22. package/dist/login-manager.d.ts +12 -1
  23. package/dist/login-manager.js +64 -7
  24. package/dist/login-manager.js.map +1 -1
  25. package/dist/login-window-lock.d.ts +26 -0
  26. package/dist/login-window-lock.js +64 -0
  27. package/dist/login-window-lock.js.map +1 -0
  28. package/dist/tmux-manager.d.ts +19 -0
  29. package/dist/tmux-manager.js +79 -12
  30. package/dist/tmux-manager.js.map +1 -1
  31. package/dist/topic-commands.js +1 -0
  32. package/dist/topic-commands.js.map +1 -1
  33. package/dist/types.d.ts +18 -0
  34. package/dist/ui/web-terminal/terminal.css +17 -0
  35. package/dist/ui/web-terminal/terminal.html +43 -0
  36. package/dist/ui/web-terminal/terminal.js +148 -0
  37. package/dist/ui/web-terminal/vendor/LICENSE.addon-fit +19 -0
  38. package/dist/ui/web-terminal/vendor/LICENSE.addon-web-links +19 -0
  39. package/dist/ui/web-terminal/vendor/LICENSE.xterm +21 -0
  40. package/dist/ui/web-terminal/vendor/VENDORED.md +22 -0
  41. package/dist/ui/web-terminal/vendor/addon-fit.js +1 -0
  42. package/dist/ui/web-terminal/vendor/addon-web-links.js +1 -0
  43. package/dist/ui/web-terminal/vendor/xterm.css +285 -0
  44. package/dist/ui/web-terminal/vendor/xterm.js +1 -0
  45. package/dist/web-terminal-http.d.ts +53 -0
  46. package/dist/web-terminal-http.js +396 -0
  47. package/dist/web-terminal-http.js.map +1 -0
  48. package/dist/web-terminal.d.ts +336 -0
  49. package/dist/web-terminal.js +888 -0
  50. package/dist/web-terminal.js.map +1 -0
  51. package/dist/ws-server.d.ts +69 -0
  52. package/dist/ws-server.js +392 -0
  53. package/dist/ws-server.js.map +1 -0
  54. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ import type { WebTerminalSession, TerminalLogger } from "./web-terminal.js";
2
+ /** One admin browser needs a handful of sockets; anything beyond this is refused (M3: URL holders must not exhaust the fleet process). */
3
+ export declare const MAX_CONNECTIONS = 8;
4
+ export interface WebTerminalHttpOptions {
5
+ /** Interface to bind. Default 127.0.0.1 — reach it via SSH/tailscale/reverse proxy, like /dashboard. */
6
+ bind?: string;
7
+ /** Host name used in the URL handed to the admin (fleet `hostname`, default "localhost"). */
8
+ hostname?: string;
9
+ assetsDir?: string;
10
+ }
11
+ /**
12
+ * The request target as a plain path, or null when it is not a valid
13
+ * origin-form target. `new URL` throws on `GET http://%` and friends, and
14
+ * absolute-form / authority-form targets are not something a browser sends
15
+ * to us — all of that is a 400, never an exception (B1).
16
+ */
17
+ export declare function safeRequestPath(rawUrl: string | undefined): string | null;
18
+ export declare class WebTerminalHttpServer {
19
+ private readonly session;
20
+ private readonly logger;
21
+ private server;
22
+ private port;
23
+ private ws;
24
+ private readonly sockets;
25
+ private readonly assetsDir;
26
+ private readonly bind;
27
+ private readonly hostname;
28
+ private unsubscribeFinished;
29
+ /** Immutable assets, read once at listen() — no per-request disk I/O (M3). */
30
+ private readonly assetCache;
31
+ constructor(session: WebTerminalSession, logger: TerminalLogger, opts?: WebTerminalHttpOptions);
32
+ get pagePath(): string;
33
+ /** Start listening; returns the URL to hand the admin (it contains no secret). */
34
+ listen(): Promise<{
35
+ port: number;
36
+ url: string;
37
+ }>;
38
+ close(): Promise<void>;
39
+ private handle;
40
+ private page;
41
+ private asset;
42
+ private preloadAssets;
43
+ private readAsset;
44
+ private open;
45
+ private handleUpgrade;
46
+ private get cookieName();
47
+ private cookie;
48
+ /** Origin must be present and its host must equal the Host header (what the browser typed). */
49
+ private originMatchesHost;
50
+ private isHttps;
51
+ private text;
52
+ private json;
53
+ }
@@ -0,0 +1,396 @@
1
+ /**
2
+ * Per-session HTTP listener for one WebTerminalSession.
3
+ *
4
+ * One `127.0.0.1:0` listener per session, closed with the session — it is not
5
+ * the dashboard/health server, so a tunnel pointed at it (phase 3) can reach
6
+ * nothing else. Routes (sid must match exactly, everything else is 404):
7
+ *
8
+ * GET /t/<sid> static page — NO side effects (link-preview
9
+ * bots fetch it), NO secret in the URL
10
+ * GET /t/<sid>/assets/<file> vendored xterm.js + page script/style
11
+ * POST /t/<sid>/open {token} → token gate → HttpOnly cookie
12
+ * GET /t/<sid>/ws (upgrade) cookie + Origin → WebSocket to the pane
13
+ *
14
+ * Origin must equal Host on /open and /ws (CSRF/cross-site WS). Cookie is
15
+ * HttpOnly; SameSite=Strict; Path=/t/<sid>. Limits: 4 KB frames, 64 inbound
16
+ * frames/s (control frames included, enforced in the parser), 1 KB /open
17
+ * body, 64 KB of input waiting for tmux, 1 MB of output waiting for the
18
+ * browser; resize clamped by the session.
19
+ *
20
+ * Every entry point has an error boundary: a malformed request target or an
21
+ * unexpected throw answers 400/500 and never becomes an unhandled rejection
22
+ * or uncaught exception in the fleet process.
23
+ */
24
+ import { createServer } from "node:http";
25
+ import { readFileSync, existsSync } from "node:fs";
26
+ import { join, dirname } from "node:path";
27
+ import { fileURLToPath } from "node:url";
28
+ import { acceptWebSocket, rejectUpgrade } from "./ws-server.js";
29
+ const __dirname = dirname(fileURLToPath(import.meta.url));
30
+ const DEFAULT_ASSETS_DIR = join(__dirname, "ui", "web-terminal");
31
+ const MAX_OPEN_BODY = 1024;
32
+ const MAX_WS_FRAME = 4096;
33
+ const MAX_FRAMES_PER_SECOND = 64;
34
+ const MAX_OUTBOUND_BUFFERED = 1024 * 1024;
35
+ /** One admin browser needs a handful of sockets; anything beyond this is refused (M3: URL holders must not exhaust the fleet process). */
36
+ export const MAX_CONNECTIONS = 8;
37
+ const MAX_REQUESTS_PER_SOCKET = 100;
38
+ const RESPONSE_TIMEOUT_MS = 15_000;
39
+ const ASSETS = {
40
+ "terminal.js": { file: "terminal.js", type: "text/javascript; charset=utf-8" },
41
+ "terminal.css": { file: "terminal.css", type: "text/css; charset=utf-8" },
42
+ "xterm.js": { file: join("vendor", "xterm.js"), type: "text/javascript; charset=utf-8" },
43
+ "xterm.css": { file: join("vendor", "xterm.css"), type: "text/css; charset=utf-8" },
44
+ "addon-fit.js": { file: join("vendor", "addon-fit.js"), type: "text/javascript; charset=utf-8" },
45
+ "addon-web-links.js": { file: join("vendor", "addon-web-links.js"), type: "text/javascript; charset=utf-8" },
46
+ };
47
+ /**
48
+ * The request target as a plain path, or null when it is not a valid
49
+ * origin-form target. `new URL` throws on `GET http://%` and friends, and
50
+ * absolute-form / authority-form targets are not something a browser sends
51
+ * to us — all of that is a 400, never an exception (B1).
52
+ */
53
+ export function safeRequestPath(rawUrl) {
54
+ // origin-form only: starts with a single "/" ("//host/x" is scheme-relative, not a path)
55
+ if (!rawUrl || rawUrl.length > 2048 || !rawUrl.startsWith("/") || rawUrl.startsWith("//"))
56
+ return null;
57
+ try {
58
+ return new URL(rawUrl, "http://localhost").pathname;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ export class WebTerminalHttpServer {
65
+ session;
66
+ logger;
67
+ server = null;
68
+ port = 0;
69
+ ws = null;
70
+ sockets = new Set();
71
+ assetsDir;
72
+ bind;
73
+ hostname;
74
+ unsubscribeFinished = null;
75
+ /** Immutable assets, read once at listen() — no per-request disk I/O (M3). */
76
+ assetCache = new Map();
77
+ constructor(session, logger, opts = {}) {
78
+ this.session = session;
79
+ this.logger = logger;
80
+ this.assetsDir = opts.assetsDir ?? DEFAULT_ASSETS_DIR;
81
+ this.bind = opts.bind ?? "127.0.0.1";
82
+ this.hostname = opts.hostname ?? "localhost";
83
+ }
84
+ get pagePath() { return `/t/${this.session.sid}`; }
85
+ /** Start listening; returns the URL to hand the admin (it contains no secret). */
86
+ async listen() {
87
+ if (this.server)
88
+ throw new Error("already listening");
89
+ this.preloadAssets();
90
+ const server = createServer((req, res) => {
91
+ // Error boundary: nothing thrown by a request may escape to the process.
92
+ Promise.resolve().then(() => this.handle(req, res)).catch(err => {
93
+ this.logger.warn({ sid: this.session.sid, err: err.message }, "web terminal request failed");
94
+ try {
95
+ this.text(res, 500, "internal error");
96
+ }
97
+ catch {
98
+ res.destroy();
99
+ }
100
+ });
101
+ });
102
+ server.on("upgrade", (req, socket, head) => {
103
+ try {
104
+ this.handleUpgrade(req, socket, head);
105
+ }
106
+ catch (err) {
107
+ this.logger.warn({ sid: this.session.sid, err: err.message }, "web terminal upgrade failed");
108
+ rejectUpgrade(socket, 500, "Internal Server Error");
109
+ }
110
+ });
111
+ server.on("clientError", (_err, socket) => {
112
+ // Node's own HTTP parser rejected the request (malformed request line/headers).
113
+ if (!socket.destroyed)
114
+ socket.end("HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n");
115
+ });
116
+ server.on("connection", socket => {
117
+ if (this.sockets.size >= MAX_CONNECTIONS) {
118
+ // More sockets than one browser could need: refuse before any parsing.
119
+ socket.destroy();
120
+ return;
121
+ }
122
+ this.sockets.add(socket);
123
+ socket.on("error", () => { });
124
+ socket.on("close", () => this.sockets.delete(socket));
125
+ });
126
+ server.headersTimeout = 10_000;
127
+ server.requestTimeout = 15_000;
128
+ server.maxRequestsPerSocket = MAX_REQUESTS_PER_SOCKET;
129
+ // A peer that stops reading a response (slow-loris on a 489 KB asset) is cut off.
130
+ server.timeout = RESPONSE_TIMEOUT_MS;
131
+ server.on("timeout", socket => socket.destroy());
132
+ this.server = server;
133
+ await new Promise((resolve, reject) => {
134
+ server.once("error", reject);
135
+ server.listen(0, this.bind, () => { server.off("error", reject); resolve(); });
136
+ });
137
+ const address = server.address();
138
+ this.port = typeof address === "object" && address ? address.port : 0;
139
+ const onFinished = () => { void this.close(); };
140
+ this.session.once("finished", onFinished);
141
+ this.unsubscribeFinished = () => this.session.off("finished", onFinished);
142
+ return { port: this.port, url: `http://${this.hostname}:${this.port}${this.pagePath}` };
143
+ }
144
+ async close() {
145
+ this.unsubscribeFinished?.();
146
+ this.unsubscribeFinished = null;
147
+ const server = this.server;
148
+ this.server = null;
149
+ try {
150
+ this.ws?.close(1001, "session closed");
151
+ }
152
+ catch { /* gone */ }
153
+ this.ws = null;
154
+ if (!server)
155
+ return;
156
+ await new Promise(resolve => {
157
+ server.close(() => resolve());
158
+ // Idle keep-alive connections would otherwise hold close() open.
159
+ for (const s of this.sockets)
160
+ s.destroy();
161
+ setTimeout(resolve, 500).unref?.();
162
+ });
163
+ }
164
+ // ── HTTP ──
165
+ handle(req, res) {
166
+ res.setHeader("Cache-Control", "no-store");
167
+ res.setHeader("Referrer-Policy", "no-referrer");
168
+ res.setHeader("X-Content-Type-Options", "nosniff");
169
+ res.setHeader("X-Frame-Options", "DENY");
170
+ const path = safeRequestPath(req.url);
171
+ if (path === null)
172
+ return this.text(res, 400, "bad request");
173
+ const base = this.pagePath;
174
+ if (path === base || path === `${base}/`) {
175
+ if (req.method !== "GET")
176
+ return this.text(res, 405, "method not allowed");
177
+ return this.page(res);
178
+ }
179
+ if (path.startsWith(`${base}/assets/`)) {
180
+ if (req.method !== "GET")
181
+ return this.text(res, 405, "method not allowed");
182
+ return this.asset(res, path.slice(`${base}/assets/`.length));
183
+ }
184
+ if (path === `${base}/open`) {
185
+ if (req.method !== "POST")
186
+ return this.text(res, 405, "method not allowed");
187
+ return this.open(req, res);
188
+ }
189
+ if (path === `${base}/ws`)
190
+ return this.text(res, 426, "upgrade required");
191
+ return this.text(res, 404, "not found");
192
+ }
193
+ page(res) {
194
+ const html = this.readAsset("terminal.html");
195
+ if (!html)
196
+ return this.text(res, 500, "terminal page missing");
197
+ res.setHeader("Content-Security-Policy",
198
+ // xterm.js injects a <style> element for its DOM renderer, hence 'unsafe-inline' for styles only.
199
+ "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src data:; base-uri 'none'; form-action 'none'; frame-ancestors 'none'");
200
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
201
+ res.end(html);
202
+ }
203
+ asset(res, name) {
204
+ const entry = ASSETS[name];
205
+ if (!entry)
206
+ return this.text(res, 404, "not found");
207
+ const body = this.readAsset(entry.file);
208
+ if (!body)
209
+ return this.text(res, 404, "not found");
210
+ res.writeHead(200, { "Content-Type": entry.type });
211
+ res.end(body);
212
+ }
213
+ preloadAssets() {
214
+ for (const rel of ["terminal.html", ...Object.values(ASSETS).map(a => a.file)]) {
215
+ const p = join(this.assetsDir, rel);
216
+ if (!existsSync(p))
217
+ continue;
218
+ try {
219
+ this.assetCache.set(rel, readFileSync(p));
220
+ }
221
+ catch { /* served as 404/500 */ }
222
+ }
223
+ }
224
+ readAsset(rel) {
225
+ return this.assetCache.get(rel) ?? null;
226
+ }
227
+ open(req, res) {
228
+ if (!this.originMatchesHost(req))
229
+ return this.json(res, 403, { error: "origin mismatch" });
230
+ if (!String(req.headers["content-type"] ?? "").startsWith("application/json")) {
231
+ return this.json(res, 415, { error: "json required" });
232
+ }
233
+ let size = 0;
234
+ const chunks = [];
235
+ let tooLarge = false;
236
+ req.on("data", (c) => {
237
+ size += c.length;
238
+ if (size > MAX_OPEN_BODY) {
239
+ tooLarge = true;
240
+ this.json(res, 413, { error: "body too large" });
241
+ req.destroy();
242
+ return;
243
+ }
244
+ chunks.push(c);
245
+ });
246
+ req.on("end", () => {
247
+ if (tooLarge)
248
+ return;
249
+ try {
250
+ let token = "";
251
+ try {
252
+ const parsed = JSON.parse(Buffer.concat(chunks).toString("utf8"));
253
+ token = typeof parsed.token === "string" ? parsed.token : "";
254
+ }
255
+ catch {
256
+ return this.json(res, 400, { error: "bad json" });
257
+ }
258
+ if (!token)
259
+ return this.json(res, 400, { error: "token required" });
260
+ const outcome = this.session.redeemToken(token);
261
+ switch (outcome.result) {
262
+ case "ok": {
263
+ const secure = this.isHttps(req) ? "; Secure" : "";
264
+ res.setHeader("Set-Cookie", `${this.cookieName}=${outcome.cookie}; HttpOnly; SameSite=Strict; Path=${this.pagePath}${secure}`);
265
+ return this.json(res, 204, null);
266
+ }
267
+ case "bad": return this.json(res, 403, { error: "invalid token", remaining: outcome.remaining });
268
+ case "used": return this.json(res, 409, { error: "token already used" });
269
+ case "locked": return this.json(res, 410, { error: "session destroyed after repeated failures" });
270
+ case "finished": return this.json(res, 410, { error: "session ended" });
271
+ }
272
+ }
273
+ catch (err) {
274
+ this.logger.warn({ sid: this.session.sid, err: err.message }, "web terminal /open failed");
275
+ this.json(res, 500, { error: "internal error" });
276
+ }
277
+ });
278
+ req.on("error", () => { });
279
+ }
280
+ // ── WebSocket ──
281
+ handleUpgrade(req, socket, head) {
282
+ this.sockets.add(socket);
283
+ socket.on("error", () => { });
284
+ socket.on("close", () => this.sockets.delete(socket));
285
+ const path = safeRequestPath(req.url);
286
+ if (path === null)
287
+ return rejectUpgrade(socket, 400, "Bad Request");
288
+ if (path !== `${this.pagePath}/ws`)
289
+ return rejectUpgrade(socket, 404, "Not Found");
290
+ if (!this.originMatchesHost(req))
291
+ return rejectUpgrade(socket, 403, "Forbidden");
292
+ if (!this.session.checkCookie(this.cookie(req)))
293
+ return rejectUpgrade(socket, 403, "Forbidden");
294
+ if (this.session.state !== "running")
295
+ return rejectUpgrade(socket, 410, "Gone");
296
+ const ws = acceptWebSocket(req, socket, head, {
297
+ maxPayload: MAX_WS_FRAME,
298
+ maxFramesPerSecond: MAX_FRAMES_PER_SECOND,
299
+ maxBufferedBytes: MAX_OUTBOUND_BUFFERED,
300
+ });
301
+ if (!ws)
302
+ return;
303
+ const previous = this.ws;
304
+ this.ws = ws;
305
+ if (previous && previous !== ws) {
306
+ try {
307
+ previous.close(4000, "replaced");
308
+ }
309
+ catch { /* gone */ }
310
+ }
311
+ const detach = this.session.attachClient({
312
+ send: data => { ws.send(data); }, // a slow browser is dropped inside send() (1008)
313
+ close: (code, reason) => { ws.close(code, reason); },
314
+ });
315
+ ws.on("message", (data, isBinary) => {
316
+ // Fence: only the CURRENT browser may type. A replaced or closing
317
+ // socket cannot inject even if a frame was already in flight (B3).
318
+ if (this.ws !== ws || ws.closed)
319
+ return;
320
+ if (isBinary) {
321
+ if (!this.session.input(data)) {
322
+ ws.close(1008, "input backlog"); // > MAX_PENDING_INPUT_BYTES waiting for tmux (B4)
323
+ }
324
+ return;
325
+ }
326
+ let msg;
327
+ try {
328
+ msg = JSON.parse(data);
329
+ }
330
+ catch {
331
+ return;
332
+ }
333
+ if (msg.t === "resize" && typeof msg.cols === "number" && typeof msg.rows === "number") {
334
+ this.session.resize(msg.cols, msg.rows);
335
+ }
336
+ else if (msg.t === "cancel") {
337
+ // The authenticated browser's Stop button: end the session for real,
338
+ // not merely a Ctrl-C the CLI might ignore.
339
+ void this.session.cancel("stopped from the browser");
340
+ }
341
+ });
342
+ ws.on("close", () => { detach(); if (this.ws === ws)
343
+ this.ws = null; });
344
+ ws.on("protocolError", (e) => this.logger.info({ sid: this.session.sid, code: e.code, reason: e.reason }, "web terminal ws closed by policy"));
345
+ ws.on("error", () => { });
346
+ this.logger.info({ sid: this.session.sid, ip: req.socket.remoteAddress, ua: String(req.headers["user-agent"] ?? "").slice(0, 120) }, "web_terminal_ws_connected");
347
+ }
348
+ // ── Helpers ──
349
+ get cookieName() { return `agend_term_${this.session.sid.slice(0, 12)}`; }
350
+ cookie(req) {
351
+ const raw = String(req.headers.cookie ?? "");
352
+ for (const part of raw.split(";")) {
353
+ const [k, ...v] = part.trim().split("=");
354
+ if (k === this.cookieName)
355
+ return v.join("=");
356
+ }
357
+ return undefined;
358
+ }
359
+ /** Origin must be present and its host must equal the Host header (what the browser typed). */
360
+ originMatchesHost(req) {
361
+ const origin = req.headers.origin;
362
+ const host = req.headers.host;
363
+ if (!origin || !host)
364
+ return false;
365
+ try {
366
+ return new URL(String(origin)).host === String(host);
367
+ }
368
+ catch {
369
+ return false;
370
+ }
371
+ }
372
+ isHttps(req) {
373
+ const proto = String(req.headers["x-forwarded-proto"] ?? "").split(",")[0].trim().toLowerCase();
374
+ return proto === "https" || Boolean(req.socket.encrypted);
375
+ }
376
+ text(res, status, body) {
377
+ if (res.headersSent) {
378
+ res.end();
379
+ return;
380
+ }
381
+ res.writeHead(status, { "Content-Type": "text/plain; charset=utf-8" });
382
+ res.end(`${body}\n`);
383
+ }
384
+ json(res, status, body) {
385
+ if (res.headersSent)
386
+ return;
387
+ if (status === 204) {
388
+ res.writeHead(204);
389
+ res.end();
390
+ return;
391
+ }
392
+ res.writeHead(status, { "Content-Type": "application/json; charset=utf-8" });
393
+ res.end(JSON.stringify(body));
394
+ }
395
+ }
396
+ //# sourceMappingURL=web-terminal-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-terminal-http.js","sourceRoot":"","sources":["../src/web-terminal-http.ts"],"names":[],"mappings":"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"}