@mono-agent/web 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +169 -0
  3. package/dist/contracts.d.ts +151 -0
  4. package/dist/contracts.d.ts.map +1 -0
  5. package/dist/contracts.js +11 -0
  6. package/dist/contracts.js.map +1 -0
  7. package/dist/discovery.d.ts +17 -0
  8. package/dist/discovery.d.ts.map +1 -0
  9. package/dist/discovery.js +137 -0
  10. package/dist/discovery.js.map +1 -0
  11. package/dist/errors.d.ts +9 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +25 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +14 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +10 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/operator-client.d.ts +42 -0
  20. package/dist/operator-client.d.ts.map +1 -0
  21. package/dist/operator-client.js +257 -0
  22. package/dist/operator-client.js.map +1 -0
  23. package/dist/server.d.ts +22 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +566 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/service.d.ts +89 -0
  28. package/dist/service.d.ts.map +1 -0
  29. package/dist/service.js +644 -0
  30. package/dist/service.js.map +1 -0
  31. package/dist/state-paths.d.ts +25 -0
  32. package/dist/state-paths.d.ts.map +1 -0
  33. package/dist/state-paths.js +226 -0
  34. package/dist/state-paths.js.map +1 -0
  35. package/dist/store.d.ts +112 -0
  36. package/dist/store.d.ts.map +1 -0
  37. package/dist/store.js +953 -0
  38. package/dist/store.js.map +1 -0
  39. package/package.json +48 -0
  40. package/webapp/dist/apple-touch-icon.png +0 -0
  41. package/webapp/dist/assets/assistant-ui-CU4gqU0g.js +70 -0
  42. package/webapp/dist/assets/index-Ck3BY0Ti.js +47 -0
  43. package/webapp/dist/assets/index-CoB6Xwh-.css +1 -0
  44. package/webapp/dist/assets/markdown-qFW9VWmB.js +18 -0
  45. package/webapp/dist/assets/workbox-window.prod.es5-BBnX5xw4.js +2 -0
  46. package/webapp/dist/favicon.ico +0 -0
  47. package/webapp/dist/icon-192.png +0 -0
  48. package/webapp/dist/icon-512.png +0 -0
  49. package/webapp/dist/icon.svg +22 -0
  50. package/webapp/dist/index.html +20 -0
  51. package/webapp/dist/manifest.webmanifest +1 -0
  52. package/webapp/dist/sw.js +1 -0
  53. package/webapp/dist/workbox-9c191d2f.js +1 -0
