@datnguyennnx/localterm-server 0.0.15 → 0.1.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 (106) hide show
  1. package/dist/agent/rpc.d.ts +22 -0
  2. package/dist/agent/rpc.d.ts.map +1 -0
  3. package/dist/agent/rpc.js +243 -0
  4. package/dist/agent/rpc.js.map +1 -0
  5. package/dist/agent/token.d.ts +21 -0
  6. package/dist/agent/token.d.ts.map +1 -0
  7. package/dist/agent/token.js +56 -0
  8. package/dist/agent/token.js.map +1 -0
  9. package/dist/agent-rpc.d.ts +0 -5
  10. package/dist/agent-rpc.d.ts.map +1 -1
  11. package/dist/agent-rpc.js +34 -14
  12. package/dist/agent-rpc.js.map +1 -1
  13. package/dist/agent-token.d.ts.map +1 -1
  14. package/dist/agent-token.js +10 -7
  15. package/dist/agent-token.js.map +1 -1
  16. package/dist/constants.js.map +1 -1
  17. package/dist/ensure-spawn-helper-executable.js +3 -3
  18. package/dist/ensure-spawn-helper-executable.js.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/osc-chunk-parser.d.ts +32 -0
  22. package/dist/osc-chunk-parser.d.ts.map +1 -0
  23. package/dist/osc-chunk-parser.js +56 -0
  24. package/dist/osc-chunk-parser.js.map +1 -0
  25. package/dist/osc133-chunk-parser.d.ts +9 -5
  26. package/dist/osc133-chunk-parser.d.ts.map +1 -1
  27. package/dist/osc133-chunk-parser.js +9 -25
  28. package/dist/osc133-chunk-parser.js.map +1 -1
  29. package/dist/osc7-chunk-parser.d.ts +8 -5
  30. package/dist/osc7-chunk-parser.d.ts.map +1 -1
  31. package/dist/osc7-chunk-parser.js +9 -25
  32. package/dist/osc7-chunk-parser.js.map +1 -1
  33. package/dist/output-batcher.d.ts +2 -1
  34. package/dist/output-batcher.d.ts.map +1 -1
  35. package/dist/output-batcher.js +3 -2
  36. package/dist/output-batcher.js.map +1 -1
  37. package/dist/parser/osc.d.ts +32 -0
  38. package/dist/parser/osc.d.ts.map +1 -0
  39. package/dist/parser/osc.js +56 -0
  40. package/dist/parser/osc.js.map +1 -0
  41. package/dist/parser/osc133-chunk-parser.d.ts +12 -0
  42. package/dist/parser/osc133-chunk-parser.d.ts.map +1 -0
  43. package/dist/parser/osc133-chunk-parser.js +13 -0
  44. package/dist/parser/osc133-chunk-parser.js.map +1 -0
  45. package/dist/parser/osc7-chunk-parser.d.ts +10 -0
  46. package/dist/parser/osc7-chunk-parser.d.ts.map +1 -0
  47. package/dist/parser/osc7-chunk-parser.js +13 -0
  48. package/dist/parser/osc7-chunk-parser.js.map +1 -0
  49. package/dist/parser/parse-osc133-from-chunk.d.ts +10 -0
  50. package/dist/parser/parse-osc133-from-chunk.d.ts.map +1 -0
  51. package/dist/parser/parse-osc133-from-chunk.js +49 -0
  52. package/dist/parser/parse-osc133-from-chunk.js.map +1 -0
  53. package/dist/parser/parse-osc7-from-chunk.d.ts +2 -0
  54. package/dist/parser/parse-osc7-from-chunk.d.ts.map +1 -0
  55. package/dist/parser/parse-osc7-from-chunk.js +33 -0
  56. package/dist/parser/parse-osc7-from-chunk.js.map +1 -0
  57. package/dist/parser/strip-ansi.d.ts +13 -0
  58. package/dist/parser/strip-ansi.d.ts.map +1 -0
  59. package/dist/parser/strip-ansi.js +26 -0
  60. package/dist/parser/strip-ansi.js.map +1 -0
  61. package/dist/schemas.js +1 -1
  62. package/dist/schemas.js.map +1 -1
  63. package/dist/server/index.d.ts +25 -0
  64. package/dist/server/index.d.ts.map +1 -0
  65. package/dist/server/index.js +435 -0
  66. package/dist/server/index.js.map +1 -0
  67. package/dist/server/security.d.ts +5 -0
  68. package/dist/server/security.d.ts.map +1 -0
  69. package/dist/server/security.js +63 -0
  70. package/dist/server/security.js.map +1 -0
  71. package/dist/server/static-resolver.d.ts +7 -0
  72. package/dist/server/static-resolver.d.ts.map +1 -0
  73. package/dist/server/static-resolver.js +65 -0
  74. package/dist/server/static-resolver.js.map +1 -0
  75. package/dist/session/default-shell.d.ts +2 -0
  76. package/dist/session/default-shell.d.ts.map +1 -0
  77. package/dist/session/default-shell.js +44 -0
  78. package/dist/session/default-shell.js.map +1 -0
  79. package/dist/session/ensure-spawn-helper-executable.d.ts +2 -0
  80. package/dist/session/ensure-spawn-helper-executable.d.ts.map +1 -0
  81. package/dist/session/ensure-spawn-helper-executable.js +34 -0
  82. package/dist/session/ensure-spawn-helper-executable.js.map +1 -0
  83. package/dist/session/session-registry.d.ts +9 -0
  84. package/dist/session/session-registry.d.ts.map +1 -0
  85. package/dist/session/session-registry.js +19 -0
  86. package/dist/session/session-registry.js.map +1 -0
  87. package/dist/session/session.d.ts +62 -0
  88. package/dist/session/session.d.ts.map +1 -0
  89. package/dist/session/session.js +245 -0
  90. package/dist/session/session.js.map +1 -0
  91. package/dist/session.d.ts +1 -1
  92. package/dist/session.d.ts.map +1 -1
  93. package/dist/session.js +12 -5
  94. package/dist/session.js.map +1 -1
  95. package/dist/static-resolver.js +1 -1
  96. package/dist/static-resolver.js.map +1 -1
  97. package/dist/utils/parse-osc133-from-chunk.d.ts.map +1 -1
  98. package/dist/utils/parse-osc133-from-chunk.js +10 -5
  99. package/dist/utils/parse-osc133-from-chunk.js.map +1 -1
  100. package/dist/utils/parse-osc7-from-chunk.d.ts.map +1 -1
  101. package/dist/utils/parse-osc7-from-chunk.js +4 -3
  102. package/dist/utils/parse-osc7-from-chunk.js.map +1 -1
  103. package/dist/utils/strip-ansi.d.ts.map +1 -1
  104. package/dist/utils/strip-ansi.js +6 -8
  105. package/dist/utils/strip-ansi.js.map +1 -1
  106. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-osc7-from-chunk.d.ts","sourceRoot":"","sources":["../../src/parser/parse-osc7-from-chunk.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAuB1D,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { OSC_BEL_TERMINATOR, OSC_ST_TERMINATOR } from "./osc.js";
