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 +37 -9
- package/dist/bin.js.map +1 -1
- package/package.json +1 -1
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 {
|
|
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
|
|
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(
|
|
3246
|
+
mkdirs.add(dirname3(destination));
|
|
3221
3247
|
}
|
|
3222
3248
|
continue;
|
|
3223
3249
|
}
|
|
3224
3250
|
uploads.push({ source: sourcePath, destination: destinationRoot });
|
|
3225
|
-
mkdirs.add(
|
|
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 =
|
|
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(
|
|
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;
|