@linkshell/gateway 0.5.3 → 0.6.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 (109) hide show
  1. package/Dockerfile +8 -22
  2. package/README.md +99 -44
  3. package/dist/gateway/src/accounts.js.map +1 -0
  4. package/dist/gateway/src/index.d.ts +4 -1
  5. package/dist/gateway/src/index.js +4 -863
  6. package/dist/gateway/src/index.js.map +1 -1
  7. package/dist/gateway/src/main.js +57 -0
  8. package/dist/gateway/src/main.js.map +1 -0
  9. package/dist/gateway/src/rate-limit.d.ts +22 -0
  10. package/dist/gateway/src/rate-limit.js +66 -0
  11. package/dist/gateway/src/rate-limit.js.map +1 -0
  12. package/dist/gateway/src/relay.d.ts +84 -5
  13. package/dist/gateway/src/relay.js +402 -529
  14. package/dist/gateway/src/relay.js.map +1 -1
  15. package/dist/gateway/src/serve.d.ts +34 -0
  16. package/dist/gateway/src/serve.js +102 -0
  17. package/dist/gateway/src/serve.js.map +1 -0
  18. package/dist/{gateway-v2 → gateway}/src/store.d.ts +5 -0
  19. package/dist/{gateway-v2 → gateway}/src/store.js +7 -0
  20. package/dist/gateway/src/store.js.map +1 -0
  21. package/dist/gateway/src/subscription.d.ts +18 -0
  22. package/dist/gateway/src/subscription.js +46 -0
  23. package/dist/gateway/src/subscription.js.map +1 -0
  24. package/dist/gateway/tsconfig.tsbuildinfo +1 -1
  25. package/dist/wire/src/direct.d.ts +22 -0
  26. package/dist/wire/src/direct.js +37 -0
  27. package/dist/wire/src/direct.js.map +1 -0
  28. package/dist/wire/src/index.d.ts +1 -0
  29. package/dist/wire/src/index.js +1 -0
  30. package/dist/wire/src/index.js.map +1 -1
  31. package/dist/wire/src/model.d.ts +287 -6
  32. package/dist/wire/src/model.js +33 -0
  33. package/dist/wire/src/model.js.map +1 -1
  34. package/dist/wire/src/relay.d.ts +8 -8
  35. package/dist/wire/src/rpc.d.ts +1780 -44
  36. package/dist/wire/src/rpc.js +48 -3
  37. package/dist/wire/src/rpc.js.map +1 -1
  38. package/dist/wire/src/updates.d.ts +356 -0
  39. package/dist/wire/src/updates.js +11 -1
  40. package/dist/wire/src/updates.js.map +1 -1
  41. package/package.json +12 -12
  42. package/src/accounts.ts +32 -0
  43. package/src/index.ts +4 -997
  44. package/src/main.ts +65 -0
  45. package/src/rate-limit.ts +72 -0
  46. package/src/relay.ts +435 -620
  47. package/src/serve.ts +130 -0
  48. package/src/store.ts +135 -0
  49. package/src/subscription.ts +51 -0
  50. package/dist/gateway/src/auth-middleware.d.ts +0 -44
  51. package/dist/gateway/src/auth-middleware.js +0 -204
  52. package/dist/gateway/src/auth-middleware.js.map +0 -1
  53. package/dist/gateway/src/cors.d.ts +0 -2
  54. package/dist/gateway/src/cors.js +0 -7
  55. package/dist/gateway/src/cors.js.map +0 -1
  56. package/dist/gateway/src/embedded.d.ts +0 -21
  57. package/dist/gateway/src/embedded.js +0 -438
  58. package/dist/gateway/src/embedded.js.map +0 -1
  59. package/dist/gateway/src/host-auth.d.ts +0 -32
  60. package/dist/gateway/src/host-auth.js +0 -78
  61. package/dist/gateway/src/host-auth.js.map +0 -1
  62. package/dist/gateway/src/pairings.d.ts +0 -38
  63. package/dist/gateway/src/pairings.js +0 -119
  64. package/dist/gateway/src/pairings.js.map +0 -1
  65. package/dist/gateway/src/presence.d.ts +0 -28
  66. package/dist/gateway/src/presence.js +0 -92
  67. package/dist/gateway/src/presence.js.map +0 -1
  68. package/dist/gateway/src/sessions.d.ts +0 -113
  69. package/dist/gateway/src/sessions.js +0 -352
  70. package/dist/gateway/src/sessions.js.map +0 -1
  71. package/dist/gateway/src/state-store.d.ts +0 -21
  72. package/dist/gateway/src/state-store.js +0 -103
  73. package/dist/gateway/src/state-store.js.map +0 -1
  74. package/dist/gateway/src/static-web.d.ts +0 -15
  75. package/dist/gateway/src/static-web.js +0 -129
  76. package/dist/gateway/src/static-web.js.map +0 -1
  77. package/dist/gateway/src/tokens.d.ts +0 -19
  78. package/dist/gateway/src/tokens.js +0 -151
  79. package/dist/gateway/src/tokens.js.map +0 -1
  80. package/dist/gateway/src/tunnel.d.ts +0 -61
  81. package/dist/gateway/src/tunnel.js +0 -576
  82. package/dist/gateway/src/tunnel.js.map +0 -1
  83. package/dist/gateway-v2/src/accounts.js.map +0 -1
  84. package/dist/gateway-v2/src/index.d.ts +0 -3
  85. package/dist/gateway-v2/src/index.js +0 -4
  86. package/dist/gateway-v2/src/index.js.map +0 -1
  87. package/dist/gateway-v2/src/main.js +0 -17
  88. package/dist/gateway-v2/src/main.js.map +0 -1
  89. package/dist/gateway-v2/src/server.d.ts +0 -84
  90. package/dist/gateway-v2/src/server.js +0 -426
  91. package/dist/gateway-v2/src/server.js.map +0 -1
  92. package/dist/gateway-v2/src/store.js.map +0 -1
  93. package/dist/shared-protocol/src/index.d.ts +0 -17029
  94. package/dist/shared-protocol/src/index.js +0 -1064
  95. package/dist/shared-protocol/src/index.js.map +0 -1
  96. package/src/auth-middleware.ts +0 -266
  97. package/src/cors.ts +0 -8
  98. package/src/embedded.ts +0 -526
  99. package/src/host-auth.ts +0 -88
  100. package/src/pairings.ts +0 -133
  101. package/src/presence.ts +0 -118
  102. package/src/sessions.ts +0 -432
  103. package/src/state-store.ts +0 -140
  104. package/src/static-web.ts +0 -133
  105. package/src/tokens.ts +0 -159
  106. package/src/tunnel.ts +0 -644
  107. /package/dist/{gateway-v2 → gateway}/src/accounts.d.ts +0 -0
  108. /package/dist/{gateway-v2 → gateway}/src/accounts.js +0 -0
  109. /package/dist/{gateway-v2 → gateway}/src/main.d.ts +0 -0