2
+ const OSC7_PREFIX = "\x1b]7;";
3
+ const extractOsc7Path = (url) => {
4
+ try {
5
+ return decodeURIComponent(new URL(url).pathname);
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ };
11
+ export const parseOsc7FromChunk = (data) => {
12
+ let searchFrom = 0;
13
+ let lastPath = null;
14
+ while (searchFrom < data.length) {
15
+ const sequenceStart = data.indexOf(OSC7_PREFIX, searchFrom);
16
+ if (sequenceStart === -1)
17
+ break;
18
+ const payloadStart = sequenceStart + OSC7_PREFIX.length;
19
+ const belIndex = data.indexOf(OSC_BEL_TERMINATOR, payloadStart);
20
+ const stIndex = data.indexOf(OSC_ST_TERMINATOR, payloadStart);
21
+ const payloadEnd = belIndex !== -1 && (stIndex === -1 || belIndex < stIndex) ? belIndex : stIndex;
22
+ if (payloadEnd === -1)
23
+ break;
24
+ const path = extractOsc7Path(data.slice(payloadStart, payloadEnd));
25
+ if (path)
26
+ lastPath = path;
27
+ // BEL is 1 byte, ST is 2 bytes — skip the correct amount so we don't
28
+ // re-scan the terminator bytes as the start of the next sequence.
29
+ searchFrom = payloadEnd + (payloadEnd === belIndex ? 1 : 2);
30
+ }
31
+ return lastPath;
32
+ };
33
+ //# sourceMappingURL=parse-osc7-from-chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-osc7-from-chunk.js","sourceRoot":"","sources":["../../src/parser/parse-osc7-from-chunk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,eAAe,GAAG,CAAC,GAAW,EAAiB,EAAE;IACrD,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAiB,EAAE;IAChE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAkB,IAAI,CAAC;IAEnC,OAAO,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,aAAa,KAAK,CAAC,CAAC;YAAE,MAAM;QAEhC,MAAM,YAAY,GAAG,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,UAAU,GACd,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QACjF,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,MAAM;QAE7B,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;QACnE,IAAI,IAAI;YAAE,QAAQ,GAAG,IAAI,CAAC;QAC1B,qEAAqE;QACrE,kEAAkE;QAClE,UAAU,GAAG,UAAU,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Strip ANSI/VT escape sequences from terminal output, keeping visible text.
3
+ * Minimal implementation — handles the common CSI SGR/cursor/move sequences,
4
+ * OSC sequences, and other escape codes produced by modern shells and TUIs.
5
+ * Does NOT handle every possible VT sequence; coverage is bounded by the
6
+ * sequences observed in common shell output (bash/zsh prompts, common TUIs,
7
+ * build tools, package managers).
8
+ *
9
+ * Not a streaming parser — input must be a complete string chunk.
10
+ * For split sequences across chunks, the caller should concatenate first.
11
+ */
12
+ export declare const stripAnsi: (input: string) => string;
13
+ //# sourceMappingURL=strip-ansi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strip-ansi.d.ts","sourceRoot":"","sources":["../../src/parser/strip-ansi.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAYzC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /* eslint-disable no-control-regex -- entire purpose is stripping control characters */
2
+ /**
3
+ * Strip ANSI/VT escape sequences from terminal output, keeping visible text.
4
+ * Minimal implementation — handles the common CSI SGR/cursor/move sequences,
5
+ * OSC sequences, and other escape codes produced by modern shells and TUIs.
6
+ * Does NOT handle every possible VT sequence; coverage is bounded by the
7
+ * sequences observed in common shell output (bash/zsh prompts, common TUIs,
8
+ * build tools, package managers).
9
+ *
10
+ * Not a streaming parser — input must be a complete string chunk.
11
+ * For split sequences across chunks, the caller should concatenate first.
12
+ */
13
+ export const stripAnsi = (input) => {
14
+ // Multiple passes: each regex targets one family of escape sequences.
15
+ // A single combined regex is more fragile across the different byte ranges
16
+ // used by each family (OSC, CSI, ESC, C1, C0). Five passes over the string
17
+ // is trivially fast at realistic terminal output sizes (KB–low MB).
18
+ return input
19
+ .replace(/\u001b\](?:.*?(?:\u001b\\|\u0007))/g, "")
20
+ .replace(/\u001b\[[\d;]*[A-Za-z@-~]/g, "")
21
+ .replace(/\u001b\[[\u0020-\u002f]*[\u0040-\u007e]/g, "")
22
+ .replace(/\u001b[\u0020-\u002f]*[\u0030-\u007e]/g, "")
23
+ .replace(/[\u009b\u009d\u0090\u0098\u009e\u009f]/g, "")
24
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "");
25
+ };
26
+ //# sourceMappingURL=strip-ansi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strip-ansi.js","sourceRoot":"","sources":["../../src/parser/strip-ansi.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IACjD,sEAAsE;IACtE,2EAA2E;IAC3E,4EAA4E;IAC5E,oEAAoE;IACpE,OAAO,KAAK;SACT,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC;SAClD,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;SACzC,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC;SACvD,OAAO,CAAC,wCAAwC,EAAE,EAAE,CAAC;SACrD,OAAO,CAAC,yCAAyC,EAAE,EAAE,CAAC;SACtD,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC"}
package/dist/schemas.js CHANGED
@@ -87,7 +87,7 @@ const cwdMessageSchema = z
87
87
  const agentOutputMessageSchema = z
88
88
  .object({
89
89
  type: z.literal("agent-output"),
90
- text: z.string(),
90
+ text: z.string().max(MAX_OUTPUT_BYTES),
91
91
  })
92
92
  .strict();
93
93
  const commandBoundaryMessageSchema = z
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { SessionRegistry } from "../session/session-registry.js";
2
+ export interface ServerOptions {
3
+ port?: number;
4
+ host?: string;
5
+ staticRoot?: string | null;
6
+ agentToken?: string;
7
+ allowDestructiveCommands?: boolean;
8
+ maxConcurrentSessions?: number;
9
+ }
10
+ export interface RunningServer {
11
+ port: number;
12
+ host: string;
13
+ registry: SessionRegistry;
14
+ stop: () => Promise<void>;
15
+ }
16
+ export declare const createServer: (options?: ServerOptions) => Promise<RunningServer>;
17
+ export type { Session } from "../session/session.js";
18
+ export type { SessionRegistry } from "../session/session-registry.js";
19
+ export type * from "../types.js";
20
+ export { DEFAULT_HOST, DEFAULT_PORT, WS_CLOSE_BACKPRESSURE } from "../constants.js";
21
+ export { isLoopbackHost } from "./security.js";
22
+ export { healthSchema } from "../schemas.js";
23
+ export { ServerErrorException, formatServerError, isServerErrorException, serverError, } from "../errors.js";
24
+ export type { ServerError, ServerErrorCode, ServerErrorKind } from "../errors.js";
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AASjE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAgED,eAAO,MAAM,YAAY,GAAU,UAAS,aAAkB,KAAG,OAAO,CAAC,aAAa,CA2XrF,CAAC;AAEF,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,mBAAmB,aAAa,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,435 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { serve } from "@hono/node-server";
4
+ import { createNodeWebSocket } from "@hono/node-ws";
5
+ import { Hono } from "hono";
6
+ import { DEFAULT_HOST, DEFAULT_PORT, HTTP_STATUS_NOT_FOUND, MAX_CONCURRENT_SESSIONS, SERVER_STOP_GRACE_MS, WS_BACKPRESSURE_THRESHOLD_BYTES, WS_CLOSE_BACKPRESSURE, WS_CLOSE_CAPACITY_REACHED, WS_CLOSE_POLICY_VIOLATION, WS_HEARTBEAT_INTERVAL_MS, WS_OUTBOUND_DRAIN_POLL_MS, WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES, WS_OUTBOUND_RESUME_LOW_WATER_BYTES, WS_READY_STATE_OPEN, } from "../constants.js";
7
+ import { ServerErrorException, serverError } from "../errors.js";
8
+ import { clientToServerMessageSchema } from "../schemas.js";
9
+ import { enforceLoopback, isLoopbackHost, loopbackMiddleware } from "./security.js";
10
+ import { OutputBatcher } from "../output-batcher.js";
11
+ import { Session } from "../session/session.js";
12
+ import { SessionRegistry } from "../session/session-registry.js";
13
+ import { resolveStaticAsset } from "./static-resolver.js";
14
+ import { getHeartbeatAction } from "../utils/get-heartbeat-action.js";
15
+ import { SHELL_INTEGRATION_ENV_VAR } from "../shell-integration/index.js";
16
+ import { validateAgentToken, loadOrCreateAgentToken } from "../agent/token.js";
17
+ import { handleRpcRequest } from "../agent/rpc.js";
18
+ import { stripAnsi } from "../parser/strip-ansi.js";
19
+ const REVALIDATED_STATIC_PATHS = new Set(["/sw.js", "/manifest.webmanifest"]);
20
+ const getRawBufferedAmount = (raw) => {
21
+ if (!raw || typeof raw !== "object")
22
+ return 0;
23
+ const candidate = Reflect.get(raw, "bufferedAmount");
24
+ return typeof candidate === "number" ? candidate : 0;
25
+ };
26
+ const callRawMethod = (raw, method) => {
27
+ if (!raw || typeof raw !== "object")
28
+ return false;
29
+ const candidate = Reflect.get(raw, method);
30
+ if (typeof candidate !== "function")
31
+ return false;
32
+ try {
33
+ candidate.call(raw);
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ };
40
+ const onRawEvent = (raw, event, listener) => {
41
+ if (!raw || typeof raw !== "object")
42
+ return null;
43
+ const on = Reflect.get(raw, "on");
44
+ const off = Reflect.get(raw, "off");
45
+ if (typeof on !== "function" || typeof off !== "function")
46
+ return null;
47
+ on.call(raw, event, listener);
48
+ return () => {
49
+ try {
50
+ off.call(raw, event, listener);
51
+ }
52
+ catch {
53
+ /* socket already torn down */
54
+ }
55
+ };
56
+ };
57
+ const safeSendRaw = (ws, payload) => {
58
+ if (ws.readyState !== WS_READY_STATE_OPEN)
59
+ return;
60
+ if (getRawBufferedAmount(ws.raw) > WS_BACKPRESSURE_THRESHOLD_BYTES) {
61
+ ws.close(WS_CLOSE_BACKPRESSURE, "backpressure");
62
+ return;
63
+ }
64
+ try {
65
+ ws.send(payload);
66
+ }
67
+ catch {
68
+ /* socket closed between readyState check and send */
69
+ }
70
+ };
71
+ const safeSend = (ws, payload) => {
72
+ safeSendRaw(ws, JSON.stringify(payload));
73
+ };
74
+ export const createServer = async (options = {}) => {
75
+ const port = options.port ?? DEFAULT_PORT;
76
+ const host = options.host ?? DEFAULT_HOST;
77
+ if (!isLoopbackHost(host)) {
78
+ throw new ServerErrorException(serverError.nonLoopbackHost(host));
79
+ }
80
+ const staticRoot = typeof options.staticRoot === "string" ? path.resolve(options.staticRoot) : null;
81
+ loadOrCreateAgentToken();
82
+ const registry = new SessionRegistry();
83
+ const app = new Hono();
84
+ const { injectWebSocket, upgradeWebSocket, wss } = createNodeWebSocket({ app });
85
+ const api = new Hono();
86
+ api.use("*", loopbackMiddleware);
87
+ api.get("/health", (context) => context.json({ ok: true, sessions: registry.size() }));
88
+ api.notFound((context) => context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND));
89
+ app.route("/api", api);
90
+ app.get("/ws", upgradeWebSocket((context) => {
91
+ const blocked = enforceLoopback(context);
92
+ if (blocked) {
93
+ return { onOpen: (_event, ws) => ws.close(WS_CLOSE_POLICY_VIOLATION, "forbidden") };
94
+ }
95
+ let session = null;
96
+ let drainPollTimer = null;
97
+ let heartbeatTimer = null;
98
+ let stopHeartbeat = null;
99
+ let outputBatcher = null;
100
+ const stopDrainPoll = () => {
101
+ if (drainPollTimer === null)
102
+ return;
103
+ clearInterval(drainPollTimer);
104
+ drainPollTimer = null;
105
+ };
106
+ const stopHeartbeatChecks = () => {
107
+ if (heartbeatTimer !== null) {
108
+ clearInterval(heartbeatTimer);
109
+ heartbeatTimer = null;
110
+ }
111
+ if (stopHeartbeat) {
112
+ stopHeartbeat();
113
+ stopHeartbeat = null;
114
+ }
115
+ };
116
+ const rawCwd = context.req.query("cwd");
117
+ let requestedCwd;
118
+ if (rawCwd) {
119
+ try {
120
+ const stat = fs.statSync(rawCwd);
121
+ if (stat.isDirectory())
122
+ requestedCwd = rawCwd;
123
+ }
124
+ catch {
125
+ /* invalid or inaccessible path; fall back to default cwd */
126
+ }
127
+ }
128
+ const rawMode = context.req.query("mode");
129
+ const sessionMode = rawMode === "agent" ? "agent" : "human";
130
+ return {
131
+ onOpen(_event, ws) {
132
+ if (sessionMode === "agent") {
133
+ const rawToken = context.req.query("token");
134
+ if (!rawToken || !validateAgentToken(rawToken)) {
135
+ ws.close(1008, "invalid agent token");
136
+ return;
137
+ }
138
+ }
139
+ const maxSessions = options.maxConcurrentSessions ?? MAX_CONCURRENT_SESSIONS;
140
+ if (registry.size() >= maxSessions) {
141
+ ws.close(WS_CLOSE_CAPACITY_REACHED, "session capacity reached");
142
+ return;
143
+ }
144
+ const integrationEnv = sessionMode === "agent" ? { [SHELL_INTEGRATION_ENV_VAR]: "1" } : undefined;
145
+ const newSession = new Session({
146
+ cwd: requestedCwd,
147
+ mode: sessionMode,
148
+ env: integrationEnv,
149
+ });
150
+ session = newSession;
151
+ registry.register(newSession);
152
+ // Heartbeat. Without this, half-open sockets (laptop sleep, network
153
+ // dropout) never surface as a `close` event and the daemon keeps
154
+ // streaming PTY output into the void. We only enable it if the raw
155
+ // socket exposes `on("pong")` — otherwise the timer would tick with
156
+ // no pongs ever observed and kill healthy connections after the
157
+ // first idle window.
158
+ let lastPongAt = Date.now();
159
+ let pendingPingAt = 0;
160
+ stopHeartbeat = onRawEvent(ws.raw, "pong", () => {
161
+ lastPongAt = Date.now();
162
+ pendingPingAt = 0;
163
+ });
164
+ if (stopHeartbeat) {
165
+ heartbeatTimer = setInterval(() => {
166
+ if (ws.readyState !== WS_READY_STATE_OPEN)
167
+ return;
168
+ const now = Date.now();
169
+ const idleMs = now - lastPongAt;
170
+ const heartbeatAction = getHeartbeatAction(now, lastPongAt, pendingPingAt);
171
+ if (heartbeatAction === "wait")
172
+ return;
173
+ if (heartbeatAction === "grace-ping") {
174
+ pendingPingAt = now;
175
+ callRawMethod(ws.raw, "ping");
176
+ return;
177
+ }
178
+ if (heartbeatAction === "terminate") {
179
+ console.warn(`ws heartbeat timeout: no pong for ${idleMs}ms (grace ${now - pendingPingAt}ms, pid ${newSession.pid}); terminating`);
180
+ stopHeartbeatChecks();
181
+ if (!callRawMethod(ws.raw, "terminate"))
182
+ ws.close();
183
+ return;
184
+ }
185
+ callRawMethod(ws.raw, "ping");
186
+ }, WS_HEARTBEAT_INTERVAL_MS);
187
+ heartbeatTimer.unref?.();
188
+ }
189
+ // Outbound flow control. When the WS buffer climbs past the high
190
+ // water mark we pause the PTY (OS pipe back-pressure stops the
191
+ // child process producing more output) and start polling for the
192
+ // buffer to drain back below the low water mark. This way bursty
193
+ // output (`cat`, build logs, npm install) doesn't kill the
194
+ // connection — only a genuinely wedged receiver eventually trips
195
+ // the WS_BACKPRESSURE_THRESHOLD_BYTES emergency in safeSend.
196
+ const ensureDrainPoll = () => {
197
+ if (drainPollTimer !== null)
198
+ return;
199
+ drainPollTimer = setInterval(() => {
200
+ if (!newSession.isPaused) {
201
+ stopDrainPoll();
202
+ return;
203
+ }
204
+ if (getRawBufferedAmount(ws.raw) <= WS_OUTBOUND_RESUME_LOW_WATER_BYTES) {
205
+ newSession.resume();
206
+ stopDrainPoll();
207
+ }
208
+ }, WS_OUTBOUND_DRAIN_POLL_MS);
209
+ drainPollTimer.unref?.();
210
+ };
211
+ // Wire listeners BEFORE the first safeSend so any synchronous emit
212
+ // from Session (current or future) reaches the client. Today
213
+ // node-pty's data/exit are async, but this guards against drift.
214
+ outputBatcher = new OutputBatcher((output) => {
215
+ // Fast-path: skip copy when already a full-buffer view
216
+ const raw = output.buffer;
217
+ const byteOffset = output.byteOffset;
218
+ const byteLength = output.byteLength;
219
+ if (byteOffset === 0 && byteLength === raw.byteLength) {
220
+ safeSendRaw(ws, raw);
221
+ }
222
+ else {
223
+ safeSendRaw(ws, raw.slice(byteOffset, byteOffset + byteLength));
224
+ }
225
+ if (!newSession.isPaused &&
226
+ getRawBufferedAmount(ws.raw) >= WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES) {
227
+ newSession.pause();
228
+ ensureDrainPoll();
229
+ }
230
+ });
231
+ const onOutput = (data) => outputBatcher?.push(data);
232
+ const onTitle = (title) => safeSend(ws, { type: "title", title });
233
+ const onCwd = (cwd) => safeSend(ws, { type: "cwd", cwd });
234
+ const onExit = (code) => {
235
+ outputBatcher?.flush();
236
+ outputBatcher?.dispose();
237
+ outputBatcher = null;
238
+ stopDrainPoll();
239
+ stopHeartbeatChecks();
240
+ safeSend(ws, { type: "exit", code });
241
+ ws.close();
242
+ };
243
+ newSession.on("output", onOutput);
244
+ // Agent-mode gets ANSI-stripped text alongside raw binary output.
245
+ if (sessionMode === "agent") {
246
+ const onAgentOutput = (data) => {
247
+ const text = stripAnsi(data);
248
+ if (text)
249
+ safeSend(ws, { type: "agent-output", text });
250
+ };
251
+ newSession.on("output", onAgentOutput);
252
+ }
253
+ const onCommandBoundary = (boundary) => {
254
+ safeSend(ws, {
255
+ type: "command-boundary",
256
+ phase: boundary.phase,
257
+ ...(boundary.exitCode !== undefined ? { exitCode: boundary.exitCode } : {}),
258
+ });
259
+ };
260
+ newSession.on("commandBoundary", onCommandBoundary);
261
+ newSession.on("title", onTitle);
262
+ newSession.on("cwd", onCwd);
263
+ newSession.on("exit", onExit);
264
+ safeSend(ws, {
265
+ type: "session",
266
+ shell: newSession.shell,
267
+ shellName: newSession.shellBaseName,
268
+ pid: newSession.pid,
269
+ cwd: newSession.cwd,
270
+ });
271
+ },
272
+ onMessage(event, ws) {
273
+ if (!session)
274
+ return;
275
+ let rawPayload;
276
+ try {
277
+ const raw = typeof event.data === "string" ? event.data : event.data.toString();
278
+ rawPayload = JSON.parse(raw);
279
+ }
280
+ catch {
281
+ return;
282
+ }
283
+ const parsed = clientToServerMessageSchema.safeParse(rawPayload);
284
+ if (!parsed.success)
285
+ return;
286
+ if (parsed.data.type === "input") {
287
+ session.write(parsed.data.data);
288
+ }
289
+ else if (parsed.data.type === "resize") {
290
+ session.resize(parsed.data.cols, parsed.data.rows);
291
+ }
292
+ else if (parsed.data.type === "flow-pause") {
293
+ session.pause();
294
+ }
295
+ else if (parsed.data.type === "flow-resume") {
296
+ session.resume();
297
+ }
298
+ else if (parsed.data.type === "rpc") {
299
+ handleRpcRequest({
300
+ registry,
301
+ allowDestructiveCommands: options.allowDestructiveCommands ?? false,
302
+ sendResponse: (rpcId, result, error) => {
303
+ safeSend(ws, { type: "rpc-response", id: rpcId, result, error });
304
+ },
305
+ }, { id: parsed.data.id, method: parsed.data.method, params: parsed.data.params });
306
+ }
307
+ },
308
+ onClose(event) {
309
+ outputBatcher?.dispose();
310
+ outputBatcher = null;
311
+ stopDrainPoll();
312
+ stopHeartbeatChecks();
313
+ // Most "the terminal randomly died" reports are actually the WS
314
+ // closing for a reason we never surfaced; logging code+reason+
315
+ // wasClean here makes the next incident a 1-line lookup in
316
+ // ~/.localterm/server.log.
317
+ const pidLabel = session ? ` pid ${session.pid}` : "";
318
+ console.info(`ws closed${pidLabel}: code=${event.code} reason=${JSON.stringify(event.reason)} wasClean=${event.wasClean}`);
319
+ if (!session)
320
+ return;
321
+ registry.unregister(session);
322
+ session.dispose();
323
+ session = null;
324
+ },
325
+ onError(event) {
326
+ outputBatcher?.dispose();
327
+ outputBatcher = null;
328
+ stopDrainPoll();
329
+ stopHeartbeatChecks();
330
+ const errorValue = event && typeof event === "object" ? (Reflect.get(event, "error") ?? event) : event;
331
+ const message = errorValue instanceof Error ? errorValue.message : String(errorValue);
332
+ const pidLabel = session ? ` pid ${session.pid}` : "";
333
+ console.error(`ws error${pidLabel}: ${message}`);
334
+ if (!session)
335
+ return;
336
+ registry.unregister(session);
337
+ session.dispose();
338
+ session = null;
339
+ },
340
+ };
341
+ }));
342
+ if (staticRoot) {
343
+ app.use("*", loopbackMiddleware);
344
+ app.get("*", (context) => {
345
+ const requestPath = context.req.path;
346
+ if (requestPath.startsWith("/api/") || requestPath.startsWith("/ws")) {
347
+ return context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND);
348
+ }
349
+ const asset = resolveStaticAsset(staticRoot, requestPath);
350
+ if (!asset)
351
+ return context.text("not found", HTTP_STATUS_NOT_FOUND);
352
+ const shouldRevalidate = REVALIDATED_STATIC_PATHS.has(requestPath);
353
+ return new Response(new Uint8Array(asset.body), {
354
+ status: asset.status,
355
+ headers: {
356
+ "content-type": asset.contentType,
357
+ ...(shouldRevalidate ? { "cache-control": "no-cache" } : {}),
358
+ },
359
+ });
360
+ });
361
+ }
362
+ let httpServer = null;
363
+ let actualPort = port;
364
+ await new Promise((resolve, reject) => {
365
+ const handleError = (error) => {
366
+ reject(new ServerErrorException(serverError.listenFailed(host, port, error)));
367
+ };
368
+ const node = serve({
369
+ fetch: app.fetch,
370
+ hostname: host,
371
+ port,
372
+ }, () => {
373
+ const address = node.address();
374
+ if (address && typeof address === "object")
375
+ actualPort = address.port;
376
+ node.removeListener("error", handleError);
377
+ resolve();
378
+ });
379
+ node.once("error", handleError);
380
+ httpServer = node;
381
+ });
382
+ if (!httpServer) {
383
+ throw new ServerErrorException(serverError.listenFailed(host, port, new Error("hono serve() resolved without binding an http server")));
384
+ }
385
+ injectWebSocket(httpServer);
386
+ const stop = async () => {
387
+ registry.disposeAll();
388
+ // Forcibly tear down every WS first. node-pty + ws upgraded sockets
389
+ // aren't tracked in http.Server's keep-alive set, so target.close() would
390
+ // otherwise wait forever for them and the CLI's force-exit fallback would
391
+ // fire on every shutdown.
392
+ for (const client of wss.clients) {
393
+ try {
394
+ client.terminate();
395
+ }
396
+ catch {
397
+ /* socket already torn down */
398
+ }
399
+ }
400
+ try {
401
+ wss.close();
402
+ }
403
+ catch {
404
+ /* idempotent close — wss may already be closed */
405
+ }
406
+ if (!httpServer)
407
+ return;
408
+ const target = httpServer;
409
+ const closeAllConnections = Reflect.get(target, "closeAllConnections");
410
+ if (typeof closeAllConnections === "function") {
411
+ closeAllConnections.call(target);
412
+ }
413
+ await new Promise((resolve) => {
414
+ let settled = false;
415
+ const settle = () => {
416
+ if (settled)
417
+ return;
418
+ settled = true;
419
+ resolve();
420
+ };
421
+ const grace = setTimeout(settle, SERVER_STOP_GRACE_MS);
422
+ grace.unref?.();
423
+ target.close(() => {
424
+ clearTimeout(grace);
425
+ settle();
426
+ });
427
+ });
428
+ };
429
+ return { port: actualPort, host, registry, stop };
430
+ };
431
+ export { DEFAULT_HOST, DEFAULT_PORT, WS_CLOSE_BACKPRESSURE } from "../constants.js";
432
+ export { isLoopbackHost } from "./security.js";
433
+ export { healthSchema } from "../schemas.js";
434
+ export { ServerErrorException, formatServerError, isServerErrorException, serverError, } from "../errors.js";
435
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAmB,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,+BAA+B,EAC/B,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,kCAAkC,EAClC,kCAAkC,EAClC,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAyBpD,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;AAE9E,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAAU,EAAE;IACpD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACrD,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,GAAY,EAAE,MAA4B,EAAW,EAAE;IAC5E,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,OAAO,SAAS,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,KAAa,EAAE,QAAoB,EAAuB,EAAE;IAC5F,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,OAAO,EAAE,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACvE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9B,OAAO,GAAG,EAAE;QACV,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAClB,EAAmB,EACnB,OAAuD,EACjD,EAAE;IACR,IAAI,EAAE,CAAC,UAAU,KAAK,mBAAmB;QAAE,OAAO;IAClD,IAAI,oBAAoB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,+BAA+B,EAAE,CAAC;QACnE,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,EAAmB,EAAE,OAA8B,EAAQ,EAAE;IAC7E,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,UAAyB,EAAE,EAA0B,EAAE;IACxF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,oBAAoB,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GACd,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnF,sBAAsB,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACjC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACvF,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACvF,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvB,GAAG,CAAC,GAAG,CACL,KAAK,EACL,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,EAAE,WAAW,CAAC,EAAE,CAAC;QACtF,CAAC;QAED,IAAI,OAAO,GAAmB,IAAI,CAAC;QACnC,IAAI,cAAc,GAA0B,IAAI,CAAC;QACjD,IAAI,cAAc,GAA0B,IAAI,CAAC;QACjD,IAAI,aAAa,GAAwB,IAAI,CAAC;QAC9C,IAAI,aAAa,GAAyB,IAAI,CAAC;QAE/C,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,IAAI,cAAc,KAAK,IAAI;gBAAE,OAAO;YACpC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,mBAAmB,GAAG,GAAG,EAAE;YAC/B,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,aAAa,CAAC,cAAc,CAAC,CAAC;gBAC9B,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,EAAE,CAAC;gBAChB,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,YAAgC,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,IAAI,CAAC,WAAW,EAAE;oBAAE,YAAY,GAAG,MAAM,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAsB,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAE/E,OAAO;YACL,MAAM,CAAC,MAAM,EAAE,EAAE;gBACf,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/C,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;wBACtC,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,IAAI,uBAAuB,CAAC;gBAC7E,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC;oBACnC,EAAE,CAAC,KAAK,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;oBAChE,OAAO;gBACT,CAAC;gBACD,MAAM,cAAc,GAClB,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7E,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC;oBAC7B,GAAG,EAAE,YAAY;oBACjB,IAAI,EAAE,WAAW;oBACjB,GAAG,EAAE,cAAc;iBACpB,CAAC,CAAC;gBACH,OAAO,GAAG,UAAU,CAAC;gBACrB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAE9B,oEAAoE;gBACpE,iEAAiE;gBACjE,mEAAmE;gBACnE,oEAAoE;gBACpE,gEAAgE;gBAChE,qBAAqB;gBACrB,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,IAAI,aAAa,GAAG,CAAC,CAAC;gBACtB,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;oBAC9C,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACxB,aAAa,GAAG,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;gBACH,IAAI,aAAa,EAAE,CAAC;oBAClB,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;wBAChC,IAAI,EAAE,CAAC,UAAU,KAAK,mBAAmB;4BAAE,OAAO;wBAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBACvB,MAAM,MAAM,GAAG,GAAG,GAAG,UAAU,CAAC;wBAChC,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;wBAC3E,IAAI,eAAe,KAAK,MAAM;4BAAE,OAAO;wBACvC,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;4BACrC,aAAa,GAAG,GAAG,CAAC;4BACpB,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;4BAC9B,OAAO;wBACT,CAAC;wBACD,IAAI,eAAe,KAAK,WAAW,EAAE,CAAC;4BACpC,OAAO,CAAC,IAAI,CACV,qCAAqC,MAAM,aAAa,GAAG,GAAG,aAAa,WAAW,UAAU,CAAC,GAAG,gBAAgB,CACrH,CAAC;4BACF,mBAAmB,EAAE,CAAC;4BACtB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC;gCAAE,EAAE,CAAC,KAAK,EAAE,CAAC;4BACpD,OAAO;wBACT,CAAC;wBACD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oBAChC,CAAC,EAAE,wBAAwB,CAAC,CAAC;oBAC7B,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3B,CAAC;gBAED,iEAAiE;gBACjE,+DAA+D;gBAC/D,iEAAiE;gBACjE,kEAAkE;gBAClE,2DAA2D;gBAC3D,iEAAiE;gBACjE,6DAA6D;gBAC7D,MAAM,eAAe,GAAG,GAAG,EAAE;oBAC3B,IAAI,cAAc,KAAK,IAAI;wBAAE,OAAO;oBACpC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;wBAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;4BACzB,aAAa,EAAE,CAAC;4BAChB,OAAO;wBACT,CAAC;wBACD,IAAI,oBAAoB,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,kCAAkC,EAAE,CAAC;4BACvE,UAAU,CAAC,MAAM,EAAE,CAAC;4BACpB,aAAa,EAAE,CAAC;wBAClB,CAAC;oBACH,CAAC,EAAE,yBAAyB,CAAC,CAAC;oBAC9B,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3B,CAAC,CAAC;gBAEF,mEAAmE;gBACnE,6DAA6D;gBAC7D,iEAAiE;gBACjE,aAAa,GAAG,IAAI,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC3C,uDAAuD;oBACvD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAqB,CAAC;oBACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;oBACrC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;oBACrC,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC;wBACtD,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC;oBAClE,CAAC;oBACD,IACE,CAAC,UAAU,CAAC,QAAQ;wBACpB,oBAAoB,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,kCAAkC,EAClE,CAAC;wBACD,UAAU,CAAC,KAAK,EAAE,CAAC;wBACnB,eAAe,EAAE,CAAC;oBACpB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1E,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClE,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,EAAE;oBACrC,aAAa,EAAE,KAAK,EAAE,CAAC;oBACvB,aAAa,EAAE,OAAO,EAAE,CAAC;oBACzB,aAAa,GAAG,IAAI,CAAC;oBACrB,aAAa,EAAE,CAAC;oBAChB,mBAAmB,EAAE,CAAC;oBACtB,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACb,CAAC,CAAC;gBACF,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAClC,kEAAkE;gBAClE,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;oBAC5B,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;wBACrC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;wBAC7B,IAAI,IAAI;4BAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzD,CAAC,CAAC;oBACF,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBACzC,CAAC;gBACD,MAAM,iBAAiB,GAAG,CAAC,QAA8C,EAAE,EAAE;oBAC3E,QAAQ,CAAC,EAAE,EAAE;wBACX,IAAI,EAAE,kBAAkB;wBACxB,KAAK,EAAE,QAAQ,CAAC,KAIC;wBACjB,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC5E,CAAC,CAAC;gBACL,CAAC,CAAC;gBACF,UAAU,CAAC,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;gBACpD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC5B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAE9B,QAAQ,CAAC,EAAE,EAAE;oBACX,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,SAAS,EAAE,UAAU,CAAC,aAAa;oBACnC,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,GAAG,EAAE,UAAU,CAAC,GAAG;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,SAAS,CAAC,KAAK,EAAE,EAAE;gBACjB,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,IAAI,UAAmB,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChF,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACjE,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACjC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACzC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrD,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC7C,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC9C,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACtC,gBAAgB,CACd;wBACE,QAAQ;wBACR,wBAAwB,EAAE,OAAO,CAAC,wBAAwB,IAAI,KAAK;wBACnE,YAAY,EAAE,CAAC,KAAa,EAAE,MAAgB,EAAE,KAAc,EAAE,EAAE;4BAChE,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;wBACnE,CAAC;qBACF,EACD,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAC/E,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,CAAC,KAAK;gBACX,aAAa,EAAE,OAAO,EAAE,CAAC;gBACzB,aAAa,GAAG,IAAI,CAAC;gBACrB,aAAa,EAAE,CAAC;gBAChB,mBAAmB,EAAE,CAAC;gBACtB,gEAAgE;gBAChE,+DAA+D;gBAC/D,2DAA2D;gBAC3D,2BAA2B;gBAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,IAAI,CACV,YAAY,QAAQ,UAAU,KAAK,CAAC,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,KAAK,CAAC,QAAQ,EAAE,CAC7G,CAAC;gBACF,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC7B,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,OAAO,CAAC,KAAK;gBACX,aAAa,EAAE,OAAO,EAAE,CAAC;gBACzB,aAAa,GAAG,IAAI,CAAC;gBACrB,aAAa,EAAE,CAAC;gBAChB,mBAAmB,EAAE,CAAC;gBACtB,MAAM,UAAU,GACd,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtF,MAAM,OAAO,GAAG,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,WAAW,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC7B,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;YACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YACrC,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrE,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;YACpE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACnE,OAAO,IAAI,QAAQ,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAC9C,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE;oBACP,cAAc,EAAE,KAAK,CAAC,WAAW;oBACjC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7D;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,UAAU,GAAsB,IAAI,CAAC;IACzC,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE;YACnC,MAAM,CAAC,IAAI,oBAAoB,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,KAAK,CAChB;YACE,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ,EAAE,IAAI;YACd,IAAI;SACL,EACD,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YACtE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,oBAAoB,CAC5B,WAAW,CAAC,YAAY,CACtB,IAAI,EACJ,IAAI,EACJ,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAClE,CACF,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5B,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,oEAAoE;QACpE,0EAA0E;QAC1E,0EAA0E;QAC1E,0BAA0B;QAC1B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACvE,IAAI,OAAO,mBAAmB,KAAK,UAAU,EAAE,CAAC;YAC9C,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;YACvD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC,CAAC;AAKF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,GACZ,MAAM,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Context, MiddlewareHandler } from "hono";
2
+ export declare const isLoopbackHost: (host: string) => boolean;
3
+ export declare const enforceLoopback: (context: Context) => Response | null;
4
+ export declare const loopbackMiddleware: MiddlewareHandler;
5
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/server/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAqCvD,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,OAA8C,CAAC;AAE7F,eAAO,MAAM,eAAe,GAAI,SAAS,OAAO,KAAG,QAAQ,GAAG,IAc7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,iBAIhC,CAAC"}