@datnguyennnx/localterm-server 0.0.15 → 0.0.16

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 (105) 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 +233 -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/ensure-spawn-helper-executable.js +3 -3
  17. package/dist/ensure-spawn-helper-executable.js.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/osc-chunk-parser.d.ts +32 -0
  21. package/dist/osc-chunk-parser.d.ts.map +1 -0
  22. package/dist/osc-chunk-parser.js +56 -0
  23. package/dist/osc-chunk-parser.js.map +1 -0
  24. package/dist/osc133-chunk-parser.d.ts +9 -5
  25. package/dist/osc133-chunk-parser.d.ts.map +1 -1
  26. package/dist/osc133-chunk-parser.js +9 -25
  27. package/dist/osc133-chunk-parser.js.map +1 -1
  28. package/dist/osc7-chunk-parser.d.ts +8 -5
  29. package/dist/osc7-chunk-parser.d.ts.map +1 -1
  30. package/dist/osc7-chunk-parser.js +9 -25
  31. package/dist/osc7-chunk-parser.js.map +1 -1
  32. package/dist/output-batcher.d.ts +2 -1
  33. package/dist/output-batcher.d.ts.map +1 -1
  34. package/dist/output-batcher.js +3 -1
  35. package/dist/output-batcher.js.map +1 -1
  36. package/dist/parser/osc.d.ts +32 -0
  37. package/dist/parser/osc.d.ts.map +1 -0
  38. package/dist/parser/osc.js +56 -0
  39. package/dist/parser/osc.js.map +1 -0
  40. package/dist/parser/osc133-chunk-parser.d.ts +12 -0
  41. package/dist/parser/osc133-chunk-parser.d.ts.map +1 -0
  42. package/dist/parser/osc133-chunk-parser.js +13 -0
  43. package/dist/parser/osc133-chunk-parser.js.map +1 -0
  44. package/dist/parser/osc7-chunk-parser.d.ts +10 -0
  45. package/dist/parser/osc7-chunk-parser.d.ts.map +1 -0
  46. package/dist/parser/osc7-chunk-parser.js +13 -0
  47. package/dist/parser/osc7-chunk-parser.js.map +1 -0
  48. package/dist/parser/parse-osc133-from-chunk.d.ts +10 -0
  49. package/dist/parser/parse-osc133-from-chunk.d.ts.map +1 -0
  50. package/dist/parser/parse-osc133-from-chunk.js +49 -0
  51. package/dist/parser/parse-osc133-from-chunk.js.map +1 -0
  52. package/dist/parser/parse-osc7-from-chunk.d.ts +2 -0
  53. package/dist/parser/parse-osc7-from-chunk.d.ts.map +1 -0
  54. package/dist/parser/parse-osc7-from-chunk.js +33 -0
  55. package/dist/parser/parse-osc7-from-chunk.js.map +1 -0
  56. package/dist/parser/strip-ansi.d.ts +13 -0
  57. package/dist/parser/strip-ansi.d.ts.map +1 -0
  58. package/dist/parser/strip-ansi.js +26 -0
  59. package/dist/parser/strip-ansi.js.map +1 -0
  60. package/dist/schemas.js +1 -1
  61. package/dist/schemas.js.map +1 -1
  62. package/dist/server/index.d.ts +25 -0
  63. package/dist/server/index.d.ts.map +1 -0
  64. package/dist/server/index.js +433 -0
  65. package/dist/server/index.js.map +1 -0
  66. package/dist/server/security.d.ts +5 -0
  67. package/dist/server/security.d.ts.map +1 -0
  68. package/dist/server/security.js +63 -0
  69. package/dist/server/security.js.map +1 -0
  70. package/dist/server/static-resolver.d.ts +7 -0
  71. package/dist/server/static-resolver.d.ts.map +1 -0
  72. package/dist/server/static-resolver.js +65 -0
  73. package/dist/server/static-resolver.js.map +1 -0
  74. package/dist/session/default-shell.d.ts +2 -0
  75. package/dist/session/default-shell.d.ts.map +1 -0
  76. package/dist/session/default-shell.js +44 -0
  77. package/dist/session/default-shell.js.map +1 -0
  78. package/dist/session/ensure-spawn-helper-executable.d.ts +2 -0
  79. package/dist/session/ensure-spawn-helper-executable.d.ts.map +1 -0
  80. package/dist/session/ensure-spawn-helper-executable.js +34 -0
  81. package/dist/session/ensure-spawn-helper-executable.js.map +1 -0
  82. package/dist/session/session-registry.d.ts +9 -0
  83. package/dist/session/session-registry.d.ts.map +1 -0
  84. package/dist/session/session-registry.js +19 -0
  85. package/dist/session/session-registry.js.map +1 -0
  86. package/dist/session/session.d.ts +62 -0
  87. package/dist/session/session.d.ts.map +1 -0
  88. package/dist/session/session.js +245 -0
  89. package/dist/session/session.js.map +1 -0
  90. package/dist/session.d.ts +1 -1
  91. package/dist/session.d.ts.map +1 -1
  92. package/dist/session.js +12 -5
  93. package/dist/session.js.map +1 -1
  94. package/dist/static-resolver.js +1 -1
  95. package/dist/static-resolver.js.map +1 -1
  96. package/dist/utils/parse-osc133-from-chunk.d.ts.map +1 -1
  97. package/dist/utils/parse-osc133-from-chunk.js +10 -5
  98. package/dist/utils/parse-osc133-from-chunk.js.map +1 -1
  99. package/dist/utils/parse-osc7-from-chunk.d.ts.map +1 -1
  100. package/dist/utils/parse-osc7-from-chunk.js +4 -3
  101. package/dist/utils/parse-osc7-from-chunk.js.map +1 -1
  102. package/dist/utils/strip-ansi.d.ts.map +1 -1
  103. package/dist/utils/strip-ansi.js +6 -8
  104. package/dist/utils/strip-ansi.js.map +1 -1
  105. package/package.json +1 -1