package/dist/server.js ADDED
@@ -0,0 +1,566 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { constants as fsConstants } from "node:fs";
3
+ import { chmod, open, rename, unlink } from "node:fs/promises";
4
+ import { createServer } from "node:http";
5
+ import { isIP } from "node:net";
6
+ import { hostname as systemHostname } from "node:os";
7
+ import { dirname, resolve } from "node:path";
8
+ import { pipeline } from "node:stream/promises";
9
+ import { fileURLToPath } from "node:url";
10
+ import { close, hostForUrl, listen, normalizeHostForBind } from "@mono-agent/agent-contracts";
11
+ import express, {} from "express";
12
+ import { WEB_API_VERSION, } from "./contracts.js";
13
+ import { errorMessage, WebConsoleError } from "./errors.js";
14
+ import { WebService } from "./service.js";
15
+ export const DEFAULT_WEB_HOST = "0.0.0.0";
16
+ export const DEFAULT_WEB_PORT = 5050;
17
+ const HEARTBEAT_INTERVAL_MS = 15_000;
18
+ const FORCE_CLOSE_AFTER_MS = 500;
19
+ const MAX_SSE_CLIENTS = 64;
20
+ export async function startWebServer(options = {}) {
21
+ const host = normalizeHostForBind(options.host ?? DEFAULT_WEB_HOST);
22
+ const port = normalizePort(options.port ?? DEFAULT_WEB_PORT);
23
+ const staticDir = options.staticDir ?? defaultStaticDir();
24
+ const logger = options.logger;
25
+ // Validate all synchronous startup inputs before acquiring the persistent
26
+ // service lease so an embedding typo cannot strand SQLite ownership.
27
+ const allowedHosts = resolveAllowedHosts(options.allowedHosts, options.env ?? process.env);
28
+ const service = await WebService.create(options);
29
+ const app = express();
30
+ const server = createServer(app);
31
+ server.headersTimeout = 15_000;
32
+ server.requestTimeout = 5 * 60_000;
33
+ server.keepAliveTimeout = 5_000;
34
+ const activeStreams = new Set();
35
+ const activeOperations = new Set();
36
+ let stopPromise;
37
+ app.disable("x-powered-by");
38
+ app.use(securityHeaders);
39
+ app.use(validateLocalRequest(host, allowedHosts));
40
+ app.use("/api", (_req, res, next) => {
41
+ res.setHeader("Cache-Control", "no-store");
42
+ res.setHeader("Pragma", "no-cache");
43
+ next();
44
+ });
45
+ app.use("/api/v1", express.json({ limit: "256kb", strict: true }));
46
+ app.get("/healthz", (_req, res) => {
47
+ res.status(200).json({ status: "ok", version: WEB_API_VERSION });
48
+ });
49
+ app.get("/api/v1/bootstrap", (_req, res, next) => {
50
+ void service.bootstrap().then((bootstrap) => res.status(200).json(bootstrap)).catch(next);
51
+ });
52
+ app.patch("/api/v1/agents/:id", (req, res, next) => {
53
+ try {
54
+ const input = parsePatchAgent(req.body);
55
+ res.status(200).json({ agent: service.patchAgent(pathParam(req.params.id), input) });
56
+ }
57
+ catch (error) {
58
+ next(error);
59
+ }
60
+ });
61
+ app.post("/api/v1/threads", (req, res, next) => {
62
+ try {
63
+ const input = parseCreateThread(req.body);
64
+ res.status(201).json({ thread: service.createThread(input.sourceId) });
65
+ }
66
+ catch (error) {
67
+ next(error);
68
+ }
69
+ });
70
+ app.get("/api/v1/threads/:id", (req, res, next) => {
71
+ try {
72
+ res.status(200).json(service.thread(pathParam(req.params.id)));
73
+ }
74
+ catch (error) {
75
+ next(error);
76
+ }
77
+ });
78
+ app.patch("/api/v1/threads/:id", (req, res, next) => {
79
+ try {
80
+ const input = parsePatchThread(req.body);
81
+ res.status(200).json({ thread: service.patchThread(pathParam(req.params.id), input) });
82
+ }
83
+ catch (error) {
84
+ next(error);
85
+ }
86
+ });
87
+ app.post("/api/v1/threads/:id/turns", (req, res, next) => {
88
+ let input;
89
+ let threadId;
90
+ try {
91
+ input = parseTurn(req.body);
92
+ threadId = pathParam(req.params.id);
93
+ }
94
+ catch (error) {
95
+ next(error);
96
+ return;
97
+ }
98
+ void trackOperation(service.startTurn(threadId, input), activeOperations)
99
+ .then((started) => res.status(202).json(started))
100
+ .catch(next);
101
+ });
102
+ app.post("/api/v1/threads/:id/cancel", (req, res, next) => {
103
+ const threadId = pathParam(req.params.id);
104
+ void trackOperation(service.cancelTurn(threadId), activeOperations)
105
+ .then((thread) => res.status(202).json({ cancelled: true, thread }))
106
+ .catch(next);
107
+ });
108
+ app.post("/api/v1/uploads", (req, res, next) => {
109
+ try {
110
+ const input = parseCreateUpload(req.body);
111
+ res.status(201).json({ attachment: service.createUpload(input) });
112
+ }
113
+ catch (error) {
114
+ next(error);
115
+ }
116
+ });
117
+ app.put("/api/v1/uploads/:id/content", (req, res, next) => {
118
+ void trackOperation(handleUploadContent(req, res, service), activeOperations).catch(next);
119
+ });
120
+ app.delete("/api/v1/uploads/:id", (req, res, next) => {
121
+ void trackOperation(service.removeUpload(pathParam(req.params.id)), activeOperations)
122
+ .then(() => res.status(204).end())
123
+ .catch(next);
124
+ });
125
+ app.get("/api/v1/uploads/:id/content", (req, res, next) => {
126
+ void trackOperation(handleDownloadContent(pathParam(req.params.id), res, service), activeOperations).catch(next);
127
+ });
128
+ app.get("/api/v1/events", (_req, res) => {
129
+ if (activeStreams.size >= MAX_SSE_CLIENTS) {
130
+ res.status(503).json({ error: { code: "sse_capacity", message: "Too many event streams are connected." } });
131
+ return;
132
+ }
133
+ let closed = false;
134
+ res.status(200);
135
+ res.setHeader("Content-Type", "text/event-stream");
136
+ res.setHeader("Cache-Control", "no-cache, no-transform");
137
+ res.setHeader("Connection", "keep-alive");
138
+ res.setHeader("X-Accel-Buffering", "no");
139
+ res.flushHeaders();
140
+ const closeStream = () => {
141
+ if (closed)
142
+ return;
143
+ closed = true;
144
+ clearInterval(heartbeat);
145
+ unsubscribe();
146
+ activeStreams.delete(closeStream);
147
+ res.end();
148
+ };
149
+ const send = (event) => {
150
+ if (closed || res.writableEnded)
151
+ return false;
152
+ const writable = res.write(formatSse(event));
153
+ if (!writable) {
154
+ // Events are state-invalidation hints, not an unbounded replay log. A
155
+ // client that cannot drain one frame must reconnect and bootstrap.
156
+ closeStream();
157
+ return false;
158
+ }
159
+ return true;
160
+ };
161
+ const unsubscribe = service.subscribe(send);
162
+ const heartbeat = setInterval(() => {
163
+ if (!res.write(`: heartbeat ${Date.now()}\n\n`))
164
+ closeStream();
165
+ }, HEARTBEAT_INTERVAL_MS);
166
+ heartbeat.unref();
167
+ activeStreams.add(closeStream);
168
+ res.once("close", closeStream);
169
+ send(service.readyEvent());
170
+ });
171
+ app.use("/api", (_req, res) => {
172
+ res.status(404).json({ error: { code: "not_found", message: "Not found." } });
173
+ });
174
+ app.use(express.static(staticDir, { fallthrough: true, index: false, redirect: false }));
175
+ app.get("/{*splat}", (_req, res, next) => {
176
+ // Keep the managed runtime's hidden ~/.mono-agent parent out of the
177
+ // request-relative path. Express otherwise applies its dotfile policy to
178
+ // the absolute path and rejects an existing index.html as Not Found.
179
+ res.sendFile("index.html", { root: staticDir }, (error) => {
180
+ if (error !== undefined && error !== null)
181
+ next(error);
182
+ });
183
+ });
184
+ app.use((error, _req, res, next) => {
185
+ if (res.headersSent) {
186
+ next(error);
187
+ return;
188
+ }
189
+ const known = error instanceof WebConsoleError;
190
+ const syntax = error instanceof SyntaxError && error.status === 400;
191
+ const tooLarge = typeof error === "object" && error !== null
192
+ && (error.status === 413 || error.type === "entity.too.large");
193
+ const status = known ? error.status : tooLarge ? 413 : syntax ? 400 : 500;
194
+ const code = known ? error.code : tooLarge ? "request_too_large" : syntax ? "invalid_json" : "internal_error";
195
+ if (status >= 500)
196
+ logger?.error?.("Web console request failed.", { error: errorMessage(error) });
197
+ res.status(status).json({
198
+ error: {
199
+ code,
200
+ message: known || syntax ? errorMessage(error) : "Internal server error.",
201
+ ...(known && error.details !== undefined ? { details: error.details } : {}),
202
+ },
203
+ });
204
+ });
205
+ const stop = () => {
206
+ stopPromise ??= (async () => {
207
+ for (const closeStream of [...activeStreams])
208
+ closeStream();
209
+ try {
210
+ await closeServerBounded(server);
211
+ await Promise.allSettled([...activeOperations]);
212
+ }
213
+ finally {
214
+ await service.stop();
215
+ }
216
+ })();
217
+ return stopPromise;
218
+ };
219
+ try {
220
+ const address = await listen(server, port, host, {
221
+ listenFailed: (reason) => new WebConsoleError("listen_failed", `Web console failed to listen: ${reason}`, 500),
222
+ noAddress: () => new WebConsoleError("listen_failed", "Web console did not receive a TCP address.", 500),
223
+ });
224
+ const url = `http://${hostForUrl(host)}:${address.port}/`;
225
+ return {
226
+ url,
227
+ host,
228
+ port: address.port,
229
+ boundAddress: address.address,
230
+ stateDir: service.store.paths.root,
231
+ stop,
232
+ close: stop,
233
+ };
234
+ }
235
+ catch (error) {
236
+ await service.stop();
237
+ throw error;
238
+ }
239
+ }
240
+ function trackOperation(operation, active) {
241
+ active.add(operation);
242
+ void operation.finally(() => active.delete(operation)).catch(() => undefined);
243
+ return operation;
244
+ }
245
+ async function handleUploadContent(req, res, service) {
246
+ const contentEncoding = req.headers["content-encoding"]?.trim().toLowerCase();
247
+ if (contentEncoding !== undefined && contentEncoding !== "identity") {
248
+ throw new WebConsoleError("unsupported_content_encoding", "Compressed upload bodies are not accepted.", 415);
249
+ }
250
+ if (req.headers["content-type"]?.split(";", 1)[0]?.trim().toLowerCase() !== "application/octet-stream") {
251
+ throw new WebConsoleError("invalid_upload_content_type", "Upload bytes with Content-Type: application/octet-stream.", 415);
252
+ }
253
+ const declaredLength = parseContentLength(req.headers["content-length"]);
254
+ const reservation = service.reserveUpload(pathParam(req.params.id));
255
+ if (declaredLength !== undefined && declaredLength > reservation.maxBytes) {
256
+ reservation.release();
257
+ throw new WebConsoleError("attachment_too_large", "Attachment exceeds the 20 MiB file limit.", 413);
258
+ }
259
+ if (declaredLength !== undefined && reservation.attachment.sizeBytes > 0 && declaredLength !== reservation.attachment.sizeBytes) {
260
+ reservation.release();
261
+ throw new WebConsoleError("attachment_size_mismatch", "Upload size does not match the declared file size.", 400);
262
+ }
263
+ const destination = service.store.attachmentPath(reservation.attachment);
264
+ const temporary = `${destination}.partial-${randomUUID()}`;
265
+ let moved = false;
266
+ try {
267
+ const sizeBytes = await writeBoundedRequest(req, temporary, reservation.maxBytes);
268
+ if (reservation.attachment.sizeBytes > 0 && sizeBytes !== reservation.attachment.sizeBytes) {
269
+ throw new WebConsoleError("attachment_size_mismatch", "Upload size does not match the declared file size.", 400);
270
+ }
271
+ await rename(temporary, destination);
272
+ moved = true;
273
+ await chmod(destination, 0o600);
274
+ const attachment = service.completeUpload(reservation.attachment.id, sizeBytes);
275
+ res.status(200).json({ attachment });
276
+ }
277
+ catch (error) {
278
+ await unlink(temporary).catch(() => undefined);
279
+ if (moved)
280
+ await unlink(destination).catch(() => undefined);
281
+ throw error;
282
+ }
283
+ finally {
284
+ reservation.release();
285
+ }
286
+ }
287
+ async function writeBoundedRequest(req, path, maxBytes) {
288
+ const handle = await open(path, "wx", 0o600);
289
+ let total = 0;
290
+ try {
291
+ for await (const raw of req) {
292
+ const chunk = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);
293
+ total += chunk.byteLength;
294
+ if (total > maxBytes) {
295
+ throw new WebConsoleError("attachment_too_large", "Attachment exceeds the 20 MiB file limit.", 413);
296
+ }
297
+ let offset = 0;
298
+ while (offset < chunk.byteLength) {
299
+ const { bytesWritten } = await handle.write(chunk, offset, chunk.byteLength - offset);
300
+ if (bytesWritten <= 0)
301
+ throw new WebConsoleError("upload_write_failed", "Upload storage made no write progress.", 500);
302
+ offset += bytesWritten;
303
+ }
304
+ }
305
+ await handle.sync();
306
+ const info = await handle.stat();
307
+ if (!info.isFile() || info.size !== total) {
308
+ throw new WebConsoleError("upload_write_failed", "Stored upload size did not match the received bytes.", 500);
309
+ }
310
+ return total;
311
+ }
312
+ finally {
313
+ await handle.close();
314
+ }
315
+ }
316
+ async function handleDownloadContent(id, res, service) {
317
+ const attachment = service.storedAttachment(id);
318
+ if (!attachment.uploaded)
319
+ throw new WebConsoleError("attachment_not_ready", "Attachment upload is incomplete.", 409);
320
+ const path = service.store.attachmentPath(attachment);
321
+ let handle;
322
+ try {
323
+ handle = await open(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
324
+ }
325
+ catch (error) {
326
+ throw new WebConsoleError("attachment_integrity", `Attachment content is unavailable (${errorMessage(error)}).`, 409);
327
+ }
328
+ const info = await handle.stat();
329
+ if (!info.isFile() || info.size !== attachment.sizeBytes) {
330
+ await handle.close();
331
+ throw new WebConsoleError("attachment_integrity", "Attachment content is unavailable.", 409);
332
+ }
333
+ const image = attachment.kind === "image";
334
+ res.status(200);
335
+ res.setHeader("Content-Type", image ? attachment.contentType : "application/octet-stream");
336
+ res.setHeader("Content-Length", String(info.size));
337
+ res.setHeader("X-Content-Type-Options", "nosniff");
338
+ res.setHeader("Content-Security-Policy", "default-src 'none'; sandbox");
339
+ res.setHeader("Content-Disposition", contentDisposition(attachment.name, image ? "inline" : "attachment"));
340
+ const stream = handle.createReadStream({ autoClose: false });
341
+ await pipeline(stream, res).finally(async () => handle.close());
342
+ }
343
+ function validateLocalRequest(configuredHost, additionalHosts) {
344
+ return (req, _res, next) => {
345
+ try {
346
+ const host = normalizedAuthority(req.headers.host);
347
+ if (!isAllowedWebHostname(host.hostname, configuredHost, systemHostname(), additionalHosts)) {
348
+ throw new WebConsoleError("untrusted_host", "This Host is not allowed for the local web console.", 421);
349
+ }
350
+ if (isMutation(req.method)) {
351
+ if (req.headers["sec-fetch-site"] === "cross-site") {
352
+ throw new WebConsoleError("cross_site_request", "Cross-site mutations are not allowed.", 403);
353
+ }
354
+ const rawOrigin = req.headers.origin;
355
+ if (rawOrigin !== undefined) {
356
+ let origin;
357
+ try {
358
+ origin = new URL(rawOrigin);
359
+ }
360
+ catch {
361
+ throw new WebConsoleError("invalid_origin", "Request Origin is invalid.", 403);
362
+ }
363
+ if ((origin.protocol !== "http:" && origin.protocol !== "https:") || origin.host.toLowerCase() !== host.authority) {
364
+ throw new WebConsoleError("origin_mismatch", "Cross-origin mutations are not allowed.", 403);
365
+ }
366
+ }
367
+ }
368
+ next();
369
+ }
370
+ catch (error) {
371
+ next(error);
372
+ }
373
+ };
374
+ }
375
+ export function isAllowedWebHostname(hostname, configuredHost, machineHostname = systemHostname(), additionalHosts = []) {
376
+ const normalizedMachine = normalizeAllowedHostname(machineHostname);
377
+ const allowedConfiguredNames = new Set([
378
+ normalizedMachine,
379
+ `${normalizedMachine}.local`,
380
+ ...additionalHosts.map(normalizeAllowedHostname),
381
+ ]);
382
+ const normalizedConfigured = configuredHost.toLowerCase().replace(/^\[|\]$/gu, "");
383
+ if (isIP(normalizedConfigured) === 0 && /^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$/iu.test(normalizedConfigured)) {
384
+ allowedConfiguredNames.add(normalizedConfigured);
385
+ }
386
+ return isAllowedLocalHostname(hostname, allowedConfiguredNames);
387
+ }
388
+ function normalizedAuthority(value) {
389
+ if (value === undefined || value.trim().length === 0 || /[\s/@\\]/u.test(value)) {
390
+ throw new WebConsoleError("invalid_host", "Request Host is invalid.", 400);
391
+ }
392
+ let parsed;
393
+ try {
394
+ parsed = new URL(`http://${value}`);
395
+ }
396
+ catch {
397
+ throw new WebConsoleError("invalid_host", "Request Host is invalid.", 400);
398
+ }
399
+ return {
400
+ authority: parsed.host.toLowerCase(),
401
+ hostname: parsed.hostname.toLowerCase().replace(/\.$/u, ""),
402
+ };
403
+ }
404
+ function isAllowedLocalHostname(hostname, allowedConfiguredNames) {
405
+ const unwrapped = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
406
+ const ipKind = isIP(unwrapped);
407
+ if (ipKind === 4)
408
+ return isPrivateIpv4(unwrapped);
409
+ if (ipKind === 6) {
410
+ const normalized = unwrapped.toLowerCase();
411
+ return normalized === "::1" || normalized.startsWith("fe80:") || normalized.startsWith("fc") || normalized.startsWith("fd");
412
+ }
413
+ return unwrapped === "localhost"
414
+ || unwrapped.endsWith(".localhost")
415
+ || allowedConfiguredNames.has(unwrapped);
416
+ }
417
+ function resolveAllowedHosts(configured, env) {
418
+ const fromEnv = env?.MONO_AGENT_WEB_ALLOWED_HOSTS?.split(",") ?? [];
419
+ return [...new Set([...(configured ?? []), ...fromEnv]
420
+ .map((value) => value.trim())
421
+ .filter((value) => value.length > 0)
422
+ .map(normalizeAllowedHostname))];
423
+ }
424
+ function normalizeAllowedHostname(value) {
425
+ const normalized = value.trim().toLowerCase().replace(/\.$/u, "");
426
+ if (normalized.length === 0
427
+ || normalized.includes(":")
428
+ || !/^[a-z0-9](?:[a-z0-9.-]{0,251}[a-z0-9])?$/u.test(normalized)) {
429
+ throw new WebConsoleError("invalid_allowed_host", `Invalid allowed web hostname: ${value}`, 400);
430
+ }
431
+ return normalized;
432
+ }
433
+ function isPrivateIpv4(value) {
434
+ const [first = -1, second = -1] = value.split(".").map(Number);
435
+ return first === 0
436
+ || first === 10
437
+ || first === 127
438
+ || (first === 169 && second === 254)
439
+ || (first === 172 && second >= 16 && second <= 31)
440
+ || (first === 192 && second === 168)
441
+ || (first === 100 && second >= 64 && second <= 127);
442
+ }
443
+ function securityHeaders(_req, res, next) {
444
+ res.setHeader("X-Content-Type-Options", "nosniff");
445
+ res.setHeader("Referrer-Policy", "no-referrer");
446
+ res.setHeader("X-Frame-Options", "DENY");
447
+ res.setHeader("Cross-Origin-Resource-Policy", "same-origin");
448
+ res.setHeader("Content-Security-Policy", "default-src 'self'; connect-src 'self'; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; script-src 'self'; font-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'none'");
449
+ next();
450
+ }
451
+ function parseCreateThread(value) {
452
+ const body = requireRecord(value);
453
+ return { sourceId: requireString(body.sourceId, "sourceId", 256) };
454
+ }
455
+ function parsePatchAgent(value) {
456
+ const body = requireRecord(value);
457
+ if (typeof body.pinned !== "boolean")
458
+ throw invalidBody("pinned must be boolean.");
459
+ return { pinned: body.pinned };
460
+ }
461
+ function parsePatchThread(value) {
462
+ const body = requireRecord(value);
463
+ const title = optionalString(body.title, "title", 120);
464
+ const archived = body.archived;
465
+ if (archived !== undefined && typeof archived !== "boolean")
466
+ throw invalidBody("archived must be boolean.");
467
+ if (title === undefined && archived === undefined)
468
+ throw invalidBody("Provide title or archived.");
469
+ return { ...(title === undefined ? {} : { title }), ...(archived === undefined ? {} : { archived }) };
470
+ }
471
+ function parseTurn(value) {
472
+ const body = requireRecord(value);
473
+ const text = body.text === undefined ? undefined : requireString(body.text, "text", 200_000, true);
474
+ const attachmentIds = body.attachmentIds;
475
+ if (attachmentIds !== undefined && (!Array.isArray(attachmentIds) || !attachmentIds.every((id) => typeof id === "string" && id.length > 0))) {
476
+ throw invalidBody("attachmentIds must be an array of ids.");
477
+ }
478
+ const model = optionalString(body.model, "model", 512);
479
+ const effort = optionalString(body.effort, "effort", 128);
480
+ return {
481
+ ...(text === undefined ? {} : { text }),
482
+ ...(attachmentIds === undefined ? {} : { attachmentIds }),
483
+ ...(model === undefined ? {} : { model }),
484
+ ...(effort === undefined ? {} : { effort }),
485
+ };
486
+ }
487
+ function parseCreateUpload(value) {
488
+ const body = requireRecord(value);
489
+ const sizeBytes = body.sizeBytes;
490
+ if (sizeBytes !== undefined && (!Number.isSafeInteger(sizeBytes) || sizeBytes < 0)) {
491
+ throw invalidBody("sizeBytes must be a non-negative integer.");
492
+ }
493
+ return {
494
+ name: requireString(body.name, "name", 1_024),
495
+ contentType: requireString(body.contentType, "contentType", 256),
496
+ ...(sizeBytes === undefined ? {} : { sizeBytes: sizeBytes }),
497
+ };
498
+ }
499
+ function requireRecord(value) {
500
+ if (typeof value !== "object" || value === null || Array.isArray(value))
501
+ throw invalidBody("JSON body must be an object.");
502
+ return value;
503
+ }
504
+ function requireString(value, field, max, allowEmpty = false) {
505
+ if (typeof value !== "string" || value.length > max || (!allowEmpty && value.trim().length === 0)) {
506
+ throw invalidBody(`${field} must be a${allowEmpty ? "" : " non-empty"} string of at most ${max} characters.`);
507
+ }
508
+ return value;
509
+ }
510
+ function optionalString(value, field, max) {
511
+ return value === undefined ? undefined : requireString(value, field, max);
512
+ }
513
+ function invalidBody(message) {
514
+ return new WebConsoleError("invalid_request", message, 400);
515
+ }
516
+ function pathParam(value) {
517
+ const id = Array.isArray(value) ? value[0] : value;
518
+ if (typeof id !== "string" || id.length === 0 || id.length > 512)
519
+ throw invalidBody("Path id is invalid.");
520
+ return id;
521
+ }
522
+ function parseContentLength(value) {
523
+ if (value === undefined)
524
+ return undefined;
525
+ if (!/^\d+$/u.test(value))
526
+ throw invalidBody("Content-Length is invalid.");
527
+ const parsed = Number(value);
528
+ if (!Number.isSafeInteger(parsed))
529
+ throw invalidBody("Content-Length is invalid.");
530
+ return parsed;
531
+ }
532
+ function contentDisposition(name, disposition) {
533
+ const ascii = name.replace(/[^\x20-\x7e]/gu, "_").replace(/["\\]/gu, "_").slice(0, 150) || "attachment";
534
+ const encoded = encodeURIComponent(name).replace(/[!'()*]/gu, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
535
+ return `${disposition}; filename="${ascii}"; filename*=UTF-8''${encoded}`;
536
+ }
537
+ function formatSse(event) {
538
+ return `id: ${event.id}\nevent: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`;
539
+ }
540
+ function isMutation(method) {
541
+ return method !== "GET" && method !== "HEAD" && method !== "OPTIONS";
542
+ }
543
+ function normalizePort(value) {
544
+ if (!Number.isInteger(value) || value < 0 || value > 65_535)
545
+ throw new WebConsoleError("invalid_port", "Web port must be an integer from 0 to 65535.", 400);
546
+ return value;
547
+ }
548
+ function defaultStaticDir() {
549
+ return resolve(dirname(fileURLToPath(import.meta.url)), "../webapp/dist");
550
+ }
551
+ async function closeServerBounded(server) {
552
+ const closing = close(server);
553
+ server.closeIdleConnections();
554
+ let timer;
555
+ const forced = new Promise((resolvePromise) => {
556
+ timer = setTimeout(() => {
557
+ server.closeAllConnections();
558
+ resolvePromise();
559
+ }, FORCE_CLOSE_AFTER_MS);
560
+ timer.unref();
561
+ });
562
+ await Promise.race([closing, forced]);
563
+ if (timer !== undefined)
564
+ clearTimeout(timer);
565
+ }
566
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}