termbridge 0.3.12 → 0.3.13

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.
package/dist/bin.js CHANGED
@@ -2050,7 +2050,8 @@ import qrcode from "qrcode-terminal";
2050
2050
 
2051
2051
  // src/cli/start.ts
2052
2052
  import { spawnSync } from "child_process";
2053
- import { resolve as resolve5, dirname as dirname3 } from "path";
2053
+ import { tmpdir } from "os";
2054
+ import { resolve as resolve5, dirname as dirname4, join as join2 } from "path";
2054
2055
  import { existsSync } from "fs";
2055
2056
  import { writeFile } from "fs/promises";
2056
2057
  import { fileURLToPath } from "url";
@@ -2408,6 +2409,8 @@ var createCloudflaredProvider = (deps = {}) => {
2408
2409
 
2409
2410
  // src/server/auth.ts
2410
2411
  import { randomBytes, createHash } from "crypto";
2412
+ import { readFileSync, writeFileSync, mkdirSync } from "fs";
2413
+ import { dirname as dirname2 } from "path";
2411
2414
  var SESSION_COOKIE_NAME = "termbridge_session";
2412
2415
  var hashToken = (token) => createHash("sha256").update(token).digest("hex");
2413
2416
  var createSessionId = () => randomBytes(18).toString("base64url");
@@ -2426,6 +2429,25 @@ var parseCookies = (cookieHeader) => {
2426
2429
  }
2427
2430
  return cookies;
2428
2431
  };
2432
+ var loadSessions = (filePath) => {
2433
+ const sessions = /* @__PURE__ */ new Map();
2434
+ try {
2435
+ const data = readFileSync(filePath, "utf-8");
2436
+ const parsed = JSON.parse(data);
2437
+ for (const session of parsed) {
2438
+ sessions.set(session.id, session);
2439
+ }
2440
+ } catch {
2441
+ }
2442
+ return sessions;
2443
+ };
2444
+ var saveSessions = (filePath, sessions) => {
2445
+ try {
2446
+ mkdirSync(dirname2(filePath), { recursive: true });
2447
+ writeFileSync(filePath, JSON.stringify([...sessions.values()]), "utf-8");
2448
+ } catch {
2449
+ }
2450
+ };
2429
2451
  var createAuth = ({
2430
2452
  tokenTtlMs,
2431
2453
  sessionIdleMs,
@@ -2433,14 +2455,15 @@ var createAuth = ({
2433
2455
  redeemLimiter,
2434
2456
  cookieSecure,
2435
2457
  cookieSameSite,
2436
- now
2458
+ now,
2459
+ sessionFile
2437
2460
  }) => {
2438
2461
  const clock = now ?? (() => Date.now());
2439
2462
  const secureCookie = cookieSecure ?? true;
2440
2463
  const resolvedSameSite = cookieSameSite ?? "Lax";
2441
2464
  const tokens = /* @__PURE__ */ new Map();
2442
2465
  const wsTokens = /* @__PURE__ */ new Map();
2443
- const sessions = /* @__PURE__ */ new Map();
2466
+ const sessions = sessionFile ? loadSessions(sessionFile) : /* @__PURE__ */ new Map();
2444
2467
  const wsTokenTtlMs = 2 * 6e4;
2445
2468
  const issueToken = () => {
2446
2469
  const token = randomBytes(16).toString("base64url");
@@ -2473,6 +2496,9 @@ var createAuth = ({
2473
2496
  lastSeen: clock()
2474
2497
  };
2475
2498
  sessions.set(session.id, session);
2499
+ if (sessionFile) {
2500
+ saveSessions(sessionFile, sessions);
2501
+ }
2476
2502
  return session;
2477
2503
  };
2478
2504
  const redeemWsToken = (token) => {
@@ -3149,7 +3175,7 @@ var installAgents = async (sandbox, options, logger) => {
3149
3175
 
3150
3176
  // src/sandbox/daytona/agent-auth.ts
3151
3177
  import { homedir } from "os";
3152
- import { basename, dirname as dirname2, join, relative, resolve as resolve4 } from "path";
3178
+ import { basename, dirname as dirname3, join, relative, resolve as resolve4 } from "path";
3153
3179
  import { readdir, stat } from "fs/promises";
3154
3180
  var expandHome2 = (value, home) => {
3155
3181
  if (value === "~") {
@@ -3217,12 +3243,12 @@ var syncAgentAuth = async (sandbox, options, logger) => {
3217
3243
  const rel = relative(sourcePath, file);
3218
3244
  const destination = join(destinationRoot, rel);
3219
3245
  uploads.push({ source: file, destination });
3220
- mkdirs.add(dirname2(destination));
3246
+ mkdirs.add(dirname3(destination));
3221
3247
  }
3222
3248
  continue;
3223
3249
  }
3224
3250
  uploads.push({ source: sourcePath, destination: destinationRoot });
3225
- mkdirs.add(dirname2(destinationRoot));
3251
+ mkdirs.add(dirname3(destinationRoot));
3226
3252
  }
3227
3253
  if (uploads.length === 0) {
3228
3254
  return;
@@ -3941,7 +3967,7 @@ var resolveAutoAgentNames = (env) => {
3941
3967
 
3942
3968
  // src/cli/start.ts
3943
3969
  var resolveUiDistPath = () => {
3944
- const currentDir = dirname3(fileURLToPath(import.meta.url));
3970
+ const currentDir = dirname4(fileURLToPath(import.meta.url));
3945
3971
  const candidates = [
3946
3972
  resolve5(currentDir, "../../ui/dist"),
3947
3973
  resolve5(currentDir, "../ui/dist"),
@@ -3956,7 +3982,7 @@ var resolveUiDistPath = () => {
3956
3982
  return candidates[0];
3957
3983
  };
3958
3984
  var packLocalCli = (logger) => {
3959
- const cliDir = resolve5(dirname3(fileURLToPath(import.meta.url)), "..");
3985
+ const cliDir = resolve5(dirname4(fileURLToPath(import.meta.url)), "..");
3960
3986
  const packageJson = resolve5(cliDir, "package.json");
3961
3987
  if (!existsSync(packageJson)) {
3962
3988
  return void 0;
@@ -4017,12 +4043,14 @@ var startCommand = async (options, deps = {}) => {
4017
4043
  const sandboxDirect = options.sandboxDirect ?? parseBoolean(env.TERMBRIDGE_SANDBOX_DIRECT);
4018
4044
  const cookieSameSiteRaw = env.TERMBRIDGE_COOKIE_SAMESITE?.trim().toLowerCase();
4019
4045
  const cookieSameSite = cookieSameSiteRaw === "none" ? "None" : cookieSameSiteRaw === "strict" ? "Strict" : cookieSameSiteRaw === "lax" ? "Lax" : sandboxDirect && !insecureCookie ? "None" : "Lax";
4046
+ const sessionFile = join2(tmpdir(), "termbridge", "sessions.json");
4020
4047
  const auth = (deps.createAuth ?? (() => createAuth({
4021
4048
  tokenTtlMs: 9e4,
4022
4049
  sessionIdleMs: Infinity,
4023
4050
  sessionMaxMs: Infinity,
4024
4051
  cookieSecure: !insecureCookie,
4025
- cookieSameSite
4052
+ cookieSameSite,
4053
+ sessionFile
4026
4054
  })))();
4027
4055
  const backendMode = resolveBackendMode(options.backend ?? env.TERMBRIDGE_BACKEND);
4028
4056
  const publicUrlOverride = options.publicUrl ?? env.TERMBRIDGE_PUBLIC_URL;