@@ -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;AA6DD,eAAO,MAAM,YAAY,GAAU,UAAS,aAAkB,KAAG,OAAO,CAAC,aAAa,CAoXrF,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,433 @@
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"
145
+ ? { [SHELL_INTEGRATION_ENV_VAR]: "1" }
146
+ : undefined;
147
+ const newSession = new Session({ cwd: requestedCwd, mode: sessionMode, env: integrationEnv });
148
+ session = newSession;
149
+ registry.register(newSession);
150
+ // Heartbeat. Without this, half-open sockets (laptop sleep, network
151
+ // dropout) never surface as a `close` event and the daemon keeps
152
+ // streaming PTY output into the void. We only enable it if the raw
153
+ // socket exposes `on("pong")` — otherwise the timer would tick with
154
+ // no pongs ever observed and kill healthy connections after the
155
+ // first idle window.
156
+ let lastPongAt = Date.now();
157
+ let pendingPingAt = 0;
158
+ stopHeartbeat = onRawEvent(ws.raw, "pong", () => {
159
+ lastPongAt = Date.now();
160
+ pendingPingAt = 0;
161
+ });
162
+ if (stopHeartbeat) {
163
+ heartbeatTimer = setInterval(() => {
164
+ if (ws.readyState !== WS_READY_STATE_OPEN)
165
+ return;
166
+ const now = Date.now();
167
+ const idleMs = now - lastPongAt;
168
+ const heartbeatAction = getHeartbeatAction(now, lastPongAt, pendingPingAt);
169
+ if (heartbeatAction === "wait")
170
+ return;
171
+ if (heartbeatAction === "grace-ping") {
172
+ pendingPingAt = now;
173
+ callRawMethod(ws.raw, "ping");
174
+ return;
175
+ }
176
+ if (heartbeatAction === "terminate") {
177
+ console.warn(`ws heartbeat timeout: no pong for ${idleMs}ms (grace ${now - pendingPingAt}ms, pid ${newSession.pid}); terminating`);
178
+ stopHeartbeatChecks();
179
+ if (!callRawMethod(ws.raw, "terminate"))
180
+ ws.close();
181
+ return;
182
+ }
183
+ callRawMethod(ws.raw, "ping");
184
+ }, WS_HEARTBEAT_INTERVAL_MS);
185
+ heartbeatTimer.unref?.();
186
+ }
187
+ // Outbound flow control. When the WS buffer climbs past the high
188
+ // water mark we pause the PTY (OS pipe back-pressure stops the
189
+ // child process producing more output) and start polling for the
190
+ // buffer to drain back below the low water mark. This way bursty
191
+ // output (`cat`, build logs, npm install) doesn't kill the
192
+ // connection — only a genuinely wedged receiver eventually trips
193
+ // the WS_BACKPRESSURE_THRESHOLD_BYTES emergency in safeSend.
194
+ const ensureDrainPoll = () => {
195
+ if (drainPollTimer !== null)
196
+ return;
197
+ drainPollTimer = setInterval(() => {
198
+ if (!newSession.isPaused) {
199
+ stopDrainPoll();
200
+ return;
201
+ }
202
+ if (getRawBufferedAmount(ws.raw) <= WS_OUTBOUND_RESUME_LOW_WATER_BYTES) {
203
+ newSession.resume();
204
+ stopDrainPoll();
205
+ }
206
+ }, WS_OUTBOUND_DRAIN_POLL_MS);
207
+ drainPollTimer.unref?.();
208
+ };
209
+ // Wire listeners BEFORE the first safeSend so any synchronous emit
210
+ // from Session (current or future) reaches the client. Today
211
+ // node-pty's data/exit are async, but this guards against drift.
212
+ outputBatcher = new OutputBatcher((output) => {
213
+ // Fast-path: skip copy when already a full-buffer view
214
+ const raw = output.buffer;
215
+ const byteOffset = output.byteOffset;
216
+ const byteLength = output.byteLength;
217
+ if (byteOffset === 0 && byteLength === raw.byteLength) {
218
+ safeSendRaw(ws, raw);
219
+ }
220
+ else {
221
+ safeSendRaw(ws, raw.slice(byteOffset, byteOffset + byteLength));
222
+ }
223
+ if (!newSession.isPaused &&
224
+ getRawBufferedAmount(ws.raw) >= WS_OUTBOUND_PAUSE_HIGH_WATER_BYTES) {
225
+ newSession.pause();
226
+ ensureDrainPoll();
227
+ }
228
+ });
229
+ const onOutput = (data) => outputBatcher?.push(data);
230
+ const onTitle = (title) => safeSend(ws, { type: "title", title });
231
+ const onCwd = (cwd) => safeSend(ws, { type: "cwd", cwd });
232
+ const onExit = (code) => {
233
+ outputBatcher?.flush();
234
+ outputBatcher?.dispose();
235
+ outputBatcher = null;
236
+ stopDrainPoll();
237
+ stopHeartbeatChecks();
238
+ safeSend(ws, { type: "exit", code });
239
+ ws.close();
240
+ };
241
+ newSession.on("output", onOutput);
242
+ // Agent-mode gets ANSI-stripped text alongside raw binary output.
243
+ if (sessionMode === "agent") {
244
+ const onAgentOutput = (data) => {
245
+ const text = stripAnsi(data);
246
+ if (text)
247
+ safeSend(ws, { type: "agent-output", text });
248
+ };
249
+ newSession.on("output", onAgentOutput);
250
+ }
251
+ const onCommandBoundary = (boundary) => {
252
+ safeSend(ws, {
253
+ type: "command-boundary",
254
+ phase: boundary.phase,
255
+ ...(boundary.exitCode !== undefined ? { exitCode: boundary.exitCode } : {}),
256
+ });
257
+ };
258
+ newSession.on("commandBoundary", onCommandBoundary);
259
+ newSession.on("title", onTitle);
260
+ newSession.on("cwd", onCwd);
261
+ newSession.on("exit", onExit);
262
+ safeSend(ws, {
263
+ type: "session",
264
+ shell: newSession.shell,
265
+ shellName: newSession.shellBaseName,
266
+ pid: newSession.pid,
267
+ cwd: newSession.cwd,
268
+ });
269
+ },
270
+ onMessage(event, ws) {
271
+ if (!session)
272
+ return;
273
+ let rawPayload;
274
+ try {
275
+ const raw = typeof event.data === "string" ? event.data : event.data.toString();
276
+ rawPayload = JSON.parse(raw);
277
+ }
278
+ catch {
279
+ return;
280
+ }
281
+ const parsed = clientToServerMessageSchema.safeParse(rawPayload);
282
+ if (!parsed.success)
283
+ return;
284
+ if (parsed.data.type === "input") {
285
+ session.write(parsed.data.data);
286
+ }
287
+ else if (parsed.data.type === "resize") {
288
+ session.resize(parsed.data.cols, parsed.data.rows);
289
+ }
290
+ else if (parsed.data.type === "flow-pause") {
291
+ session.pause();
292
+ }
293
+ else if (parsed.data.type === "flow-resume") {
294
+ session.resume();
295
+ }
296
+ else if (parsed.data.type === "rpc") {
297
+ handleRpcRequest({
298
+ registry,
299
+ allowDestructiveCommands: options.allowDestructiveCommands ?? false,
300
+ sendResponse: (rpcId, result, error) => {
301
+ safeSend(ws, { type: "rpc-response", id: rpcId, result, error });
302
+ },
303
+ }, { id: parsed.data.id, method: parsed.data.method, params: parsed.data.params });
304
+ }
305
+ },
306
+ onClose(event) {
307
+ outputBatcher?.dispose();
308
+ outputBatcher = null;
309
+ stopDrainPoll();
310
+ stopHeartbeatChecks();
311
+ // Most "the terminal randomly died" reports are actually the WS
312
+ // closing for a reason we never surfaced; logging code+reason+
313
+ // wasClean here makes the next incident a 1-line lookup in
314
+ // ~/.localterm/server.log.
315
+ const pidLabel = session ? ` pid ${session.pid}` : "";
316
+ console.info(`ws closed${pidLabel}: code=${event.code} reason=${JSON.stringify(event.reason)} wasClean=${event.wasClean}`);
317
+ if (!session)
318
+ return;
319
+ registry.unregister(session);
320
+ session.dispose();
321
+ session = null;
322
+ },
323
+ onError(event) {
324
+ outputBatcher?.dispose();
325
+ outputBatcher = null;
326
+ stopDrainPoll();
327
+ stopHeartbeatChecks();
328
+ const errorValue = event && typeof event === "object" ? (Reflect.get(event, "error") ?? event) : event;
329
+ const message = errorValue instanceof Error ? errorValue.message : String(errorValue);
330
+ const pidLabel = session ? ` pid ${session.pid}` : "";
331
+ console.error(`ws error${pidLabel}: ${message}`);
332
+ if (!session)
333
+ return;
334
+ registry.unregister(session);
335
+ session.dispose();
336
+ session = null;
337
+ },
338
+ };
339
+ }));
340
+ if (staticRoot) {
341
+ app.use("*", loopbackMiddleware);
342
+ app.get("*", (context) => {
343
+ const requestPath = context.req.path;
344
+ if (requestPath.startsWith("/api/") || requestPath.startsWith("/ws")) {
345
+ return context.json({ error: "not_found" }, HTTP_STATUS_NOT_FOUND);
346
+ }
347
+ const asset = resolveStaticAsset(staticRoot, requestPath);
348
+ if (!asset)
349
+ return context.text("not found", HTTP_STATUS_NOT_FOUND);
350
+ const shouldRevalidate = REVALIDATED_STATIC_PATHS.has(requestPath);
351
+ return new Response(new Uint8Array(asset.body), {
352
+ status: asset.status,
353
+ headers: {
354
+ "content-type": asset.contentType,
355
+ ...(shouldRevalidate ? { "cache-control": "no-cache" } : {}),
356
+ },
357
+ });
358
+ });
359
+ }
360
+ let httpServer = null;
361
+ let actualPort = port;
362
+ await new Promise((resolve, reject) => {
363
+ const handleError = (error) => {
364
+ reject(new ServerErrorException(serverError.listenFailed(host, port, error)));
365
+ };
366
+ const node = serve({
367
+ fetch: app.fetch,
368
+ hostname: host,
369
+ port,
370
+ }, () => {
371
+ const address = node.address();
372
+ if (address && typeof address === "object")
373
+ actualPort = address.port;
374
+ node.removeListener("error", handleError);
375
+ resolve();
376
+ });
377
+ node.once("error", handleError);
378
+ httpServer = node;
379
+ });
380
+ if (!httpServer) {
381
+ throw new ServerErrorException(serverError.listenFailed(host, port, new Error("hono serve() resolved without binding an http server")));
382
+ }
383
+ injectWebSocket(httpServer);
384
+ const stop = async () => {
385
+ registry.disposeAll();
386
+ // Forcibly tear down every WS first. node-pty + ws upgraded sockets
387
+ // aren't tracked in http.Server's keep-alive set, so target.close() would
388
+ // otherwise wait forever for them and the CLI's force-exit fallback would
389
+ // fire on every shutdown.
390
+ for (const client of wss.clients) {
391
+ try {
392
+ client.terminate();
393
+ }
394
+ catch {
395
+ /* socket already torn down */
396
+ }
397
+ }
398
+ try {
399
+ wss.close();
400
+ }
401
+ catch {
402
+ /* idempotent close — wss may already be closed */
403
+ }
404
+ if (!httpServer)
405
+ return;
406
+ const target = httpServer;
407
+ const closeAllConnections = Reflect.get(target, "closeAllConnections");
408
+ if (typeof closeAllConnections === "function") {
409
+ closeAllConnections.call(target);
410
+ }
411
+ await new Promise((resolve) => {
412
+ let settled = false;
413
+ const settle = () => {
414
+ if (settled)
415
+ return;
416
+ settled = true;
417
+ resolve();
418
+ };
419
+ const grace = setTimeout(settle, SERVER_STOP_GRACE_MS);
420
+ grace.unref?.();
421
+ target.close(() => {
422
+ clearTimeout(grace);
423
+ settle();
424
+ });
425
+ });
426
+ };
427
+ return { port: actualPort, host, registry, stop };
428
+ };
429
+ export { DEFAULT_HOST, DEFAULT_PORT, WS_CLOSE_BACKPRESSURE } from "../constants.js";
430
+ export { isLoopbackHost } from "./security.js";
431
+ export { healthSchema } from "../schemas.js";
432
+ export { ServerErrorException, formatServerError, isServerErrorException, serverError, } from "../errors.js";
433
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -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"}