From 10d341d8b074866a89d4e6add242097c43f76e0c Mon Sep 17 00:00:00 2001 From: Evan Jacobson Date: Thu, 2 Apr 2026 23:27:52 -0600 Subject: [PATCH 1/6] feat(dev): add kiloclaw-worker-tunnel for local wrangler dev checkin routing Adds a second named cloudflare tunnel (kiloclaw-worker) that routes machine checkins to the local wrangler dev worker on port 8795. Without this, checkins from Fly machines hit the production worker and fail auth (403) because the gateway token secret differs between envs. --- dev/local/cli.ts | 2 +- dev/local/scripts/start-worker-tunnel.ts | 80 ++++++++++++++++++++++++ dev/local/services.ts | 16 ++++- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 dev/local/scripts/start-worker-tunnel.ts diff --git a/dev/local/cli.ts b/dev/local/cli.ts index 45c0d3e2a..1ffc739dc 100644 --- a/dev/local/cli.ts +++ b/dev/local/cli.ts @@ -142,7 +142,7 @@ async function cmdUp(targets: string[], repoRoot: string): Promise { const SIDEBAR_WIDTH = 40; // --- Start capture services first (tunnel, stripe) and wait for output --- - const captureServiceSet = new Set(['kiloclaw-tunnel', 'kiloclaw-stripe', 'app-builder-tunnel']); + const captureServiceSet = new Set(['kiloclaw-tunnel', 'kiloclaw-worker-tunnel', 'kiloclaw-stripe', 'app-builder-tunnel']); const captureServices = serviceNames.filter(n => captureServiceSet.has(n)); const otherServices = serviceNames.filter(n => !captureServiceSet.has(n)); diff --git a/dev/local/scripts/start-worker-tunnel.ts b/dev/local/scripts/start-worker-tunnel.ts new file mode 100644 index 000000000..3175c0c98 --- /dev/null +++ b/dev/local/scripts/start-worker-tunnel.ts @@ -0,0 +1,80 @@ +import { spawn, spawnSync } from 'node:child_process'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; + +const repoRoot = path.resolve(import.meta.dirname, '../../..'); + +type WorkerTunnelConfig = { + tunnelName: string; + tunnelHostname: string; +}; + +function parseConfFile(filePath: string): Record { + if (!fs.existsSync(filePath)) return {}; + const result: Record = {}; + for (const line of fs.readFileSync(filePath, 'utf-8').split('\n')) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#') || !trimmed.includes('=')) continue; + const eqIndex = trimmed.indexOf('='); + const key = trimmed.slice(0, eqIndex).trim(); + const raw = trimmed.slice(eqIndex + 1).trim(); + result[key] = raw.replace(/^["']|["']$/g, ''); + } + return result; +} + +function loadConfig(): WorkerTunnelConfig { + const globalPath = path.join(os.homedir(), '.config/kiloclaw/dev-start.conf'); + const localPath = path.join(repoRoot, 'kiloclaw/scripts/.dev-start.conf'); + + const merged = { + ...parseConfFile(globalPath), + ...parseConfFile(localPath), + }; + + return { + tunnelName: merged['WORKER_TUNNEL_NAME'] ?? '', + tunnelHostname: merged['WORKER_TUNNEL_HOSTNAME'] ?? '', + }; +} + +if (spawnSync('cloudflared', ['version'], { stdio: 'ignore' }).error) { + console.error( + 'cloudflared not found on PATH. Install it:\n https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/\n brew install cloudflared' + ); + process.exit(1); +} + +const config = loadConfig(); + +if (!config.tunnelName) { + console.error( + 'WORKER_TUNNEL_NAME not set in ~/.config/kiloclaw/dev-start.conf or kiloclaw/scripts/.dev-start.conf' + ); + process.exit(1); +} + +const configFile = path.join(os.homedir(), '.cloudflared/kiloclaw-worker.yml'); +console.log(`Named tunnel: ${config.tunnelName} -> ${config.tunnelHostname}`); + +const child = spawn( + 'cloudflared', + ['tunnel', '--config', configFile, 'run', config.tunnelName], + { stdio: ['ignore', 'pipe', 'pipe'] } +); + +function handleOutput(data: Buffer) { + process.stderr.write(data); +} + +child.stdout.on('data', handleOutput); +child.stderr.on('data', handleOutput); + +for (const signal of ['SIGINT', 'SIGTERM'] as const) { + process.on(signal, () => child.kill(signal)); +} + +child.on('close', code => { + process.exit(code ?? 1); +}); diff --git a/dev/local/services.ts b/dev/local/services.ts index e63ba05a6..a8ff578ef 100644 --- a/dev/local/services.ts +++ b/dev/local/services.ts @@ -100,8 +100,9 @@ const serviceMeta: Record = { }, // kiloclaw 'kiloclaw-tunnel': { group: 'kiloclaw', dependsOn: [] }, + 'kiloclaw-worker-tunnel': { group: 'kiloclaw', dependsOn: [] }, 'kiloclaw-stripe': { group: 'kiloclaw', dependsOn: [] }, - kiloclaw: { group: 'kiloclaw', dependsOn: ['postgres', 'kiloclaw-tunnel'] }, + kiloclaw: { group: 'kiloclaw', dependsOn: ['postgres', 'kiloclaw-tunnel', 'kiloclaw-worker-tunnel'] }, // observability 'cloudflare-o11y': { group: 'observability', dependsOn: ['nextjs'] }, 'cloudflare-ai-attribution': { group: 'observability', dependsOn: [] }, @@ -250,6 +251,19 @@ function buildServiceDefs(): ServiceDef[] { continue; } + if (name === 'kiloclaw-worker-tunnel') { + defs.push({ + name, + type: 'process', + dir: '.', + port: 0, + dependsOn: meta.dependsOn, + command: ['tsx', 'dev/local/scripts/start-worker-tunnel.ts'], + group: meta.group, + }); + continue; + } + if (name === 'kiloclaw-stripe') { defs.push({ name, From 0b854e9eea517dc1f9cdea2910c128b14e04425b Mon Sep 17 00:00:00 2001 From: Evan Jacobson Date: Thu, 2 Apr 2026 23:38:48 -0600 Subject: [PATCH 2/6] refactor(dev): fold worker tunnel into start-tunnel.ts via 'worker' mode arg --- dev/local/scripts/start-tunnel.ts | 27 +++++--- dev/local/scripts/start-worker-tunnel.ts | 80 ------------------------ dev/local/services.ts | 7 ++- 3 files changed, 25 insertions(+), 89 deletions(-) delete mode 100644 dev/local/scripts/start-worker-tunnel.ts diff --git a/dev/local/scripts/start-tunnel.ts b/dev/local/scripts/start-tunnel.ts index 4bd70f469..cd86a8b52 100644 --- a/dev/local/scripts/start-tunnel.ts +++ b/dev/local/scripts/start-tunnel.ts @@ -25,7 +25,7 @@ function parseConfFile(filePath: string): Record { return result; } -function loadTunnelConfig(): TunnelConfig { +function loadTunnelConfig(nameKey: string, hostnameKey: string): TunnelConfig { const globalPath = path.join(os.homedir(), '.config/kiloclaw/dev-start.conf'); const localPath = path.join(repoRoot, 'kiloclaw/scripts/.dev-start.conf'); @@ -35,8 +35,8 @@ function loadTunnelConfig(): TunnelConfig { }; return { - tunnelName: merged['TUNNEL_NAME'] ?? '', - tunnelHostname: merged['TUNNEL_HOSTNAME'] ?? '', + tunnelName: merged[nameKey] ?? '', + tunnelHostname: merged[hostnameKey] ?? '', }; } @@ -68,8 +68,14 @@ if (spawnSync('cloudflared', ['version'], { stdio: 'ignore' }).error) { process.exit(1); } -const port = process.argv[2] ?? '3000'; -const config = loadTunnelConfig(); +// Pass "worker" as first arg to run the worker tunnel (wrangler dev on port 8795). +// Otherwise runs the default Next.js tunnel. +const isWorkerMode = process.argv[2] === 'worker'; + +const port = isWorkerMode ? '8795' : (process.argv[2] ?? '3000'); +const config = isWorkerMode + ? loadTunnelConfig('WORKER_TUNNEL_NAME', 'WORKER_TUNNEL_HOSTNAME') + : loadTunnelConfig('TUNNEL_NAME', 'TUNNEL_HOSTNAME'); let command: string; let args: string[]; @@ -77,14 +83,21 @@ let urlPattern: RegExp | null = null; if (config.tunnelName) { command = 'cloudflared'; - args = ['tunnel', 'run', config.tunnelName]; + const configFile = path.join(os.homedir(), `.cloudflared/${config.tunnelName}.yml`); + args = ['tunnel', '--config', configFile, 'run', config.tunnelName]; console.log(`Named tunnel: ${config.tunnelName} -> ${config.tunnelHostname}`); - if (config.tunnelHostname) { + if (!isWorkerMode && config.tunnelHostname) { const apiUrl = `https://${config.tunnelHostname}/api/gateway/`; updateEnvValue(devVarsPath, 'KILOCODE_API_BASE_URL', apiUrl); } } else { + if (isWorkerMode) { + console.error( + 'WORKER_TUNNEL_NAME not set in ~/.config/kiloclaw/dev-start.conf or kiloclaw/scripts/.dev-start.conf' + ); + process.exit(1); + } command = 'cloudflared'; args = ['tunnel', '--url', `http://localhost:${port}`]; urlPattern = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/; diff --git a/dev/local/scripts/start-worker-tunnel.ts b/dev/local/scripts/start-worker-tunnel.ts deleted file mode 100644 index 3175c0c98..000000000 --- a/dev/local/scripts/start-worker-tunnel.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { spawn, spawnSync } from 'node:child_process'; -import * as fs from 'node:fs'; -import * as os from 'node:os'; -import * as path from 'node:path'; - -const repoRoot = path.resolve(import.meta.dirname, '../../..'); - -type WorkerTunnelConfig = { - tunnelName: string; - tunnelHostname: string; -}; - -function parseConfFile(filePath: string): Record { - if (!fs.existsSync(filePath)) return {}; - const result: Record = {}; - for (const line of fs.readFileSync(filePath, 'utf-8').split('\n')) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith('#') || !trimmed.includes('=')) continue; - const eqIndex = trimmed.indexOf('='); - const key = trimmed.slice(0, eqIndex).trim(); - const raw = trimmed.slice(eqIndex + 1).trim(); - result[key] = raw.replace(/^["']|["']$/g, ''); - } - return result; -} - -function loadConfig(): WorkerTunnelConfig { - const globalPath = path.join(os.homedir(), '.config/kiloclaw/dev-start.conf'); - const localPath = path.join(repoRoot, 'kiloclaw/scripts/.dev-start.conf'); - - const merged = { - ...parseConfFile(globalPath), - ...parseConfFile(localPath), - }; - - return { - tunnelName: merged['WORKER_TUNNEL_NAME'] ?? '', - tunnelHostname: merged['WORKER_TUNNEL_HOSTNAME'] ?? '', - }; -} - -if (spawnSync('cloudflared', ['version'], { stdio: 'ignore' }).error) { - console.error( - 'cloudflared not found on PATH. Install it:\n https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/\n brew install cloudflared' - ); - process.exit(1); -} - -const config = loadConfig(); - -if (!config.tunnelName) { - console.error( - 'WORKER_TUNNEL_NAME not set in ~/.config/kiloclaw/dev-start.conf or kiloclaw/scripts/.dev-start.conf' - ); - process.exit(1); -} - -const configFile = path.join(os.homedir(), '.cloudflared/kiloclaw-worker.yml'); -console.log(`Named tunnel: ${config.tunnelName} -> ${config.tunnelHostname}`); - -const child = spawn( - 'cloudflared', - ['tunnel', '--config', configFile, 'run', config.tunnelName], - { stdio: ['ignore', 'pipe', 'pipe'] } -); - -function handleOutput(data: Buffer) { - process.stderr.write(data); -} - -child.stdout.on('data', handleOutput); -child.stderr.on('data', handleOutput); - -for (const signal of ['SIGINT', 'SIGTERM'] as const) { - process.on(signal, () => child.kill(signal)); -} - -child.on('close', code => { - process.exit(code ?? 1); -}); diff --git a/dev/local/services.ts b/dev/local/services.ts index a8ff578ef..ec8336172 100644 --- a/dev/local/services.ts +++ b/dev/local/services.ts @@ -102,7 +102,10 @@ const serviceMeta: Record = { 'kiloclaw-tunnel': { group: 'kiloclaw', dependsOn: [] }, 'kiloclaw-worker-tunnel': { group: 'kiloclaw', dependsOn: [] }, 'kiloclaw-stripe': { group: 'kiloclaw', dependsOn: [] }, - kiloclaw: { group: 'kiloclaw', dependsOn: ['postgres', 'kiloclaw-tunnel', 'kiloclaw-worker-tunnel'] }, + kiloclaw: { + group: 'kiloclaw', + dependsOn: ['postgres', 'kiloclaw-tunnel', 'kiloclaw-worker-tunnel'], + }, // observability 'cloudflare-o11y': { group: 'observability', dependsOn: ['nextjs'] }, 'cloudflare-ai-attribution': { group: 'observability', dependsOn: [] }, @@ -258,7 +261,7 @@ function buildServiceDefs(): ServiceDef[] { dir: '.', port: 0, dependsOn: meta.dependsOn, - command: ['tsx', 'dev/local/scripts/start-worker-tunnel.ts'], + command: ['tsx', 'dev/local/scripts/start-tunnel.ts', 'worker'], group: meta.group, }); continue; From 3e24097f5672db9cfb396f8e3882c03e496c682d Mon Sep 17 00:00:00 2001 From: Evan Jacobson Date: Thu, 2 Apr 2026 23:46:31 -0600 Subject: [PATCH 3/6] refactor(dev): config-driven tunnel modes in start-tunnel.ts --- dev/local/scripts/start-tunnel.ts | 82 +++++++++++++++---------------- dev/local/services.ts | 3 +- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/dev/local/scripts/start-tunnel.ts b/dev/local/scripts/start-tunnel.ts index cd86a8b52..9496b0e34 100644 --- a/dev/local/scripts/start-tunnel.ts +++ b/dev/local/scripts/start-tunnel.ts @@ -6,11 +6,28 @@ import * as path from 'node:path'; const repoRoot = path.resolve(import.meta.dirname, '../../..'); const devVarsPath = path.join(repoRoot, 'kiloclaw/.dev.vars'); -type TunnelConfig = { - tunnelName: string; - tunnelHostname: string; +type TunnelMode = { + nameKey: string; + hostnameKey: string; + onUrl: ((url: string) => void) | null; }; +const TUNNEL_MODES = { + nextjs: { + nameKey: 'TUNNEL_NAME', + hostnameKey: 'TUNNEL_HOSTNAME', + onUrl: (url: string) => + updateEnvValue(devVarsPath, 'KILOCODE_API_BASE_URL', `${url}/api/gateway/`), + }, + worker: { + nameKey: 'WORKER_TUNNEL_NAME', + hostnameKey: 'WORKER_TUNNEL_HOSTNAME', + onUrl: null, + }, +} satisfies Record; + +type ModeName = keyof typeof TUNNEL_MODES; + function parseConfFile(filePath: string): Record { if (!fs.existsSync(filePath)) return {}; const result: Record = {}; @@ -25,19 +42,10 @@ function parseConfFile(filePath: string): Record { return result; } -function loadTunnelConfig(nameKey: string, hostnameKey: string): TunnelConfig { +function loadConf(): Record { const globalPath = path.join(os.homedir(), '.config/kiloclaw/dev-start.conf'); const localPath = path.join(repoRoot, 'kiloclaw/scripts/.dev-start.conf'); - - const merged = { - ...parseConfFile(globalPath), - ...parseConfFile(localPath), - }; - - return { - tunnelName: merged[nameKey] ?? '', - tunnelHostname: merged[hostnameKey] ?? '', - }; + return { ...parseConfFile(globalPath), ...parseConfFile(localPath) }; } function updateEnvValue(filePath: string, key: string, value: string): void { @@ -68,43 +76,32 @@ if (spawnSync('cloudflared', ['version'], { stdio: 'ignore' }).error) { process.exit(1); } -// Pass "worker" as first arg to run the worker tunnel (wrangler dev on port 8795). -// Otherwise runs the default Next.js tunnel. -const isWorkerMode = process.argv[2] === 'worker'; +const modeArg = process.argv[2]; +const modeName: ModeName = modeArg === 'worker' ? 'worker' : 'nextjs'; +const port = process.argv[3] ?? (modeName === 'worker' ? '8795' : '3000'); +const mode = TUNNEL_MODES[modeName]; +const conf = loadConf(); +const tunnelName = conf[mode.nameKey] ?? ''; +const tunnelHostname = conf[mode.hostnameKey] ?? ''; -const port = isWorkerMode ? '8795' : (process.argv[2] ?? '3000'); -const config = isWorkerMode - ? loadTunnelConfig('WORKER_TUNNEL_NAME', 'WORKER_TUNNEL_HOSTNAME') - : loadTunnelConfig('TUNNEL_NAME', 'TUNNEL_HOSTNAME'); - -let command: string; let args: string[]; let urlPattern: RegExp | null = null; -if (config.tunnelName) { - command = 'cloudflared'; - const configFile = path.join(os.homedir(), `.cloudflared/${config.tunnelName}.yml`); - args = ['tunnel', '--config', configFile, 'run', config.tunnelName]; - console.log(`Named tunnel: ${config.tunnelName} -> ${config.tunnelHostname}`); +if (tunnelName) { + const configFile = path.join(os.homedir(), `.cloudflared/${tunnelName}.yml`); + args = ['tunnel', '--config', configFile, 'run', tunnelName]; + console.log(`Named tunnel: ${tunnelName} -> ${tunnelHostname}`); - if (!isWorkerMode && config.tunnelHostname) { - const apiUrl = `https://${config.tunnelHostname}/api/gateway/`; - updateEnvValue(devVarsPath, 'KILOCODE_API_BASE_URL', apiUrl); + if (mode.onUrl && tunnelHostname) { + mode.onUrl(`https://${tunnelHostname}`); } } else { - if (isWorkerMode) { - console.error( - 'WORKER_TUNNEL_NAME not set in ~/.config/kiloclaw/dev-start.conf or kiloclaw/scripts/.dev-start.conf' - ); - process.exit(1); - } - command = 'cloudflared'; args = ['tunnel', '--url', `http://localhost:${port}`]; urlPattern = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/; console.log(`Starting quick tunnel -> http://localhost:${port}...`); } -const child = spawn(command, args, { +const child = spawn('cloudflared', args, { stdio: ['ignore', 'pipe', 'pipe'], }); @@ -116,11 +113,12 @@ function handleOutput(data: Buffer) { if (!match) return; const url = match[0]; - const apiUrl = `${url}/api/gateway/`; - updateEnvValue(devVarsPath, 'KILOCODE_API_BASE_URL', apiUrl); + mode.onUrl?.(url); console.log(`\nTunnel URL: ${url}`); - console.log(`Set KILOCODE_API_BASE_URL=${apiUrl}`); + if (mode.onUrl) { + console.log(`Set KILOCODE_API_BASE_URL=${url}/api/gateway/`); + } // Only capture once urlPattern = null; diff --git a/dev/local/services.ts b/dev/local/services.ts index ec8336172..ba42edc38 100644 --- a/dev/local/services.ts +++ b/dev/local/services.ts @@ -255,13 +255,14 @@ function buildServiceDefs(): ServiceDef[] { } if (name === 'kiloclaw-worker-tunnel') { + const workerPort = readWranglerPort(path.join(repoRoot, 'kiloclaw')) + portOffset; defs.push({ name, type: 'process', dir: '.', port: 0, dependsOn: meta.dependsOn, - command: ['tsx', 'dev/local/scripts/start-tunnel.ts', 'worker'], + command: ['tsx', 'dev/local/scripts/start-tunnel.ts', 'worker', String(workerPort)], group: meta.group, }); continue; From d258e8008619d5d3b733130f52d20dcfad5ddb1b Mon Sep 17 00:00:00 2001 From: Evan Jacobson Date: Thu, 2 Apr 2026 23:49:22 -0600 Subject: [PATCH 4/6] fix(dev): write KILOCLAW_CHECKIN_URL to .dev.vars for worker tunnel (named and anon) --- dev/local/scripts/start-tunnel.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev/local/scripts/start-tunnel.ts b/dev/local/scripts/start-tunnel.ts index 9496b0e34..0c9f0d96b 100644 --- a/dev/local/scripts/start-tunnel.ts +++ b/dev/local/scripts/start-tunnel.ts @@ -22,7 +22,8 @@ const TUNNEL_MODES = { worker: { nameKey: 'WORKER_TUNNEL_NAME', hostnameKey: 'WORKER_TUNNEL_HOSTNAME', - onUrl: null, + onUrl: (url: string) => + updateEnvValue(devVarsPath, 'KILOCLAW_CHECKIN_URL', `${url}/api/controller/checkin`), }, } satisfies Record; From c65d9513d1dd11e82d61caad8b0d6c98bb394708 Mon Sep 17 00:00:00 2001 From: Evan Jacobson Date: Fri, 3 Apr 2026 00:16:57 -0600 Subject: [PATCH 5/6] fix(tunnel): correct nextjs port arg and named tunnel config resolution --- dev/local/scripts/start-tunnel.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dev/local/scripts/start-tunnel.ts b/dev/local/scripts/start-tunnel.ts index 0c9f0d96b..0e8cd7732 100644 --- a/dev/local/scripts/start-tunnel.ts +++ b/dev/local/scripts/start-tunnel.ts @@ -79,7 +79,12 @@ if (spawnSync('cloudflared', ['version'], { stdio: 'ignore' }).error) { const modeArg = process.argv[2]; const modeName: ModeName = modeArg === 'worker' ? 'worker' : 'nextjs'; -const port = process.argv[3] ?? (modeName === 'worker' ? '8795' : '3000'); +// For worker mode: argv[2]='worker', argv[3]=port +// For nextjs mode: argv[2]=port (no mode prefix) +const port = + modeName === 'worker' + ? (process.argv[3] ?? '8795') + : (modeArg ?? '3000'); const mode = TUNNEL_MODES[modeName]; const conf = loadConf(); const tunnelName = conf[mode.nameKey] ?? ''; @@ -89,8 +94,7 @@ let args: string[]; let urlPattern: RegExp | null = null; if (tunnelName) { - const configFile = path.join(os.homedir(), `.cloudflared/${tunnelName}.yml`); - args = ['tunnel', '--config', configFile, 'run', tunnelName]; + args = ['tunnel', 'run', tunnelName]; console.log(`Named tunnel: ${tunnelName} -> ${tunnelHostname}`); if (mode.onUrl && tunnelHostname) { From b76601cbd58805fc36e65e4cdf726b5a17e8d0f0 Mon Sep 17 00:00:00 2001 From: Evan Jacobson Date: Fri, 3 Apr 2026 08:39:11 -0600 Subject: [PATCH 6/6] format files --- dev/local/cli.ts | 7 ++++++- dev/local/scripts/start-tunnel.ts | 5 +---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/dev/local/cli.ts b/dev/local/cli.ts index 1ffc739dc..70e444a69 100644 --- a/dev/local/cli.ts +++ b/dev/local/cli.ts @@ -142,7 +142,12 @@ async function cmdUp(targets: string[], repoRoot: string): Promise { const SIDEBAR_WIDTH = 40; // --- Start capture services first (tunnel, stripe) and wait for output --- - const captureServiceSet = new Set(['kiloclaw-tunnel', 'kiloclaw-worker-tunnel', 'kiloclaw-stripe', 'app-builder-tunnel']); + const captureServiceSet = new Set([ + 'kiloclaw-tunnel', + 'kiloclaw-worker-tunnel', + 'kiloclaw-stripe', + 'app-builder-tunnel', + ]); const captureServices = serviceNames.filter(n => captureServiceSet.has(n)); const otherServices = serviceNames.filter(n => !captureServiceSet.has(n)); diff --git a/dev/local/scripts/start-tunnel.ts b/dev/local/scripts/start-tunnel.ts index 0e8cd7732..341098a12 100644 --- a/dev/local/scripts/start-tunnel.ts +++ b/dev/local/scripts/start-tunnel.ts @@ -81,10 +81,7 @@ const modeArg = process.argv[2]; const modeName: ModeName = modeArg === 'worker' ? 'worker' : 'nextjs'; // For worker mode: argv[2]='worker', argv[3]=port // For nextjs mode: argv[2]=port (no mode prefix) -const port = - modeName === 'worker' - ? (process.argv[3] ?? '8795') - : (modeArg ?? '3000'); +const port = modeName === 'worker' ? (process.argv[3] ?? '8795') : (modeArg ?? '3000'); const mode = TUNNEL_MODES[modeName]; const conf = loadConf(); const tunnelName = conf[mode.nameKey] ?? '';