@@ -1,438 +0,0 @@
1
- import { createServer } from "node:http";
2
- import { randomUUID } from "node:crypto";
3
- import { WebSocketServer } from "ws";
4
- import { createEnvelope, serializeEnvelope, PROTOCOL_VERSION, } from "@linkshell/protocol";
5
- import { z, ZodError } from "zod";
6
- import { SessionManager } from "./sessions.js";
7
- import { PairingManager } from "./pairings.js";
8
- import { TokenManager } from "./tokens.js";
9
- import { handleSocketMessage, replayAgentToSocket } from "./relay.js";
10
- import { PresenceHub, startPresenceWatcher } from "./presence.js";
11
- import { parseTunnelPath, parseTunnelCookie, shouldUseTunnelCookieFallback, handleTunnelRequest, handleTunnelWsUpgrade, } from "./tunnel.js";
12
- import { serveWeb, serveWebAsset, webEnabled, webDistPath } from "./static-web.js";
13
- const PING_INTERVAL = 20_000;
14
- const MAX_BODY_SIZE = 4096;
15
- const MAX_WS_MESSAGE_SIZE = 50 * 1024 * 1024; // 50MB (supports base64 image uploads)
16
- const LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
17
- const createPairingBody = z.object({ sessionId: z.string().optional() });
18
- const claimPairingBody = z.object({
19
- pairingCode: z.string().length(6),
20
- deviceToken: z.string().min(1).optional(),
21
- });
22
- class BodyTooLargeError extends Error {
23
- }
24
- function json(res, status, body) {
25
- res.writeHead(status, {
26
- "content-type": "application/json",
27
- "access-control-allow-origin": "*",
28
- "access-control-allow-methods": "GET, POST, OPTIONS",
29
- "access-control-allow-headers": "Content-Type, Authorization",
30
- });
31
- res.end(JSON.stringify(body));
32
- }
33
- async function readJson(req) {
34
- const chunks = [];
35
- let size = 0;
36
- for await (const chunk of req) {
37
- const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
38
- size += buf.length;
39
- if (size > MAX_BODY_SIZE)
40
- throw new BodyTooLargeError();
41
- chunks.push(buf);
42
- }
43
- if (chunks.length === 0)
44
- return {};
45
- return JSON.parse(Buffer.concat(chunks).toString("utf8"));
46
- }
47
- function getClientIp(req) {
48
- const forwarded = req.headers["x-forwarded-for"];
49
- if (typeof forwarded === "string")
50
- return forwarded.split(",")[0].trim();
51
- return req.socket.remoteAddress ?? "unknown";
52
- }
53
- function extractBearerToken(req) {
54
- const auth = req.headers.authorization;
55
- if (!auth)
56
- return null;
57
- const match = auth.match(/^Bearer\s+(.+)$/i);
58
- return match?.[1] ?? null;
59
- }
60
- /**
61
- * Start an embedded gateway. Returns a handle to get URLs and close it.
62
- * Used by CLI when no external --gateway is provided.
63
- */
64
- export async function startEmbeddedGateway(options = {}) {
65
- const targetPort = options.port ?? 0; // 0 = random available port
66
- const logLevel = options.logLevel ?? "warn";
67
- const silent = options.silent ?? false;
68
- function log(level, msg) {
69
- if (silent)
70
- return;
71
- if (LOG_LEVELS[level] >= LOG_LEVELS[logLevel]) {
72
- process.stderr.write(`[gateway:${level}] ${msg}\n`);
73
- }
74
- }
75
- const sessionManager = new SessionManager();
76
- const pairingManager = new PairingManager();
77
- const tokenManager = new TokenManager();
78
- const presenceHub = new PresenceHub();
79
- sessionManager.onPresenceChange = (session) => presenceHub.notify(session);
80
- const server = createServer(async (req, res) => {
81
- if (req.method === "OPTIONS") {
82
- res.writeHead(204, {
83
- "access-control-allow-origin": "*",
84
- "access-control-allow-methods": "GET, POST, OPTIONS",
85
- "access-control-allow-headers": "Content-Type, Authorization",
86
- "access-control-max-age": "86400",
87
- });
88
- res.end();
89
- return;
90
- }
91
- try {
92
- const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
93
- const method = req.method ?? "GET";
94
- if (method === "GET" && url.pathname === "/healthz") {
95
- json(res, 200, { ok: true });
96
- return;
97
- }
98
- if (method === "POST" && url.pathname === "/pairings") {
99
- const body = createPairingBody.parse(await readJson(req));
100
- const record = pairingManager.create(body.sessionId);
101
- json(res, 201, {
102
- sessionId: record.sessionId,
103
- pairingCode: record.pairingCode,
104
- expiresAt: new Date(record.expiresAt).toISOString(),
105
- });
106
- return;
107
- }
108
- if (method === "POST" && url.pathname === "/pairings/claim") {
109
- const body = claimPairingBody.parse(await readJson(req));
110
- const result = pairingManager.claim(body.pairingCode);
111
- if ("error" in result) {
112
- json(res, result.status, { error: result.error });
113
- return;
114
- }
115
- const token = tokenManager.register(body.deviceToken);
116
- tokenManager.bind(token, result.sessionId);
117
- json(res, 200, { sessionId: result.sessionId, deviceToken: token });
118
- return;
119
- }
120
- if (method === "GET" && url.pathname === "/sessions") {
121
- const token = extractBearerToken(req);
122
- if (!token || !tokenManager.validate(token)) {
123
- json(res, 401, {
124
- error: "unauthorized",
125
- message: "Valid device token required",
126
- });
127
- return;
128
- }
129
- const allowedIds = tokenManager.getSessionIds(token);
130
- const sessions = sessionManager
131
- .listActive()
132
- .filter((s) => allowedIds.has(s.id))
133
- .map((s) => sessionManager.getSummary(s.id))
134
- .filter(Boolean);
135
- json(res, 200, { sessions });
136
- return;
137
- }
138
- const sessionMatch = url.pathname.match(/^\/sessions\/([^/]+)$/);
139
- if (method === "GET" && sessionMatch) {
140
- const token = extractBearerToken(req);
141
- const targetId = sessionMatch[1];
142
- if (!token || !tokenManager.owns(token, targetId)) {
143
- json(res, 401, {
144
- error: "unauthorized",
145
- message: "Valid device token required",
146
- });
147
- return;
148
- }
149
- const summary = sessionManager.getSummary(targetId);
150
- if (!summary) {
151
- json(res, 404, { error: "session_not_found" });
152
- return;
153
- }
154
- json(res, 200, summary);
155
- return;
156
- }
157
- const pairingMatch = url.pathname.match(/^\/pairings\/(\d{6})\/status$/);
158
- if (method === "GET" && pairingMatch) {
159
- const result = pairingManager.getStatus(pairingMatch[1]);
160
- if ("error" in result) {
161
- json(res, result.httpStatus, { error: result.error });
162
- return;
163
- }
164
- json(res, 200, result);
165
- return;
166
- }
167
- // Tunnel HTTP proxy (explicit path)
168
- const tunnelParsed = parseTunnelPath(url.pathname);
169
- if (tunnelParsed) {
170
- await handleTunnelRequest(req, res, sessionManager, tokenManager, tunnelParsed, url);
171
- return;
172
- }
173
- // Serve the gateway's OWN built web assets (no SPA fallback) before the
174
- // tunnel cookie fallback, so a real asset like /assets/index-xxx.js is
175
- // served locally instead of being proxied via a stale tunnel cookie.
176
- if (await serveWebAsset(req, res))
177
- return;
178
- // Tunnel fallback: cookie-based routing for sub-resources (e.g. /_next/static/...)
179
- const tunnelCookie = parseTunnelCookie(req);
180
- if (tunnelCookie && shouldUseTunnelCookieFallback(req, url.pathname, (pathname) => pathname === "/healthz" ||
181
- pathname === "/sessions" ||
182
- pathname.startsWith("/sessions/") ||
183
- pathname === "/pairings" ||
184
- pathname.startsWith("/pairings/") ||
185
- pathname.startsWith("/agent/") ||
186
- pathname.startsWith("/tunnel/"))) {
187
- const fallbackParsed = {
188
- sessionId: tunnelCookie.sessionId,
189
- port: tunnelCookie.port,
190
- path: url.pathname,
191
- };
192
- await handleTunnelRequest(req, res, sessionManager, tokenManager, fallbackParsed, url, tunnelCookie.token);
193
- return;
194
- }
195
- // Web SPA: last GET fallback, after every API route, so it never shadows
196
- // them. Serves index.html for "/" and client-side routes; a no-op (false)
197
- // when no web dist is bundled (e.g. an API-only embedded gateway).
198
- if (await serveWeb(req, res))
199
- return;
200
- json(res, 404, { error: "not_found" });
201
- }
202
- catch (err) {
203
- if (err instanceof ZodError) {
204
- json(res, 400, {
205
- error: "invalid_message",
206
- message: err.errors[0]?.message ?? "Validation failed",
207
- });
208
- }
209
- else if (err instanceof BodyTooLargeError) {
210
- json(res, 413, {
211
- error: "body_too_large",
212
- message: "Request body exceeds limit",
213
- });
214
- }
215
- else if (err instanceof SyntaxError) {
216
- json(res, 400, { error: "invalid_json", message: "Malformed JSON" });
217
- }
218
- else {
219
- log("error", `unhandled: ${err}`);
220
- json(res, 500, {
221
- error: "internal_error",
222
- message: "Internal server error",
223
- });
224
- }
225
- }
226
- });
227
- const wss = new WebSocketServer({
228
- noServer: true,
229
- maxPayload: MAX_WS_MESSAGE_SIZE,
230
- });
231
- // Loaded on demand: v1 users on older Node never touch node:sqlite.
232
- const relay = options.relayDataPath ? await startRelay(options.relayDataPath, log) : undefined;
233
- server.on("upgrade", (request, socket, head) => {
234
- const url = new URL(request.url ?? "/", `http://${request.headers.host}`);
235
- if (relay && url.pathname === relay.path) {
236
- relay.gateway.handleUpgrade(request, socket, head);
237
- return;
238
- }
239
- // Tunnel WebSocket upgrade (for HMR etc.)
240
- const tunnelParsed = parseTunnelPath(url.pathname);
241
- if (tunnelParsed) {
242
- const tunnelCookie = parseTunnelCookie(request);
243
- const cookieToken = tunnelCookie?.sessionId === tunnelParsed.sessionId && tunnelCookie.port === tunnelParsed.port
244
- ? tunnelCookie.token
245
- : undefined;
246
- wss.handleUpgrade(request, socket, head, (ws) => {
247
- handleTunnelWsUpgrade(ws, tunnelParsed, url, sessionManager, tokenManager, cookieToken);
248
- });
249
- return;
250
- }
251
- // Tunnel WS fallback via cookie (for HMR paths like /_next/webpack-hmr)
252
- const tunnelCookie = parseTunnelCookie(request);
253
- if (tunnelCookie && shouldUseTunnelCookieFallback(request, url.pathname, (pathname) => pathname === "/ws")) {
254
- const fallbackParsed = {
255
- sessionId: tunnelCookie.sessionId,
256
- port: tunnelCookie.port,
257
- path: url.pathname,
258
- };
259
- wss.handleUpgrade(request, socket, head, (ws) => {
260
- handleTunnelWsUpgrade(ws, fallbackParsed, url, sessionManager, tokenManager, tunnelCookie.token);
261
- });
262
- return;
263
- }
264
- if (url.pathname !== "/ws") {
265
- socket.destroy();
266
- return;
267
- }
268
- wss.handleUpgrade(request, socket, head, (ws) => {
269
- wss.emit("connection", ws, request, url);
270
- });
271
- });
272
- wss.on("connection", (socket, _request, url) => {
273
- const sessionId = url.searchParams.get("sessionId");
274
- const role = url.searchParams.get("role");
275
- if (role === "watcher") {
276
- const token = url.searchParams.get("token");
277
- if (!token || !tokenManager.validate(token)) {
278
- socket.close(4001, "unauthorized");
279
- return;
280
- }
281
- startPresenceWatcher({
282
- socket,
283
- sessions: sessionManager,
284
- hub: presenceHub,
285
- sessionIds: () => tokenManager.getSessionIds(token),
286
- pingIntervalMs: PING_INTERVAL,
287
- });
288
- return;
289
- }
290
- if (!sessionId || !role || (role !== "host" && role !== "client")) {
291
- socket.close(1008, "missing sessionId or role");
292
- return;
293
- }
294
- const deviceId = url.searchParams.get("deviceId") ?? randomUUID();
295
- if (role === "client") {
296
- const token = url.searchParams.get("token");
297
- if (!token || !tokenManager.owns(token, sessionId)) {
298
- socket.close(4001, "unauthorized");
299
- return;
300
- }
301
- }
302
- const device = { socket, role, deviceId, connectedAt: Date.now() };
303
- if (role === "host") {
304
- const existingSession = sessionManager.get(sessionId);
305
- const isReconnect = existingSession &&
306
- existingSession.clients.size > 0 &&
307
- existingSession.state === "host_disconnected";
308
- sessionManager.setHost(sessionId, device);
309
- if (isReconnect) {
310
- const notification = serializeEnvelope(createEnvelope({
311
- type: "session.host_reconnected",
312
- sessionId,
313
- payload: {},
314
- }));
315
- for (const [, client] of existingSession.clients) {
316
- if (client.socket.readyState === client.socket.OPEN)
317
- client.socket.send(notification);
318
- }
319
- }
320
- }
321
- else {
322
- sessionManager.addClient(sessionId, device);
323
- }
324
- socket.send(serializeEnvelope(createEnvelope({
325
- type: "session.connect",
326
- sessionId,
327
- payload: {
328
- role,
329
- clientName: deviceId,
330
- protocolVersion: PROTOCOL_VERSION,
331
- },
332
- })));
333
- if (role === "client") {
334
- replayAgentToSocket(socket, sessionId, sessionManager);
335
- }
336
- // Ping/pong for liveness — terminate sockets that stop answering pings.
337
- const liveSocket = socket;
338
- liveSocket.isAlive = true;
339
- socket.on("pong", () => {
340
- liveSocket.isAlive = true;
341
- });
342
- const pingTimer = setInterval(() => {
343
- if (socket.readyState !== socket.OPEN)
344
- return;
345
- if (liveSocket.isAlive === false) {
346
- socket.terminate();
347
- return;
348
- }
349
- liveSocket.isAlive = false;
350
- socket.ping();
351
- }, PING_INTERVAL);
352
- socket.on("message", (data) => {
353
- try {
354
- handleSocketMessage(socket, data.toString(), role, sessionId, deviceId, sessionManager);
355
- }
356
- catch (err) {
357
- log("error", `unhandled websocket message error for session ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);
358
- if (socket.readyState === socket.OPEN) {
359
- socket.send(serializeEnvelope(createEnvelope({
360
- type: "session.error",
361
- sessionId,
362
- payload: {
363
- code: "invalid_message",
364
- message: "Failed to handle message",
365
- },
366
- })));
367
- }
368
- }
369
- });
370
- socket.on("close", () => {
371
- clearInterval(pingTimer);
372
- if (role === "host") {
373
- const result = sessionManager.removeHost(sessionId);
374
- if (result) {
375
- const notification = serializeEnvelope(createEnvelope({
376
- type: "session.host_disconnected",
377
- sessionId,
378
- payload: { reason: "host connection closed" },
379
- }));
380
- for (const [, client] of result.clients) {
381
- if (client.socket.readyState === client.socket.OPEN)
382
- client.socket.send(notification);
383
- }
384
- }
385
- }
386
- else {
387
- sessionManager.removeClient(sessionId, deviceId);
388
- }
389
- });
390
- socket.on("error", () => { });
391
- });
392
- return new Promise((resolve, reject) => {
393
- server.on("error", reject);
394
- server.listen(targetPort, () => {
395
- const addr = server.address();
396
- const actualPort = typeof addr === "object" && addr ? addr.port : targetPort;
397
- log("info", `embedded gateway on port ${actualPort}`);
398
- // Surface whether the bundled web SPA was found — the in-app WebView loads
399
- // this gateway's "/", so a missing dist means a blank screen. Makes the
400
- // LAN/self-hosted "WebView is blank" failure mode diagnosable from logs.
401
- if (webEnabled()) {
402
- log("info", `web UI served from ${webDistPath()}`);
403
- }
404
- else {
405
- log("warn", `web UI not bundled (WEB_DIST=${webDistPath()} has no index.html) — in-app agent console will be blank`);
406
- }
407
- resolve({
408
- port: actualPort,
409
- httpUrl: `http://127.0.0.1:${actualPort}`,
410
- wsUrl: `ws://127.0.0.1:${actualPort}/ws`,
411
- close: () => new Promise((res) => {
412
- wss.clients.forEach((ws) => ws.close(1001, "shutting down"));
413
- sessionManager.destroy();
414
- pairingManager.destroy();
415
- tokenManager.destroy();
416
- void relay?.gateway.stop();
417
- server.close(() => res());
418
- }),
419
- });
420
- });
421
- });
422
- }
423
- async function startRelay(databasePath, log) {
424
- const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
425
- if (major < 22 || (major === 22 && minor < 13)) {
426
- log("warn", `v2 relay needs Node.js 22.13+ (this is ${process.version}); serving v1 only`);
427
- return undefined;
428
- }
429
- const { mkdirSync } = await import("node:fs");
430
- const { dirname } = await import("node:path");
431
- const [{ Gateway }, { RELAY_PATH }] = await Promise.all([import("@linkshell/gateway-v2"), import("@linkshell/wire")]);
432
- mkdirSync(dirname(databasePath), { recursive: true });
433
- const gateway = new Gateway({ port: 0, databasePath, log: (message) => log("info", `[relay] ${message}`) });
434
- gateway.attach();
435
- log("info", `v2 relay on ${RELAY_PATH}`);
436
- return { gateway, path: RELAY_PATH };
437
- }
438
- //# sourceMappingURL=embedded.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embedded.js","sourceRoot":"","sources":["../../../src/embedded.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Binds a session to the secret host token issued when its pairing was created,
3
- * so only the original host (the CLI that created the pairing) can connect as
4
- * `role=host`. Without this, anyone who learns a sessionId could connect as host
5
- * and capture every controller keystroke or inject terminal output.
6
- *
7
- * Kept separate from PairingManager because a host connection long outlives the
8
- * pairing code's 10-minute TTL (and reconnects days later), so the binding needs
9
- * its own longer lifetime.
10
- */
11
- export declare class HostAuthManager {
12
- private bindings;
13
- private cleanupTimer;
14
- constructor();
15
- /** Mint a fresh host token to hand to the CLI at pairing creation.
16
- *
17
- * Deliberately does NOT create a binding yet: the binding is established
18
- * trust-on-first-use when the host first connects WITH this token (see
19
- * `adopt`). This keeps the gateway backward-compatible with older CLIs that
20
- * don't send a host token at all — they simply never create a binding and
21
- * are allowed as legacy hosts, instead of being locked out by an eager
22
- * binding they can't satisfy. The legitimate host connects milliseconds
23
- * after pairing, so the trust-on-first-use window is negligible. */
24
- issue(_sessionId: string): string;
25
- /** Trust-on-first-use: register a host-provided token when no binding exists
26
- * yet (e.g. after a gateway restart lost the in-memory binding). */
27
- adopt(sessionId: string, hostToken: string): void;
28
- has(sessionId: string): boolean;
29
- verify(sessionId: string, hostToken: string | undefined): boolean;
30
- private cleanup;
31
- destroy(): void;
32
- }
@@ -1,78 +0,0 @@
1
- import { randomUUID, timingSafeEqual } from "node:crypto";
2
- const CLEANUP_INTERVAL = 5 * 60_000;
3
- const HOST_TOKEN_TTL = 7 * 24 * 60 * 60_000; // 7 days
4
- function safeEqual(a, b) {
5
- const ab = Buffer.from(a);
6
- const bb = Buffer.from(b);
7
- if (ab.length !== bb.length)
8
- return false;
9
- return timingSafeEqual(ab, bb);
10
- }
11
- /**
12
- * Binds a session to the secret host token issued when its pairing was created,
13
- * so only the original host (the CLI that created the pairing) can connect as
14
- * `role=host`. Without this, anyone who learns a sessionId could connect as host
15
- * and capture every controller keystroke or inject terminal output.
16
- *
17
- * Kept separate from PairingManager because a host connection long outlives the
18
- * pairing code's 10-minute TTL (and reconnects days later), so the binding needs
19
- * its own longer lifetime.
20
- */
21
- export class HostAuthManager {
22
- bindings = new Map();
23
- cleanupTimer;
24
- constructor() {
25
- this.cleanupTimer = setInterval(() => this.cleanup(), CLEANUP_INTERVAL);
26
- this.cleanupTimer.unref?.();
27
- }
28
- /** Mint a fresh host token to hand to the CLI at pairing creation.
29
- *
30
- * Deliberately does NOT create a binding yet: the binding is established
31
- * trust-on-first-use when the host first connects WITH this token (see
32
- * `adopt`). This keeps the gateway backward-compatible with older CLIs that
33
- * don't send a host token at all — they simply never create a binding and
34
- * are allowed as legacy hosts, instead of being locked out by an eager
35
- * binding they can't satisfy. The legitimate host connects milliseconds
36
- * after pairing, so the trust-on-first-use window is negligible. */
37
- issue(_sessionId) {
38
- return randomUUID();
39
- }
40
- /** Trust-on-first-use: register a host-provided token when no binding exists
41
- * yet (e.g. after a gateway restart lost the in-memory binding). */
42
- adopt(sessionId, hostToken) {
43
- this.bindings.set(sessionId, { sessionId, hostToken, lastUsedAt: Date.now() });
44
- }
45
- has(sessionId) {
46
- const binding = this.bindings.get(sessionId);
47
- if (!binding)
48
- return false;
49
- if (Date.now() - binding.lastUsedAt > HOST_TOKEN_TTL) {
50
- this.bindings.delete(sessionId);
51
- return false;
52
- }
53
- return true;
54
- }
55
- verify(sessionId, hostToken) {
56
- if (!hostToken)
57
- return false;
58
- const binding = this.bindings.get(sessionId);
59
- if (!binding)
60
- return false;
61
- if (!safeEqual(binding.hostToken, hostToken))
62
- return false;
63
- binding.lastUsedAt = Date.now();
64
- return true;
65
- }
66
- cleanup() {
67
- const now = Date.now();
68
- for (const [sessionId, binding] of this.bindings) {
69
- if (now - binding.lastUsedAt > HOST_TOKEN_TTL) {
70
- this.bindings.delete(sessionId);
71
- }
72
- }
73
- }
74
- destroy() {
75
- clearInterval(this.cleanupTimer);
76
- }
77
- }
78
- //# sourceMappingURL=host-auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"host-auth.js","sourceRoot":"","sources":["../../../src/host-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAM,CAAC;AACpC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,SAAS;AAQtD,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC1C,YAAY,CAAiC;IAErD;QACE,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;;;;yEAQqE;IACrE,KAAK,CAAC,UAAkB;QACtB,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED;yEACqE;IACrE,KAAK,CAAC,SAAiB,EAAE,SAAiB;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;YACrD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,SAA6B;QACrD,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3D,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjD,IAAI,GAAG,GAAG,OAAO,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -1,38 +0,0 @@
1
- import type { GatewayStateStore } from "./state-store.js";
2
- export interface PairingRecord {
3
- sessionId: string;
4
- pairingCode: string;
5
- expiresAt: number;
6
- claimed: boolean;
7
- failedAttempts: number;
8
- }
9
- export declare class PairingManager {
10
- private readonly store?;
11
- private pairings;
12
- private cleanupTimer;
13
- constructor(store?: GatewayStateStore | undefined);
14
- hydrate(): Promise<void>;
15
- create(sessionId?: string): PairingRecord;
16
- claim(pairingCode: string): PairingRecord | {
17
- error: string;
18
- status: number;
19
- };
20
- /** Look up a code's session without consuming an attempt or mutating state.
21
- * Lets the claim endpoint stay idempotent for a device that already owns the
22
- * mapped session (it re-issues instead of erroring with already_claimed). */
23
- peek(pairingCode: string): {
24
- sessionId: string;
25
- claimed: boolean;
26
- } | null;
27
- getStatus(pairingCode: string): {
28
- status: string;
29
- expiresAt: number;
30
- sessionId: string;
31
- } | {
32
- error: string;
33
- httpStatus: number;
34
- };
35
- private cleanup;
36
- private persist;
37
- destroy(): void;
38
- }